Add CChams feature + OnDrawObject hook; fix KeyValues3 init via SetTypeKV3

This commit is contained in:
2026-08-05 00:08:06 +02:00
parent 8a121f77a0
commit 9dae88ec38
22 changed files with 40882 additions and 148 deletions
+5
View File
@@ -358,5 +358,10 @@ MigrationBackup/
# Ionide (cross platform F# VS Code tools) working folder
.ionide/
# Local release / library artifacts
ReleasePack/
Libs_v145/
*.bak
# Fody - auto-generated XML schema
FodyWeavers.xsd
@@ -141,6 +141,7 @@
<ClCompile Include="Andromeda-CS2-Base\AndromedaClient\Features\CInventoryChanger\CInventoryChanger.cpp" />
<ClCompile Include="Andromeda-CS2-Base\AndromedaClient\Features\CInventoryChanger\CInventoryItemsManager.cpp" />
<ClCompile Include="Andromeda-CS2-Base\AndromedaClient\Features\CVisual\CVisual.cpp" />
<ClCompile Include="Andromeda-CS2-Base\AndromedaClient\Features\CChams\CChams.cpp" />
<ClCompile Include="Andromeda-CS2-Base\AndromedaClient\Fonts\CFont.cpp" />
<ClCompile Include="Andromeda-CS2-Base\AndromedaClient\Fonts\CFontManager.cpp" />
<ClCompile Include="Andromeda-CS2-Base\AndromedaClient\GUI\CAndromedaMenu.cpp" />
@@ -166,6 +167,7 @@
<ClCompile Include="Andromeda-CS2-Base\CS2\Hook\Hook_CreateMove.cpp" />
<ClCompile Include="Andromeda-CS2-Base\CS2\Hook\Hook_CreateSwapChain.cpp" />
<ClCompile Include="Andromeda-CS2-Base\CS2\Hook\Hook_DrawGlow.cpp" />
<ClCompile Include="Andromeda-CS2-Base\CS2\Hook\Hook_OnDrawObject.cpp" />
<ClCompile Include="Andromeda-CS2-Base\CS2\Hook\Hook_EquipItemInLoadout.cpp" />
<ClCompile Include="Andromeda-CS2-Base\CS2\Hook\Hook_FireEventClientSide.cpp" />
<ClCompile Include="Andromeda-CS2-Base\CS2\Hook\Hook_FrameStageNotify.cpp" />
@@ -10,6 +10,7 @@
#include <AndromedaClient/Fonts/CFontManager.hpp>
#include <AndromedaClient/Render/CRenderStackSystem.hpp>
#include <AndromedaClient/Features/CVisual/CVisual.hpp>
#include <AndromedaClient/Features/CChams/CChams.hpp>
#include <AndromedaClient/Features/CInventoryChanger/CInventoryChanger.hpp>
#include <GameClient/CEntityCache/CEntityCache.hpp>
@@ -18,7 +19,7 @@ static CAndromedaClient g_CAndromedaClient{};
auto CAndromedaClient::OnInit() -> void
{
GetChams()->CreateMaterials();
}
auto CAndromedaClient::OnFrameStageNotify( int FrameStage ) -> void
@@ -8,6 +8,9 @@
#include <DllLauncher.hpp>
#include <Common/Helpers/StringHelper.hpp>
#include <ImGui/Fonts/segue_font.h>
#include <ImGui/Fonts/ico_font.h>
#include <CS2/SDK/SDK.hpp>
#include <CS2/SDK/Interface/IEngineToClient.hpp>
#include <CS2/SDK/SDL3/SDL3_Functions.hpp>
@@ -93,21 +96,27 @@ auto CAndromedaGUI::InitFont() -> void
{
ImGuiIO& io = ImGui::GetIO();
static const ImWchar TahomaRanges[] =
static const ImWchar SegoeRanges[] =
{
0x0020, 0xFFFC,
0x0020, 0x00FF,
0x0400, 0x052F,
0x2DE0, 0x2DFF,
0xA640, 0xA69F,
0x1FB0, 0x1FCF,
0,
};
wchar_t* szWindowsFontPath = nullptr;
m_pDefaultFont = io.Fonts->AddFontFromMemoryTTF( &seguoe , sizeof seguoe , 22.f , nullptr , SegoeRanges );
m_pSegoeFont = io.Fonts->AddFontFromMemoryTTF( &seguoe , sizeof seguoe , 36.f , nullptr , SegoeRanges );
m_pBoldSegoeFont = io.Fonts->AddFontFromMemoryTTF( &bold_segue , sizeof bold_segue , 36.f , nullptr , SegoeRanges );
if ( SHGetKnownFolderPath( FOLDERID_Fonts , 0 , 0 , &szWindowsFontPath ) == S_OK )
static const ImWchar IconRanges[] =
{
std::wstring TahomaFont = std::wstring( szWindowsFontPath ) + L"\\tahoma.ttf";
io.Fonts->AddFontFromFileTTF( unicode_to_utf8( TahomaFont ).c_str() , 15.f , nullptr , TahomaRanges );
}
0xE000, 0xF8FF,
0,
};
CoTaskMemFree( szWindowsFontPath );
m_pIconFont = io.Fonts->AddFontFromMemoryTTF( &icon , sizeof icon , 24.f , nullptr , IconRanges );
}
void CAndromedaGUI::OnPresent( IDXGISwapChain* pSwapChain )
@@ -29,6 +29,12 @@ public:
public:
auto InitFont() -> void;
public:
auto GetDefaultFont() -> ImFont* { return m_pDefaultFont; }
auto GetSegoeFont() -> ImFont* { return m_pSegoeFont; }
auto GetBoldSegoeFont() -> ImFont* { return m_pBoldSegoeFont; }
auto GetIconFont() -> ImFont* { return m_pIconFont; }
private:
auto SetIndigoStyle() -> void;
auto SetVermillionStyle() -> void;
@@ -82,6 +88,12 @@ private:
private:
ImGuiContext* m_pImGuiContext = nullptr;
private:
ImFont* m_pDefaultFont = nullptr;
ImFont* m_pSegoeFont = nullptr;
ImFont* m_pBoldSegoeFont = nullptr;
ImFont* m_pIconFont = nullptr;
private:
std::string m_GuiFile;
@@ -0,0 +1,205 @@
#include "CChams.hpp"
#include <cstdint>
#include <CS2/SDK/SDK.hpp>
#include <CS2/SDK/FunctionListSDK.hpp>
#include <CS2/SDK/Interface/CMaterialSystem2.hpp>
#include <CS2/SDK/Types/CEntityData.hpp>
#include <CS2/SDK/Types/CHandle.hpp>
#include <GameClient/CL_Players.hpp>
#include <CS2/Hook/Hook_OnDrawObject.hpp>
#include <AndromedaClient/Settings/Settings.hpp>
static CChams g_CChams{};
// ---- build-specific, version-dependent constants ---------------------------
namespace ChamsMesh
{
// stride of one CMeshData entry in the mesh draw array
constexpr std::size_t MESH_STRIDE = 0x68;
// CMeshData.pSceneAnimatableObject
constexpr std::size_t SCENE_OBJECT_OFFSET = 0x18;
// CMeshData.pMaterial (visible)
constexpr std::size_t MATERIAL_OFFSET = 0x20;
// CMeshData.pMaterial (second / occluded handle)
constexpr std::size_t MATERIAL2_OFFSET = 0x28;
// CMeshData.colValue (00AABBGGRR)
constexpr std::size_t COLOR_OFFSET = 0x50;
// CSceneAnimatableObject.hOwner (CHandle of the owning entity)
constexpr std::size_t OWNER_OFFSET = 0x18;
}
// ---- minimal KeyValues3 / KV3ID_t -----------------------------------------
class KeyValues3
{
public:
// Opaque storage large enough for the parsed KV3 tree; LoadKV3 writes here.
alignas( 16 ) uint8_t m_pData[ 0x400 ] = {};
};
struct KV3ID_t
{
const char* szName = "";
uint64_t unk0 = 0x469806E97412167C;
uint64_t unk1 = 0xE73790B53EE6F2AF;
};
// ---- shader buffers (standard flat cham materials) -------------------------
static constexpr char szVMatVisible[] =
R"---(<!-- kv3 encoding:text:version{e21c7f3c-8a33-41c5-9977-a76d3a32aa0d} format:generic:version{7412167c-06e9-4698-aff2-e63eb59037e7} -->
{
shader = "csgo_unlitgeneric.vfx"
F_PAINT_VERTEX_COLORS = 1
F_TRANSLUCENT = 1
F_BLEND_MODE = 1
g_vColorTint = [1, 1, 1, 1]
TextureAmbientOcclusion = resource:"materials/default/default_mask_tga_fde710a5.vtex"
g_tAmbientOcclusion = resource:"materials/default/default_mask_tga_fde710a5.vtex"
g_tColor = resource:"materials/default/default_mask_tga_fde710a5.vtex"
g_tNormal = resource:"materials/default/default_mask_tga_fde710a5.vtex"
g_tTintMask = resource:"materials/default/default_mask_tga_fde710a5.vtex"
})---";
static constexpr char szVMatInvisible[] =
R"---(<!-- kv3 encoding:text:version{e21c7f3c-8a33-41c5-9977-a76d3a32aa0d} format:generic:version{7412167c-06e9-4698-aff2-e63eb59037e7} -->
{
shader = "csgo_unlitgeneric.vfx"
F_PAINT_VERTEX_COLORS = 1
F_TRANSLUCENT = 1
F_BLEND_MODE = 1
F_DISABLE_Z_BUFFERING = 1
g_vColorTint = [1, 1, 1, 1]
TextureAmbientOcclusion = resource:"materials/default/default_mask_tga_fde710a5.vtex"
g_tAmbientOcclusion = resource:"materials/default/default_mask_tga_fde710a5.vtex"
g_tColor = resource:"materials/default/default_mask_tga_fde710a5.vtex"
g_tNormal = resource:"materials/default/default_mask_tga_fde710a5.vtex"
g_tTintMask = resource:"materials/default/default_mask_tga_fde710a5.vtex"
})---";
// ---- original draw call (set by the hook, Hook_OnDrawObject.hpp) ----------
auto CChams::CreateMaterial( const char* szName , const char* szVmatBuffer ) -> CMaterial2*
{
// KeyValues3 must be constructed via the game's SetTypeKV3 before use,
// otherwise KeyValues3::LoadKV3 dereferences an uninitialised allocator and
// access-violates inside tier0.dll (C0000005).
auto* kv3 = new KeyValues3[ 0x10 ];
KV3ID_t kv3ID{};
ClientKeyValues3_SetTypeKV3( kv3 , 1U , 6U );
if ( !KeyValues3_LoadKV3( kv3 , szVmatBuffer , &kv3ID ) )
{
delete[] kv3;
return nullptr;
}
auto* pMaterialSystem = SDK::Interfaces::MaterialSystem2();
if ( !pMaterialSystem )
{
delete[] kv3;
return nullptr;
}
CMaterial2** pHandle = nullptr;
pMaterialSystem->CreateMaterial( &pHandle , szName , kv3 );
delete[] kv3;
if ( pHandle && *pHandle )
return *pHandle;
return nullptr;
}
auto CChams::CreateMaterials() -> void
{
if ( IsReady() )
return;
if ( !m_pMaterialVisible )
m_pMaterialVisible = CreateMaterial( "chams_visible" , szVMatVisible );
if ( !m_pMaterialInvisible )
m_pMaterialInvisible = CreateMaterial( "chams_invisible" , szVMatInvisible );
}
auto CChams::OnDrawObject( void* pAnimatableSceneObjectDesc , void* pDx11 , void* pMeshData , int nDataCount , void* pSceneView , void* pSceneLayer , void* pUnk , void* pUnk2 ) -> bool
{
if ( !Settings::Chams::Enabled )
return false;
if ( !IsReady() || !pMeshData || nDataCount <= 0 )
return false;
auto* pLocalPawn = GetCL_Players()->GetLocalPlayerPawn();
if ( !pLocalPawn )
return false;
const auto* pBytes = static_cast<const uint8_t*>( pMeshData );
for ( int i = 0; i < nDataCount; i++ )
{
const uint8_t* pEntry = pBytes + static_cast<std::size_t>( i ) * ChamsMesh::MESH_STRIDE;
const void* pSceneObject = *(const void**)( pEntry + ChamsMesh::SCENE_OBJECT_OFFSET );
if ( !pSceneObject )
continue;
const CHandle hOwner = *(const CHandle*)( (const uint8_t*)pSceneObject + ChamsMesh::OWNER_OFFSET );
if ( !hOwner.IsValid() )
continue;
auto* pPawn = hOwner.Get<C_CSPlayerPawn>();
if ( !pPawn || !pPawn->IsPlayerPawn() || !pPawn->IsAlive() || pPawn == pLocalPawn )
continue;
// only apply chams to enemies
if ( pPawn->m_iTeamNum() == pLocalPawn->m_iTeamNum() )
continue;
auto* pWN = const_cast<uint8_t*>( pEntry );
if ( Settings::Chams::IgnoreZ )
{
*(CMaterial2**)( pWN + ChamsMesh::MATERIAL_OFFSET ) = m_pMaterialInvisible;
*(CMaterial2**)( pWN + ChamsMesh::MATERIAL2_OFFSET ) = m_pMaterialInvisible;
*(uint32_t*)( pWN + ChamsMesh::COLOR_OFFSET ) = ImGui::ColorConvertFloat4ToU32( Settings::Chams::Occluded );
OnDrawObject_o( pAnimatableSceneObjectDesc , pDx11 , pMeshData , nDataCount , pSceneView , pSceneLayer , pUnk , pUnk2 );
}
*(CMaterial2**)( pWN + ChamsMesh::MATERIAL_OFFSET ) = m_pMaterialVisible;
*(CMaterial2**)( pWN + ChamsMesh::MATERIAL2_OFFSET ) = m_pMaterialVisible;
*(uint32_t*)( pWN + ChamsMesh::COLOR_OFFSET ) = ImGui::ColorConvertFloat4ToU32( Settings::Chams::Visible );
OnDrawObject_o( pAnimatableSceneObjectDesc , pDx11 , pMeshData , nDataCount , pSceneView , pSceneLayer , pUnk , pUnk2 );
return true;
}
return false;
}
auto GetChams() -> CChams*
{
return &g_CChams;
}
@@ -0,0 +1,48 @@
#pragma once
#include <Common/Common.hpp>
class CMaterial2;
class C_CSPlayerPawn;
//
// Material-based player chams.
//
// Requires a hook on scenesystem.dll "OnDrawObject" (CAnimatableSceneObjectDesc)
// that feeds meshes to OnDrawObject(). The feature builds two flat materials
// (visible + through-walls variant) via the game's own material system and
// swaps them onto player meshes at draw time.
//
// NOTE: the mesh-field offsets, the scene-object owner offset and the KV3ID
// hashes are build-specific. They are isolated as constants below so they can
// be updated against a current dump without touching the surrounding logic.
//
class CChams final
{
public:
enum EMaterialStyle_t : int32_t
{
MATERIAL_STYLE_PLAIN = 0,
MATERIAL_STYLE_MAX,
};
public:
auto CreateMaterials() -> void;
public:
// Returns true when the mesh data was consumed (material applied + base drawn).
auto OnDrawObject( void* pAnimatableSceneObjectDesc , void* pDx11 , void* pMeshData , int nDataCount , void* pSceneView , void* pSceneLayer , void* pUnk , void* pUnk2 ) -> bool;
public:
auto IsReady() const -> bool { return m_pMaterialVisible && m_pMaterialInvisible; }
private:
auto CreateMaterial( const char* szName , const char* szVmatBuffer ) -> CMaterial2*;
private:
CMaterial2* m_pMaterialVisible = nullptr;
CMaterial2* m_pMaterialInvisible = nullptr;
};
auto GetChams() -> CChams*;
@@ -261,40 +261,124 @@ auto CInventoryItemsManager::ScanAllItems() -> void
}
}
// Legacy function - now scans items and loads selected skins from config
// Legacy function - now scans items and applies configured per-weapon selections
auto CInventoryItemsManager::OnAddAllItems() -> void
{
ScanAllItems();
ApplyConfigSelections();
}
for ( auto& Item : m_vecDumpedItems )
auto CInventoryItemsManager::ApplyConfigSelections() -> void
{
for ( const auto& [ defIdx , paintKit ] : m_WeaponSkinSelections )
ApplyWeaponSelection( defIdx , paintKit , true );
if ( m_iMusicSelection >= 0 )
ApplyWeaponSelection_Impl( EInventoryPrefab_t::INVENTORY_PREFAB_MUSIC_KIT , m_iMusicSelection , true , true );
}
auto CInventoryItemsManager::SetWeaponSkin( uint16_t defIdx , int paintKit , bool equip ) -> bool
{
if ( !IsWeaponSkinValid( defIdx , paintKit ) )
return false;
if ( ApplyWeaponSelection( defIdx , paintKit , equip ) )
{
if ( Item.m_ItemType == EDumpedItemType_t::DUMPED_ITEM_TYPE_WEAPON ||
Item.m_ItemType == EDumpedItemType_t::DUMPED_ITEM_TYPE_KNIFE ||
Item.m_ItemType == EDumpedItemType_t::DUMPED_ITEM_TYPE_GLOVE )
{
if ( Item.m_DumpedSkins.size() )
{
for ( auto& Skin : Item.m_DumpedSkins )
{
AddSelectedSkinToInventory( Item.m_DefIdx , Skin.m_ID , 0.0f , false , 0 , -1 );
}
}
}
else if ( Item.m_ItemType == EDumpedItemType_t::DUMPED_ITEM_TYPE_AGENT )
{
AddSelectedSkinToInventory( Item.m_DefIdx , 0 , 0.0f , false , 0 , -1 );
}
else if ( Item.m_ItemType == EDumpedItemType_t::DUMPED_ITEM_TYPE_MUSIC )
{
if ( Item.m_DumpedSkins.size() )
{
for ( auto& Skin : Item.m_DumpedSkins )
{
AddMusicToInventory( Item.m_DefIdx , Skin.m_ID );
}
}
}
m_WeaponSkinSelections[defIdx] = paintKit;
return true;
}
return false;
}
auto CInventoryItemsManager::ApplyWeaponSelection( uint16_t defIdx , int paintKit , bool equip ) -> bool
{
return ApplyWeaponSelection_Impl( defIdx , paintKit , equip , false );
}
auto CInventoryItemsManager::SetMusicKit( int musicId , bool equip ) -> bool
{
if ( !IsMusicValid( musicId ) )
return false;
if ( ApplyWeaponSelection_Impl( EInventoryPrefab_t::INVENTORY_PREFAB_MUSIC_KIT , musicId , equip , true ) )
{
m_iMusicSelection = musicId;
return true;
}
return false;
}
auto CInventoryItemsManager::RemoveWeaponSkin( uint16_t defIdx ) -> bool
{
auto bRemoved = false;
for ( auto it = m_AddedItems.begin(); it != m_AddedItems.end(); )
{
if ( it->second.m_ItemType == EDumpedItemType_t::DUMPED_ITEM_TYPE_MUSIC )
{
it++;
continue;
}
if ( it->second.m_DefIdx == defIdx )
{
if ( auto* pInventory = CCSPlayerInventory::Get(); pInventory )
pInventory->RemoveEconItem( it->second.m_pEconItem );
it = m_AddedItems.erase( it );
bRemoved = true;
}
else
it++;
}
m_WeaponSkinSelections.erase( defIdx );
return bRemoved;
}
auto CInventoryItemsManager::RemoveMusicKit() -> bool
{
auto bRemoved = false;
for ( auto it = m_AddedItems.begin(); it != m_AddedItems.end(); )
{
if ( it->second.m_ItemType == EDumpedItemType_t::DUMPED_ITEM_TYPE_MUSIC )
{
if ( auto* pInventory = CCSPlayerInventory::Get(); pInventory )
pInventory->RemoveEconItem( it->second.m_pEconItem );
it = m_AddedItems.erase( it );
bRemoved = true;
}
else
it++;
}
m_iMusicSelection = -1;
return bRemoved;
}
auto CInventoryItemsManager::ClearAllSelections() -> void
{
for ( auto it = m_AddedItems.begin(); it != m_AddedItems.end(); )
{
if ( it->second.m_ItemType != EDumpedItemType_t::DUMPED_ITEM_TYPE_AGENT )
{
if ( auto* pInventory = CCSPlayerInventory::Get(); pInventory )
pInventory->RemoveEconItem( it->second.m_pEconItem );
it = m_AddedItems.erase( it );
}
else
it++;
}
m_WeaponSkinSelections.clear();
m_iMusicSelection = -1;
}
// Add a specific skin to inventory
@@ -523,6 +607,86 @@ auto CInventoryItemsManager::AddMusicToInventory( uint16_t defIdx , int MusicId
return false;
}
auto CInventoryItemsManager::IsWeaponSkinValid( uint16_t defIdx , int paintKit ) -> bool
{
for ( const auto& Item : m_vecDumpedItems )
{
if ( Item.m_DefIdx != defIdx )
continue;
if ( Item.m_ItemType == EDumpedItemType_t::DUMPED_ITEM_TYPE_MUSIC )
return false;
if ( Item.m_ItemType == EDumpedItemType_t::DUMPED_ITEM_TYPE_AGENT )
return true;
for ( const auto& Skin : Item.m_DumpedSkins )
{
if ( Skin.m_ID == paintKit )
return true;
}
break;
}
return false;
}
auto CInventoryItemsManager::IsMusicValid( int musicId ) -> bool
{
for ( const auto& Item : m_vecDumpedItems )
{
if ( Item.m_ItemType != EDumpedItemType_t::DUMPED_ITEM_TYPE_MUSIC )
continue;
for ( const auto& Skin : Item.m_DumpedSkins )
{
if ( Skin.m_ID == musicId )
return true;
}
}
return false;
}
auto CInventoryItemsManager::ApplyWeaponSelection_Impl( uint16_t defIdx , int paintKit , bool equip , bool bMusic ) -> bool
{
if ( bMusic )
{
for ( auto it = m_AddedItems.begin(); it != m_AddedItems.end(); )
{
if ( it->second.m_ItemType == EDumpedItemType_t::DUMPED_ITEM_TYPE_MUSIC )
{
if ( auto* pInventory = CCSPlayerInventory::Get(); pInventory )
pInventory->RemoveEconItem( it->second.m_pEconItem );
it = m_AddedItems.erase( it );
}
else
it++;
}
return AddMusicToInventory( defIdx , paintKit , equip );
}
for ( auto it = m_AddedItems.begin(); it != m_AddedItems.end(); )
{
if ( it->second.m_ItemType != EDumpedItemType_t::DUMPED_ITEM_TYPE_AGENT &&
it->second.m_ItemType != EDumpedItemType_t::DUMPED_ITEM_TYPE_MUSIC &&
it->second.m_DefIdx == defIdx )
{
if ( auto* pInventory = CCSPlayerInventory::Get(); pInventory )
pInventory->RemoveEconItem( it->second.m_pEconItem );
it = m_AddedItems.erase( it );
}
else
it++;
}
return AddSelectedSkinToInventory( defIdx , paintKit , 0.0f , equip , 0 , -1 );
}
auto CInventoryItemsManager::RemoveItemFromInventoryByID( uint64_t ID ) -> bool
{
if ( IsItemIDAdded( ID ) )
@@ -72,6 +72,10 @@ private:
std::vector<DumpedItem_t> m_vecDumpedItems;
std::unordered_map<uint64_t , AddedItem_t> m_AddedItems;
private:
std::unordered_map<uint16_t , int> m_WeaponSkinSelections;
int m_iMusicSelection = -1;
public:
// Scan all available items (does NOT add to inventory)
auto ScanAllItems() -> void;
@@ -82,6 +86,22 @@ public:
// Add a specific selected skin to inventory
auto AddSelectedSkinToInventory( uint16_t defIdx , int paintKit , float wear = 0.0f , bool equip = false , int seed = 0 , int statTrak = -1 ) -> bool;
// Per-weapon skin changer: apply one skin for a weapon (replaces previous selection)
auto SetWeaponSkin( uint16_t defIdx , int paintKit , bool equip = true ) -> bool;
auto ApplyWeaponSelection( uint16_t defIdx , int paintKit , bool equip = true ) -> bool;
auto RemoveWeaponSkin( uint16_t defIdx ) -> bool;
auto SetMusicKit( int musicId , bool equip = true ) -> bool;
auto RemoveMusicKit() -> bool;
auto ApplyConfigSelections() -> void;
auto ClearAllSelections() -> void;
private:
auto IsWeaponSkinValid( uint16_t defIdx , int paintKit ) -> bool;
auto IsMusicValid( int musicId ) -> bool;
auto ApplyWeaponSelection_Impl( uint16_t defIdx , int paintKit , bool equip , bool bMusic ) -> bool;
public:
auto AddMusicToInventory( uint16_t defIdx , int MusicId , bool equip = false ) -> bool;
@@ -103,6 +123,16 @@ public:
return m_vecDumpedItems;
}
inline auto GetWeaponSkinSelections() -> std::unordered_map<uint16_t , int>&
{
return m_WeaponSkinSelections;
}
inline auto GetMusicSelection() -> int&
{
return m_iMusicSelection;
}
inline auto GetAddedItems()->std::unordered_map<uint64_t, AddedItem_t>&
{
return m_AddedItems;
@@ -123,6 +123,14 @@ auto CVisual::OnRenderPlayerEsp( CCSPlayerController* pCCSPlayerController , con
GetRenderStackSystem()->DrawCoalBox( min , max , PlayerColor );
else if ( Settings::Visual::PlayerBoxType == EVisualBoxType_t::OUTLINE_COAL_BOX )
GetRenderStackSystem()->DrawOutlineCoalBox( min , max , PlayerColor );
else if ( Settings::Visual::PlayerBoxType == EVisualBoxType_t::GLASSY_BOX )
{
auto FillColor = static_cast<ImColor>( PlayerColor );
FillColor.Value.w = Settings::Visual::GlassOpacity / 100.f;
GetRenderStackSystem()->DrawFillBox( min , max , FillColor );
GetRenderStackSystem()->DrawOutlineBox( min , max , PlayerColor );
}
}
if ( Settings::Visual::BoneESP )
@@ -33,6 +33,7 @@ private:
COAL_BOX ,
OUTLINE_COAL_BOX ,
CIRCLE_3D ,
GLASSY_BOX ,
};
auto OnRenderPlayerEsp( CCSPlayerController* pCCSPlayerController , const Rect_t& bBox , const bool bVisible ) -> void;
@@ -1,162 +1,631 @@
#include "CAndromedaMenu.hpp"
#include <cstdio>
#include <ImGui/imgui.h>
#include <ImGui/imgui_internal.h>
#include <AndromedaClient/Settings/Settings.hpp>
#include <AndromedaClient/CAndromedaGUI.hpp>
#include <AndromedaClient/Features/CInventoryChanger/CInventoryItemsManager.hpp>
static CAndromedaMenu g_CAndromedaMenu{};
namespace
{
auto AccentU32( const ImVec4& Accent ) -> ImU32
{
return ImGui::ColorConvertFloat4ToU32( Accent );
}
// Public-API toggle switch, drawn as a rounded pill.
bool ToggleSwitch( const char* szID , bool* pbValue , const ImVec4& Accent )
{
const float Height = ImGui::GetFrameHeight();
const float Width = Height * 1.9f;
const ImVec2 Pos = ImGui::GetCursorScreenPos();
const bool bClicked = ImGui::InvisibleButton( szID , ImVec2( Width , Height ) );
ImDrawList* pDraw = ImGui::GetWindowDrawList();
const ImU32 Track = *pbValue ? AccentU32( Accent ) : IM_COL32( 255 , 255 , 255 , 22 );
pDraw->AddRectFilled( Pos , Pos + ImVec2( Width , Height ) , Track , Height * 0.5f );
const float KnobSize = Height - 6.f;
const float KnobX = *pbValue ? ( Pos.x + Width - KnobSize - 3.f ) : ( Pos.x + 3.f );
pDraw->AddCircleFilled( ImVec2( KnobX + KnobSize * 0.5f , Pos.y + Height * 0.5f ) , KnobSize * 0.5f , IM_COL32( 255 , 255 , 255 , 235 ) );
if ( bClicked )
*pbValue = !*pbValue;
return bClicked;
}
}
auto CAndromedaMenu::OnRenderMenu() -> void
{
const float MenuAlpha = static_cast<float>( Settings::Menu::MenuAlpha ) / 255.f;
ImGui::PushStyleVar( ImGuiStyleVar_Alpha , MenuAlpha );
ImGui::SetNextWindowSize( ImVec2( 500 , 500 ) , ImGuiCond_FirstUseEver );
if ( ImGui::Begin( XorStr( CHEAT_NAME ) , 0 ) )
ImGui::PushStyleColor( ImGuiCol_WindowBg , IM_COL32( 19 , 20 , 24 , 255 ) );
ImGui::PushStyleColor( ImGuiCol_ChildBg , IM_COL32( 0 , 0 , 0 , 0 ) );
ImGui::PushStyleColor( ImGuiCol_FrameBg , IM_COL32( 40 , 42 , 50 , 255 ) );
ImGui::PushStyleColor( ImGuiCol_FrameBgHovered , IM_COL32( 50 , 53 , 63 , 255 ) );
ImGui::PushStyleColor( ImGuiCol_FrameBgActive , IM_COL32( 58 , 61 , 73 , 255 ) );
ImGui::PushStyleColor( ImGuiCol_CheckMark , m_Accent );
ImGui::PushStyleColor( ImGuiCol_SliderGrab , m_Accent );
ImGui::PushStyleColor( ImGuiCol_SliderGrabActive , m_Accent );
ImGui::PushStyleColor( ImGuiCol_Button , IM_COL32( 45 , 48 , 58 , 255 ) );
ImGui::PushStyleColor( ImGuiCol_ButtonHovered , IM_COL32( 55 , 59 , 72 , 255 ) );
ImGui::PushStyleColor( ImGuiCol_ButtonActive , m_Accent );
ImGui::PushStyleColor( ImGuiCol_Header , m_Accent );
ImGui::PushStyleColor( ImGuiCol_HeaderHovered , IM_COL32( 60 , 45 , 58 , 255 ) );
ImGui::PushStyleColor( ImGuiCol_HeaderActive , IM_COL32( 70 , 48 , 62 , 255 ) );
ImGui::PushStyleVar( ImGuiStyleVar_WindowPadding , ImVec2( 8.f , 8.f ) );
ImGui::PushStyleVar( ImGuiStyleVar_WindowRounding , 8.f );
ImGui::PushStyleVar( ImGuiStyleVar_WindowBorderSize , 0.f );
ImGui::PushStyleVar( ImGuiStyleVar_FrameRounding , 4.f );
ImGui::PushStyleVar( ImGuiStyleVar_ItemSpacing , ImVec2( 8.f , 6.f ) );
ImGui::SetNextWindowSize( ImVec2( 960 , 620 ) , ImGuiCond_FirstUseEver );
if ( ImGui::Begin( XorStr( "Evicted" ) , nullptr , ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoScrollbar ) )
{
if ( ImGui::CollapsingHeader( XorStr( "Visuals" ) ) )
RenderSidebar();
ImGui::SameLine( 0.f , 0.f );
ImGui::PushStyleVar( ImGuiStyleVar_WindowPadding , ImVec2( 18.f , 16.f ) );
if ( ImGui::BeginChild( "##Content" , ImVec2( 0.f , 0.f ) , false ) )
{
RenderCheckBox( XorStr( "Active" ) , XorStr( "##Visual.Active" ) , Settings::Visual::Active );
RenderCheckBox( XorStr( "Team" ) , XorStr( "##Visual.Team" ) , Settings::Visual::Team );
RenderCheckBox( XorStr( "Enemy" ) , XorStr( "##Visual.Enemy" ) , Settings::Visual::Enemy );
RenderCheckBox( XorStr( "OnlyVisible" ) , XorStr( "##Visual.OnlyVisible" ) , Settings::Visual::OnlyVisible );
RenderCheckBox( XorStr( "Player Box" ) , XorStr( "##Visual.PlayerBox" ) , Settings::Visual::PlayerBox );
const char* PlayerBoxTypeItems[] =
{
"Box" , "Outline Box" , "Coal Box" , "Outline Coal Box"
};
RenderComboBox( XorStr( "PlayerBox Type" ) , XorStr( "##Visual.PlayerBoxType" ) , Settings::Visual::PlayerBoxType , PlayerBoxTypeItems , IM_ARRAYSIZE( PlayerBoxTypeItems ) );
RenderCheckBox( XorStr( "Bone ESP" ) , XorStr( "##Visual.BoneESP" ) , Settings::Visual::BoneESP );
if ( Settings::Visual::BoneESP )
switch ( m_iSelectedTab )
{
ImGui::Indent();
RenderCheckBox( XorStr( " Bone ESP Team" ) , XorStr( "##Visual.BoneESPTeam" ) , Settings::Visual::BoneESPTeam );
RenderCheckBox( XorStr( " Bone ESP Enemy" ) , XorStr( "##Visual.BoneESPEnemy" ) , Settings::Visual::BoneESPEnemy );
ImGui::Unindent();
}
RenderCheckBox( XorStr( "Glow" ) , XorStr( "##Visual.Glow" ) , Settings::Visual::Glow );
if ( Settings::Visual::Glow )
{
ImGui::Indent();
RenderCheckBox( XorStr( " Glow Team" ) , XorStr( "##Visual.GlowTeam" ) , Settings::Visual::GlowTeam );
RenderCheckBox( XorStr( " Glow Enemy" ) , XorStr( "##Visual.GlowEnemy" ) , Settings::Visual::GlowEnemy );
ImGui::Unindent();
case TAB_VISUALS: RenderVisualPanel(); break;
case TAB_GLOW: RenderGlowPanel(); break;
case TAB_SKINS: RenderSkinPanel(); break;
case TAB_MUSIC: RenderMusicPanel(); break;
case TAB_CONFIG: RenderConfigPanel(); break;
default: break;
}
}
if ( ImGui::CollapsingHeader( XorStr( "Colors" ) ) )
{
RenderColorEdit( XorStr( "Player Box TT" ) , XorStr( "##Colors.Visual.PlayerBoxTT" ) , &Settings::Colors::Visual::PlayerBoxTT.x );
RenderColorEdit( XorStr( "Player Box TT Visible" ) , XorStr( "##Colors.Visual.PlayerBoxTT_Visible" ) , &Settings::Colors::Visual::PlayerBoxTT_Visible.x );
RenderColorEdit( XorStr( "Player Box CT" ) , XorStr( "##Colors.Visual.PlayerBoxCT" ) , &Settings::Colors::Visual::PlayerBoxCT.x );
RenderColorEdit( XorStr( "Player Box CT Visible" ) , XorStr( "##Colors.Visual.PlayerBoxCT_Visible" ) , &Settings::Colors::Visual::PlayerBoxCT_Visible.x );
ImGui::EndChild();
RenderColorEdit( XorStr( "Bone ESP TT" ) , XorStr( "##Colors.Visual.BoneESPTT" ) , &Settings::Colors::Visual::BoneESPTT.x );
RenderColorEdit( XorStr( "Bone ESP TT Visible" ) , XorStr( "##Colors.Visual.BoneESPTT_Visible" ) , &Settings::Colors::Visual::BoneESPTT_Visible.x );
RenderColorEdit( XorStr( "Bone ESP CT" ) , XorStr( "##Colors.Visual.BoneESPCT" ) , &Settings::Colors::Visual::BoneESPCT.x );
RenderColorEdit( XorStr( "Bone ESP CT Visible" ) , XorStr( "##Colors.Visual.BoneESPCT_Visible" ) , &Settings::Colors::Visual::BoneESPCT_Visible.x );
RenderColorEdit( XorStr( "Glow TT" ) , XorStr( "##Colors.Visual.GlowTT" ) , &Settings::Colors::Visual::GlowTT.x );
RenderColorEdit( XorStr( "Glow TT Visible" ) , XorStr( "##Colors.Visual.GlowTT_Visible" ) , &Settings::Colors::Visual::GlowTT_Visible.x );
RenderColorEdit( XorStr( "Glow CT" ) , XorStr( "##Colors.Visual.GlowCT" ) , &Settings::Colors::Visual::GlowCT.x );
RenderColorEdit( XorStr( "Glow CT Visible" ) , XorStr( "##Colors.Visual.GlowCT_Visible" ) , &Settings::Colors::Visual::GlowCT_Visible.x );
}
if ( ImGui::CollapsingHeader( XorStr( "Menu" ) ) )
{
RenderSliderInt( XorStr( "Menu Alpha" ) , XorStr( "##Menu.MenuAlpha" ) , Settings::Menu::MenuAlpha , 100 , 255 );
const char* MenuStyleItems[] =
{
"Indigo" , "Vermillion" , "Classic Steam"
};
if ( RenderComboBox( XorStr( "Menu Style" ) , XorStr( "##Menu.MenuStyle" ) , Settings::Menu::MenuStyle , MenuStyleItems , IM_ARRAYSIZE( MenuStyleItems ) ) )
GetAndromedaGUI()->UpdateStyle();
}
ImGui::PopStyleVar();
}
ImGui::End();
ImGui::PopStyleVar();
ImGui::PopStyleVar();
ImGui::PopStyleVar();
ImGui::PopStyleVar();
ImGui::PopStyleVar();
ImGui::PopStyleColor();
ImGui::PopStyleColor();
ImGui::PopStyleColor();
ImGui::PopStyleColor();
ImGui::PopStyleColor();
ImGui::PopStyleColor();
ImGui::PopStyleColor();
ImGui::PopStyleColor();
ImGui::PopStyleColor();
ImGui::PopStyleColor();
ImGui::PopStyleColor();
ImGui::PopStyleColor();
ImGui::PopStyleColor();
ImGui::PopStyleColor();
ImGui::PopStyleVar();
}
auto CAndromedaMenu::RenderCheckBox( const char* szTitle , const char* szStrID , bool& SettingsItem ) -> bool
auto CAndromedaMenu::RenderSidebar() -> void
{
if ( szTitle )
const ImVec2 Avail = ImGui::GetContentRegionAvail();
ImDrawList* pDraw = ImGui::GetWindowDrawList();
const ImVec2 WinMin = ImGui::GetWindowPos();
const ImVec2 SidebarMax = WinMin + ImVec2( 210.f , Avail.y + 16.f );
pDraw->AddRectFilled( WinMin , SidebarMax , IM_COL32( 25 , 26 , 32 , 255 ) , 8.f );
if ( ImGui::BeginChild( "##Sidebar" , ImVec2( 210.f , Avail.y ) , false ) )
{
ImGui::AlignTextToFramePadding();
ImGui::Text( szTitle );
ImGui::SameLine( ImGui::CalcTextSize( szTitle ).x + 10.f );
const float HeaderHeight = 92.f;
const ImVec2 HeaderMin = ImGui::GetCursorScreenPos();
const ImVec2 HeaderMax = HeaderMin + ImVec2( 210.f , HeaderHeight );
pDraw->AddRectFilled( HeaderMin , HeaderMax , AccentU32( m_Accent ) , 8.f );
pDraw->AddRectFilled( ImVec2( HeaderMax.x - 60.f , HeaderMin.y ) , HeaderMax , IM_COL32( 0 , 0 , 0 , 18 ) , 8.f );
pDraw->AddRectFilled( ImVec2( HeaderMin.x , HeaderMax.y - 22.f ) , HeaderMax , IM_COL32( 0 , 0 , 0 , 40 ) );
ImFont* pIcon = GetAndromedaGUI()->GetIconFont();
ImFont* pBold = GetAndromedaGUI()->GetBoldSegoeFont();
const char* szLogoIcon = "?";
const char* szLogoText = "EVI CTED";
const char* szSubText = "ANDROMEDA";
const float IconW = pIcon->CalcTextSizeA( 34.f , FLT_MAX , 0.f , szLogoIcon ).x;
ImGui::SetCursorScreenPos( ImVec2( HeaderMin.x + 18.f , HeaderMin.y + 20.f ) );
ImGui::PushFont( pIcon );
ImGui::TextColored( ImVec4( 1.f , 1.f , 1.f , 0.95f ) , "%s" , szLogoIcon );
ImGui::PopFont();
ImGui::SameLine( 0.f , 10.f );
ImGui::PushFont( pBold );
ImGui::TextColored( ImVec4( 1.f , 1.f , 1.f , 1.f ) , "%s" , szLogoText );
ImGui::PopFont();
ImGui::SameLine( 0.f , 8.f );
ImFont* pSeg = GetAndromedaGUI()->GetSegoeFont();
ImGui::PushFont( pSeg );
ImGui::TextColored( ImVec4( 1.f , 1.f , 1.f , 0.85f ) , "%s" , szSubText );
ImGui::PopFont();
ImGui::SetCursorScreenPos( ImVec2( HeaderMin.x + 18.f , HeaderMin.y + 52.f ) );
ImGui::Dummy( ImVec2( 0.f , 34.f ) );
ImGui::SetCursorPosX( 4.f );
TabButton( "I" , "Visuals" , TAB_VISUALS , ImVec2( 202.f , 40.f ) );
TabButton( "P" , "Glow & Chams" , TAB_GLOW , ImVec2( 202.f , 40.f ) );
TabButton( "T" , "Skins" , TAB_SKINS , ImVec2( 202.f , 40.f ) );
TabButton( "N" , "Music Kit" , TAB_MUSIC , ImVec2( 202.f , 40.f ) );
TabButton( "S" , "Config" , TAB_CONFIG , ImVec2( 202.f , 40.f ) );
ImGui::SetCursorPosY( ImGui::GetCursorPosY() + 6.f );
ImGui::Separator();
ImGui::TextColored( ImVec4( 1.f , 1.f , 1.f , 0.35f ) , "%s" , " Insert to close" );
}
const auto LeftPadding = ImGui::GetStyle().FramePadding.x;
ImGui::Dummy( ImVec2( ImGui::GetContentRegionAvail().x - 27.f - LeftPadding , 0.f ) );
ImGui::SameLine();
const auto Ret = ImGui::Checkbox( szStrID , &SettingsItem );
return Ret;
ImGui::EndChild();
}
auto CAndromedaMenu::RenderComboBox( const char* szTitle , const char* szStrID , int& v , const char* Items[] , int ItemsCount ) -> bool
auto CAndromedaMenu::TabButton( const char* szIcon , const char* szLabel , const int iTab , const ImVec2& Size ) -> void
{
if ( szTitle )
const bool bSelected = ( m_iSelectedTab == iTab );
const ImVec2 Pos = ImGui::GetCursorScreenPos();
const ImVec2 Max = Pos + Size;
char szID[ 32 ];
std::snprintf( szID , sizeof szID , "##tab_%d" , iTab );
ImGui::InvisibleButton( szID , Size );
const bool bHovered = ImGui::IsItemHovered();
const bool bClicked = ImGui::IsItemClicked();
if ( bClicked )
m_iSelectedTab = iTab;
ImDrawList* pDraw = ImGui::GetWindowDrawList();
ImU32 Bg = IM_COL32( 0 , 0 , 0 , 0 );
if ( bSelected )
Bg = AccentU32( m_Accent );
else if ( bHovered )
Bg = IM_COL32( 255 , 255 , 255 , 16 );
pDraw->AddRectFilled( Pos , Max , Bg , 6.f );
const float TextColorOn = bSelected ? 1.f : 0.45f;
ImFont* pIcon = GetAndromedaGUI()->GetIconFont();
ImFont* pText = GetAndromedaGUI()->GetDefaultFont();
const ImVec2 Icon( Pos.x + 14.f , Pos.y + ( Size.y - 26.f ) * 0.5f );
pDraw->AddText( pIcon , 26.f , Icon , IM_COL32( 255 , 255 , 255 , (int)( TextColorOn * 255.f ) ) , szIcon );
const float IconW = pIcon->CalcTextSizeA( 26.f , FLT_MAX , 0.f , szIcon ).x;
pDraw->AddText( pText , pText->FontSize , ImVec2( Icon.x + IconW + 12.f , Pos.y + ( Size.y - pText->FontSize ) * 0.5f ) , IM_COL32( 255 , 255 , 255 , (int)( TextColorOn * 255.f ) ) , szLabel );
}
auto CAndromedaMenu::RenderVisualPanel() -> void
{
BeginPanel( "Visuals" );
Toggle( "Enabled" , "##Visual.Active" , Settings::Visual::Active );
Toggle( "Teammates" , "##Visual.Team" , Settings::Visual::Team );
Toggle( "Enemies" , "##Visual.Enemy" , Settings::Visual::Enemy );
Toggle( "Only Visible" , "##Visual.OnlyVisible" , Settings::Visual::OnlyVisible );
EndPanel();
BeginPanel( "Player Box" );
Toggle( "Player Box" , "##Visual.PlayerBox" , Settings::Visual::PlayerBox );
const char* PlayerBoxTypeItems[] =
{
ImGui::AlignTextToFramePadding();
ImGui::Text( szTitle );
"Box" , "Outline Box" , "Coal Box" , "Outline Coal Box" , "Glassy Box"
};
if ( Combo( "Type" , "##Visual.PlayerBoxType" , Settings::Visual::PlayerBoxType , PlayerBoxTypeItems , IM_ARRAYSIZE( PlayerBoxTypeItems ) ) )
{
if ( Settings::Visual::PlayerBoxType == 5 )
Settings::Visual::GlassyBox = true;
else
Settings::Visual::GlassyBox = false;
}
if ( Settings::Visual::PlayerBoxType == 5 )
SliderInt( "Glass Opacity" , "##Visual.GlassOpacity" , Settings::Visual::GlassOpacity , 10 , 90 , "%d%%" );
EndPanel();
BeginPanel( "Skeleton" );
Toggle( "Bone ESP" , "##Visual.BoneESP" , Settings::Visual::BoneESP );
if ( Settings::Visual::BoneESP )
{
Toggle( " Teammates" , "##Visual.BoneESPTeam" , Settings::Visual::BoneESPTeam );
Toggle( " Enemies" , "##Visual.BoneESPEnemy" , Settings::Visual::BoneESPEnemy );
}
EndPanel();
}
auto CAndromedaMenu::RenderGlowPanel() -> void
{
BeginPanel( "Glow" );
Toggle( "Glow Enabled" , "##Visual.Glow" , Settings::Visual::Glow );
if ( Settings::Visual::Glow )
{
Toggle( " Teammates" , "##Visual.GlowTeam" , Settings::Visual::GlowTeam );
Toggle( " Enemies" , "##Visual.GlowEnemy" , Settings::Visual::GlowEnemy );
ImGui::NewLine();
ColorEdit( "Glow TT" , "##Colors.Visual.GlowTT" , &Settings::Colors::Visual::GlowTT.x );
ColorEdit( "Glow TT Visible" , "##Colors.Visual.GlowTT_Visible" , &Settings::Colors::Visual::GlowTT_Visible.x );
ColorEdit( "Glow CT" , "##Colors.Visual.GlowCT" , &Settings::Colors::Visual::GlowCT.x );
ColorEdit( "Glow CT Visible" , "##Colors.Visual.GlowCT_Visible" , &Settings::Colors::Visual::GlowCT_Visible.x );
}
EndPanel();
BeginPanel( "Chams" );
Toggle( "Material Chams" , "##Chams.Enabled" , Settings::Chams::Enabled );
if ( Settings::Chams::Enabled )
{
Toggle( "Through Walls" , "##Chams.IgnoreZ" , Settings::Chams::IgnoreZ );
ImGui::NewLine();
ColorEdit( "Visible Color" , "##Chams.Visible" , &Settings::Chams::Visible.x );
ColorEdit( "Occluded Color" , "##Chams.Occluded" , &Settings::Chams::Occluded.x );
}
EndPanel();
BeginPanel( "Glassy Box" );
Toggle( "Glass Fill" , "##Visual.GlassyBox" , Settings::Visual::GlassyBox );
if ( Settings::Visual::GlassyBox )
{
SliderInt( "Opacity" , "##Visual.GlassOpacity" , Settings::Visual::GlassOpacity , 10 , 90 , "%d%%" );
ImGui::NewLine();
ColorEdit( "Box TT" , "##Colors.Visual.PlayerBoxTT" , &Settings::Colors::Visual::PlayerBoxTT.x );
ColorEdit( "Box CT" , "##Colors.Visual.PlayerBoxCT" , &Settings::Colors::Visual::PlayerBoxCT.x );
}
EndPanel();
}
auto CAndromedaMenu::RenderSkinPanel() -> void
{
auto* pManager = GetInventoryItemsManager();
if ( pManager->GetDumpedItems().empty() )
pManager->ScanAllItems();
ImGui::TextColored( ImVec4( 1.f , 1.f , 1.f , 0.4f ) , "%s" , "Select a weapon on the left, then a skin and press Apply." );
ImGui::NewLine();
const float ItemWidth = ImGui::GetContentRegionAvail().x * 0.42f;
if ( ImGui::BeginChild( "##WeaponList" , ImVec2( ItemWidth , 0.f ) , true ) )
{
const auto& Items = pManager->GetDumpedItems();
for ( size_t i = 0; i < Items.size(); i++ )
{
const auto& Item = Items[ i ];
if ( Item.m_ItemType == CInventoryItemsManager::EDumpedItemType_t::DUMPED_ITEM_TYPE_MUSIC )
continue;
if ( Item.m_ItemType == CInventoryItemsManager::EDumpedItemType_t::DUMPED_ITEM_TYPE_AGENT )
continue;
const bool bSel = ( static_cast<int>( i ) == m_iSelectedItemIdx );
char szLabel[ 128 ];
std::snprintf( szLabel , sizeof szLabel , "%s (%u)" , Item.m_DisplayName.c_str() , Item.m_DefIdx );
if ( ImGui::Selectable( szLabel , bSel ) )
{
m_iSelectedItemIdx = static_cast<int>( i );
m_iSelectedSkinIdx = 0;
}
}
}
ImGui::EndChild();
ImGui::SameLine();
ImGui::PushItemWidth( -1.f );
const auto Ret = ImGui::Combo( szStrID , &v , Items , ItemsCount );
if ( ImGui::BeginChild( "##SkinList" , ImVec2( 0.f , 0.f ) , true ) )
{
const auto& Items = pManager->GetDumpedItems();
if ( m_iSelectedItemIdx >= 0 && m_iSelectedItemIdx < static_cast<int>( Items.size() ) )
{
const auto& Item = Items[ m_iSelectedItemIdx ];
ImGui::TextColored( m_Accent , "%s" , Item.m_DisplayName.c_str() );
ImGui::Separator();
if ( Item.m_ItemType == CInventoryItemsManager::EDumpedItemType_t::DUMPED_ITEM_TYPE_GLOVE ||
Item.m_ItemType == CInventoryItemsManager::EDumpedItemType_t::DUMPED_ITEM_TYPE_KNIFE ||
Item.m_ItemType == CInventoryItemsManager::EDumpedItemType_t::DUMPED_ITEM_TYPE_WEAPON )
{
for ( size_t j = 0; j < Item.m_DumpedSkins.size(); j++ )
{
const auto& Skin = Item.m_DumpedSkins[ j ];
const bool bSel = ( static_cast<int>( j ) == m_iSelectedSkinIdx );
char szLabel[ 256 ];
std::snprintf( szLabel , sizeof szLabel , "%s [%s]" , Skin.m_DisplayName.c_str() , pManager->GetRarityName( Skin.m_Rarity ).c_str() );
const ImU32 Rarity = pManager->GetRarityColor( Skin.m_Rarity );
ImGui::PushStyleColor( ImGuiCol_Header , Rarity );
if ( ImGui::Selectable( szLabel , bSel ) )
m_iSelectedSkinIdx = static_cast<int>( j );
ImGui::PopStyleColor();
}
ImGui::NewLine();
const auto& ItemRef = Items[ m_iSelectedItemIdx ];
if ( ImGui::Button( "Apply Skin" , ImVec2( 120.f , 28.f ) ) )
{
if ( ItemRef.m_DumpedSkins.size() && m_iSelectedSkinIdx >= 0 )
{
const auto& Skin = ItemRef.m_DumpedSkins[ m_iSelectedSkinIdx ];
pManager->SetWeaponSkin( ItemRef.m_DefIdx , Skin.m_ID , true );
}
}
ImGui::SameLine();
if ( ImGui::Button( "Remove" , ImVec2( 120.f , 28.f ) ) )
pManager->RemoveWeaponSkin( ItemRef.m_DefIdx );
}
}
else
{
ImGui::TextColored( ImVec4( 1.f , 1.f , 1.f , 0.4f ) , "%s" , "No weapon selected." );
}
}
ImGui::EndChild();
}
auto CAndromedaMenu::RenderMusicPanel() -> void
{
auto* pManager = GetInventoryItemsManager();
if ( pManager->GetDumpedItems().empty() )
pManager->ScanAllItems();
ImGui::TextColored( ImVec4( 1.f , 1.f , 1.f , 0.4f ) , "%s" , "Select a music kit and press Apply. Selecting a new kit replaces the previous one." );
ImGui::NewLine();
if ( ImGui::BeginChild( "##MusicList" , ImVec2( 0.f , 0.f ) , true ) )
{
const auto& Items = pManager->GetDumpedItems();
for ( const auto& Item : Items )
{
if ( Item.m_ItemType != CInventoryItemsManager::EDumpedItemType_t::DUMPED_ITEM_TYPE_MUSIC )
continue;
for ( const auto& Skin : Item.m_DumpedSkins )
{
const bool bSel = ( Skin.m_ID == pManager->GetMusicSelection() );
if ( ImGui::Selectable( Skin.m_DisplayName.c_str() , bSel ) )
m_iSelectedMusicIdx = Skin.m_ID;
}
}
ImGui::NewLine();
if ( ImGui::Button( "Apply Music Kit" , ImVec2( 150.f , 28.f ) ) )
{
if ( m_iSelectedMusicIdx >= 0 )
pManager->SetMusicKit( m_iSelectedMusicIdx , true );
}
ImGui::SameLine();
if ( ImGui::Button( "Reset" , ImVec2( 100.f , 28.f ) ) )
pManager->RemoveMusicKit();
}
ImGui::EndChild();
}
auto CAndromedaMenu::RenderConfigPanel() -> void
{
BeginPanel( "Menu" );
SliderInt( "Menu Alpha" , "##Menu.MenuAlpha" , Settings::Menu::MenuAlpha , 100 , 255 );
const char* MenuStyleItems[] =
{
"Indigo" , "Vermillion" , "Classic Steam"
};
if ( Combo( "Menu Style" , "##Menu.MenuStyle" , Settings::Menu::MenuStyle , MenuStyleItems , IM_ARRAYSIZE( MenuStyleItems ) ) )
GetAndromedaGUI()->UpdateStyle();
EndPanel();
BeginPanel( "Skinchanger" );
ImGui::TextColored( ImVec4( 1.f , 1.f , 1.f , 0.4f ) , "%s" , "The skin changer now applies only the skins you configure per weapon." );
if ( ImGui::Button( "Clear All Skins" , ImVec2( 150.f , 28.f ) ) )
GetInventoryItemsManager()->ClearAllSelections();
EndPanel();
}
auto CAndromedaMenu::BeginPanel( const char* szTitle ) -> void
{
ImGui::PushID( szTitle );
ImGui::PushFont( GetAndromedaGUI()->GetBoldSegoeFont() );
ImGui::TextColored( ImVec4( 1.f , 1.f , 1.f , 0.95f ) , "%s" , szTitle );
ImGui::PopFont();
ImDrawList* pDraw = ImGui::GetWindowDrawList();
const ImVec2 Pos = ImGui::GetCursorScreenPos();
const float RightEdge = ImGui::GetWindowPos().x + ImGui::GetWindowContentRegionMax().x;
pDraw->AddRectFilled( Pos , ImVec2( Pos.x + 28.f , Pos.y + 2.f ) , AccentU32( m_Accent ) );
pDraw->AddRectFilled( ImVec2( Pos.x + 28.f , Pos.y + 2.f ) , ImVec2( RightEdge , Pos.y + 2.f ) , IM_COL32( 255 , 255 , 255 , 18 ) );
ImGui::SetCursorPosY( ImGui::GetCursorPosY() + 12.f );
ImGui::Indent( 4.f );
}
auto CAndromedaMenu::EndPanel() -> void
{
ImGui::Unindent( 4.f );
ImGui::SetCursorPosY( ImGui::GetCursorPosY() + 14.f );
ImGui::PopID();
}
auto CAndromedaMenu::Toggle( const char* szLabel , const char* szStrID , bool& bValue ) -> bool
{
ImGui::AlignTextToFramePadding();
ImGui::TextUnformatted( szLabel );
ImGui::SameLine();
ImGui::SetCursorPosX( ImGui::GetCursorPosX() + ImGui::GetContentRegionAvail().x - 40.f );
return ToggleSwitch( szStrID , &bValue , m_Accent );
}
auto CAndromedaMenu::SliderInt( const char* szLabel , const char* szStrID , int& iValue , int iMin , int iMax , const char* szFormat ) -> bool
{
ImGui::AlignTextToFramePadding();
ImGui::TextUnformatted( szLabel );
ImGui::SameLine();
ImGui::PushItemWidth( ImGui::GetContentRegionAvail().x - 10.f );
const bool bRet = ImGui::SliderInt( szStrID , &iValue , iMin , iMax , szFormat );
ImGui::PopItemWidth();
return Ret;
return bRet;
}
auto CAndromedaMenu::RenderColorEdit( const char* szTitle , const char* szStrID , float* Color ) -> bool
auto CAndromedaMenu::SliderFloat( const char* szLabel , const char* szStrID , float& fValue , float fMin , float fMax , const char* szFormat ) -> bool
{
if ( szTitle )
{
ImGui::AlignTextToFramePadding();
ImGui::Text( szTitle );
}
ImGui::AlignTextToFramePadding();
ImGui::TextUnformatted( szLabel );
ImGui::SameLine();
const auto Ret = ImGui::ColorEdit4( szStrID , Color );
return Ret;
}
auto CAndromedaMenu::RenderSliderInt( const char* szTitle , const char* szStrID , int& Value , int Min , int Max ) -> bool
{
if ( szTitle )
{
ImGui::AlignTextToFramePadding();
ImGui::Text( szTitle );
}
ImGui::SameLine();
ImGui::PushItemWidth( -1.f );
const auto Ret = ImGui::SliderInt( szStrID , &Value , Min , Max );
ImGui::PushItemWidth( ImGui::GetContentRegionAvail().x - 10.f );
const bool bRet = ImGui::SliderFloat( szStrID , &fValue , fMin , fMax , szFormat );
ImGui::PopItemWidth();
return Ret;
return bRet;
}
auto CAndromedaMenu::Combo( const char* szLabel , const char* szStrID , int& iValue , const char* Items[] , int iItemsCount ) -> bool
{
ImGui::AlignTextToFramePadding();
ImGui::TextUnformatted( szLabel );
ImGui::SameLine();
ImGui::PushItemWidth( ImGui::GetContentRegionAvail().x - 10.f );
const bool bRet = ImGui::Combo( szStrID , &iValue , Items , iItemsCount );
ImGui::PopItemWidth();
return bRet;
}
auto CAndromedaMenu::ColorEdit( const char* szLabel , const char* szStrID , float* flColor ) -> bool
{
ImGui::AlignTextToFramePadding();
ImGui::TextUnformatted( szLabel );
ImGui::SameLine();
ImGui::PushItemWidth( ImGui::GetContentRegionAvail().x - 10.f );
const bool bRet = ImGui::ColorEdit4( szStrID , flColor , ImGuiColorEditFlags_AlphaBar | ImGuiColorEditFlags_NoInputs );
ImGui::PopItemWidth();
return bRet;
}
auto GetAndromedaMenu() -> CAndromedaMenu*
{
return &g_CAndromedaMenu;
}
}
@@ -2,16 +2,50 @@
#include <Common/Common.hpp>
#include <ImGui/imgui.h>
class CAndromedaMenu final
{
public:
auto OnRenderMenu() -> void;
private:
auto RenderCheckBox( const char* szTitle , const char* szStrID , bool& SettingsItem ) -> bool;
auto RenderComboBox( const char* szTitle , const char* szStrID , int& v , const char* Items[] , int ItemsCount ) -> bool;
auto RenderColorEdit( const char* szTitle , const char* szStrID , float* Color ) -> bool;
auto RenderSliderInt( const char* szTitle , const char* szStrID , int& Value , int Min , int Max ) -> bool;
enum ETab : int32_t
{
TAB_VISUALS,
TAB_GLOW,
TAB_SKINS,
TAB_MUSIC,
TAB_CONFIG,
};
private:
auto RenderVisualPanel() -> void;
auto RenderGlowPanel() -> void;
auto RenderSkinPanel() -> void;
auto RenderMusicPanel() -> void;
auto RenderConfigPanel() -> void;
auto RenderSidebar() -> void;
auto TabButton( const char* szIcon , const char* szLabel , const int iTab , const ImVec2& Size ) -> void;
auto Toggle( const char* szLabel , const char* szStrID , bool& bValue ) -> bool;
auto SliderInt( const char* szLabel , const char* szStrID , int& iValue , int iMin , int iMax , const char* szFormat = "%d" ) -> bool;
auto SliderFloat( const char* szLabel , const char* szStrID , float& fValue , float fMin , float fMax , const char* szFormat = "%.2f" ) -> bool;
auto Combo( const char* szLabel , const char* szStrID , int& iValue , const char* Items[] , int iItemsCount ) -> bool;
auto ColorEdit( const char* szLabel , const char* szStrID , float* flColor ) -> bool;
auto BeginPanel( const char* szTitle ) -> void;
auto EndPanel() -> void;
private:
int m_iSelectedTab = TAB_VISUALS;
int m_iCurrentComboId = 0;
int m_iSelectedItemIdx = -1;
int m_iSelectedSkinIdx = 0;
int m_iSelectedMusicIdx = -1;
private:
ImVec4 m_Accent = ImVec4( 0.78f , 0.18f , 0.29f , 1.00f );
};
auto GetAndromedaMenu() -> CAndromedaMenu*;
auto GetAndromedaMenu() -> CAndromedaMenu*;
@@ -20,6 +20,15 @@ namespace Settings
inline auto GlowEnemy = true;
inline auto PlayerBoxType = 3;
inline auto GlassyBox = false;
inline auto GlassOpacity = 55;
}
namespace Chams
{
inline auto Enabled = false;
inline auto IgnoreZ = true;
inline ImVec4 Visible = { 0.f , 0.40f , 1.f , 1.f };
inline ImVec4 Occluded = { 1.f , 0.f , 0.75f , 1.f };
}
namespace Menu
{
@@ -23,6 +23,7 @@
#include <CS2/Hook/Hook_IsLoadoutAllowed.hpp>
#include <CS2/Hook/Hook_EquipItemInLoadout.hpp>
#include <CS2/Hook/Hook_DrawGlow.hpp>
#include <CS2/Hook/Hook_OnDrawObject.hpp>
static CHook_Loader g_CHook_Loader{};
@@ -76,6 +77,7 @@ auto CHook_Loader::InstallSecondHook() -> bool
{ { XorStr("Hook::IsLoadoutAllowed") , XorStr("48 89 5C 24 ? 48 89 6C 24 ? 48 89 74 24 ? 57 48 83 EC ? 48 8B E9 48 8B 0D ? ? ? ? ? ? ? FF 50") , CLIENT_DLL } ,&Hook_IsLoadoutAllowed , reinterpret_cast<LPVOID*>(&IsLoadoutAllowed_o) , true , true } ,
{ { XorStr( "Hook::EquipItemInLoadout" ) , XorStr( "48 89 5C 24 ? 48 89 6C 24 ? 48 89 74 24 ? 89 54 24 ? 57 41 54 41 55 41 56 41 57 48 83 EC ? 0F B7 FA" ) , CLIENT_DLL } ,& Hook_EquipItemInLoadout , reinterpret_cast<LPVOID*>( &EquipItemInLoadout_o ) },
{ { XorStr( "Hook::DrawGlow" ) , XorStr( "40 53 48 83 EC 20 48 8B 54" ) , CLIENT_DLL } , &Hook_DrawGlow , reinterpret_cast<LPVOID*>( &DrawGlow_o ) },
{ { XorStr( "Hook::OnDrawObject" ) , XorStr( "48 8B C4 48 89 50 ? 53" ) , SCENESYSTEM_DLL } , &Hook_OnDrawObject , reinterpret_cast<LPVOID*>( &OnDrawObject_o ) , true , true },
};
return InstallHooks();
@@ -0,0 +1,11 @@
#include "Hook_OnDrawObject.hpp"
#include <AndromedaClient/Features/CChams/CChams.hpp>
auto Hook_OnDrawObject( void* pAnimatableSceneObjectDesc , void* pDx11 , void* pMeshData , int nDataCount , void* pSceneView , void* pSceneLayer , void* pUnk , void* pUnk2 ) -> void
{
if ( GetChams()->OnDrawObject( pAnimatableSceneObjectDesc , pDx11 , pMeshData , nDataCount , pSceneView , pSceneLayer , pUnk , pUnk2 ) )
return;
OnDrawObject_o( pAnimatableSceneObjectDesc , pDx11 , pMeshData , nDataCount , pSceneView , pSceneLayer , pUnk , pUnk2 );
}
@@ -0,0 +1,8 @@
#pragma once
#include <Common/Common.hpp>
auto Hook_OnDrawObject( void* pAnimatableSceneObjectDesc , void* pDx11 , void* pMeshData , int nDataCount , void* pSceneView , void* pSceneLayer , void* pUnk , void* pUnk2 ) -> void;
using OnDrawObject_t = decltype( &Hook_OnDrawObject );
inline OnDrawObject_t OnDrawObject_o = nullptr;
@@ -27,6 +27,7 @@ auto CFunctionList::OnInit() -> bool
&C_BaseEntity_GetBoneIdByName,
&C_EconItemView_GetBasePlayerWeaponVData,
&KeyValues3_LoadKV3,
&ClientKeyValues3_SetTypeKV3,
&IGamePhysicsQuery_TraceShape,
&CCSGOInput_GetViewAngles,
&CCSGOInput_SetViewAngles,
@@ -97,6 +97,7 @@ public:
CBasePattern C_BaseEntity_GetBoneIdByName = { VmpStr( "C_BaseEntity::GetBoneIdByName" ) , VmpStr( "E8 ? ? ? ? 48 8B CF 85 C0 78 ? 44 8B C0" ) , CLIENT_DLL , 0 , SEARCH_TYPE_CALL };
CBasePattern C_EconItemView_GetBasePlayerWeaponVData = { VmpStr( "C_EconItemView::GetBasePlayerWeaponVData" ) , VmpStr( "48 81 EC ? ? ? ? 48 85 C9 75 ? 33 C0 48 81 C4 ? ? ? ? C3 48 89 9C 24" ) , CLIENT_DLL , 0 , SEARCH_TYPE_NONE };
CBasePattern KeyValues3_LoadKV3 = { VmpStr( "KeyValues3::LoadKV3" ) , VmpStr( "?LoadKV3@@YA_NPEAVKeyValues3@@PEAVCUtlString@@PEBDAEBUKV3ID_t@@2I@Z" ) , TIER0_DLL , 0 , SEARCH_TYPE_PROC };
CBasePattern ClientKeyValues3_SetTypeKV3 = { VmpStr( "CKeyValues3::SetTypeKV3" ) , VmpStr( "40 53 48 83 EC 20 48 8B 01 48 8B D9 44" ) , CLIENT_DLL , 0 , SEARCH_TYPE_NONE };
CBasePattern IGamePhysicsQuery_TraceShape = { VmpStr( "IGamePhysicsQuery::TraceShape" ) , VmpStr( "48 89 54 24 10 48 89 4C 24 08 55 53 56 57 41 56 41 57 48 8D AC 24 ? ? ? ? B8 E8 24 00 00 E8" ) , CLIENT_DLL , 0 , SEARCH_TYPE_NONE };
CBasePattern CCSGOInput_GetViewAngles = { VmpStr( "CCSGOInput::GetViewAngles" ) , VmpStr( "4C 8B C1 85 D2 74 ? 48 8D 05" ) , CLIENT_DLL , 0 , SEARCH_TYPE_NONE };
CBasePattern CCSGOInput_SetViewAngles = { VmpStr( "CCSGOInput::SetViewAngles" ) , VmpStr( "85 D2 75 ? 48 63 81" ) , CLIENT_DLL , 0 , SEARCH_TYPE_NONE };
@@ -76,6 +76,7 @@ DECLARATE_CS2_FUNCTION_SDK_FASTCALL( void , CSkeletonInstance_CalcWorldSpaceBone
DECLARATE_CS2_FUNCTION_SDK_FASTCALL( int , C_BaseEntity_GetBoneIdByName , ( C_BaseEntity* pC_BaseEntity , const char* szName ) , ( C_BaseEntity* , const char* ) , ( pC_BaseEntity , szName ) );
DECLARATE_CS2_FUNCTION_SDK_FASTCALL( CCSWeaponBaseVData* , C_EconItemView_GetBasePlayerWeaponVData , ( C_EconItemView* pC_EconItemView ) , ( C_EconItemView* ) , ( pC_EconItemView ) );
DECLARATE_CS2_FUNCTION_SDK_FASTCALL( bool , KeyValues3_LoadKV3 , ( KeyValues3* pKV3 , const char* vmatBuffer , KV3ID_t* pID ) , ( KeyValues3* , CUtlString* , const char* , KV3ID_t* , const char* , unsigned int ) , ( pKV3 , nullptr , vmatBuffer , pID , "" , 0 ) );
DECLARATE_CS2_FUNCTION_SDK_FASTCALL( KeyValues3* , ClientKeyValues3_SetTypeKV3 , ( KeyValues3* pKV3 , unsigned int iType , unsigned int iUnk ) , ( KeyValues3* , unsigned int , unsigned int ) , ( pKV3 , iType , iUnk ) );
DECLARATE_CS2_FUNCTION_SDK_FASTCALL( bool , IGamePhysicsQuery_TraceShape , ( IVPhysics2World** pIVPhysics2World , const Ray_t& ray , const Vector3& vecAbsStart , const Vector3& vecAbsEnd , const CTraceFilter* pFilter , CGameTrace* pTrace ) , ( IVPhysics2World** , const Ray_t& , const Vector3& , const Vector3& , const CTraceFilter* , CGameTrace* ) , ( pIVPhysics2World , ray , vecAbsStart , vecAbsEnd , pFilter , pTrace ) );
DECLARATE_CS2_FUNCTION_SDK_FASTCALL( QAngle* , CCSGOInput_GetViewAngles , ( CCSGOInput* pCCSGOInput , int32_t slot ) , ( CCSGOInput* , int32_t ) , ( pCCSGOInput , slot ) );
DECLARATE_CS2_FUNCTION_SDK_FASTCALL( void , CCSGOInput_SetViewAngles , ( CCSGOInput* pCCSGOInput , int32_t slot , QAngle& Angles ) , ( CCSGOInput* , int32_t , QAngle& ) , ( pCCSGOInput , slot , Angles ) );
@@ -0,0 +1,438 @@
#pragma once
unsigned char icon[] = {
0x00, 0x01, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x80, 0x00, 0x03, 0x00, 0x60, 0x44, 0x53, 0x49, 0x47,
0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x1B, 0x0C, 0x00, 0x00, 0x00, 0x08, 0x4F, 0x53, 0x2F, 0x32,
0x59, 0xF5, 0x52, 0xBA, 0x00, 0x00, 0x01, 0x68, 0x00, 0x00, 0x00, 0x60, 0x63, 0x6D, 0x61, 0x70,
0x79, 0x69, 0x57, 0x11, 0x00, 0x00, 0x02, 0x34, 0x00, 0x00, 0x01, 0x7A, 0x63, 0x76, 0x74, 0x20,
0x00, 0x21, 0x02, 0x79, 0x00, 0x00, 0x03, 0xB8, 0x00, 0x00, 0x00, 0x04, 0x67, 0x61, 0x73, 0x70,
0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1B, 0x04, 0x00, 0x00, 0x00, 0x08, 0x67, 0x6C, 0x79, 0x66,
0xD3, 0x3B, 0xF0, 0x4C, 0x00, 0x00, 0x03, 0xF4, 0x00, 0x00, 0x14, 0x70, 0x68, 0x65, 0x61, 0x64,
0x21, 0x18, 0xAA, 0xE2, 0x00, 0x00, 0x00, 0xEC, 0x00, 0x00, 0x00, 0x36, 0x68, 0x68, 0x65, 0x61,
0x06, 0x1B, 0x03, 0x00, 0x00, 0x00, 0x01, 0x24, 0x00, 0x00, 0x00, 0x24, 0x68, 0x6D, 0x74, 0x78,
0x39, 0x96, 0x04, 0x7E, 0x00, 0x00, 0x01, 0xC8, 0x00, 0x00, 0x00, 0x6C, 0x6C, 0x6F, 0x63, 0x61,
0x3C, 0xD0, 0x41, 0x5C, 0x00, 0x00, 0x03, 0xBC, 0x00, 0x00, 0x00, 0x38, 0x6D, 0x61, 0x78, 0x70,
0x00, 0x6A, 0x00, 0xB7, 0x00, 0x00, 0x01, 0x48, 0x00, 0x00, 0x00, 0x20, 0x6E, 0x61, 0x6D, 0x65,
0x49, 0xEE, 0x11, 0x29, 0x00, 0x00, 0x18, 0x64, 0x00, 0x00, 0x02, 0x3D, 0x70, 0x6F, 0x73, 0x74,
0x73, 0x79, 0xC8, 0x7E, 0x00, 0x00, 0x1A, 0xA4, 0x00, 0x00, 0x00, 0x60, 0x70, 0x72, 0x65, 0x70,
0x68, 0x06, 0x8C, 0x85, 0x00, 0x00, 0x03, 0xB0, 0x00, 0x00, 0x00, 0x07, 0x00, 0x01, 0x00, 0x00,
0x00, 0x01, 0x00, 0x00, 0x51, 0x9A, 0x8D, 0x18, 0x5F, 0x0F, 0x3C, 0xF5, 0x00, 0x0B, 0x03, 0xE8,
0x00, 0x00, 0x00, 0x00, 0xDF, 0x78, 0x33, 0xB0, 0x00, 0x00, 0x00, 0x00, 0xDF, 0x78, 0x33, 0xB0,
0x00, 0x21, 0xFF, 0xC6, 0x02, 0xE8, 0x02, 0xD7, 0x00, 0x00, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0xD7, 0xFF, 0xC6, 0x00, 0x5A, 0x03, 0x1E,
0x00, 0x00, 0x00, 0x00, 0x02, 0xE8, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x01, 0x00, 0x00, 0x00, 0x1B, 0x00, 0xB4,
0x00, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00,
0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x31, 0x01, 0x90, 0x00, 0x05,
0x00, 0x00, 0x02, 0x8A, 0x02, 0xBC, 0x00, 0x00, 0x00, 0x8C, 0x02, 0x8A, 0x02, 0xBC, 0x00, 0x00,
0x01, 0xE0, 0x00, 0x31, 0x01, 0x02, 0x00, 0x00, 0x02, 0x00, 0x05, 0x03, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x43, 0x4C, 0x47, 0x52, 0x00, 0x40, 0x00, 0x00, 0x00, 0xA0, 0x03, 0x20, 0xFF, 0x38,
0x00, 0x5A, 0x02, 0xD7, 0x00, 0x3A, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x02, 0x50, 0x00, 0x00, 0x00, 0x20, 0x00, 0x01, 0x01, 0x6C, 0x00, 0x21, 0x00, 0xFA, 0x00, 0x00,
0x01, 0x4D, 0x00, 0x00, 0x00, 0xFA, 0x00, 0x00, 0x00, 0xFA, 0x00, 0x00, 0x02, 0x51, 0x00, 0x36,
0x03, 0x1E, 0x00, 0x36, 0x03, 0x10, 0x00, 0x36, 0x01, 0xF5, 0x00, 0x36, 0x01, 0xEF, 0x00, 0x33,
0x02, 0xD7, 0x00, 0x36, 0x02, 0x7A, 0x00, 0x36, 0x02, 0x50, 0x00, 0x35, 0x02, 0xAE, 0x00, 0x36,
0x02, 0x87, 0x00, 0x36, 0x02, 0x80, 0x00, 0x33, 0x02, 0xCF, 0x00, 0x35, 0x02, 0x09, 0x00, 0x35,
0x02, 0x06, 0x00, 0x33, 0x01, 0xF1, 0x00, 0x33, 0x02, 0x5C, 0x00, 0x35, 0x02, 0x05, 0x00, 0x36,
0x02, 0x76, 0x00, 0x33, 0x02, 0x73, 0x00, 0x37, 0x02, 0xD7, 0x00, 0x37, 0x02, 0x4C, 0x00, 0x36,
0x00, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x1C,
0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x74, 0x00, 0x03, 0x00, 0x01, 0x00, 0x00, 0x00, 0x1C,
0x00, 0x04, 0x00, 0x58, 0x00, 0x00, 0x00, 0x12, 0x00, 0x10, 0x00, 0x03, 0x00, 0x02, 0x00, 0x00,
0x00, 0x0D, 0x00, 0x20, 0x00, 0x4C, 0x00, 0x56, 0x00, 0x6C, 0x00, 0x76, 0x00, 0xA0, 0xFF, 0xFF,
0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x20, 0x00, 0x41, 0x00, 0x4E, 0x00, 0x61, 0x00, 0x6E,
0x00, 0xA0, 0xFF, 0xFF, 0x00, 0x01, 0xFF, 0xF6, 0xFF, 0xE4, 0xFF, 0xC4, 0xFF, 0xC3, 0xFF, 0xA4,
0xFF, 0xA3, 0xFF, 0x7A, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x00, 0x00, 0x01, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05,
0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x00, 0x11, 0x12, 0x13, 0x14,
0x15, 0x16, 0x17, 0x18, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xB8, 0x01, 0xFF, 0x85, 0xB0, 0x04, 0x8D, 0x00, 0x00, 0x21, 0x02, 0x79, 0x00, 0x00, 0x00, 0x14,
0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x5C, 0x01, 0x2C, 0x01, 0x58, 0x01, 0x92,
0x02, 0x48, 0x02, 0xF8, 0x03, 0xB6, 0x04, 0x30, 0x04, 0xAE, 0x04, 0xE8, 0x05, 0xE4, 0x06, 0x4E,
0x07, 0x04, 0x07, 0x48, 0x07, 0x8C, 0x07, 0xEC, 0x08, 0x76, 0x08, 0xB8, 0x09, 0x26, 0x09, 0xE0,
0x0A, 0x38, 0x0A, 0x38, 0x00, 0x02, 0x00, 0x21, 0x00, 0x00, 0x01, 0x2A, 0x02, 0x9A, 0x00, 0x03,
0x00, 0x07, 0x00, 0x00, 0x33, 0x11, 0x21, 0x11, 0x27, 0x33, 0x11, 0x23, 0x21, 0x01, 0x09, 0xE8,
0xC7, 0xC7, 0x02, 0x9A, 0xFD, 0x66, 0x21, 0x02, 0x58, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x36,
0x00, 0x00, 0x02, 0x1D, 0x02, 0x45, 0x00, 0x10, 0x00, 0x2D, 0x00, 0x00, 0x01, 0x34, 0x22, 0x06,
0x07, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x17, 0x1E, 0x01, 0x17, 0x33, 0x03, 0x36, 0x33,
0x32, 0x17, 0x1E, 0x01, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x2E,
0x01, 0x27, 0x2E, 0x01, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x01, 0x28, 0x0A, 0x8A, 0x0C, 0x0D,
0x0B, 0x08, 0x08, 0x0C, 0x13, 0x15, 0x57, 0x1F, 0x0E, 0x62, 0x5F, 0x07, 0x05, 0x63, 0x5A, 0x2F,
0x07, 0x19, 0x1C, 0x2F, 0x3D, 0x18, 0x37, 0x34, 0x0F, 0x05, 0x1E, 0x06, 0x14, 0x40, 0x0F, 0x21,
0x22, 0x0C, 0x01, 0x12, 0xDF, 0x8D, 0x11, 0x15, 0x25, 0x1D, 0x09, 0x0A, 0x20, 0x2D, 0x1A, 0x1D,
0x30, 0x01, 0x01, 0xB2, 0x5F, 0x63, 0x5B, 0x53, 0x41, 0x37, 0x12, 0x3D, 0x1E, 0x32, 0x15, 0x08,
0x07, 0x02, 0x0D, 0x03, 0x08, 0x3B, 0x18, 0x34, 0x46, 0x47, 0x38, 0x15, 0x00, 0x03, 0x00, 0x36,
0xFF, 0xC6, 0x02, 0xE8, 0x02, 0x78, 0x00, 0x17, 0x00, 0x85, 0x00, 0x97, 0x00, 0x00, 0x01, 0x26,
0x23, 0x22, 0x06, 0x07, 0x06, 0x15, 0x14, 0x16, 0x17, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x3E,
0x01, 0x35, 0x34, 0x27, 0x2E, 0x01, 0x27, 0x36, 0x33, 0x32, 0x16, 0x17, 0x16, 0x17, 0x16, 0x17,
0x16, 0x33, 0x32, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x15, 0x14, 0x17,
0x16, 0x33, 0x16, 0x15, 0x14, 0x07, 0x0E, 0x01, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x15, 0x14,
0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x23, 0x22, 0x07, 0x0E, 0x01, 0x15, 0x14, 0x07, 0x06, 0x23,
0x22, 0x35, 0x34, 0x27, 0x26, 0x22, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x35,
0x34, 0x27, 0x2E, 0x01, 0x27, 0x26, 0x27, 0x2E, 0x01, 0x34, 0x36, 0x37, 0x36, 0x33, 0x32, 0x36,
0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x33, 0x32,
0x37, 0x36, 0x37, 0x36, 0x17, 0x36, 0x33, 0x32, 0x17, 0x1E, 0x01, 0x15, 0x14, 0x07, 0x06, 0x23,
0x22, 0x27, 0x26, 0x35, 0x34, 0x36, 0x01, 0xE0, 0x29, 0x2A, 0x38, 0x5F, 0x1A, 0x16, 0x38, 0x33,
0x1B, 0x37, 0x0C, 0x11, 0x1C, 0x1F, 0x3A, 0x3F, 0x0A, 0x0B, 0x40, 0xA5, 0x0D, 0x28, 0x1A, 0x13,
0x09, 0x0D, 0x06, 0x05, 0x22, 0x18, 0x08, 0x07, 0x09, 0x10, 0x0D, 0x16, 0x21, 0x1D, 0x0C, 0x04,
0x0B, 0x0D, 0x0F, 0x31, 0x2D, 0x0C, 0x0E, 0x07, 0x0B, 0x08, 0x08, 0x1D, 0x1F, 0x1A, 0x10, 0x0B,
0x0A, 0x07, 0x09, 0x18, 0x15, 0x0E, 0x12, 0x14, 0x21, 0x4D, 0x22, 0x1B, 0x0C, 0x1E, 0x0E, 0x1A,
0x1F, 0x1B, 0x0B, 0x07, 0x09, 0x08, 0x0B, 0x0A, 0x11, 0x10, 0x0B, 0x06, 0x06, 0x0A, 0x0E, 0x11,
0x09, 0x0C, 0x09, 0x0B, 0x07, 0x0A, 0x15, 0x22, 0x1C, 0x10, 0x10, 0x0B, 0x07, 0x09, 0x16, 0x20,
0x05, 0x05, 0x16, 0x1B, 0x12, 0x16, 0x1A, 0x1D, 0x20, 0x2D, 0x15, 0x2C, 0x22, 0x13, 0x38, 0x22,
0x01, 0xD6, 0x12, 0x3B, 0x35, 0x2C, 0x2E, 0x34, 0x5D, 0x1E, 0x10, 0x03, 0x01, 0x0E, 0x1A, 0x5F,
0x3B, 0x2C, 0x1C, 0x1F, 0x45, 0xA6, 0x09, 0x05, 0x0A, 0x0D, 0x14, 0x11, 0x0D, 0x09, 0x06, 0x0B,
0x21, 0x1D, 0x11, 0x08, 0x21, 0x0E, 0x03, 0x08, 0x19, 0x1F, 0x02, 0x4A, 0x3B, 0x0C, 0x03, 0x0F,
0x12, 0x19, 0x05, 0x06, 0x0E, 0x0C, 0x11, 0x1C, 0x1C, 0x1D, 0x0A, 0x09, 0x0A, 0x08, 0x0B, 0x09,
0x10, 0x12, 0x13, 0x34, 0x0B, 0x10, 0x0C, 0x12, 0x21, 0x1E, 0x18, 0x0F, 0x0D, 0x07, 0x06, 0x07,
0x19, 0x16, 0x0E, 0x01, 0x02, 0x10, 0x0A, 0x15, 0x36, 0x14, 0x0A, 0x10, 0x0E, 0x16, 0x1B, 0x06,
0x04, 0x0C, 0x0E, 0x11, 0x19, 0x16, 0x25, 0x0A, 0x07, 0x0B, 0x0F, 0x16, 0x14, 0xE0, 0x0B, 0x0D,
0x0E, 0x35, 0x1F, 0x38, 0x23, 0x0F, 0x0A, 0x1F, 0x40, 0x20, 0x37, 0x00, 0x00, 0x01, 0x00, 0x36,
0x00, 0x9B, 0x02, 0xDB, 0x01, 0x90, 0x00, 0x1A, 0x00, 0x00, 0x12, 0x36, 0x33, 0x32, 0x04, 0x33,
0x32, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x14, 0x16, 0x15, 0x14, 0x06, 0x07, 0x06, 0x23,
0x22, 0x24, 0x27, 0x26, 0x35, 0x36, 0x1A, 0x07, 0x06, 0x01, 0x28, 0x05, 0x04, 0x96, 0x87, 0x12,
0x05, 0x05, 0x11, 0x02, 0x01, 0x33, 0x82, 0x8A, 0x12, 0x0E, 0xFE, 0xC6, 0x07, 0x05, 0x01, 0x76,
0x1A, 0xA8, 0x55, 0x4F, 0x03, 0x09, 0x15, 0x02, 0x07, 0x01, 0x0B, 0x21, 0x4A, 0x50, 0xB2, 0x0C,
0x08, 0x08, 0x00, 0x00, 0x00, 0x03, 0x00, 0x36, 0x00, 0x8E, 0x01, 0xBE, 0x00, 0xD5, 0x00, 0x0E,
0x00, 0x1C, 0x00, 0x27, 0x00, 0x00, 0x3E, 0x01, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06,
0x23, 0x22, 0x27, 0x26, 0x35, 0x37, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x27,
0x26, 0x35, 0x34, 0x17, 0x35, 0x34, 0x32, 0x1D, 0x01, 0x06, 0x23, 0x22, 0x27, 0x26, 0x36, 0x10,
0x0D, 0x16, 0x0B, 0x08, 0x06, 0x0C, 0x17, 0x0D, 0x07, 0x09, 0xA8, 0x0E, 0x0F, 0x0D, 0x1D, 0x1C,
0x11, 0x14, 0x09, 0x09, 0xAE, 0x3E, 0x03, 0x17, 0x07, 0x09, 0x13, 0xC5, 0x10, 0x11, 0x0D, 0x05,
0x06, 0x0A, 0x14, 0x07, 0x07, 0x16, 0x12, 0x11, 0x19, 0x0B, 0x0F, 0x13, 0x0D, 0x0E, 0x04, 0x06,
0x07, 0x08, 0x20, 0x1F, 0x08, 0x1F, 0x03, 0x07, 0x00, 0x09, 0x00, 0x33, 0x00, 0x94, 0x01, 0xBD,
0x02, 0x1E, 0x00, 0x0F, 0x00, 0x1D, 0x00, 0x2D, 0x00, 0x36, 0x00, 0x42, 0x00, 0x51, 0x00, 0x65,
0x00, 0x72, 0x00, 0x82, 0x00, 0x00, 0x13, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06,
0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x22,
0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22,
0x27, 0x26, 0x35, 0x34, 0x04, 0x36, 0x32, 0x16, 0x14, 0x06, 0x23, 0x22, 0x26, 0x37, 0x36, 0x33,
0x32, 0x16, 0x15, 0x14, 0x06, 0x22, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x14,
0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x05, 0x3E, 0x03, 0x33, 0x37, 0x17, 0x1E, 0x01,
0x17, 0x1E, 0x01, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x16, 0x15,
0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23,
0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x42, 0x0E, 0x14, 0x15, 0x0E, 0x0D, 0x07, 0x0B, 0x1F,
0x0D, 0x09, 0x1A, 0xA2, 0x0E, 0x2A, 0x0E, 0x0D, 0x07, 0x0C, 0x3A, 0x0C, 0x07, 0xA9, 0x06, 0x10,
0x19, 0x0E, 0x0F, 0x1B, 0x0C, 0x08, 0x1A, 0x0F, 0x06, 0xFE, 0xD4, 0x22, 0x20, 0x1F, 0x1F, 0x10,
0x16, 0x1C, 0xA2, 0x0E, 0x15, 0x13, 0x1D, 0x22, 0x1C, 0x22, 0xB0, 0x10, 0x07, 0x0D, 0x10, 0x11,
0x11, 0x10, 0x0B, 0x05, 0x12, 0x19, 0xFE, 0xEF, 0x02, 0x04, 0x03, 0x03, 0x01, 0x01, 0x03, 0x03,
0x0A, 0x04, 0x0D, 0x15, 0x1F, 0x10, 0x16, 0x1B, 0xB5, 0x07, 0x08, 0x13, 0x1D, 0x1F, 0x10, 0x16,
0x1A, 0xAC, 0x0B, 0x0E, 0x13, 0x1C, 0x1D, 0x13, 0x17, 0x0F, 0x09, 0x05, 0x0A, 0x02, 0x0F, 0x0F,
0x11, 0x10, 0x0B, 0x06, 0x11, 0x19, 0x05, 0x0E, 0x18, 0x11, 0x0F, 0x11, 0x11, 0x10, 0x0B, 0x07,
0x10, 0x1A, 0x1A, 0x11, 0x06, 0x0B, 0x19, 0x07, 0x0D, 0x0F, 0x12, 0x1B, 0x0D, 0x05, 0x1D, 0x0B,
0x08, 0x0E, 0x92, 0x1C, 0x21, 0x20, 0x20, 0x1F, 0x31, 0x11, 0x1E, 0x13, 0x0E, 0x22, 0x22, 0x0E,
0x10, 0x19, 0x07, 0x0D, 0x0E, 0x2A, 0x0E, 0x0D, 0x07, 0x0C, 0x1E, 0x1D, 0x8A, 0x01, 0x03, 0x01,
0x02, 0x01, 0x01, 0x01, 0x03, 0x01, 0x04, 0x1E, 0x1C, 0x1D, 0x1B, 0x12, 0x1D, 0x0F, 0x03, 0x1E,
0x15, 0x0E, 0x1B, 0x1B, 0x12, 0x20, 0x07, 0x07, 0x1A, 0x12, 0x14, 0x19, 0x13, 0x0C, 0x07, 0x05,
0x0D, 0x16, 0x00, 0x00, 0x00, 0x06, 0x00, 0x36, 0x00, 0x9A, 0x02, 0xA1, 0x01, 0xEA, 0x00, 0x0B,
0x00, 0x1E, 0x00, 0x42, 0x00, 0x65, 0x00, 0x70, 0x00, 0x7F, 0x00, 0x00, 0x01, 0x26, 0x23, 0x22,
0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x27, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x14,
0x06, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x07, 0x36, 0x33, 0x32, 0x17,
0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x1D, 0x01,
0x23, 0x35, 0x34, 0x36, 0x37, 0x36, 0x33, 0x32, 0x36, 0x34, 0x22, 0x27, 0x26, 0x35, 0x34, 0x25,
0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x06, 0x22, 0x15, 0x14, 0x17, 0x16, 0x17, 0x1E, 0x01,
0x1D, 0x01, 0x22, 0x26, 0x2F, 0x01, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x26, 0x23, 0x22,
0x26, 0x34, 0x07, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x33, 0x32, 0x35, 0x34, 0x27, 0x3E, 0x01,
0x33, 0x32, 0x16, 0x17, 0x16, 0x1D, 0x01, 0x07, 0x21, 0x35, 0x3E, 0x01, 0x01, 0x87, 0x04, 0x14,
0x1D, 0x14, 0x0B, 0x0A, 0x0D, 0x44, 0x11, 0x19, 0x18, 0x12, 0x29, 0x01, 0x06, 0x0E, 0x12, 0x18,
0x0D, 0x08, 0x0A, 0x15, 0x34, 0xA1, 0x0C, 0x14, 0x1B, 0x0A, 0x0C, 0x0F, 0x10, 0x08, 0x06, 0x01,
0x07, 0x08, 0x04, 0x07, 0x6E, 0x07, 0x10, 0x15, 0x0C, 0x0E, 0x1B, 0x12, 0x0E, 0x0C, 0x01, 0xB3,
0x0C, 0x14, 0x1C, 0x0D, 0x0D, 0x1A, 0x14, 0x1A, 0x15, 0x18, 0x0E, 0x06, 0x11, 0x43, 0x10, 0x02,
0x02, 0x06, 0x03, 0x08, 0x08, 0x01, 0x09, 0x0F, 0x15, 0x5A, 0x15, 0x2F, 0x23, 0x37, 0x79, 0x39,
0xBF, 0x1A, 0x22, 0x21, 0x28, 0x25, 0x28, 0x33, 0x02, 0xFE, 0xBE, 0x01, 0x18, 0x01, 0xA2, 0x0E,
0x15, 0x0A, 0x14, 0x0F, 0x0C, 0x07, 0x42, 0x09, 0x09, 0x16, 0x3A, 0x18, 0x11, 0x0B, 0x0F, 0x0A,
0x05, 0x09, 0x17, 0x34, 0x37, 0x5D, 0x09, 0x0C, 0x0D, 0x16, 0x1B, 0x0B, 0x0C, 0x04, 0x08, 0x08,
0x0A, 0x08, 0x0D, 0x14, 0x1C, 0x17, 0x25, 0x1A, 0x0F, 0x0B, 0x0E, 0x09, 0x0A, 0x12, 0x0F, 0x13,
0x17, 0x0A, 0x0D, 0x12, 0x10, 0x0F, 0x0D, 0x24, 0x04, 0x07, 0x05, 0x03, 0x0D, 0x09, 0x0E, 0x1C,
0x28, 0x03, 0x01, 0x13, 0x1B, 0x15, 0x0D, 0x08, 0x09, 0x0A, 0x09, 0x03, 0x1F, 0x28, 0x6D, 0x0C,
0x0D, 0x0B, 0x0D, 0x05, 0x07, 0x40, 0x0C, 0x08, 0x09, 0x14, 0x17, 0x40, 0x09, 0x1B, 0x27, 0x26,
0x24, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x36, 0x00, 0x90, 0x02, 0x40, 0x02, 0x90, 0x00, 0x0D,
0x00, 0x18, 0x00, 0x2C, 0x00, 0x54, 0x00, 0x63, 0x00, 0x70, 0x00, 0x87, 0x00, 0x00, 0x01, 0x22,
0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x34, 0x23, 0x22,
0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x25, 0x37, 0x07, 0x0E, 0x01, 0x07, 0x0E, 0x01, 0x14,
0x17, 0x1E, 0x05, 0x33, 0x32, 0x37, 0x36, 0x27, 0x36, 0x3B, 0x01, 0x1F, 0x01, 0x15, 0x14, 0x06,
0x0F, 0x01, 0x17, 0x16, 0x15, 0x14, 0x07, 0x0E, 0x01, 0x23, 0x22, 0x27, 0x2E, 0x01, 0x27, 0x26,
0x35, 0x34, 0x3F, 0x01, 0x17, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x3E, 0x01, 0x33, 0x32, 0x07,
0x36, 0x33, 0x32, 0x17, 0x1E, 0x01, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x07, 0x26,
0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x33, 0x32, 0x36, 0x35, 0x34, 0x27, 0x36, 0x33, 0x32, 0x16,
0x15, 0x14, 0x07, 0x0E, 0x01, 0x07, 0x06, 0x23, 0x22, 0x2F, 0x01, 0x34, 0x35, 0x34, 0x36, 0x37,
0x3E, 0x01, 0x01, 0x96, 0x09, 0x1A, 0x17, 0x05, 0x0A, 0x05, 0x02, 0x1B, 0x17, 0xBB, 0x12, 0x0E,
0x2E, 0x1F, 0x08, 0x04, 0x23, 0x01, 0x1A, 0x05, 0x16, 0x2A, 0x69, 0x22, 0x16, 0x31, 0x23, 0x03,
0x0B, 0x04, 0x07, 0x05, 0x05, 0x03, 0x0C, 0x3B, 0x6B, 0x25, 0x07, 0x28, 0x0F, 0x34, 0x02, 0x2D,
0x25, 0x1D, 0x08, 0x04, 0x02, 0x0A, 0x6A, 0x08, 0x0C, 0x08, 0x20, 0x5D, 0x49, 0x4A, 0x3D, 0x39,
0x21, 0x25, 0x0D, 0x03, 0x04, 0x0D, 0x1D, 0x18, 0x5A, 0x11, 0x08, 0x47, 0x0F, 0x15, 0x0A, 0x09,
0x06, 0x10, 0x23, 0x0A, 0x0C, 0x22, 0xB2, 0x0B, 0x22, 0x09, 0x09, 0x0C, 0x02, 0x0D, 0x25, 0x2D,
0x05, 0x09, 0x24, 0x2F, 0x01, 0x04, 0x2D, 0x32, 0x1D, 0x1B, 0x18, 0x03, 0x01, 0x0F, 0x07, 0x07,
0x2B, 0x01, 0x37, 0x10, 0x0F, 0x07, 0x04, 0x0D, 0x15, 0x17, 0x14, 0x0E, 0x13, 0xBA, 0x04, 0x26,
0x0B, 0x05, 0x11, 0x3D, 0x4D, 0x1F, 0x01, 0x01, 0x33, 0x24, 0x17, 0x49, 0x14, 0x23, 0x03, 0x0A,
0x05, 0x06, 0x02, 0x02, 0x28, 0x49, 0xCF, 0x05, 0x02, 0x1D, 0x0E, 0x31, 0x76, 0x31, 0x27, 0x28,
0x13, 0x11, 0x0A, 0x06, 0x11, 0x67, 0x19, 0x58, 0x6A, 0x1F, 0x1F, 0x0A, 0x05, 0x3D, 0x3C, 0x03,
0x04, 0x04, 0x01, 0x1A, 0x16, 0x2F, 0x7F, 0x12, 0x06, 0x05, 0x1D, 0x07, 0x09, 0x1E, 0x1E, 0x0B,
0x0A, 0xF7, 0x11, 0x11, 0x12, 0x0B, 0x0C, 0x02, 0x1E, 0x0A, 0x02, 0x4B, 0x01, 0x2F, 0x23, 0x09,
0x05, 0x1E, 0x23, 0x0E, 0x08, 0x08, 0x02, 0x02, 0x02, 0x10, 0x4E, 0x10, 0x12, 0x26, 0x00, 0x00,
0x00, 0x03, 0x00, 0x35, 0x00, 0x8A, 0x02, 0x1C, 0x02, 0x70, 0x00, 0x10, 0x00, 0x32, 0x00, 0x52,
0x00, 0x00, 0x13, 0x26, 0x23, 0x22, 0x15, 0x14, 0x17, 0x1E, 0x01, 0x33, 0x32, 0x35, 0x34, 0x27,
0x26, 0x35, 0x34, 0x37, 0x26, 0x22, 0x07, 0x06, 0x0F, 0x02, 0x0E, 0x01, 0x07, 0x0E, 0x01, 0x0F,
0x01, 0x33, 0x32, 0x17, 0x16, 0x17, 0x1E, 0x01, 0x17, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36,
0x35, 0x34, 0x27, 0x26, 0x27, 0x3E, 0x01, 0x33, 0x32, 0x16, 0x33, 0x1E, 0x01, 0x17, 0x1E, 0x01,
0x15, 0x14, 0x06, 0x07, 0x0E, 0x01, 0x23, 0x22, 0x26, 0x27, 0x2E, 0x01, 0x27, 0x26, 0x35, 0x34,
0x37, 0x36, 0x37, 0x36, 0xA4, 0x32, 0x04, 0x0A, 0x15, 0x16, 0x4D, 0x1F, 0x11, 0x15, 0x20, 0xBE,
0x11, 0x0C, 0x05, 0x0E, 0x30, 0x20, 0x02, 0x02, 0x0D, 0x1B, 0x13, 0x09, 0x02, 0x02, 0x52, 0x51,
0x04, 0x05, 0x04, 0x03, 0x06, 0x0F, 0x14, 0x08, 0x07, 0x07, 0x0D, 0x11, 0x13, 0x11, 0x1F, 0xFC,
0x1C, 0x19, 0x17, 0x04, 0x14, 0x07, 0x2A, 0x23, 0x1D, 0x3E, 0x49, 0x49, 0x42, 0x20, 0x21, 0x28,
0x27, 0x20, 0x20, 0x30, 0x33, 0x17, 0x12, 0x01, 0x01, 0x12, 0x26, 0x01, 0x68, 0x32, 0x1B, 0x2D,
0x2C, 0x2A, 0x3E, 0x0E, 0x10, 0x0C, 0x14, 0x2C, 0x0F, 0xEC, 0x0C, 0x0E, 0x24, 0x03, 0x01, 0x1E,
0x1B, 0x0D, 0x04, 0x03, 0x08, 0x0E, 0x16, 0x07, 0x09, 0x2A, 0x20, 0x0B, 0x01, 0x02, 0x0A, 0x08,
0x21, 0x24, 0x32, 0x2F, 0x22, 0x3B, 0x52, 0x0E, 0x07, 0x01, 0x02, 0x07, 0x0E, 0x1F, 0x76, 0x45,
0x4A, 0x74, 0x20, 0x0F, 0x07, 0x07, 0x0F, 0x17, 0x35, 0x32, 0x25, 0x20, 0x13, 0x0D, 0x39, 0x26,
0x50, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x36, 0x00, 0x9E, 0x02, 0x78, 0x02, 0x30, 0x00, 0x1B,
0x00, 0x35, 0x00, 0x44, 0x00, 0x55, 0x00, 0x00, 0x01, 0x26, 0x27, 0x22, 0x26, 0x23, 0x22, 0x06,
0x07, 0x0E, 0x01, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x3E, 0x01, 0x37, 0x34,
0x36, 0x35, 0x34, 0x26, 0x27, 0x36, 0x33, 0x32, 0x17, 0x1E, 0x01, 0x1F, 0x01, 0x07, 0x0E, 0x01,
0x07, 0x06, 0x23, 0x22, 0x27, 0x2E, 0x01, 0x2F, 0x01, 0x37, 0x36, 0x37, 0x3E, 0x01, 0x17, 0x26,
0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x36, 0x33,
0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x01, 0xBF,
0x1E, 0x3D, 0x06, 0x15, 0x04, 0x21, 0x29, 0x1F, 0x1D, 0x45, 0x04, 0x01, 0x39, 0x4C, 0x5C, 0x3A,
0x39, 0x18, 0x52, 0x04, 0x01, 0x49, 0xDC, 0x23, 0x1E, 0x3E, 0x53, 0x1B, 0x56, 0x0F, 0x13, 0x13,
0x10, 0x40, 0x1E, 0x4A, 0x57, 0x54, 0x4A, 0x1E, 0x42, 0x10, 0x12, 0x13, 0x10, 0x2E, 0x25, 0x36,
0x9D, 0x0B, 0x3C, 0x0D, 0x14, 0x17, 0x0E, 0x1B, 0x1E, 0x0F, 0x11, 0x77, 0x19, 0x14, 0x0B, 0x07,
0x45, 0x1D, 0x0B, 0x46, 0x2E, 0x1E, 0x1D, 0x38, 0x01, 0xE2, 0x10, 0x01, 0x01, 0x0C, 0x10, 0x10,
0x45, 0x13, 0x02, 0x04, 0x22, 0x31, 0x44, 0x1B, 0x0C, 0x51, 0x10, 0x01, 0x04, 0x01, 0x1A, 0x4F,
0x5C, 0x0A, 0x27, 0x0D, 0x55, 0x1D, 0x24, 0x24, 0x1E, 0x44, 0x13, 0x2F, 0x2E, 0x13, 0x46, 0x1E,
0x23, 0x24, 0x22, 0x2A, 0x23, 0x1F, 0x80, 0x09, 0x0E, 0x17, 0x1B, 0x1E, 0x0F, 0x0A, 0x0C, 0x0F,
0x1F, 0x23, 0x44, 0x0F, 0x01, 0x06, 0x3C, 0x16, 0x1B, 0x2F, 0x45, 0x12, 0x24, 0x3E, 0x41, 0x00,
0x00, 0x02, 0x00, 0x36, 0x00, 0xB7, 0x02, 0x51, 0x02, 0x05, 0x00, 0x14, 0x00, 0x25, 0x00, 0x00,
0x13, 0x3E, 0x01, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x06, 0x0F, 0x01, 0x17, 0x16, 0x15, 0x14,
0x06, 0x22, 0x26, 0x35, 0x34, 0x25, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26,
0x35, 0x34, 0x3F, 0x01, 0x27, 0x26, 0x87, 0x32, 0x1D, 0x08, 0x03, 0x06, 0x16, 0x18, 0x23, 0x41,
0x3F, 0x3F, 0x21, 0x0C, 0x9C, 0x01, 0x58, 0x16, 0x14, 0x99, 0x9C, 0x06, 0x08, 0x19, 0x3C, 0x3C,
0x3C, 0x3C, 0x01, 0xBA, 0x31, 0x1A, 0x04, 0x0E, 0x0A, 0x09, 0x1C, 0x23, 0x41, 0x3F, 0x3F, 0x07,
0x05, 0x1F, 0xA3, 0x07, 0x0A, 0x76, 0x0A, 0x17, 0x97, 0x0A, 0x07, 0xA3, 0x1C, 0x08, 0x0D, 0x3C,
0x3D, 0x3B, 0x3C, 0x00, 0x00, 0x0D, 0x00, 0x33, 0x00, 0x94, 0x02, 0x4E, 0x02, 0x18, 0x00, 0x0B,
0x00, 0x23, 0x00, 0x2F, 0x00, 0x3B, 0x00, 0x48, 0x00, 0x55, 0x00, 0x60, 0x00, 0x6C, 0x00, 0x7B,
0x00, 0x86, 0x00, 0x97, 0x00, 0xA7, 0x00, 0xB3, 0x00, 0x00, 0x01, 0x2F, 0x01, 0x23, 0x22, 0x07,
0x06, 0x1D, 0x01, 0x1F, 0x02, 0x01, 0x36, 0x33, 0x32, 0x17, 0x1E, 0x01, 0x1F, 0x01, 0x11, 0x0E,
0x01, 0x07, 0x21, 0x2E, 0x01, 0x27, 0x3D, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x17, 0x34, 0x36,
0x33, 0x32, 0x16, 0x15, 0x14, 0x23, 0x22, 0x27, 0x26, 0x37, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14,
0x2B, 0x01, 0x26, 0x35, 0x34, 0x37, 0x36, 0x17, 0x1E, 0x01, 0x17, 0x15, 0x14, 0x2B, 0x01, 0x26,
0x35, 0x34, 0x37, 0x36, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x3E,
0x01, 0x17, 0x16, 0x15, 0x14, 0x23, 0x22, 0x27, 0x26, 0x35, 0x05, 0x36, 0x33, 0x32, 0x15, 0x14,
0x06, 0x23, 0x22, 0x26, 0x27, 0x26, 0x37, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x07, 0x06, 0x2B,
0x01, 0x2E, 0x01, 0x27, 0x26, 0x3E, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x07, 0x06, 0x27, 0x26,
0x37, 0x36, 0x33, 0x32, 0x16, 0x33, 0x1E, 0x01, 0x15, 0x14, 0x06, 0x07, 0x23, 0x22, 0x26, 0x35,
0x34, 0x17, 0x34, 0x26, 0x35, 0x34, 0x33, 0x32, 0x16, 0x33, 0x1E, 0x01, 0x14, 0x06, 0x23, 0x22,
0x26, 0x05, 0x36, 0x33, 0x32, 0x17, 0x16, 0x0F, 0x03, 0x27, 0x26, 0x02, 0x19, 0x02, 0xD5, 0x47,
0x8E, 0x03, 0x02, 0x02, 0xD8, 0xD8, 0xFE, 0x57, 0x11, 0x73, 0x99, 0x5D, 0x30, 0x19, 0x0A, 0x10,
0x05, 0x16, 0x06, 0xFE, 0x27, 0x06, 0x16, 0x05, 0x09, 0x07, 0x1C, 0x05, 0x23, 0x0A, 0x12, 0x0C,
0x06, 0x12, 0x02, 0x0A, 0x10, 0x51, 0x04, 0x11, 0x0D, 0x16, 0x1E, 0x07, 0x16, 0x51, 0x04, 0x18,
0x0F, 0x09, 0x02, 0x1C, 0x07, 0x16, 0x5C, 0x08, 0x11, 0x13, 0x09, 0x06, 0x08, 0x0B, 0x11, 0x54,
0x0A, 0x10, 0x12, 0x14, 0x04, 0x08, 0x0C, 0xFE, 0xC6, 0x0B, 0x07, 0x0E, 0x06, 0x0E, 0x0C, 0x07,
0x02, 0x03, 0x56, 0x08, 0x09, 0x0B, 0x14, 0x03, 0x07, 0x10, 0x05, 0x0D, 0x08, 0x01, 0x02, 0x4F,
0x0E, 0x0F, 0x0D, 0x10, 0x16, 0x14, 0x08, 0x08, 0x56, 0x04, 0x0E, 0x01, 0x05, 0x02, 0x0E, 0x06,
0x06, 0x0B, 0x05, 0x0B, 0x0E, 0x54, 0x01, 0x0A, 0x01, 0x07, 0x03, 0x0E, 0x07, 0x06, 0x0D, 0x0E,
0x07, 0xFE, 0xFA, 0x07, 0x6E, 0x6A, 0x0A, 0x08, 0x02, 0x02, 0x76, 0x77, 0x04, 0x05, 0x01, 0x54,
0x8B, 0x02, 0x08, 0x08, 0x4B, 0x36, 0x82, 0x02, 0x01, 0x01, 0x4B, 0x02, 0x02, 0x01, 0x04, 0x0B,
0x10, 0xFE, 0xBD, 0x05, 0x15, 0x05, 0x05, 0x15, 0x05, 0xA1, 0x11, 0x83, 0x16, 0x12, 0x04, 0x01,
0x6E, 0x12, 0x08, 0x07, 0x0F, 0x1D, 0x02, 0x04, 0x24, 0x0A, 0x0D, 0x0A, 0x1C, 0x02, 0x17, 0x08,
0x08, 0x09, 0x01, 0x01, 0x07, 0x0B, 0x05, 0x19, 0x02, 0x17, 0x08, 0x0A, 0x08, 0x02, 0x03, 0x15,
0x0C, 0x08, 0x05, 0x11, 0x0A, 0x09, 0x05, 0x0A, 0x02, 0x01, 0x19, 0x17, 0x02, 0x05, 0x16, 0x41,
0x08, 0x1D, 0x12, 0x08, 0x07, 0x0D, 0x12, 0x08, 0x09, 0x13, 0x0D, 0x07, 0x06, 0x0C, 0x01, 0x07,
0x0C, 0x15, 0x02, 0x0E, 0x13, 0x0C, 0x17, 0x03, 0x02, 0x08, 0x07, 0x16, 0x10, 0x01, 0x01, 0x08,
0x10, 0x0E, 0x09, 0x02, 0x0F, 0x0B, 0x06, 0x05, 0x03, 0x09, 0x01, 0x0B, 0x01, 0x02, 0x07, 0x20,
0x07, 0x08, 0x2F, 0x0A, 0x06, 0x05, 0x13, 0x13, 0x02, 0x01, 0x10, 0x11, 0x00, 0x02, 0x00, 0x35,
0xFF, 0xE5, 0x02, 0x95, 0x02, 0x43, 0x00, 0x16, 0x00, 0x47, 0x00, 0x00, 0x01, 0x26, 0x27, 0x22,
0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x36, 0x37, 0x36, 0x35, 0x34,
0x26, 0x27, 0x26, 0x27, 0x36, 0x33, 0x32, 0x17, 0x1E, 0x01, 0x17, 0x16, 0x15, 0x14, 0x0F, 0x01,
0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x2E, 0x01, 0x23,
0x22, 0x07, 0x06, 0x07, 0x06, 0x07, 0x22, 0x26, 0x27, 0x2E, 0x01, 0x27, 0x26, 0x35, 0x34, 0x37,
0x3E, 0x01, 0x33, 0x32, 0x01, 0x54, 0x19, 0x23, 0x03, 0x08, 0x02, 0x46, 0x27, 0x15, 0x3B, 0x18,
0x34, 0x21, 0x1B, 0x10, 0x38, 0x07, 0x0C, 0x11, 0x92, 0x09, 0x1E, 0x27, 0x23, 0x2E, 0x4B, 0x14,
0x0D, 0x11, 0x0F, 0x5C, 0x64, 0x06, 0x06, 0x0D, 0x14, 0x0B, 0x11, 0x5A, 0x06, 0x03, 0x3E, 0x27,
0x09, 0x05, 0x06, 0x13, 0x08, 0x07, 0x43, 0x2D, 0x21, 0x18, 0x1F, 0x22, 0x14, 0x27, 0x2B, 0x13,
0x45, 0x10, 0x0A, 0x01, 0xDA, 0x0E, 0x04, 0x01, 0x40, 0x23, 0x27, 0x49, 0x25, 0x10, 0x06, 0x0A,
0x26, 0x4A, 0x1D, 0x1B, 0x12, 0x1B, 0x73, 0x06, 0x0A, 0x0D, 0x45, 0x2F, 0x1E, 0x2F, 0x35, 0x27,
0x25, 0x5C, 0x65, 0x09, 0x08, 0x05, 0x03, 0x11, 0x1A, 0x58, 0x05, 0x03, 0x3E, 0x22, 0x03, 0x08,
0x06, 0x04, 0x02, 0x06, 0x0C, 0x10, 0x1D, 0x1B, 0x38, 0x46, 0x48, 0x3C, 0x19, 0x33, 0x00, 0x00,
0x00, 0x05, 0x00, 0x35, 0x00, 0x65, 0x01, 0xD5, 0x02, 0x77, 0x00, 0x0C, 0x00, 0x1B, 0x00, 0x27,
0x00, 0x5B, 0x00, 0x89, 0x00, 0x00, 0x01, 0x26, 0x23, 0x22, 0x06, 0x14, 0x16, 0x37, 0x36, 0x16,
0x32, 0x35, 0x34, 0x37, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36,
0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x15, 0x14, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x27, 0x36,
0x33, 0x32, 0x17, 0x1E, 0x01, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x17, 0x16, 0x14, 0x07, 0x0E,
0x01, 0x2B, 0x01, 0x15, 0x14, 0x23, 0x22, 0x34, 0x22, 0x14, 0x22, 0x34, 0x22, 0x14, 0x23, 0x22,
0x3D, 0x01, 0x23, 0x22, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x27, 0x26, 0x35, 0x34, 0x37,
0x3E, 0x01, 0x03, 0x35, 0x33, 0x32, 0x16, 0x15, 0x14, 0x16, 0x33, 0x32, 0x14, 0x32, 0x34, 0x32,
0x14, 0x32, 0x34, 0x33, 0x32, 0x37, 0x3E, 0x01, 0x35, 0x34, 0x36, 0x3B, 0x01, 0x15, 0x14, 0x07,
0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x22, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26,
0x01, 0x15, 0x09, 0x08, 0x05, 0x1A, 0x11, 0x07, 0x0A, 0x06, 0x12, 0x7D, 0x0A, 0x14, 0x19, 0x2E,
0x09, 0x08, 0x20, 0x23, 0x0E, 0x0F, 0xF1, 0x1E, 0x13, 0x23, 0x3E, 0x1D, 0x15, 0x0A, 0x21, 0x20,
0x41, 0x35, 0x1D, 0x1C, 0x3F, 0x0D, 0x11, 0x06, 0x08, 0x07, 0x08, 0x10, 0x0B, 0x15, 0x21, 0x31,
0x1B, 0x0C, 0x1A, 0x1A, 0x1A, 0x0C, 0x1B, 0x31, 0x21, 0x14, 0x0B, 0x11, 0x07, 0x07, 0x08, 0x06,
0x13, 0x0E, 0x35, 0x22, 0x14, 0x0E, 0x05, 0x1D, 0x1A, 0x17, 0x1A, 0x1A, 0x1A, 0x13, 0x12, 0x0C,
0x0B, 0x12, 0x06, 0x0D, 0x14, 0x07, 0x06, 0x2B, 0x26, 0x0B, 0x04, 0x12, 0x14, 0x12, 0x14, 0x12,
0x03, 0x0D, 0x28, 0x2E, 0x03, 0x04, 0x01, 0x4B, 0x0E, 0x27, 0x0E, 0x03, 0x06, 0x08, 0x10, 0x0F,
0x10, 0x6B, 0x0A, 0x1C, 0x11, 0x14, 0x09, 0x09, 0x0A, 0x09, 0x18, 0x13, 0x08, 0x0F, 0x2D, 0x28,
0x11, 0x18, 0x09, 0x0B, 0xCD, 0x0D, 0x0A, 0x09, 0x36, 0x1B, 0x20, 0x39, 0x1C, 0x07, 0x0A, 0x07,
0x08, 0x38, 0x10, 0x0B, 0x05, 0x20, 0x2E, 0x1A, 0x1A, 0x1A, 0x1A, 0x2E, 0x20, 0x05, 0x0B, 0x11,
0x1C, 0x11, 0x0D, 0x0E, 0x09, 0x06, 0x17, 0x3A, 0x24, 0x1C, 0x30, 0xFE, 0x83, 0x2A, 0x08, 0x16,
0x1C, 0x21, 0x1A, 0x1A, 0x1A, 0x1A, 0x04, 0x04, 0x28, 0x14, 0x10, 0x07, 0x2B, 0x2D, 0x0A, 0x0B,
0x1F, 0x1B, 0x04, 0x04, 0x04, 0x04, 0x1E, 0x21, 0x0A, 0x0C, 0x00, 0x00, 0x00, 0x03, 0x00, 0x33,
0x00, 0xB1, 0x01, 0xD4, 0x01, 0xDA, 0x00, 0x0E, 0x00, 0x1E, 0x00, 0x2D, 0x00, 0x00, 0x13, 0x36,
0x3B, 0x01, 0x17, 0x15, 0x14, 0x06, 0x07, 0x06, 0x2B, 0x01, 0x27, 0x35, 0x34, 0x17, 0x36, 0x33,
0x32, 0x17, 0x32, 0x15, 0x14, 0x07, 0x06, 0x21, 0x22, 0x27, 0x22, 0x35, 0x34, 0x17, 0x36, 0x33,
0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x20, 0x27, 0x26, 0x35, 0x34, 0x39, 0x03, 0x7C, 0x4E,
0xCA, 0x06, 0x0A, 0x0E, 0x70, 0x50, 0xBE, 0x03, 0x01, 0xBE, 0xC5, 0x11, 0x08, 0x08, 0x05, 0xFE,
0xF4, 0x6E, 0x14, 0x05, 0x0C, 0x09, 0x86, 0xEF, 0x0D, 0x09, 0x0F, 0x14, 0xFE, 0xA6, 0x14, 0x10,
0x01, 0xD7, 0x03, 0x02, 0x19, 0x11, 0x0A, 0x02, 0x02, 0x02, 0x18, 0x1A, 0x73, 0x01, 0x01, 0x17,
0x16, 0x05, 0x04, 0x01, 0x20, 0x12, 0x74, 0x03, 0x05, 0x04, 0x16, 0x15, 0x04, 0x04, 0x04, 0x04,
0x18, 0x15, 0x00, 0x00, 0x00, 0x03, 0x00, 0x33, 0x00, 0x63, 0x01, 0xBF, 0x02, 0x77, 0x00, 0x0D,
0x00, 0x1D, 0x00, 0x2D, 0x00, 0x00, 0x13, 0x36, 0x3B, 0x01, 0x15, 0x07, 0x06, 0x23, 0x22, 0x2F,
0x01, 0x35, 0x3E, 0x01, 0x17, 0x35, 0x33, 0x1E, 0x01, 0x15, 0x14, 0x07, 0x22, 0x0E, 0x01, 0x23,
0x06, 0x23, 0x22, 0x27, 0x07, 0x36, 0x33, 0x32, 0x17, 0x32, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22,
0x27, 0x26, 0x3D, 0x01, 0x8F, 0x24, 0x1A, 0x1C, 0x39, 0x10, 0x23, 0x1F, 0x09, 0x22, 0x01, 0x31,
0xA4, 0x1C, 0x3C, 0x5E, 0x04, 0x01, 0x0A, 0x0F, 0x06, 0x06, 0x19, 0x24, 0x12, 0xFE, 0x07, 0x77,
0xE7, 0x0E, 0x04, 0x0E, 0x2F, 0x85, 0x8D, 0x2F, 0x0E, 0x02, 0x66, 0x11, 0xC1, 0x04, 0x02, 0x02,
0x04, 0x21, 0x2D, 0x4D, 0x9B, 0xC1, 0x01, 0x61, 0x3E, 0x22, 0x01, 0x02, 0x02, 0x01, 0x02, 0x22,
0x01, 0x02, 0x53, 0x50, 0x20, 0x68, 0x68, 0x20, 0x4F, 0x53, 0x00, 0x00, 0x00, 0x02, 0x00, 0x35,
0x00, 0x5F, 0x02, 0x27, 0x02, 0x84, 0x00, 0x1E, 0x00, 0x41, 0x00, 0x00, 0x12, 0x34, 0x36, 0x33,
0x32, 0x1F, 0x02, 0x1E, 0x01, 0x17, 0x16, 0x15, 0x14, 0x07, 0x0E, 0x01, 0x23, 0x22, 0x3F, 0x01,
0x36, 0x34, 0x27, 0x26, 0x2F, 0x01, 0x07, 0x06, 0x23, 0x22, 0x27, 0x36, 0x33, 0x32, 0x15, 0x14,
0x07, 0x06, 0x15, 0x14, 0x16, 0x17, 0x16, 0x1F, 0x01, 0x37, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14,
0x0F, 0x01, 0x27, 0x26, 0x27, 0x26, 0x27, 0x2E, 0x01, 0x27, 0x26, 0x35, 0x34, 0xBF, 0x64, 0x05,
0x04, 0x02, 0x02, 0x34, 0x36, 0x46, 0x1C, 0x2B, 0x03, 0x04, 0x23, 0x0B, 0x09, 0x0B, 0x03, 0x0E,
0x0E, 0x38, 0x6E, 0x21, 0x02, 0x02, 0x04, 0x05, 0xCA, 0x09, 0x04, 0x03, 0x08, 0x0A, 0x0A, 0x1B,
0x3B, 0x56, 0x1D, 0x02, 0x02, 0x04, 0x05, 0x64, 0x35, 0x36, 0x02, 0x02, 0x06, 0x06, 0x26, 0x3C,
0x6A, 0x14, 0x0B, 0x02, 0x14, 0x0A, 0x66, 0x25, 0x25, 0x08, 0x08, 0x20, 0x1F, 0x2E, 0x2D, 0x0C,
0x0C, 0x17, 0x35, 0x10, 0x04, 0x14, 0x38, 0x14, 0x4F, 0x08, 0x02, 0x25, 0x26, 0x05, 0x09, 0x04,
0x08, 0x0C, 0x0F, 0x23, 0x18, 0x14, 0x1A, 0x38, 0x04, 0x02, 0x26, 0x25, 0x66, 0x06, 0x05, 0x35,
0x34, 0x21, 0x20, 0x08, 0x07, 0x04, 0x05, 0x40, 0x2C, 0x19, 0x19, 0x34, 0x00, 0x04, 0x00, 0x36,
0x00, 0x5C, 0x01, 0xCE, 0x02, 0x42, 0x00, 0x14, 0x00, 0x20, 0x00, 0x58, 0x00, 0x63, 0x00, 0x00,
0x13, 0x36, 0x33, 0x32, 0x17, 0x1E, 0x01, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x22, 0x27, 0x26,
0x35, 0x34, 0x37, 0x3E, 0x01, 0x13, 0x2E, 0x01, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x33, 0x32,
0x36, 0x27, 0x34, 0x32, 0x15, 0x14, 0x16, 0x33, 0x32, 0x37, 0x33, 0x32, 0x16, 0x15, 0x14, 0x07,
0x06, 0x15, 0x14, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x27, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14,
0x22, 0x35, 0x34, 0x26, 0x23, 0x22, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x34, 0x37, 0x36, 0x35,
0x34, 0x27, 0x26, 0x36, 0x17, 0x16, 0x33, 0x32, 0x36, 0x27, 0x36, 0x33, 0x32, 0x16, 0x1F, 0x01,
0x23, 0x35, 0x3E, 0x01, 0xC3, 0x16, 0x10, 0x0D, 0x18, 0x17, 0x2F, 0x0E, 0x0C, 0x17, 0x29, 0x8C,
0x28, 0x17, 0x0D, 0x0C, 0x2E, 0xD6, 0x01, 0x0D, 0x08, 0x0A, 0x03, 0x02, 0x16, 0x0B, 0x05, 0x27,
0x2E, 0x16, 0x0D, 0x06, 0x02, 0x04, 0x09, 0x0C, 0x06, 0x0A, 0x09, 0x09, 0x09, 0x0A, 0x0B, 0x04,
0x04, 0x0B, 0x15, 0x2E, 0x1B, 0x0A, 0x04, 0x01, 0x03, 0x05, 0x08, 0x09, 0x07, 0x06, 0x09, 0x09,
0x0A, 0x16, 0x0C, 0x02, 0x04, 0x0C, 0x1A, 0x98, 0x12, 0x04, 0x0C, 0x05, 0x02, 0x01, 0xB6, 0x01,
0x54, 0x02, 0x3B, 0x07, 0x06, 0x06, 0x2A, 0x19, 0x18, 0x1F, 0x2E, 0x22, 0x39, 0x39, 0x22, 0x2C,
0x1E, 0x1C, 0x18, 0x28, 0xFE, 0x8F, 0x09, 0x0C, 0x0A, 0x08, 0x02, 0x13, 0x06, 0x65, 0x0A, 0x0C,
0x09, 0x10, 0x01, 0x11, 0x0A, 0x09, 0x04, 0x07, 0x12, 0x11, 0x03, 0x05, 0x07, 0x09, 0x0D, 0x0F,
0x07, 0x02, 0x12, 0x0A, 0x0D, 0x0C, 0x09, 0x14, 0x02, 0x06, 0x13, 0x0D, 0x08, 0x05, 0x08, 0x12,
0x14, 0x03, 0x04, 0x28, 0x04, 0x01, 0x12, 0x05, 0x04, 0x1F, 0x3C, 0x59, 0x16, 0x2F, 0x5E, 0x00,
0x00, 0x02, 0x00, 0x33, 0x00, 0x70, 0x02, 0x40, 0x01, 0xDB, 0x00, 0x1C, 0x00, 0x2B, 0x00, 0x00,
0x13, 0x36, 0x3B, 0x01, 0x16, 0x1F, 0x01, 0x1E, 0x03, 0x15, 0x14, 0x23, 0x22, 0x06, 0x07, 0x06,
0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x2E, 0x01, 0x35, 0x34, 0x17, 0x36, 0x3B, 0x01, 0x1E,
0x01, 0x15, 0x14, 0x0F, 0x01, 0x23, 0x22, 0x35, 0x34, 0x36, 0x3B, 0x07, 0x4C, 0x4B, 0x0A, 0x16,
0x7D, 0x32, 0x31, 0x20, 0x07, 0x96, 0x7A, 0x42, 0x0E, 0x09, 0x1F, 0x21, 0x06, 0x02, 0x02, 0x05,
0x07, 0x0A, 0x04, 0x90, 0x0D, 0x68, 0x4F, 0x7D, 0x3C, 0x24, 0x25, 0xC5, 0xC5, 0x4D, 0x01, 0xD4,
0x07, 0x15, 0x28, 0x04, 0x01, 0x03, 0x06, 0x08, 0x09, 0x05, 0x0B, 0x17, 0x0F, 0x55, 0x58, 0x05,
0x02, 0x06, 0x07, 0x29, 0x6D, 0x94, 0x7E, 0x0A, 0x02, 0x04, 0x08, 0x0F, 0x63, 0x68, 0x07, 0x0E,
0xC2, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x37, 0x00, 0x63, 0x02, 0x3B, 0x02, 0x48, 0x00, 0x12,
0x00, 0x4D, 0x00, 0x00, 0x13, 0x26, 0x27, 0x22, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x16,
0x33, 0x32, 0x37, 0x3E, 0x01, 0x35, 0x34, 0x27, 0x36, 0x33, 0x32, 0x16, 0x33, 0x16, 0x33, 0x32,
0x16, 0x15, 0x14, 0x07, 0x06, 0x15, 0x14, 0x16, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x33, 0x32,
0x37, 0x36, 0x33, 0x32, 0x17, 0x1E, 0x01, 0x17, 0x16, 0x17, 0x32, 0x37, 0x36, 0x33, 0x17, 0x14,
0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x26, 0x27, 0x26, 0x27, 0x26, 0x27, 0x2E, 0x01, 0x27, 0x26,
0x35, 0x34, 0x9E, 0x08, 0x16, 0x02, 0x06, 0x01, 0x0F, 0x0A, 0x07, 0x12, 0x0E, 0x05, 0x0A, 0x0B,
0x0F, 0x50, 0x13, 0x0A, 0x01, 0x03, 0x01, 0x0E, 0x0A, 0x0D, 0x1F, 0x10, 0x11, 0x0E, 0x02, 0x02,
0x08, 0x07, 0x20, 0x0A, 0x06, 0x12, 0x02, 0x0A, 0x04, 0x09, 0x49, 0x31, 0x28, 0x33, 0x38, 0x0D,
0x0B, 0x03, 0x02, 0x32, 0x28, 0x04, 0x04, 0x3F, 0x42, 0x4E, 0x3D, 0x26, 0x0D, 0x0A, 0x15, 0x10,
0x23, 0x0B, 0x06, 0x02, 0x1B, 0x0B, 0x02, 0x01, 0x0F, 0x0A, 0x0B, 0x0C, 0x0F, 0x02, 0x03, 0x17,
0x0B, 0x07, 0x13, 0x1D, 0x01, 0x04, 0x24, 0x10, 0x13, 0x12, 0x14, 0x14, 0x0B, 0x0E, 0x1C, 0x1D,
0x02, 0x02, 0x16, 0x23, 0x01, 0x02, 0x0F, 0x23, 0x4A, 0x18, 0x13, 0x01, 0x04, 0x03, 0x01, 0x05,
0x12, 0x0F, 0x05, 0x06, 0x1E, 0x31, 0x1D, 0x1D, 0x1B, 0x15, 0x11, 0x60, 0x34, 0x1E, 0x0F, 0x16,
0x00, 0x05, 0x00, 0x37, 0x00, 0x42, 0x02, 0xA1, 0x02, 0x57, 0x00, 0x0C, 0x00, 0x2F, 0x00, 0x4D,
0x00, 0x6D, 0x00, 0x83, 0x00, 0x00, 0x01, 0x26, 0x22, 0x07, 0x06, 0x15, 0x14, 0x33, 0x32, 0x36,
0x35, 0x34, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x0E, 0x01, 0x07, 0x06, 0x07, 0x06, 0x15, 0x14,
0x33, 0x32, 0x37, 0x36, 0x33, 0x32, 0x36, 0x37, 0x36, 0x27, 0x2E, 0x01, 0x2B, 0x01, 0x22, 0x26,
0x35, 0x34, 0x37, 0x36, 0x35, 0x34, 0x37, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x06, 0x15, 0x14,
0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x33, 0x32,
0x35, 0x34, 0x27, 0x26, 0x37, 0x2E, 0x01, 0x23, 0x22, 0x15, 0x14, 0x17, 0x16, 0x15, 0x17, 0x16,
0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x2F, 0x01, 0x07, 0x06, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36,
0x35, 0x34, 0x27, 0x26, 0x27, 0x36, 0x33, 0x32, 0x17, 0x1E, 0x01, 0x17, 0x1E, 0x02, 0x15, 0x14,
0x0F, 0x01, 0x2D, 0x01, 0x26, 0x27, 0x37, 0x36, 0x12, 0x01, 0x78, 0x04, 0x0C, 0x04, 0x02, 0x09,
0x05, 0x09, 0x01, 0x2A, 0x07, 0x06, 0x04, 0x06, 0x05, 0x60, 0x13, 0x0A, 0x08, 0x07, 0x0C, 0x02,
0x1A, 0x2C, 0xAA, 0x81, 0x31, 0x0A, 0x0D, 0x02, 0x01, 0x41, 0x79, 0x4F, 0x40, 0x28, 0x19, 0x40,
0x0E, 0x1C, 0x05, 0x07, 0x33, 0x57, 0x10, 0x32, 0x05, 0x03, 0x05, 0x0D, 0x0F, 0x48, 0x2D, 0x27,
0x0E, 0x09, 0x0C, 0x12, 0x10, 0x34, 0x16, 0x13, 0x2A, 0x2C, 0x54, 0x30, 0x18, 0x0D, 0x13, 0x2D,
0x2E, 0x27, 0x26, 0x0A, 0x06, 0x16, 0x11, 0x34, 0x56, 0x0D, 0x0D, 0x03, 0x01, 0x3C, 0xDD, 0x0E,
0x01, 0x3A, 0x2B, 0xCD, 0x08, 0x37, 0x39, 0x0A, 0x08, 0x66, 0x09, 0x01, 0x3E, 0x39, 0x18, 0x17,
0xFE, 0xF8, 0xFE, 0xF8, 0x14, 0x17, 0x16, 0x1E, 0xC0, 0x01, 0x0F, 0x09, 0x09, 0x06, 0x02, 0x08,
0x07, 0x05, 0x01, 0x02, 0x4E, 0x10, 0x07, 0x06, 0xA7, 0x23, 0x12, 0x08, 0x07, 0x0D, 0x0A, 0x02,
0x04, 0x04, 0x0A, 0x0F, 0x0A, 0x06, 0x03, 0x05, 0x0B, 0x06, 0x2B, 0x6D, 0x0D, 0x04, 0x87, 0x30,
0x5D, 0x99, 0x1C, 0x57, 0x0F, 0x06, 0x07, 0x05, 0x1D, 0x82, 0x4B, 0x42, 0x0F, 0x14, 0x20, 0x63,
0x05, 0x0B, 0x48, 0x4B, 0x18, 0x54, 0x22, 0x08, 0x0A, 0x4F, 0x51, 0x02, 0x43, 0x40, 0x10, 0x0A,
0x03, 0x02, 0x02, 0x05, 0x16, 0x17, 0x05, 0x02, 0x08, 0x01, 0x01, 0x11, 0x5B, 0x47, 0xDF, 0x08,
0x0B, 0x09, 0xB5, 0x14, 0x03, 0x6A, 0x69, 0x08, 0x0C, 0x27, 0x27, 0x02, 0x01, 0x24, 0x2E, 0x29,
0x38, 0x01, 0x51, 0x00, 0x00, 0x02, 0x00, 0x36, 0xFF, 0xE5, 0x02, 0x16, 0x02, 0xD7, 0x00, 0x11,
0x00, 0x3A, 0x00, 0x00, 0x01, 0x26, 0x23, 0x22, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x1E, 0x01,
0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x36, 0x3B, 0x01, 0x16, 0x17, 0x1E, 0x01, 0x17, 0x14,
0x16, 0x15, 0x14, 0x06, 0x07, 0x0E, 0x01, 0x0F, 0x01, 0x17, 0x16, 0x15, 0x14, 0x06, 0x22, 0x26,
0x35, 0x34, 0x37, 0x36, 0x35, 0x34, 0x27, 0x2E, 0x01, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x01,
0x51, 0x0D, 0x20, 0x14, 0x12, 0x0C, 0x17, 0x06, 0x0A, 0x27, 0x17, 0x13, 0x11, 0x23, 0x98, 0x15,
0x31, 0x0E, 0x6E, 0x3F, 0x1F, 0x1A, 0x03, 0x01, 0x0E, 0x17, 0x1E, 0x40, 0x42, 0x20, 0x47, 0x7A,
0x53, 0xEC, 0x53, 0x7A, 0x45, 0x2D, 0x42, 0x67, 0x0D, 0x06, 0x12, 0x29, 0x02, 0x20, 0x09, 0x07,
0x0C, 0x17, 0x1C, 0x0F, 0x0F, 0x16, 0x1A, 0x09, 0x12, 0x2F, 0x2B, 0xC6, 0x07, 0x04, 0x43, 0x21,
0x40, 0x33, 0x05, 0x13, 0x04, 0x1D, 0x30, 0x36, 0x44, 0x69, 0x5A, 0x2A, 0x05, 0x07, 0x1B, 0x13,
0x0D, 0x0D, 0x13, 0x1A, 0x07, 0x04, 0x03, 0x04, 0x3A, 0x59, 0xB2, 0x33, 0x16, 0x22, 0x46, 0x2B,
0x59, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0xC6, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
0x00, 0x01, 0x00, 0x06, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x07,
0x00, 0x06, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x29, 0x00, 0x0D, 0x00, 0x01,
0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0E, 0x00, 0x36, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
0x00, 0x05, 0x00, 0x0F, 0x00, 0x44, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x0E,
0x00, 0x53, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x1C, 0x00, 0x61, 0x00, 0x03,
0x00, 0x01, 0x04, 0x09, 0x00, 0x01, 0x00, 0x0C, 0x00, 0x7D, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09,
0x00, 0x02, 0x00, 0x0E, 0x00, 0x89, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x03, 0x00, 0x52,
0x00, 0x97, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x04, 0x00, 0x1C, 0x00, 0xE9, 0x00, 0x03,
0x00, 0x01, 0x04, 0x09, 0x00, 0x05, 0x00, 0x1E, 0x01, 0x05, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09,
0x00, 0x06, 0x00, 0x1C, 0x01, 0x23, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x0A, 0x00, 0x38,
0x01, 0x3F, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x10, 0x00, 0x0C, 0x00, 0x7D, 0x00, 0x03,
0x00, 0x01, 0x04, 0x09, 0x00, 0x11, 0x00, 0x0E, 0x00, 0x89, 0x4D, 0x79, 0x66, 0x6F, 0x6E, 0x74,
0x52, 0x65, 0x67, 0x75, 0x6C, 0x61, 0x72, 0x43, 0x61, 0x6C, 0x6C, 0x69, 0x67, 0x72, 0x61, 0x70,
0x68, 0x72, 0x20, 0x3A, 0x20, 0x4D, 0x79, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x52, 0x65, 0x67, 0x75,
0x6C, 0x61, 0x72, 0x20, 0x3A, 0x20, 0x32, 0x31, 0x2D, 0x31, 0x30, 0x2D, 0x32, 0x30, 0x32, 0x32,
0x4D, 0x79, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x52, 0x65, 0x67, 0x75, 0x6C, 0x61, 0x72, 0x56, 0x65,
0x72, 0x73, 0x69, 0x6F, 0x6E, 0x20, 0x30, 0x30, 0x31, 0x2E, 0x30, 0x30, 0x32, 0x4D, 0x79, 0x66,
0x6F, 0x6E, 0x74, 0x2D, 0x52, 0x65, 0x67, 0x75, 0x6C, 0x61, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74,
0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x43, 0x61, 0x6C, 0x6C, 0x69, 0x67, 0x72, 0x61,
0x70, 0x68, 0x72, 0x2E, 0x63, 0x6F, 0x6D, 0x00, 0x4D, 0x00, 0x79, 0x00, 0x66, 0x00, 0x6F, 0x00,
0x6E, 0x00, 0x74, 0x00, 0x52, 0x00, 0x65, 0x00, 0x67, 0x00, 0x75, 0x00, 0x6C, 0x00, 0x61, 0x00,
0x72, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x69, 0x00, 0x67, 0x00, 0x72, 0x00,
0x61, 0x00, 0x70, 0x00, 0x68, 0x00, 0x72, 0x00, 0x20, 0x00, 0x3A, 0x00, 0x20, 0x00, 0x4D, 0x00,
0x79, 0x00, 0x66, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x20, 0x00, 0x52, 0x00, 0x65, 0x00,
0x67, 0x00, 0x75, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x72, 0x00, 0x20, 0x00, 0x3A, 0x00, 0x20, 0x00,
0x32, 0x00, 0x31, 0x00, 0x2D, 0x00, 0x31, 0x00, 0x30, 0x00, 0x2D, 0x00, 0x32, 0x00, 0x30, 0x00,
0x32, 0x00, 0x32, 0x00, 0x4D, 0x00, 0x79, 0x00, 0x66, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x74, 0x00,
0x20, 0x00, 0x52, 0x00, 0x65, 0x00, 0x67, 0x00, 0x75, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x72, 0x00,
0x56, 0x00, 0x65, 0x00, 0x72, 0x00, 0x73, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x20, 0x00,
0x30, 0x00, 0x30, 0x00, 0x31, 0x00, 0x2E, 0x00, 0x30, 0x00, 0x30, 0x00, 0x32, 0x00, 0x4D, 0x00,
0x79, 0x00, 0x66, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x2D, 0x00, 0x52, 0x00, 0x65, 0x00,
0x67, 0x00, 0x75, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x72, 0x00, 0x43, 0x00, 0x72, 0x00, 0x65, 0x00,
0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, 0x77, 0x00, 0x69, 0x00, 0x74, 0x00,
0x68, 0x00, 0x20, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x69, 0x00, 0x67, 0x00,
0x72, 0x00, 0x61, 0x00, 0x70, 0x00, 0x68, 0x00, 0x72, 0x00, 0x2E, 0x00, 0x63, 0x00, 0x6F, 0x00,
0x6D, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xB5, 0x00, 0x32,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x01, 0x02, 0x00, 0x03,
0x00, 0x24, 0x00, 0x25, 0x00, 0x26, 0x00, 0x27, 0x00, 0x28, 0x00, 0x29, 0x00, 0x2A, 0x00, 0x2B,
0x00, 0x2C, 0x00, 0x2D, 0x00, 0x2E, 0x00, 0x2F, 0x00, 0x31, 0x00, 0x32, 0x00, 0x33, 0x00, 0x34,
0x00, 0x35, 0x00, 0x36, 0x00, 0x37, 0x00, 0x38, 0x00, 0x39, 0x01, 0x03, 0x02, 0x43, 0x52, 0x04,
0x6E, 0x62, 0x73, 0x70, 0x00, 0x01, 0x00, 0x01, 0xFF, 0xFF, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x01,
0x00, 0x00, 0x00, 0x00
};
File diff suppressed because it is too large Load Diff