Update some of warden.
This commit is contained in:
@@ -1854,13 +1854,14 @@ namespace Framework.Constants
|
||||
TradeLevelReq,
|
||||
UptimeUpdate,
|
||||
VmapIndoorCheck,
|
||||
WardenClientBanDuration,
|
||||
WardenClientResponseDelay,
|
||||
WardenClientCheckHoldoff,
|
||||
WardenClientFailAction,
|
||||
WardenClientResponseDelay,
|
||||
WardenClientBanDuration,
|
||||
WardenEnabled,
|
||||
WardenNumMemChecks,
|
||||
WardenNumOtherChecks,
|
||||
WardenNumInjectChecks,
|
||||
WardenNumLuaChecks,
|
||||
WardenNumClientModChecks,
|
||||
Weather,
|
||||
WeeklyQuestResetTimeWDay,
|
||||
WintergraspBattletime,
|
||||
@@ -1871,7 +1872,8 @@ namespace Framework.Constants
|
||||
WintergraspPlrMinLvl,
|
||||
WintergraspRestartAfterCrash,
|
||||
WorldBossLevelDiff,
|
||||
XpBoostDaymask
|
||||
XpBoostDaymask,
|
||||
Max
|
||||
}
|
||||
|
||||
public enum TimerType
|
||||
|
||||
@@ -21,11 +21,14 @@ namespace Framework.Cryptography
|
||||
{
|
||||
public class SessionKeyGenerator
|
||||
{
|
||||
public SessionKeyGenerator(byte[] buff, int size)
|
||||
public SessionKeyGenerator(byte[] buff, int size = 0)
|
||||
{
|
||||
if (size == 0)
|
||||
size = buff.Length;
|
||||
|
||||
int halfSize = size / 2;
|
||||
|
||||
sh = SHA256.Create();
|
||||
sh = SHA1.Create();
|
||||
sh.TransformFinalBlock(buff, 0, halfSize);
|
||||
o1 = sh.Hash;
|
||||
|
||||
@@ -59,7 +62,7 @@ namespace Framework.Cryptography
|
||||
taken = 0;
|
||||
}
|
||||
|
||||
SHA256 sh;
|
||||
SHA1 sh;
|
||||
uint taken;
|
||||
byte[] o0 = new byte[32];
|
||||
byte[] o1 = new byte[32];
|
||||
|
||||
@@ -796,23 +796,23 @@ namespace Game
|
||||
|
||||
switch (opcode)
|
||||
{
|
||||
case WardenOpcodes.CMSG_ModuleMissing:
|
||||
case WardenOpcodes.CmsgModuleMissing:
|
||||
_warden.SendModuleToClient();
|
||||
break;
|
||||
case WardenOpcodes.Cmsg_ModuleOk:
|
||||
case WardenOpcodes.CmsgModuleOk:
|
||||
_warden.RequestHash();
|
||||
break;
|
||||
case WardenOpcodes.Smsg_CheatChecksRequest:
|
||||
case WardenOpcodes.SmsgCheatChecksRequest:
|
||||
_warden.HandleData(packet.Data);
|
||||
break;
|
||||
case WardenOpcodes.Cmsg_MemChecksResult:
|
||||
case WardenOpcodes.CmsgMemChecksResult:
|
||||
Log.outDebug(LogFilter.Warden, "NYI WARDEN_CMSG_MEM_CHECKS_RESULT received!");
|
||||
break;
|
||||
case WardenOpcodes.Cmsg_HashResult:
|
||||
case WardenOpcodes.CmsgHashResult:
|
||||
_warden.HandleHashResult(packet.Data);
|
||||
_warden.InitializeModule();
|
||||
break;
|
||||
case WardenOpcodes.Cmsg_ModuleFailed:
|
||||
case WardenOpcodes.CmsgModuleFailed:
|
||||
Log.outDebug(LogFilter.Warden, "NYI WARDEN_CMSG_MODULE_FAILED received!");
|
||||
break;
|
||||
default:
|
||||
|
||||
@@ -23,20 +23,20 @@ namespace Game.Networking.Packets
|
||||
public enum WardenOpcodes
|
||||
{
|
||||
// Client.Server
|
||||
CMSG_ModuleMissing = 0,
|
||||
Cmsg_ModuleOk = 1,
|
||||
Cmsg_CheatChecksResult = 2,
|
||||
Cmsg_MemChecksResult = 3, // Only Sent If Mem_Check Bytes Doesn'T Match
|
||||
Cmsg_HashResult = 4,
|
||||
Cmsg_ModuleFailed = 5, // This Is Sent When Client Failed To Load Uploaded Module Due To Cache Fail
|
||||
CmsgModuleMissing = 0,
|
||||
CmsgModuleOk = 1,
|
||||
CmsgCheatChecksResult = 2,
|
||||
CmsgMemChecksResult = 3, // Only Sent If Mem_Check Bytes Doesn'T Match
|
||||
CmsgHashResult = 4,
|
||||
CmsgModuleFailed = 5, // This Is Sent When Client Failed To Load Uploaded Module Due To Cache Fail
|
||||
|
||||
// Server.Client
|
||||
Smsg_ModuleUse = 0,
|
||||
Smsg_ModuleCache = 1,
|
||||
Smsg_CheatChecksRequest = 2,
|
||||
Smsg_ModuleInitialize = 3,
|
||||
Smsg_MemChecksRequest = 4, // Byte Len; While (!Eof) { Byte Unk(1); Byte Index(++); String Module(Can Be 0); Int Offset; Byte Len; Byte[] Bytes_To_Compare[Len]; }
|
||||
Smsg_HashRequest = 5
|
||||
SmsgModuleUse = 0,
|
||||
SmsgModuleCache = 1,
|
||||
SmsgCheatChecksRequest = 2,
|
||||
SmsgModuleInitialize = 3,
|
||||
SmsgMemChecksRequest = 4, // Byte Len; While (!Eof) { Byte Unk(1); Byte Index(++); String Module(Can Be 0); Int Offset; Byte Len; Byte[] Bytes_To_Compare[Len]; }
|
||||
SmsgHashRequest = 5
|
||||
}
|
||||
|
||||
class WardenData : ClientPacket
|
||||
@@ -65,115 +65,4 @@ namespace Game.Networking.Packets
|
||||
|
||||
public ByteBuffer Data;
|
||||
}
|
||||
|
||||
class WardenModuleTransfer : ByteBuffer
|
||||
{
|
||||
public byte[] Write()
|
||||
{
|
||||
WriteUInt8((byte)Command);
|
||||
WriteUInt16(DataSize);
|
||||
WriteBytes(Data, 500);
|
||||
|
||||
return GetData();
|
||||
}
|
||||
|
||||
public WardenOpcodes Command;
|
||||
public ushort DataSize;
|
||||
public byte[] Data = new byte[500];
|
||||
}
|
||||
|
||||
class WardenModuleUse : ByteBuffer
|
||||
{
|
||||
public byte[] Write()
|
||||
{
|
||||
WriteUInt8((byte)Command);
|
||||
WriteBytes(ModuleId, 16);
|
||||
WriteBytes(ModuleKey, 16);
|
||||
WriteUInt32(Size);
|
||||
|
||||
return GetData();
|
||||
}
|
||||
|
||||
public WardenOpcodes Command;
|
||||
public byte[] ModuleId = new byte[16];
|
||||
public byte[] ModuleKey = new byte[16];
|
||||
public uint Size;
|
||||
}
|
||||
|
||||
class WardenHashRequest : ByteBuffer
|
||||
{
|
||||
public byte[] Write()
|
||||
{
|
||||
WriteUInt8((byte)Command);
|
||||
WriteBytes(Seed);
|
||||
|
||||
return GetData();
|
||||
}
|
||||
|
||||
public WardenOpcodes Command;
|
||||
public byte[] Seed = new byte[16];
|
||||
}
|
||||
|
||||
class WardenInitModuleRequest : ByteBuffer
|
||||
{
|
||||
public byte[] Write()
|
||||
{
|
||||
WriteUInt8((byte)Command1);
|
||||
WriteUInt16(Size1);
|
||||
WriteUInt32(CheckSumm1);
|
||||
WriteUInt8(Unk1);
|
||||
WriteUInt8(Unk2);
|
||||
WriteUInt8(Type);
|
||||
WriteUInt8(String_library1);
|
||||
foreach (var function in Function1)
|
||||
WriteUInt32(function);
|
||||
|
||||
WriteUInt8((byte)Command2);
|
||||
WriteUInt16(Size2);
|
||||
WriteUInt32(CheckSumm2);
|
||||
WriteUInt8(Unk3);
|
||||
WriteUInt8(Unk4);
|
||||
WriteUInt8(String_library2);
|
||||
WriteUInt32(Function2);
|
||||
WriteUInt8(Function2_set);
|
||||
|
||||
WriteUInt8((byte)Command3);
|
||||
WriteUInt16(Size3);
|
||||
WriteUInt32(CheckSumm3);
|
||||
WriteUInt8(Unk5);
|
||||
WriteUInt8(Unk6);
|
||||
WriteUInt8(String_library3);
|
||||
WriteUInt32(Function3);
|
||||
WriteUInt8(Function3_set);
|
||||
|
||||
return GetData();
|
||||
}
|
||||
|
||||
public WardenOpcodes Command1;
|
||||
public ushort Size1;
|
||||
public uint CheckSumm1;
|
||||
public byte Unk1;
|
||||
public byte Unk2;
|
||||
public byte Type;
|
||||
public byte String_library1;
|
||||
public uint[] Function1 = new uint[4];
|
||||
|
||||
public WardenOpcodes Command2;
|
||||
public ushort Size2;
|
||||
public uint CheckSumm2;
|
||||
public byte Unk3;
|
||||
public byte Unk4;
|
||||
public byte String_library2;
|
||||
public uint Function2;
|
||||
public byte Function2_set;
|
||||
|
||||
public WardenOpcodes Command3;
|
||||
public ushort Size3;
|
||||
public uint CheckSumm3;
|
||||
public byte Unk5;
|
||||
public byte Unk6;
|
||||
public byte String_library3;
|
||||
public uint Function3;
|
||||
public byte Function3_set;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -896,8 +896,9 @@ namespace Game
|
||||
|
||||
// Warden
|
||||
Values[WorldCfg.WardenEnabled] = GetDefaultValue("Warden.Enabled", false);
|
||||
Values[WorldCfg.WardenNumMemChecks] = GetDefaultValue("Warden.NumMemChecks", 3);
|
||||
Values[WorldCfg.WardenNumOtherChecks] = GetDefaultValue("Warden.NumOtherChecks", 7);
|
||||
Values[WorldCfg.WardenNumInjectChecks] = GetDefaultValue("Warden.NumInjectionChecks", 9);
|
||||
Values[WorldCfg.WardenNumLuaChecks] = GetDefaultValue("Warden.NumLuaSandboxChecks", 1);
|
||||
Values[WorldCfg.WardenNumClientModChecks] = GetDefaultValue("Warden.NumClientModChecks", 1);
|
||||
Values[WorldCfg.WardenClientBanDuration] = GetDefaultValue("Warden.BanDuration", 86400);
|
||||
Values[WorldCfg.WardenClientCheckHoldoff] = GetDefaultValue("Warden.ClientCheckHoldOff", 30);
|
||||
Values[WorldCfg.WardenClientFailAction] = GetDefaultValue("Warden.ClientCheckFailAction", 0);
|
||||
|
||||
@@ -344,19 +344,19 @@ namespace Game
|
||||
if (updater.ProcessUnsafe())
|
||||
{
|
||||
if (m_Socket[(int)ConnectionType.Realm] != null && m_Socket[(int)ConnectionType.Realm].IsOpen() && _warden != null)
|
||||
_warden.Update();
|
||||
_warden.Update(diff);
|
||||
|
||||
// If necessary, log the player out
|
||||
if (ShouldLogOut(currentTime) && m_playerLoading.IsEmpty())
|
||||
LogoutPlayer(true);
|
||||
|
||||
if (m_Socket[(int)ConnectionType.Realm] != null && GetPlayer() && _warden != null)
|
||||
_warden.Update();
|
||||
|
||||
//- Cleanup socket if need
|
||||
if ((m_Socket[(int)ConnectionType.Realm] != null && !m_Socket[(int)ConnectionType.Realm].IsOpen()) ||
|
||||
(m_Socket[(int)ConnectionType.Instance] != null && !m_Socket[(int)ConnectionType.Instance].IsOpen()))
|
||||
{
|
||||
if (GetPlayer() != null && _warden != null)
|
||||
_warden.Update(diff);
|
||||
|
||||
expireTime -= expireTime > diff ? diff : expireTime;
|
||||
if (expireTime < diff || forceExit || !GetPlayer())
|
||||
{
|
||||
@@ -656,6 +656,14 @@ namespace Game
|
||||
return ss.ToString();
|
||||
}
|
||||
|
||||
void HandleWardenData(WardenData packet)
|
||||
{
|
||||
if (_warden == null || packet.Data.GetSize() == 0)
|
||||
return;
|
||||
|
||||
_warden.HandleData(packet.Data);
|
||||
}
|
||||
|
||||
public bool PlayerLoading() { return !m_playerLoading.IsEmpty(); }
|
||||
public bool PlayerLogout() { return m_playerLogout; }
|
||||
public bool PlayerLogoutWithSave() { return m_playerLogout && m_playerSave; }
|
||||
|
||||
@@ -0,0 +1,614 @@
|
||||
/*
|
||||
* Copyright (C) 2012-2020 CypherCore <http://github.com/CypherCore>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* 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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
namespace Game
|
||||
{
|
||||
struct WardenModuleMac
|
||||
{
|
||||
public static byte[] Module_0DBBF209A27B1E279A9FEC5C168A15F7_Data =
|
||||
{
|
||||
0x07, 0x0C, 0x44, 0xCD, 0xC9, 0xFB, 0x99, 0xBC, 0x7C, 0x77, 0xDC, 0xE8, 0x8D, 0x07, 0xBE, 0x55,
|
||||
0x37, 0x5C, 0x84, 0x10, 0x23, 0xE1, 0x36, 0x5B, 0xF1, 0xBC, 0x60, 0xF3, 0x68, 0xBA, 0x60, 0x69,
|
||||
0xDF, 0x48, 0x54, 0xFF, 0x49, 0x1F, 0xA6, 0x28, 0x08, 0x5A, 0x77, 0xFE, 0x4C, 0x3A, 0x9A, 0x28,
|
||||
0xA5, 0x9E, 0x01, 0x93, 0x05, 0xE4, 0xCD, 0x26, 0x41, 0xD7, 0xD6, 0x73, 0x81, 0xFD, 0xF5, 0xDB,
|
||||
0xA5, 0xF7, 0xF9, 0x1D, 0xFE, 0xF4, 0x06, 0x7C, 0xD0, 0xF8, 0x5A, 0xE8, 0x11, 0xFF, 0xE5, 0xF9,
|
||||
0x54, 0x49, 0xF7, 0xF0, 0xF8, 0x66, 0x22, 0x97, 0xA4, 0xB2, 0x86, 0xFE, 0xA6, 0x3A, 0x7F, 0x3B,
|
||||
0xF6, 0x47, 0xB4, 0x14, 0xEB, 0x9E, 0xC9, 0xEA, 0x0B, 0x41, 0xB4, 0x5B, 0xC2, 0xFB, 0x63, 0x1C,
|
||||
0x46, 0xC4, 0xAB, 0x3F, 0x30, 0x70, 0x7F, 0x35, 0xA3, 0xD2, 0x1A, 0xDE, 0x36, 0x79, 0x02, 0x05,
|
||||
0x0E, 0x47, 0xFF, 0xDF, 0x1F, 0xB7, 0xE0, 0x11, 0x7F, 0xB8, 0x43, 0x8C, 0x46, 0xF0, 0x4D, 0x39,
|
||||
0x83, 0x7C, 0x44, 0xE7, 0xD0, 0x02, 0x54, 0xAB, 0x84, 0xB3, 0x64, 0xCA, 0xD2, 0xB6, 0xF5, 0xDC,
|
||||
0x06, 0x2B, 0x39, 0x27, 0x5B, 0x18, 0x82, 0xC4, 0xD6, 0x95, 0xB1, 0xDE, 0x2F, 0x0C, 0xAD, 0x96,
|
||||
0x12, 0xBF, 0x82, 0x0B, 0x78, 0x77, 0x7B, 0x42, 0x96, 0x87, 0xF6, 0x7B, 0xE2, 0x0B, 0x36, 0x2C,
|
||||
0x34, 0xCD, 0xFA, 0x01, 0x60, 0x3F, 0x52, 0x9B, 0xAB, 0xAC, 0x25, 0xF1, 0xDE, 0xD0, 0x61, 0x12,
|
||||
0x21, 0xF2, 0xDE, 0xB7, 0xA4, 0x5F, 0x5F, 0xA2, 0xA7, 0x31, 0xAC, 0x2D, 0xA3, 0x42, 0xCF, 0x73,
|
||||
0x88, 0x53, 0x02, 0x60, 0x9A, 0x11, 0xCB, 0xDF, 0xB9, 0x97, 0x10, 0x3F, 0xBD, 0xF6, 0x14, 0x38,
|
||||
0x1D, 0xAD, 0xC5, 0x22, 0x99, 0x40, 0x1C, 0xA3, 0x3D, 0x2E, 0x2E, 0x93, 0x70, 0xE4, 0x5B, 0x3E,
|
||||
0x9E, 0xDC, 0x6E, 0x4D, 0xC2, 0xDA, 0x2D, 0x54, 0x4A, 0xDF, 0xFD, 0x30, 0x4C, 0xAF, 0x5D, 0xDE,
|
||||
0xEB, 0xFF, 0xCF, 0xE3, 0x9A, 0x3C, 0x4F, 0xB3, 0x7D, 0x61, 0xEB, 0x66, 0xD8, 0xBC, 0x12, 0xC1,
|
||||
0xD4, 0x66, 0xBD, 0x89, 0x64, 0x8E, 0x68, 0xA6, 0xD4, 0xDC, 0xA4, 0x00, 0x84, 0x9A, 0x53, 0x1E,
|
||||
0x4D, 0x1B, 0x84, 0x19, 0xF8, 0x0A, 0x85, 0x96, 0x99, 0x64, 0xEB, 0xAE, 0x11, 0xFB, 0xC8, 0xBB,
|
||||
0xC0, 0x8E, 0x5B, 0x8E, 0xE3, 0x95, 0x50, 0x8A, 0xD4, 0x68, 0x0A, 0x11, 0xED, 0xC2, 0x8F, 0x87,
|
||||
0xA7, 0x3F, 0xB4, 0x99, 0xDF, 0x37, 0xF6, 0x4F, 0x32, 0x4E, 0x0B, 0x99, 0x35, 0xD0, 0x1E, 0x40,
|
||||
0x00, 0x8C, 0x3C, 0xCE, 0xC8, 0xE3, 0x89, 0x7B, 0x09, 0xA3, 0xA7, 0x35, 0x5B, 0x2B, 0x82, 0x98,
|
||||
0xC3, 0xEE, 0xD8, 0xAF, 0x59, 0x0C, 0xFB, 0x28, 0x57, 0x21, 0x79, 0x33, 0xDC, 0x3E, 0xD7, 0x66,
|
||||
0x02, 0x47, 0xC1, 0x1E, 0xB8, 0x85, 0x28, 0x1A, 0x1C, 0x5C, 0xA2, 0x11, 0x18, 0x9C, 0xB7, 0x54,
|
||||
0x4B, 0x97, 0x6D, 0x90, 0x93, 0x31, 0x6C, 0x07, 0x3B, 0xE9, 0x35, 0xD7, 0x3B, 0x59, 0x7A, 0x5B,
|
||||
0xEC, 0xE1, 0x63, 0xC4, 0xB6, 0x1A, 0x97, 0xEE, 0x1A, 0xD0, 0xF5, 0xF6, 0xBF, 0x10, 0x55, 0xCB,
|
||||
0x7F, 0xF7, 0x3C, 0x2D, 0x7D, 0xDF, 0x5C, 0xE1, 0x84, 0xF1, 0xD5, 0x87, 0x05, 0xEE, 0x94, 0xE3,
|
||||
0x55, 0xF3, 0x8B, 0xD1, 0x4B, 0xBF, 0x7E, 0x93, 0xEB, 0xAB, 0x09, 0x36, 0x3E, 0x8D, 0xA6, 0x90,
|
||||
0xC5, 0x2E, 0x0A, 0xF4, 0x2B, 0x9E, 0xBC, 0xDA, 0xC1, 0x3A, 0x77, 0x96, 0x8E, 0xA2, 0x28, 0x53,
|
||||
0x0B, 0x37, 0xEC, 0x3F, 0xA6, 0xED, 0xF7, 0x32, 0x3A, 0x7D, 0xE5, 0x64, 0x1C, 0xAE, 0x6B, 0xB4,
|
||||
0x08, 0xDA, 0xCD, 0x3E, 0x32, 0xC7, 0x0F, 0xDF, 0xDE, 0x9D, 0x4D, 0x20, 0xE0, 0x71, 0x7C, 0xB7,
|
||||
0xAF, 0x87, 0x99, 0x4B, 0xCC, 0x3B, 0xFB, 0x26, 0xAA, 0x01, 0xF3, 0x77, 0x01, 0x7E, 0x8C, 0x0D,
|
||||
0x09, 0x9D, 0x40, 0xFD, 0x3D, 0xA1, 0xEA, 0x53, 0x99, 0x68, 0x87, 0xE2, 0xCA, 0x1B, 0x1F, 0x45,
|
||||
0x83, 0xF1, 0x74, 0xBB, 0x65, 0x49, 0x46, 0xD2, 0x43, 0xDA, 0xE1, 0x4D, 0x29, 0x3A, 0x41, 0x81,
|
||||
0xF6, 0x46, 0x03, 0x43, 0x19, 0xBA, 0x2F, 0x79, 0xF0, 0xA3, 0xB4, 0x92, 0x08, 0x74, 0xE0, 0x61,
|
||||
0x0F, 0x26, 0xEF, 0xDE, 0x3B, 0x52, 0x9F, 0xB4, 0x06, 0x5D, 0xC6, 0xBC, 0x3C, 0xA5, 0x86, 0x7C,
|
||||
0x35, 0x21, 0xF7, 0x05, 0xCD, 0x05, 0x15, 0x31, 0xE0, 0xC0, 0xF6, 0x12, 0x70, 0x56, 0xF9, 0x25,
|
||||
0xB7, 0x91, 0x34, 0x85, 0x5D, 0xE9, 0x5D, 0xB8, 0x4F, 0x4C, 0xFB, 0xB5, 0xB6, 0x2F, 0xAE, 0xA3,
|
||||
0x2A, 0x99, 0x25, 0x4D, 0x17, 0x41, 0x47, 0xC3, 0xF5, 0x04, 0x52, 0xCC, 0xDE, 0x4E, 0xA3, 0x42,
|
||||
0x30, 0x19, 0xA5, 0xD5, 0x94, 0x46, 0xC0, 0x78, 0xF7, 0x7D, 0xD9, 0x9D, 0x0A, 0xCF, 0xEE, 0x0C,
|
||||
0x5C, 0x92, 0x85, 0x10, 0xF5, 0xEC, 0x2E, 0x48, 0xC1, 0x35, 0x86, 0x1E, 0x6A, 0xBE, 0xF0, 0x89,
|
||||
0x64, 0xF7, 0x4A, 0x71, 0xE7, 0x10, 0x6B, 0xEC, 0xC0, 0xC9, 0xB7, 0x94, 0x66, 0x27, 0x22, 0x2D,
|
||||
0xA2, 0x94, 0xAB, 0xBE, 0x36, 0xAC, 0x76, 0xB9, 0x2D, 0x8A, 0x04, 0xEF, 0x08, 0x3D, 0xA7, 0x9A,
|
||||
0xC7, 0x73, 0x78, 0xB2, 0xCD, 0x9E, 0x59, 0x90, 0x39, 0x1E, 0x54, 0x51, 0x18, 0x25, 0x22, 0x2A,
|
||||
0x38, 0x20, 0x73, 0xF1, 0x7F, 0x01, 0x07, 0x81, 0xA9, 0x3F, 0xE8, 0x90, 0x9C, 0xF6, 0x45, 0x14,
|
||||
0x8D, 0x82, 0xCB, 0xB0, 0x7D, 0x77, 0xA5, 0x97, 0x34, 0x81, 0x28, 0x6C, 0x1B, 0x0F, 0x60, 0x4B,
|
||||
0x35, 0xC5, 0x1C, 0xE4, 0xE2, 0x4C, 0x0A, 0xE1, 0xF9, 0xD0, 0xE8, 0xCC, 0x18, 0x25, 0xF6, 0xA0,
|
||||
0x41, 0xDF, 0x9B, 0x68, 0x75, 0x64, 0x0D, 0xE3, 0x1F, 0xA4, 0xA7, 0xFF, 0x02, 0xB5, 0x68, 0xA3,
|
||||
0x62, 0xAE, 0xD2, 0x1D, 0x36, 0x37, 0x18, 0x6C, 0xCE, 0x20, 0x25, 0xAF, 0xDD, 0x20, 0xB5, 0xF4,
|
||||
0xCF, 0x05, 0x3B, 0xF0, 0xD7, 0xB0, 0x43, 0xDB, 0xD7, 0xC7, 0x87, 0x1D, 0xD6, 0xD1, 0xD0, 0x33,
|
||||
0x20, 0x66, 0x10, 0x3C, 0x5E, 0x9D, 0xA8, 0x21, 0x48, 0x31, 0x65, 0x4C, 0xBD, 0xF5, 0x40, 0x97,
|
||||
0xC8, 0x0A, 0x87, 0x25, 0x0C, 0x54, 0x35, 0xCE, 0xEC, 0x76, 0xE8, 0xAD, 0x95, 0xCD, 0xC6, 0x7E,
|
||||
0xCD, 0x7C, 0xFD, 0x5F, 0x5B, 0xD6, 0x6B, 0xC6, 0xC4, 0x26, 0xA9, 0x16, 0xD7, 0xC8, 0xCE, 0x9E,
|
||||
0x3E, 0xB0, 0x81, 0xA1, 0x9A, 0xBE, 0x8A, 0xF9, 0x7D, 0xB0, 0x1B, 0x03, 0x9B, 0xBA, 0xF7, 0xF5,
|
||||
0x74, 0x13, 0x0F, 0x44, 0x51, 0x98, 0xAC, 0x56, 0x69, 0x24, 0xB1, 0xEA, 0xCD, 0x27, 0x25, 0xE5,
|
||||
0x58, 0x26, 0xCA, 0x44, 0xBA, 0x6D, 0xAA, 0x6E, 0x2F, 0xC8, 0x5E, 0x18, 0x6F, 0x08, 0xA0, 0xE8,
|
||||
0x57, 0xFB, 0x77, 0x99, 0x8A, 0xBD, 0x56, 0x1D, 0xD2, 0xD8, 0x63, 0x7A, 0xCE, 0xD3, 0xC9, 0xE2,
|
||||
0x99, 0xC2, 0x96, 0xB8, 0x8E, 0x88, 0x09, 0x80, 0xC6, 0x9A, 0xC3, 0xC5, 0xFB, 0xF5, 0x3C, 0x90,
|
||||
0x70, 0xAB, 0xF1, 0xA6, 0x80, 0x17, 0x2A, 0x25, 0xD3, 0xD2, 0x2B, 0xEE, 0xF5, 0xD2, 0x7F, 0xBD,
|
||||
0x2D, 0x83, 0xCC, 0x2A, 0x8C, 0xE2, 0xB4, 0xC4, 0xF4, 0x84, 0x34, 0x68, 0x04, 0xAD, 0x62, 0x27,
|
||||
0xE5, 0x19, 0x40, 0x17, 0xD7, 0x0A, 0xC4, 0x0A, 0x7E, 0x24, 0xBB, 0x38, 0xBC, 0xA3, 0x3B, 0x4A,
|
||||
0x58, 0x7C, 0x6B, 0xD2, 0x29, 0x46, 0xD6, 0xCF, 0x1C, 0x4B, 0xCC, 0x4E, 0x99, 0x28, 0xFC, 0x10,
|
||||
0xB1, 0x8B, 0x59, 0xF8, 0x2B, 0x6F, 0x43, 0x67, 0x01, 0x24, 0xFB, 0xCA, 0xB4, 0xBD, 0x35, 0x4B,
|
||||
0x7D, 0x50, 0xC0, 0x83, 0xD4, 0xB9, 0xC7, 0x37, 0x45, 0xB9, 0x24, 0xD7, 0x6D, 0x9D, 0xA6, 0x9C,
|
||||
0x7C, 0x1F, 0xE6, 0xB9, 0x97, 0x2C, 0x47, 0x5E, 0xCA, 0x30, 0xEB, 0xE5, 0xFD, 0x70, 0xD2, 0x37,
|
||||
0xE7, 0x6A, 0x3A, 0xEF, 0x00, 0xCF, 0x10, 0xF3, 0x3B, 0xA1, 0x62, 0xF0, 0x7D, 0xEA, 0x32, 0x50,
|
||||
0x87, 0x73, 0xAC, 0xB5, 0x61, 0x85, 0x6D, 0xDD, 0xD9, 0xD8, 0x84, 0xCD, 0x23, 0x3F, 0x11, 0x63,
|
||||
0xB1, 0xAB, 0xDF, 0x37, 0xAF, 0x84, 0x7C, 0x12, 0x77, 0x41, 0xFF, 0xF1, 0xF7, 0x5F, 0xF5, 0x40,
|
||||
0x23, 0xE1, 0x07, 0xC6, 0x89, 0x95, 0xF3, 0xA8, 0x5F, 0x1C, 0xE4, 0xE3, 0x86, 0x04, 0xD2, 0x17,
|
||||
0x52, 0xA3, 0x74, 0x51, 0x53, 0x6E, 0x44, 0x42, 0x92, 0x10, 0xBD, 0x7F, 0x5A, 0x13, 0x14, 0x85,
|
||||
0x59, 0x08, 0xF2, 0x87, 0x9A, 0x20, 0x98, 0xE8, 0x2E, 0xF1, 0x0F, 0x3D, 0x42, 0x79, 0x75, 0x88,
|
||||
0x45, 0x19, 0x8E, 0x6B, 0xF0, 0xCE, 0x22, 0x47, 0x30, 0x29, 0xC1, 0x94, 0xFE, 0x79, 0x4E, 0xDC,
|
||||
0xE3, 0x7F, 0x00, 0x4E, 0x67, 0x7D, 0xD7, 0x84, 0x2A, 0x01, 0x4E, 0x17, 0x07, 0x17, 0xD7, 0x1E,
|
||||
0x4D, 0xC5, 0x0B, 0x1C, 0x76, 0x8F, 0x02, 0x33, 0x26, 0xC6, 0x75, 0x35, 0xD2, 0x76, 0xAD, 0x8C,
|
||||
0xE9, 0x08, 0x9E, 0xCD, 0x07, 0x72, 0x3A, 0x61, 0x29, 0x2C, 0x99, 0xB9, 0x72, 0x6F, 0xF7, 0x69,
|
||||
0xAF, 0xEA, 0x3E, 0x56, 0xBE, 0xD8, 0x3A, 0xD7, 0xFC, 0x86, 0xE7, 0xB8, 0x45, 0x37, 0xF7, 0xE0,
|
||||
0x47, 0xD4, 0x0B, 0x36, 0xD4, 0xF1, 0x4B, 0x28, 0x2B, 0xE5, 0x1E, 0xB1, 0x06, 0x5B, 0x39, 0x59,
|
||||
0x34, 0x3D, 0x05, 0x23, 0x49, 0x8D, 0x9D, 0xC9, 0xEA, 0xC3, 0x42, 0x00, 0x65, 0x75, 0x09, 0xEC,
|
||||
0x30, 0xB6, 0xDB, 0xFB, 0x93, 0xFA, 0x93, 0x6D, 0x8D, 0xBE, 0xF5, 0x8D, 0x1E, 0x22, 0xB3, 0xAB,
|
||||
0x90, 0xB1, 0xA4, 0xE8, 0xCD, 0xB0, 0xBB, 0x2A, 0xF7, 0x39, 0xF2, 0x9C, 0x73, 0x18, 0xCF, 0xD4,
|
||||
0x14, 0xB5, 0xDD, 0x1A, 0x65, 0x6B, 0x47, 0x11, 0x16, 0xAD, 0xB4, 0xFC, 0xA3, 0x31, 0x56, 0xBD,
|
||||
0xBD, 0xB2, 0xC4, 0xCC, 0x39, 0xDA, 0x60, 0x86, 0x4E, 0x7F, 0x37, 0x99, 0xCF, 0x88, 0x47, 0x2A,
|
||||
0x1D, 0x09, 0xDA, 0xE1, 0x07, 0xF0, 0x1B, 0x97, 0x9E, 0x13, 0x43, 0x9E, 0x99, 0xA9, 0x2B, 0x1C,
|
||||
0x2D, 0xDB, 0xED, 0x0C, 0x58, 0xD2, 0xBE, 0x25, 0x25, 0x44, 0x62, 0x37, 0x7A, 0x50, 0x9A, 0x68,
|
||||
0x3E, 0x9A, 0xE5, 0xE2, 0xCA, 0x3F, 0xFF, 0x01, 0xF8, 0x17, 0xF4, 0xA8, 0xFF, 0x8E, 0x99, 0xDB,
|
||||
0x6E, 0x13, 0xD7, 0x7F, 0x1F, 0xDE, 0xDE, 0x2F, 0x9F, 0x37, 0x60, 0x41, 0xF0, 0xA0, 0xB7, 0x4F,
|
||||
0x80, 0x7D, 0xBA, 0xF9, 0xF1, 0xA6, 0x2C, 0x03, 0xD7, 0x3F, 0x3C, 0xC6, 0x45, 0x7C, 0xFF, 0x40,
|
||||
0x7C, 0x6D, 0x73, 0x6D, 0x42, 0x8F, 0x87, 0xDA, 0x66, 0xB3, 0xDF, 0x20, 0x17, 0x27, 0x86, 0x28,
|
||||
0xD6, 0x7F, 0x90, 0x0D, 0xFC, 0x62, 0x87, 0x59, 0x6B, 0x15, 0xB3, 0xBD, 0xF5, 0x15, 0x5F, 0x12,
|
||||
0x21, 0xE3, 0x50, 0x6A, 0xEA, 0x83, 0x9A, 0x1B, 0xC9, 0x29, 0x44, 0x32, 0xD7, 0x72, 0x68, 0x1B,
|
||||
0xA6, 0x1B, 0xDD, 0x65, 0xDB, 0x0A, 0xF7, 0xEE, 0xF1, 0xF2, 0xA6, 0x68, 0x6D, 0xEB, 0xB9, 0xF2,
|
||||
0x5A, 0xF9, 0xEE, 0xA3, 0xD0, 0xAE, 0xE2, 0x18, 0x29, 0xFF, 0xFD, 0x9B, 0x94, 0x6C, 0x03, 0xFC,
|
||||
0x3C, 0xF2, 0xEB, 0x3D, 0x50, 0x16, 0xA5, 0xB6, 0x64, 0x25, 0xFC, 0x3F, 0x79, 0xC0, 0x7F, 0x22,
|
||||
0x0C, 0x06, 0xFB, 0xAA, 0xAC, 0x2D, 0xC1, 0x1F, 0x24, 0x3F, 0x72, 0x87, 0xBE, 0xE5, 0xFD, 0x25,
|
||||
0x70, 0x65, 0x31, 0xA1, 0xD8, 0x63, 0xD3, 0xB6, 0x67, 0x99, 0xAF, 0xC4, 0x78, 0x44, 0xC7, 0x60,
|
||||
0x95, 0x9B, 0x2F, 0x3C, 0x0A, 0x44, 0xEB, 0x80, 0x34, 0x50, 0xE9, 0x01, 0x37, 0xF8, 0x55, 0x4D,
|
||||
0xE1, 0x73, 0x24, 0xC5, 0xF2, 0x9D, 0xCD, 0x70, 0x1A, 0x77, 0x57, 0x19, 0xF6, 0xA8, 0xEC, 0x69,
|
||||
0x25, 0xEF, 0xE4, 0xE2, 0x8C, 0x9A, 0x51, 0x90, 0x95, 0x21, 0xC5, 0xC1, 0x0C, 0xAD, 0x33, 0xF7,
|
||||
0x0E, 0xC5, 0xC4, 0xFF, 0x3D, 0xA9, 0xEA, 0x36, 0xCF, 0x15, 0x57, 0xB8, 0x37, 0xB7, 0x9A, 0x92,
|
||||
0x59, 0xDF, 0x91, 0x5C, 0x07, 0x78, 0xAD, 0xE6, 0xE0, 0x71, 0xD7, 0x17, 0x65, 0x8A, 0x62, 0x52,
|
||||
0x30, 0x95, 0xA1, 0xC5, 0x2F, 0xC7, 0x6D, 0x94, 0xDA, 0xA8, 0xFE, 0xF8, 0x28, 0x99, 0xC9, 0x9D,
|
||||
0x28, 0xFB, 0x6D, 0x22, 0xD0, 0x44, 0xAE, 0x02, 0x89, 0xEA, 0x93, 0xC6, 0x11, 0xC9, 0x19, 0x35,
|
||||
0x82, 0x7A, 0x76, 0x87, 0x9A, 0x5D, 0x39, 0x9E, 0x5A, 0x6B, 0x53, 0x45, 0x2F, 0x10, 0x6E, 0x86,
|
||||
0x95, 0xB5, 0x8F, 0x87, 0xB6, 0x37, 0x58, 0x48, 0x16, 0x01, 0x4D, 0xE1, 0xD1, 0x13, 0x21, 0xC3,
|
||||
0xAA, 0x8F, 0xDE, 0xE1, 0xFF, 0x5F, 0xEA, 0xBC, 0xBC, 0xDF, 0xF2, 0xB9, 0x0D, 0x96, 0x53, 0xF0,
|
||||
0x08, 0xB9, 0x01, 0x9E, 0x70, 0x87, 0xF3, 0x89, 0xFA, 0x1A, 0xB0, 0x06, 0xF3, 0xEC, 0x13, 0xC5,
|
||||
0x8D, 0x21, 0xF5, 0x2B, 0x47, 0x35, 0x48, 0x01, 0x34, 0xA2, 0x8D, 0x55, 0x24, 0x37, 0xFC, 0x5A,
|
||||
0x43, 0x0D, 0x0B, 0x3E, 0x0A, 0x95, 0x5B, 0xEF, 0x9F, 0x38, 0x41, 0x25, 0x52, 0xE3, 0x1C, 0xBF,
|
||||
0x7D, 0x3B, 0x1C, 0x32, 0x83, 0xBF, 0xBF, 0x69, 0xD2, 0xB5, 0x73, 0xD4, 0x5F, 0x4F, 0x0E, 0xBA,
|
||||
0xFF, 0x6C, 0xB6, 0xB4, 0xBB, 0x62, 0xD7, 0xEB, 0x5C, 0xC8, 0x44, 0x50, 0x38, 0xAD, 0x4F, 0xA0,
|
||||
0xB2, 0x90, 0x0F, 0x58, 0x2E, 0x93, 0x0F, 0xE8, 0xEB, 0x2F, 0x65, 0x76, 0x56, 0xD9, 0xDD, 0x79,
|
||||
0x75, 0xE1, 0xAD, 0x4A, 0x1A, 0x24, 0x5F, 0xE0, 0x82, 0x62, 0xF9, 0x96, 0x90, 0xD6, 0x4F, 0xFC,
|
||||
0xF6, 0x9E, 0xAE, 0x1C, 0xDA, 0x4D, 0x3B, 0xC4, 0x44, 0x4B, 0xAC, 0x69, 0xD7, 0x0E, 0x89, 0xAD,
|
||||
0xED, 0xF8, 0x6A, 0x8C, 0x4B, 0xAE, 0xC4, 0xEA, 0x02, 0x78, 0x0B, 0x41, 0xF6, 0x98, 0xE9, 0x1E,
|
||||
0xE2, 0x17, 0x0A, 0x0A, 0xA3, 0x1E, 0xE3, 0xF4, 0xEE, 0x7E, 0x3C, 0x81, 0x52, 0xCB, 0x2E, 0xF2,
|
||||
0x75, 0x0F, 0xD9, 0xD3, 0x58, 0xE0, 0xFF, 0x14, 0xA1, 0x4F, 0x7F, 0x19, 0xCA, 0xD1, 0xDA, 0x32,
|
||||
0x1F, 0xCD, 0x74, 0x41, 0x22, 0x8A, 0xBF, 0x96, 0x04, 0x35, 0xB7, 0x44, 0x86, 0x39, 0x59, 0xC6,
|
||||
0x96, 0x17, 0x99, 0x72, 0x72, 0xA1, 0x4E, 0x33, 0x65, 0x02, 0x1C, 0xA7, 0x1D, 0x6C, 0x24, 0xE1,
|
||||
0x85, 0x6A, 0x1E, 0x02, 0x88, 0xCE, 0x0E, 0x6D, 0x5F, 0x6B, 0x38, 0xD5, 0xA0, 0x5F, 0x15, 0x3C,
|
||||
0x4B, 0xBD, 0xD3, 0x6E, 0x0A, 0x70, 0x10, 0x3F, 0x6A, 0xB5, 0xAB, 0x72, 0x7D, 0x78, 0x42, 0x79,
|
||||
0x23, 0x16, 0x49, 0x4F, 0x97, 0x15, 0xF3, 0xA7, 0x6E, 0x73, 0x41, 0xB2, 0x78, 0x21, 0x3F, 0x32,
|
||||
0x17, 0x7F, 0x97, 0xBB, 0xA8, 0xDE, 0x17, 0xD6, 0xFB, 0x32, 0x95, 0x3D, 0x93, 0x07, 0x9D, 0xD2,
|
||||
0x5E, 0x99, 0xCD, 0x7C, 0x3E, 0x92, 0x1B, 0xCE, 0xA8, 0xA9, 0xAC, 0xF5, 0xFA, 0xAB, 0x23, 0xCB,
|
||||
0xA1, 0xD6, 0xF9, 0x09, 0x30, 0x5E, 0x7E, 0xF5, 0x24, 0x80, 0x5B, 0x5C, 0x5B, 0x3E, 0x76, 0xA6,
|
||||
0xE5, 0x21, 0x7E, 0xB3, 0x40, 0x5F, 0x75, 0xE7, 0x1D, 0x93, 0x41, 0x90, 0xF6, 0xAB, 0x98, 0x72,
|
||||
0x56, 0x8C, 0xFF, 0x06, 0xC5, 0x2C, 0xE0, 0xAE, 0xE6, 0xD0, 0x38, 0xC9, 0x3D, 0x88, 0x35, 0xF5,
|
||||
0x31, 0x36, 0x95, 0x49, 0x9C, 0x0C, 0x3F, 0x8D, 0xBC, 0xAA, 0xEC, 0x1B, 0x94, 0xCB, 0x77, 0x35,
|
||||
0xE8, 0xD8, 0xBF, 0x03, 0x81, 0xB2, 0x84, 0x06, 0x7C, 0x98, 0x58, 0x7D, 0x49, 0x7C, 0x87, 0xDF,
|
||||
0x69, 0xCB, 0xC7, 0xA4, 0x02, 0x68, 0xFD, 0x5F, 0x2C, 0x0B, 0xEB, 0xA5, 0x3A, 0xF3, 0x8F, 0x9A,
|
||||
0xA6, 0xA0, 0x10, 0x22, 0x05, 0x88, 0xFD, 0x85, 0x52, 0x14, 0x8F, 0x94, 0x2F, 0xA6, 0x1F, 0xE5,
|
||||
0x90, 0xE8, 0xFF, 0xEB, 0x1B, 0xD1, 0x76, 0x9B, 0xA2, 0x69, 0x83, 0x3F, 0x38, 0xC0, 0x58, 0x62,
|
||||
0xDA, 0x85, 0x7C, 0x59, 0xD1, 0xFD, 0x70, 0xCC, 0x16, 0xE8, 0xE5, 0x57, 0xBB, 0x2D, 0xE8, 0x99,
|
||||
0x5D, 0xC0, 0x9C, 0x07, 0x21, 0x56, 0x14, 0xEE, 0xA5, 0x28, 0x6B, 0x4E, 0x1A, 0x1E, 0x41, 0xBB,
|
||||
0x60, 0x63, 0x53, 0x5D, 0xAA, 0xB3, 0x9A, 0x7A, 0xB2, 0xAD, 0x6E, 0x2A, 0x2A, 0x6A, 0x00, 0xF7,
|
||||
0xEA, 0x92, 0xB8, 0x12, 0x73, 0x5D, 0xA7, 0x58, 0xA3, 0xE1, 0xB3, 0xB2, 0x6B, 0x79, 0x1E, 0xCD,
|
||||
0xD1, 0x1C, 0xFB, 0x89, 0xF9, 0xE5, 0xD8, 0xF9, 0x7C, 0xEA, 0xEF, 0x1D, 0x13, 0x86, 0x2E, 0xDD,
|
||||
0xFE, 0x52, 0x81, 0xC8, 0xF9, 0xE9, 0x42, 0x44, 0x36, 0x0B, 0x3C, 0xD9, 0x14, 0x09, 0x73, 0xCD,
|
||||
0x78, 0x19, 0xEF, 0x9D, 0xC5, 0x90, 0xB6, 0xE7, 0x45, 0x47, 0xEE, 0x0E, 0x7C, 0x0F, 0x5D, 0x4B,
|
||||
0xCC, 0x1D, 0x66, 0xC5, 0xC4, 0x4D, 0xAB, 0x55, 0xF0, 0x83, 0x68, 0xFE, 0x5C, 0xAB, 0x11, 0x71,
|
||||
0xB7, 0x45, 0xB4, 0x55, 0x1B, 0xDA, 0x77, 0x44, 0x07, 0x6A, 0x13, 0x99, 0xF4, 0x9D, 0x2B, 0xF8,
|
||||
0x78, 0x6B, 0x2E, 0x4C, 0x6B, 0xC5, 0x18, 0x9B, 0x7D, 0x26, 0xF8, 0x78, 0x53, 0x27, 0x14, 0x83,
|
||||
0x94, 0xA3, 0x9F, 0x5C, 0xAF, 0x84, 0x9B, 0x76, 0x9F, 0x77, 0xC8, 0x18, 0xA6, 0x00, 0x38, 0x67,
|
||||
0x6A, 0x08, 0xEE, 0xE3, 0x43, 0x3D, 0x09, 0xD9, 0xDD, 0xC9, 0x29, 0x33, 0x80, 0x56, 0x70, 0xD6,
|
||||
0x98, 0x50, 0x0C, 0x12, 0xC7, 0xF8, 0x3C, 0xC4, 0xFB, 0x9F, 0xFE, 0xFD, 0x5D, 0xAE, 0x9E, 0x1B,
|
||||
0x1E, 0x09, 0x99, 0xBC, 0xA5, 0x2A, 0x1A, 0xD0, 0x03, 0x41, 0x2D, 0xCC, 0xEB, 0x28, 0x6A, 0xCC,
|
||||
0xEE, 0x1F, 0x3F, 0x97, 0xDA, 0x97, 0xD5, 0x1A, 0xFF, 0x9B, 0xFD, 0xAC, 0x5A, 0x3F, 0xAB, 0x6F,
|
||||
0x73, 0x76, 0x5C, 0x28, 0xBE, 0x3D, 0x41, 0x01, 0x25, 0xFD, 0x3A, 0x72, 0x41, 0xA5, 0x8F, 0x99,
|
||||
0x03, 0x77, 0x11, 0x81, 0xEB, 0x35, 0x3D, 0x46, 0xA7, 0xA0, 0x1C, 0xDE, 0x9C, 0xD7, 0x8B, 0xD7,
|
||||
0x0A, 0x3C, 0x5D, 0x25, 0xEC, 0xF3, 0x3D, 0x54, 0xEF, 0x6A, 0x15, 0x59, 0x9B, 0xD5, 0x6F, 0xC5,
|
||||
0x1E, 0x7F, 0x55, 0x28, 0x50, 0x6F, 0xFA, 0xE8, 0x05, 0x59, 0x50, 0xD6, 0x80, 0x8C, 0xFD, 0x42,
|
||||
0x15, 0xEB, 0xC6, 0x0D, 0x62, 0xE2, 0xF3, 0x52, 0x76, 0xF7, 0x1A, 0xA0, 0x25, 0x34, 0x5F, 0x66,
|
||||
0xEA, 0xE7, 0xD9, 0x3A, 0x9C, 0x6C, 0x56, 0x7E, 0x13, 0x8F, 0xC7, 0xD1, 0xC1, 0x93, 0x69, 0x19,
|
||||
0x7C, 0xBE, 0xCE, 0x16, 0x6F, 0x4D, 0xDB, 0xC6, 0x80, 0x09, 0xCC, 0xB9, 0x72, 0xBA, 0x5B, 0xF3,
|
||||
0x49, 0xB1, 0x86, 0xBB, 0x49, 0xA0, 0x2C, 0xF1, 0x82, 0x88, 0x9F, 0xF7, 0x99, 0xB9, 0x2A, 0x94,
|
||||
0xE5, 0xA7, 0xB7, 0xDB, 0x7B, 0x7B, 0xBF, 0x6A, 0xDA, 0x69, 0xB5, 0x6B, 0xB9, 0x8A, 0x07, 0xF3,
|
||||
0xF8, 0x89, 0x1B, 0x9D, 0xA7, 0x46, 0x3A, 0x13, 0x04, 0xFD, 0x3A, 0x2D, 0x76, 0xCA, 0xD6, 0x00,
|
||||
0xF3, 0xED, 0x42, 0x1C, 0x98, 0x46, 0x1E, 0x50, 0xE0, 0x59, 0xE2, 0x67, 0x03, 0x7E, 0xAF, 0xEB,
|
||||
0xD3, 0x76, 0x7E, 0x01, 0xF8, 0x85, 0x33, 0x0F, 0x07, 0x99, 0x87, 0x6A, 0x37, 0xE9, 0x29, 0x30,
|
||||
0xA4, 0xE6, 0x04, 0xF0, 0x1E, 0x25, 0xE5, 0x88, 0x37, 0xF1, 0x18, 0x85, 0xE6, 0xD0, 0x53, 0x52,
|
||||
0x47, 0x45, 0xE0, 0x07, 0x0F, 0x27, 0xE1, 0x8D, 0xBB, 0x21, 0xBD, 0xA8, 0xC8, 0x93, 0xBD, 0xD3,
|
||||
0x66, 0x7C, 0xED, 0x24, 0x33, 0xE1, 0xC5, 0x5D, 0x7E, 0xE2, 0xDA, 0x71, 0x21, 0xD0, 0x3A, 0x70,
|
||||
0xB0, 0xB3, 0x70, 0x33, 0x64, 0x7B, 0x8D, 0x4E, 0x0F, 0xAA, 0x2B, 0x25, 0xBF, 0x54, 0x5C, 0x08,
|
||||
0xFD, 0x3B, 0x0A, 0xE0, 0x70, 0x2E, 0xFF, 0x4B, 0x1B, 0xA5, 0x6D, 0x19, 0x46, 0x1E, 0x84, 0xAF,
|
||||
0x32, 0x42, 0x55, 0xC9, 0xDB, 0x32, 0xC6, 0xCD, 0x06, 0x33, 0x53, 0xE5, 0x95, 0x71, 0x4E, 0xDE,
|
||||
0xE5, 0x83, 0xD2, 0x48, 0xCB, 0x32, 0x69, 0xA6, 0xFA, 0xA2, 0x8F, 0xC5, 0x45, 0x3A, 0x04, 0xEB,
|
||||
0x5B, 0xAB, 0x1B, 0x9F, 0xFF, 0xB7, 0x80, 0x50, 0x34, 0xB3, 0x17, 0xBC, 0xD3, 0x29, 0x5E, 0x53,
|
||||
0x0E, 0x98, 0xA7, 0x2D, 0x8D, 0xE0, 0xB5, 0x45, 0xEB, 0x24, 0x3D, 0xB6, 0x4E, 0xFF, 0x95, 0x6E,
|
||||
0x17, 0xAC, 0xA6, 0x8A, 0x1D, 0x6F, 0x7F, 0xDB, 0x74, 0x13, 0x81, 0x51, 0x40, 0x82, 0x8B, 0xAB,
|
||||
0x70, 0x71, 0x7F, 0x19, 0x63, 0x41, 0x1A, 0x12, 0x80, 0x97, 0x3E, 0x58, 0xFE, 0xE7, 0x9C, 0xA9,
|
||||
0x08, 0xB1, 0x41, 0x30, 0x69, 0xBA, 0xC0, 0x81, 0xE1, 0x0B, 0x87, 0x14, 0xBB, 0xD8, 0x9E, 0x4A,
|
||||
0x33, 0x92, 0x3B, 0xBD, 0x7F, 0xD4, 0x95, 0x3C, 0x2D, 0x45, 0xB1, 0x2A, 0x9B, 0x9B, 0xC2, 0x86,
|
||||
0xA0, 0x25, 0x7C, 0x94, 0x55, 0x05, 0xE5, 0x2D, 0xCB, 0xA4, 0x0B, 0x0B, 0x25, 0xBF, 0x8B, 0xFE,
|
||||
0xA0, 0xF2, 0x65, 0xA0, 0x9C, 0x90, 0x4F, 0xE1, 0xE9, 0x2B, 0x40, 0x60, 0x7F, 0x23, 0x82, 0x8A,
|
||||
0x89, 0x50, 0x72, 0x9C, 0x07, 0xBD, 0xD0, 0x84, 0x88, 0xA6, 0xB6, 0x3A, 0x43, 0x87, 0xBB, 0xDB,
|
||||
0x3E, 0x35, 0x6C, 0xBA, 0x51, 0x2E, 0xB4, 0xE7, 0xF6, 0xC4, 0x05, 0xE0, 0x95, 0x42, 0x96, 0x3E,
|
||||
0xE2, 0x39, 0xE9, 0x18, 0x8F, 0xD4, 0x9B, 0xEC, 0x18, 0x95, 0x8F, 0x79, 0xB8, 0xE3, 0xF4, 0x0D,
|
||||
0xD1, 0x15, 0x52, 0x26, 0xDA, 0x04, 0x9C, 0xA2, 0x08, 0xE4, 0x00, 0xB1, 0xD1, 0x38, 0x5C, 0x54,
|
||||
0x1E, 0xFB, 0x00, 0xFE, 0x22, 0xF8, 0x1D, 0xC6, 0x94, 0x8E, 0xA6, 0xEE, 0x6D, 0x07, 0x1F, 0x2B,
|
||||
0x06, 0x2C, 0x92, 0x6D, 0xEF, 0x86, 0x2F, 0x03, 0x7A, 0xBF, 0x05, 0x63, 0x2F, 0x43, 0x3E, 0xA7,
|
||||
0xF0, 0x5D, 0xD3, 0x82, 0xBF, 0x0B, 0xE6, 0x76, 0xEC, 0x8E, 0x5E, 0x6F, 0xD4, 0x88, 0xEF, 0xBB,
|
||||
0xED, 0xAF, 0x14, 0xC0, 0xA6, 0x51, 0x04, 0x7B, 0x60, 0x98, 0xB8, 0x7A, 0xF9, 0x1A, 0x5A, 0x28,
|
||||
0xC4, 0x40, 0x10, 0xBA, 0x4A, 0x8D, 0x0D, 0x30, 0xF9, 0x09, 0xDA, 0x6E, 0x1C, 0x78, 0xF7, 0x6A,
|
||||
0xAC, 0x2F, 0x49, 0xC6, 0x31, 0x56, 0x9D, 0x58, 0x63, 0x74, 0x6E, 0xAB, 0xA9, 0xD4, 0xF4, 0xC9,
|
||||
0x84, 0xA3, 0x9B, 0x97, 0x7A, 0x0E, 0x9E, 0xED, 0x7A, 0xC4, 0x01, 0xFB, 0xC3, 0xD6, 0x4F, 0x97,
|
||||
0x38, 0x84, 0x2F, 0x97, 0xF0, 0x33, 0x9B, 0x8A, 0x9C, 0x40, 0x23, 0x11, 0xDA, 0xC2, 0x5E, 0x28,
|
||||
0x5A, 0x78, 0x95, 0xF1, 0xB9, 0x41, 0x12, 0x4A, 0x77, 0x90, 0x86, 0xEC, 0xB3, 0xCC, 0x6D, 0x4C,
|
||||
0x40, 0x68, 0xAE, 0x40, 0x2F, 0x96, 0x9A, 0x1B, 0xA1, 0x46, 0x67, 0x1C, 0xE3, 0x54, 0xB7, 0x8A,
|
||||
0xF1, 0xAC, 0x38, 0x92, 0x1E, 0xBA, 0xD4, 0xD2, 0xCE, 0x46, 0x11, 0xA7, 0xCC, 0x73, 0xE3, 0x49,
|
||||
0x00, 0x9B, 0x93, 0xDE, 0xA6, 0x81, 0x3E, 0x85, 0x51, 0xB7, 0x43, 0x41, 0x64, 0xAC, 0x5B, 0x15,
|
||||
0xB7, 0xBC, 0x61, 0xF5, 0x87, 0xC4, 0x3D, 0xD1, 0x92, 0x57, 0x05, 0x27, 0x3E, 0x82, 0x5A, 0xCE,
|
||||
0xED, 0x5A, 0x59, 0x3B, 0x21, 0x01, 0x13, 0xB2, 0x67, 0x0F, 0x4D, 0xC4, 0x01, 0x9D, 0x19, 0x15,
|
||||
0x67, 0x02, 0xFF, 0xF7, 0xB7, 0xDD, 0xCB, 0xDB, 0x81, 0x13, 0xBA, 0x0C, 0x69, 0x32, 0x43, 0xBD,
|
||||
0x1A, 0x4F, 0xC8, 0x57, 0xD5, 0x3F, 0xE9, 0xBB, 0xC0, 0x0F, 0x98, 0xB5, 0x35, 0x65, 0x44, 0x7C,
|
||||
0x49, 0x05, 0x0B, 0x49, 0xE1, 0x6D, 0x34, 0x28, 0x2A, 0x77, 0xFE, 0x86, 0xC2, 0x87, 0x37, 0x2F,
|
||||
0x02, 0x53, 0x68, 0xC7, 0xDA, 0xF8, 0xAE, 0xA6, 0xE1, 0x47, 0xFA, 0xB8, 0xEE, 0x2D, 0x7E, 0xF0,
|
||||
0xB1, 0xE5, 0x64, 0xB6, 0x30, 0xC8, 0x0A, 0x5F, 0xB1, 0x6B, 0x11, 0xB2, 0x86, 0xD7, 0x4B, 0x0F,
|
||||
0x34, 0x4D, 0xEC, 0x5C, 0x72, 0x70, 0x05, 0xE8, 0xB4, 0x26, 0x76, 0x0F, 0x6E, 0x2D, 0x5E, 0x1E,
|
||||
0x80, 0x02, 0x6D, 0x4C, 0xCF, 0x92, 0x55, 0x5D, 0x2A, 0x2D, 0xDC, 0xBB, 0x01, 0xCD, 0x53, 0x06,
|
||||
0x02, 0xE7, 0x29, 0x1C, 0x34, 0x40, 0x88, 0x39, 0x8E, 0xD3, 0x58, 0x9A, 0x80, 0x18, 0xA1, 0xDD,
|
||||
0xC9, 0xB1, 0x59, 0x6B, 0x1D, 0xA2, 0xAE, 0xE6, 0x39, 0x1E, 0x37, 0x99, 0xFA, 0x1A, 0x88, 0x0F,
|
||||
0x26, 0x6A, 0x0D, 0xEF, 0x16, 0xE1, 0x2A, 0xEB, 0x22, 0x5D, 0x7B, 0xD3, 0x25, 0x93, 0x2C, 0x84,
|
||||
0xE5, 0x8D, 0xFA, 0xD6, 0x67, 0xE4, 0x36, 0x68, 0x80, 0x72, 0x78, 0xD3, 0x3B, 0xD1, 0xEF, 0xC0,
|
||||
0xA8, 0x1E, 0x32, 0x13, 0x2E, 0x02, 0xB1, 0xDF, 0x05, 0xA7, 0x3F, 0x7C, 0xAC, 0x5E, 0xC2, 0x15,
|
||||
0x4B, 0xD0, 0x94, 0xA1, 0x3C, 0x6C, 0x65, 0xDF, 0x6B, 0x05, 0x1F, 0x09, 0x09, 0x7D, 0xEA, 0x11,
|
||||
0x38, 0x85, 0x12, 0x7F, 0xE2, 0x0C, 0x8E, 0xF5, 0xED, 0xF8, 0x24, 0x6F, 0xCA, 0xDB, 0xDA, 0x65,
|
||||
0x08, 0xCA, 0x1F, 0x17, 0x3E, 0xFF, 0x68, 0x7B, 0xAA, 0x12, 0xDD, 0x98, 0x65, 0x94, 0x14, 0x63,
|
||||
0x8A, 0xC7, 0x56, 0xE2, 0x07, 0x2A, 0x53, 0xAB, 0xA9, 0x42, 0xB9, 0xF9, 0xBE, 0x38, 0x06, 0xB7,
|
||||
0xD1, 0xE6, 0xDF, 0x5A, 0xE3, 0x83, 0xFF, 0xE1, 0xAF, 0xE1, 0xF7, 0x89, 0xE9, 0x3B, 0xDC, 0x9A,
|
||||
0x23, 0x3B, 0x4C, 0xD1, 0xC6, 0xA0, 0xD5, 0x40, 0x01, 0x20, 0x7D, 0x2B, 0xEB, 0x60, 0x8E, 0x40,
|
||||
0x62, 0xC9, 0x26, 0xD7, 0x1C, 0xE6, 0x6D, 0xB6, 0x87, 0xC4, 0xCE, 0x19, 0xFC, 0xBB, 0x59, 0x3A,
|
||||
0x66, 0x21, 0x22, 0x91, 0x0C, 0x59, 0x66, 0x54, 0x4D, 0x86, 0xCA, 0xA2, 0x11, 0x72, 0xB6, 0xE6,
|
||||
0x04, 0x50, 0x25, 0x38, 0x9F, 0x87, 0x40, 0x9C, 0x5C, 0xB4, 0xFC, 0xD1, 0x04, 0xC0, 0xE1, 0xE2,
|
||||
0xC9, 0xFB, 0xD2, 0xBC, 0xE7, 0xB2, 0x38, 0x6B, 0x98, 0xAB, 0x90, 0x24, 0xBB, 0xB0, 0x45, 0xBA,
|
||||
0xEB, 0x29, 0xBD, 0xA6, 0xCD, 0xCC, 0x91, 0x7A, 0xEA, 0x2E, 0x84, 0x78, 0x6E, 0x07, 0x78, 0x1D,
|
||||
0x73, 0x14, 0xC4, 0x1F, 0x3D, 0x75, 0x72, 0x8E, 0xA0, 0x70, 0xE9, 0x93, 0xC2, 0x2C, 0x2F, 0x98,
|
||||
0x46, 0x07, 0x07, 0x12, 0x32, 0xFE, 0xDE, 0x2E, 0x24, 0xD5, 0xD0, 0xA3, 0x5A, 0x0C, 0xB4, 0x1D,
|
||||
0xD7, 0x57, 0xAB, 0x51, 0xAE, 0x0A, 0x19, 0xBD, 0x0D, 0x0B, 0xCA, 0x8A, 0x3B, 0x64, 0xFB, 0xF5,
|
||||
0x43, 0xC5, 0x04, 0xB1, 0x16, 0xC5, 0x34, 0xF7, 0x63, 0xEF, 0xC9, 0xBA, 0x94, 0x6A, 0xA4, 0x04,
|
||||
0x49, 0xB8, 0xF4, 0xF5, 0x3C, 0x0D, 0x84, 0xC3, 0x4B, 0xDE, 0xF1, 0xD5, 0x62, 0x15, 0x76, 0x84,
|
||||
0xED, 0xA4, 0x8A, 0x25, 0x3D, 0x87, 0xB7, 0xEA, 0x26, 0xDA, 0xCE, 0xB8, 0x7E, 0x8A, 0xDB, 0xAB,
|
||||
0x70, 0xB1, 0x18, 0x53, 0xEA, 0xF4, 0x74, 0xCB, 0x9A, 0x2B, 0x10, 0x5A, 0x4F, 0x06, 0x2B, 0x6B,
|
||||
0x4A, 0xF0, 0xF3, 0xB2, 0x10, 0x14, 0x9D, 0xBD, 0x18, 0x46, 0x3E, 0x7F, 0xAD, 0xB3, 0x03, 0xDD,
|
||||
0x80, 0xE2, 0xA5, 0x5D, 0x87, 0xAD, 0x67, 0x1C, 0x20, 0x06, 0xFD, 0x62, 0x65, 0x5D, 0x12, 0xC5,
|
||||
0x0A, 0x8C, 0x99, 0x8B, 0x97, 0xA1, 0x1F, 0x06, 0x8A, 0x78, 0x7A, 0xA5, 0x46, 0x65, 0xA8, 0xFA,
|
||||
0xC4, 0x81, 0x99, 0x02, 0x16, 0x7C, 0xB4, 0x09, 0xAD, 0xE8, 0x35, 0x2E, 0x6B, 0x4F, 0x55, 0xAC,
|
||||
0x23, 0x41, 0xA8, 0x5A, 0x0C, 0x71, 0x7E, 0x08, 0x3E, 0x6D, 0x5B, 0x46, 0x92, 0x3B, 0x8B, 0x8C,
|
||||
0xBE, 0x09, 0x52, 0xEA, 0xC5, 0xAE, 0x1B, 0x2A, 0xC8, 0x2D, 0x36, 0xE7, 0x2E, 0xCF, 0xA6, 0x30,
|
||||
0x9F, 0x14, 0xB2, 0xFA, 0xA2, 0xA3, 0xFF, 0xC7, 0x0B, 0xA6, 0xC8, 0x8C, 0xCD, 0xB3, 0x0B, 0xFC,
|
||||
0x76, 0x9F, 0xA1, 0xB9, 0x34, 0x86, 0xB5, 0x5B, 0x4C, 0x3D, 0x87, 0xA0, 0x5D, 0xE2, 0x95, 0x65,
|
||||
0xCF, 0xCD, 0x16, 0x40, 0x7D, 0x1B, 0xB1, 0xB8, 0x83, 0x37, 0x14, 0x6E, 0x02, 0xB2, 0x8E, 0x17,
|
||||
0x9E, 0x10, 0x87, 0x83, 0x62, 0x57, 0x60, 0x98, 0xA7, 0xE5, 0xCB, 0x82, 0x6E, 0xCC, 0xC7, 0x63,
|
||||
0x99, 0xB8, 0x1D, 0xA9, 0xED, 0x5B, 0xE9, 0x0E, 0xC8, 0x7D, 0xCE, 0x48, 0xE4, 0xE4, 0x3F, 0x1C,
|
||||
0x77, 0xBF, 0xEF, 0x3A, 0x63, 0x25, 0xAA, 0xDE, 0x2D, 0xC2, 0x42, 0x22, 0xEC, 0x99, 0xB6, 0xBF,
|
||||
0x65, 0xA0, 0x2A, 0x5C, 0x51, 0x63, 0x9D, 0xFB, 0x3F, 0xA0, 0x7E, 0x2B, 0xCC, 0x04, 0xE1, 0x74,
|
||||
0x13, 0x61, 0x80, 0x15, 0x3C, 0x2F, 0x9E, 0x3E, 0x63, 0x24, 0xA2, 0x13, 0xF9, 0xCD, 0xF6, 0xA9,
|
||||
0x88, 0x3A, 0xC9, 0x1F, 0xE9, 0xF2, 0x5F, 0x04, 0xD3, 0xE7, 0x00, 0x4B, 0xCD, 0xA5, 0x60, 0xBE,
|
||||
0x49, 0x89, 0xCC, 0x68, 0x48, 0x51, 0xEC, 0x7D, 0x8B, 0xDD, 0x23, 0xF0, 0x5D, 0xDC, 0x46, 0xA7,
|
||||
0x35, 0x77, 0xBF, 0x2D, 0x5C, 0xDB, 0x8B, 0x11, 0xE9, 0x15, 0xE6, 0xC7, 0x50, 0xEF, 0x01, 0x5A,
|
||||
0x4D, 0x04, 0x5D, 0xBF, 0xF9, 0x52, 0x36, 0xDE, 0x74, 0xE5, 0xF6, 0xF3, 0x37, 0x45, 0x28, 0x85,
|
||||
0x86, 0x9E, 0x1E, 0xFA, 0xF9, 0xB9, 0x1A, 0x04, 0xD7, 0xE7, 0xCB, 0xDC, 0x47, 0xFB, 0x49, 0x34,
|
||||
0x3A, 0x63, 0x26, 0x2D, 0x73, 0x6F, 0xC6, 0x28, 0xEE, 0x83, 0xBD, 0x8F, 0x2D, 0xF2, 0x1A, 0x19,
|
||||
0x75, 0x1B, 0xB6, 0x60, 0x4C, 0x38, 0x3D, 0xD7, 0x4D, 0x66, 0x7F, 0x01, 0xCF, 0x20, 0x1D, 0x45,
|
||||
0xD5, 0x32, 0x24, 0x96, 0x15, 0x0E, 0x5C, 0x6A, 0xD3, 0xE9, 0xC5, 0xD1, 0xF9, 0x11, 0x94, 0x41,
|
||||
0xD0, 0xC8, 0xBD, 0xBD, 0x17, 0xFB, 0x0A, 0x20, 0x89, 0x05, 0xBA, 0xCB, 0xF6, 0xBF, 0x9E, 0x83,
|
||||
0x44, 0x04, 0x54, 0x54, 0xA3, 0xDC, 0x1D, 0xEF, 0x3C, 0x01, 0x07, 0x80, 0x8A, 0x4F, 0x15, 0x3E,
|
||||
0x2D, 0xFE, 0xAF, 0xEB, 0x71, 0xA3, 0xE7, 0x20, 0x56, 0x2A, 0x19, 0x37, 0x8C, 0xDA, 0xE2, 0xB2,
|
||||
0xAB, 0xB4, 0x39, 0x3C, 0xC6, 0x7C, 0x7D, 0xD2, 0x91, 0xBE, 0x62, 0xF8, 0x4D, 0x01, 0x4E, 0xB4,
|
||||
0x3A, 0x19, 0xE2, 0x3E, 0x26, 0xD6, 0x2A, 0x55, 0x96, 0xC0, 0x0F, 0xA5, 0x35, 0x28, 0x0A, 0x5C,
|
||||
0xC1, 0x55, 0xD3, 0x72, 0x60, 0xF9, 0x65, 0xD0, 0xB2, 0x6C, 0x58, 0xAF, 0x8B, 0x00, 0x2B, 0x4C,
|
||||
0xF0, 0x4E, 0x8D, 0x15, 0x2F, 0xE5, 0x93, 0x05, 0x94, 0xF0, 0x02, 0x80, 0xDF, 0xFA, 0xEA, 0xA8,
|
||||
0xE8, 0x93, 0x50, 0xEB, 0xE1, 0x4D, 0x26, 0x34, 0xD3, 0x33, 0x83, 0x64, 0x30, 0x7D, 0x19, 0x51,
|
||||
0x50, 0x79, 0xF5, 0xF1, 0xD1, 0x2F, 0x7C, 0xC9, 0xF0, 0x3F, 0xF8, 0x60, 0x3B, 0x7E, 0x5D, 0x06,
|
||||
0x63, 0xED, 0x92, 0x0D, 0x0F, 0xD8, 0x9C, 0x6F, 0x74, 0x40, 0xF1, 0x40, 0xEC, 0x81, 0xAD, 0xAE,
|
||||
0xF0, 0xB2, 0x5E, 0x79, 0x71, 0x99, 0x89, 0x4F, 0xB9, 0xB2, 0x82, 0x15, 0x0D, 0x80, 0x7A, 0x68,
|
||||
0x13, 0x85, 0x4A, 0x6C, 0x6B, 0x1B, 0xD3, 0xA7, 0x67, 0x84, 0x14, 0xC5, 0xCE, 0xC9, 0xF2, 0x61,
|
||||
0x45, 0x7E, 0xEE, 0x7E, 0x6F, 0xD4, 0xB5, 0x15, 0xEE, 0x2C, 0x6C, 0xCC, 0x9D, 0x88, 0x38, 0x55,
|
||||
0x65, 0x78, 0xCF, 0x65, 0x8D, 0x2F, 0x22, 0xDD, 0xD9, 0x58, 0x9B, 0x60, 0x48, 0xEB, 0x96, 0xD5,
|
||||
0x17, 0xEE, 0x40, 0xFC, 0xA1, 0x9C, 0x70, 0x51, 0x2B, 0x0F, 0xCB, 0x80, 0x2C, 0x4A, 0x28, 0x4E,
|
||||
0x49, 0xAF, 0xA0, 0x6D, 0xA5, 0xF7, 0x58, 0x7E, 0x23, 0x30, 0xE9, 0x22, 0xE5, 0xC0, 0xD5, 0x65,
|
||||
0x13, 0xE6, 0xC1, 0x71, 0x94, 0xAF, 0xDE, 0x6A, 0x53, 0x4C, 0xDE, 0xB8, 0x35, 0xFE, 0x1F, 0xF0,
|
||||
0x51, 0x61, 0x5F, 0xC2, 0xA4, 0xA9, 0x66, 0x92, 0x93, 0x89, 0xC2, 0x4E, 0xDB, 0x7B, 0x9C, 0x11,
|
||||
0x62, 0xE5, 0xE6, 0xD7, 0x86, 0xD0, 0x8B, 0x33, 0x9E, 0x15, 0x78, 0x11, 0xF1, 0xC9, 0xA6, 0x4B,
|
||||
0xA9, 0xB8, 0x38, 0xDE, 0xB2, 0x55, 0xB6, 0x0E, 0xEF, 0x6E, 0xC9, 0xC8, 0x5A, 0x39, 0x1C, 0xEE,
|
||||
0x0F, 0x5C, 0x83, 0x2A, 0x46, 0x22, 0x4C, 0xA6, 0xD3, 0x38, 0xBA, 0x19, 0xA6, 0xB5, 0x70, 0x80,
|
||||
0xCF, 0x84, 0x6B, 0x02, 0x98, 0xAB, 0x4C, 0x48, 0x4F, 0xF2, 0x19, 0xDB, 0xBB, 0xB3, 0x1E, 0x21,
|
||||
0x41, 0xD2, 0x67, 0x16, 0x05, 0xC9, 0x21, 0x03, 0x3C, 0xC5, 0x7C, 0x0E, 0x85, 0xD8, 0x6F, 0x9D,
|
||||
0x57, 0x12, 0xE4, 0xC7, 0xCB, 0x73, 0xC3, 0xFE, 0xA3, 0x9E, 0xCD, 0x4D, 0x50, 0x4F, 0x4F, 0xDE,
|
||||
0x4A, 0x54, 0x17, 0x64, 0x6B, 0x13, 0x07, 0x7D, 0x48, 0x14, 0x92, 0x4D, 0x29, 0x1C, 0xF9, 0x4D,
|
||||
0xB9, 0xAE, 0x56, 0xF8, 0xF5, 0xCB, 0x8B, 0x8B, 0x0E, 0xD1, 0x91, 0xD5, 0xE5, 0xB9, 0x2B, 0xA5,
|
||||
0x1E, 0x55, 0x2C, 0xC3, 0x48, 0x31, 0x81, 0x7C, 0xD1, 0x36, 0x36, 0x52, 0x59, 0xC6, 0xCA, 0xEB,
|
||||
0x65, 0x8E, 0x89, 0x1A, 0x65, 0xC8, 0xF3, 0xC4, 0x67, 0x2B, 0x5A, 0xD3, 0xD4, 0x35, 0x01, 0x4A,
|
||||
0x2C, 0xA8, 0x7F, 0xA2, 0xC2, 0x52, 0xA1, 0x2C, 0xB2, 0x55, 0x7C, 0x5C, 0xF9, 0xC2, 0xD2, 0x77,
|
||||
0x5E, 0xF3, 0x31, 0xFD, 0xD7, 0x79, 0x8D, 0x0E, 0xE1, 0x37, 0x87, 0xC9, 0x47, 0x43, 0x4E, 0xA9,
|
||||
0x7D, 0x9E, 0x51, 0x83, 0x57, 0x15, 0x4E, 0x6A, 0x43, 0x1F, 0xC8, 0x83, 0xA3, 0x31, 0xE8, 0x19,
|
||||
0x7E, 0xC3, 0x0D, 0x2A, 0x3A, 0x15, 0x85, 0xBE, 0x16, 0xA3, 0x4C, 0xCD, 0xC6, 0x1A, 0xB1, 0x48,
|
||||
0xDB, 0x02, 0xED, 0xA6, 0xFF, 0x9B, 0xC2, 0x6E, 0x7C, 0x3B, 0xC6, 0xCC, 0x8F, 0x0C, 0xDB, 0xE0,
|
||||
0x11, 0x66, 0xDA, 0x0F, 0x85, 0x68, 0x25, 0x34, 0x7A, 0x7C, 0x4D, 0x13, 0x19, 0xA7, 0x37, 0xBA,
|
||||
0x1B, 0x8A, 0xBA, 0x99, 0x0B, 0x39, 0x7D, 0x37, 0xA6, 0x32, 0x81, 0xD3, 0x73, 0x21, 0x6E, 0x4A,
|
||||
0x32, 0x26, 0xC5, 0xE6, 0x8F, 0x33, 0x52, 0x48, 0x23, 0x4A, 0x21, 0xBD, 0xF9, 0x12, 0xC0, 0xFD,
|
||||
0xDC, 0x39, 0x1B, 0x4B, 0xCE, 0x56, 0x44, 0xC4, 0x9B, 0x9C, 0xF4, 0xBE, 0xC0, 0x9A, 0xFD, 0x28,
|
||||
0xA1, 0xB2, 0xAE, 0xA7, 0xFB, 0x31, 0xB6, 0xF6, 0x62, 0x68, 0xC9, 0x44, 0xCA, 0x0F, 0x51, 0xFF,
|
||||
0xCB, 0x7C, 0x67, 0xAE, 0xF4, 0xFD, 0xC0, 0x71, 0x50, 0x35, 0x65, 0xF3, 0x9C, 0x08, 0xA0, 0x1B,
|
||||
0x3B, 0x42, 0x69, 0x95, 0x42, 0x7A, 0xE3, 0x87, 0xF3, 0xD6, 0xE9, 0xA7, 0x22, 0x5B, 0x83, 0x0B,
|
||||
0x5B, 0xE9, 0x0A, 0x0A, 0xFA, 0x2D, 0x82, 0x42, 0x73, 0xDF, 0x76, 0xAF, 0xE6, 0xD3, 0x9D, 0xB1,
|
||||
0xA4, 0xD8, 0xB6, 0xC5, 0x5F, 0xC7, 0x98, 0xCC, 0x80, 0xA3, 0xB7, 0x67, 0xF4, 0x28, 0xA4, 0x98,
|
||||
0xB5, 0x5D, 0xB3, 0x0E, 0x77, 0xF4, 0xD0, 0x7E, 0xE2, 0x1C, 0xE2, 0x6B, 0xB4, 0x67, 0x42, 0x40,
|
||||
0xCB, 0x5A, 0x59, 0x43, 0x80, 0xA4, 0x92, 0xEC, 0xEB, 0x1E, 0xFB, 0x08, 0xFA, 0x17, 0xFE, 0x5E,
|
||||
0xF5, 0xD5, 0x1E, 0x12, 0xEB, 0xE8, 0x91, 0x78, 0x0E, 0x13, 0x67, 0xF9, 0x51, 0x0B, 0xBF, 0xA6,
|
||||
0x9B, 0x19, 0x26, 0x1D, 0xAE, 0xF7, 0x3A, 0xBB, 0xD7, 0x61, 0x62, 0xFA, 0xDB, 0x75, 0x26, 0x34,
|
||||
0xB7, 0xAF, 0x8C, 0xDD, 0xF5, 0xC1, 0x1C, 0x65, 0x23, 0xF2, 0xEC, 0x58, 0xA1, 0x9E, 0x82, 0x66,
|
||||
0x58, 0x4C, 0xF8, 0x44, 0x20, 0x87, 0x26, 0xCA, 0x09, 0xD6, 0xCD, 0x19, 0x4C, 0x39, 0x2A, 0x63,
|
||||
0xC8, 0xE2, 0x04, 0x18, 0x32, 0xBC, 0x87, 0x39, 0x7A, 0x0A, 0x59, 0xAA, 0xD5, 0xEB, 0xAE, 0x20,
|
||||
0x10, 0x9A, 0xBD, 0xB5, 0x14, 0xFC, 0x59, 0xCE, 0x86, 0x96, 0x42, 0x4A, 0xB0, 0xAE, 0xA5, 0x65,
|
||||
0x56, 0x34, 0x04, 0x13, 0x7C, 0xA0, 0x8B, 0x44, 0x11, 0xCE, 0xC3, 0x3C, 0x32, 0x56, 0xE4, 0xE0,
|
||||
0xFC, 0xAF, 0x7E, 0x89, 0xFB, 0x44, 0x4A, 0x34, 0x1C, 0x02, 0x7F, 0x69, 0xF1, 0x38, 0x8B, 0x3C,
|
||||
0x23, 0x54, 0x4A, 0xD8, 0xF5, 0x69, 0x70, 0xCA, 0x04, 0x99, 0x2A, 0xB0, 0x66, 0x22, 0x55, 0x14,
|
||||
0x82, 0x2A, 0x4B, 0x63, 0xA5, 0x05, 0x1E, 0x62, 0x49, 0x6B, 0xC1, 0x83, 0x6B, 0xA5, 0x74, 0xDD,
|
||||
0x20, 0x26, 0xAD, 0xDD, 0xD1, 0x37, 0x2C, 0x7E, 0x36, 0xE0, 0xBF, 0xC1, 0xEA, 0x37, 0x89, 0x5F,
|
||||
0x74, 0x6F, 0xAC, 0x05, 0x71, 0x94, 0x8D, 0x79, 0x1B, 0xAB, 0x03, 0xD9, 0x96, 0x9E, 0x40, 0x69,
|
||||
0x47, 0x23, 0x77, 0x35, 0x35, 0x60, 0x6C, 0xAA, 0x0B, 0x07, 0xC7, 0x64, 0xF7, 0x7F, 0x43, 0x6B,
|
||||
0x02, 0x69, 0x41, 0xCA, 0x1B, 0x51, 0xD9, 0x87, 0xEB, 0x36, 0xDD, 0x9E, 0xFF, 0xA1, 0x50, 0x6A,
|
||||
0x33, 0x5F, 0x25, 0x04, 0x97, 0x46, 0x99, 0x4D, 0xA4, 0x37, 0xD9, 0xA2, 0x23, 0x6E, 0x4C, 0x1B,
|
||||
0x36, 0xED, 0x9F, 0x09, 0x30, 0x26, 0xAB, 0x6F, 0x98, 0x0F, 0xF6, 0x13, 0x44, 0x4F, 0xF1, 0x61,
|
||||
0x73, 0x53, 0x39, 0x90, 0x88, 0xAE, 0x32, 0xC7, 0x33, 0x6B, 0x1A, 0xA1, 0xE8, 0x6F, 0x82, 0x99,
|
||||
0x73, 0x20, 0x44, 0xCF, 0x27, 0x17, 0xF8, 0x88, 0x19, 0x45, 0xD2, 0x41, 0x0A, 0xDB, 0x68, 0xA8,
|
||||
0x59, 0xBC, 0x73, 0xF7, 0xF1, 0x2D, 0x58, 0xBA, 0x60, 0x26, 0xA2, 0xB8, 0x93, 0x31, 0x32, 0xAB,
|
||||
0x13, 0xDE, 0x61, 0x0D, 0xD7, 0xA0, 0xFC, 0x44, 0x2A, 0xEE, 0xA3, 0xCF, 0x37, 0x17, 0xF9, 0xF8,
|
||||
0x63, 0x5A, 0x0C, 0x94, 0x78, 0x57, 0x24, 0xC0, 0x20, 0x12, 0xDA, 0xF0, 0x91, 0x22, 0x0D, 0x8E,
|
||||
0x3D, 0x48, 0xA0, 0x41, 0xFC, 0x65, 0x34, 0x0A, 0x4B, 0xE4, 0xFF, 0xEE, 0xB9, 0xF6, 0xD5, 0x48,
|
||||
0x60, 0xD1, 0x08, 0x75, 0x19, 0x7D, 0x23, 0xE6, 0x48, 0x80, 0xA4, 0x80, 0x72, 0x25, 0xE8, 0xF5,
|
||||
0x08, 0xFA, 0x70, 0xB5, 0x93, 0x6C, 0xA0, 0xFD, 0x28, 0xD4, 0xC6, 0xB5, 0xE3, 0x6D, 0x70, 0x6B,
|
||||
0x6D, 0x3F, 0x61, 0x01, 0xEB, 0xC9, 0xE7, 0xE1, 0x55, 0x67, 0x43, 0xE7, 0xBE, 0x1B, 0xE5, 0xA6,
|
||||
0xB7, 0x6C, 0x8F, 0x6D, 0xE4, 0x22, 0xCF, 0x8C, 0x6C, 0x67, 0xE6, 0xF3, 0xEC, 0x07, 0xB3, 0xE9,
|
||||
0x51, 0xBE, 0xBD, 0xC8, 0xCE, 0x67, 0xF2, 0x14, 0x7B, 0xDD, 0x8C, 0x70, 0x6E, 0x4C, 0x3E, 0x1E,
|
||||
0xA6, 0xCB, 0xD7, 0x4B, 0x0F, 0x61, 0x76, 0x39, 0x91, 0xE9, 0xD2, 0x43, 0x51, 0x8E, 0x86, 0x82,
|
||||
0x7B, 0xB2, 0xCD, 0xF6, 0x0E, 0x74, 0x0F, 0xA3, 0xD4, 0x25, 0xC2, 0x16, 0xCB, 0xFB, 0x8A, 0x2A,
|
||||
0x0B, 0xFA, 0xCF, 0xC0, 0x99, 0x38, 0x48, 0xCD, 0x87, 0xB6, 0x39, 0x74, 0x5C, 0x9F, 0x0A, 0x12,
|
||||
0xA7, 0x42, 0x1B, 0xF2, 0xBC, 0x9A, 0x38, 0x12, 0xA1, 0x5F, 0x64, 0x54, 0x2A, 0x0C, 0xFB, 0xF9,
|
||||
0xF0, 0xB3, 0x4B, 0xC5, 0xD1, 0xAE, 0x15, 0x52, 0x14, 0xDE, 0x91, 0x16, 0x38, 0xAF, 0x01, 0x16,
|
||||
0x8D, 0x29, 0x3E, 0xFE, 0x62, 0xF3, 0x57, 0x10, 0x6C, 0x21, 0x10, 0x9F, 0x8F, 0x4C, 0xF9, 0xE8,
|
||||
0x7F, 0x77, 0xFF, 0xF7, 0x01, 0x53, 0x7E, 0xB8, 0xC3, 0xFC, 0x88, 0xF1, 0xB1, 0x5A, 0x63, 0xAB,
|
||||
0xC2, 0x78, 0x8C, 0x15, 0x96, 0x61, 0xC7, 0x88, 0xC5, 0x45, 0x16, 0xE9, 0xE1, 0xD5, 0x77, 0xB4,
|
||||
0xC9, 0xA6, 0xAB, 0x47, 0xEE, 0x86, 0xFE, 0xD1, 0x2C, 0xAB, 0x23, 0x18, 0xA7, 0xB0, 0x4D, 0x18,
|
||||
0x52, 0xB7, 0xEF, 0x68, 0xCB, 0x80, 0xF9, 0x05, 0x15, 0x7A, 0xCB, 0x61, 0xC5, 0xCE, 0xCF, 0x92,
|
||||
0x3B, 0xCA, 0x7C, 0xEC, 0x02, 0x6F, 0x6B, 0x1E, 0x27, 0xAC, 0x07, 0xF2, 0x63, 0xB8, 0xDC, 0x1C,
|
||||
0x6A, 0x52, 0xB5, 0xF2, 0x90, 0xEB, 0x16, 0xA1, 0x2C, 0x9C, 0x3D, 0x20, 0x4B, 0xB3, 0xB9, 0x3B,
|
||||
0xD3, 0xE0, 0x7A, 0xCC, 0x9E, 0xF8, 0x95, 0x32, 0x2A, 0x34, 0x4A, 0xBC, 0x1E, 0x21, 0x05, 0x02,
|
||||
0x1A, 0xF4, 0x19, 0x32, 0x7B, 0x4A, 0x08, 0x15, 0x1B, 0xB1, 0xD5, 0x25, 0x53, 0x78, 0x99, 0xD8,
|
||||
0x9D, 0x8E, 0x45, 0xAE, 0x44, 0x52, 0x90, 0xC3, 0x89, 0xE7, 0xA5, 0x3E, 0xFA, 0xBC, 0x1C, 0x43,
|
||||
0x7B, 0x2E, 0x6B, 0x26, 0x84, 0x19, 0xA7, 0x4D, 0xDC, 0xD6, 0x4D, 0x29, 0x0F, 0x3A, 0xA5, 0xBC,
|
||||
0x09, 0x07, 0x53, 0x20, 0x8E, 0xE2, 0x91, 0x38, 0x73, 0x70, 0xA0, 0xAE, 0x10, 0xE0, 0x62, 0x49,
|
||||
0xAD, 0x71, 0x64, 0xC7, 0x8F, 0x15, 0x04, 0x42, 0xB4, 0xA6, 0x37, 0xEB, 0x9A, 0xB2, 0x00, 0x20,
|
||||
0xC6, 0x55, 0x3C, 0x14, 0xAB, 0xC2, 0x15, 0xF5, 0xB7, 0x79, 0x81, 0x5D, 0x36, 0xC2, 0xEC, 0xBA,
|
||||
0xC3, 0xB5, 0xAC, 0xF5, 0x2A, 0x92, 0x2A, 0xAC, 0x4D, 0x7F, 0x71, 0x5A, 0xFE, 0x74, 0xAC, 0xFE,
|
||||
0x70, 0x58, 0x9F, 0x61, 0x10, 0x95, 0xED, 0x04, 0xF7, 0x1E, 0x49, 0x99, 0xCD, 0xAB, 0x2C, 0x3A,
|
||||
0x8F, 0x00, 0x26, 0x48, 0x5F, 0x0F, 0x80, 0xFF, 0x72, 0x05, 0x82, 0xE4, 0xDD, 0x6F, 0x7C, 0xDA,
|
||||
0x42, 0x91, 0x94, 0x57, 0x8F, 0xC0, 0xA7, 0xBA, 0x46, 0x8C, 0x15, 0xE9, 0xEA, 0x5E, 0xCD, 0xE7,
|
||||
0x63, 0xB3, 0x15, 0x50, 0x5E, 0x71, 0x35, 0xEE, 0x84, 0xFA, 0x23, 0x4B, 0xEE, 0x5B, 0x99, 0xDF,
|
||||
0x0D, 0xE5, 0x69, 0xC7, 0xD7, 0xF7, 0x49, 0xC4, 0xEF, 0x19, 0x88, 0x57, 0xB5, 0x4F, 0x3E, 0x18,
|
||||
0xF9, 0x61, 0x1A, 0xFE, 0xFB, 0x15, 0xE3, 0x65, 0x49, 0x19, 0x17, 0xBA, 0xC0, 0x26, 0x8A, 0x5E,
|
||||
0x8D, 0x29, 0x50, 0x62, 0x19, 0x6E, 0xFA, 0x22, 0x7E, 0xEA, 0xE6, 0x2F, 0x90, 0xEF, 0x71, 0x21,
|
||||
0xAD, 0x2A, 0xFC, 0x97, 0xBA, 0xC7, 0x71, 0x7D, 0x68, 0x1C, 0x53, 0xB1, 0xD4, 0x59, 0xED, 0xE1,
|
||||
0x56, 0x54, 0xD1, 0x89, 0xC4, 0xB0, 0xB8, 0x88, 0x78, 0xCA, 0xF7, 0x85, 0x7E, 0xA0, 0xE8, 0xF4,
|
||||
0xE5, 0x12, 0xE8, 0x24, 0x9A, 0x51, 0xE9, 0xA3, 0x52, 0x96, 0x59, 0x47, 0x07, 0x63, 0xAE, 0x18,
|
||||
0x41, 0xAB, 0x17, 0xE8, 0x94, 0xDF, 0x94, 0x2F, 0x8F, 0x36, 0x34, 0x91, 0x20, 0x52, 0xE0, 0x11,
|
||||
0x2E, 0xFF, 0xBD, 0xBD, 0x6E, 0x49, 0xE2, 0x41, 0xA6, 0xD0, 0x10, 0xD0, 0x2C, 0xE4, 0x2E, 0x9F,
|
||||
0xBF, 0x36, 0xAD, 0xDA, 0xA5, 0xFE, 0xD9, 0xEC, 0xC1, 0x55, 0x20, 0xCB, 0x10, 0xAD, 0x4D, 0xE3,
|
||||
0xD2, 0xE7, 0x09, 0xFB, 0x14, 0xC2, 0x11, 0x33, 0x2C, 0xFA, 0xDE, 0x82, 0x15, 0x4D, 0xF0, 0xB6,
|
||||
0x71, 0x3C, 0x58, 0x80, 0xD2, 0x87, 0x05, 0x89, 0xEF, 0x00, 0x6C, 0x8A, 0xFB, 0x14, 0xF3, 0x65,
|
||||
0x22, 0xCD, 0xBF, 0x25, 0x03, 0x60, 0x12, 0x38, 0x2B, 0x0A, 0xF1, 0xFB, 0xCB, 0x80, 0x11, 0x3B,
|
||||
0x59, 0xE2, 0xEF, 0x07, 0xC8, 0x97, 0x50, 0xFE, 0x56, 0x4C, 0x52, 0x4F, 0x73, 0xD9, 0xCA, 0x89,
|
||||
0x7B, 0xEA, 0x50, 0x5E, 0xCB, 0xB9, 0xEE, 0xC8, 0xFF, 0xC5, 0x13, 0x62, 0x00, 0x9F, 0xBF, 0x61,
|
||||
0xC7, 0x2F, 0x0F, 0xBF, 0x75, 0xC3, 0x0E, 0x72, 0x2C, 0xF7, 0xDF, 0xA5, 0xAE, 0x94, 0x15, 0x8F,
|
||||
0xBB, 0x1D, 0x26, 0xA0, 0xCB, 0x8B, 0x40, 0x78, 0x48, 0xB4, 0x41, 0x47, 0x6B, 0x7D, 0x45, 0xBE,
|
||||
0x39, 0xA5, 0xE2, 0xB7, 0x11, 0xEF, 0xE8, 0x19, 0xA0, 0x62, 0x26, 0xE1, 0xD5, 0x94, 0x54, 0x9D,
|
||||
0xA4, 0x28, 0xEE, 0x7F, 0x7F, 0x25, 0xAD, 0xDB, 0x28, 0x2C, 0xDB, 0xA7, 0x63, 0xF8, 0x0E, 0x6E,
|
||||
0xE2, 0x0F, 0x8F, 0xC7, 0x17, 0x31, 0xB2, 0x8D, 0xA8, 0x92, 0x7A, 0x81, 0xD5, 0x88, 0x2E, 0xD3,
|
||||
0xF2, 0xE5, 0x08, 0x76, 0xC7, 0x93, 0xDB, 0xC0, 0x0B, 0x38, 0x58, 0xF7, 0x6F, 0xC4, 0x58, 0xAD,
|
||||
0xB0, 0x3B, 0xDC, 0xE6, 0xD1, 0xB3, 0xC2, 0x39, 0x25, 0xE7, 0x48, 0x19, 0xC8, 0x27, 0xD1, 0xDF,
|
||||
0x9F, 0x5F, 0xB8, 0x5A, 0x50, 0xE9, 0x0B, 0x51, 0x43, 0x2C, 0xA6, 0x09, 0x39, 0x14, 0xF5, 0x3E,
|
||||
0x03, 0x6E, 0x55, 0x7D, 0xE3, 0x42, 0xE5, 0xBB, 0x40, 0xA0, 0x71, 0xAA, 0xF1, 0xAF, 0x6E, 0xF2,
|
||||
0xE2, 0x59, 0x94, 0xF2, 0x9F, 0x79, 0x67, 0x23, 0x6F, 0xCA, 0x85, 0xF6, 0x1F, 0xA3, 0x87, 0x7B,
|
||||
0xE6, 0x62, 0xEE, 0x8F, 0x0D, 0x48, 0x89, 0x98, 0x37, 0x35, 0x91, 0x05, 0x58, 0xA3, 0x83, 0x28,
|
||||
0x13, 0xA2, 0x1E, 0xD1, 0x49, 0x5F, 0x68, 0x59, 0x47, 0x49, 0xED, 0x7B, 0xC2, 0x45, 0x58, 0xCB,
|
||||
0xB7, 0xC8, 0x91, 0x3B, 0xF5, 0xB4, 0xC4, 0x8C, 0x01, 0xE3, 0x78, 0x3A, 0x3D, 0xD9, 0x58, 0x0B,
|
||||
0xA3, 0xB2, 0x8C, 0xFA, 0xF1, 0x8C, 0xC5, 0x77, 0x93, 0xC9, 0x88, 0x80, 0x67, 0xB5, 0x62, 0x55,
|
||||
0x6E, 0x01, 0x74, 0xF3, 0x81, 0x9E, 0xAE, 0x27, 0xB0, 0x20, 0xC6, 0xE1, 0xAE, 0xE7, 0xBB, 0x8D,
|
||||
0x12, 0x27, 0x6D, 0x23, 0xF3, 0x1D, 0xCD, 0x5E, 0x20, 0xAC, 0x10, 0x06, 0x1D, 0x3C, 0xB4, 0x86,
|
||||
0xB7, 0x0E, 0x8C, 0x9D, 0x14, 0xD5, 0xAC, 0xFF, 0xFE, 0xE5, 0x6B, 0xEB, 0xED, 0x3F, 0xF5, 0x40,
|
||||
0xBA, 0x69, 0x66, 0x90, 0xFA, 0x54, 0xAC, 0xB9, 0xCB, 0x07, 0x38, 0xAF, 0xE4, 0x40, 0x41, 0x0C,
|
||||
0x0A, 0x44, 0x2D, 0x31, 0x46, 0x4E, 0x2B, 0x75, 0xFA, 0x06, 0xA3, 0x59, 0xC3, 0x27, 0x53, 0xFC,
|
||||
0xB6, 0xEF, 0xBA, 0x10, 0xAA, 0x65, 0x1D, 0x1C, 0xAB, 0x19, 0x8C, 0x54, 0x1D, 0x3B, 0xBB, 0x10,
|
||||
0x05, 0xAA, 0xAE, 0xEF, 0x80, 0x03, 0x28, 0xA7, 0x4D, 0xA9, 0xD8, 0xA8, 0x34, 0x75, 0xC6, 0x2B,
|
||||
0x43, 0x82, 0x59, 0x00, 0x2E, 0xEE, 0xF9, 0x8A, 0x8F, 0x8E, 0x1C, 0x21, 0xA0, 0xDC, 0xAA, 0xFC,
|
||||
0xBF, 0x15, 0x2F, 0x6D, 0x00, 0x33, 0x81, 0x24, 0x86, 0x58, 0xCF, 0xD5, 0x5A, 0xC4, 0xB3, 0x28,
|
||||
0x97, 0xC5, 0x45, 0xAB, 0x8D, 0x48, 0xDE, 0xEA, 0xB2, 0xFD, 0x1E, 0xD3, 0x13, 0x57, 0xFF, 0xFB,
|
||||
0x24, 0xDE, 0x7A, 0x9D, 0x43, 0xF8, 0xC7, 0xDD, 0x1A, 0x28, 0x7C, 0x39, 0xA4, 0xDA, 0x58, 0xB7,
|
||||
0xBD, 0x1D, 0x24, 0xDE, 0xCF, 0x85, 0x7E, 0xEF, 0x5A, 0x4F, 0xF1, 0xB4, 0xCB, 0xA6, 0x5E, 0xC0,
|
||||
0x80, 0xE6, 0x0B, 0xC0, 0x69, 0xAD, 0x5D, 0xB4, 0x88, 0xBD, 0xFB, 0x78, 0x2C, 0x3C, 0xA6, 0x69,
|
||||
0x77, 0x16, 0xD6, 0xA9, 0xFF, 0x4A, 0x6C, 0xC0, 0x48, 0x27, 0x64, 0x41, 0x51, 0x79, 0xC6, 0xF9,
|
||||
0x85, 0x71, 0x9C, 0x89, 0xD2, 0x68, 0xF5, 0xBB, 0xE5, 0x83, 0xF5, 0xD0, 0xEB, 0x25, 0xC7, 0x1E,
|
||||
0x50, 0xA8, 0x1F, 0x50, 0x86, 0xEE, 0x1F, 0xE9, 0x4A, 0xB3, 0xA0, 0x18, 0xF8, 0xCE, 0xD6, 0x0B,
|
||||
0xF2, 0x41, 0xFC, 0x21, 0x20, 0x1A, 0xA3, 0x9D, 0xB7, 0xD1, 0x49, 0x79, 0xE2, 0x7B, 0xF3, 0x8B,
|
||||
0x40, 0x6F, 0xE2, 0x45, 0x00, 0x5A, 0x81, 0x7D, 0x39, 0x93, 0x3B, 0x59, 0xE0, 0x3E, 0xCA, 0xC5,
|
||||
0x61, 0x80, 0x65, 0x2D, 0xC9, 0xAD, 0x2C, 0x26, 0x66, 0x11, 0x3A, 0xA6, 0xBA, 0xF5, 0x3B, 0x49,
|
||||
0xC5, 0xB1, 0xAA, 0xB6, 0xBC, 0x68, 0x00, 0x51, 0x82, 0x1A, 0x39, 0x2B, 0x28, 0x5C, 0x39, 0xF2,
|
||||
0xB4, 0x7E, 0x93, 0x63, 0xEA, 0xD7, 0xBE, 0x7F, 0xA0, 0xCC, 0x47, 0x31, 0x2E, 0xBA, 0x9C, 0xD0,
|
||||
0x67, 0xBF, 0xE0, 0xDE, 0x46, 0xCA, 0xA1, 0x84, 0x57, 0x6B, 0x15, 0x0A, 0xC6, 0xAB, 0x32, 0x74,
|
||||
0x37, 0x34, 0xDA, 0x1A, 0x95, 0xA6, 0xA4, 0xEE, 0xF6, 0xC6, 0xFB, 0x70, 0x56, 0x0C, 0xC4, 0xCA,
|
||||
0x0D, 0xD5, 0xCB, 0x03, 0xA3, 0x21, 0xF5, 0x6D, 0x0F, 0xD1, 0xEE, 0x77, 0x73, 0xA4, 0xF9, 0x95,
|
||||
0x34, 0x2F, 0x0C, 0x5B, 0x7F, 0x48, 0x6A, 0x02, 0x4A, 0xA4, 0x59, 0x68, 0x0F, 0xF4, 0x64, 0x73,
|
||||
0x84, 0xCE, 0xED, 0x43, 0x54, 0x46, 0xD9, 0x42, 0x4C, 0x84, 0xD5, 0xFE, 0x5B, 0xD3, 0x51, 0x17,
|
||||
0x4E, 0xB8, 0x7A, 0x42, 0x87, 0x45, 0xDB, 0xC3, 0x2C, 0xC8, 0x8B, 0x86, 0xB3, 0x95, 0x0B, 0xCF,
|
||||
0x27, 0xC4, 0xA8, 0xEE, 0x60, 0x13, 0xD3, 0x9F, 0xFC, 0xD0, 0x7F, 0x84, 0x5B, 0x24, 0x5D, 0xCF,
|
||||
0xE4, 0xA4, 0x83, 0x35, 0xD1, 0x7A, 0x72, 0x78, 0xB6, 0xB4, 0xA2, 0x32, 0x0F, 0x68, 0x61, 0x7C,
|
||||
0xB7, 0x46, 0x20, 0x1A, 0xA5, 0x94, 0x63, 0x71, 0xAA, 0xA0, 0x77, 0x95, 0x28, 0x63, 0xCE, 0xFE,
|
||||
0x69, 0xB6, 0x44, 0x10, 0xF6, 0xC1, 0xD7, 0xED, 0x11, 0x73, 0x9E, 0x46, 0xDE, 0xC3, 0xFF, 0x9E,
|
||||
0xB9, 0xEC, 0xEC, 0xE4, 0xE3, 0xFD, 0x1E, 0xD3, 0x55, 0x08, 0x36, 0xC8, 0xDC, 0xD1, 0x0E, 0x00,
|
||||
0xEE, 0x86, 0x78, 0x08, 0xB7, 0xAD, 0xD8, 0xE1, 0x59, 0x60, 0x33, 0x14, 0xF4, 0x5C, 0x55, 0xA4,
|
||||
0xF1, 0x0D, 0x0E, 0x16, 0xCD, 0x1C, 0x72, 0x6D, 0x89, 0xEB, 0x41, 0x42, 0xB1, 0xF5, 0x63, 0x80,
|
||||
0xD6, 0x06, 0xC3, 0x1C, 0xBE, 0x7B, 0x95, 0x2A, 0x5B, 0x27, 0x08, 0xDC, 0xB7, 0x2A, 0xDC, 0x8E,
|
||||
0x3C, 0xA0, 0x84, 0x5F, 0xA8, 0xF1, 0x7B, 0x1F, 0xE1, 0x70, 0x37, 0x2D, 0x28, 0xDC, 0x7C, 0xB8,
|
||||
0xA7, 0x47, 0x60, 0x77, 0xAC, 0x55, 0xE3, 0x97, 0x5A, 0xC1, 0xA6, 0xA2, 0xFF, 0xCB, 0xF6, 0x45,
|
||||
0x28, 0x1E, 0xD2, 0x1C, 0xE8, 0x9E, 0x45, 0xF7, 0x1E, 0xD5, 0x92, 0xB4, 0x5A, 0x5E, 0x6A, 0xE0,
|
||||
0xF7, 0x1A, 0x81, 0xD7, 0x96, 0x62, 0xB5, 0xD9, 0xE7, 0x0E, 0x3A, 0xA3, 0xE8, 0x60, 0x30, 0x45,
|
||||
0x96, 0x86, 0x58, 0xDD, 0xBA, 0x04, 0x5E, 0xF4, 0x5D, 0xE3, 0x82, 0x7D, 0x3B, 0xD5, 0xD6, 0x28,
|
||||
0xFF, 0xC6, 0xDE, 0x3A, 0x3D, 0xF8, 0xB5, 0x6A, 0x5A, 0x1D, 0x34, 0x63, 0x48, 0x6F, 0xE9, 0xC8,
|
||||
0x5F, 0x56, 0x17, 0x14, 0x56, 0xC7, 0xE4, 0xC2, 0x38, 0x68, 0x8A, 0x81, 0x0F, 0x4D, 0x4A, 0x91,
|
||||
0x79, 0x85, 0x40, 0xB1, 0x7A, 0xA5, 0x4A, 0xF1, 0xC2, 0xA2, 0x3B, 0x62, 0x4D, 0xD8, 0xD8, 0x41,
|
||||
0x80, 0x66, 0x48, 0x7A, 0x96, 0xF7, 0xB2, 0x05, 0xDC, 0xB2, 0xD7, 0xBF, 0xB8, 0xB3, 0x0C, 0xD5,
|
||||
0x12, 0x90, 0xBA, 0x86, 0xDB, 0x2D, 0x2D, 0x2F, 0x1A, 0xBE, 0xA8, 0xF0, 0x42, 0xA1, 0xE6, 0x9B,
|
||||
0x89, 0x57, 0x69, 0xFD, 0x1B, 0x18, 0x94, 0xC2, 0xE1, 0x53, 0xD3, 0xAD, 0x2D, 0x90, 0x8B, 0xEA,
|
||||
0xAB, 0x29, 0x47, 0x08, 0xE6, 0x4B, 0xAC, 0x3A, 0xFC, 0x8C, 0x40, 0xC3, 0x45, 0xD9, 0xCF, 0x24,
|
||||
0xA9, 0x17, 0xC4, 0xAD, 0x46, 0xAC, 0x27, 0xAD, 0xE6, 0xEE, 0xF2, 0xF7, 0x5F, 0x6C, 0xD7, 0xE7,
|
||||
0xF2, 0x01, 0xED, 0x98, 0x4E, 0x7A, 0x03, 0x94, 0x4C, 0x26, 0x69, 0x5E, 0x8D, 0xDC, 0x13, 0xD6,
|
||||
0x3A, 0x2D, 0x4A, 0x70, 0x0E, 0x39, 0x94, 0x63, 0xDE, 0x08, 0x7A, 0x72, 0x4D, 0xFE, 0x89, 0xCA,
|
||||
0x8C, 0x4D, 0x39, 0x6A, 0x99, 0xAD, 0xAC, 0xE7, 0x8F, 0x6E, 0xD2, 0x18, 0x98, 0xF4, 0x1B, 0xD7,
|
||||
0x0A, 0x60, 0xA2, 0x00, 0x1B, 0xB3, 0xE6, 0x37, 0xA1, 0x1F, 0x30, 0xBD, 0xFD, 0xA8, 0x58, 0xB7,
|
||||
0xFF, 0xF1, 0x45, 0x74, 0x9B, 0xE9, 0xA8, 0x80, 0x12, 0x0F, 0x98, 0xF7, 0x9E, 0x62, 0xF5, 0x4A,
|
||||
0x0C, 0x32, 0x58, 0x87, 0x65, 0x2D, 0xE4, 0x90, 0x44, 0xB2, 0xB1, 0x8A, 0xFB, 0x29, 0x99, 0x3C,
|
||||
0xE8, 0xEB, 0x4F, 0x99, 0x21, 0x47, 0x0D, 0xAA, 0x9F, 0x54, 0xAA, 0xFC, 0x47, 0xB6, 0x35, 0xFE,
|
||||
0x24, 0x73, 0xC2, 0x26, 0x18, 0x1E, 0x61, 0x18, 0xC7, 0xF5, 0xE1, 0xD9, 0x5C, 0x7E, 0xCA, 0x71,
|
||||
0xA5, 0xA6, 0x4D, 0x91, 0xC0, 0xC5, 0x0C, 0x65, 0x98, 0x69, 0x9B, 0x51, 0xDF, 0xC2, 0x88, 0x51,
|
||||
0x21, 0x49, 0x8D, 0x23, 0x52, 0x27, 0xAD, 0x83, 0xD7, 0xB3, 0x73, 0x34, 0x90, 0xD3, 0xA7, 0xDE,
|
||||
0x9D, 0x8C, 0x5F, 0xCA, 0xA6, 0x2C, 0x95, 0x01, 0xCC, 0x24, 0x59, 0x70, 0x74, 0xBB, 0x72, 0xD7,
|
||||
0x80, 0x25, 0x03, 0xD1, 0xB2, 0x0A, 0xF8, 0x0A, 0x53, 0x9E, 0x03, 0x6F, 0xA4, 0xFB, 0x20, 0x52,
|
||||
0x46, 0x0C, 0x2B, 0xD8, 0x25, 0x4D, 0xE8, 0xBA, 0xB7, 0x97, 0x8E, 0x77, 0x52, 0xA6, 0x18, 0x92,
|
||||
0xBE, 0x86, 0x89, 0x0B, 0x57, 0xBD, 0xBE, 0xAC, 0x74, 0xE5, 0x64, 0xEA, 0x0C, 0xEE, 0xA2, 0x70,
|
||||
0x09, 0x0A, 0x07, 0x97, 0xCD, 0x42, 0xD1, 0x91, 0x7E, 0x7F, 0xDE, 0xF5, 0x06, 0xBA, 0xBB, 0x91,
|
||||
0xF5, 0x90, 0x4D, 0x67, 0xDF, 0x02, 0x94, 0x7C, 0xAE, 0xC8, 0xD9, 0x80, 0x20, 0xF2, 0xFE, 0xA9,
|
||||
0x1B, 0x91, 0x34, 0x34, 0x18, 0xFE, 0xF2, 0xD1, 0xD2, 0xB6, 0xE4, 0xA6, 0x77, 0xD3, 0x63, 0x2C,
|
||||
0x82, 0x8A, 0xE0, 0x87, 0xEB, 0x30, 0xC5, 0x14, 0x7E, 0x55, 0x0E, 0x87, 0x7F, 0xD3, 0x5B, 0x88,
|
||||
0xA9, 0xA7, 0x1B, 0xB8, 0x55, 0xE1, 0x60, 0x1B, 0xF3, 0x09, 0x8D, 0xE4, 0x31, 0xFF, 0xAA, 0xB0,
|
||||
0xFC, 0x29, 0xD2, 0x3F, 0xEE, 0x8C, 0x99, 0x0B, 0x79, 0x1F, 0x60, 0x6F, 0xF7, 0xE0, 0x5A, 0x5E,
|
||||
0xD2, 0xB2, 0x52, 0x6C, 0xD4, 0xF5, 0x96, 0x76, 0xAC, 0x51, 0x07, 0xA0, 0xEC, 0x01, 0x34, 0x37,
|
||||
0xDB, 0xB0, 0xBE, 0x04, 0x2C, 0x1D, 0xCF, 0x1C, 0x8B, 0xF4, 0xAE, 0x03, 0x7A, 0x9C, 0x6A, 0xDA,
|
||||
0xC6, 0xD7, 0xB2, 0xE8, 0x9C, 0x2D, 0xCB, 0x42, 0x7C, 0xFA, 0x49, 0x3E, 0xCA, 0x93, 0xA3, 0x2E,
|
||||
0x34, 0x16, 0x35, 0xC7, 0xEB, 0x14, 0x65, 0x95, 0xDD, 0x50, 0x3F, 0xE2, 0xA7, 0xB8, 0x31, 0x30,
|
||||
0x19, 0xC5, 0x39, 0xE6, 0xD6, 0xD8, 0xCB, 0x8B, 0x35, 0x85, 0xB9, 0x2F, 0x5F, 0x72, 0x38, 0xA0,
|
||||
0x32, 0x7D, 0x0B, 0x30, 0x69, 0x4E, 0xEB, 0x97, 0x1B, 0x5A, 0xCC, 0xCB, 0x9F, 0x14, 0xD1, 0xC4,
|
||||
0x66, 0x03, 0xE3, 0xC9, 0xC8, 0x70, 0xD0, 0x08, 0xE6, 0x1B, 0x08, 0xEF, 0xB2, 0x13, 0xF3, 0xAE,
|
||||
0x61, 0x5E, 0xE2, 0xF9, 0x72, 0x7B, 0x20, 0x63, 0x86, 0x8A, 0x3A, 0xBD, 0xFB, 0x08, 0xA9, 0x90,
|
||||
0xA6, 0xFF, 0xC4, 0xF7, 0xDA, 0x6D, 0x2C, 0x96, 0x5F, 0xB8, 0xE0, 0x73, 0x7C, 0x92, 0xA1, 0xE5,
|
||||
0xF9, 0x10, 0x01, 0x6F, 0xCD, 0xFF, 0x16, 0xCE, 0x54, 0x2E, 0x16, 0x87, 0x65, 0xA4, 0xB1, 0xD4,
|
||||
0xA2, 0x7E, 0xD2, 0x09, 0xC5, 0x97, 0x7C, 0xDA, 0xAC, 0x7B, 0xA4, 0xA1, 0x0A, 0xD3, 0x84, 0x1E,
|
||||
0xEA, 0xE3, 0x8E, 0xA3, 0xB2, 0x30, 0x23, 0x84, 0x51, 0x0C, 0x78, 0x43, 0x46, 0x86, 0xF0, 0x10,
|
||||
0xED, 0xF6, 0x57, 0xA7, 0x40, 0x33, 0xCC, 0x19, 0xC6, 0xB7, 0xFA, 0x45, 0x7C, 0x22, 0x26, 0x07,
|
||||
0x0F, 0xC7, 0x6E, 0x86, 0xB7, 0x71, 0xA4, 0xC3, 0x1E, 0x54, 0x9F, 0xAF, 0x84, 0x94, 0xEB, 0x84,
|
||||
0x6E, 0xE8, 0xDE, 0xA6, 0xC8, 0xA6, 0xBB, 0x93, 0xF6, 0x06, 0x1B, 0x49, 0x82, 0x06, 0x01, 0xAC,
|
||||
0x6A, 0x69, 0x9C, 0x44, 0xC2, 0xFF, 0x84, 0xA0, 0xDD, 0x87, 0xD2, 0xF7, 0xFB, 0xF8, 0x05, 0x14,
|
||||
0x59, 0x3F, 0x6B, 0x68, 0x90, 0x11, 0x78, 0x8F, 0xA1, 0x6F, 0x0F, 0x7B, 0x62, 0x47, 0xD0, 0xB1,
|
||||
0xBB, 0x80, 0x7D, 0x3C, 0x1F, 0x09, 0x7B, 0xE9, 0x60, 0x32, 0x78, 0xB1, 0xE6, 0x1B, 0xD0, 0x9C,
|
||||
0x9D, 0xA5, 0x56, 0x47, 0xB7, 0x47, 0x4B, 0x42, 0xCA, 0xBA, 0x34, 0x40, 0x30, 0xE4, 0x80, 0x9F,
|
||||
0x74, 0xD9, 0x4F, 0x64, 0x4B, 0x3F, 0x7C, 0x04, 0x76, 0x45, 0x1C, 0x58, 0xA2, 0xC8, 0x5C, 0xC6,
|
||||
0x08, 0x5B, 0xD2, 0x80, 0x58, 0xC1, 0x22, 0x3F, 0x9C, 0x99, 0xCD, 0xB8, 0x4A, 0xF6, 0x3E, 0xD4,
|
||||
0xFF, 0x26, 0x4C, 0xBF, 0xD5, 0xA0, 0x38, 0x40, 0x30, 0x1D, 0x04, 0x9A, 0xE0, 0x8C, 0x04, 0x6A,
|
||||
0x87, 0xB6, 0x16, 0x3F, 0x0C, 0xF9, 0xC5, 0x85, 0x43, 0x77, 0x50, 0x9B, 0xF8, 0x75, 0xA3, 0x9A,
|
||||
0xAD, 0x2A, 0x1D, 0x7C, 0xF9, 0xD3, 0x00, 0x7D, 0xFC, 0xA8, 0x5F, 0x7C, 0xC8, 0xEB, 0x69, 0xC4,
|
||||
0xAC, 0x16, 0xEB, 0xED, 0x53, 0xBE, 0x66, 0x95, 0xFC, 0x81, 0x65, 0x17, 0x65, 0xEB, 0x0B, 0x7F,
|
||||
0xF7, 0x57, 0x35, 0x50, 0x43, 0xBB, 0xC5, 0x1A, 0xC9, 0xA2, 0xCF, 0x7B, 0x1D, 0xC0, 0x9E, 0x02,
|
||||
0x79, 0x29, 0x23, 0xB6, 0x24, 0xCF, 0x55, 0x5A, 0x52, 0x3A, 0x51, 0xCE, 0x03, 0xB9, 0x0F, 0xF7,
|
||||
0x45, 0x5F, 0x10, 0xE7, 0x78, 0xD6, 0x2B, 0xF8, 0xD0, 0x8C, 0x7F, 0xE8, 0xA1, 0xA5, 0x7F, 0x07,
|
||||
0x51, 0xE4, 0xF6, 0xB8, 0xC4, 0xB5, 0xF1, 0xC4, 0xC0, 0x18, 0x2A, 0xD2, 0xC3, 0x86, 0xB9, 0xB1,
|
||||
0x35, 0xD8, 0xDD, 0xD3, 0x77, 0x73, 0xAB, 0x01, 0x4A, 0xDE, 0x76, 0x5F, 0x3C, 0x6E, 0x56, 0xB3,
|
||||
0x82, 0xC3, 0x7B, 0x03, 0x81, 0x29, 0x7F, 0xE0, 0x83, 0x40, 0xF4, 0x52, 0xF5, 0x32, 0x6A, 0x12,
|
||||
0x32, 0x84, 0xBE, 0xBE, 0x92, 0xDA, 0x04, 0x32, 0x40, 0xCF, 0x13, 0xE8, 0x5E, 0x6D, 0x79, 0x71,
|
||||
0x5C, 0x98, 0x8C, 0x83, 0xEE, 0x37, 0xE2, 0x65, 0xAA, 0x83, 0xF9, 0xD5, 0xD8, 0xDF, 0x5B, 0x70,
|
||||
0x46, 0x64, 0xAB, 0xAA, 0x16, 0x53, 0x66, 0x4B, 0x7F, 0xA6, 0x79, 0x24, 0xBC, 0xD5, 0x35, 0xEF,
|
||||
0x14, 0xF6, 0xEA, 0x75, 0xF1, 0xD3, 0x41, 0x18, 0x44, 0x58, 0xD8, 0xA0, 0x49, 0x52, 0x99, 0x7B,
|
||||
0x25, 0x6B, 0x65, 0x4B, 0x1B, 0xC7, 0x1D, 0xFB, 0x87, 0x27, 0x8D, 0x3B, 0xBD, 0xC1, 0xF7, 0xD3,
|
||||
0x51, 0xED, 0x7F, 0x43, 0xB6, 0x23, 0xC2, 0x70, 0x61, 0xB3, 0xB0, 0x0D, 0xB2, 0xE9, 0x58, 0x5E,
|
||||
0xFA, 0x23, 0xD1, 0xC7, 0x06, 0x76, 0xBF, 0x48, 0x06, 0xF4, 0xF9, 0xFC, 0x1C, 0x6F, 0xD6, 0xF8,
|
||||
0xFF, 0x9E, 0x40, 0xCF, 0xAD, 0xB7, 0x95, 0xF7, 0x2C, 0x5B, 0xD2, 0xD5, 0x49, 0xA3, 0xAB, 0xCA,
|
||||
0x3E, 0x5B, 0xB0, 0x8B, 0x2E, 0x70, 0x27, 0x7D, 0x36, 0x88, 0xB5, 0x25, 0xBA, 0xE9, 0x67, 0x62,
|
||||
0xB0, 0xA8, 0x26, 0x8C, 0xA4, 0xB7, 0x14, 0xAE, 0xEC, 0xF1, 0x0D, 0xF1, 0x3E, 0xFC, 0x76, 0x5A,
|
||||
0x27, 0x32, 0x60, 0xBE, 0x71, 0x74, 0xE2, 0x54, 0x66, 0xC1, 0xAF, 0x6E, 0xBD, 0x11, 0x3A, 0x1F,
|
||||
0x0A, 0x0B, 0xF5, 0x61, 0x04, 0xF3, 0x0A, 0x2B, 0x8B, 0x90, 0x8F, 0x82, 0x42, 0x03, 0x18, 0x1B,
|
||||
0xC5, 0x08, 0x53, 0xB9, 0x53, 0x35, 0xB1, 0x05, 0x9F, 0x05, 0x59, 0x85, 0x2C, 0x25, 0x48, 0xD3,
|
||||
0x2C, 0xB6, 0xFE, 0xF8, 0x3B, 0x08, 0x49, 0xF3, 0xC1, 0x56, 0x87, 0x49, 0xEB, 0x4D, 0x05, 0x1F,
|
||||
0xE5, 0x0F, 0xB5, 0x99, 0xDA, 0xBF, 0x78, 0xC9, 0xFA, 0x1F, 0x62, 0x66, 0x4B, 0xB8, 0x76, 0xAF,
|
||||
0x69, 0xDD, 0x4A, 0x80, 0x52, 0x58, 0xB2, 0x04, 0x0B, 0x87, 0x66, 0xF9, 0xE2, 0xF0, 0x66, 0x15,
|
||||
0x7F, 0x4C, 0x40, 0x6B, 0x4A, 0xD6, 0x47, 0xD8, 0x81, 0xF1, 0x3B, 0xEF, 0x5C, 0xF7, 0x10, 0x7D,
|
||||
0x5C, 0xBC, 0x53, 0x11, 0xFF, 0x8B, 0x6D, 0x4C, 0x08, 0x16, 0x47, 0x48, 0xF2, 0xA0, 0x2C, 0xEF,
|
||||
0x33, 0x31, 0x90, 0x94, 0x45, 0x66, 0xC8, 0x3F, 0x84, 0x11, 0xDA, 0x8C, 0xD7, 0x90, 0x8F, 0xF0,
|
||||
0x3D, 0xF2, 0xBB, 0x86, 0xFF, 0x90, 0xF3, 0xFB, 0x52, 0xF5, 0x60, 0x3E, 0xF3, 0xBD, 0xAC, 0x3A,
|
||||
0x6C, 0x74, 0x7D, 0x03, 0x85, 0xB6, 0xFA, 0xA4, 0x75, 0xD6, 0x52, 0xDB, 0xD2, 0xB8, 0x30, 0xF1,
|
||||
0x78, 0x7B, 0xCF, 0xC5, 0x57, 0xDF, 0x52, 0xB9, 0xEF, 0xC5, 0xEF, 0xCA, 0x6D, 0x38, 0x0E, 0x28,
|
||||
0xC4, 0x9D, 0x93, 0x4D, 0x73, 0x0A, 0xD1, 0x11, 0xAD, 0x33, 0x27, 0xC9, 0x7E, 0xF8, 0x85, 0x1D,
|
||||
0x05, 0x41, 0x6A, 0xAA, 0x6A, 0xA5, 0xBE, 0xD0, 0x93, 0x05, 0x8A, 0x73, 0xF2, 0xF0, 0x61, 0x94,
|
||||
0x25, 0xF0, 0xA9, 0x12, 0x12, 0xD8, 0xFF, 0xB1, 0xF0, 0x06, 0xA5, 0x47, 0x69, 0x15, 0xCC, 0xE9,
|
||||
0x6B, 0x9D, 0x6E, 0xD9, 0x96, 0xA7, 0xEF, 0x9D, 0x75, 0x9A, 0xD0, 0xD7, 0x90, 0xFE, 0xAF, 0xEB,
|
||||
0xC1, 0xBA, 0x83, 0x48, 0x46, 0x54, 0x7C, 0x86, 0x4B, 0x45, 0x4B, 0xA6, 0xE4, 0x3A, 0x33, 0x52,
|
||||
0xFD, 0xAF, 0x45, 0x92, 0xF4, 0xB0, 0x88, 0x62, 0x28, 0x9D, 0x52, 0x14, 0xBE, 0x5F, 0xD8, 0xCB,
|
||||
0x32, 0x69, 0xC8, 0xB3, 0xB3, 0x27, 0xE4, 0xDC, 0x85, 0xCD, 0x3D, 0x84, 0x51, 0xC1, 0xB6, 0x1F,
|
||||
0x50, 0x9F, 0x80, 0x9B, 0xF2, 0xA8, 0xCE, 0x59, 0xAF, 0x25, 0xA7, 0x5A, 0xD6, 0x23, 0xDA, 0xFF,
|
||||
0xDC, 0x0A, 0xF1, 0xF8, 0x93, 0x1D, 0xE3, 0x00, 0x90, 0x64, 0x91, 0xCF, 0xEC, 0xDC, 0x40, 0xB8,
|
||||
0x64, 0x10, 0xBC, 0x1E, 0x07, 0xF6, 0x98, 0xC1, 0xDE, 0x1B, 0xF3, 0x7D, 0x3A, 0x63, 0x2D, 0x82,
|
||||
0xD0, 0x55, 0x0A, 0x45, 0x3F, 0x12, 0x9D, 0xF1, 0x97, 0x9E, 0x5C, 0xAD, 0x2F, 0x1E, 0x36, 0x13,
|
||||
0x56, 0xFC, 0xEF, 0xF5, 0x59, 0x9A, 0x2B, 0xE5, 0x99, 0xBB, 0x58, 0xD8, 0x18, 0xD4, 0xB0, 0x0C,
|
||||
0x6E, 0x84, 0x7A, 0x50, 0x4C, 0x37, 0x52, 0x32, 0x77, 0xE8, 0x4D, 0x4B, 0x98, 0x42, 0x74, 0x98,
|
||||
0x92, 0x42, 0xA9, 0x38, 0x78, 0xBE, 0x51, 0xC0, 0x87, 0x66, 0x5B, 0x20, 0x1C, 0xBC, 0xE6, 0x60,
|
||||
0xA4, 0x4F, 0x19, 0x13, 0x61, 0x5E, 0x85, 0x3B, 0xE4, 0xC6, 0x98, 0xCE, 0x13, 0x0A, 0xA1, 0x97,
|
||||
0xA8, 0x28, 0x6A, 0x8A, 0xFA, 0x9D, 0x55, 0xA6, 0x64, 0x23, 0x96, 0x1D, 0xB2, 0x2A, 0x51, 0x27,
|
||||
0xB6, 0x00, 0x83, 0x96, 0xF6, 0x05, 0x0F, 0x8F, 0xF4, 0x7D, 0x17, 0x20, 0x10, 0xB9, 0x7C, 0xA2,
|
||||
0x70, 0x81, 0x58, 0x15, 0x06, 0x49, 0xCA, 0xD1, 0x22, 0x21, 0xC4, 0x9E, 0x07, 0xD2, 0x1F, 0x34,
|
||||
0x57, 0x6F, 0xB5, 0xED, 0x81, 0x3D, 0x88, 0x5F, 0x8F, 0x9C, 0x0D, 0xEC, 0x65, 0xCC, 0x52, 0x7F,
|
||||
0x26, 0xCC, 0x3E, 0xB4, 0xEF, 0x7E, 0xD6, 0x6F, 0x18, 0xA8, 0xF7, 0xA0, 0xA8, 0x87, 0x78, 0x6A,
|
||||
0x4C, 0xFB, 0xEC, 0x5C, 0x4A, 0xE5, 0x2D, 0x99, 0xF2, 0x13, 0x0F, 0x6D, 0xA3, 0xD9, 0x0D, 0x40,
|
||||
0xFD, 0xF3, 0xC8, 0x5C, 0xE8, 0xCA, 0xF1, 0x10, 0xE7, 0x40, 0xAA, 0xE5, 0x26, 0x22, 0x6D, 0xF0,
|
||||
0xE9, 0x5B, 0xB0, 0x5F, 0x2F, 0x48, 0xD1, 0x74, 0x93, 0xC7, 0x62, 0x1E, 0x5D, 0xE8, 0x6B, 0xBA,
|
||||
0x3B, 0xC6, 0xB5, 0x0E, 0x7D, 0x5B, 0x0F, 0x1B, 0x4A, 0x9E, 0x28, 0xBC, 0x78, 0xDF, 0x8C, 0x61,
|
||||
0x3A, 0xCD, 0xB6, 0xEF, 0x9D, 0xAE, 0x35, 0x4F, 0xEB, 0x43, 0x9E, 0xCC, 0xA2, 0x1C, 0xAC, 0x40,
|
||||
0x94, 0xE8, 0x96, 0x97, 0x1C, 0x54, 0xBB, 0x59, 0x49, 0x01, 0x71, 0xA6, 0x95, 0xB2, 0x58, 0x2C,
|
||||
0xAD, 0x91, 0x01, 0x39, 0x53, 0x9B, 0xF4, 0x7F, 0xC3, 0x26, 0xFB, 0x95, 0x5D, 0x56, 0xB8, 0x98,
|
||||
0x30, 0x48, 0xC6, 0xE5, 0xC8, 0xBA, 0xE2, 0x88, 0x9C, 0x1F, 0x7B, 0x6F, 0xAD, 0x63, 0xB6, 0xAB,
|
||||
0x93, 0xB5, 0xEE, 0xBF, 0x42, 0xEC, 0x8F, 0xA6, 0x09, 0xC4, 0xB4, 0x6B, 0x5B, 0x16, 0x14, 0xCB,
|
||||
0xA4, 0xCC, 0x94, 0x62, 0xA7, 0x82, 0x6B, 0xED, 0xAC, 0x51, 0x23, 0x78, 0x8B, 0xF1, 0x48, 0xD6,
|
||||
0x12, 0x5F, 0xE7, 0x1D, 0x14, 0xD8, 0xF9, 0x42, 0xCA, 0xB9, 0x12, 0xFD, 0xDC, 0x29, 0xCB, 0x70,
|
||||
0xD8, 0x2B, 0x70, 0x75, 0xFC, 0x74, 0xAA, 0xA4, 0xEF, 0xFE, 0xD7, 0xF0, 0x29, 0xD5, 0xA8, 0xA7,
|
||||
0x9D, 0x9A, 0x88, 0x93, 0xE0, 0xFD, 0xC8, 0xD2, 0x4C, 0x81, 0x3D, 0x71, 0x25, 0x7A, 0x5C, 0xE8,
|
||||
0xC8, 0xBA, 0xBA, 0x15, 0x71, 0x1D, 0x77, 0x15, 0x3B, 0x34, 0x87, 0x61, 0xD1, 0xA5, 0xF4, 0x59,
|
||||
0x75, 0x18, 0x5D, 0x85, 0x4B, 0xE7, 0x15, 0x9B, 0xCE, 0xD0, 0x9C, 0x08, 0x90, 0x97, 0x55, 0x0B,
|
||||
0x06, 0x8E, 0xFA, 0x18, 0x99, 0xBC, 0xB1, 0x78, 0x80, 0xC7, 0x59, 0xEC, 0x43, 0x8C, 0x55, 0x32,
|
||||
0xCF, 0x2E, 0xDE, 0xC6, 0x23, 0xFA, 0xAE, 0xE5, 0xFC, 0x44, 0x78, 0x4A, 0xB9, 0xD2, 0xE5, 0xDC,
|
||||
0xE3, 0x47, 0x0D, 0xF2, 0x33, 0x77, 0xB3, 0xA7, 0x0A, 0x6B, 0xFC, 0xDA, 0xD3, 0x9B, 0x4A, 0x09,
|
||||
0x30, 0xC7, 0xE2, 0xB2, 0x9C, 0xE1, 0x46, 0xEA, 0xD7, 0xE5, 0x25, 0x1E, 0xA5, 0x08, 0xDD, 0x50,
|
||||
0xA3, 0x1F, 0x20, 0xCF, 0xF4, 0x85, 0x3F, 0xFD, 0x3C, 0xBC, 0xE5, 0xF3, 0x4A, 0xF9, 0xE8, 0x8C,
|
||||
0xF0, 0xAD, 0xCC, 0x27, 0x60, 0x29, 0xE2, 0xCD, 0x8C, 0xA0, 0x96, 0x0E, 0xD0, 0x2B, 0x9E, 0xB4,
|
||||
0x58, 0x11, 0x9C, 0x20, 0xC7, 0xB8, 0x3D, 0xB3, 0xA2, 0x85, 0x0F, 0x01, 0xBE, 0x19, 0x17, 0xC1,
|
||||
0x7E, 0x37, 0x75, 0xA1, 0xDB, 0x65, 0x85, 0x6F, 0xA0, 0x31, 0xE5, 0x11, 0x72, 0x1E, 0x91, 0x11,
|
||||
0x85, 0x88, 0xE1, 0x2F, 0xD6, 0xFC, 0xBA, 0x98, 0x13, 0x1E, 0xC5, 0xBF, 0xC1, 0xB6, 0xFA, 0xCC,
|
||||
0xBC, 0x73, 0x39, 0x2C, 0xC6, 0xFE, 0xF6, 0x4C, 0x70, 0xBC, 0xEA, 0x14, 0xEA, 0x61, 0x86, 0x93,
|
||||
0x38, 0x29, 0xFF, 0x1B, 0x83, 0x30, 0x0F, 0xEF, 0xE5, 0x58, 0xAF, 0x03, 0x72, 0x9F, 0xD3, 0x24,
|
||||
0xB3, 0x7E, 0x7F, 0x33, 0x76, 0x0E, 0x51, 0x5C, 0x41, 0x47, 0xBC, 0x30, 0x73, 0xF1, 0x64, 0xCA,
|
||||
0x87, 0x7F, 0xD0, 0xB7, 0x74, 0x03, 0x50, 0xA4, 0x0D, 0xBA, 0xB3, 0x24, 0x6F, 0x5E, 0x22, 0x89,
|
||||
0x6B, 0xD4, 0x07, 0xD3, 0x6B, 0x4D, 0x36, 0x5B, 0x8F, 0x85, 0xE6, 0xF3, 0x8A, 0x94, 0xDD, 0x60,
|
||||
0x70, 0x49, 0x14, 0x7F, 0x0A, 0xBC, 0x7B, 0xB2, 0xD0, 0x11, 0x87, 0x9E, 0xA2, 0x8D, 0xCF, 0x89,
|
||||
0x56, 0x34, 0x66, 0x71, 0x03, 0xB8, 0xF2, 0x93, 0xC3, 0x12, 0x10, 0x49, 0x29, 0x4B, 0x0A, 0xC8,
|
||||
0x88, 0x4C, 0x87, 0x0F, 0x84, 0x50, 0x74, 0x5B, 0x22, 0x78, 0xCF, 0xF7, 0xC8, 0xAB, 0x92, 0x4F,
|
||||
0x96, 0x54, 0x7B, 0xAB, 0xAE, 0xC2, 0x53, 0x8C, 0x5A, 0xF8, 0x0D, 0x8E, 0x8D, 0x25, 0x4A, 0xDA,
|
||||
0x94, 0xBE, 0x9A, 0x84, 0x56, 0x88, 0x08, 0x59, 0xA0, 0x44, 0x81, 0x48, 0x29, 0xF4, 0x38, 0x1B,
|
||||
0xD9, 0xBA, 0xB2, 0x1E, 0xA7, 0x9A, 0xA8, 0x06, 0x77, 0x76, 0x92, 0x7B, 0x25, 0x21, 0x4F, 0x41,
|
||||
0x3B, 0x2D, 0xE4, 0xD9, 0xC7, 0xE2, 0xE6, 0x43, 0x5A, 0x18, 0xA3, 0x92, 0xFE, 0xAB, 0x24, 0xC0,
|
||||
0x58, 0xC8, 0x02, 0xD8, 0xD1, 0x6C, 0xDD, 0xC9, 0x40, 0x1F, 0xD2, 0xF7, 0x90, 0xDB, 0x29, 0x22,
|
||||
0x26, 0x26, 0x83, 0xEA, 0xEB, 0xE2, 0x8A, 0x83, 0x56, 0x32, 0xDB, 0xE8, 0xF6, 0x06, 0x40, 0xE5,
|
||||
0x8B, 0xC4, 0xA8, 0xFC, 0x45, 0x2A, 0x22, 0xCF, 0xAB, 0xF6, 0x85, 0x73, 0x97, 0xC6, 0x91, 0xF1,
|
||||
0x2B, 0x31, 0xDC, 0x1C, 0xB2, 0x62, 0x9B, 0x6A, 0x02, 0xAC, 0x94, 0xDC, 0x5B, 0x39, 0xF0, 0xB6,
|
||||
0x57, 0xE8, 0x39, 0x9A, 0xA9, 0x87, 0x3F, 0x65, 0x5F, 0xD4, 0x49, 0x84, 0x91, 0x74, 0xEA, 0x7E,
|
||||
0xD2, 0x44, 0x74, 0x2A, 0xA7, 0x82, 0x28, 0x64, 0x85, 0x2E, 0x0D, 0xB1, 0x93, 0x51, 0x04, 0x0C,
|
||||
0x16, 0x3D, 0x42, 0xE2, 0x8F, 0xE9, 0x9F, 0x78, 0xD7, 0xD4, 0x18, 0xC2, 0x9F, 0x9C, 0x9A, 0x6B,
|
||||
0x03, 0x95, 0xF1, 0x23, 0xD1, 0x2B, 0x4C, 0x05, 0x1B, 0x8F, 0x21, 0x3B, 0x49, 0x91, 0xD6, 0xBB,
|
||||
0xE6, 0x7F, 0xF7, 0x41, 0x52, 0x67, 0x1E, 0x76, 0xDF, 0xF6, 0x8B, 0x7E, 0x84, 0xCD, 0x5A, 0x4F,
|
||||
0xB9, 0x7B, 0xEB, 0xBF, 0xFF, 0xC9, 0xC4, 0x69, 0x1D, 0x34, 0xDE, 0x2D, 0x33, 0xDE, 0x02, 0x4C,
|
||||
0x7F, 0x38, 0x7D, 0x84, 0xEF, 0x1E, 0x82, 0x6C, 0x28, 0x9E, 0x51, 0xB4, 0x94, 0x40, 0x1F, 0x93,
|
||||
0x20, 0x29, 0xE9, 0x6D, 0x61, 0x48, 0x19, 0x84, 0xC1, 0x70, 0xE5, 0xE1, 0x94, 0xAA, 0x43, 0x73,
|
||||
0xF6, 0x99, 0xC3, 0x1F, 0x5F, 0x52, 0xE6, 0x34, 0x70, 0x8C, 0x76, 0x26, 0xE7, 0xAA, 0x44, 0x26,
|
||||
0xB4, 0x00, 0x3F, 0x2D, 0xA0, 0x5B, 0xDE, 0xC6, 0x02, 0xE2, 0x5B, 0xF6, 0xDB, 0xB2, 0xA0, 0x76,
|
||||
0xFA, 0xA0, 0x95, 0x44, 0x11, 0xEE, 0x8D, 0x42, 0x16, 0x2E, 0x5E, 0xAC, 0xBB, 0xC5, 0x65, 0xE8,
|
||||
0x49, 0x29, 0xC1, 0x3B, 0x6A, 0x8D, 0x27, 0xEB, 0x25, 0x3B, 0x41, 0x19, 0x4A, 0xB3, 0x0A, 0x95,
|
||||
0x20, 0xEB, 0xA6, 0x0B, 0x20, 0xC3, 0xE1, 0xFC, 0x2A, 0x5C, 0xD6, 0xA2, 0x31, 0x70, 0xB0, 0xE6,
|
||||
0xEA, 0xC9, 0x11, 0xAB, 0xD2, 0x41, 0xF2, 0xB4, 0x13, 0xDC, 0x79, 0xAB, 0xA0, 0xF3, 0x3C, 0x13,
|
||||
0xC9, 0xE3, 0x19, 0xC0, 0x1F, 0x7A, 0x48, 0xEB, 0x06, 0x62, 0x4D, 0xEC, 0x67, 0x14, 0x60, 0x83,
|
||||
0xD6, 0xA8, 0xBF, 0xDF, 0x08, 0x21, 0xDF, 0x04, 0x94, 0x26, 0xC9, 0xDA, 0xD0, 0xA3, 0x04, 0xDC,
|
||||
0x03, 0x14, 0x90, 0x17, 0xB8, 0x5A, 0x4B, 0xF6, 0x75, 0x9B, 0xAB, 0xB3, 0xA5, 0xC3, 0xC9, 0xFE,
|
||||
0x75, 0xE1, 0x47, 0x59, 0xB5, 0xD4, 0x17, 0x94, 0xD5, 0xF4, 0x2A, 0x52, 0x7D, 0xCC, 0xC6, 0x4F,
|
||||
0x99, 0x14, 0x65, 0xDE, 0x5C, 0xD7, 0x32, 0xAB, 0x75, 0xA9, 0x6E, 0x82, 0xE3, 0xE7, 0xF4, 0xF3,
|
||||
0xC1, 0x4A, 0xE3, 0x19, 0x4F, 0xD2, 0xA7, 0xFE, 0xE5, 0x42, 0x6E, 0x38, 0xF4, 0x33, 0x6E, 0xF9,
|
||||
0x0C, 0x76, 0xF1, 0x89, 0x55, 0xAB, 0x08, 0x3D, 0xC5, 0x47, 0x4E, 0xB5, 0x2F, 0x00, 0x33, 0x84,
|
||||
0xCD, 0xCE, 0x24, 0xEA, 0xDB, 0x3D, 0x25, 0x9B, 0x24, 0xC1, 0xCA, 0xA3, 0xB6, 0x3A, 0x7D, 0xBF,
|
||||
0x8A, 0xB9, 0x60, 0xEF, 0xE6, 0x2B, 0x8C, 0x4A, 0xAC, 0x3F, 0xA4, 0x0D, 0x82, 0x8E, 0xD1, 0x70,
|
||||
0x67, 0x97, 0xA7, 0x17, 0xB9, 0x52, 0xB2, 0x5A, 0xE8, 0xEC, 0x8D, 0x94, 0xC5, 0x96, 0xFC, 0x9B,
|
||||
0xD3, 0x10, 0x7E, 0xD3, 0x06, 0xB4, 0xAA, 0xC7, 0x63, 0xA1, 0x56, 0x9F, 0x04, 0x7F, 0x96, 0xEE,
|
||||
0x39, 0xDC, 0x18, 0x60, 0x2F, 0x71, 0x2D, 0xEB, 0xF5, 0x1A, 0x4D, 0xFE, 0xB3, 0x49, 0x37, 0xFE,
|
||||
0xC5, 0x7F, 0x6C, 0xEE, 0x17, 0x48, 0xF5, 0xED, 0xA7, 0xB9, 0x95, 0x0B, 0x61, 0x2E, 0x2C, 0x87,
|
||||
0xA7, 0x5D, 0xA5, 0xAC, 0x89, 0xEC, 0x11, 0x0C, 0xD5, 0xCD, 0xE1, 0xB6, 0x9C, 0x4B, 0x8F, 0xCF,
|
||||
0x21, 0x75, 0xA1, 0x1B, 0x35, 0x41, 0x4D, 0x4E, 0x9B, 0xDE, 0xE2, 0xE8, 0x0E, 0x23, 0x9A, 0x9A,
|
||||
0x2B, 0xAC, 0x41, 0x6E, 0xEF, 0xD1, 0xAC, 0x7E, 0x74, 0xB7, 0x16, 0x83, 0x10, 0x85, 0x84, 0x60,
|
||||
0x28, 0xF0, 0xD1, 0xA0, 0x5E, 0xB7, 0x8E, 0xEF, 0x7B, 0x4C, 0x27, 0xAF, 0x8A, 0x9E, 0x3F, 0x29,
|
||||
0x1B, 0x12, 0x01, 0x07, 0xF1, 0xAA, 0xFE, 0x2E, 0xFF, 0x18, 0x9A, 0xCD, 0xF4, 0x0E, 0xC1, 0x74,
|
||||
0x6D, 0xD4, 0xCE, 0xF3, 0xF9, 0x3C, 0xE2, 0x12, 0x03, 0x07, 0x1B, 0x9D, 0x3D, 0x6E, 0xD9, 0x79,
|
||||
0xB3, 0x56, 0x14, 0xC5, 0xEA, 0x06, 0xD1, 0xAD, 0x2C, 0x07, 0x58, 0x90, 0x0E, 0x80, 0x6B, 0x60,
|
||||
0x43, 0x82, 0xAA, 0x0C, 0xEE, 0x1B
|
||||
};
|
||||
|
||||
public static byte[] Module_0DBBF209A27B1E279A9FEC5C168A15F7_Key =
|
||||
{
|
||||
0x5B, 0x27, 0x27, 0x01, 0x24, 0x56, 0xB4, 0xD4, 0x2D, 0xD0, 0x96, 0x77, 0x49, 0x51, 0xDC, 0x0A
|
||||
};
|
||||
}
|
||||
}
|
||||
+191
-77
@@ -27,6 +27,18 @@ namespace Game
|
||||
{
|
||||
public abstract class Warden
|
||||
{
|
||||
internal WorldSession _session;
|
||||
internal byte[] _inputKey = new byte[16];
|
||||
internal byte[] _outputKey = new byte[16];
|
||||
internal byte[] _seed = new byte[16];
|
||||
internal SARC4 _inputCrypto;
|
||||
internal SARC4 _outputCrypto;
|
||||
internal uint _checkTimer; // Timer for sending check requests
|
||||
internal uint _clientResponseTimer; // Timer for client response delay
|
||||
internal bool _dataSent;
|
||||
internal ClientWardenModule _module;
|
||||
internal bool _initialized;
|
||||
|
||||
protected Warden()
|
||||
{
|
||||
_inputCrypto = new SARC4();
|
||||
@@ -34,35 +46,40 @@ namespace Game
|
||||
_checkTimer = 10 * Time.InMilliseconds;
|
||||
}
|
||||
|
||||
public abstract void Init(WorldSession session, BigInteger k);
|
||||
public abstract ClientWardenModule GetModuleForClient();
|
||||
public abstract void InitializeModule();
|
||||
public abstract void RequestHash();
|
||||
public abstract void HandleHashResult(ByteBuffer buff);
|
||||
public abstract void RequestData();
|
||||
public abstract void HandleData(ByteBuffer buff);
|
||||
public void MakeModuleForClient()
|
||||
{
|
||||
Log.outDebug(LogFilter.Warden, "Make module for client");
|
||||
InitializeModuleForClient(out _module);
|
||||
|
||||
// md5 hash
|
||||
MD5 ctx = MD5.Create();
|
||||
ctx.Initialize();
|
||||
ctx.TransformBlock(_module.CompressedData, 0, _module.CompressedData.Length, _module.CompressedData, 0);
|
||||
ctx.TransformBlock(_module.Id, 0, _module.Id.Length, _module.Id, 0);
|
||||
}
|
||||
|
||||
public void SendModuleToClient()
|
||||
{
|
||||
Log.outDebug(LogFilter.Warden, "Send module to client");
|
||||
|
||||
// Create packet structure
|
||||
WardenModuleTransfer packet = new();
|
||||
|
||||
uint sizeLeft = _module.CompressedSize;
|
||||
int pos = 0;
|
||||
uint burstSize;
|
||||
while (sizeLeft > 0)
|
||||
{
|
||||
WardenModuleTransfer transfer = new();
|
||||
|
||||
burstSize = sizeLeft < 500 ? sizeLeft : 500u;
|
||||
transfer.Command = WardenOpcodes.Smsg_ModuleCache;
|
||||
transfer.DataSize = (ushort)burstSize;
|
||||
Buffer.BlockCopy(_module.CompressedData, pos, transfer.Data, 0, (int)burstSize);
|
||||
packet.Command = WardenOpcodes.SmsgModuleCache;
|
||||
packet.DataSize = (ushort)burstSize;
|
||||
Buffer.BlockCopy(_module.CompressedData, pos, packet.Data, 0, (int)burstSize);
|
||||
sizeLeft -= burstSize;
|
||||
pos += (int)burstSize;
|
||||
|
||||
Warden3DataServer packet = new();
|
||||
packet.Data = EncryptData(transfer.Write());
|
||||
_session.SendPacket(packet);
|
||||
Warden3DataServer pkt1 = new();
|
||||
pkt1.Data = EncryptData(packet);
|
||||
_session.SendPacket(pkt1);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -72,51 +89,45 @@ namespace Game
|
||||
|
||||
// Create packet structure
|
||||
WardenModuleUse request = new();
|
||||
request.Command = WardenOpcodes.Smsg_ModuleUse;
|
||||
request.Command = WardenOpcodes.SmsgModuleUse;
|
||||
|
||||
request.ModuleId = _module.Id;
|
||||
request.ModuleKey = _module.Key;
|
||||
request.Size = _module.CompressedSize;
|
||||
|
||||
Warden3DataServer packet = new();
|
||||
packet.Data = EncryptData(request.Write());
|
||||
packet.Data = EncryptData(request);
|
||||
_session.SendPacket(packet);
|
||||
}
|
||||
|
||||
public void Update()
|
||||
public void Update(uint diff)
|
||||
{
|
||||
if (_initialized)
|
||||
{
|
||||
uint currentTimestamp = GameTime.GetGameTimeMS();
|
||||
uint diff = currentTimestamp - _previousTimestamp;
|
||||
_previousTimestamp = currentTimestamp;
|
||||
if (!_initialized)
|
||||
return;
|
||||
|
||||
if (_dataSent)
|
||||
if (_dataSent)
|
||||
{
|
||||
uint maxClientResponseDelay = WorldConfig.GetUIntValue(WorldCfg.WardenClientResponseDelay);
|
||||
if (maxClientResponseDelay > 0)
|
||||
{
|
||||
uint maxClientResponseDelay = WorldConfig.GetUIntValue(WorldCfg.WardenClientResponseDelay);
|
||||
if (maxClientResponseDelay > 0)
|
||||
// Kick player if client response delays more than set in config
|
||||
if (_clientResponseTimer > maxClientResponseDelay * Time.InMilliseconds)
|
||||
{
|
||||
// Kick player if client response delays more than set in config
|
||||
if (_clientResponseTimer > maxClientResponseDelay * Time.InMilliseconds)
|
||||
{
|
||||
Log.outWarn(LogFilter.Warden, "{0} (latency: {1}, IP: {2}) exceeded Warden module response delay for more than {3} - disconnecting client",
|
||||
_session.GetPlayerInfo(), _session.GetLatency(), _session.GetRemoteAddress(), Time.secsToTimeString(maxClientResponseDelay, TimeFormat.ShortText));
|
||||
_session.KickPlayer("Warden::Update Warden module response delay exceeded");
|
||||
}
|
||||
else
|
||||
_clientResponseTimer += diff;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (diff >= _checkTimer)
|
||||
{
|
||||
RequestData();
|
||||
Log.outWarn(LogFilter.Warden, "{0} (latency: {1}, IP: {2}) exceeded Warden module response delay for more than {3} - disconnecting client",
|
||||
_session.GetPlayerInfo(), _session.GetLatency(), _session.GetRemoteAddress(), Time.secsToTimeString(maxClientResponseDelay, TimeFormat.ShortText));
|
||||
_session.KickPlayer("Warden::Update Warden module response delay exceeded");
|
||||
}
|
||||
else
|
||||
_checkTimer -= diff;
|
||||
_clientResponseTimer += diff;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (diff >= _checkTimer)
|
||||
RequestChecks();
|
||||
else
|
||||
_checkTimer -= diff;
|
||||
}
|
||||
}
|
||||
|
||||
public void DecryptData(byte[] buffer)
|
||||
@@ -158,7 +169,7 @@ namespace Game
|
||||
return checkSum;
|
||||
}
|
||||
|
||||
public string Penalty(WardenCheck check = null)
|
||||
public string ApplyPenalty(WardenCheck check = null)
|
||||
{
|
||||
WardenActions action;
|
||||
|
||||
@@ -169,51 +180,154 @@ namespace Game
|
||||
|
||||
switch (action)
|
||||
{
|
||||
case WardenActions.Log:
|
||||
return "None";
|
||||
case WardenActions.Kick:
|
||||
_session.KickPlayer("Warden::Penalty");
|
||||
return "Kick";
|
||||
case WardenActions.Ban:
|
||||
{
|
||||
string duration = WorldConfig.GetIntValue(WorldCfg.WardenClientBanDuration) + "s";
|
||||
string accountName;
|
||||
Global.AccountMgr.GetName(_session.GetAccountId(), out accountName);
|
||||
string banReason = "Warden Anticheat Violation";
|
||||
// Check can be NULL, for example if the client sent a wrong signature in the warden packet (CHECKSUM FAIL)
|
||||
if (check != null)
|
||||
banReason += ": " + check.Comment + " (CheckId: " + check.CheckId + ")";
|
||||
|
||||
Global.WorldMgr.BanAccount(BanMode.Account, accountName, duration, banReason, "Server");
|
||||
return "Ban";
|
||||
}
|
||||
default:
|
||||
break;
|
||||
case WardenActions.Ban:
|
||||
{
|
||||
Global.AccountMgr.GetName(_session.GetAccountId(), out string accountName);
|
||||
string banReason = "Warden Anticheat Violation";
|
||||
// Check can be NULL, for example if the client sent a wrong signature in the warden packet (CHECKSUM FAIL)
|
||||
if (check != null)
|
||||
banReason += ": " + check.Comment + " (CheckId: " + check.CheckId + ")";
|
||||
|
||||
Global.WorldMgr.BanAccount(BanMode.Account, accountName, WorldConfig.GetUIntValue(WorldCfg.WardenClientBanDuration), banReason, "Server");
|
||||
break;
|
||||
}
|
||||
case WardenActions.Log:
|
||||
default:
|
||||
return "None";
|
||||
}
|
||||
return "Undefined";
|
||||
|
||||
return action.ToString();
|
||||
}
|
||||
|
||||
internal WorldSession _session;
|
||||
internal byte[] _inputKey = new byte[16];
|
||||
internal byte[] _outputKey = new byte[16];
|
||||
internal byte[] _seed = new byte[16];
|
||||
internal SARC4 _inputCrypto;
|
||||
internal SARC4 _outputCrypto;
|
||||
internal uint _checkTimer; // Timer for sending check requests
|
||||
internal uint _clientResponseTimer; // Timer for client response delay
|
||||
internal bool _dataSent;
|
||||
internal uint _previousTimestamp;
|
||||
internal ClientWardenModule _module;
|
||||
internal bool _initialized;
|
||||
public void HandleData(ByteBuffer buff)
|
||||
{
|
||||
byte[] data = buff.GetData();
|
||||
DecryptData(data);
|
||||
var opcode = data[0];
|
||||
Log.outDebug(LogFilter.Warden, $"Got packet, opcode 0x{opcode:X}, size {data.Length - 1}");
|
||||
|
||||
switch ((WardenOpcodes)opcode)
|
||||
{
|
||||
case WardenOpcodes.CmsgModuleMissing:
|
||||
SendModuleToClient();
|
||||
break;
|
||||
case WardenOpcodes.CmsgModuleOk:
|
||||
RequestHash();
|
||||
break;
|
||||
case WardenOpcodes.CmsgCheatChecksResult:
|
||||
HandleCheckResult(buff);
|
||||
break;
|
||||
case WardenOpcodes.CmsgMemChecksResult:
|
||||
Log.outDebug(LogFilter.Warden, "NYI WARDEN_CMSG_MEM_CHECKS_RESULT received!");
|
||||
break;
|
||||
case WardenOpcodes.CmsgHashResult:
|
||||
HandleHashResult(buff);
|
||||
InitializeModule();
|
||||
break;
|
||||
case WardenOpcodes.CmsgModuleFailed:
|
||||
Log.outDebug(LogFilter.Warden, "NYI WARDEN_CMSG_MODULE_FAILED received!");
|
||||
break;
|
||||
default:
|
||||
Log.outWarn(LogFilter.Warden, $"Got unknown warden opcode 0x{opcode:X} of size {data.Length - 1}.");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
bool ProcessLuaCheckResponse(string msg)
|
||||
{
|
||||
string WARDEN_TOKEN = "_TW\t";
|
||||
if (!msg.StartsWith(WARDEN_TOKEN))
|
||||
return false;
|
||||
|
||||
ushort id = 0;
|
||||
ushort.Parse(msg.Substring(WARDEN_TOKEN.Length - 1, 10));
|
||||
if (id < Global.WardenCheckMgr.GetMaxValidCheckId())
|
||||
{
|
||||
WardenCheck check = Global.WardenCheckMgr.GetCheckData(id);
|
||||
if (check.Type == WardenCheckType.LuaEval)
|
||||
{
|
||||
string penalty1 = ApplyPenalty(check);
|
||||
Log.outWarn(LogFilter.Warden, $"{_session.GetPlayerInfo()} failed Warden check {id} ({check.Type}). Action: {penalty1}");
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
string penalty = ApplyPenalty(null);
|
||||
Log.outWarn(LogFilter.Warden, $"{_session.GetPlayerInfo()} sent bogus Lua check response for Warden. Action: {penalty}");
|
||||
return true;
|
||||
}
|
||||
|
||||
public abstract void Init(WorldSession session, BigInteger k);
|
||||
|
||||
public abstract void InitializeModule();
|
||||
|
||||
public abstract void RequestHash();
|
||||
|
||||
public abstract void HandleHashResult(ByteBuffer buff);
|
||||
|
||||
public abstract void HandleCheckResult(ByteBuffer buff);
|
||||
|
||||
public abstract void InitializeModuleForClient(out ClientWardenModule module);
|
||||
|
||||
public abstract void RequestChecks();
|
||||
}
|
||||
|
||||
class WardenModuleUse
|
||||
{
|
||||
public WardenOpcodes Command;
|
||||
public byte[] ModuleId = new byte[16];
|
||||
public byte[] ModuleKey = new byte[16];
|
||||
public uint Size;
|
||||
|
||||
public static implicit operator byte[](WardenModuleUse use)
|
||||
{
|
||||
ByteBuffer buffer = new ByteBuffer();
|
||||
buffer.WriteUInt8((byte)use.Command);
|
||||
buffer.WriteBytes(use.ModuleId, 16);
|
||||
buffer.WriteBytes(use.ModuleKey, 16);
|
||||
buffer.WriteUInt32(use.Size);
|
||||
return buffer.GetData();
|
||||
}
|
||||
}
|
||||
|
||||
class WardenModuleTransfer
|
||||
{
|
||||
public WardenOpcodes Command;
|
||||
public ushort DataSize;
|
||||
public byte[] Data = new byte[500];
|
||||
|
||||
public static implicit operator byte[](WardenModuleTransfer transfer)
|
||||
{
|
||||
ByteBuffer buffer = new ByteBuffer();
|
||||
buffer.WriteUInt8((byte)transfer.Command);
|
||||
buffer.WriteUInt16(transfer.DataSize);
|
||||
buffer.WriteBytes(transfer.Data, 500);
|
||||
return buffer.GetData();
|
||||
}
|
||||
}
|
||||
|
||||
class WardenHashRequest
|
||||
{
|
||||
public WardenOpcodes Command;
|
||||
public byte[] Seed = new byte[16];
|
||||
|
||||
public static implicit operator byte[](WardenHashRequest request)
|
||||
{
|
||||
ByteBuffer buffer = new ByteBuffer();
|
||||
buffer.WriteUInt8((byte)request.Command);
|
||||
buffer.WriteBytes(request.Seed);
|
||||
return buffer.GetData();
|
||||
}
|
||||
}
|
||||
|
||||
public class ClientWardenModule
|
||||
{
|
||||
public byte[] Id = new byte[16];
|
||||
public byte[] Key = new byte[16];
|
||||
public uint CompressedSize;
|
||||
public byte[] CompressedData;
|
||||
public uint CompressedSize;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -25,7 +25,17 @@ namespace Game
|
||||
{
|
||||
public class WardenCheckManager : Singleton<WardenCheckManager>
|
||||
{
|
||||
WardenCheckManager() { }
|
||||
static byte WARDEN_MAX_LUA_CHECK_LENGTH = 170;
|
||||
|
||||
List<WardenCheck> _checks = new();
|
||||
Dictionary<uint, byte[]> _checkResults = new();
|
||||
List<ushort>[] _pools = new List<ushort>[(int)WardenCheckCategory.Max];
|
||||
|
||||
WardenCheckManager()
|
||||
{
|
||||
for (var i = 0; i < (int)WardenCheckCategory.Max; ++i)
|
||||
_pools[i] = new();
|
||||
}
|
||||
|
||||
public void LoadWardenChecks()
|
||||
{
|
||||
@@ -38,7 +48,7 @@ namespace Game
|
||||
return;
|
||||
}
|
||||
|
||||
// 0 1 2 3 4 5 6 7
|
||||
// 0 1 2 3 4 5 6 7
|
||||
SQLResult result = DB.World.Query("SELECT id, type, data, result, address, length, str, comment FROM warden_checks ORDER BY id ASC");
|
||||
if (result.IsEmpty())
|
||||
{
|
||||
@@ -51,51 +61,62 @@ namespace Game
|
||||
{
|
||||
ushort id = result.Read<ushort>(0);
|
||||
WardenCheckType checkType = (WardenCheckType)result.Read<byte>(1);
|
||||
string data = result.Read<string>(2);
|
||||
string checkResult = result.Read<string>(3);
|
||||
uint address = result.Read<uint>(4);
|
||||
byte length = result.Read<byte>(5);
|
||||
string str = result.Read<string>(6);
|
||||
string comment = result.Read<string>(7);
|
||||
|
||||
WardenCheckCategory category = GetWardenCheckCategory(checkType);
|
||||
|
||||
if (category == WardenCheckCategory.Max)
|
||||
{
|
||||
Log.outError(LogFilter.Sql, $"Warden check with id {id} lists check type {checkType} in `warden_checks`, which is not supported. Skipped.");
|
||||
continue;
|
||||
}
|
||||
|
||||
if ((checkType == WardenCheckType.LuaEval) && (id > 9999))
|
||||
{
|
||||
Log.outError(LogFilter.Sql, $"Warden Lua check with id {id} found in `warden_checks`. Lua checks may have four-digit IDs at most. Skipped.");
|
||||
continue;
|
||||
}
|
||||
|
||||
WardenCheck wardenCheck = new();
|
||||
wardenCheck.Type = checkType;
|
||||
wardenCheck.CheckId = id;
|
||||
|
||||
// Initialize action with default action from config
|
||||
wardenCheck.Action = (WardenActions)WorldConfig.GetIntValue(WorldCfg.WardenClientFailAction);
|
||||
|
||||
if (checkType == WardenCheckType.PageA || checkType == WardenCheckType.PageB || checkType == WardenCheckType.Driver)
|
||||
wardenCheck.Data = new BigInteger(data.ToByteArray());
|
||||
wardenCheck.Data = result.Read<byte[]>(2);
|
||||
|
||||
if (checkType == WardenCheckType.Memory || checkType == WardenCheckType.Module)
|
||||
MemChecksIdPool.Add(id);
|
||||
else
|
||||
OtherChecksIdPool.Add(id);
|
||||
if (checkType == WardenCheckType.Mpq || checkType == WardenCheckType.Mem)
|
||||
_checkResults.Add(id, result.Read<byte[]>(3));
|
||||
|
||||
if (checkType == WardenCheckType.Memory || checkType == WardenCheckType.PageA || checkType == WardenCheckType.PageB || checkType == WardenCheckType.Proc)
|
||||
{
|
||||
wardenCheck.Address = address;
|
||||
wardenCheck.Length = length;
|
||||
}
|
||||
if (checkType == WardenCheckType.Mem || checkType == WardenCheckType.PageA || checkType == WardenCheckType.PageB || checkType == WardenCheckType.Proc)
|
||||
wardenCheck.Address = result.Read<uint>(4);
|
||||
|
||||
if (checkType == WardenCheckType.PageA || checkType == WardenCheckType.PageB || checkType == WardenCheckType.Proc)
|
||||
wardenCheck.Length = result.Read<byte>(5);
|
||||
|
||||
// PROC_CHECK support missing
|
||||
if (checkType == WardenCheckType.Memory || checkType == WardenCheckType.MPQ || checkType == WardenCheckType.LuaStr || checkType == WardenCheckType.Driver || checkType == WardenCheckType.Module)
|
||||
wardenCheck.Str = str;
|
||||
if (checkType == WardenCheckType.Mem || checkType == WardenCheckType.Mpq || checkType == WardenCheckType.LuaEval || checkType == WardenCheckType.Driver || checkType == WardenCheckType.Module)
|
||||
wardenCheck.Str = result.Read<string>(6);
|
||||
|
||||
CheckStore[id] = wardenCheck;
|
||||
wardenCheck.Comment = result.Read<string>(7);
|
||||
if (wardenCheck.Comment.IsEmpty())
|
||||
wardenCheck.Comment = "Undocumented Check";
|
||||
|
||||
if (checkType == WardenCheckType.MPQ || checkType == WardenCheckType.Memory)
|
||||
if (checkType == WardenCheckType.LuaEval)
|
||||
{
|
||||
BigInteger Result = new(checkResult.ToByteArray());
|
||||
CheckResultStore[id] = Result;
|
||||
if (wardenCheck.Str.Length > WARDEN_MAX_LUA_CHECK_LENGTH)
|
||||
{
|
||||
Log.outError(LogFilter.Sql, $"Found over-long Lua check for Warden check with id {id} in `warden_checks`. Max length is {WARDEN_MAX_LUA_CHECK_LENGTH}. Skipped.");
|
||||
continue;
|
||||
}
|
||||
|
||||
string str = $"{id:U4}";
|
||||
Cypher.Assert(str.Length == 4);
|
||||
wardenCheck.IdStr = str.ToCharArray();
|
||||
}
|
||||
|
||||
if (comment.IsEmpty())
|
||||
wardenCheck.Comment = "Undocumented Check";
|
||||
else
|
||||
wardenCheck.Comment = comment;
|
||||
// initialize action with default action from config, this may be overridden later
|
||||
wardenCheck.Action = (WardenActions)WorldConfig.GetIntValue(WorldCfg.WardenClientFailAction);
|
||||
|
||||
_pools[(int)category].Add(id);
|
||||
++count;
|
||||
}
|
||||
while (result.NextRow());
|
||||
@@ -114,7 +135,7 @@ namespace Game
|
||||
return;
|
||||
}
|
||||
|
||||
// 0 1
|
||||
// 0 1
|
||||
SQLResult result = DB.Characters.Query("SELECT wardenId, action FROM warden_action");
|
||||
if (result.IsEmpty())
|
||||
{
|
||||
@@ -130,13 +151,13 @@ namespace Game
|
||||
|
||||
// Check if action value is in range (0-2, see WardenActions enum)
|
||||
if (action > WardenActions.Ban)
|
||||
Log.outError(LogFilter.Warden, "Warden check override action out of range (ID: {0}, action: {1})", checkId, action);
|
||||
Log.outError(LogFilter.Warden, $"Warden check override action out of range (ID: {checkId}, action: {action})");
|
||||
// Check if check actually exists before accessing the CheckStore vector
|
||||
else if (checkId >= CheckStore.Count)
|
||||
Log.outError(LogFilter.Warden, "Warden check action override for non-existing check (ID: {0}, action: {1}), skipped", checkId, action);
|
||||
else if (checkId >= _checks.Count)
|
||||
Log.outError(LogFilter.Warden, $"Warden check action override for non-existing check (ID: {checkId}, action: {action}), skipped");
|
||||
else
|
||||
{
|
||||
CheckStore[checkId].Action = action;
|
||||
_checks[checkId].Action = action;
|
||||
++count;
|
||||
}
|
||||
}
|
||||
@@ -145,23 +166,52 @@ namespace Game
|
||||
Log.outInfo(LogFilter.ServerLoading, $"Loaded {count} warden action overrides in {Time.GetMSTimeDiffToNow(oldMSTime)} ms");
|
||||
}
|
||||
|
||||
public WardenCheck GetWardenDataById(ushort Id)
|
||||
public WardenCheck GetCheckData(ushort Id)
|
||||
{
|
||||
if (Id < CheckStore.Count)
|
||||
return CheckStore[Id];
|
||||
if (Id < _checks.Count)
|
||||
return _checks[Id];
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public BigInteger GetWardenResultById(ushort Id)
|
||||
public byte[] GetCheckResult(ushort Id)
|
||||
{
|
||||
return CheckResultStore.LookupByKey(Id);
|
||||
return _checkResults.LookupByKey(Id);
|
||||
}
|
||||
|
||||
public List<ushort> MemChecksIdPool = new();
|
||||
public List<ushort> OtherChecksIdPool = new();
|
||||
List<WardenCheck> CheckStore = new();
|
||||
Dictionary<uint, BigInteger> CheckResultStore = new();
|
||||
public ushort GetMaxValidCheckId() { return (ushort)_checks.Count; }
|
||||
|
||||
public List<ushort> GetAvailableChecks(WardenCheckCategory category) { return _pools[(int)category]; }
|
||||
|
||||
public static WardenCheckCategory GetWardenCheckCategory(WardenCheckType type) => type switch
|
||||
{
|
||||
WardenCheckType.Timing => WardenCheckCategory.Max,
|
||||
WardenCheckType.Driver => WardenCheckCategory.Inject,
|
||||
WardenCheckType.Proc => WardenCheckCategory.Max,
|
||||
WardenCheckType.LuaEval => WardenCheckCategory.Lua,
|
||||
WardenCheckType.Mpq => WardenCheckCategory.Modded,
|
||||
WardenCheckType.PageA => WardenCheckCategory.Inject,
|
||||
WardenCheckType.PageB => WardenCheckCategory.Inject,
|
||||
WardenCheckType.Module => WardenCheckCategory.Inject,
|
||||
WardenCheckType.Mem => WardenCheckCategory.Modded,
|
||||
_ => WardenCheckCategory.Max,
|
||||
};
|
||||
|
||||
public static WorldCfg GetWardenCategoryCountConfig(WardenCheckCategory category) => category switch
|
||||
{
|
||||
WardenCheckCategory.Inject => WorldCfg.WardenNumInjectChecks,
|
||||
WardenCheckCategory.Lua => WorldCfg.WardenNumLuaChecks,
|
||||
WardenCheckCategory.Modded => WorldCfg.WardenNumClientModChecks,
|
||||
_ => WorldCfg.Max,
|
||||
};
|
||||
|
||||
public static bool IsWardenCategoryInWorldOnly(WardenCheckCategory category) => category switch
|
||||
{
|
||||
WardenCheckCategory.Inject => false,
|
||||
WardenCheckCategory.Lua => true,
|
||||
WardenCheckCategory.Modded => false,
|
||||
_ => false,
|
||||
};
|
||||
}
|
||||
|
||||
public enum WardenActions
|
||||
@@ -171,28 +221,39 @@ namespace Game
|
||||
Ban
|
||||
}
|
||||
|
||||
public enum WardenCheckCategory
|
||||
{
|
||||
Inject = 0, // checks that test whether the client's execution has been interfered with
|
||||
Lua, // checks that test whether the lua sandbox has been modified
|
||||
Modded, // checks that test whether the client has been modified
|
||||
|
||||
Max // SKIP
|
||||
}
|
||||
|
||||
public enum WardenCheckType
|
||||
{
|
||||
Memory = 0xF3, // 243: byte moduleNameIndex + uint Offset + byte Len (check to ensure memory isn't modified)
|
||||
PageA = 0xB2, // 178: uint Seed + byte[20] SHA1 + uint Addr + byte Len (scans all pages for specified hash)
|
||||
PageB = 0xBF, // 191: uint Seed + byte[20] SHA1 + uint Addr + byte Len (scans only pages starts with MZ+PE headers for specified hash)
|
||||
MPQ = 0x98, // 152: byte fileNameIndex (check to ensure MPQ file isn't modified)
|
||||
LuaStr = 0x8B, // 139: byte luaNameIndex (check to ensure LUA string isn't used)
|
||||
Driver = 0x71, // 113: uint Seed + byte[20] SHA1 + byte driverNameIndex (check to ensure driver isn't loaded)
|
||||
Timing = 0x57, // 87: empty (check to ensure GetTickCount() isn't detoured)
|
||||
Proc = 0x7E, // 126: uint Seed + byte[20] SHA1 + byte moluleNameIndex + byte procNameIndex + uint Offset + byte Len (check to ensure proc isn't detoured)
|
||||
Module = 0xD9 // 217: uint Seed + byte[20] SHA1 (check to ensure module isn't injected)
|
||||
None = 0,
|
||||
Timing = 87, // nyi
|
||||
Driver = 113, // uint Seed + byte[20] SHA1 + byte driverNameIndex (check to ensure driver isn't loaded)
|
||||
Proc = 126, // nyi
|
||||
LuaEval = 139, // evaluate arbitrary Lua check
|
||||
Mpq = 152, // get hash of MPQ file (to check it is not modified)
|
||||
PageA = 178, // scans all pages for specified SHA1 hash
|
||||
PageB = 191, // scans only pages starts with MZ+PE headers for specified hash
|
||||
Module = 217, // check to make sure module isn't injected
|
||||
Mem = 243, // retrieve specific memory
|
||||
}
|
||||
|
||||
public class WardenCheck
|
||||
{
|
||||
public ushort CheckId;
|
||||
public WardenCheckType Type;
|
||||
public BigInteger Data;
|
||||
public byte[] Data;
|
||||
public uint Address; // PROC_CHECK, MEM_CHECK, PAGE_CHECK
|
||||
public byte Length; // PROC_CHECK, MEM_CHECK, PAGE_CHECK
|
||||
public string Str; // LUA, MPQ, DRIVER
|
||||
public string Comment;
|
||||
public ushort CheckId;
|
||||
public char[] IdStr = new char[4]; // LUA
|
||||
public WardenActions Action;
|
||||
}
|
||||
}
|
||||
|
||||
+312
-203
@@ -28,11 +28,28 @@ namespace Game
|
||||
{
|
||||
class WardenWin : Warden
|
||||
{
|
||||
// GUILD is the shortest string that has no client validation (RAID only sends if in a raid group)
|
||||
static string _luaEvalPrefix = "local S,T,R=SendAddonMessage,function()";
|
||||
static string _luaEvalMidfix = " end R=S and T()if R then S('_TW',";
|
||||
static string _luaEvalPostfix = ",'GUILD')end";
|
||||
|
||||
uint _serverTicks;
|
||||
CategoryCheck[] _checks = new CategoryCheck[(int)WardenCheckCategory.Max];
|
||||
List<ushort> _currentChecks = new();
|
||||
|
||||
public WardenWin()
|
||||
{
|
||||
foreach (WardenCheckCategory category in Enum.GetValues<WardenCheckCategory>())
|
||||
{
|
||||
_checks[(int)category] = new CategoryCheck(Global.WardenCheckMgr.GetAvailableChecks(category).Shuffle().ToList());
|
||||
}
|
||||
}
|
||||
|
||||
public override void Init(WorldSession session, BigInteger k)
|
||||
{
|
||||
_session = session;
|
||||
// Generate Warden Key
|
||||
SHA1Randx WK = new(k.ToByteArray());
|
||||
SessionKeyGenerator WK = new(k.ToByteArray());
|
||||
WK.Generate(_inputKey, 16);
|
||||
WK.Generate(_outputKey, 16);
|
||||
|
||||
@@ -46,31 +63,20 @@ namespace Game
|
||||
Log.outDebug(LogFilter.Warden, " Seed: {0}", _seed.ToHexString());
|
||||
Log.outDebug(LogFilter.Warden, "Loading Module...");
|
||||
|
||||
_module = GetModuleForClient();
|
||||
MakeModuleForClient();
|
||||
|
||||
Log.outDebug(LogFilter.Warden, "Module Key: {0}", _module.Key.ToHexString());
|
||||
Log.outDebug(LogFilter.Warden, "Module ID: {0}", _module.Id.ToHexString());
|
||||
RequestModule();
|
||||
}
|
||||
|
||||
public override ClientWardenModule GetModuleForClient()
|
||||
public override void InitializeModuleForClient(out ClientWardenModule module)
|
||||
{
|
||||
ClientWardenModule mod = new();
|
||||
|
||||
uint length = (uint)WardenModuleWin.Module.Length;
|
||||
|
||||
// data assign
|
||||
mod.CompressedSize = length;
|
||||
mod.CompressedData = WardenModuleWin.Module;
|
||||
mod.Key = WardenModuleWin.ModuleKey;
|
||||
|
||||
// md5 hash
|
||||
System.Security.Cryptography.MD5 ctx = System.Security.Cryptography.MD5.Create();
|
||||
ctx.Initialize();
|
||||
ctx.TransformBlock(mod.CompressedData, 0, mod.CompressedData.Length, mod.CompressedData, 0);
|
||||
ctx.TransformBlock(mod.Id, 0, mod.Id.Length, mod.Id, 0);
|
||||
|
||||
return mod;
|
||||
module = new();
|
||||
module.CompressedData = WardenModuleWin.Module;
|
||||
module.CompressedSize = (uint)WardenModuleWin.Module.Length;
|
||||
module.Key = WardenModuleWin.ModuleKey;
|
||||
}
|
||||
|
||||
public override void InitializeModule()
|
||||
@@ -79,7 +85,7 @@ namespace Game
|
||||
|
||||
// Create packet structure
|
||||
WardenInitModuleRequest Request = new();
|
||||
Request.Command1 = WardenOpcodes.Smsg_ModuleInitialize;
|
||||
Request.Command1 = WardenOpcodes.SmsgModuleInitialize;
|
||||
Request.Size1 = 20;
|
||||
Request.Unk1 = 1;
|
||||
Request.Unk2 = 0;
|
||||
@@ -91,7 +97,7 @@ namespace Game
|
||||
Request.Function1[3] = 0x00022910; // 0x00400000 + 0x00022910 SFileCloseFile
|
||||
Request.CheckSumm1 = BuildChecksum(BitConverter.GetBytes(Request.Unk1), 20);
|
||||
|
||||
Request.Command2 = WardenOpcodes.Smsg_ModuleInitialize;
|
||||
Request.Command2 = WardenOpcodes.SmsgModuleInitialize;
|
||||
Request.Size2 = 8;
|
||||
Request.Unk3 = 4;
|
||||
Request.Unk4 = 0;
|
||||
@@ -100,7 +106,7 @@ namespace Game
|
||||
Request.Function2_set = 1;
|
||||
Request.CheckSumm2 = BuildChecksum(BitConverter.GetBytes(Request.Unk2), 8);
|
||||
|
||||
Request.Command3 = WardenOpcodes.Smsg_ModuleInitialize;
|
||||
Request.Command3 = WardenOpcodes.SmsgModuleInitialize;
|
||||
Request.Size3 = 8;
|
||||
Request.Unk5 = 1;
|
||||
Request.Unk6 = 1;
|
||||
@@ -110,7 +116,7 @@ namespace Game
|
||||
Request.CheckSumm3 = BuildChecksum(BitConverter.GetBytes(Request.Unk5), 8);
|
||||
|
||||
Warden3DataServer packet = new();
|
||||
packet.Data = EncryptData(Request.Write());
|
||||
packet.Data = EncryptData(Request);
|
||||
_session.SendPacket(packet);
|
||||
}
|
||||
|
||||
@@ -120,11 +126,11 @@ namespace Game
|
||||
|
||||
// Create packet structure
|
||||
WardenHashRequest Request = new();
|
||||
Request.Command = WardenOpcodes.Smsg_HashRequest;
|
||||
Request.Command = WardenOpcodes.SmsgHashRequest;
|
||||
Request.Seed = _seed;
|
||||
|
||||
Warden3DataServer packet = new();
|
||||
packet.Data = EncryptData(Request.Write());
|
||||
packet.Data = EncryptData(Request);
|
||||
_session.SendPacket(packet);
|
||||
}
|
||||
|
||||
@@ -133,7 +139,8 @@ namespace Game
|
||||
// Verify key
|
||||
if (buff.ReadBytes(20) != WardenModuleWin.ClientKeySeedHash)
|
||||
{
|
||||
Log.outWarn(LogFilter.Warden, "{0} failed hash reply. Action: {0}", _session.GetPlayerInfo(), Penalty());
|
||||
string penalty = ApplyPenalty();
|
||||
Log.outWarn(LogFilter.Warden, "{0} failed hash reply. Action: {0}", _session.GetPlayerInfo(), penalty);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -147,126 +154,151 @@ namespace Game
|
||||
_outputCrypto.PrepareKey(_outputKey);
|
||||
|
||||
_initialized = true;
|
||||
|
||||
_previousTimestamp = GameTime.GetGameTimeMS();
|
||||
}
|
||||
|
||||
public override void RequestData()
|
||||
static byte GetCheckPacketBaseSize(WardenCheckType type) => type switch
|
||||
{
|
||||
Log.outDebug(LogFilter.Warden, "Request data");
|
||||
WardenCheckType.Driver => 1,
|
||||
WardenCheckType.LuaEval => (byte)(1 + _luaEvalPrefix.Length - 1 + _luaEvalMidfix.Length - 1 + 4 + _luaEvalPostfix.Length - 1),
|
||||
WardenCheckType.Mpq => 1,
|
||||
WardenCheckType.PageA => 4 + 1,
|
||||
WardenCheckType.PageB => 4 + 1,
|
||||
WardenCheckType.Module => 4 + 20,
|
||||
WardenCheckType.Mem => 1 + 4 + 1,
|
||||
_ => 0,
|
||||
};
|
||||
|
||||
// If all checks were done, fill the todo list again
|
||||
if (_memChecksTodo.Empty())
|
||||
_memChecksTodo.AddRange(Global.WardenCheckMgr.MemChecksIdPool);
|
||||
static ushort GetCheckPacketSize(WardenCheck check)
|
||||
{
|
||||
int size = 1 + GetCheckPacketBaseSize(check.Type); // 1 byte check type
|
||||
if (!check.Str.IsEmpty())
|
||||
size += (check.Str.Length + 1); // 1 byte string length
|
||||
if (!check.Data.Empty())
|
||||
size += check.Data.Length;
|
||||
|
||||
if (_otherChecksTodo.Empty())
|
||||
_otherChecksTodo.AddRange(Global.WardenCheckMgr.OtherChecksIdPool);
|
||||
return (ushort)size;
|
||||
}
|
||||
|
||||
public override void RequestChecks()
|
||||
{
|
||||
Log.outDebug(LogFilter.Warden, $"Request data from {_session.GetPlayerName()} (account {_session.GetAccountId()}) - loaded: {_session.GetPlayer() && !_session.PlayerLoading()}");
|
||||
|
||||
// If all checks for a category are done, fill its todo list again
|
||||
foreach (WardenCheckCategory category in Enum.GetValues<WardenCheckCategory>())
|
||||
{
|
||||
var checks = _checks[(int)category];
|
||||
if (checks.IsAtEnd() && !checks.Empty())
|
||||
{
|
||||
Log.outDebug(LogFilter.Warden, $"Finished all {category} checks, re-shuffling");
|
||||
checks.Shuffle();
|
||||
}
|
||||
}
|
||||
|
||||
_serverTicks = GameTime.GetGameTimeMS();
|
||||
|
||||
ushort id;
|
||||
WardenCheckType type;
|
||||
WardenCheck wd;
|
||||
_currentChecks.Clear();
|
||||
|
||||
// Build check request
|
||||
for (uint i = 0; i < WorldConfig.GetUIntValue(WorldCfg.WardenNumMemChecks); ++i)
|
||||
ByteBuffer buff = new();
|
||||
buff.WriteUInt8((byte)WardenOpcodes.SmsgCheatChecksRequest);
|
||||
|
||||
foreach (var category in Enum.GetValues<WardenCheckCategory>())
|
||||
{
|
||||
// If todo list is done break loop (will be filled on next Update() run)
|
||||
if (_memChecksTodo.Empty())
|
||||
break;
|
||||
if (WardenCheckManager.IsWardenCategoryInWorldOnly(category) && !_session.GetPlayer())
|
||||
continue;
|
||||
|
||||
// Get check id from the end and remove it from todo
|
||||
id = _memChecksTodo.Last();
|
||||
_memChecksTodo.Remove(id);
|
||||
var checks = _checks[(int)category];
|
||||
for (uint i = 0, n = WorldConfig.GetUIntValue(WardenCheckManager.GetWardenCategoryCountConfig(category)); i < n; ++i)
|
||||
{
|
||||
if (checks.IsAtEnd()) // all checks were already sent, list will be re-filled on next Update() run
|
||||
break;
|
||||
|
||||
// Add the id to the list sent in this cycle
|
||||
_currentChecks.Add(id);
|
||||
_currentChecks.Add(checks.currentIndex++);
|
||||
}
|
||||
}
|
||||
|
||||
ByteBuffer buffer = new();
|
||||
buffer.WriteUInt8((byte)WardenOpcodes.Smsg_CheatChecksRequest);
|
||||
_currentChecks = _currentChecks.Shuffle().ToList();
|
||||
|
||||
for (uint i = 0; i < WorldConfig.GetUIntValue(WorldCfg.WardenNumOtherChecks); ++i)
|
||||
ushort expectedSize = 4;
|
||||
_currentChecks.RemoveAll(id =>
|
||||
{
|
||||
// If todo list is done break loop (will be filled on next Update() run)
|
||||
if (_otherChecksTodo.Empty())
|
||||
break;
|
||||
ushort thisSize = GetCheckPacketSize(Global.WardenCheckMgr.GetCheckData(id));
|
||||
if ((expectedSize + thisSize) > 450) // warden packets are truncated to 512 bytes clientside
|
||||
return true;
|
||||
expectedSize += thisSize;
|
||||
return false;
|
||||
});
|
||||
|
||||
// Get check id from the end and remove it from todo
|
||||
id = _otherChecksTodo.Last();
|
||||
_otherChecksTodo.Remove(id);
|
||||
|
||||
// Add the id to the list sent in this cycle
|
||||
_currentChecks.Add(id);
|
||||
|
||||
wd = Global.WardenCheckMgr.GetWardenDataById(id);
|
||||
|
||||
switch (wd.Type)
|
||||
foreach (var id in _currentChecks)
|
||||
{
|
||||
WardenCheck check = Global.WardenCheckMgr.GetCheckData(id);
|
||||
if (check.Type == WardenCheckType.LuaEval)
|
||||
{
|
||||
case WardenCheckType.MPQ:
|
||||
case WardenCheckType.LuaStr:
|
||||
case WardenCheckType.Driver:
|
||||
buffer.WriteUInt8((byte)wd.Str.GetByteCount());
|
||||
buffer.WriteString(wd.Str);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
buff.WriteUInt8((byte)(_luaEvalPrefix.Length - 1 + check.Str.Length + _luaEvalMidfix.Length - 1 + check.IdStr.Length + _luaEvalPostfix.Length - 1));
|
||||
buff.WriteString(_luaEvalPrefix);
|
||||
buff.WriteString(check.Str);
|
||||
buff.WriteString(_luaEvalMidfix);
|
||||
buff.WriteString(check.IdStr.ToString());
|
||||
buff.WriteString(_luaEvalPostfix);
|
||||
}
|
||||
else if (!check.Str.IsEmpty())
|
||||
{
|
||||
buff.WriteUInt8((byte)check.Str.GetByteCount());
|
||||
buff.WriteString(check.Str);
|
||||
}
|
||||
}
|
||||
|
||||
byte xorByte = _inputKey[0];
|
||||
|
||||
// Add TIMING_CHECK
|
||||
buffer.WriteUInt8(0x00);
|
||||
buffer.WriteUInt8((byte)((int)WardenCheckType.Timing ^ xorByte));
|
||||
buff.WriteUInt8(0x00);
|
||||
buff.WriteUInt8((byte)((int)WardenCheckType.Timing ^ xorByte));
|
||||
|
||||
byte index = 1;
|
||||
|
||||
foreach (var checkId in _currentChecks)
|
||||
{
|
||||
wd = Global.WardenCheckMgr.GetWardenDataById(checkId);
|
||||
WardenCheck check = Global.WardenCheckMgr.GetCheckData(checkId);
|
||||
|
||||
type = wd.Type;
|
||||
buffer.WriteUInt8((byte)((int)type ^ xorByte));
|
||||
var type = check.Type;
|
||||
buff.WriteUInt8((byte)((int)type ^ xorByte));
|
||||
switch (type)
|
||||
{
|
||||
case WardenCheckType.Memory:
|
||||
{
|
||||
buffer.WriteUInt8(0x00);
|
||||
buffer.WriteUInt32(wd.Address);
|
||||
buffer.WriteUInt8(wd.Length);
|
||||
break;
|
||||
}
|
||||
case WardenCheckType.Mem:
|
||||
{
|
||||
buff.WriteUInt8(0x00);
|
||||
buff.WriteUInt32(check.Address);
|
||||
buff.WriteUInt8(check.Length);
|
||||
break;
|
||||
}
|
||||
case WardenCheckType.PageA:
|
||||
case WardenCheckType.PageB:
|
||||
{
|
||||
buffer.WriteBytes(wd.Data.ToByteArray());
|
||||
buffer.WriteUInt32(wd.Address);
|
||||
buffer.WriteUInt8(wd.Length);
|
||||
break;
|
||||
}
|
||||
case WardenCheckType.MPQ:
|
||||
case WardenCheckType.LuaStr:
|
||||
{
|
||||
buffer.WriteUInt8(index++);
|
||||
break;
|
||||
}
|
||||
{
|
||||
buff.WriteBytes(check.Data);
|
||||
buff.WriteUInt32(check.Address);
|
||||
buff.WriteUInt8(check.Length);
|
||||
break;
|
||||
}
|
||||
case WardenCheckType.Mpq:
|
||||
case WardenCheckType.LuaEval:
|
||||
{
|
||||
buff.WriteUInt8(index++);
|
||||
break;
|
||||
}
|
||||
case WardenCheckType.Driver:
|
||||
{
|
||||
buffer.WriteBytes(wd.Data.ToByteArray());
|
||||
buffer.WriteUInt8(index++);
|
||||
break;
|
||||
}
|
||||
{
|
||||
buff.WriteBytes(check.Data);
|
||||
buff.WriteUInt8(index++);
|
||||
break;
|
||||
}
|
||||
case WardenCheckType.Module:
|
||||
{
|
||||
uint seed = RandomHelper.Rand32();
|
||||
buffer.WriteUInt32(seed);
|
||||
HmacHash hmac = new(BitConverter.GetBytes(seed));
|
||||
hmac.Finish(wd.Str);
|
||||
buffer.WriteBytes(hmac.Digest);
|
||||
break;
|
||||
}
|
||||
{
|
||||
uint seed = RandomHelper.Rand32();
|
||||
buff.WriteUInt32(seed);
|
||||
HmacHash hmac = new(BitConverter.GetBytes(seed));
|
||||
hmac.Finish(check.Str);
|
||||
buff.WriteBytes(hmac.Digest);
|
||||
break;
|
||||
}
|
||||
/*case PROC_CHECK:
|
||||
{
|
||||
buff.append(wd.i.AsByteArray(0, false).get(), wd.i.GetNumBytes());
|
||||
@@ -280,22 +312,31 @@ namespace Game
|
||||
break; // Should never happen
|
||||
}
|
||||
}
|
||||
buffer.WriteUInt8(xorByte);
|
||||
buff.WriteUInt8(xorByte);
|
||||
|
||||
string idstring = "";
|
||||
foreach (var id in _currentChecks)
|
||||
idstring += $"{id} ";
|
||||
|
||||
if (buff.GetSize() == expectedSize)
|
||||
{
|
||||
Log.outDebug(LogFilter.Warden, $"Finished building warden packet, size is {buff.GetSize()} bytes");
|
||||
Log.outDebug(LogFilter.Warden, $"Sent checks: {idstring}");
|
||||
}
|
||||
else
|
||||
{
|
||||
Log.outWarn(LogFilter.Warden, $"Finished building warden packet, size is {buff.GetSize()} bytes, but expected {expectedSize} bytes!");
|
||||
Log.outWarn(LogFilter.Warden, $"Sent checks: {idstring}");
|
||||
}
|
||||
|
||||
Warden3DataServer packet = new();
|
||||
packet.Data = EncryptData(buffer.GetData());
|
||||
packet.Data = EncryptData(buff.GetData());
|
||||
_session.SendPacket(packet);
|
||||
|
||||
_dataSent = true;
|
||||
|
||||
string stream = "Sent check id's: ";
|
||||
foreach (var checkId in _currentChecks)
|
||||
stream += checkId + " ";
|
||||
|
||||
Log.outDebug(LogFilter.Warden, stream);
|
||||
}
|
||||
|
||||
public override void HandleData(ByteBuffer buff)
|
||||
public override void HandleCheckResult(ByteBuffer buff)
|
||||
{
|
||||
Log.outDebug(LogFilter.Warden, "Handle data");
|
||||
|
||||
@@ -307,7 +348,8 @@ namespace Game
|
||||
|
||||
if (!IsValidCheckSum(Checksum, buff.GetData(), Length))
|
||||
{
|
||||
Log.outWarn(LogFilter.Warden, "{0} failed checksum. Action: {1}", _session.GetPlayerInfo(), Penalty());
|
||||
string penalty = ApplyPenalty();
|
||||
Log.outWarn(LogFilter.Warden, "{0} failed checksum. Action: {1}", _session.GetPlayerInfo(), penalty);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -317,7 +359,8 @@ namespace Game
|
||||
// @todo test it.
|
||||
if (result == 0x00)
|
||||
{
|
||||
Log.outWarn(LogFilter.Warden, "{0} failed timing check. Action: {1}", _session.GetPlayerInfo(), Penalty());
|
||||
string penalty = ApplyPenalty();
|
||||
Log.outWarn(LogFilter.Warden, "{0} failed timing check. Action: {1}", _session.GetPlayerInfo(), penalty);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -339,98 +382,76 @@ namespace Game
|
||||
|
||||
foreach (var id in _currentChecks)
|
||||
{
|
||||
rd = Global.WardenCheckMgr.GetWardenDataById(id);
|
||||
rs = Global.WardenCheckMgr.GetWardenResultById(id);
|
||||
WardenCheck check = Global.WardenCheckMgr.GetCheckData(id);
|
||||
|
||||
type = rd.Type;
|
||||
switch (type)
|
||||
switch (check.Type)
|
||||
{
|
||||
case WardenCheckType.Memory:
|
||||
case WardenCheckType.Mem:
|
||||
{
|
||||
byte result = buff.ReadUInt8();
|
||||
if (result != 0)
|
||||
{
|
||||
byte Mem_Result = buff.ReadUInt8();
|
||||
|
||||
if (Mem_Result != 0)
|
||||
{
|
||||
Log.outDebug(LogFilter.Warden, "RESULT MEM_CHECK not 0x00, CheckId {0} account Id {1}", id, _session.GetAccountId());
|
||||
checkFailed = id;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (buff.ReadBytes(rd.Length).Compare(rs.ToByteArray()))
|
||||
{
|
||||
Log.outDebug(LogFilter.Warden, "RESULT MEM_CHECK fail CheckId {0} account Id {1}", id, _session.GetAccountId());
|
||||
checkFailed = id;
|
||||
continue;
|
||||
}
|
||||
|
||||
Log.outDebug(LogFilter.Warden, "RESULT MEM_CHECK passed CheckId {0} account Id {1}", id, _session.GetAccountId());
|
||||
break;
|
||||
Log.outDebug(LogFilter.Warden, $"RESULT MEM_CHECK not 0x00, CheckId {id} account Id {_session.GetAccountId()}");
|
||||
checkFailed = id;
|
||||
continue;
|
||||
}
|
||||
|
||||
byte[] expected = Global.WardenCheckMgr.GetCheckResult(id);
|
||||
|
||||
if (buff.ReadBytes((uint)expected.Length).Compare(expected))
|
||||
{
|
||||
Log.outDebug(LogFilter.Warden, $"RESULT MEM_CHECK fail CheckId {id} account Id {_session.GetAccountId()}");
|
||||
checkFailed = id;
|
||||
continue;
|
||||
}
|
||||
|
||||
Log.outDebug(LogFilter.Warden, $"RESULT MEM_CHECK passed CheckId {id} account Id {_session.GetAccountId()}");
|
||||
break;
|
||||
}
|
||||
case WardenCheckType.PageA:
|
||||
case WardenCheckType.PageB:
|
||||
case WardenCheckType.Driver:
|
||||
case WardenCheckType.Module:
|
||||
{
|
||||
if (buff.ReadUInt8() != 0xE9)
|
||||
{
|
||||
byte value = 0xE9;
|
||||
if (buff.ReadUInt8() != value)
|
||||
{
|
||||
if (type == WardenCheckType.PageA || type == WardenCheckType.PageB)
|
||||
Log.outDebug(LogFilter.Warden, "RESULT PAGE_CHECK fail, CheckId {0} account Id {1}", id, _session.GetAccountId());
|
||||
if (type == WardenCheckType.Module)
|
||||
Log.outDebug(LogFilter.Warden, "RESULT MODULE_CHECK fail, CheckId {0} account Id {1}", id, _session.GetAccountId());
|
||||
if (type == WardenCheckType.Driver)
|
||||
Log.outDebug(LogFilter.Warden, "RESULT DRIVER_CHECK fail, CheckId {0} account Id {1}", id, _session.GetAccountId());
|
||||
checkFailed = id;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (type == WardenCheckType.PageA || type == WardenCheckType.PageB)
|
||||
Log.outDebug(LogFilter.Warden, "RESULT PAGE_CHECK passed CheckId {0} account Id {1}", id, _session.GetAccountId());
|
||||
else if (type == WardenCheckType.Module)
|
||||
Log.outDebug(LogFilter.Warden, "RESULT MODULE_CHECK passed CheckId {0} account Id {1}", id, _session.GetAccountId());
|
||||
else if (type == WardenCheckType.Driver)
|
||||
Log.outDebug(LogFilter.Warden, "RESULT DRIVER_CHECK passed CheckId {0} account Id {1}", id, _session.GetAccountId());
|
||||
break;
|
||||
Log.outDebug(LogFilter.Warden, $"RESULT {check.Type} fail, CheckId {id} account Id {_session.GetAccountId()}");
|
||||
checkFailed = id;
|
||||
continue;
|
||||
}
|
||||
case WardenCheckType.LuaStr:
|
||||
|
||||
Log.outDebug(LogFilter.Warden, $"RESULT {check.Type} passed CheckId {id} account Id {_session.GetAccountId()}");
|
||||
break;
|
||||
}
|
||||
case WardenCheckType.LuaEval:
|
||||
{
|
||||
byte result = buff.ReadUInt8();
|
||||
if (result == 0)
|
||||
buff.Skip(buff.ReadUInt8()); // discard attached string
|
||||
|
||||
Log.outDebug(LogFilter.Warden, $"LUA_EVAL_CHECK CheckId {id} account Id {_session.GetAccountId()} got in-warden dummy response ({result})");
|
||||
break;
|
||||
}
|
||||
case WardenCheckType.Mpq:
|
||||
{
|
||||
byte result = buff.ReadUInt8();
|
||||
if (result != 0)
|
||||
{
|
||||
byte Lua_Result = buff.ReadUInt8();
|
||||
|
||||
if (Lua_Result != 0)
|
||||
{
|
||||
Log.outDebug(LogFilter.Warden, "RESULT LUA_STR_CHECK fail, CheckId {0} account Id {1}", id, _session.GetAccountId());
|
||||
checkFailed = id;
|
||||
continue;
|
||||
}
|
||||
|
||||
byte luaStrLen = buff.ReadUInt8();
|
||||
if (luaStrLen != 0)
|
||||
Log.outDebug(LogFilter.Warden, "Lua string: {0}", buff.ReadString(luaStrLen));
|
||||
|
||||
Log.outDebug(LogFilter.Warden, "RESULT LUA_STR_CHECK passed, CheckId {0} account Id {1}", id, _session.GetAccountId());
|
||||
break;
|
||||
Log.outDebug(LogFilter.Warden, $"RESULT MPQ_CHECK not 0x00 account id {_session.GetAccountId()}", _session.GetAccountId());
|
||||
checkFailed = id;
|
||||
continue;
|
||||
}
|
||||
case WardenCheckType.MPQ:
|
||||
|
||||
if (!buff.ReadBytes(20).Compare(Global.WardenCheckMgr.GetCheckResult(id))) // SHA1
|
||||
{
|
||||
byte Mpq_Result = buff.ReadUInt8();
|
||||
|
||||
if (Mpq_Result != 0)
|
||||
{
|
||||
Log.outDebug(LogFilter.Warden, "RESULT MPQ_CHECK not 0x00 account id {0}", _session.GetAccountId());
|
||||
checkFailed = id;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!buff.ReadBytes(20).Compare(rs.ToByteArray())) // SHA1
|
||||
{
|
||||
Log.outDebug(LogFilter.Warden, "RESULT MPQ_CHECK fail, CheckId {0} account Id {1}", id, _session.GetAccountId());
|
||||
checkFailed = id;
|
||||
continue;
|
||||
}
|
||||
|
||||
Log.outDebug(LogFilter.Warden, "RESULT MPQ_CHECK passed, CheckId {0} account Id {1}", id, _session.GetAccountId());
|
||||
break;
|
||||
Log.outDebug(LogFilter.Warden, $"RESULT MPQ_CHECK fail, CheckId {id} account Id {_session.GetAccountId()}");
|
||||
checkFailed = id;
|
||||
continue;
|
||||
}
|
||||
|
||||
Log.outDebug(LogFilter.Warden, $"RESULT MPQ_CHECK passed, CheckId {id} account Id {_session.GetAccountId()}");
|
||||
break;
|
||||
}
|
||||
default: // Should never happen
|
||||
break;
|
||||
}
|
||||
@@ -438,18 +459,106 @@ namespace Game
|
||||
|
||||
if (checkFailed > 0)
|
||||
{
|
||||
WardenCheck check = Global.WardenCheckMgr.GetWardenDataById(checkFailed);
|
||||
Log.outWarn(LogFilter.Warden, "{0} failed Warden check {1}. Action: {2}", _session.GetPlayerInfo(), checkFailed, Penalty(check));
|
||||
WardenCheck check = Global.WardenCheckMgr.GetCheckData(checkFailed);
|
||||
string penalty = ApplyPenalty(check);
|
||||
Log.outWarn(LogFilter.Warden, $"{_session.GetPlayerInfo()} failed Warden check {checkFailed}. Action: {penalty}");
|
||||
}
|
||||
|
||||
// Set hold off timer, minimum timer should at least be 1 second
|
||||
uint holdOff = WorldConfig.GetUIntValue(WorldCfg.WardenClientCheckHoldoff);
|
||||
_checkTimer = (holdOff < 1 ? 1 : holdOff) * Time.InMilliseconds;
|
||||
}
|
||||
}
|
||||
|
||||
uint _serverTicks;
|
||||
List<ushort> _otherChecksTodo = new();
|
||||
List<ushort> _memChecksTodo = new();
|
||||
List<ushort> _currentChecks = new();
|
||||
class WardenInitModuleRequest
|
||||
{
|
||||
public WardenOpcodes Command1;
|
||||
public ushort Size1;
|
||||
public uint CheckSumm1;
|
||||
public byte Unk1;
|
||||
public byte Unk2;
|
||||
public byte Type;
|
||||
public byte String_library1;
|
||||
public uint[] Function1 = new uint[4];
|
||||
|
||||
public WardenOpcodes Command2;
|
||||
public ushort Size2;
|
||||
public uint CheckSumm2;
|
||||
public byte Unk3;
|
||||
public byte Unk4;
|
||||
public byte String_library2;
|
||||
public uint Function2;
|
||||
public byte Function2_set;
|
||||
|
||||
public WardenOpcodes Command3;
|
||||
public ushort Size3;
|
||||
public uint CheckSumm3;
|
||||
public byte Unk5;
|
||||
public byte Unk6;
|
||||
public byte String_library3;
|
||||
public uint Function3;
|
||||
public byte Function3_set;
|
||||
|
||||
public static implicit operator byte[](WardenInitModuleRequest request)
|
||||
{
|
||||
ByteBuffer buffer = new ByteBuffer();
|
||||
buffer.WriteUInt8((byte)request.Command1);
|
||||
buffer.WriteUInt16(request.Size1);
|
||||
buffer.WriteUInt32(request.CheckSumm1);
|
||||
buffer.WriteUInt8(request.Unk1);
|
||||
buffer.WriteUInt8(request.Unk2);
|
||||
buffer.WriteUInt8(request.Type);
|
||||
buffer.WriteUInt8(request.String_library1);
|
||||
foreach (var function in request.Function1)
|
||||
buffer.WriteUInt32(function);
|
||||
|
||||
buffer.WriteUInt8((byte)request.Command2);
|
||||
buffer.WriteUInt16(request.Size2);
|
||||
buffer.WriteUInt32(request.CheckSumm2);
|
||||
buffer.WriteUInt8(request.Unk3);
|
||||
buffer.WriteUInt8(request.Unk4);
|
||||
buffer.WriteUInt8(request.String_library2);
|
||||
buffer.WriteUInt32(request.Function2);
|
||||
buffer.WriteUInt8(request.Function2_set);
|
||||
|
||||
buffer.WriteUInt8((byte)request.Command3);
|
||||
buffer.WriteUInt16(request.Size3);
|
||||
buffer.WriteUInt32(request.CheckSumm3);
|
||||
buffer.WriteUInt8(request.Unk5);
|
||||
buffer.WriteUInt8(request.Unk6);
|
||||
buffer.WriteUInt8(request.String_library3);
|
||||
buffer.WriteUInt32(request.Function3);
|
||||
buffer.WriteUInt8(request.Function3_set);
|
||||
|
||||
return buffer.GetData();
|
||||
}
|
||||
}
|
||||
|
||||
class CategoryCheck
|
||||
{
|
||||
public List<ushort> _checks = new();
|
||||
public ushort currentIndex;
|
||||
|
||||
public CategoryCheck(List<ushort> checks)
|
||||
{
|
||||
_checks = checks;
|
||||
currentIndex = 0;
|
||||
}
|
||||
|
||||
public bool Empty()
|
||||
{
|
||||
return _checks.Empty();
|
||||
}
|
||||
|
||||
public bool IsAtEnd()
|
||||
{
|
||||
return currentIndex >= _checks.Count;
|
||||
}
|
||||
|
||||
public void Shuffle()
|
||||
{
|
||||
_checks = _checks.Shuffle().ToList();
|
||||
currentIndex = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1454,21 +1454,18 @@ Updates.CleanDeadRefMaxCount = 3
|
||||
Warden.Enabled = 0
|
||||
|
||||
#
|
||||
# Warden.NumMemChecks
|
||||
# Description: Number of Warden memory checks that are sent to the client each cycle.
|
||||
# Default: 3 - (Enabled)
|
||||
# 0 - (Disabled)
|
||||
# Warden.NumInjectionChecks
|
||||
# Warden.NumLuaSandboxChecks
|
||||
# Warden.NumClientModChecks
|
||||
# Description: Number of Warden checks of the respective category that are sent per cycle.
|
||||
# Default: 9 - (Warden.NumInjectionChecks)
|
||||
# Default: 1 - (Warden.NumLuaSandboxChecks)
|
||||
# Default: 1 - (Warden.NumClientModChecks)
|
||||
# 0 - (Disable category)
|
||||
|
||||
Warden.NumMemChecks = 3
|
||||
|
||||
#
|
||||
# Warden.NumOtherChecks
|
||||
# Description: Number of Warden checks other than memory checks that are added to request
|
||||
# each checking cycle.
|
||||
# Default: 7 - (Enabled)
|
||||
# 0 - (Disabled)
|
||||
|
||||
Warden.NumOtherChecks = 7
|
||||
Warden.NumInjectionChecks = 9
|
||||
Warden.NumLuaSandboxChecks = 1
|
||||
Warden.NumClientModChecks = 1
|
||||
|
||||
#
|
||||
# Warden.ClientResponseDelay
|
||||
|
||||
Reference in New Issue
Block a user