diff --git a/CMakeLists.txt b/CMakeLists.txt index f590169dd..08ef6bcdc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -38,6 +38,16 @@ SET (VECTOR_MATH_INCLUDE ${BULLET_PHYSICS_SOURCE_DIR}/src/BulletMultiThreaded/ve ENDIF(WIN32) +IF (WIN32) + FIND_PATH(DIRECTX_SDK_BASE_DIR Include/D3D11.h PATH $ENV{DXSDK_DIR} ) + IF(DIRECTX_SDK_BASE_DIR) + OPTION(USE_DX11 "Use DirectX 11" ON) + ELSE() + OPTION(USE_DX11 "Use DirectX 11" OFF) + ENDIF() +ENDIF(WIN32) + + #SET(CMAKE_EXE_LINKER_FLAGS_INIT "/STACK:10000000 /INCREMENTAL:NO") #SET(CMAKE_EXE_LINKER_FLAGS "/STACK:10000000 /INCREMENTAL:NO") diff --git a/Demos/CMakeLists.txt b/Demos/CMakeLists.txt index 44f6d029a..7d70282ca 100644 --- a/Demos/CMakeLists.txt +++ b/Demos/CMakeLists.txt @@ -1,4 +1,8 @@ +IF (USE_DX11) + SUBDIRS(DX11ClothDemo) +ENDIF() + IF (USE_GLUT) IF(BUILD_CPU_DEMOS) diff --git a/Demos/DX11ClothDemo/CMakeLists.txt b/Demos/DX11ClothDemo/CMakeLists.txt new file mode 100644 index 000000000..e591c21a2 --- /dev/null +++ b/Demos/DX11ClothDemo/CMakeLists.txt @@ -0,0 +1,152 @@ +cmake_minimum_required(VERSION 2.4) + + +#this line has to appear before 'PROJECT' in order to be able to disable incremental linking +SET(MSVC_INCREMENTAL_DEFAULT ON) + +PROJECT(AppDX11ClothDemo) +SET(BULLET_VERSION 2.76) + +IF (NOT CMAKE_BUILD_TYPE) +# SET(CMAKE_BUILD_TYPE "Debug") + SET(CMAKE_BUILD_TYPE "Release") +ENDIF (NOT CMAKE_BUILD_TYPE) + + +OPTION(USE_MSVC_RUNTIME_LIBRARY_DLL "Use MSVC Runtime Library DLL (/MD or /MDd)" ON) +OPTION(USE_MSVC_INCREMENTAL_LINKING "Use MSVC Incremental Linking" OFF) + + +IF(MSVC) + IF (NOT USE_MSVC_INCREMENTAL_LINKING) + #MESSAGE("MSVC_INCREMENTAL_DEFAULT"+${MSVC_INCREMENTAL_DEFAULT}) + SET( MSVC_INCREMENTAL_YES_FLAG "/INCREMENTAL:NO") + + STRING(REPLACE "INCREMENTAL:YES" "INCREMENTAL:NO" replacementFlags ${CMAKE_EXE_LINKER_FLAGS_DEBUG}) + SET(CMAKE_EXE_LINKER_FLAGS_DEBUG "/INCREMENTAL:NO ${replacementFlags}" ) + MESSAGE("CMAKE_EXE_LINKER_FLAGS_DEBUG=${CMAKE_EXE_LINKER_FLAGS_DEBUG}") + + STRING(REPLACE "INCREMENTAL:YES" "INCREMENTAL:NO" replacementFlags3 ${CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO}) + SET(CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO ${replacementFlags3}) + SET(CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO "/INCREMENTAL:NO ${replacementFlags3}" ) + ENDIF (NOT USE_MSVC_INCREMENTAL_LINKING) + + IF (NOT USE_MSVC_RUNTIME_LIBRARY_DLL) + #We statically link to reduce dependancies + FOREACH(flag_var CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO) + IF(${flag_var} MATCHES "/MD") + STRING(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}") + ENDIF(${flag_var} MATCHES "/MD") + IF(${flag_var} MATCHES "/MDd") + STRING(REGEX REPLACE "/MDd" "/MTd" ${flag_var} "${${flag_var}}") + ENDIF(${flag_var} MATCHES "/MDd") + ENDFOREACH(flag_var) + ENDIF (NOT USE_MSVC_RUNTIME_LIBRARY_DLL) + + OPTION(USE_MSVC_SSE "Use MSVC /arch:sse option" ON) + IF (USE_MSVC_SSE) + ADD_DEFINITIONS(/arch:SSE) + ENDIF() + OPTION(USE_MSVC_FAST_FLOATINGPOINT "Use MSVC /fp:fast option" ON) + IF (USE_MSVC_FAST_FLOATINGPOINT) + ADD_DEFINITIONS(/fp:fast) + ENDIF() +ENDIF(MSVC) + + +IF(COMMAND cmake_policy) + cmake_policy(SET CMP0003 NEW) +ENDIF(COMMAND cmake_policy) + + + + +SET(DXSDK_DIR $ENV{DXSDK_DIR}) +SET(DX11_INCLUDE_PATH "${DXSDK_DIR}Include" CACHE DOCSTRING "Microsoft directX SDK include path") +SET(DX11_LIB_PATH "${DXSDK_DIR}Lib/x86" CACHE DOCSTRING "Microsoft DirectX SDK library path") + +SET(BulletClothExample_SRCS + DXUT/Core/DXUT.cpp + DXUT/Optional/DXUTcamera.cpp + DXUT/Core/DXUTDevice11.cpp + DXUT/Core/DXUTDevice9.cpp + DXUT/Optional/DXUTgui.cpp + DXUT/Core/DXUTmisc.cpp + DXUT/Optional/DXUTres.cpp + DXUT/Optional/DXUTsettingsdlg.cpp + DXUT/Optional/SDKmesh.cpp + DXUT/Optional/SDKmisc.cpp + + cloth_renderer.cpp +) + + +SET(BulletClothExample_HDRS + DXUT/Core/DXUT.h + DXUT/Optional/DXUTcamera.h + DXUT/Core/DXUTDevice11.h + DXUT/Core/DXUTDevice9.h + DXUT/Optional/DXUTgui.h + DXUT/Core/DXUTmisc.h + DXUT/Optional/DXUTres.h + DXUT/Optional/DXUTsettingsdlg.h + DXUT/Optional/SDKmesh.h + DXUT/Optional/SDKmisc.h + + btDirectComputeSupport.h + cap.h + cloth.h + cylinder.h +# FreeImage.h + resource.h +) + + +INCLUDE_DIRECTORIES( + ${DX11_INCLUDE_PATH} + ${BULLET_PHYSICS_SOURCE_DIR}/src + "DXUT/Core" "DXUT/Optional" + ${VECTOR_MATH_INCLUDE} +) +LINK_DIRECTORIES(${DX11_LIB_PATH}) + +ADD_DEFINITIONS(-DUNICODE) +ADD_DEFINITIONS(-D_UNICODE) + +ADD_EXECUTABLE(AppDX11ClothDemo WIN32 + ${BulletClothExample_SRCS} + ${BulletClothExample_HDRS} +) +TARGET_LINK_LIBRARIES(AppDX11ClothDemo + d3dcompiler + dxerr + dxguid + d3dx9 + d3d9 + winmm + comctl32 + d3dx11 + BulletDynamics + BulletCollision + LinearMath + BulletSoftBody + BulletSoftBodySolvers_CPU + BulletSoftBodySolvers_DX11 +) + +IF (NOT INTERNAL_CREATE_DISTRIBUTABLE_MSVC_PROJECTFILES) + ADD_CUSTOM_COMMAND( + TARGET AppDX11ClothDemo + POST_BUILD + COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${BULLET_PHYSICS_SOURCE_DIR}/Demos/DX11ClothDemo/cloth_renderer_PS.hlsl ${CMAKE_CURRENT_BINARY_DIR}/cloth_renderer_PS.hlsl + COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${BULLET_PHYSICS_SOURCE_DIR}/Demos/DX11ClothDemo/cloth_renderer_VS.hlsl ${CMAKE_CURRENT_BINARY_DIR}/cloth_renderer_VS.hlsl + COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${BULLET_PHYSICS_SOURCE_DIR}/Demos/DX11ClothDemo/texture.bmp ${CMAKE_CURRENT_BINARY_DIR}/texture.bmp + COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${BULLET_PHYSICS_SOURCE_DIR}/Demos/DX11ClothDemo/amdFlag.bmp ${CMAKE_CURRENT_BINARY_DIR}/amdFlag.bmp + COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${BULLET_PHYSICS_SOURCE_DIR}/Demos/DX11ClothDemo/atiFlag.bmp ${CMAKE_CURRENT_BINARY_DIR}/atiFlag.bmp + COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${BULLET_PHYSICS_SOURCE_DIR}/Demos/DX11ClothDemo/texture.png ${CMAKE_CURRENT_BINARY_DIR}/texture.png + COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${BULLET_PHYSICS_SOURCE_DIR}/Demos/DX11ClothDemo/Media/UI/Font.dds ${CMAKE_CURRENT_BINARY_DIR}/Media/UI/Font.dds + COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${BULLET_PHYSICS_SOURCE_DIR}/Demos/DX11ClothDemo/Media/Tiny/tiny.sdkmesh ${CMAKE_CURRENT_BINARY_DIR}/Media/Tiny/tiny.sdkmesh + + ) +ENDIF() + \ No newline at end of file diff --git a/Demos/DX11ClothDemo/DXUT/Core/DXUT.cpp b/Demos/DX11ClothDemo/DXUT/Core/DXUT.cpp new file mode 100644 index 000000000..6564131b0 --- /dev/null +++ b/Demos/DX11ClothDemo/DXUT/Core/DXUT.cpp @@ -0,0 +1,5846 @@ +//-------------------------------------------------------------------------------------- +// File: DXUT.cpp +// +// Copyright (c) Microsoft Corporation. All rights reserved. +//-------------------------------------------------------------------------------------- +#include "DXUT.h" +#define DXUT_MIN_WINDOW_SIZE_X 200 +#define DXUT_MIN_WINDOW_SIZE_Y 200 +#define DXUT_COUNTER_STAT_LENGTH 2048 +#undef min // use __min instead inside this source file +#undef max // use __max instead inside this source file + +#ifndef ARRAYSIZE +extern "C++" // templates cannot be declared to have 'C' linkage +template +char (*RtlpNumberOf( UNALIGNED T (&)[N] ))[N]; + +#define RTL_NUMBER_OF_V2(A) (sizeof(*RtlpNumberOf(A))) +#define ARRAYSIZE(A) RTL_NUMBER_OF_V2(A) +#endif + +//-------------------------------------------------------------------------------------- +// Thread safety +//-------------------------------------------------------------------------------------- +CRITICAL_SECTION g_cs; +bool g_bThreadSafe = true; + + +//-------------------------------------------------------------------------------------- +// Automatically enters & leaves the CS upon object creation/deletion +//-------------------------------------------------------------------------------------- +class DXUTLock +{ +public: + inline DXUTLock() { if( g_bThreadSafe ) EnterCriticalSection( &g_cs ); } + inline ~DXUTLock() { if( g_bThreadSafe ) LeaveCriticalSection( &g_cs ); } +}; + +//-------------------------------------------------------------------------------------- +// Helper macros to build member functions that access member variables with thread safety +//-------------------------------------------------------------------------------------- +#define SET_ACCESSOR( x, y ) inline void Set##y( x t ) { DXUTLock l; m_state.m_##y = t; }; +#define GET_ACCESSOR( x, y ) inline x Get##y() { DXUTLock l; return m_state.m_##y; }; +#define GET_SET_ACCESSOR( x, y ) SET_ACCESSOR( x, y ) GET_ACCESSOR( x, y ) + +#define SETP_ACCESSOR( x, y ) inline void Set##y( x* t ) { DXUTLock l; m_state.m_##y = *t; }; +#define GETP_ACCESSOR( x, y ) inline x* Get##y() { DXUTLock l; return &m_state.m_##y; }; +#define GETP_SETP_ACCESSOR( x, y ) SETP_ACCESSOR( x, y ) GETP_ACCESSOR( x, y ) + + +//-------------------------------------------------------------------------------------- +// Stores timer callback info +//-------------------------------------------------------------------------------------- +struct DXUT_TIMER +{ + LPDXUTCALLBACKTIMER pCallbackTimer; + void* pCallbackUserContext; + float fTimeoutInSecs; + float fCountdown; + bool bEnabled; + UINT nID; +}; + + + +//-------------------------------------------------------------------------------------- +// Stores DXUT state and data access is done with thread safety (if g_bThreadSafe==true) +//-------------------------------------------------------------------------------------- +class DXUTState +{ +protected: + struct STATE + { + // D3D9 specific + IDirect3D9* m_D3D9; // the main D3D9 object + IDirect3DDevice9* m_D3D9Device; // the D3D9 rendering device + DXUTDeviceSettings* m_CurrentDeviceSettings; // current device settings + D3DSURFACE_DESC m_BackBufferSurfaceDesc9; // D3D9 back buffer surface description + D3DCAPS9 m_Caps; // D3D caps for current device + + // D3D11 specific + IDXGIFactory1* m_DXGIFactory; // DXGI Factory object + IDXGIAdapter1* m_DXGIAdapter; // The DXGI adapter object for the D3D11 device + IDXGIOutput** m_DXGIOutputArray; // The array of output obj for the D3D11 adapter obj + UINT m_DXGIOutputArraySize; // Number of elements in m_D3D11OutputArray + IDXGISwapChain* m_DXGISwapChain; // the D3D11 swapchain + DXGI_SURFACE_DESC m_BackBufferSurfaceDescDXGI; // D3D11 back buffer surface description + bool m_RenderingOccluded; // Rendering is occluded by another window + bool m_DoNotStoreBufferSize; // Do not store the buffer size on WM_SIZE messages + + // D3D11 specific + bool m_D3D11Available; // if true, then D3D11 is available + ID3D11Device* m_D3D11Device; // the D3D11 rendering device + ID3D11DeviceContext* m_D3D11DeviceContext; // the D3D11 immediate device context + D3D_FEATURE_LEVEL m_D3D11FeatureLevel; // the D3D11 feature level that this device supports + ID3D11Texture2D* m_D3D11DepthStencil; // the D3D11 depth stencil texture (optional) + ID3D11DepthStencilView* m_D3D11DepthStencilView; // the D3D11 depth stencil view (optional) + ID3D11RenderTargetView* m_D3D11RenderTargetView; // the D3D11 render target view + ID3D11RasterizerState* m_D3D11RasterizerState; // the D3D11 Rasterizer state + + // General + HWND m_HWNDFocus; // the main app focus window + HWND m_HWNDDeviceFullScreen; // the main app device window in fullscreen mode + HWND m_HWNDDeviceWindowed; // the main app device window in windowed mode + HMONITOR m_AdapterMonitor; // the monitor of the adapter + HMENU m_Menu; // handle to menu + + UINT m_FullScreenBackBufferWidthAtModeChange; // back buffer size of fullscreen mode right before switching to windowed mode. Used to restore to same resolution when toggling back to fullscreen + UINT m_FullScreenBackBufferHeightAtModeChange; // back buffer size of fullscreen mode right before switching to windowed mode. Used to restore to same resolution when toggling back to fullscreen + UINT m_WindowBackBufferWidthAtModeChange; // back buffer size of windowed mode right before switching to fullscreen mode. Used to restore to same resolution when toggling back to windowed mode + UINT m_WindowBackBufferHeightAtModeChange; // back buffer size of windowed mode right before switching to fullscreen mode. Used to restore to same resolution when toggling back to windowed mode + DWORD m_WindowedStyleAtModeChange; // window style + WINDOWPLACEMENT m_WindowedPlacement;// record of windowed HWND position/show state/etc + bool m_TopmostWhileWindowed; // if true, the windowed HWND is topmost + bool m_Minimized; // if true, the HWND is minimized + bool m_Maximized; // if true, the HWND is maximized + bool m_MinimizedWhileFullscreen; // if true, the HWND is minimized due to a focus switch away when fullscreen mode + bool m_IgnoreSizeChange; // if true, DXUT won't reset the device upon HWND size change + + double m_Time; // current time in seconds + double m_AbsoluteTime; // absolute time in seconds + float m_ElapsedTime; // time elapsed since last frame + + HINSTANCE m_HInstance; // handle to the app instance + double m_LastStatsUpdateTime; // last time the stats were updated + DWORD m_LastStatsUpdateFrames; // frames count since last time the stats were updated + float m_FPS; // frames per second + int m_CurrentFrameNumber; // the current frame number + HHOOK m_KeyboardHook; // handle to keyboard hook + bool m_AllowShortcutKeysWhenFullscreen; // if true, when fullscreen enable shortcut keys (Windows keys, StickyKeys shortcut, ToggleKeys shortcut, FilterKeys shortcut) + bool m_AllowShortcutKeysWhenWindowed; // if true, when windowed enable shortcut keys (Windows keys, StickyKeys shortcut, ToggleKeys shortcut, FilterKeys shortcut) + bool m_AllowShortcutKeys; // if true, then shortcut keys are currently disabled (Windows key, etc) + bool m_CallDefWindowProc; // if true, DXUTStaticWndProc will call DefWindowProc for unhandled messages. Applications rendering to a dialog may need to set this to false. + STICKYKEYS m_StartupStickyKeys; // StickyKey settings upon startup so they can be restored later + TOGGLEKEYS m_StartupToggleKeys; // ToggleKey settings upon startup so they can be restored later + FILTERKEYS m_StartupFilterKeys; // FilterKey settings upon startup so they can be restored later + + bool m_AppSupportsD3D9Override; // true if app sets via DXUTSetD3DVersionSupport() + bool m_AppSupportsD3D11Override; // true if app sets via DXUTSetD3DVersionSupport() + bool m_UseD3DVersionOverride; // true if the app ever calls DXUTSetD3DVersionSupport() + + bool m_HandleEscape; // if true, then DXUT will handle escape to quit + bool m_HandleAltEnter; // if true, then DXUT will handle alt-enter to toggle fullscreen + bool m_HandlePause; // if true, then DXUT will handle pause to toggle time pausing + bool m_ShowMsgBoxOnError; // if true, then msgboxes are displayed upon errors + bool m_NoStats; // if true, then DXUTGetFrameStats() and DXUTGetDeviceStats() will return blank strings + bool m_ClipCursorWhenFullScreen; // if true, then DXUT will keep the cursor from going outside the window when full screen + bool m_ShowCursorWhenFullScreen; // if true, then DXUT will show a cursor when full screen + bool m_ConstantFrameTime; // if true, then elapsed frame time will always be 0.05f seconds which is good for debugging or automated capture + float m_TimePerFrame; // the constant time per frame in seconds, only valid if m_ConstantFrameTime==true + bool m_WireframeMode; // if true, then D3DRS_FILLMODE==D3DFILL_WIREFRAME else D3DRS_FILLMODE==D3DFILL_SOLID + bool m_AutoChangeAdapter; // if true, then the adapter will automatically change if the window is different monitor + bool m_WindowCreatedWithDefaultPositions; // if true, then CW_USEDEFAULT was used and the window should be moved to the right adapter + int m_ExitCode; // the exit code to be returned to the command line + + bool m_DXUTInited; // if true, then DXUTInit() has succeeded + bool m_WindowCreated; // if true, then DXUTCreateWindow() or DXUTSetWindow() has succeeded + bool m_DeviceCreated; // if true, then DXUTCreateDevice() or DXUTSetD3D*Device() has succeeded + + bool m_DXUTInitCalled; // if true, then DXUTInit() was called + bool m_WindowCreateCalled; // if true, then DXUTCreateWindow() or DXUTSetWindow() was called + bool m_DeviceCreateCalled; // if true, then DXUTCreateDevice() or DXUTSetD3D*Device() was called + + bool m_DeviceObjectsCreated; // if true, then DeviceCreated callback has been called (if non-NULL) + bool m_DeviceObjectsReset; // if true, then DeviceReset callback has been called (if non-NULL) + bool m_InsideDeviceCallback; // if true, then the framework is inside an app device callback + bool m_InsideMainloop; // if true, then the framework is inside the main loop + bool m_Active; // if true, then the app is the active top level window + bool m_TimePaused; // if true, then time is paused + bool m_RenderingPaused; // if true, then rendering is paused + int m_PauseRenderingCount; // pause rendering ref count + int m_PauseTimeCount; // pause time ref count + bool m_DeviceLost; // if true, then the device is lost and needs to be reset + bool m_NotifyOnMouseMove; // if true, include WM_MOUSEMOVE in mousecallback + bool m_Automation; // if true, automation is enabled + bool m_InSizeMove; // if true, app is inside a WM_ENTERSIZEMOVE + UINT m_TimerLastID; // last ID of the DXUT timer + bool m_MessageWhenD3D11NotAvailable; + + D3D_FEATURE_LEVEL m_OverrideForceFeatureLevel; // if != -1, then overrid to use a featurelevel + WCHAR m_ScreenShotName[256]; // command line screen shot name + bool m_SaveScreenShot; // command line save screen shot + bool m_ExitAfterScreenShot; // command line exit after screen shot + + int m_OverrideForceAPI; // if != -1, then override to use this Direct3D API version + int m_OverrideAdapterOrdinal; // if != -1, then override to use this adapter ordinal + bool m_OverrideWindowed; // if true, then force to start windowed + int m_OverrideOutput; // if != -1, then override to use the particular output on the adapter + bool m_OverrideFullScreen; // if true, then force to start full screen + int m_OverrideStartX; // if != -1, then override to this X position of the window + int m_OverrideStartY; // if != -1, then override to this Y position of the window + int m_OverrideWidth; // if != 0, then override to this width + int m_OverrideHeight; // if != 0, then override to this height + bool m_OverrideForceHAL; // if true, then force to HAL device (failing if one doesn't exist) + bool m_OverrideForceREF; // if true, then force to REF device (failing if one doesn't exist) + bool m_OverrideConstantFrameTime; // if true, then force to constant frame time + float m_OverrideConstantTimePerFrame; // the constant time per frame in seconds if m_OverrideConstantFrameTime==true + int m_OverrideQuitAfterFrame; // if != 0, then it will force the app to quit after that frame + int m_OverrideForceVsync; // if == 0, then it will force the app to use D3DPRESENT_INTERVAL_IMMEDIATE, if == 1 force use of D3DPRESENT_INTERVAL_DEFAULT + bool m_OverrideRelaunchMCE; // if true, then force relaunch of MCE at exit + bool m_AppCalledWasKeyPressed; // true if the app ever calls DXUTWasKeyPressed(). Allows for optimzation + bool m_ReleasingSwapChain; // if true, the app is releasing its swapchain + bool m_IsInGammaCorrectMode; // Tell DXUTRes and DXUTMisc that we are in gamma correct mode + + LPDXUTCALLBACKMODIFYDEVICESETTINGS m_ModifyDeviceSettingsFunc; // modify Direct3D device settings callback + LPDXUTCALLBACKDEVICEREMOVED m_DeviceRemovedFunc; // Direct3D device removed callback + LPDXUTCALLBACKFRAMEMOVE m_FrameMoveFunc; // frame move callback + LPDXUTCALLBACKKEYBOARD m_KeyboardFunc; // keyboard callback + LPDXUTCALLBACKMOUSE m_MouseFunc; // mouse callback + LPDXUTCALLBACKMSGPROC m_WindowMsgFunc; // window messages callback + + LPDXUTCALLBACKISD3D9DEVICEACCEPTABLE m_IsD3D9DeviceAcceptableFunc; // D3D9 is device acceptable callback + LPDXUTCALLBACKD3D9DEVICECREATED m_D3D9DeviceCreatedFunc; // D3D9 device created callback + LPDXUTCALLBACKD3D9DEVICERESET m_D3D9DeviceResetFunc; // D3D9 device reset callback + LPDXUTCALLBACKD3D9DEVICELOST m_D3D9DeviceLostFunc; // D3D9 device lost callback + LPDXUTCALLBACKD3D9DEVICEDESTROYED m_D3D9DeviceDestroyedFunc; // D3D9 device destroyed callback + LPDXUTCALLBACKD3D9FRAMERENDER m_D3D9FrameRenderFunc; // D3D9 frame render callback + + LPDXUTCALLBACKISD3D11DEVICEACCEPTABLE m_IsD3D11DeviceAcceptableFunc; // D3D11 is device acceptable callback + LPDXUTCALLBACKD3D11DEVICECREATED m_D3D11DeviceCreatedFunc; // D3D11 device created callback + LPDXUTCALLBACKD3D11SWAPCHAINRESIZED m_D3D11SwapChainResizedFunc; // D3D11 SwapChain reset callback + LPDXUTCALLBACKD3D11SWAPCHAINRELEASING m_D3D11SwapChainReleasingFunc; // D3D11 SwapChain lost callback + LPDXUTCALLBACKD3D11DEVICEDESTROYED m_D3D11DeviceDestroyedFunc; // D3D11 device destroyed callback + LPDXUTCALLBACKD3D11FRAMERENDER m_D3D11FrameRenderFunc; // D3D11 frame render callback + + + void* m_ModifyDeviceSettingsFuncUserContext; // user context for modify Direct3D device settings callback + void* m_DeviceRemovedFuncUserContext; // user context for Direct3D device removed callback + void* m_FrameMoveFuncUserContext; // user context for frame move callback + void* m_KeyboardFuncUserContext; // user context for keyboard callback + void* m_MouseFuncUserContext; // user context for mouse callback + void* m_WindowMsgFuncUserContext; // user context for window messages callback + + void* m_IsD3D9DeviceAcceptableFuncUserContext; // user context for is D3D9 device acceptable callback + void* m_D3D9DeviceCreatedFuncUserContext; // user context for D3D9 device created callback + void* m_D3D9DeviceResetFuncUserContext; // user context for D3D9 device reset callback + void* m_D3D9DeviceLostFuncUserContext; // user context for D3D9 device lost callback + void* m_D3D9DeviceDestroyedFuncUserContext; // user context for D3D9 device destroyed callback + void* m_D3D9FrameRenderFuncUserContext; // user context for D3D9 frame render callback + + void* m_IsD3D11DeviceAcceptableFuncUserContext; // user context for is D3D11 device acceptable callback + void* m_D3D11DeviceCreatedFuncUserContext; // user context for D3D11 device created callback + void* m_D3D11SwapChainResizedFuncUserContext; // user context for D3D11 SwapChain resized callback + void* m_D3D11SwapChainReleasingFuncUserContext; // user context for D3D11 SwapChain releasing callback + void* m_D3D11DeviceDestroyedFuncUserContext; // user context for D3D11 device destroyed callback + void* m_D3D11FrameRenderFuncUserContext; // user context for D3D11 frame render callback + + bool m_Keys[256]; // array of key state + bool m_LastKeys[256]; // array of last key state + bool m_MouseButtons[5]; // array of mouse states + + CGrowableArray* m_TimerList; // list of DXUT_TIMER structs + WCHAR m_StaticFrameStats[256]; // static part of frames stats + WCHAR m_FPSStats[64]; // fps stats + WCHAR m_FrameStats[256]; // frame stats (fps, width, etc) + WCHAR m_DeviceStats[256]; // device stats (description, device type, etc) + WCHAR m_WindowTitle[256]; // window title + }; + + STATE m_state; + +public: + DXUTState() { Create(); } + ~DXUTState() { Destroy(); } + + void Create() + { + g_bThreadSafe = true; + InitializeCriticalSectionAndSpinCount( &g_cs, 1000 ); + + ZeroMemory( &m_state, sizeof( STATE ) ); + m_state.m_OverrideStartX = -1; + m_state.m_OverrideStartY = -1; + m_state.m_OverrideForceFeatureLevel = (D3D_FEATURE_LEVEL)0; + m_state.m_ScreenShotName[0] = 0; + m_state.m_SaveScreenShot = false; + m_state.m_ExitAfterScreenShot = false; + m_state.m_OverrideForceAPI = -1; + m_state.m_OverrideAdapterOrdinal = -1; + m_state.m_OverrideOutput = -1; + m_state.m_OverrideForceVsync = -1; + m_state.m_AutoChangeAdapter = true; + m_state.m_ShowMsgBoxOnError = true; + m_state.m_AllowShortcutKeysWhenWindowed = true; + m_state.m_Active = true; + m_state.m_CallDefWindowProc = true; + m_state.m_HandleEscape = true; + m_state.m_HandleAltEnter = true; + m_state.m_HandlePause = true; + m_state.m_IsInGammaCorrectMode = true; + m_state.m_FPS = 1.0f; + m_state.m_MessageWhenD3D11NotAvailable = true; + } + + void Destroy() + { + SAFE_DELETE( m_state.m_TimerList ); + DXUTShutdown(); + DeleteCriticalSection( &g_cs ); + } + + // Macros to define access functions for thread safe access into m_state + GET_SET_ACCESSOR( DXUTDeviceSettings*, CurrentDeviceSettings ); + + // D3D9 specific + GET_SET_ACCESSOR( IDirect3D9*, D3D9 ); + GET_SET_ACCESSOR( IDirect3DDevice9*, D3D9Device ); + GETP_SETP_ACCESSOR( D3DSURFACE_DESC, BackBufferSurfaceDesc9 ); + GETP_SETP_ACCESSOR( D3DCAPS9, Caps ); + + // D3D11 specific + GET_SET_ACCESSOR( IDXGIFactory1*, DXGIFactory ); + GET_SET_ACCESSOR( IDXGIAdapter1*, DXGIAdapter ); + GET_SET_ACCESSOR( IDXGIOutput**, DXGIOutputArray ); + GET_SET_ACCESSOR( UINT, DXGIOutputArraySize ); + GET_SET_ACCESSOR( IDXGISwapChain*, DXGISwapChain ); + GETP_SETP_ACCESSOR( DXGI_SURFACE_DESC, BackBufferSurfaceDescDXGI ); + GET_SET_ACCESSOR( bool, RenderingOccluded ); + GET_SET_ACCESSOR( bool, DoNotStoreBufferSize ); + + // D3D11 specific + GET_SET_ACCESSOR( bool, D3D11Available ); + GET_SET_ACCESSOR( ID3D11Device*, D3D11Device ); + GET_SET_ACCESSOR( ID3D11DeviceContext*, D3D11DeviceContext ); + GET_SET_ACCESSOR( D3D_FEATURE_LEVEL, D3D11FeatureLevel ); + GET_SET_ACCESSOR( ID3D11Texture2D*, D3D11DepthStencil ); + GET_SET_ACCESSOR( ID3D11DepthStencilView*, D3D11DepthStencilView ); + GET_SET_ACCESSOR( ID3D11RenderTargetView*, D3D11RenderTargetView ); + GET_SET_ACCESSOR( ID3D11RasterizerState*, D3D11RasterizerState ); + + + GET_SET_ACCESSOR( HWND, HWNDFocus ); + GET_SET_ACCESSOR( HWND, HWNDDeviceFullScreen ); + GET_SET_ACCESSOR( HWND, HWNDDeviceWindowed ); + GET_SET_ACCESSOR( HMONITOR, AdapterMonitor ); + GET_SET_ACCESSOR( HMENU, Menu ); + + + GET_SET_ACCESSOR( UINT, FullScreenBackBufferWidthAtModeChange ); + GET_SET_ACCESSOR( UINT, FullScreenBackBufferHeightAtModeChange ); + GET_SET_ACCESSOR( UINT, WindowBackBufferWidthAtModeChange ); + GET_SET_ACCESSOR( UINT, WindowBackBufferHeightAtModeChange ); + GETP_SETP_ACCESSOR( WINDOWPLACEMENT, WindowedPlacement ); + GET_SET_ACCESSOR( DWORD, WindowedStyleAtModeChange ); + GET_SET_ACCESSOR( bool, TopmostWhileWindowed ); + GET_SET_ACCESSOR( bool, Minimized ); + GET_SET_ACCESSOR( bool, Maximized ); + GET_SET_ACCESSOR( bool, MinimizedWhileFullscreen ); + GET_SET_ACCESSOR( bool, IgnoreSizeChange ); + + GET_SET_ACCESSOR( double, Time ); + GET_SET_ACCESSOR( double, AbsoluteTime ); + GET_SET_ACCESSOR( float, ElapsedTime ); + + GET_SET_ACCESSOR( HINSTANCE, HInstance ); + GET_SET_ACCESSOR( double, LastStatsUpdateTime ); + GET_SET_ACCESSOR( DWORD, LastStatsUpdateFrames ); + GET_SET_ACCESSOR( float, FPS ); + GET_SET_ACCESSOR( int, CurrentFrameNumber ); + GET_SET_ACCESSOR( HHOOK, KeyboardHook ); + GET_SET_ACCESSOR( bool, AllowShortcutKeysWhenFullscreen ); + GET_SET_ACCESSOR( bool, AllowShortcutKeysWhenWindowed ); + GET_SET_ACCESSOR( bool, AllowShortcutKeys ); + GET_SET_ACCESSOR( bool, CallDefWindowProc ); + GET_SET_ACCESSOR( STICKYKEYS, StartupStickyKeys ); + GET_SET_ACCESSOR( TOGGLEKEYS, StartupToggleKeys ); + GET_SET_ACCESSOR( FILTERKEYS, StartupFilterKeys ); + + GET_SET_ACCESSOR( bool, AppSupportsD3D9Override ); + GET_SET_ACCESSOR( bool, AppSupportsD3D11Override ); + GET_SET_ACCESSOR( bool, UseD3DVersionOverride ); + + GET_SET_ACCESSOR( bool, HandleEscape ); + GET_SET_ACCESSOR( bool, HandleAltEnter ); + GET_SET_ACCESSOR( bool, HandlePause ); + GET_SET_ACCESSOR( bool, ShowMsgBoxOnError ); + GET_SET_ACCESSOR( bool, NoStats ); + GET_SET_ACCESSOR( bool, ClipCursorWhenFullScreen ); + GET_SET_ACCESSOR( bool, ShowCursorWhenFullScreen ); + GET_SET_ACCESSOR( bool, ConstantFrameTime ); + GET_SET_ACCESSOR( float, TimePerFrame ); + GET_SET_ACCESSOR( bool, WireframeMode ); + GET_SET_ACCESSOR( bool, AutoChangeAdapter ); + GET_SET_ACCESSOR( bool, WindowCreatedWithDefaultPositions ); + GET_SET_ACCESSOR( int, ExitCode ); + + GET_SET_ACCESSOR( bool, DXUTInited ); + GET_SET_ACCESSOR( bool, WindowCreated ); + GET_SET_ACCESSOR( bool, DeviceCreated ); + GET_SET_ACCESSOR( bool, DXUTInitCalled ); + GET_SET_ACCESSOR( bool, WindowCreateCalled ); + GET_SET_ACCESSOR( bool, DeviceCreateCalled ); + GET_SET_ACCESSOR( bool, InsideDeviceCallback ); + GET_SET_ACCESSOR( bool, InsideMainloop ); + GET_SET_ACCESSOR( bool, DeviceObjectsCreated ); + GET_SET_ACCESSOR( bool, DeviceObjectsReset ); + GET_SET_ACCESSOR( bool, Active ); + GET_SET_ACCESSOR( bool, RenderingPaused ); + GET_SET_ACCESSOR( bool, TimePaused ); + GET_SET_ACCESSOR( int, PauseRenderingCount ); + GET_SET_ACCESSOR( int, PauseTimeCount ); + GET_SET_ACCESSOR( bool, DeviceLost ); + GET_SET_ACCESSOR( bool, NotifyOnMouseMove ); + GET_SET_ACCESSOR( bool, Automation ); + GET_SET_ACCESSOR( bool, InSizeMove ); + GET_SET_ACCESSOR( UINT, TimerLastID ); + GET_SET_ACCESSOR( bool, MessageWhenD3D11NotAvailable ); + GET_SET_ACCESSOR( bool, AppCalledWasKeyPressed ); + + GET_SET_ACCESSOR( D3D_FEATURE_LEVEL, OverrideForceFeatureLevel ); + GET_ACCESSOR( WCHAR*, ScreenShotName ); + GET_SET_ACCESSOR( bool, SaveScreenShot ); + GET_SET_ACCESSOR( bool, ExitAfterScreenShot ); + + + GET_SET_ACCESSOR( int, OverrideForceAPI ); + GET_SET_ACCESSOR( int, OverrideAdapterOrdinal ); + GET_SET_ACCESSOR( bool, OverrideWindowed ); + GET_SET_ACCESSOR( int, OverrideOutput ); + GET_SET_ACCESSOR( bool, OverrideFullScreen ); + GET_SET_ACCESSOR( int, OverrideStartX ); + GET_SET_ACCESSOR( int, OverrideStartY ); + GET_SET_ACCESSOR( int, OverrideWidth ); + GET_SET_ACCESSOR( int, OverrideHeight ); + GET_SET_ACCESSOR( bool, OverrideForceHAL ); + GET_SET_ACCESSOR( bool, OverrideForceREF ); + GET_SET_ACCESSOR( bool, OverrideConstantFrameTime ); + GET_SET_ACCESSOR( float, OverrideConstantTimePerFrame ); + GET_SET_ACCESSOR( int, OverrideQuitAfterFrame ); + GET_SET_ACCESSOR( int, OverrideForceVsync ); + GET_SET_ACCESSOR( bool, OverrideRelaunchMCE ); + GET_SET_ACCESSOR( bool, ReleasingSwapChain ); + GET_SET_ACCESSOR( bool, IsInGammaCorrectMode ); + + GET_SET_ACCESSOR( LPDXUTCALLBACKMODIFYDEVICESETTINGS, ModifyDeviceSettingsFunc ); + GET_SET_ACCESSOR( LPDXUTCALLBACKDEVICEREMOVED, DeviceRemovedFunc ); + GET_SET_ACCESSOR( LPDXUTCALLBACKFRAMEMOVE, FrameMoveFunc ); + GET_SET_ACCESSOR( LPDXUTCALLBACKKEYBOARD, KeyboardFunc ); + GET_SET_ACCESSOR( LPDXUTCALLBACKMOUSE, MouseFunc ); + GET_SET_ACCESSOR( LPDXUTCALLBACKMSGPROC, WindowMsgFunc ); + + GET_SET_ACCESSOR( LPDXUTCALLBACKISD3D9DEVICEACCEPTABLE, IsD3D9DeviceAcceptableFunc ); + GET_SET_ACCESSOR( LPDXUTCALLBACKD3D9DEVICECREATED, D3D9DeviceCreatedFunc ); + GET_SET_ACCESSOR( LPDXUTCALLBACKD3D9DEVICERESET, D3D9DeviceResetFunc ); + GET_SET_ACCESSOR( LPDXUTCALLBACKD3D9DEVICELOST, D3D9DeviceLostFunc ); + GET_SET_ACCESSOR( LPDXUTCALLBACKD3D9DEVICEDESTROYED, D3D9DeviceDestroyedFunc ); + GET_SET_ACCESSOR( LPDXUTCALLBACKD3D9FRAMERENDER, D3D9FrameRenderFunc ); + + GET_SET_ACCESSOR( LPDXUTCALLBACKISD3D11DEVICEACCEPTABLE, IsD3D11DeviceAcceptableFunc ); + GET_SET_ACCESSOR( LPDXUTCALLBACKD3D11DEVICECREATED, D3D11DeviceCreatedFunc ); + GET_SET_ACCESSOR( LPDXUTCALLBACKD3D11SWAPCHAINRESIZED, D3D11SwapChainResizedFunc ); + GET_SET_ACCESSOR( LPDXUTCALLBACKD3D11SWAPCHAINRELEASING, D3D11SwapChainReleasingFunc ); + GET_SET_ACCESSOR( LPDXUTCALLBACKD3D11DEVICEDESTROYED, D3D11DeviceDestroyedFunc ); + GET_SET_ACCESSOR( LPDXUTCALLBACKD3D11FRAMERENDER, D3D11FrameRenderFunc ); + + GET_SET_ACCESSOR( void*, ModifyDeviceSettingsFuncUserContext ); + GET_SET_ACCESSOR( void*, DeviceRemovedFuncUserContext ); + GET_SET_ACCESSOR( void*, FrameMoveFuncUserContext ); + GET_SET_ACCESSOR( void*, KeyboardFuncUserContext ); + GET_SET_ACCESSOR( void*, MouseFuncUserContext ); + GET_SET_ACCESSOR( void*, WindowMsgFuncUserContext ); + + GET_SET_ACCESSOR( void*, IsD3D9DeviceAcceptableFuncUserContext ); + GET_SET_ACCESSOR( void*, D3D9DeviceCreatedFuncUserContext ); + GET_SET_ACCESSOR( void*, D3D9DeviceResetFuncUserContext ); + GET_SET_ACCESSOR( void*, D3D9DeviceLostFuncUserContext ); + GET_SET_ACCESSOR( void*, D3D9DeviceDestroyedFuncUserContext ); + GET_SET_ACCESSOR( void*, D3D9FrameRenderFuncUserContext ); + + GET_SET_ACCESSOR( void*, IsD3D11DeviceAcceptableFuncUserContext ); + GET_SET_ACCESSOR( void*, D3D11DeviceCreatedFuncUserContext ); + GET_SET_ACCESSOR( void*, D3D11DeviceDestroyedFuncUserContext ); + GET_SET_ACCESSOR( void*, D3D11SwapChainResizedFuncUserContext ); + GET_SET_ACCESSOR( void*, D3D11SwapChainReleasingFuncUserContext ); + GET_SET_ACCESSOR( void*, D3D11FrameRenderFuncUserContext ); + + GET_SET_ACCESSOR( CGrowableArray*, TimerList ); + GET_ACCESSOR( bool*, Keys ); + GET_ACCESSOR( bool*, LastKeys ); + GET_ACCESSOR( bool*, MouseButtons ); + GET_ACCESSOR( WCHAR*, StaticFrameStats ); + GET_ACCESSOR( WCHAR*, FPSStats ); + GET_ACCESSOR( WCHAR*, FrameStats ); + GET_ACCESSOR( WCHAR*, DeviceStats ); + GET_ACCESSOR( WCHAR*, WindowTitle ); +}; + + +//-------------------------------------------------------------------------------------- +// Global state +//-------------------------------------------------------------------------------------- +DXUTState* g_pDXUTState = NULL; + +HRESULT WINAPI DXUTCreateState() +{ + if( g_pDXUTState == NULL ) + { + g_pDXUTState = new DXUTState; + if( NULL == g_pDXUTState ) + return E_OUTOFMEMORY; + } + return S_OK; +} + +void WINAPI DXUTDestroyState() +{ + SAFE_DELETE( g_pDXUTState ); +} + +class DXUTMemoryHelper +{ +public: + DXUTMemoryHelper() { DXUTCreateState(); } + ~DXUTMemoryHelper() { DXUTDestroyState(); } +}; + + +DXUTState& GetDXUTState() +{ + // This class will auto create the memory when its first accessed and delete it after the program exits WinMain. + // However the application can also call DXUTCreateState() & DXUTDestroyState() independantly if its wants + static DXUTMemoryHelper memory; + + return *g_pDXUTState; +} + + +//-------------------------------------------------------------------------------------- +// Internal functions forward declarations +//-------------------------------------------------------------------------------------- +void DXUTParseCommandLine( __inout WCHAR* strCommandLine, + bool bIgnoreFirstCommand = true ); +bool DXUTIsNextArg( __inout WCHAR*& strCmdLine, + __inout WCHAR* strArg ); +bool DXUTGetCmdParam( __inout WCHAR*& strCmdLine, + __inout_ecount(MAX_PATH) WCHAR* strFlag ); +void DXUTAllowShortcutKeys( bool bAllowKeys ); +void DXUTUpdateStaticFrameStats(); +void DXUTUpdateFrameStats(); + +LRESULT CALLBACK DXUTStaticWndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ); +void DXUTHandleTimers(); +void DXUTDisplayErrorMessage( HRESULT hr ); +int DXUTMapButtonToArrayIndex( BYTE vButton ); + +HRESULT DXUTChangeDevice( DXUTDeviceSettings* pNewDeviceSettings, + IDirect3DDevice9* pd3d9DeviceFromApp, + ID3D11Device* pd3d11DeviceFromApp, + bool bForceRecreate, + bool bClipWindowToSingleAdapter ); + +bool DXUTCanDeviceBeReset( DXUTDeviceSettings* pOldDeviceSettings, + DXUTDeviceSettings* pNewDeviceSettings, + IDirect3DDevice9* pd3d9DeviceFromApp, + ID3D11Device* pd3d11DeviceFromApp ); + + +HRESULT DXUTDelayLoadDXGI(); +HRESULT DXUTDelayLoadD3D9(); +HRESULT DXUTSnapDeviceSettingsToEnumDevice( DXUTDeviceSettings* pDeviceSettings, bool forceEnum, D3D_FEATURE_LEVEL forceFL = D3D_FEATURE_LEVEL(0) ); +void DXUTUpdateDeviceSettingsWithOverrides( DXUTDeviceSettings* pDeviceSettings ); +void DXUTCheckForDXGIFullScreenSwitch(); +void DXUTResizeDXGIBuffers( UINT Width, UINT Height, BOOL bFullscreen ); +void DXUTCheckForDXGIBufferChange(); +void DXUTCheckForWindowSizeChange(); +void DXUTCheckForWindowChangingMonitors(); +void DXUTCleanup3DEnvironment( bool bReleaseSettings ); +HMONITOR DXUTGetMonitorFromAdapter( DXUTDeviceSettings* pDeviceSettings ); +HRESULT DXUTGetAdapterOrdinalFromMonitor( HMONITOR hMonitor, UINT* pAdapterOrdinal ); +HRESULT DXUTGetOutputOrdinalFromMonitor( HMONITOR hMonitor, UINT* pOutputOrdinal ); +HRESULT DXUTHandleDeviceRemoved(); +void DXUTUpdateBackBufferDesc(); +void DXUTSetupCursor(); + +// Direct3D 9 +HRESULT DXUTCreate3DEnvironment9( IDirect3DDevice9* pd3dDeviceFromApp ); +HRESULT DXUTReset3DEnvironment9(); +void DXUTRender3DEnvironment9(); +void DXUTCleanup3DEnvironment9( bool bReleaseSettings = true ); +HRESULT DXUTSetD3D9DeviceCursor( IDirect3DDevice9* pd3dDevice, HCURSOR hCursor, bool bAddWatermark ); +void DXUTUpdateD3D9DeviceStats( D3DDEVTYPE DeviceType, DWORD BehaviorFlags, + D3DADAPTER_IDENTIFIER9* pAdapterIdentifier ); +HRESULT DXUTFindD3D9AdapterFormat( UINT AdapterOrdinal, D3DDEVTYPE DeviceType, D3DFORMAT BackBufferFormat, + BOOL Windowed, D3DFORMAT* pAdapterFormat ); + +// Direct3D 11 +HRESULT DXUTCreateD3D11Views( ID3D11Device* pd3dDevice, ID3D11DeviceContext* pd3dDeviceContext, DXUTDeviceSettings* pDeviceSettings ); +HRESULT DXUTCreate3DEnvironment11( ID3D11Device* pd3dDeviceFromApp ); +HRESULT DXUTReset3DEnvironment11(); +void DXUTRender3DEnvironment11(); +void DXUTCleanup3DEnvironment11( bool bReleaseSettings = true ); +void DXUTUpdateD3D11DeviceStats( D3D_DRIVER_TYPE DeviceType, DXGI_ADAPTER_DESC* pAdapterDesc ); + + +//-------------------------------------------------------------------------------------- +// Internal helper functions +//-------------------------------------------------------------------------------------- +bool DXUTIsD3D9( DXUTDeviceSettings* pDeviceSettings ) { return (pDeviceSettings && pDeviceSettings->ver == DXUT_D3D9_DEVICE ); }; +bool DXUTIsCurrentDeviceD3D9() { DXUTDeviceSettings* pDeviceSettings = GetDXUTState().GetCurrentDeviceSettings(); return DXUTIsD3D9(pDeviceSettings); }; +UINT DXUTGetBackBufferWidthFromDS( DXUTDeviceSettings* pNewDeviceSettings ) +{ + if( DXUTIsD3D9( pNewDeviceSettings ) ) + return pNewDeviceSettings->d3d9.pp.BackBufferWidth; + else + return pNewDeviceSettings->d3d11.sd.BufferDesc.Width; +} +UINT DXUTGetBackBufferHeightFromDS( DXUTDeviceSettings* pNewDeviceSettings ) +{ + if( DXUTIsD3D9(pNewDeviceSettings) ) + return pNewDeviceSettings->d3d9.pp.BackBufferHeight; + else + return pNewDeviceSettings->d3d11.sd.BufferDesc.Height; +} +bool DXUTGetIsWindowedFromDS( DXUTDeviceSettings* pNewDeviceSettings ) +{ + if (!pNewDeviceSettings) + return true; + + if( DXUTIsD3D9(pNewDeviceSettings) ) + return pNewDeviceSettings->d3d9.pp.Windowed ? true : false; + else + return pNewDeviceSettings->d3d11.sd.Windowed ? true : false; +} + + +//-------------------------------------------------------------------------------------- +// External state access functions +//-------------------------------------------------------------------------------------- +BOOL WINAPI DXUTGetMSAASwapChainCreated() { + DXUTDeviceSettings *psettings = GetDXUTState().GetCurrentDeviceSettings(); + if (psettings->ver == DXUT_D3D11_DEVICE) { + return psettings->d3d11.sd.SampleDesc.Count > 1; + }else if (psettings->ver == DXUT_D3D9_DEVICE) { + return (psettings->d3d9.pp.MultiSampleType >= D3DMULTISAMPLE_2_SAMPLES); + } + else return false; +} +IDirect3DDevice9* WINAPI DXUTGetD3D9Device() { return GetDXUTState().GetD3D9Device(); } +const D3DSURFACE_DESC* WINAPI DXUTGetD3D9BackBufferSurfaceDesc() { return GetDXUTState().GetBackBufferSurfaceDesc9(); } +const D3DCAPS9* WINAPI DXUTGetD3D9DeviceCaps() { return GetDXUTState().GetCaps(); } +ID3D11Device* WINAPI DXUTGetD3D11Device() { return GetDXUTState().GetD3D11Device(); } +D3D_FEATURE_LEVEL WINAPI DXUTGetD3D11DeviceFeatureLevel() { return GetDXUTState().GetD3D11FeatureLevel(); } +ID3D11DeviceContext* WINAPI DXUTGetD3D11DeviceContext() { return GetDXUTState().GetD3D11DeviceContext(); } +IDXGISwapChain* WINAPI DXUTGetDXGISwapChain() { return GetDXUTState().GetDXGISwapChain(); } +ID3D11RenderTargetView* WINAPI DXUTGetD3D11RenderTargetView() { return GetDXUTState().GetD3D11RenderTargetView(); } +ID3D11DepthStencilView* WINAPI DXUTGetD3D11DepthStencilView() { return GetDXUTState().GetD3D11DepthStencilView(); } +const DXGI_SURFACE_DESC* WINAPI DXUTGetDXGIBackBufferSurfaceDesc() { return GetDXUTState().GetBackBufferSurfaceDescDXGI(); } +HINSTANCE WINAPI DXUTGetHINSTANCE() { return GetDXUTState().GetHInstance(); } +HWND WINAPI DXUTGetHWND() { return DXUTIsWindowed() ? GetDXUTState().GetHWNDDeviceWindowed() : GetDXUTState().GetHWNDDeviceFullScreen(); } +HWND WINAPI DXUTGetHWNDFocus() { return GetDXUTState().GetHWNDFocus(); } +HWND WINAPI DXUTGetHWNDDeviceFullScreen() { return GetDXUTState().GetHWNDDeviceFullScreen(); } +HWND WINAPI DXUTGetHWNDDeviceWindowed() { return GetDXUTState().GetHWNDDeviceWindowed(); } +RECT WINAPI DXUTGetWindowClientRect() { RECT rc; GetClientRect( DXUTGetHWND(), &rc ); return rc; } +LONG WINAPI DXUTGetWindowWidth() { RECT rc = DXUTGetWindowClientRect(); return ((LONG)rc.right - rc.left); } +LONG WINAPI DXUTGetWindowHeight() { RECT rc = DXUTGetWindowClientRect(); return ((LONG)rc.bottom - rc.top); } +RECT WINAPI DXUTGetWindowClientRectAtModeChange() { RECT rc = { 0, 0, GetDXUTState().GetWindowBackBufferWidthAtModeChange(), GetDXUTState().GetWindowBackBufferHeightAtModeChange() }; return rc; } +RECT WINAPI DXUTGetFullsceenClientRectAtModeChange() { RECT rc = { 0, 0, GetDXUTState().GetFullScreenBackBufferWidthAtModeChange(), GetDXUTState().GetFullScreenBackBufferHeightAtModeChange() }; return rc; } +double WINAPI DXUTGetTime() { return GetDXUTState().GetTime(); } +float WINAPI DXUTGetElapsedTime() { return GetDXUTState().GetElapsedTime(); } +float WINAPI DXUTGetFPS() { return GetDXUTState().GetFPS(); } +LPCWSTR WINAPI DXUTGetWindowTitle() { return GetDXUTState().GetWindowTitle(); } +LPCWSTR WINAPI DXUTGetDeviceStats() { return GetDXUTState().GetDeviceStats(); } +bool WINAPI DXUTIsRenderingPaused() { return GetDXUTState().GetPauseRenderingCount() > 0; } +bool WINAPI DXUTIsTimePaused() { return GetDXUTState().GetPauseTimeCount() > 0; } +bool WINAPI DXUTIsActive() { return GetDXUTState().GetActive(); } +int WINAPI DXUTGetExitCode() { return GetDXUTState().GetExitCode(); } +bool WINAPI DXUTGetShowMsgBoxOnError() { return GetDXUTState().GetShowMsgBoxOnError(); } +bool WINAPI DXUTGetAutomation() { return GetDXUTState().GetAutomation(); } +bool WINAPI DXUTIsWindowed() { return DXUTGetIsWindowedFromDS( GetDXUTState().GetCurrentDeviceSettings() ); } +bool WINAPI DXUTIsInGammaCorrectMode() { return GetDXUTState().GetIsInGammaCorrectMode(); } +IDirect3D9* WINAPI DXUTGetD3D9Object() { DXUTDelayLoadD3D9(); return GetDXUTState().GetD3D9(); } +IDXGIFactory1* WINAPI DXUTGetDXGIFactory() { DXUTDelayLoadDXGI(); return GetDXUTState().GetDXGIFactory(); } +bool WINAPI DXUTIsD3D11Available() { DXUTDelayLoadDXGI(); return GetDXUTState().GetD3D11Available(); } +bool WINAPI DXUTIsAppRenderingWithD3D9() { return (GetDXUTState().GetD3D9Device() != NULL); } +bool WINAPI DXUTIsAppRenderingWithD3D11() { return (GetDXUTState().GetD3D11Device() != NULL); } + +//-------------------------------------------------------------------------------------- +// External callback setup functions +//-------------------------------------------------------------------------------------- + +// General callbacks +void WINAPI DXUTSetCallbackDeviceChanging( LPDXUTCALLBACKMODIFYDEVICESETTINGS pCallback, void* pUserContext ) { GetDXUTState().SetModifyDeviceSettingsFunc( pCallback ); GetDXUTState().SetModifyDeviceSettingsFuncUserContext( pUserContext ); } +void WINAPI DXUTSetCallbackDeviceRemoved( LPDXUTCALLBACKDEVICEREMOVED pCallback, void* pUserContext ) { GetDXUTState().SetDeviceRemovedFunc( pCallback ); GetDXUTState().SetDeviceRemovedFuncUserContext( pUserContext ); } +void WINAPI DXUTSetCallbackFrameMove( LPDXUTCALLBACKFRAMEMOVE pCallback, void* pUserContext ) { GetDXUTState().SetFrameMoveFunc( pCallback ); GetDXUTState().SetFrameMoveFuncUserContext( pUserContext ); } +void WINAPI DXUTSetCallbackKeyboard( LPDXUTCALLBACKKEYBOARD pCallback, void* pUserContext ) { GetDXUTState().SetKeyboardFunc( pCallback ); GetDXUTState().SetKeyboardFuncUserContext( pUserContext ); } +void WINAPI DXUTSetCallbackMouse( LPDXUTCALLBACKMOUSE pCallback, bool bIncludeMouseMove, void* pUserContext ) { GetDXUTState().SetMouseFunc( pCallback ); GetDXUTState().SetNotifyOnMouseMove( bIncludeMouseMove ); GetDXUTState().SetMouseFuncUserContext( pUserContext ); } +void WINAPI DXUTSetCallbackMsgProc( LPDXUTCALLBACKMSGPROC pCallback, void* pUserContext ) { GetDXUTState().SetWindowMsgFunc( pCallback ); GetDXUTState().SetWindowMsgFuncUserContext( pUserContext ); } + +// Direct3D 9 callbacks +void WINAPI DXUTSetCallbackD3D9DeviceAcceptable( LPDXUTCALLBACKISD3D9DEVICEACCEPTABLE pCallback, void* pUserContext ) { GetDXUTState().SetIsD3D9DeviceAcceptableFunc( pCallback ); GetDXUTState().SetIsD3D9DeviceAcceptableFuncUserContext( pUserContext ); } +void WINAPI DXUTSetCallbackD3D9DeviceCreated( LPDXUTCALLBACKD3D9DEVICECREATED pCallback, void* pUserContext ) { GetDXUTState().SetD3D9DeviceCreatedFunc( pCallback ); GetDXUTState().SetD3D9DeviceCreatedFuncUserContext( pUserContext ); } +void WINAPI DXUTSetCallbackD3D9DeviceReset( LPDXUTCALLBACKD3D9DEVICERESET pCallback, void* pUserContext ) { GetDXUTState().SetD3D9DeviceResetFunc( pCallback ); GetDXUTState().SetD3D9DeviceResetFuncUserContext( pUserContext ); } +void WINAPI DXUTSetCallbackD3D9DeviceLost( LPDXUTCALLBACKD3D9DEVICELOST pCallback, void* pUserContext ) { GetDXUTState().SetD3D9DeviceLostFunc( pCallback ); GetDXUTState().SetD3D9DeviceLostFuncUserContext( pUserContext ); } +void WINAPI DXUTSetCallbackD3D9DeviceDestroyed( LPDXUTCALLBACKD3D9DEVICEDESTROYED pCallback, void* pUserContext ) { GetDXUTState().SetD3D9DeviceDestroyedFunc( pCallback ); GetDXUTState().SetD3D9DeviceDestroyedFuncUserContext( pUserContext ); } +void WINAPI DXUTSetCallbackD3D9FrameRender( LPDXUTCALLBACKD3D9FRAMERENDER pCallback, void* pUserContext ) { GetDXUTState().SetD3D9FrameRenderFunc( pCallback ); GetDXUTState().SetD3D9FrameRenderFuncUserContext( pUserContext ); } +void DXUTGetCallbackD3D9DeviceAcceptable( LPDXUTCALLBACKISD3D9DEVICEACCEPTABLE* ppCallback, void** ppUserContext ) { *ppCallback = GetDXUTState().GetIsD3D9DeviceAcceptableFunc(); *ppUserContext = GetDXUTState().GetIsD3D9DeviceAcceptableFuncUserContext(); } + +// Direct3D 11 callbacks +void WINAPI DXUTSetCallbackD3D11DeviceAcceptable( LPDXUTCALLBACKISD3D11DEVICEACCEPTABLE pCallback, void* pUserContext ) { GetDXUTState().SetIsD3D11DeviceAcceptableFunc( pCallback ); GetDXUTState().SetIsD3D11DeviceAcceptableFuncUserContext( pUserContext ); } +void WINAPI DXUTSetCallbackD3D11DeviceCreated( LPDXUTCALLBACKD3D11DEVICECREATED pCallback, void* pUserContext ) { GetDXUTState().SetD3D11DeviceCreatedFunc( pCallback ); GetDXUTState().SetD3D11DeviceCreatedFuncUserContext( pUserContext ); } +void WINAPI DXUTSetCallbackD3D11SwapChainResized( LPDXUTCALLBACKD3D11SWAPCHAINRESIZED pCallback, void* pUserContext ) { GetDXUTState().SetD3D11SwapChainResizedFunc( pCallback ); GetDXUTState().SetD3D11SwapChainResizedFuncUserContext( pUserContext ); } +void WINAPI DXUTSetCallbackD3D11FrameRender( LPDXUTCALLBACKD3D11FRAMERENDER pCallback, void* pUserContext ) { GetDXUTState().SetD3D11FrameRenderFunc( pCallback ); GetDXUTState().SetD3D11FrameRenderFuncUserContext( pUserContext ); } +void WINAPI DXUTSetCallbackD3D11SwapChainReleasing( LPDXUTCALLBACKD3D11SWAPCHAINRELEASING pCallback, void* pUserContext ) { GetDXUTState().SetD3D11SwapChainReleasingFunc( pCallback ); GetDXUTState().SetD3D11SwapChainReleasingFuncUserContext( pUserContext ); } +void WINAPI DXUTSetCallbackD3D11DeviceDestroyed( LPDXUTCALLBACKD3D11DEVICEDESTROYED pCallback, void* pUserContext ) { GetDXUTState().SetD3D11DeviceDestroyedFunc( pCallback ); GetDXUTState().SetD3D11DeviceDestroyedFuncUserContext( pUserContext ); } +void DXUTGetCallbackD3D11DeviceAcceptable( LPDXUTCALLBACKISD3D11DEVICEACCEPTABLE* ppCallback, void** ppUserContext ) { *ppCallback = GetDXUTState().GetIsD3D11DeviceAcceptableFunc(); *ppUserContext = GetDXUTState().GetIsD3D11DeviceAcceptableFuncUserContext(); } + + +//-------------------------------------------------------------------------------------- +// Optionally parses the command line and sets if default hotkeys are handled +// +// Possible command line parameters are: +// -forcefeaturelevel:fl forces app to use a specified direct3D11 feature level +// -screenshotexit:filename save a screenshot to the filename.bmp and exit. +// -forceapi:# forces app to use specified Direct3D API version (fails if the application doesn't support this API or if no device is found) +// -adapter:# forces app to use this adapter # (fails if the adapter doesn't exist) +// -output:# [D3D11 only] forces app to use a particular output on the adapter (fails if the output doesn't exist) +// -windowed forces app to start windowed +// -fullscreen forces app to start full screen +// -forcehal forces app to use HAL (fails if HAL doesn't exist) +// -forceref forces app to use REF (fails if REF doesn't exist) +// -forcepurehwvp [D3D9 only] forces app to use pure HWVP (fails if device doesn't support it) +// -forcehwvp [D3D9 only] forces app to use HWVP (fails if device doesn't support it) +// -forceswvp [D3D9 only] forces app to use SWVP +// -forcevsync:# if # is 0, then vsync is disabled +// -width:# forces app to use # for width. for full screen, it will pick the closest possible supported mode +// -height:# forces app to use # for height. for full screen, it will pick the closest possible supported mode +// -startx:# forces app to use # for the x coord of the window position for windowed mode +// -starty:# forces app to use # for the y coord of the window position for windowed mode +// -constantframetime:# forces app to use constant frame time, where # is the time/frame in seconds +// -quitafterframe:x forces app to quit after # frames +// -noerrormsgboxes prevents the display of message boxes generated by the framework so the application can be run without user interaction +// -nostats prevents the display of the stats +// -relaunchmce re-launches the MCE UI after the app exits +// -automation a hint to other components that automation is active +//-------------------------------------------------------------------------------------- +HRESULT WINAPI DXUTInit( bool bParseCommandLine, + bool bShowMsgBoxOnError, + __in_opt WCHAR* strExtraCommandLineParams, + bool bThreadSafeDXUT ) +{ + g_bThreadSafe = bThreadSafeDXUT; + + GetDXUTState().SetDXUTInitCalled( true ); + + // Not always needed, but lets the app create GDI dialogs + InitCommonControls(); + + // Save the current sticky/toggle/filter key settings so DXUT can restore them later + STICKYKEYS sk = {sizeof(STICKYKEYS), 0}; + SystemParametersInfo(SPI_GETSTICKYKEYS, sizeof(STICKYKEYS), &sk, 0); + GetDXUTState().SetStartupStickyKeys( sk ); + + TOGGLEKEYS tk = {sizeof(TOGGLEKEYS), 0}; + SystemParametersInfo(SPI_GETTOGGLEKEYS, sizeof(TOGGLEKEYS), &tk, 0); + GetDXUTState().SetStartupToggleKeys( tk ); + + FILTERKEYS fk = {sizeof(FILTERKEYS), 0}; + SystemParametersInfo(SPI_GETFILTERKEYS, sizeof(FILTERKEYS), &fk, 0); + GetDXUTState().SetStartupFilterKeys( fk ); + + GetDXUTState().SetShowMsgBoxOnError( bShowMsgBoxOnError ); + + if( bParseCommandLine ) + DXUTParseCommandLine( GetCommandLine() ); + if( strExtraCommandLineParams ) + DXUTParseCommandLine( strExtraCommandLineParams, false ); + + // Reset the timer + DXUTGetGlobalTimer()->Reset(); + + GetDXUTState().SetDXUTInited( true ); + + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +// Parses the command line for parameters. See DXUTInit() for list +//-------------------------------------------------------------------------------------- +void DXUTParseCommandLine(__inout WCHAR* strCommandLine, + bool bIgnoreFirstCommand ) +{ + WCHAR* strCmdLine; + WCHAR strFlag[MAX_PATH]; + + int nNumArgs; + LPWSTR* pstrArgList = CommandLineToArgvW( strCommandLine, &nNumArgs ); + int iArgStart = 0; + if( bIgnoreFirstCommand ) + iArgStart = 1; + for( int iArg = iArgStart; iArg < nNumArgs; iArg++ ) + { + strCmdLine = pstrArgList[iArg]; + + // Handle flag args + if( *strCmdLine == L'/' || *strCmdLine == L'-' ) + { + strCmdLine++; + + if( DXUTIsNextArg( strCmdLine, L"forcefeaturelevel" ) ) + { + if( DXUTGetCmdParam( strCmdLine, strFlag ) ) + { + if (_wcsnicmp( strFlag, L"D3D_FEATURE_LEVEL_11_0", MAX_PATH) == 0 ) { + GetDXUTState().SetOverrideForceFeatureLevel(D3D_FEATURE_LEVEL_11_0); + }else if (_wcsnicmp( strFlag, L"D3D_FEATURE_LEVEL_10_1", MAX_PATH) == 0 ) { + GetDXUTState().SetOverrideForceFeatureLevel(D3D_FEATURE_LEVEL_10_1); + }else if (_wcsnicmp( strFlag, L"D3D_FEATURE_LEVEL_10_0", MAX_PATH) == 0 ) { + GetDXUTState().SetOverrideForceFeatureLevel(D3D_FEATURE_LEVEL_10_0); + }else if (_wcsnicmp( strFlag, L"D3D_FEATURE_LEVEL_9_3", MAX_PATH) == 0 ) { + GetDXUTState().SetOverrideForceFeatureLevel(D3D_FEATURE_LEVEL_9_3); + }else if (_wcsnicmp( strFlag, L"D3D_FEATURE_LEVEL_9_2", MAX_PATH) == 0 ) { + GetDXUTState().SetOverrideForceFeatureLevel(D3D_FEATURE_LEVEL_9_2); + }else if (_wcsnicmp( strFlag, L"D3D_FEATURE_LEVEL_9_1", MAX_PATH) == 0 ) { + GetDXUTState().SetOverrideForceFeatureLevel(D3D_FEATURE_LEVEL_9_1); + } + + + continue; + } + } + + if( DXUTIsNextArg( strCmdLine, L"forceapi" ) ) + { + if( DXUTGetCmdParam( strCmdLine, strFlag ) ) + { + int nAPIVersion = _wtoi( strFlag ); + GetDXUTState().SetOverrideForceAPI( nAPIVersion ); + continue; + } + } + + if( DXUTIsNextArg( strCmdLine, L"adapter" ) ) + { + if( DXUTGetCmdParam( strCmdLine, strFlag ) ) + { + int nAdapter = _wtoi( strFlag ); + GetDXUTState().SetOverrideAdapterOrdinal( nAdapter ); + continue; + } + } + + if( DXUTIsNextArg( strCmdLine, L"windowed" ) ) + { + GetDXUTState().SetOverrideWindowed( true ); + continue; + } + + if( DXUTIsNextArg( strCmdLine, L"output" ) ) + { + if( DXUTGetCmdParam( strCmdLine, strFlag ) ) + { + int Output = _wtoi( strFlag ); + GetDXUTState().SetOverrideOutput( Output ); + continue; + } + } + + if( DXUTIsNextArg( strCmdLine, L"fullscreen" ) ) + { + GetDXUTState().SetOverrideFullScreen( true ); + continue; + } + + if( DXUTIsNextArg( strCmdLine, L"forcehal" ) ) + { + GetDXUTState().SetOverrideForceHAL( true ); + continue; + } + if( DXUTIsNextArg( strCmdLine, L"screenshotexit" ) ) { + if( DXUTGetCmdParam( strCmdLine, strFlag ) ) + { + GetDXUTState().SetExitAfterScreenShot( true ); + GetDXUTState().SetSaveScreenShot( true ); + swprintf_s( GetDXUTState().GetScreenShotName(), 256, L"%s.bmp", strFlag ); + continue; + } + } + if( DXUTIsNextArg( strCmdLine, L"forceref" ) ) + { + GetDXUTState().SetOverrideForceREF( true ); + continue; + } + + if( DXUTIsNextArg( strCmdLine, L"forcevsync" ) ) + { + if( DXUTGetCmdParam( strCmdLine, strFlag ) ) + { + int nOn = _wtoi( strFlag ); + GetDXUTState().SetOverrideForceVsync( nOn ); + continue; + } + } + + if( DXUTIsNextArg( strCmdLine, L"width" ) ) + { + if( DXUTGetCmdParam( strCmdLine, strFlag ) ) + { + int nWidth = _wtoi( strFlag ); + GetDXUTState().SetOverrideWidth( nWidth ); + continue; + } + } + + if( DXUTIsNextArg( strCmdLine, L"height" ) ) + { + if( DXUTGetCmdParam( strCmdLine, strFlag ) ) + { + int nHeight = _wtoi( strFlag ); + GetDXUTState().SetOverrideHeight( nHeight ); + continue; + } + } + + if( DXUTIsNextArg( strCmdLine, L"startx" ) ) + { + if( DXUTGetCmdParam( strCmdLine, strFlag ) ) + { + int nX = _wtoi( strFlag ); + GetDXUTState().SetOverrideStartX( nX ); + continue; + } + } + + if( DXUTIsNextArg( strCmdLine, L"starty" ) ) + { + if( DXUTGetCmdParam( strCmdLine, strFlag ) ) + { + int nY = _wtoi( strFlag ); + GetDXUTState().SetOverrideStartY( nY ); + continue; + } + } + + if( DXUTIsNextArg( strCmdLine, L"constantframetime" ) ) + { + float fTimePerFrame; + if( DXUTGetCmdParam( strCmdLine, strFlag ) ) + fTimePerFrame = ( float )wcstod( strFlag, NULL ); + else + fTimePerFrame = 0.0333f; + GetDXUTState().SetOverrideConstantFrameTime( true ); + GetDXUTState().SetOverrideConstantTimePerFrame( fTimePerFrame ); + DXUTSetConstantFrameTime( true, fTimePerFrame ); + continue; + } + + if( DXUTIsNextArg( strCmdLine, L"quitafterframe" ) ) + { + if( DXUTGetCmdParam( strCmdLine, strFlag ) ) + { + int nFrame = _wtoi( strFlag ); + GetDXUTState().SetOverrideQuitAfterFrame( nFrame ); + continue; + } + } + + if( DXUTIsNextArg( strCmdLine, L"noerrormsgboxes" ) ) + { + GetDXUTState().SetShowMsgBoxOnError( false ); + continue; + } + + if( DXUTIsNextArg( strCmdLine, L"nostats" ) ) + { + GetDXUTState().SetNoStats( true ); + continue; + } + + if( DXUTIsNextArg( strCmdLine, L"relaunchmce" ) ) + { + GetDXUTState().SetOverrideRelaunchMCE( true ); + continue; + } + + if( DXUTIsNextArg( strCmdLine, L"automation" ) ) + { + GetDXUTState().SetAutomation( true ); + continue; + } + } + + // Unrecognized flag + wcscpy_s( strFlag, 256, strCmdLine ); + WCHAR* strSpace = strFlag; + while( *strSpace && ( *strSpace > L' ' ) ) + strSpace++; + *strSpace = 0; + + DXUTOutputDebugString( L"Unrecognized flag: %s", strFlag ); + strCmdLine += wcslen( strFlag ); + } + + LocalFree( pstrArgList ); +} + + +//-------------------------------------------------------------------------------------- +// Helper function for DXUTParseCommandLine +//-------------------------------------------------------------------------------------- +bool DXUTIsNextArg( __inout WCHAR*& strCmdLine, + __inout WCHAR* strArg ) +{ + int nArgLen = ( int )wcslen( strArg ); + int nCmdLen = ( int )wcslen( strCmdLine ); + + if( nCmdLen >= nArgLen && + _wcsnicmp( strCmdLine, strArg, nArgLen ) == 0 && + ( strCmdLine[nArgLen] == 0 || strCmdLine[nArgLen] == L':' ) ) + { + strCmdLine += nArgLen; + return true; + } + + return false; +} + + +//-------------------------------------------------------------------------------------- +// Helper function for DXUTParseCommandLine. Updates strCmdLine and strFlag +// Example: if strCmdLine=="-width:1024 -forceref" +// then after: strCmdLine==" -forceref" and strFlag=="1024" +//-------------------------------------------------------------------------------------- +bool DXUTGetCmdParam( __inout WCHAR*& strCmdLine, + __inout_ecount(MAX_PATH) WCHAR* strFlag ) +{ + if( *strCmdLine == L':' ) + { + strCmdLine++; // Skip ':' + + // Place NULL terminator in strFlag after current token + wcscpy_s( strFlag, 256, strCmdLine ); + WCHAR* strSpace = strFlag; + while( *strSpace && ( *strSpace > L' ' ) ) + strSpace++; + *strSpace = 0; + + // Update strCmdLine + strCmdLine += wcslen( strFlag ); + return true; + } + else + { + strFlag[0] = 0; + return false; + } +} + + +//-------------------------------------------------------------------------------------- +// Creates a window with the specified window title, icon, menu, and +// starting position. If DXUTInit() has not already been called, it will +// call it with the default parameters. Instead of calling this, you can +// call DXUTSetWindow() to use an existing window. +//-------------------------------------------------------------------------------------- +HRESULT WINAPI DXUTCreateWindow( const WCHAR* strWindowTitle, HINSTANCE hInstance, + HICON hIcon, HMENU hMenu, int x, int y ) +{ + HRESULT hr; + + // Not allowed to call this from inside the device callbacks + if( GetDXUTState().GetInsideDeviceCallback() ) + return DXUT_ERR_MSGBOX( L"DXUTCreateWindow", E_FAIL ); + + GetDXUTState().SetWindowCreateCalled( true ); + + if( !GetDXUTState().GetDXUTInited() ) + { + // If DXUTInit() was already called and failed, then fail. + // DXUTInit() must first succeed for this function to succeed + if( GetDXUTState().GetDXUTInitCalled() ) + return E_FAIL; + + // If DXUTInit() hasn't been called, then automatically call it + // with default params + hr = DXUTInit(); + if( FAILED( hr ) ) + return hr; + } + + if( DXUTGetHWNDFocus() == NULL ) + { + if( hInstance == NULL ) + hInstance = ( HINSTANCE )GetModuleHandle( NULL ); + GetDXUTState().SetHInstance( hInstance ); + + WCHAR szExePath[MAX_PATH]; + GetModuleFileName( NULL, szExePath, MAX_PATH ); + if( hIcon == NULL ) // If the icon is NULL, then use the first one found in the exe + hIcon = ExtractIcon( hInstance, szExePath, 0 ); + + // Register the windows class + WNDCLASS wndClass; + wndClass.style = CS_DBLCLKS; + wndClass.lpfnWndProc = DXUTStaticWndProc; + wndClass.cbClsExtra = 0; + wndClass.cbWndExtra = 0; + wndClass.hInstance = hInstance; + wndClass.hIcon = hIcon; + wndClass.hCursor = LoadCursor( NULL, IDC_ARROW ); + wndClass.hbrBackground = ( HBRUSH )GetStockObject( BLACK_BRUSH ); + wndClass.lpszMenuName = NULL; + wndClass.lpszClassName = L"Direct3DWindowClass"; + + if( !RegisterClass( &wndClass ) ) + { + DWORD dwError = GetLastError(); + if( dwError != ERROR_CLASS_ALREADY_EXISTS ) + return DXUT_ERR_MSGBOX( L"RegisterClass", HRESULT_FROM_WIN32(dwError) ); + } + + // Override the window's initial & size position if there were cmd line args + if( GetDXUTState().GetOverrideStartX() != -1 ) + x = GetDXUTState().GetOverrideStartX(); + if( GetDXUTState().GetOverrideStartY() != -1 ) + y = GetDXUTState().GetOverrideStartY(); + + GetDXUTState().SetWindowCreatedWithDefaultPositions( false ); + if( x == CW_USEDEFAULT && y == CW_USEDEFAULT ) + GetDXUTState().SetWindowCreatedWithDefaultPositions( true ); + + // Find the window's initial size, but it might be changed later + int nDefaultWidth = 640; + int nDefaultHeight = 480; + if( GetDXUTState().GetOverrideWidth() != 0 ) + nDefaultWidth = GetDXUTState().GetOverrideWidth(); + if( GetDXUTState().GetOverrideHeight() != 0 ) + nDefaultHeight = GetDXUTState().GetOverrideHeight(); + + RECT rc; + SetRect( &rc, 0, 0, nDefaultWidth, nDefaultHeight ); + AdjustWindowRect( &rc, WS_OVERLAPPEDWINDOW, ( hMenu != NULL ) ? true : false ); + + WCHAR* strCachedWindowTitle = GetDXUTState().GetWindowTitle(); + wcscpy_s( strCachedWindowTitle, 256, strWindowTitle ); + + // Create the render window + HWND hWnd = CreateWindow( L"Direct3DWindowClass", strWindowTitle, WS_OVERLAPPEDWINDOW, + x, y, ( rc.right - rc.left ), ( rc.bottom - rc.top ), 0, + hMenu, hInstance, 0 ); + if( hWnd == NULL ) + { + DWORD dwError = GetLastError(); + return DXUT_ERR_MSGBOX( L"CreateWindow", HRESULT_FROM_WIN32(dwError) ); + } + + GetDXUTState().SetWindowCreated( true ); + GetDXUTState().SetHWNDFocus( hWnd ); + GetDXUTState().SetHWNDDeviceFullScreen( hWnd ); + GetDXUTState().SetHWNDDeviceWindowed( hWnd ); + } + + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +// Sets a previously created window for the framework to use. If DXUTInit() +// has not already been called, it will call it with the default parameters. +// Instead of calling this, you can call DXUTCreateWindow() to create a new window. +//-------------------------------------------------------------------------------------- +HRESULT WINAPI DXUTSetWindow( HWND hWndFocus, HWND hWndDeviceFullScreen, HWND hWndDeviceWindowed, bool bHandleMessages ) +{ + HRESULT hr; + + // Not allowed to call this from inside the device callbacks + if( GetDXUTState().GetInsideDeviceCallback() ) + return DXUT_ERR_MSGBOX( L"DXUTCreateWindow", E_FAIL ); + + GetDXUTState().SetWindowCreateCalled( true ); + + // To avoid confusion, we do not allow any HWND to be NULL here. The + // caller must pass in valid HWND for all three parameters. The same + // HWND may be used for more than one parameter. + if( hWndFocus == NULL || hWndDeviceFullScreen == NULL || hWndDeviceWindowed == NULL ) + return DXUT_ERR_MSGBOX( L"DXUTSetWindow", E_INVALIDARG ); + + // If subclassing the window, set the pointer to the local window procedure + if( bHandleMessages ) + { + // Switch window procedures +#ifdef _WIN64 + LONG_PTR nResult = SetWindowLongPtr( hWndFocus, GWLP_WNDPROC, (LONG_PTR)DXUTStaticWndProc ); +#else + LONG_PTR nResult = SetWindowLongPtr( hWndFocus, GWLP_WNDPROC, ( LONG )( LONG_PTR )DXUTStaticWndProc ); +#endif + + DWORD dwError = GetLastError(); + if( nResult == 0 ) + return DXUT_ERR_MSGBOX( L"SetWindowLongPtr", HRESULT_FROM_WIN32(dwError) ); + } + + if( !GetDXUTState().GetDXUTInited() ) + { + // If DXUTInit() was already called and failed, then fail. + // DXUTInit() must first succeed for this function to succeed + if( GetDXUTState().GetDXUTInitCalled() ) + return E_FAIL; + + // If DXUTInit() hasn't been called, then automatically call it + // with default params + hr = DXUTInit(); + if( FAILED( hr ) ) + return hr; + } + + WCHAR* strCachedWindowTitle = GetDXUTState().GetWindowTitle(); + GetWindowText( hWndFocus, strCachedWindowTitle, 255 ); + strCachedWindowTitle[255] = 0; + + HINSTANCE hInstance = ( HINSTANCE )( LONG_PTR )GetWindowLongPtr( hWndFocus, GWLP_HINSTANCE ); + GetDXUTState().SetHInstance( hInstance ); + GetDXUTState().SetWindowCreatedWithDefaultPositions( false ); + GetDXUTState().SetWindowCreated( true ); + GetDXUTState().SetHWNDFocus( hWndFocus ); + GetDXUTState().SetHWNDDeviceFullScreen( hWndDeviceFullScreen ); + GetDXUTState().SetHWNDDeviceWindowed( hWndDeviceWindowed ); + + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +// Handles window messages +//-------------------------------------------------------------------------------------- +LRESULT CALLBACK DXUTStaticWndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) +{ + + // Consolidate the keyboard messages and pass them to the app's keyboard callback + if( uMsg == WM_KEYDOWN || + uMsg == WM_SYSKEYDOWN || + uMsg == WM_KEYUP || + uMsg == WM_SYSKEYUP ) + { + bool bKeyDown = ( uMsg == WM_KEYDOWN || uMsg == WM_SYSKEYDOWN ); + DWORD dwMask = ( 1 << 29 ); + bool bAltDown = ( ( lParam & dwMask ) != 0 ); + + bool* bKeys = GetDXUTState().GetKeys(); + bKeys[ ( BYTE )( wParam & 0xFF ) ] = bKeyDown; + + LPDXUTCALLBACKKEYBOARD pCallbackKeyboard = GetDXUTState().GetKeyboardFunc(); + if( pCallbackKeyboard ) + pCallbackKeyboard( ( UINT )wParam, bKeyDown, bAltDown, GetDXUTState().GetKeyboardFuncUserContext() ); + } + + // Consolidate the mouse button messages and pass them to the app's mouse callback + if( uMsg == WM_LBUTTONDOWN || + uMsg == WM_LBUTTONUP || + uMsg == WM_LBUTTONDBLCLK || + uMsg == WM_MBUTTONDOWN || + uMsg == WM_MBUTTONUP || + uMsg == WM_MBUTTONDBLCLK || + uMsg == WM_RBUTTONDOWN || + uMsg == WM_RBUTTONUP || + uMsg == WM_RBUTTONDBLCLK || + uMsg == WM_XBUTTONDOWN || + uMsg == WM_XBUTTONUP || + uMsg == WM_XBUTTONDBLCLK || + uMsg == WM_MOUSEWHEEL || + ( GetDXUTState().GetNotifyOnMouseMove() && uMsg == WM_MOUSEMOVE ) ) + { + int xPos = ( short )LOWORD( lParam ); + int yPos = ( short )HIWORD( lParam ); + + if( uMsg == WM_MOUSEWHEEL ) + { + // WM_MOUSEWHEEL passes screen mouse coords + // so convert them to client coords + POINT pt; + pt.x = xPos; pt.y = yPos; + ScreenToClient( hWnd, &pt ); + xPos = pt.x; yPos = pt.y; + } + + int nMouseWheelDelta = 0; + if( uMsg == WM_MOUSEWHEEL ) + nMouseWheelDelta = ( short )HIWORD( wParam ); + + int nMouseButtonState = LOWORD( wParam ); + bool bLeftButton = ( ( nMouseButtonState & MK_LBUTTON ) != 0 ); + bool bRightButton = ( ( nMouseButtonState & MK_RBUTTON ) != 0 ); + bool bMiddleButton = ( ( nMouseButtonState & MK_MBUTTON ) != 0 ); + bool bSideButton1 = ( ( nMouseButtonState & MK_XBUTTON1 ) != 0 ); + bool bSideButton2 = ( ( nMouseButtonState & MK_XBUTTON2 ) != 0 ); + + bool* bMouseButtons = GetDXUTState().GetMouseButtons(); + bMouseButtons[0] = bLeftButton; + bMouseButtons[1] = bMiddleButton; + bMouseButtons[2] = bRightButton; + bMouseButtons[3] = bSideButton1; + bMouseButtons[4] = bSideButton2; + + LPDXUTCALLBACKMOUSE pCallbackMouse = GetDXUTState().GetMouseFunc(); + if( pCallbackMouse ) + pCallbackMouse( bLeftButton, bRightButton, bMiddleButton, bSideButton1, bSideButton2, nMouseWheelDelta, + xPos, yPos, GetDXUTState().GetMouseFuncUserContext() ); + } + + // Pass all messages to the app's MsgProc callback, and don't + // process further messages if the apps says not to. + LPDXUTCALLBACKMSGPROC pCallbackMsgProc = GetDXUTState().GetWindowMsgFunc(); + if( pCallbackMsgProc ) + { + bool bNoFurtherProcessing = false; + LRESULT nResult = pCallbackMsgProc( hWnd, uMsg, wParam, lParam, &bNoFurtherProcessing, + GetDXUTState().GetWindowMsgFuncUserContext() ); + if( bNoFurtherProcessing ) + return nResult; + } + + switch( uMsg ) + { + case WM_PAINT: + { + + // Handle paint messages when the app is paused + if( DXUTIsRenderingPaused() && + GetDXUTState().GetDeviceObjectsCreated() && GetDXUTState().GetDeviceObjectsReset() ) + { + HRESULT hr; + double fTime = DXUTGetTime(); + float fElapsedTime = DXUTGetElapsedTime(); + + if( DXUTIsCurrentDeviceD3D9() ) + { + IDirect3DDevice9* pd3dDevice = DXUTGetD3D9Device(); + if( pd3dDevice ) + { + LPDXUTCALLBACKD3D9FRAMERENDER pCallbackFrameRender = GetDXUTState().GetD3D9FrameRenderFunc(); + if( pCallbackFrameRender != NULL ) + pCallbackFrameRender( pd3dDevice, fTime, fElapsedTime, + GetDXUTState().GetD3D9FrameRenderFuncUserContext() ); + + hr = pd3dDevice->Present( NULL, NULL, NULL, NULL ); + if( D3DERR_DEVICELOST == hr ) + { + GetDXUTState().SetDeviceLost( true ); + } + else if( D3DERR_DRIVERINTERNALERROR == hr ) + { + // When D3DERR_DRIVERINTERNALERROR is returned from Present(), + // the application can do one of the following: + // + // - End, with the pop-up window saying that the application cannot continue + // because of problems in the display adapter and that the user should + // contact the adapter manufacturer. + // + // - Attempt to restart by calling IDirect3DDevice9::Reset, which is essentially the same + // path as recovering from a lost device. If IDirect3DDevice9::Reset fails with + // D3DERR_DRIVERINTERNALERROR, the application should end immediately with the message + // that the user should contact the adapter manufacturer. + // + // The framework attempts the path of resetting the device + // + GetDXUTState().SetDeviceLost( true ); + } + } + } + else + { + ID3D11Device* pd3dDevice = DXUTGetD3D11Device(); + ID3D11DeviceContext *pDeferred = DXUTGetD3D11DeviceContext(); + if( pd3dDevice ) + { + LPDXUTCALLBACKD3D11FRAMERENDER pCallbackFrameRender = GetDXUTState().GetD3D11FrameRenderFunc(); + if( pCallbackFrameRender != NULL && + !GetDXUTState().GetRenderingOccluded() ) + { + pCallbackFrameRender( pd3dDevice,pDeferred, fTime, fElapsedTime, + GetDXUTState().GetD3D11FrameRenderFuncUserContext() ); + } + + DWORD dwFlags = 0; + if( GetDXUTState().GetRenderingOccluded() ) + dwFlags = DXGI_PRESENT_TEST; + else + dwFlags = GetDXUTState().GetCurrentDeviceSettings()->d3d11.PresentFlags; + + IDXGISwapChain* pSwapChain = DXUTGetDXGISwapChain(); + hr = pSwapChain->Present( 0, GetDXUTState().GetCurrentDeviceSettings()->d3d11.PresentFlags ); + if( DXGI_STATUS_OCCLUDED == hr ) + { + // There is a window covering our entire rendering area. + // Don't render until we're visible again. + GetDXUTState().SetRenderingOccluded( true ); + } + else if( SUCCEEDED( hr ) ) + { + if( GetDXUTState().GetRenderingOccluded() ) + { + // Now that we're no longer occluded + // allow us to render again + GetDXUTState().SetRenderingOccluded( false ); + } + } + } + } + } + break; + } + + case WM_SIZE: + + if( SIZE_MINIMIZED == wParam ) + { + DXUTPause( true, true ); // Pause while we're minimized + + GetDXUTState().SetMinimized( true ); + GetDXUTState().SetMaximized( false ); + } + else + { + RECT rcCurrentClient; + GetClientRect( DXUTGetHWND(), &rcCurrentClient ); + if( rcCurrentClient.top == 0 && rcCurrentClient.bottom == 0 ) + { + // Rapidly clicking the task bar to minimize and restore a window + // can cause a WM_SIZE message with SIZE_RESTORED when + // the window has actually become minimized due to rapid change + // so just ignore this message + } + else if( SIZE_MAXIMIZED == wParam ) + { + if( GetDXUTState().GetMinimized() ) + DXUTPause( false, false ); // Unpause since we're no longer minimized + GetDXUTState().SetMinimized( false ); + GetDXUTState().SetMaximized( true ); + DXUTCheckForWindowSizeChange(); + DXUTCheckForWindowChangingMonitors(); + } + else if( SIZE_RESTORED == wParam ) + { + //DXUTCheckForDXGIFullScreenSwitch(); + if( GetDXUTState().GetMaximized() ) + { + GetDXUTState().SetMaximized( false ); + DXUTCheckForWindowSizeChange(); + DXUTCheckForWindowChangingMonitors(); + } + else if( GetDXUTState().GetMinimized() ) + { + DXUTPause( false, false ); // Unpause since we're no longer minimized + GetDXUTState().SetMinimized( false ); + DXUTCheckForWindowSizeChange(); + DXUTCheckForWindowChangingMonitors(); + } + else if( GetDXUTState().GetInSizeMove() ) + { + // If we're neither maximized nor minimized, the window size + // is changing by the user dragging the window edges. In this + // case, we don't reset the device yet -- we wait until the + // user stops dragging, and a WM_EXITSIZEMOVE message comes. + } + else + { + // This WM_SIZE come from resizing the window via an API like SetWindowPos() so + // resize and reset the device now. + DXUTCheckForWindowSizeChange(); + DXUTCheckForWindowChangingMonitors(); + } + } + } + + break; + + + case WM_GETMINMAXINFO: + ( ( MINMAXINFO* )lParam )->ptMinTrackSize.x = DXUT_MIN_WINDOW_SIZE_X; + ( ( MINMAXINFO* )lParam )->ptMinTrackSize.y = DXUT_MIN_WINDOW_SIZE_Y; + break; + + case WM_ENTERSIZEMOVE: + // Halt frame movement while the app is sizing or moving + DXUTPause( true, true ); + GetDXUTState().SetInSizeMove( true ); + break; + + case WM_EXITSIZEMOVE: + DXUTPause( false, false ); + DXUTCheckForWindowSizeChange(); + DXUTCheckForWindowChangingMonitors(); + GetDXUTState().SetInSizeMove( false ); + break; + + case WM_MOUSEMOVE: + if( DXUTIsActive() && !DXUTIsWindowed() ) + { + if( DXUTIsCurrentDeviceD3D9() ) + { + IDirect3DDevice9* pd3dDevice = DXUTGetD3D9Device(); + if( pd3dDevice ) + { + POINT ptCursor; + GetCursorPos( &ptCursor ); + pd3dDevice->SetCursorPosition( ptCursor.x, ptCursor.y, 0 ); + } + } + else + { + // For D3D11, no processing is necessary. D3D11 cursor + // is handled in the traditional Windows manner. + } + } + break; + + case WM_SETCURSOR: + if( DXUTIsActive() && !DXUTIsWindowed() ) + { + if( DXUTIsCurrentDeviceD3D9() ) + { + IDirect3DDevice9* pd3dDevice = DXUTGetD3D9Device(); + if( pd3dDevice && GetDXUTState().GetShowCursorWhenFullScreen() ) + pd3dDevice->ShowCursor( true ); + } + else + { + if( !GetDXUTState().GetShowCursorWhenFullScreen() ) + SetCursor( NULL ); + } + + return true; // prevent Windows from setting cursor to window class cursor + } + break; + + case WM_ACTIVATEAPP: + if( wParam == TRUE && !DXUTIsActive() ) // Handle only if previously not active + { + GetDXUTState().SetActive( true ); + + // Enable controller rumble & input when activating app + DXUTEnableXInput( true ); + + // The GetMinimizedWhileFullscreen() varible is used instead of !DXUTIsWindowed() + // to handle the rare case toggling to windowed mode while the fullscreen application + // is minimized and thus making the pause count wrong + if( GetDXUTState().GetMinimizedWhileFullscreen() ) + { + if( DXUTIsD3D9( GetDXUTState().GetCurrentDeviceSettings() ) ) + DXUTPause( false, false ); // Unpause since we're no longer minimized + GetDXUTState().SetMinimizedWhileFullscreen( false ); + + if( DXUTIsAppRenderingWithD3D11() ) + { + DXUTToggleFullScreen(); + } + } + + // Upon returning to this app, potentially disable shortcut keys + // (Windows key, accessibility shortcuts) + DXUTAllowShortcutKeys( ( DXUTIsWindowed() ) ? GetDXUTState().GetAllowShortcutKeysWhenWindowed() : + GetDXUTState().GetAllowShortcutKeysWhenFullscreen() ); + + } + else if( wParam == FALSE && DXUTIsActive() ) // Handle only if previously active + { + GetDXUTState().SetActive( false ); + + // Disable any controller rumble & input when de-activating app + DXUTEnableXInput( false ); + + if( !DXUTIsWindowed() ) + { + // Going from full screen to a minimized state + ClipCursor( NULL ); // don't limit the cursor anymore + if( DXUTIsD3D9( GetDXUTState().GetCurrentDeviceSettings() ) ) + DXUTPause( true, true ); // Pause while we're minimized (take care not to pause twice by handling this message twice) + GetDXUTState().SetMinimizedWhileFullscreen( true ); + } + + // Restore shortcut keys (Windows key, accessibility shortcuts) to original state + // + // This is important to call here if the shortcuts are disabled, + // because if this is not done then the Windows key will continue to + // be disabled while this app is running which is very bad. + // If the app crashes, the Windows key will return to normal. + DXUTAllowShortcutKeys( true ); + } + break; + + case WM_ENTERMENULOOP: + // Pause the app when menus are displayed + DXUTPause( true, true ); + break; + + case WM_EXITMENULOOP: + DXUTPause( false, false ); + break; + + case WM_MENUCHAR: + // A menu is active and the user presses a key that does not correspond to any mnemonic or accelerator key + // So just ignore and don't beep + return MAKELRESULT( 0, MNC_CLOSE ); + break; + + case WM_NCHITTEST: + // Prevent the user from selecting the menu in full screen mode + if( !DXUTIsWindowed() ) + return HTCLIENT; + break; + + case WM_POWERBROADCAST: + switch( wParam ) + { +#ifndef PBT_APMQUERYSUSPEND +#define PBT_APMQUERYSUSPEND 0x0000 +#endif + case PBT_APMQUERYSUSPEND: + // At this point, the app should save any data for open + // network connections, files, etc., and prepare to go into + // a suspended mode. The app can use the MsgProc callback + // to handle this if desired. + return true; + +#ifndef PBT_APMRESUMESUSPEND +#define PBT_APMRESUMESUSPEND 0x0007 +#endif + case PBT_APMRESUMESUSPEND: + // At this point, the app should recover any data, network + // connections, files, etc., and resume running from when + // the app was suspended. The app can use the MsgProc callback + // to handle this if desired. + + // QPC may lose consistency when suspending, so reset the timer + // upon resume. + DXUTGetGlobalTimer()->Reset(); + GetDXUTState().SetLastStatsUpdateTime( 0 ); + return true; + } + break; + + case WM_SYSCOMMAND: + // Prevent moving/sizing in full screen mode + switch( ( wParam & 0xFFF0 ) ) + { + case SC_MOVE: + case SC_SIZE: + case SC_MAXIMIZE: + case SC_KEYMENU: + if( !DXUTIsWindowed() ) + return 0; + break; + } + break; + + case WM_SYSKEYDOWN: + { + switch( wParam ) + { + case VK_RETURN: + { + if( GetDXUTState().GetHandleAltEnter() && DXUTIsAppRenderingWithD3D9() ) + { + // Toggle full screen upon alt-enter + DWORD dwMask = ( 1 << 29 ); + if( ( lParam & dwMask ) != 0 ) // Alt is down also + { + // Toggle the full screen/window mode + DXUTPause( true, true ); + DXUTToggleFullScreen(); + DXUTPause( false, false ); + return 0; + } + } + + } + } + break; + } + + case WM_KEYDOWN: + { + switch( wParam ) + { + case VK_ESCAPE: + { + if( GetDXUTState().GetHandleEscape() ) + SendMessage( hWnd, WM_CLOSE, 0, 0 ); + break; + } + + case VK_PAUSE: + { + if( GetDXUTState().GetHandlePause() ) + { + bool bTimePaused = DXUTIsTimePaused(); + bTimePaused = !bTimePaused; + if( bTimePaused ) + DXUTPause( true, false ); + else + DXUTPause( false, false ); + } + break; + } + } + break; + } + + case WM_CLOSE: + { + HMENU hMenu; + hMenu = GetMenu( hWnd ); + if( hMenu != NULL ) + DestroyMenu( hMenu ); + DestroyWindow( hWnd ); + UnregisterClass( L"Direct3DWindowClass", NULL ); + GetDXUTState().SetHWNDFocus( NULL ); + GetDXUTState().SetHWNDDeviceFullScreen( NULL ); + GetDXUTState().SetHWNDDeviceWindowed( NULL ); + return 0; + } + + case WM_DESTROY: + PostQuitMessage( 0 ); + break; + } + + // Don't allow the F10 key to act as a shortcut to the menu bar + // by not passing these messages to the DefWindowProc only when + // there's no menu present + if( !GetDXUTState().GetCallDefWindowProc() || GetDXUTState().GetMenu() == NULL && + ( uMsg == WM_SYSKEYDOWN || uMsg == WM_SYSKEYUP ) && wParam == VK_F10 ) + return 0; + else + return DefWindowProc( hWnd, uMsg, wParam, lParam ); +} + + +//-------------------------------------------------------------------------------------- +// Handles app's message loop and rendering when idle. If DXUTCreateDevice() or DXUTSetD3D*Device() +// has not already been called, it will call DXUTCreateWindow() with the default parameters. +//-------------------------------------------------------------------------------------- +HRESULT WINAPI DXUTMainLoop( HACCEL hAccel ) +{ + HRESULT hr; + + // Not allowed to call this from inside the device callbacks or reenter + if( GetDXUTState().GetInsideDeviceCallback() || GetDXUTState().GetInsideMainloop() ) + { + if( ( GetDXUTState().GetExitCode() == 0 ) || ( GetDXUTState().GetExitCode() == 10 ) ) + GetDXUTState().SetExitCode( 1 ); + return DXUT_ERR_MSGBOX( L"DXUTMainLoop", E_FAIL ); + } + + GetDXUTState().SetInsideMainloop( true ); + + // If DXUTCreateDevice() or DXUTSetD3D*Device() has not already been called, + // then call DXUTCreateDevice() with the default parameters. + if( !GetDXUTState().GetDeviceCreated() ) + { + if( GetDXUTState().GetDeviceCreateCalled() ) + { + if( ( GetDXUTState().GetExitCode() == 0 ) || ( GetDXUTState().GetExitCode() == 10 ) ) + GetDXUTState().SetExitCode( 1 ); + return E_FAIL; // DXUTCreateDevice() must first succeed for this function to succeed + } + + hr = DXUTCreateDevice(D3D_FEATURE_LEVEL_10_0, true, 640, 480); + if( FAILED( hr ) ) + { + if( ( GetDXUTState().GetExitCode() == 0 ) || ( GetDXUTState().GetExitCode() == 10 ) ) + GetDXUTState().SetExitCode( 1 ); + return hr; + } + } + + HWND hWnd = DXUTGetHWND(); + + // DXUTInit() must have been called and succeeded for this function to proceed + // DXUTCreateWindow() or DXUTSetWindow() must have been called and succeeded for this function to proceed + // DXUTCreateDevice() or DXUTCreateDeviceFromSettings() or DXUTSetD3D*Device() must have been called and succeeded for this function to proceed + if( !GetDXUTState().GetDXUTInited() || !GetDXUTState().GetWindowCreated() || !GetDXUTState().GetDeviceCreated() ) + { + if( ( GetDXUTState().GetExitCode() == 0 ) || ( GetDXUTState().GetExitCode() == 10 ) ) + GetDXUTState().SetExitCode( 1 ); + return DXUT_ERR_MSGBOX( L"DXUTMainLoop", E_FAIL ); + } + + // Now we're ready to receive and process Windows messages. + bool bGotMsg; + MSG msg; + msg.message = WM_NULL; + PeekMessage( &msg, NULL, 0U, 0U, PM_NOREMOVE ); + + while( WM_QUIT != msg.message ) + { + // Use PeekMessage() so we can use idle time to render the scene. + bGotMsg = ( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) != 0 ); + + if( bGotMsg ) + { + // Translate and dispatch the message + if( hAccel == NULL || hWnd == NULL || + 0 == TranslateAccelerator( hWnd, hAccel, &msg ) ) + { + TranslateMessage( &msg ); + DispatchMessage( &msg ); + } + } + else + { + // Render a frame during idle time (no messages are waiting) + DXUTRender3DEnvironment(); + } + } + + // Cleanup the accelerator table + if( hAccel != NULL ) + DestroyAcceleratorTable( hAccel ); + + GetDXUTState().SetInsideMainloop( false ); + + return S_OK; +} + + +//====================================================================================== +//====================================================================================== +// Direct3D section +//====================================================================================== +//====================================================================================== +HRESULT WINAPI DXUTCreateDevice(D3D_FEATURE_LEVEL reqFL, bool bWindowed, int nSuggestedWidth, int nSuggestedHeight) { + HRESULT hr = S_OK; + + + // Not allowed to call this from inside the device callbacks + if( GetDXUTState().GetInsideDeviceCallback() ) + return DXUT_ERR_MSGBOX( L"DXUTCreateWindow", E_FAIL ); + + GetDXUTState().SetDeviceCreateCalled( true ); + + // If DXUTCreateWindow() or DXUTSetWindow() has not already been called, + // then call DXUTCreateWindow() with the default parameters. + if( !GetDXUTState().GetWindowCreated() ) + { + // If DXUTCreateWindow() or DXUTSetWindow() was already called and failed, then fail. + // DXUTCreateWindow() or DXUTSetWindow() must first succeed for this function to succeed + if( GetDXUTState().GetWindowCreateCalled() ) + return E_FAIL; + + // If DXUTCreateWindow() or DXUTSetWindow() hasn't been called, then + // automatically call DXUTCreateWindow() with default params + hr = DXUTCreateWindow(); + if( FAILED( hr ) ) + return hr; + } + + DXUTDeviceSettings deviceSettings ; + DXUTApplyDefaultDeviceSettings(&deviceSettings); + deviceSettings.MinimumFeatureLevel = reqFL; + deviceSettings.d3d11.sd.BufferDesc.Width = nSuggestedWidth; + deviceSettings.d3d11.sd.BufferDesc.Height = nSuggestedHeight; + + deviceSettings.d3d9.pp.BackBufferWidth= nSuggestedWidth; + deviceSettings.d3d9.pp.BackBufferHeight = nSuggestedHeight; + + + //deviceSettings.d3d11.sd.BufferDesc.Width = 480; + + bool bAppSupportsD3D9 = DXUTDoesAppSupportD3D9(); + bool bAppSupportsD3D11 = DXUTDoesAppSupportD3D11(); + + if (bAppSupportsD3D11) { + deviceSettings.ver = DXUT_D3D11_DEVICE; + } + else if (bAppSupportsD3D9) { + deviceSettings.ver = DXUT_D3D9_DEVICE; + } + + DXUTUpdateDeviceSettingsWithOverrides(&deviceSettings); + + + // Change to a Direct3D device created from the new device settings. + // If there is an existing device, then either reset or recreated the scene + hr = DXUTChangeDevice( &deviceSettings, NULL, NULL, false, true ); + + if ( hr == DXUTERR_NODIRECT3D11 && GetDXUTState().GetMessageWhenD3D11NotAvailable() ) { + + OSVERSIONINFOEX osv; + memset( &osv, 0, sizeof(osv) ); + osv.dwOSVersionInfoSize = sizeof(osv); + GetVersionEx( (LPOSVERSIONINFO)&osv ); + + + if ( ( osv.dwMajorVersion > 6 ) + || ( osv.dwMajorVersion == 6 && osv.dwMinorVersion >= 1 ) + || ( osv.dwMajorVersion == 6 && osv.dwMinorVersion == 0 && osv.dwBuildNumber > 6002 ) ) + { + + MessageBox( 0, L"Direct3D 11 components were not found.", L"Error", MB_ICONEXCLAMATION ); + // This should not happen, but is here for completeness as the system could be + // corrupted or some future OS version could pull D3D11.DLL for some reason + } + else if ( osv.dwMajorVersion == 6 && osv.dwMinorVersion == 0 && osv.dwBuildNumber == 6002 ) + { + + MessageBox( 0, L"Direct3D 11 components were not found, but are available for"\ + L" this version of Windows.\n"\ + L"For details see Microsoft Knowledge Base Article #971644\n"\ + L"http://go.microsoft.com/fwlink/?LinkId=160189", L"Error", MB_ICONEXCLAMATION ); + + } + else if ( osv.dwMajorVersion == 6 && osv.dwMinorVersion == 0 ) + { + MessageBox( 0, L"Direct3D 11 components were not found. Please install the latest Service Pack.\n"\ + L"For details see Microsoft Knowledge Base Article #935791\n"\ + L"http://support.microsoft.com/kb/935791/", L"Error", MB_ICONEXCLAMATION ); + + } + else + { + MessageBox( 0, L"Direct3D 11 is not supported on this OS.", L"Error", MB_ICONEXCLAMATION ); + } + + + + } + + + if( FAILED( hr ) ) + return hr; + + return hr; +} + +//-------------------------------------------------------------------------------------- +// Tells the framework to change to a device created from the passed in device settings +// If DXUTCreateWindow() has not already been called, it will call it with the +// default parameters. Instead of calling this, you can call DXUTCreateDevice() +// or DXUTSetD3D*Device() +//-------------------------------------------------------------------------------------- +HRESULT WINAPI DXUTCreateDeviceFromSettings( DXUTDeviceSettings* pDeviceSettings, bool bPreserveInput, + bool bClipWindowToSingleAdapter ) +{ + HRESULT hr; + + GetDXUTState().SetDeviceCreateCalled( true ); + + // If DXUTCreateWindow() or DXUTSetWindow() has not already been called, + // then call DXUTCreateWindow() with the default parameters. + if( !GetDXUTState().GetWindowCreated() ) + { + // If DXUTCreateWindow() or DXUTSetWindow() was already called and failed, then fail. + // DXUTCreateWindow() or DXUTSetWindow() must first succeed for this function to succeed + if( GetDXUTState().GetWindowCreateCalled() ) + return E_FAIL; + + // If DXUTCreateWindow() or DXUTSetWindow() hasn't been called, then + // automatically call DXUTCreateWindow() with default params + hr = DXUTCreateWindow(); + if( FAILED( hr ) ) + return hr; + } + DXUTUpdateDeviceSettingsWithOverrides(pDeviceSettings); + + + // Change to a Direct3D device created from the new device settings. + // If there is an existing device, then either reset or recreate the scene + hr = DXUTChangeDevice( pDeviceSettings, NULL, NULL, false, bClipWindowToSingleAdapter ); + if( FAILED( hr ) ) + return hr; + + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +// All device changes are sent to this function. It looks at the current +// device (if any) and the new device and determines the best course of action. It +// also remembers and restores the window state if toggling between windowed and fullscreen +// as well as sets the proper window and system state for switching to the new device. +//-------------------------------------------------------------------------------------- +HRESULT DXUTChangeDevice( DXUTDeviceSettings* pNewDeviceSettings, + IDirect3DDevice9* pd3d9DeviceFromApp, + ID3D11Device* pd3d11DeviceFromApp, + bool bForceRecreate, bool bClipWindowToSingleAdapter ) +{ + HRESULT hr = S_OK; + DXUTDeviceSettings* pOldDeviceSettings = GetDXUTState().GetCurrentDeviceSettings(); + + if( !pNewDeviceSettings ) + return S_FALSE; + + + + if ( pNewDeviceSettings->ver == DXUT_D3D11_DEVICE ) { + hr = DXUTDelayLoadDXGI(); + } + + + if ( pNewDeviceSettings->ver == DXUT_D3D9_DEVICE || + ( FAILED( hr ) && DXUTDoesAppSupportD3D9() ) ) { + hr = DXUTDelayLoadD3D9(); + pNewDeviceSettings->ver = DXUT_D3D9_DEVICE; + if ( !FAILED( hr ) ) { + pNewDeviceSettings->ver = DXUT_D3D9_DEVICE; + } + } + + if( FAILED( hr ) ) + return hr; + + // Make a copy of the pNewDeviceSettings on the heap + DXUTDeviceSettings* pNewDeviceSettingsOnHeap = new DXUTDeviceSettings; + if( pNewDeviceSettingsOnHeap == NULL ) + return E_OUTOFMEMORY; + memcpy( pNewDeviceSettingsOnHeap, pNewDeviceSettings, sizeof( DXUTDeviceSettings ) ); + pNewDeviceSettings = pNewDeviceSettingsOnHeap; + + + GetDXUTState().SetCurrentDeviceSettings(pNewDeviceSettingsOnHeap); + DXUTSnapDeviceSettingsToEnumDevice(pNewDeviceSettingsOnHeap, false); + + if( FAILED( hr ) ) // the call will fail if no valid devices were found + { + DXUTDisplayErrorMessage( hr ); + return DXUT_ERR( L"DXUTFindValidDeviceSettings", hr ); + } + + // If the ModifyDeviceSettings callback is non-NULL, then call it to let the app + // change the settings or reject the device change by returning false. + LPDXUTCALLBACKMODIFYDEVICESETTINGS pCallbackModifyDeviceSettings = GetDXUTState().GetModifyDeviceSettingsFunc(); + if( pCallbackModifyDeviceSettings && pd3d9DeviceFromApp == NULL ) + { + bool bContinue = pCallbackModifyDeviceSettings( pNewDeviceSettings, + GetDXUTState().GetModifyDeviceSettingsFuncUserContext() ); + if( !bContinue ) + { + // The app rejected the device change by returning false, so just use the current device if there is one. + if( pOldDeviceSettings == NULL ) + DXUTDisplayErrorMessage( DXUTERR_NOCOMPATIBLEDEVICES ); + SAFE_DELETE( pNewDeviceSettings ); + return E_ABORT; + } + if( GetDXUTState().GetD3D9() == NULL && GetDXUTState().GetDXGIFactory() == NULL ) // if DXUTShutdown() was called in the modify callback, just return + { + SAFE_DELETE( pNewDeviceSettings ); + return S_FALSE; + } + DXUTSnapDeviceSettingsToEnumDevice(pNewDeviceSettingsOnHeap, false); // modify the app specified settings to the closed enumerated settigns + + if( FAILED( hr ) ) // the call will fail if no valid devices were found + { + DXUTDisplayErrorMessage( hr ); + return DXUT_ERR( L"DXUTFindValidDeviceSettings", hr ); + } + + } + + GetDXUTState().SetCurrentDeviceSettings( pNewDeviceSettingsOnHeap ); + + DXUTPause( true, true ); + + // When a WM_SIZE message is received, it calls DXUTCheckForWindowSizeChange(). + // A WM_SIZE message might be sent when adjusting the window, so tell + // DXUTCheckForWindowSizeChange() to ignore size changes temporarily + if( DXUTIsCurrentDeviceD3D9() ) + GetDXUTState().SetIgnoreSizeChange( true ); + + + // Take note if the backbuffer width & height are 0 now as they will change after pd3dDevice->Reset() + bool bKeepCurrentWindowSize = false; + if( DXUTGetBackBufferWidthFromDS( pNewDeviceSettings ) == 0 && + DXUTGetBackBufferHeightFromDS( pNewDeviceSettings ) == 0 ) + bKeepCurrentWindowSize = true; + + ////////////////////////// + // Before reset + ///////////////////////// + + // If we are using D3D9, adjust window style when switching from windowed to fullscreen and + // vice versa. Note that this is not necessary in D3D11 because DXGI handles this. If both + // DXUT and DXGI handle this, incorrect behavior would result. + if( DXUTIsCurrentDeviceD3D9() ) + { + if( DXUTGetIsWindowedFromDS( pNewDeviceSettings ) ) + { + // Going to windowed mode + + if( pOldDeviceSettings && !DXUTGetIsWindowedFromDS( pOldDeviceSettings ) ) + { + // Going from fullscreen -> windowed + GetDXUTState().SetFullScreenBackBufferWidthAtModeChange( DXUTGetBackBufferWidthFromDS( + pOldDeviceSettings ) ); + GetDXUTState().SetFullScreenBackBufferHeightAtModeChange( DXUTGetBackBufferHeightFromDS( + pOldDeviceSettings ) ); + + // Restore windowed mode style + SetWindowLong( DXUTGetHWNDDeviceWindowed(), GWL_STYLE, GetDXUTState().GetWindowedStyleAtModeChange() ); + } + + // If different device windows are used for windowed mode and fullscreen mode, + // hide the fullscreen window so that it doesn't obscure the screen. + if( DXUTGetHWNDDeviceFullScreen() != DXUTGetHWNDDeviceWindowed() ) + ShowWindow( DXUTGetHWNDDeviceFullScreen(), SW_HIDE ); + + // If using the same window for windowed and fullscreen mode, reattach menu if one exists + if( DXUTGetHWNDDeviceFullScreen() == DXUTGetHWNDDeviceWindowed() ) + { + if( GetDXUTState().GetMenu() != NULL ) + SetMenu( DXUTGetHWNDDeviceWindowed(), GetDXUTState().GetMenu() ); + } + } + else + { + // Going to fullscreen mode + + if( pOldDeviceSettings == NULL || ( pOldDeviceSettings && DXUTGetIsWindowedFromDS( pOldDeviceSettings ) ) ) + { + // Transistioning to full screen mode from a standard window so + // save current window position/size/style now in case the user toggles to windowed mode later + WINDOWPLACEMENT* pwp = GetDXUTState().GetWindowedPlacement(); + ZeroMemory( pwp, sizeof( WINDOWPLACEMENT ) ); + pwp->length = sizeof( WINDOWPLACEMENT ); + GetWindowPlacement( DXUTGetHWNDDeviceWindowed(), pwp ); + bool bIsTopmost = ( ( GetWindowLong( DXUTGetHWNDDeviceWindowed(), + GWL_EXSTYLE ) & WS_EX_TOPMOST ) != 0 ); + GetDXUTState().SetTopmostWhileWindowed( bIsTopmost ); + DWORD dwStyle = GetWindowLong( DXUTGetHWNDDeviceWindowed(), GWL_STYLE ); + dwStyle &= ~WS_MAXIMIZE & ~WS_MINIMIZE; // remove minimize/maximize style + GetDXUTState().SetWindowedStyleAtModeChange( dwStyle ); + if( pOldDeviceSettings ) + { + GetDXUTState().SetWindowBackBufferWidthAtModeChange( DXUTGetBackBufferWidthFromDS( + pOldDeviceSettings ) ); + GetDXUTState().SetWindowBackBufferHeightAtModeChange( DXUTGetBackBufferHeightFromDS( + pOldDeviceSettings ) ); + } + } + + // Hide the window to avoid animation of blank windows + ShowWindow( DXUTGetHWNDDeviceFullScreen(), SW_HIDE ); + + // Set FS window style + SetWindowLong( DXUTGetHWNDDeviceFullScreen(), GWL_STYLE, WS_POPUP | WS_SYSMENU ); + + // If using the same window for windowed and fullscreen mode, save and remove menu + if( DXUTGetHWNDDeviceFullScreen() == DXUTGetHWNDDeviceWindowed() ) + { + HMENU hMenu = GetMenu( DXUTGetHWNDDeviceFullScreen() ); + GetDXUTState().SetMenu( hMenu ); + SetMenu( DXUTGetHWNDDeviceFullScreen(), NULL ); + } + + WINDOWPLACEMENT wpFullscreen; + ZeroMemory( &wpFullscreen, sizeof( WINDOWPLACEMENT ) ); + wpFullscreen.length = sizeof( WINDOWPLACEMENT ); + GetWindowPlacement( DXUTGetHWNDDeviceFullScreen(), &wpFullscreen ); + if( ( wpFullscreen.flags & WPF_RESTORETOMAXIMIZED ) != 0 ) + { + // Restore the window to normal if the window was maximized then minimized. This causes the + // WPF_RESTORETOMAXIMIZED flag to be set which will cause SW_RESTORE to restore the + // window from minimized to maxmized which isn't what we want + wpFullscreen.flags &= ~WPF_RESTORETOMAXIMIZED; + wpFullscreen.showCmd = SW_RESTORE; + SetWindowPlacement( DXUTGetHWNDDeviceFullScreen(), &wpFullscreen ); + } + } + } + else + { + if( DXUTGetIsWindowedFromDS( pNewDeviceSettings ) ) + { + // Going to windowed mode + if( pOldDeviceSettings && !DXUTGetIsWindowedFromDS( pOldDeviceSettings ) ) + { + // Going from fullscreen -> windowed + GetDXUTState().SetFullScreenBackBufferWidthAtModeChange( DXUTGetBackBufferWidthFromDS( + pOldDeviceSettings ) ); + GetDXUTState().SetFullScreenBackBufferHeightAtModeChange( DXUTGetBackBufferHeightFromDS( + pOldDeviceSettings ) ); + //DXGI should handle this, but in the case where switching from d3d9 full screen to windowed d3d11 it does not. + SetWindowLong( DXUTGetHWNDDeviceWindowed(), GWL_STYLE, GetDXUTState().GetWindowedStyleAtModeChange() ); + + } + } + else + { + // Going to fullscreen mode + if( pOldDeviceSettings == NULL || ( pOldDeviceSettings && DXUTGetIsWindowedFromDS( pOldDeviceSettings ) ) ) + { + // Transistioning to full screen mode from a standard window so + if( pOldDeviceSettings ) + { + GetDXUTState().SetWindowBackBufferWidthAtModeChange( DXUTGetBackBufferWidthFromDS( + pOldDeviceSettings ) ); + GetDXUTState().SetWindowBackBufferHeightAtModeChange( DXUTGetBackBufferHeightFromDS( + pOldDeviceSettings ) ); + } + } + } + } + + if( pOldDeviceSettings ) + DXUTCleanup3DEnvironment( false ); + + // Create the D3D device and call the app's device callbacks + if( DXUTIsD3D9( pNewDeviceSettings ) ) { + hr = DXUTCreate3DEnvironment9( pd3d9DeviceFromApp ); + } + else { + hr = DXUTCreate3DEnvironment11( pd3d11DeviceFromApp ); + } + if( FAILED( hr ) ) + { + SAFE_DELETE( pOldDeviceSettings ); + DXUTCleanup3DEnvironment( true ); + DXUTDisplayErrorMessage( hr ); + DXUTPause( false, false ); + GetDXUTState().SetIgnoreSizeChange( false ); + return hr; + } + + // Enable/disable StickKeys shortcut, ToggleKeys shortcut, FilterKeys shortcut, and Windows key + // to prevent accidental task switching + DXUTAllowShortcutKeys( ( DXUTGetIsWindowedFromDS( pNewDeviceSettings ) ) ? + GetDXUTState().GetAllowShortcutKeysWhenWindowed() : + GetDXUTState().GetAllowShortcutKeysWhenFullscreen() ); + + HMONITOR hAdapterMonitor = DXUTGetMonitorFromAdapter( pNewDeviceSettings ); + GetDXUTState().SetAdapterMonitor( hAdapterMonitor ); + + // Update the device stats text + DXUTUpdateStaticFrameStats(); + + if( pOldDeviceSettings && !DXUTGetIsWindowedFromDS( pOldDeviceSettings ) && + DXUTGetIsWindowedFromDS( pNewDeviceSettings ) ) + { + // Going from fullscreen -> windowed + + // Restore the show state, and positions/size of the window to what it was + // It is important to adjust the window size + // after resetting the device rather than beforehand to ensure + // that the monitor resolution is correct and does not limit the size of the new window. + WINDOWPLACEMENT* pwp = GetDXUTState().GetWindowedPlacement(); + SetWindowPlacement( DXUTGetHWNDDeviceWindowed(), pwp ); + + // Also restore the z-order of window to previous state + HWND hWndInsertAfter = GetDXUTState().GetTopmostWhileWindowed() ? HWND_TOPMOST : HWND_NOTOPMOST; + SetWindowPos( DXUTGetHWNDDeviceWindowed(), hWndInsertAfter, 0, 0, 0, 0, + SWP_NOMOVE | SWP_NOREDRAW | SWP_NOSIZE ); + } + + // Check to see if the window needs to be resized. + // Handle cases where the window is minimized and maxmimized as well. + + bool bNeedToResize = false; + if( DXUTGetIsWindowedFromDS( pNewDeviceSettings ) && // only resize if in windowed mode + !bKeepCurrentWindowSize ) // only resize if pp.BackbufferWidth/Height were not 0 + { + UINT nClientWidth; + UINT nClientHeight; + if( IsIconic( DXUTGetHWNDDeviceWindowed() ) ) + { + // Window is currently minimized. To tell if it needs to resize, + // get the client rect of window when its restored the + // hard way using GetWindowPlacement() + WINDOWPLACEMENT wp; + ZeroMemory( &wp, sizeof( WINDOWPLACEMENT ) ); + wp.length = sizeof( WINDOWPLACEMENT ); + GetWindowPlacement( DXUTGetHWNDDeviceWindowed(), &wp ); + + if( ( wp.flags & WPF_RESTORETOMAXIMIZED ) != 0 && wp.showCmd == SW_SHOWMINIMIZED ) + { + // WPF_RESTORETOMAXIMIZED means that when the window is restored it will + // be maximized. So maximize the window temporarily to get the client rect + // when the window is maximized. GetSystemMetrics( SM_CXMAXIMIZED ) will give this + // information if the window is on the primary but this will work on multimon. + ShowWindow( DXUTGetHWNDDeviceWindowed(), SW_RESTORE ); + RECT rcClient; + GetClientRect( DXUTGetHWNDDeviceWindowed(), &rcClient ); + nClientWidth = ( UINT )( rcClient.right - rcClient.left ); + nClientHeight = ( UINT )( rcClient.bottom - rcClient.top ); + ShowWindow( DXUTGetHWNDDeviceWindowed(), SW_MINIMIZE ); + } + else + { + // Use wp.rcNormalPosition to get the client rect, but wp.rcNormalPosition + // includes the window frame so subtract it + RECT rcFrame = {0}; + AdjustWindowRect( &rcFrame, GetDXUTState().GetWindowedStyleAtModeChange(), GetDXUTState().GetMenu() != NULL ); + LONG nFrameWidth = rcFrame.right - rcFrame.left; + LONG nFrameHeight = rcFrame.bottom - rcFrame.top; + nClientWidth = ( UINT )( wp.rcNormalPosition.right - wp.rcNormalPosition.left - nFrameWidth ); + nClientHeight = ( UINT )( wp.rcNormalPosition.bottom - wp.rcNormalPosition.top - nFrameHeight ); + } + } + else + { + // Window is restored or maximized so just get its client rect + RECT rcClient; + GetClientRect( DXUTGetHWNDDeviceWindowed(), &rcClient ); + nClientWidth = ( UINT )( rcClient.right - rcClient.left ); + nClientHeight = ( UINT )( rcClient.bottom - rcClient.top ); + } + + // Now that we know the client rect, compare it against the back buffer size + // to see if the client rect is already the right size + if( nClientWidth != DXUTGetBackBufferWidthFromDS( pNewDeviceSettings ) || + nClientHeight != DXUTGetBackBufferHeightFromDS( pNewDeviceSettings ) ) + { + bNeedToResize = true; + } + + if( bClipWindowToSingleAdapter && !IsIconic( DXUTGetHWNDDeviceWindowed() ) ) + { + // Get the rect of the monitor attached to the adapter + MONITORINFO miAdapter; + miAdapter.cbSize = sizeof( MONITORINFO ); + HMONITOR hAdapterMonitor = DXUTGetMonitorFromAdapter( pNewDeviceSettings ); + DXUTGetMonitorInfo( hAdapterMonitor, &miAdapter ); + HMONITOR hWindowMonitor = DXUTMonitorFromWindow( DXUTGetHWND(), MONITOR_DEFAULTTOPRIMARY ); + + // Get the rect of the window + RECT rcWindow; + GetWindowRect( DXUTGetHWNDDeviceWindowed(), &rcWindow ); + + // Check if the window rect is fully inside the adapter's vitural screen rect + if( ( rcWindow.left < miAdapter.rcWork.left || + rcWindow.right > miAdapter.rcWork.right || + rcWindow.top < miAdapter.rcWork.top || + rcWindow.bottom > miAdapter.rcWork.bottom ) ) + { + if( hWindowMonitor == hAdapterMonitor && IsZoomed( DXUTGetHWNDDeviceWindowed() ) ) + { + // If the window is maximized and on the same monitor as the adapter, then + // no need to clip to single adapter as the window is already clipped + // even though the rcWindow rect is outside of the miAdapter.rcWork + } + else + { + bNeedToResize = true; + } + } + } + } + + // Only resize window if needed + + if( bNeedToResize ) + { + // Need to resize, so if window is maximized or minimized then restore the window + if( IsIconic( DXUTGetHWNDDeviceWindowed() ) ) + ShowWindow( DXUTGetHWNDDeviceWindowed(), SW_RESTORE ); + if( IsZoomed( DXUTGetHWNDDeviceWindowed() ) ) // doing the IsIconic() check first also handles the WPF_RESTORETOMAXIMIZED case + ShowWindow( DXUTGetHWNDDeviceWindowed(), SW_RESTORE ); + + if( bClipWindowToSingleAdapter ) + { + // Get the rect of the monitor attached to the adapter + MONITORINFO miAdapter; + miAdapter.cbSize = sizeof( MONITORINFO ); + HMONITOR hAdapterMonitor = DXUTGetMonitorFromAdapter( pNewDeviceSettings ); + DXUTGetMonitorInfo( hAdapterMonitor, &miAdapter ); + + // Get the rect of the monitor attached to the window + MONITORINFO miWindow; + miWindow.cbSize = sizeof( MONITORINFO ); + DXUTGetMonitorInfo( DXUTMonitorFromWindow( DXUTGetHWND(), MONITOR_DEFAULTTOPRIMARY ), &miWindow ); + + // Do something reasonable if the BackBuffer size is greater than the monitor size + int nAdapterMonitorWidth = miAdapter.rcWork.right - miAdapter.rcWork.left; + int nAdapterMonitorHeight = miAdapter.rcWork.bottom - miAdapter.rcWork.top; + + int nClientWidth = DXUTGetBackBufferWidthFromDS( pNewDeviceSettings ); + int nClientHeight = DXUTGetBackBufferHeightFromDS( pNewDeviceSettings ); + + // Get the rect of the window + RECT rcWindow; + GetWindowRect( DXUTGetHWNDDeviceWindowed(), &rcWindow ); + + // Make a window rect with a client rect that is the same size as the backbuffer + RECT rcResizedWindow; + rcResizedWindow.left = 0; + rcResizedWindow.right = nClientWidth; + rcResizedWindow.top = 0; + rcResizedWindow.bottom = nClientHeight; + AdjustWindowRect( &rcResizedWindow, GetWindowLong( DXUTGetHWNDDeviceWindowed(), GWL_STYLE ), + GetDXUTState().GetMenu() != NULL ); + + int nWindowWidth = rcResizedWindow.right - rcResizedWindow.left; + int nWindowHeight = rcResizedWindow.bottom - rcResizedWindow.top; + + if( nWindowWidth > nAdapterMonitorWidth ) + nWindowWidth = nAdapterMonitorWidth; + if( nWindowHeight > nAdapterMonitorHeight ) + nWindowHeight = nAdapterMonitorHeight; + + if( rcResizedWindow.left < miAdapter.rcWork.left || + rcResizedWindow.top < miAdapter.rcWork.top || + rcResizedWindow.right > miAdapter.rcWork.right || + rcResizedWindow.bottom > miAdapter.rcWork.bottom ) + { + int nWindowOffsetX = ( nAdapterMonitorWidth - nWindowWidth ) / 2; + int nWindowOffsetY = ( nAdapterMonitorHeight - nWindowHeight ) / 2; + + rcResizedWindow.left = miAdapter.rcWork.left + nWindowOffsetX; + rcResizedWindow.top = miAdapter.rcWork.top + nWindowOffsetY; + rcResizedWindow.right = miAdapter.rcWork.left + nWindowOffsetX + nWindowWidth; + rcResizedWindow.bottom = miAdapter.rcWork.top + nWindowOffsetY + nWindowHeight; + } + + // Resize the window. It is important to adjust the window size + // after resetting the device rather than beforehand to ensure + // that the monitor resolution is correct and does not limit the size of the new window. + SetWindowPos( DXUTGetHWNDDeviceWindowed(), 0, rcResizedWindow.left, rcResizedWindow.top, nWindowWidth, + nWindowHeight, SWP_NOZORDER ); + } + else + { + // Make a window rect with a client rect that is the same size as the backbuffer + RECT rcWindow = {0}; + rcWindow.right = (long)( DXUTGetBackBufferWidthFromDS(pNewDeviceSettings) ); + rcWindow.bottom = (long)( DXUTGetBackBufferHeightFromDS(pNewDeviceSettings) ); + AdjustWindowRect( &rcWindow, GetWindowLong( DXUTGetHWNDDeviceWindowed(), GWL_STYLE ), GetDXUTState().GetMenu() != NULL ); + + // Resize the window. It is important to adjust the window size + // after resetting the device rather than beforehand to ensure + // that the monitor resolution is correct and does not limit the size of the new window. + int cx = ( int )( rcWindow.right - rcWindow.left ); + int cy = ( int )( rcWindow.bottom - rcWindow.top ); + SetWindowPos( DXUTGetHWNDDeviceWindowed(), 0, 0, 0, cx, cy, SWP_NOZORDER | SWP_NOMOVE ); + } + + // Its possible that the new window size is not what we asked for. + // No window can be sized larger than the desktop, so see if the Windows OS resized the + // window to something smaller to fit on the desktop. Also if WM_GETMINMAXINFO + // will put a limit on the smallest/largest window size. + RECT rcClient; + GetClientRect( DXUTGetHWNDDeviceWindowed(), &rcClient ); + UINT nClientWidth = ( UINT )( rcClient.right - rcClient.left ); + UINT nClientHeight = ( UINT )( rcClient.bottom - rcClient.top ); + if( nClientWidth != DXUTGetBackBufferWidthFromDS( pNewDeviceSettings ) || + nClientHeight != DXUTGetBackBufferHeightFromDS( pNewDeviceSettings ) ) + { + // If its different, then resize the backbuffer again. This time create a backbuffer that matches the + // client rect of the current window w/o resizing the window. + DXUTDeviceSettings deviceSettings = DXUTGetDeviceSettings(); + if( DXUTIsD3D9( &deviceSettings ) ) deviceSettings.d3d9.pp.BackBufferWidth = 0; else deviceSettings.d3d11.sd.BufferDesc.Width = 0; + if( DXUTIsD3D9( &deviceSettings ) ) deviceSettings.d3d9.pp.BackBufferHeight = 0; else deviceSettings.d3d11.sd.BufferDesc.Height = 0; + + hr = DXUTChangeDevice( &deviceSettings, NULL, NULL, false, bClipWindowToSingleAdapter ); + if( FAILED( hr ) ) + { + SAFE_DELETE( pOldDeviceSettings ); + DXUTCleanup3DEnvironment( true ); + DXUTPause( false, false ); + GetDXUTState().SetIgnoreSizeChange( false ); + return hr; + } + } + } + + //if (DXUTGetIsWindowedFromDS( pNewDeviceSettings )) { + // RECT rcFrame = {0}; + // AdjustWindowRect( &rcFrame, GetDXUTState().GetWindowedStyleAtModeChange(), GetDXUTState().GetMenu() != NULL ); + // } + + // Make the window visible + if( !IsWindowVisible( DXUTGetHWND() ) ) + ShowWindow( DXUTGetHWND(), SW_SHOW ); + + // Ensure that the display doesn't power down when fullscreen but does when windowed + if( !DXUTIsWindowed() ) + SetThreadExecutionState( ES_DISPLAY_REQUIRED | ES_CONTINUOUS ); + else + SetThreadExecutionState( ES_CONTINUOUS ); + + SAFE_DELETE( pOldDeviceSettings ); + GetDXUTState().SetIgnoreSizeChange( false ); + DXUTPause( false, false ); + GetDXUTState().SetDeviceCreated( true ); + + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +// Creates a DXGI factory object if one has not already been created +//-------------------------------------------------------------------------------------- +HRESULT DXUTDelayLoadDXGI() +{ + IDXGIFactory1* pDXGIFactory = GetDXUTState().GetDXGIFactory(); + if( pDXGIFactory == NULL ) + { + DXUT_Dynamic_CreateDXGIFactory1( __uuidof( IDXGIFactory1 ), ( LPVOID* )&pDXGIFactory ); + GetDXUTState().SetDXGIFactory( pDXGIFactory ); + if( pDXGIFactory == NULL ) + { + // If still NULL, then DXGI is not availible + GetDXUTState().SetD3D11Available( false ); + return DXUTERR_NODIRECT3D11; + } + + // TODO: check for D3D11 support + GetDXUTState().SetD3D11Available( true ); + } + + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +// Creates a Direct3D object if one has not already been created +//-------------------------------------------------------------------------------------- +HRESULT DXUTDelayLoadD3D9() +{ + IDirect3D9* pD3D = GetDXUTState().GetD3D9(); + if( pD3D == NULL ) + { + // This may fail if Direct3D 9 isn't installed + // This may also fail if the Direct3D headers are somehow out of sync with the installed Direct3D DLLs + pD3D = DXUT_Dynamic_Direct3DCreate9( D3D_SDK_VERSION ); + if( pD3D == NULL ) + { + // If still NULL, then D3D9 is not availible + return DXUTERR_NODIRECT3D; + } + + GetDXUTState().SetD3D9( pD3D ); + } + + return S_OK; +} + + + +//-------------------------------------------------------------------------------------- +// Updates the device settings with default values.. +//-------------------------------------------------------------------------------------- +void DXUTUpdateDeviceSettingsWithOverrides( DXUTDeviceSettings* pDeviceSettings ) +{ + // Override with settings from the command line + if( GetDXUTState().GetOverrideWidth() != 0 ) + { + pDeviceSettings->d3d9.pp.BackBufferWidth = GetDXUTState().GetOverrideWidth(); + pDeviceSettings->d3d11.sd.BufferDesc.Width = GetDXUTState().GetOverrideWidth(); + } + if( GetDXUTState().GetOverrideHeight() != 0 ) + { + pDeviceSettings->d3d9.pp.BackBufferHeight = GetDXUTState().GetOverrideHeight(); + pDeviceSettings->d3d11.sd.BufferDesc.Height = GetDXUTState().GetOverrideHeight(); + } + + if( GetDXUTState().GetOverrideAdapterOrdinal() != -1 ) + { + pDeviceSettings->d3d9.AdapterOrdinal = GetDXUTState().GetOverrideAdapterOrdinal(); + pDeviceSettings->d3d11.AdapterOrdinal = GetDXUTState().GetOverrideAdapterOrdinal(); + } + + if( GetDXUTState().GetOverrideFullScreen() ) + { + pDeviceSettings->d3d9.pp.Windowed = FALSE; + pDeviceSettings->d3d11.sd.Windowed = FALSE; + } + + if( GetDXUTState().GetOverrideWindowed() ) { + pDeviceSettings->d3d9.pp.Windowed = TRUE; + pDeviceSettings->d3d11.sd.Windowed = TRUE; + } + + if( GetDXUTState().GetOverrideForceHAL() ) + { + pDeviceSettings->d3d9.DeviceType = D3DDEVTYPE_HAL; + pDeviceSettings->d3d11.DriverType = D3D_DRIVER_TYPE_HARDWARE; + } + + if( GetDXUTState().GetOverrideForceREF() ) + { + pDeviceSettings->d3d9.DeviceType = D3DDEVTYPE_REF; + pDeviceSettings->d3d11.DriverType = D3D_DRIVER_TYPE_REFERENCE; + } + + if( GetDXUTState().GetOverrideForceVsync() == 0 ) + { + pDeviceSettings->d3d9.pp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; + pDeviceSettings->d3d11.SyncInterval = 0; + } + else if( GetDXUTState().GetOverrideForceVsync() == 1 ) + { + pDeviceSettings->d3d9.pp.PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT; + pDeviceSettings->d3d11.SyncInterval = 1; + } + + if( GetDXUTState().GetOverrideForceAPI() != -1 ) + { + if( GetDXUTState().GetOverrideForceAPI() == 9 ) + { + pDeviceSettings->ver = DXUT_D3D9_DEVICE; + } + else if( GetDXUTState().GetOverrideForceAPI() == 11 ) + { + pDeviceSettings->ver = DXUT_D3D11_DEVICE; + } + } + + if (GetDXUTState().GetOverrideForceFeatureLevel() != 0) { + pDeviceSettings->d3d11.DeviceFeatureLevel = (D3D_FEATURE_LEVEL)GetDXUTState().GetOverrideForceFeatureLevel(); + } +} + + +//-------------------------------------------------------------------------------------- +// Allows the app to explictly state if it supports D3D9 or D3D11. Typically +// calling this is not needed as DXUT will auto-detect this based on the callbacks set. +//-------------------------------------------------------------------------------------- +void WINAPI DXUTSetD3DVersionSupport( bool bAppCanUseD3D9, bool bAppCanUseD3D11 ) +{ + GetDXUTState().SetUseD3DVersionOverride( true ); + GetDXUTState().SetAppSupportsD3D9Override( bAppCanUseD3D9 ); + GetDXUTState().SetAppSupportsD3D11Override( bAppCanUseD3D11 ); +} + + +//-------------------------------------------------------------------------------------- +// Returns true if app has registered any D3D9 callbacks or +// used the DXUTSetD3DVersionSupport API and passed true for bAppCanUseD3D9 +//-------------------------------------------------------------------------------------- +bool WINAPI DXUTDoesAppSupportD3D9() +{ + if( GetDXUTState().GetUseD3DVersionOverride() ) + return GetDXUTState().GetAppSupportsD3D9Override(); + else + return GetDXUTState().GetIsD3D9DeviceAcceptableFunc() || + GetDXUTState().GetD3D9DeviceCreatedFunc() || + GetDXUTState().GetD3D9DeviceResetFunc() || + GetDXUTState().GetD3D9DeviceLostFunc() || + GetDXUTState().GetD3D9DeviceDestroyedFunc() || + GetDXUTState().GetD3D9FrameRenderFunc(); +} + + +//-------------------------------------------------------------------------------------- +// Returns true if app has registered any D3D11 callbacks or +// used the DXUTSetD3DVersionSupport API and passed true for bAppCanUseD3D11 +//-------------------------------------------------------------------------------------- +bool WINAPI DXUTDoesAppSupportD3D11() +{ + if( GetDXUTState().GetUseD3DVersionOverride() ) + return GetDXUTState().GetAppSupportsD3D11Override(); + else + return GetDXUTState().GetIsD3D11DeviceAcceptableFunc() || + GetDXUTState().GetD3D11DeviceCreatedFunc() || + GetDXUTState().GetD3D11SwapChainResizedFunc() || + GetDXUTState().GetD3D11FrameRenderFunc() || + GetDXUTState().GetD3D11SwapChainReleasingFunc() || + GetDXUTState().GetD3D11DeviceDestroyedFunc(); +} + + +//====================================================================================== +//====================================================================================== +// Direct3D 9 section +//====================================================================================== +//====================================================================================== + + +//-------------------------------------------------------------------------------------- +// Passes a previously created Direct3D9 device for use by the framework. +// If DXUTCreateWindow() has not already been called, it will call it with the +// default parameters. Instead of calling this, you can call DXUTCreateDevice() or +// DXUTCreateDeviceFromSettings() +//-------------------------------------------------------------------------------------- +HRESULT WINAPI DXUTSetD3D9Device( IDirect3DDevice9* pd3dDevice ) +{ + HRESULT hr; + + if( pd3dDevice == NULL ) + return DXUT_ERR_MSGBOX( L"DXUTSetD3D9Device", E_INVALIDARG ); + + // Not allowed to call this from inside the device callbacks + if( GetDXUTState().GetInsideDeviceCallback() ) + return DXUT_ERR_MSGBOX( L"DXUTSetD3D9Device", E_FAIL ); + + GetDXUTState().SetDeviceCreateCalled( true ); + + // If DXUTCreateWindow() or DXUTSetWindow() has not already been called, + // then call DXUTCreateWindow() with the default parameters. + if( !GetDXUTState().GetWindowCreated() ) + { + // If DXUTCreateWindow() or DXUTSetWindow() was already called and failed, then fail. + // DXUTCreateWindow() or DXUTSetWindow() must first succeed for this function to succeed + if( GetDXUTState().GetWindowCreateCalled() ) + return E_FAIL; + + // If DXUTCreateWindow() or DXUTSetWindow() hasn't been called, then + // automatically call DXUTCreateWindow() with default params + hr = DXUTCreateWindow(); + if( FAILED( hr ) ) + return hr; + } + + DXUTDeviceSettings DeviceSettings; + ZeroMemory( &DeviceSettings, sizeof( DXUTDeviceSettings ) ); + DeviceSettings.ver = DXUT_D3D9_DEVICE; + + // Get the present params from the swap chain + IDirect3DSurface9* pBackBuffer = NULL; + hr = pd3dDevice->GetBackBuffer( 0, 0, D3DBACKBUFFER_TYPE_MONO, &pBackBuffer ); + if( SUCCEEDED( hr ) ) + { + IDirect3DSwapChain9* pSwapChain = NULL; + hr = pBackBuffer->GetContainer( IID_IDirect3DSwapChain9, ( void** )&pSwapChain ); + if( SUCCEEDED( hr ) ) + { + pSwapChain->GetPresentParameters( &DeviceSettings.d3d9.pp ); + SAFE_RELEASE( pSwapChain ); + } + + SAFE_RELEASE( pBackBuffer ); + } + + D3DDEVICE_CREATION_PARAMETERS d3dCreationParams; + pd3dDevice->GetCreationParameters( &d3dCreationParams ); + + // Fill out the rest of the device settings struct + DeviceSettings.d3d9.AdapterOrdinal = d3dCreationParams.AdapterOrdinal; + DeviceSettings.d3d9.DeviceType = d3dCreationParams.DeviceType; + DXUTFindD3D9AdapterFormat( DeviceSettings.d3d9.AdapterOrdinal, DeviceSettings.d3d9.DeviceType, + DeviceSettings.d3d9.pp.BackBufferFormat, DeviceSettings.d3d9.pp.Windowed, + &DeviceSettings.d3d9.AdapterFormat ); + DeviceSettings.d3d9.BehaviorFlags = d3dCreationParams.BehaviorFlags; + + // Change to the Direct3D device passed in + hr = DXUTChangeDevice( &DeviceSettings, pd3dDevice, NULL, false, false ); + if( FAILED( hr ) ) + return hr; + + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +// Creates the 3D environment +//-------------------------------------------------------------------------------------- +HRESULT DXUTCreate3DEnvironment9( IDirect3DDevice9* pd3dDeviceFromApp ) +{ + HRESULT hr = S_OK; + + IDirect3DDevice9* pd3dDevice = NULL; + DXUTDeviceSettings* pNewDeviceSettings = GetDXUTState().GetCurrentDeviceSettings(); + + // Only create a Direct3D device if one hasn't been supplied by the app + if( pd3dDeviceFromApp == NULL ) + { + // Try to create the device with the chosen settings + IDirect3D9* pD3D = DXUTGetD3D9Object(); + hr = pD3D->CreateDevice( pNewDeviceSettings->d3d9.AdapterOrdinal, pNewDeviceSettings->d3d9.DeviceType, + DXUTGetHWNDFocus(), pNewDeviceSettings->d3d9.BehaviorFlags, + &pNewDeviceSettings->d3d9.pp, &pd3dDevice ); + if( hr == D3DERR_DEVICELOST ) + { + GetDXUTState().SetDeviceLost( true ); + return S_OK; + } + else if( FAILED( hr ) ) + { + DXUT_ERR( L"CreateDevice", hr ); + return DXUTERR_CREATINGDEVICE; + } + } + else + { + pd3dDeviceFromApp->AddRef(); + pd3dDevice = pd3dDeviceFromApp; + } + + GetDXUTState().SetD3D9Device( pd3dDevice ); + + // If switching to REF, set the exit code to 10. If switching to HAL and exit code was 10, then set it back to 0. + if( pNewDeviceSettings->d3d9.DeviceType == D3DDEVTYPE_REF && GetDXUTState().GetExitCode() == 0 ) + GetDXUTState().SetExitCode( 10 ); + else if( pNewDeviceSettings->d3d9.DeviceType == D3DDEVTYPE_HAL && GetDXUTState().GetExitCode() == 10 ) + GetDXUTState().SetExitCode( 0 ); + + // Update back buffer desc before calling app's device callbacks + DXUTUpdateBackBufferDesc(); + + // Setup cursor based on current settings (window/fullscreen mode, show cursor state, clip cursor state) + DXUTSetupCursor(); + + // Update GetDXUTState()'s copy of D3D caps + D3DCAPS9* pd3dCaps = GetDXUTState().GetCaps(); + DXUTGetD3D9Device()->GetDeviceCaps( pd3dCaps ); + + // Update the device stats text + CD3D9Enumeration* pd3dEnum = DXUTGetD3D9Enumeration(); + CD3D9EnumAdapterInfo* pAdapterInfo = pd3dEnum->GetAdapterInfo( pNewDeviceSettings->d3d9.AdapterOrdinal ); + DXUTUpdateD3D9DeviceStats( pNewDeviceSettings->d3d9.DeviceType, + pNewDeviceSettings->d3d9.BehaviorFlags, + &pAdapterInfo->AdapterIdentifier ); + + // Call the app's device created callback if non-NULL + const D3DSURFACE_DESC* pBackBufferSurfaceDesc = DXUTGetD3D9BackBufferSurfaceDesc(); + GetDXUTState().SetInsideDeviceCallback( true ); + LPDXUTCALLBACKD3D9DEVICECREATED pCallbackDeviceCreated = GetDXUTState().GetD3D9DeviceCreatedFunc(); + hr = S_OK; + if( pCallbackDeviceCreated != NULL ) + hr = pCallbackDeviceCreated( DXUTGetD3D9Device(), pBackBufferSurfaceDesc, + GetDXUTState().GetD3D9DeviceCreatedFuncUserContext() ); + GetDXUTState().SetInsideDeviceCallback( false ); + if( DXUTGetD3D9Device() == NULL ) // Handle DXUTShutdown from inside callback + return E_FAIL; + if( FAILED( hr ) ) + { + DXUT_ERR( L"DeviceCreated callback", hr ); + return ( hr == DXUTERR_MEDIANOTFOUND ) ? DXUTERR_MEDIANOTFOUND : DXUTERR_CREATINGDEVICEOBJECTS; + } + GetDXUTState().SetDeviceObjectsCreated( true ); + + // Call the app's device reset callback if non-NULL + GetDXUTState().SetInsideDeviceCallback( true ); + LPDXUTCALLBACKD3D9DEVICERESET pCallbackDeviceReset = GetDXUTState().GetD3D9DeviceResetFunc(); + hr = S_OK; + if( pCallbackDeviceReset != NULL ) + hr = pCallbackDeviceReset( DXUTGetD3D9Device(), pBackBufferSurfaceDesc, + GetDXUTState().GetD3D9DeviceResetFuncUserContext() ); + GetDXUTState().SetInsideDeviceCallback( false ); + if( DXUTGetD3D9Device() == NULL ) // Handle DXUTShutdown from inside callback + return E_FAIL; + if( FAILED( hr ) ) + { + DXUT_ERR( L"DeviceReset callback", hr ); + return ( hr == DXUTERR_MEDIANOTFOUND ) ? DXUTERR_MEDIANOTFOUND : DXUTERR_RESETTINGDEVICEOBJECTS; + } + GetDXUTState().SetDeviceObjectsReset( true ); + + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +// Resets the 3D environment by: +// - Calls the device lost callback +// - Resets the device +// - Stores the back buffer description +// - Sets up the full screen Direct3D cursor if requested +// - Calls the device reset callback +//-------------------------------------------------------------------------------------- +HRESULT DXUTReset3DEnvironment9() +{ + HRESULT hr; + + IDirect3DDevice9* pd3dDevice = DXUTGetD3D9Device(); + assert( pd3dDevice != NULL ); + + // Call the app's device lost callback + if( GetDXUTState().GetDeviceObjectsReset() == true ) + { + GetDXUTState().SetInsideDeviceCallback( true ); + LPDXUTCALLBACKD3D9DEVICELOST pCallbackDeviceLost = GetDXUTState().GetD3D9DeviceLostFunc(); + if( pCallbackDeviceLost != NULL ) + pCallbackDeviceLost( GetDXUTState().GetD3D9DeviceLostFuncUserContext() ); + GetDXUTState().SetDeviceObjectsReset( false ); + GetDXUTState().SetInsideDeviceCallback( false ); + } + + // Reset the device + DXUTDeviceSettings* pDeviceSettings = GetDXUTState().GetCurrentDeviceSettings(); + hr = pd3dDevice->Reset( &pDeviceSettings->d3d9.pp ); + if( FAILED( hr ) ) + { + if( hr == D3DERR_DEVICELOST ) + return D3DERR_DEVICELOST; // Reset could legitimately fail if the device is lost + else + return DXUT_ERR( L"Reset", DXUTERR_RESETTINGDEVICE ); + } + + // Update back buffer desc before calling app's device callbacks + DXUTUpdateBackBufferDesc(); + + // Setup cursor based on current settings (window/fullscreen mode, show cursor state, clip cursor state) + DXUTSetupCursor(); + + // Call the app's OnDeviceReset callback + GetDXUTState().SetInsideDeviceCallback( true ); + const D3DSURFACE_DESC* pBackBufferSurfaceDesc = DXUTGetD3D9BackBufferSurfaceDesc(); + LPDXUTCALLBACKD3D9DEVICERESET pCallbackDeviceReset = GetDXUTState().GetD3D9DeviceResetFunc(); + hr = S_OK; + if( pCallbackDeviceReset != NULL ) + hr = pCallbackDeviceReset( pd3dDevice, pBackBufferSurfaceDesc, + GetDXUTState().GetD3D9DeviceResetFuncUserContext() ); + GetDXUTState().SetInsideDeviceCallback( false ); + if( FAILED( hr ) ) + { + // If callback failed, cleanup + DXUT_ERR( L"DeviceResetCallback", hr ); + if( hr != DXUTERR_MEDIANOTFOUND ) + hr = DXUTERR_RESETTINGDEVICEOBJECTS; + + GetDXUTState().SetInsideDeviceCallback( true ); + LPDXUTCALLBACKD3D9DEVICELOST pCallbackDeviceLost = GetDXUTState().GetD3D9DeviceLostFunc(); + if( pCallbackDeviceLost != NULL ) + pCallbackDeviceLost( GetDXUTState().GetD3D9DeviceLostFuncUserContext() ); + GetDXUTState().SetInsideDeviceCallback( false ); + return hr; + } + + // Success + GetDXUTState().SetDeviceObjectsReset( true ); + + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +// Render the 3D environment by: +// - Checking if the device is lost and trying to reset it if it is +// - Get the elapsed time since the last frame +// - Calling the app's framemove and render callback +// - Calling Present() +//-------------------------------------------------------------------------------------- +void DXUTRender3DEnvironment9() +{ + HRESULT hr; + + if( GetDXUTState().GetDeviceLost() || DXUTIsRenderingPaused() || !DXUTIsActive() ) + { + // Window is minimized or paused so yield CPU time to other processes + Sleep( 50 ); + } + + // If no device created yet because device was lost (ie. another fullscreen exclusive device exists), + // then wait and try to create every so often. + IDirect3DDevice9* pd3dDevice = DXUTGetD3D9Device(); + if( NULL == pd3dDevice ) + { + if( GetDXUTState().GetDeviceLost() ) + { + DXUTDeviceSettings deviceSettings = DXUTGetDeviceSettings(); + DXUTChangeDevice( &deviceSettings, NULL, NULL, false, true ); + } + + return; + } + + if( GetDXUTState().GetDeviceLost() && !GetDXUTState().GetRenderingPaused() ) + { + // Test the cooperative level to see if it's okay to render. + if( FAILED( hr = pd3dDevice->TestCooperativeLevel() ) ) + { + if( D3DERR_DEVICELOST == hr ) + { + // The device has been lost but cannot be reset at this time. + // So wait until it can be reset. + return; + } + + // If we are windowed, read the desktop format and + // ensure that the Direct3D device is using the same format + // since the user could have changed the desktop bitdepth + if( DXUTIsWindowed() ) + { + D3DDISPLAYMODE adapterDesktopDisplayMode; + IDirect3D9* pD3D = DXUTGetD3D9Object(); + DXUTDeviceSettings* pDeviceSettings = GetDXUTState().GetCurrentDeviceSettings(); + pD3D->GetAdapterDisplayMode( pDeviceSettings->d3d9.AdapterOrdinal, &adapterDesktopDisplayMode ); + if( pDeviceSettings->d3d9.AdapterFormat != adapterDesktopDisplayMode.Format ) + { + + DXUTDeviceSettings deviceSettings = DXUTGetDeviceSettings(); + deviceSettings.d3d9.AdapterFormat = adapterDesktopDisplayMode.Format; + + hr = DXUTSnapDeviceSettingsToEnumDevice(&deviceSettings, false); + if( FAILED( hr ) ) // the call will fail if no valid devices were found + { + DXUTDisplayErrorMessage( DXUTERR_NOCOMPATIBLEDEVICES ); + DXUTShutdown(); + } + + // Change to a Direct3D device created from the new device settings. + // If there is an existing device, then either reset or recreate the scene + hr = DXUTChangeDevice( &deviceSettings, NULL, NULL, false, false ); + if( FAILED( hr ) ) + { + // If this fails, try to go fullscreen and if this fails also shutdown. + if( FAILED( DXUTToggleFullScreen() ) ) + DXUTShutdown(); + } + + return; + } + } + + // Try to reset the device + if( FAILED( hr = DXUTReset3DEnvironment9() ) ) + { + if( D3DERR_DEVICELOST == hr ) + { + // The device was lost again, so continue waiting until it can be reset. + return; + } + else if( DXUTERR_RESETTINGDEVICEOBJECTS == hr || + DXUTERR_MEDIANOTFOUND == hr ) + { + DXUTDisplayErrorMessage( hr ); + DXUTShutdown(); + return; + } + else + { + // Reset failed, but the device wasn't lost so something bad happened, + // so recreate the device to try to recover + DXUTDeviceSettings* pDeviceSettings = GetDXUTState().GetCurrentDeviceSettings(); + if( FAILED( DXUTChangeDevice( pDeviceSettings, NULL, NULL, true, false ) ) ) + { + DXUTShutdown(); + return; + } + } + } + } + + GetDXUTState().SetDeviceLost( false ); + } + + // Get the app's time, in seconds. Skip rendering if no time elapsed + double fTime, fAbsTime; float fElapsedTime; + DXUTGetGlobalTimer()->GetTimeValues( &fTime, &fAbsTime, &fElapsedTime ); + + // Store the time for the app + if( GetDXUTState().GetConstantFrameTime() ) + { + fElapsedTime = GetDXUTState().GetTimePerFrame(); + fTime = DXUTGetTime() + fElapsedTime; + } + + GetDXUTState().SetTime( fTime ); + GetDXUTState().SetAbsoluteTime( fAbsTime ); + GetDXUTState().SetElapsedTime( fElapsedTime ); + + // Update the FPS stats + DXUTUpdateFrameStats(); + + DXUTHandleTimers(); + + // Animate the scene by calling the app's frame move callback + LPDXUTCALLBACKFRAMEMOVE pCallbackFrameMove = GetDXUTState().GetFrameMoveFunc(); + if( pCallbackFrameMove != NULL ) + { + pCallbackFrameMove( fTime, fElapsedTime, GetDXUTState().GetFrameMoveFuncUserContext() ); + pd3dDevice = DXUTGetD3D9Device(); + if( NULL == pd3dDevice ) // Handle DXUTShutdown from inside callback + return; + } + + if( !GetDXUTState().GetRenderingPaused() ) + { + // Render the scene by calling the app's render callback + LPDXUTCALLBACKD3D9FRAMERENDER pCallbackFrameRender = GetDXUTState().GetD3D9FrameRenderFunc(); + if( pCallbackFrameRender != NULL ) + { + pCallbackFrameRender( pd3dDevice, fTime, fElapsedTime, + GetDXUTState().GetD3D9FrameRenderFuncUserContext() ); + pd3dDevice = DXUTGetD3D9Device(); + if( NULL == pd3dDevice ) // Handle DXUTShutdown from inside callback + return; + } + +#if defined(DEBUG) || defined(_DEBUG) + // The back buffer should always match the client rect + // if the Direct3D backbuffer covers the entire window + RECT rcClient; + GetClientRect( DXUTGetHWND(), &rcClient ); + if( !IsIconic( DXUTGetHWND() ) ) + { + GetClientRect( DXUTGetHWND(), &rcClient ); + assert( DXUTGetD3D9BackBufferSurfaceDesc()->Width == (UINT)rcClient.right ); + assert( DXUTGetD3D9BackBufferSurfaceDesc()->Height == (UINT)rcClient.bottom ); + } +#endif + + // Show the frame on the primary surface. + hr = pd3dDevice->Present( NULL, NULL, NULL, NULL ); + if( FAILED( hr ) ) + { + if( D3DERR_DEVICELOST == hr ) + { + GetDXUTState().SetDeviceLost( true ); + } + else if( D3DERR_DRIVERINTERNALERROR == hr ) + { + // When D3DERR_DRIVERINTERNALERROR is returned from Present(), + // the application can do one of the following: + // + // - End, with the pop-up window saying that the application cannot continue + // because of problems in the display adapter and that the user should + // contact the adapter manufacturer. + // + // - Attempt to restart by calling IDirect3DDevice9::Reset, which is essentially the same + // path as recovering from a lost device. If IDirect3DDevice9::Reset fails with + // D3DERR_DRIVERINTERNALERROR, the application should end immediately with the message + // that the user should contact the adapter manufacturer. + // + // The framework attempts the path of resetting the device + // + GetDXUTState().SetDeviceLost( true ); + } + } + } + + // If the app called DXUTWasKeyPressed() then do the work + // to store the current state of the keys in bLastKeys + if( GetDXUTState().GetAppCalledWasKeyPressed() ) + { + bool* bLastKeys = GetDXUTState().GetLastKeys(); + bool* bKeys = GetDXUTState().GetKeys(); + memcpy( bLastKeys, bKeys, sizeof( bool ) * 256 ); + } + + // Update current frame # + int nFrame = GetDXUTState().GetCurrentFrameNumber(); + nFrame++; + GetDXUTState().SetCurrentFrameNumber( nFrame ); + + // Check to see if the app should shutdown due to cmdline + if( GetDXUTState().GetOverrideQuitAfterFrame() != 0 ) + { + if( nFrame > GetDXUTState().GetOverrideQuitAfterFrame() ) + DXUTShutdown(); + } + + return; +} + + +//-------------------------------------------------------------------------------------- +// Cleans up the 3D environment by: +// - Calls the device lost callback +// - Calls the device destroyed callback +// - Releases the D3D device +//-------------------------------------------------------------------------------------- +void DXUTCleanup3DEnvironment9( bool bReleaseSettings ) +{ + IDirect3DDevice9* pd3dDevice = DXUTGetD3D9Device(); + if( pd3dDevice != NULL ) + { + GetDXUTState().SetInsideDeviceCallback( true ); + + // Call the app's device lost callback + if( GetDXUTState().GetDeviceObjectsReset() == true ) + { + LPDXUTCALLBACKD3D9DEVICELOST pCallbackDeviceLost = GetDXUTState().GetD3D9DeviceLostFunc(); + if( pCallbackDeviceLost != NULL ) + pCallbackDeviceLost( GetDXUTState().GetD3D9DeviceLostFuncUserContext() ); + GetDXUTState().SetDeviceObjectsReset( false ); + } + + // Call the app's device destroyed callback + if( GetDXUTState().GetDeviceObjectsCreated() == true ) + { + LPDXUTCALLBACKD3D9DEVICEDESTROYED pCallbackDeviceDestroyed = GetDXUTState().GetD3D9DeviceDestroyedFunc(); + if( pCallbackDeviceDestroyed != NULL ) + pCallbackDeviceDestroyed( GetDXUTState().GetD3D9DeviceDestroyedFuncUserContext() ); + GetDXUTState().SetDeviceObjectsCreated( false ); + } + + GetDXUTState().SetInsideDeviceCallback( false ); + + // Release the D3D device and in debug configs, displays a message box if there + // are unrelease objects. + if( pd3dDevice ) + { + UINT references = pd3dDevice->Release(); + if( references > 0 ) + { + DXUTDisplayErrorMessage( DXUTERR_NONZEROREFCOUNT ); + DXUT_ERR( L"DXUTCleanup3DEnvironment", DXUTERR_NONZEROREFCOUNT ); + } + } + GetDXUTState().SetD3D9Device( NULL ); + + if( bReleaseSettings ) + { + DXUTDeviceSettings* pOldDeviceSettings = GetDXUTState().GetCurrentDeviceSettings(); + SAFE_DELETE(pOldDeviceSettings); + GetDXUTState().SetCurrentDeviceSettings( NULL ); + } + + D3DSURFACE_DESC* pBackBufferSurfaceDesc = GetDXUTState().GetBackBufferSurfaceDesc9(); + ZeroMemory( pBackBufferSurfaceDesc, sizeof( D3DSURFACE_DESC ) ); + + D3DCAPS9* pd3dCaps = GetDXUTState().GetCaps(); + ZeroMemory( pd3dCaps, sizeof( D3DCAPS9 ) ); + + GetDXUTState().SetDeviceCreated( false ); + } +} + + +//-------------------------------------------------------------------------------------- +// Gives the D3D device a cursor with image and hotspot from hCursor. +//-------------------------------------------------------------------------------------- +HRESULT DXUTSetD3D9DeviceCursor( IDirect3DDevice9* pd3dDevice, HCURSOR hCursor, bool bAddWatermark ) +{ + HRESULT hr = E_FAIL; + ICONINFO iconinfo; + bool bBWCursor = false; + LPDIRECT3DSURFACE9 pCursorSurface = NULL; + HDC hdcColor = NULL; + HDC hdcMask = NULL; + HDC hdcScreen = NULL; + BITMAP bm; + DWORD dwWidth = 0; + DWORD dwHeightSrc = 0; + DWORD dwHeightDest = 0; + COLORREF crColor; + COLORREF crMask; + UINT x; + UINT y; + BITMAPINFO bmi; + COLORREF* pcrArrayColor = NULL; + COLORREF* pcrArrayMask = NULL; + DWORD* pBitmap; + HGDIOBJ hgdiobjOld; + + ZeroMemory( &iconinfo, sizeof( iconinfo ) ); + if( !GetIconInfo( hCursor, &iconinfo ) ) + goto End; + + if( 0 == GetObject( ( HGDIOBJ )iconinfo.hbmMask, sizeof( BITMAP ), ( LPVOID )&bm ) ) + goto End; + dwWidth = bm.bmWidth; + dwHeightSrc = bm.bmHeight; + + if( iconinfo.hbmColor == NULL ) + { + bBWCursor = TRUE; + dwHeightDest = dwHeightSrc / 2; + } + else + { + bBWCursor = FALSE; + dwHeightDest = dwHeightSrc; + } + + // Create a surface for the fullscreen cursor + if( FAILED( hr = pd3dDevice->CreateOffscreenPlainSurface( dwWidth, dwHeightDest, + D3DFMT_A8R8G8B8, D3DPOOL_SCRATCH, &pCursorSurface, + NULL ) ) ) + { + goto End; + } + + pcrArrayMask = new DWORD[dwWidth * dwHeightSrc]; + + ZeroMemory( &bmi, sizeof( bmi ) ); + bmi.bmiHeader.biSize = sizeof( bmi.bmiHeader ); + bmi.bmiHeader.biWidth = dwWidth; + bmi.bmiHeader.biHeight = dwHeightSrc; + bmi.bmiHeader.biPlanes = 1; + bmi.bmiHeader.biBitCount = 32; + bmi.bmiHeader.biCompression = BI_RGB; + + hdcScreen = GetDC( NULL ); + hdcMask = CreateCompatibleDC( hdcScreen ); + if( hdcMask == NULL ) + { + hr = E_FAIL; + goto End; + } + hgdiobjOld = SelectObject( hdcMask, iconinfo.hbmMask ); + GetDIBits( hdcMask, iconinfo.hbmMask, 0, dwHeightSrc, + pcrArrayMask, &bmi, DIB_RGB_COLORS ); + SelectObject( hdcMask, hgdiobjOld ); + + if( !bBWCursor ) + { + pcrArrayColor = new DWORD[dwWidth * dwHeightDest]; + hdcColor = CreateCompatibleDC( hdcScreen ); + if( hdcColor == NULL ) + { + hr = E_FAIL; + goto End; + } + SelectObject( hdcColor, iconinfo.hbmColor ); + GetDIBits( hdcColor, iconinfo.hbmColor, 0, dwHeightDest, + pcrArrayColor, &bmi, DIB_RGB_COLORS ); + } + + // Transfer cursor image into the surface + D3DLOCKED_RECT lr; + pCursorSurface->LockRect( &lr, NULL, 0 ); + pBitmap = ( DWORD* )lr.pBits; + for( y = 0; y < dwHeightDest; y++ ) + { + for( x = 0; x < dwWidth; x++ ) + { + if( bBWCursor ) + { + crColor = pcrArrayMask[dwWidth * ( dwHeightDest - 1 - y ) + x]; + crMask = pcrArrayMask[dwWidth * ( dwHeightSrc - 1 - y ) + x]; + } + else + { + crColor = pcrArrayColor[dwWidth * ( dwHeightDest - 1 - y ) + x]; + crMask = pcrArrayMask[dwWidth * ( dwHeightDest - 1 - y ) + x]; + } + if( crMask == 0 ) + pBitmap[dwWidth * y + x] = 0xff000000 | crColor; + else + pBitmap[dwWidth * y + x] = 0x00000000; + + // It may be helpful to make the D3D cursor look slightly + // different from the Windows cursor so you can distinguish + // between the two when developing/testing code. When + // bAddWatermark is TRUE, the following code adds some + // small grey "D3D" characters to the upper-left corner of + // the D3D cursor image. + if( bAddWatermark && x < 12 && y < 5 ) + { + // 11.. 11.. 11.. .... CCC0 + // 1.1. ..1. 1.1. .... A2A0 + // 1.1. .1.. 1.1. .... A4A0 + // 1.1. ..1. 1.1. .... A2A0 + // 11.. 11.. 11.. .... CCC0 + + const WORD wMask[5] = { 0xccc0, 0xa2a0, 0xa4a0, 0xa2a0, 0xccc0 }; + if( wMask[y] & (1 << (15 - x)) ) + { + pBitmap[dwWidth*y + x] |= 0xff808080; + } + } + } + } + pCursorSurface->UnlockRect(); + + // Set the device cursor + if( FAILED( hr = pd3dDevice->SetCursorProperties( iconinfo.xHotspot, + iconinfo.yHotspot, pCursorSurface ) ) ) + { + goto End; + } + + hr = S_OK; + +End: + if( iconinfo.hbmMask != NULL ) + DeleteObject( iconinfo.hbmMask ); + if( iconinfo.hbmColor != NULL ) + DeleteObject( iconinfo.hbmColor ); + if( hdcScreen != NULL ) + ReleaseDC( NULL, hdcScreen ); + if( hdcColor != NULL ) + DeleteDC( hdcColor ); + if( hdcMask != NULL ) + DeleteDC( hdcMask ); + SAFE_DELETE_ARRAY( pcrArrayColor ); + SAFE_DELETE_ARRAY( pcrArrayMask ); + SAFE_RELEASE( pCursorSurface ); + return hr; +} + + +//-------------------------------------------------------------------------------------- +// Internal helper function to return the adapter format from the first device settings +// combo that matches the passed adapter ordinal, device type, backbuffer format, and windowed. +//-------------------------------------------------------------------------------------- +HRESULT DXUTFindD3D9AdapterFormat( UINT AdapterOrdinal, D3DDEVTYPE DeviceType, D3DFORMAT BackBufferFormat, + BOOL Windowed, D3DFORMAT* pAdapterFormat ) +{ + CD3D9Enumeration* pd3dEnum = DXUTGetD3D9Enumeration( false ); + CD3D9EnumDeviceInfo* pDeviceInfo = pd3dEnum->GetDeviceInfo( AdapterOrdinal, DeviceType ); + if( pDeviceInfo ) + { + for( int iDeviceCombo = 0; iDeviceCombo < pDeviceInfo->deviceSettingsComboList.GetSize(); iDeviceCombo++ ) + { + CD3D9EnumDeviceSettingsCombo* pDeviceSettingsCombo = pDeviceInfo->deviceSettingsComboList.GetAt( + iDeviceCombo ); + if( pDeviceSettingsCombo->BackBufferFormat == BackBufferFormat && + pDeviceSettingsCombo->Windowed == Windowed ) + { + // Return the adapter format from the first match + *pAdapterFormat = pDeviceSettingsCombo->AdapterFormat; + return S_OK; + } + } + } + + *pAdapterFormat = BackBufferFormat; + return E_FAIL; +} + +//-------------------------------------------------------------------------------------- +// Sets the viewport, render target view, and depth stencil view. +//-------------------------------------------------------------------------------------- +HRESULT WINAPI DXUTSetupD3D11Views( ID3D11DeviceContext* pd3dDeviceContext ) +{ + HRESULT hr = S_OK; + + // Setup the viewport to match the backbuffer + D3D11_VIEWPORT vp; + vp.Width = (FLOAT)DXUTGetDXGIBackBufferSurfaceDesc()->Width; + vp.Height = (FLOAT)DXUTGetDXGIBackBufferSurfaceDesc()->Height; + vp.MinDepth = 0; + vp.MaxDepth = 1; + vp.TopLeftX = 0; + vp.TopLeftY = 0; + pd3dDeviceContext->RSSetViewports( 1, &vp ); + + // Set the render targets + ID3D11RenderTargetView* pRTV = GetDXUTState().GetD3D11RenderTargetView(); + ID3D11DepthStencilView* pDSV = GetDXUTState().GetD3D11DepthStencilView(); + pd3dDeviceContext->OMSetRenderTargets( 1, &pRTV, pDSV ); + + return hr; +} + + +//-------------------------------------------------------------------------------------- +// Creates a render target view, and depth stencil texture and view. +//-------------------------------------------------------------------------------------- +HRESULT DXUTCreateD3D11Views( ID3D11Device* pd3dDevice, ID3D11DeviceContext* pd3dImmediateContext, + DXUTDeviceSettings* pDeviceSettings ) +{ + HRESULT hr = S_OK; + IDXGISwapChain* pSwapChain = DXUTGetDXGISwapChain(); + ID3D11DepthStencilView* pDSV = NULL; + ID3D11RenderTargetView* pRTV = NULL; + + // Get the back buffer and desc + ID3D11Texture2D* pBackBuffer; + hr = pSwapChain->GetBuffer( 0, __uuidof( *pBackBuffer ), ( LPVOID* )&pBackBuffer ); + if( FAILED( hr ) ) + return hr; + D3D11_TEXTURE2D_DESC backBufferSurfaceDesc; + pBackBuffer->GetDesc( &backBufferSurfaceDesc ); + + // Create the render target view + hr = pd3dDevice->CreateRenderTargetView( pBackBuffer, NULL, &pRTV ); + SAFE_RELEASE( pBackBuffer ); + if( FAILED( hr ) ) + return hr; + GetDXUTState().SetD3D11RenderTargetView( pRTV ); + + if( pDeviceSettings->d3d11.AutoCreateDepthStencil ) + { + // Create depth stencil texture + ID3D11Texture2D* pDepthStencil = NULL; + D3D11_TEXTURE2D_DESC descDepth; + descDepth.Width = backBufferSurfaceDesc.Width; + descDepth.Height = backBufferSurfaceDesc.Height; + descDepth.MipLevels = 1; + descDepth.ArraySize = 1; + descDepth.Format = pDeviceSettings->d3d11.AutoDepthStencilFormat; + descDepth.SampleDesc.Count = pDeviceSettings->d3d11.sd.SampleDesc.Count; + descDepth.SampleDesc.Quality = pDeviceSettings->d3d11.sd.SampleDesc.Quality; + descDepth.Usage = D3D11_USAGE_DEFAULT; + descDepth.BindFlags = D3D11_BIND_DEPTH_STENCIL; + descDepth.CPUAccessFlags = 0; + descDepth.MiscFlags = 0; + hr = pd3dDevice->CreateTexture2D( &descDepth, NULL, &pDepthStencil ); + if( FAILED( hr ) ) + return hr; + GetDXUTState().SetD3D11DepthStencil( pDepthStencil ); + + // Create the depth stencil view + D3D11_DEPTH_STENCIL_VIEW_DESC descDSV; + descDSV.Format = descDepth.Format; + descDSV.Flags = 0; + if( descDepth.SampleDesc.Count > 1 ) + descDSV.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2DMS; + else + descDSV.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D; + descDSV.Texture2D.MipSlice = 0; + hr = pd3dDevice->CreateDepthStencilView( pDepthStencil, &descDSV, &pDSV ); + if( FAILED( hr ) ) + return hr; + GetDXUTState().SetD3D11DepthStencilView( pDSV ); + } + + hr = DXUTSetupD3D11Views( pd3dImmediateContext ); + if( FAILED( hr ) ) + return hr; + + return hr; +} + + +//-------------------------------------------------------------------------------------- +// Creates the 3D environment +//-------------------------------------------------------------------------------------- +HRESULT DXUTCreate3DEnvironment11( ID3D11Device* pd3d11DeviceFromApp ) +{ + HRESULT hr = S_OK; + + ID3D11Device* pd3d11Device = NULL; + ID3D11DeviceContext* pd3dImmediateContext = NULL; + D3D_FEATURE_LEVEL FeatureLevel = D3D_FEATURE_LEVEL_11_0; + + IDXGISwapChain* pSwapChain = NULL; + DXUTDeviceSettings* pNewDeviceSettings = GetDXUTState().GetCurrentDeviceSettings(); + + IDXGIFactory1* pDXGIFactory = DXUTGetDXGIFactory(); + hr = pDXGIFactory->MakeWindowAssociation( DXUTGetHWND(), 0 ); + + // Only create a Direct3D device if one hasn't been supplied by the app + if( pd3d11DeviceFromApp == NULL ) + { + // Try to create the device with the chosen settings + IDXGIAdapter1* pAdapter = NULL; + + hr = S_OK; + D3D_DRIVER_TYPE ddt = pNewDeviceSettings->d3d11.DriverType; + if( pNewDeviceSettings->d3d11.DriverType == D3D_DRIVER_TYPE_HARDWARE ) + { + hr = pDXGIFactory->EnumAdapters1( pNewDeviceSettings->d3d11.AdapterOrdinal, &pAdapter ); + if ( FAILED( hr) ) + { + return E_FAIL; + } + ddt = D3D_DRIVER_TYPE_UNKNOWN; + } + else if (pNewDeviceSettings->d3d11.DriverType == D3D_DRIVER_TYPE_WARP) + { + ddt = D3D_DRIVER_TYPE_WARP; + pAdapter = NULL; + } + else if (pNewDeviceSettings->d3d11.DriverType == D3D_DRIVER_TYPE_REFERENCE) + { + ddt = D3D_DRIVER_TYPE_REFERENCE; + pAdapter = NULL; + } + + if( SUCCEEDED( hr ) ) + { + + hr = DXUT_Dynamic_D3D11CreateDevice( pAdapter, + ddt, + ( HMODULE )0, + pNewDeviceSettings->d3d11.CreateFlags, + &pNewDeviceSettings->d3d11.DeviceFeatureLevel, + 1, + D3D11_SDK_VERSION, + &pd3d11Device, + &FeatureLevel, + &pd3dImmediateContext + ); + + if ( FAILED( hr ) ) { + pAdapter = NULL; + // Remote desktop does not allow you to enumerate the adapter. In this case, we let D3D11 do the enumeration. + if ( ddt == D3D_DRIVER_TYPE_UNKNOWN ) { + hr = DXUT_Dynamic_D3D11CreateDevice( pAdapter, + D3D_DRIVER_TYPE_HARDWARE, + ( HMODULE )0, + pNewDeviceSettings->d3d11.CreateFlags, + &pNewDeviceSettings->d3d11.DeviceFeatureLevel, + 1, + D3D11_SDK_VERSION, + &pd3d11Device, + &FeatureLevel, + &pd3dImmediateContext + ); + } + if ( FAILED ( hr ) ) { + DXUT_ERR( L"D3D11CreateDevice", hr ); + return DXUTERR_CREATINGDEVICE; + } + } + } + + if( SUCCEEDED( hr ) ) + { + IDXGIDevice1* pDXGIDev = NULL; + hr = pd3d11Device->QueryInterface( __uuidof( IDXGIDevice1 ), ( LPVOID* )&pDXGIDev ); + if( SUCCEEDED( hr ) && pDXGIDev ) + { + if ( pAdapter == NULL ) + { + IDXGIAdapter *pTempAdapter; + pDXGIDev->GetAdapter( &pTempAdapter ); + V_RETURN( pTempAdapter->QueryInterface( __uuidof( IDXGIAdapter1 ), (LPVOID*) &pAdapter ) ); + V_RETURN( pAdapter->GetParent( __uuidof( IDXGIFactory1 ), (LPVOID*) &pDXGIFactory ) ); + SAFE_RELEASE ( pTempAdapter ); + GetDXUTState().SetDXGIFactory( pDXGIFactory ); + } + } + SAFE_RELEASE( pDXGIDev ); + GetDXUTState().SetDXGIAdapter( pAdapter ); + } + + // set default render state to msaa enabled + D3D11_RASTERIZER_DESC drd = { + D3D11_FILL_SOLID, //D3D11_FILL_MODE FillMode; + D3D11_CULL_BACK,//D3D11_CULL_MODE CullMode; + FALSE, //BOOL FrontCounterClockwise; + 0, //INT DepthBias; + 0.0f,//FLOAT DepthBiasClamp; + 0.0f,//FLOAT SlopeScaledDepthBias; + TRUE,//BOOL DepthClipEnable; + FALSE,//BOOL ScissorEnable; + TRUE,//BOOL MultisampleEnable; + FALSE//BOOL AntialiasedLineEnable; + }; + if( FAILED( hr ) ) + { + DXUT_ERR( L"D3D11CreateDevice", hr ); + return DXUTERR_CREATINGDEVICE; + } + ID3D11RasterizerState* pRS = NULL; + pd3d11Device->CreateRasterizerState(&drd, &pRS); + GetDXUTState().SetD3D11RasterizerState(pRS); + pd3dImmediateContext->RSSetState(pRS); + + + + + // Enumerate its outputs. + UINT OutputCount, iOutput; + for( OutputCount = 0; ; ++OutputCount ) + { + IDXGIOutput* pOutput; + if( FAILED( pAdapter->EnumOutputs( OutputCount, &pOutput ) ) ) + break; + SAFE_RELEASE( pOutput ); + } + IDXGIOutput** ppOutputArray = new IDXGIOutput*[OutputCount]; + if( !ppOutputArray ) + return E_OUTOFMEMORY; + for( iOutput = 0; iOutput < OutputCount; ++iOutput ) + pAdapter->EnumOutputs( iOutput, ppOutputArray + iOutput ); + GetDXUTState().SetDXGIOutputArray( ppOutputArray ); + GetDXUTState().SetDXGIOutputArraySize( OutputCount ); + + // Create the swapchain + + hr = pDXGIFactory->CreateSwapChain( pd3d11Device, &pNewDeviceSettings->d3d11.sd, &pSwapChain ); + + if( FAILED( hr ) ) + { + DXUT_ERR( L"CreateSwapChain", hr ); + return DXUTERR_CREATINGDEVICE; + } + } + else + { + pd3d11DeviceFromApp->AddRef(); + pd3d11Device = pd3d11DeviceFromApp; + } + + GetDXUTState().SetD3D11Device( pd3d11Device ); + GetDXUTState().SetD3D11DeviceContext( pd3dImmediateContext ); + GetDXUTState().SetD3D11FeatureLevel( FeatureLevel ); + GetDXUTState().SetDXGISwapChain( pSwapChain ); + + // If switching to REF, set the exit code to 11. If switching to HAL and exit code was 11, then set it back to 0. + if( pNewDeviceSettings->d3d11.DriverType == D3D_DRIVER_TYPE_REFERENCE && GetDXUTState().GetExitCode() == 0 ) + GetDXUTState().SetExitCode( 10 ); + else if( pNewDeviceSettings->d3d11.DriverType == D3D_DRIVER_TYPE_HARDWARE && GetDXUTState().GetExitCode() == 10 ) + GetDXUTState().SetExitCode( 0 ); + + // Update back buffer desc before calling app's device callbacks + DXUTUpdateBackBufferDesc(); + + // Setup cursor based on current settings (window/fullscreen mode, show cursor state, clip cursor state) + DXUTSetupCursor(); + + // Update the device stats text + CD3D11Enumeration* pd3dEnum = DXUTGetD3D11Enumeration(); + CD3D11EnumAdapterInfo* pAdapterInfo = pd3dEnum->GetAdapterInfo( pNewDeviceSettings->d3d11.AdapterOrdinal ); + DXUTUpdateD3D11DeviceStats( pNewDeviceSettings->d3d11.DriverType, &pAdapterInfo->AdapterDesc ); + + // Call the app's device created callback if non-NULL + const DXGI_SURFACE_DESC* pBackBufferSurfaceDesc = DXUTGetDXGIBackBufferSurfaceDesc(); + GetDXUTState().SetInsideDeviceCallback( true ); + LPDXUTCALLBACKD3D11DEVICECREATED pCallbackDeviceCreated = GetDXUTState().GetD3D11DeviceCreatedFunc(); + hr = S_OK; + if( pCallbackDeviceCreated != NULL ) + hr = pCallbackDeviceCreated( DXUTGetD3D11Device(), pBackBufferSurfaceDesc, + GetDXUTState().GetD3D11DeviceCreatedFuncUserContext() ); + GetDXUTState().SetInsideDeviceCallback( false ); + if( DXUTGetD3D11Device() == NULL ) // Handle DXUTShutdown from inside callback + return E_FAIL; + if( FAILED( hr ) ) + { + DXUT_ERR( L"DeviceCreated callback", hr ); + return ( hr == DXUTERR_MEDIANOTFOUND ) ? DXUTERR_MEDIANOTFOUND : DXUTERR_CREATINGDEVICEOBJECTS; + } + GetDXUTState().SetDeviceObjectsCreated( true ); + + // Setup the render target view and viewport + hr = DXUTCreateD3D11Views( pd3d11Device, pd3dImmediateContext, pNewDeviceSettings ); + if( FAILED( hr ) ) + { + DXUT_ERR( L"DXUTCreateD3D11Views", hr ); + return DXUTERR_CREATINGDEVICEOBJECTS; + } + + // Create performance counters + //DXUTCreateD3D11Counters( pd3d11Device ); + + // Call the app's swap chain reset callback if non-NULL + GetDXUTState().SetInsideDeviceCallback( true ); + LPDXUTCALLBACKD3D11SWAPCHAINRESIZED pCallbackSwapChainResized = GetDXUTState().GetD3D11SwapChainResizedFunc(); + hr = S_OK; + if( pCallbackSwapChainResized != NULL ) + hr = pCallbackSwapChainResized( DXUTGetD3D11Device(), pSwapChain, pBackBufferSurfaceDesc, + GetDXUTState().GetD3D11SwapChainResizedFuncUserContext() ); + GetDXUTState().SetInsideDeviceCallback( false ); + if( DXUTGetD3D11Device() == NULL ) // Handle DXUTShutdown from inside callback + return E_FAIL; + if( FAILED( hr ) ) + { + DXUT_ERR( L"DeviceReset callback", hr ); + return ( hr == DXUTERR_MEDIANOTFOUND ) ? DXUTERR_MEDIANOTFOUND : DXUTERR_RESETTINGDEVICEOBJECTS; + } + GetDXUTState().SetDeviceObjectsReset( true ); + + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +// Resets the 3D environment by: +// - Calls the device lost callback +// - Resets the device +// - Stores the back buffer description +// - Sets up the full screen Direct3D cursor if requested +// - Calls the device reset callback +//-------------------------------------------------------------------------------------- +HRESULT DXUTReset3DEnvironment11() +{ + HRESULT hr; + + GetDXUTState().SetDeviceObjectsReset( false ); + DXUTPause( true, true ); + + bool bDeferredDXGIAction = false; + DXUTDeviceSettings* pDeviceSettings = GetDXUTState().GetCurrentDeviceSettings(); + IDXGISwapChain* pSwapChain = DXUTGetDXGISwapChain(); + + DXGI_SWAP_CHAIN_DESC SCDesc; + pSwapChain->GetDesc( &SCDesc ); + + // Resize backbuffer and target of the swapchain in case they have changed. + // For windowed mode, use the client rect as the desired size. Unlike D3D9, + // we can't use 0 for width or height. Therefore, fill in the values from + // the window size. For fullscreen mode, the width and height should have + // already been filled with the desktop resolution, so don't change it. + if( pDeviceSettings->d3d11.sd.Windowed && SCDesc.Windowed ) + { + RECT rcWnd; + GetClientRect( DXUTGetHWND(), &rcWnd ); + pDeviceSettings->d3d11.sd.BufferDesc.Width = rcWnd.right - rcWnd.left; + pDeviceSettings->d3d11.sd.BufferDesc.Height = rcWnd.bottom - rcWnd.top; + } + + // If the app wants to switch from windowed to fullscreen or vice versa, + // call the swapchain's SetFullscreenState + // mode. + if( SCDesc.Windowed != pDeviceSettings->d3d11.sd.Windowed ) + { + // Set the fullscreen state + if( pDeviceSettings->d3d11.sd.Windowed ) + { + V_RETURN( pSwapChain->SetFullscreenState( FALSE, NULL ) ); + bDeferredDXGIAction = true; + } + else + { + // Set fullscreen state by setting the display mode to fullscreen, then changing the resolution + // to the desired value. + + // SetFullscreenState causes a WM_SIZE message to be sent to the window. The WM_SIZE message calls + // DXUTCheckForDXGIBufferChange which normally stores the new height and width in + // pDeviceSettings->d3d11.sd.BufferDesc. SetDoNotStoreBufferSize tells DXUTCheckForDXGIBufferChange + // not to store the height and width so that we have the correct values when calling ResizeTarget. + + GetDXUTState().SetDoNotStoreBufferSize( true ); + V_RETURN( pSwapChain->SetFullscreenState( TRUE, NULL ) ); + GetDXUTState().SetDoNotStoreBufferSize( false ); + + V_RETURN( pSwapChain->ResizeTarget( &pDeviceSettings->d3d11.sd.BufferDesc ) ); + bDeferredDXGIAction = true; + } + } + else + { + if( pDeviceSettings->d3d11.sd.BufferDesc.Width == SCDesc.BufferDesc.Width && + pDeviceSettings->d3d11.sd.BufferDesc.Height == SCDesc.BufferDesc.Height && + pDeviceSettings->d3d11.sd.BufferDesc.Format != SCDesc.BufferDesc.Format ) + { + DXUTResizeDXGIBuffers( 0, 0, !pDeviceSettings->d3d11.sd.Windowed ); + bDeferredDXGIAction = true; + } + else if( pDeviceSettings->d3d11.sd.BufferDesc.Width != SCDesc.BufferDesc.Width || + pDeviceSettings->d3d11.sd.BufferDesc.Height != SCDesc.BufferDesc.Height ) + { + V_RETURN( pSwapChain->ResizeTarget( &pDeviceSettings->d3d11.sd.BufferDesc ) ); + bDeferredDXGIAction = true; + } + } + + // If no deferred DXGI actions are to take place, mark the device as reset. + // If there is a deferred DXGI action, then the device isn't reset until DXGI sends us a + // window message. Only then can we mark the device as reset. + if( !bDeferredDXGIAction ) + GetDXUTState().SetDeviceObjectsReset( true ); + DXUTPause( false, false ); + + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +// Render the 3D environment by: +// - Checking if the device is lost and trying to reset it if it is +// - Get the elapsed time since the last frame +// - Calling the app's framemove and render callback +// - Calling Present() +//-------------------------------------------------------------------------------------- +void DXUTRender3DEnvironment11() +{ + HRESULT hr; + + ID3D11Device* pd3dDevice = DXUTGetD3D11Device(); + if( NULL == pd3dDevice ) + return; + + ID3D11DeviceContext* pd3dImmediateContext = DXUTGetD3D11DeviceContext(); + if( NULL == pd3dImmediateContext ) + return; + + IDXGISwapChain* pSwapChain = DXUTGetDXGISwapChain(); + if( NULL == pSwapChain ) + return; + + if( DXUTIsRenderingPaused() || !DXUTIsActive() || GetDXUTState().GetRenderingOccluded() ) + { + // Window is minimized/paused/occluded/or not exclusive so yield CPU time to other processes + Sleep( 50 ); + } + + // Get the app's time, in seconds. Skip rendering if no time elapsed + double fTime, fAbsTime; float fElapsedTime; + DXUTGetGlobalTimer()->GetTimeValues( &fTime, &fAbsTime, &fElapsedTime ); + + // Store the time for the app + if( GetDXUTState().GetConstantFrameTime() ) + { + fElapsedTime = GetDXUTState().GetTimePerFrame(); + fTime = DXUTGetTime() + fElapsedTime; + } + + GetDXUTState().SetTime( fTime ); + GetDXUTState().SetAbsoluteTime( fAbsTime ); + GetDXUTState().SetElapsedTime( fElapsedTime ); + + // Start Performance Counters + + // Update the FPS stats + DXUTUpdateFrameStats(); + + DXUTHandleTimers(); + + // Animate the scene by calling the app's frame move callback + LPDXUTCALLBACKFRAMEMOVE pCallbackFrameMove = GetDXUTState().GetFrameMoveFunc(); + if( pCallbackFrameMove != NULL ) + { + pCallbackFrameMove( fTime, fElapsedTime, GetDXUTState().GetFrameMoveFuncUserContext() ); + pd3dDevice = DXUTGetD3D11Device(); + if( NULL == pd3dDevice ) // Handle DXUTShutdown from inside callback + return; + } + + if( !GetDXUTState().GetRenderingPaused() ) + { + // Render the scene by calling the app's render callback + LPDXUTCALLBACKD3D11FRAMERENDER pCallbackFrameRender = GetDXUTState().GetD3D11FrameRenderFunc(); + if( pCallbackFrameRender != NULL && !GetDXUTState().GetRenderingOccluded() ) + { + pCallbackFrameRender( pd3dDevice, pd3dImmediateContext, fTime, fElapsedTime, + GetDXUTState().GetD3D11FrameRenderFuncUserContext() ); + + pd3dDevice = DXUTGetD3D11Device(); + if( NULL == pd3dDevice ) // Handle DXUTShutdown from inside callback + return; + } + +#if defined(DEBUG) || defined(_DEBUG) + // The back buffer should always match the client rect + // if the Direct3D backbuffer covers the entire window + RECT rcClient; + GetClientRect( DXUTGetHWND(), &rcClient ); + if( !IsIconic( DXUTGetHWND() ) ) + { + GetClientRect( DXUTGetHWND(), &rcClient ); + + assert( DXUTGetDXGIBackBufferSurfaceDesc()->Width == (UINT)rcClient.right ); + assert( DXUTGetDXGIBackBufferSurfaceDesc()->Height == (UINT)rcClient.bottom ); + } +#endif + } + + if ( GetDXUTState().GetSaveScreenShot() ) { + DXUTSnapD3D11Screenshot( GetDXUTState().GetScreenShotName(), D3DX11_IFF_BMP ); + } + if ( GetDXUTState().GetExitAfterScreenShot() ) { + DXUTShutdown(); + return; + } + + DWORD dwFlags = 0; + if( GetDXUTState().GetRenderingOccluded() ) + dwFlags = DXGI_PRESENT_TEST; + else + dwFlags = GetDXUTState().GetCurrentDeviceSettings()->d3d11.PresentFlags; + UINT SyncInterval = GetDXUTState().GetCurrentDeviceSettings()->d3d11.SyncInterval; + + // Show the frame on the primary surface. + hr = pSwapChain->Present( SyncInterval, dwFlags ); + if( DXGI_STATUS_OCCLUDED == hr ) + { + // There is a window covering our entire rendering area. + // Don't render until we're visible again. + GetDXUTState().SetRenderingOccluded( true ); + } + else if( DXGI_ERROR_DEVICE_RESET == hr ) + { + // If a mode change happened, we must reset the device + if( FAILED( hr = DXUTReset3DEnvironment11() ) ) + { + if( DXUTERR_RESETTINGDEVICEOBJECTS == hr || + DXUTERR_MEDIANOTFOUND == hr ) + { + DXUTDisplayErrorMessage( hr ); + DXUTShutdown(); + return; + } + else + { + // Reset failed, but the device wasn't lost so something bad happened, + // so recreate the device to try to recover + DXUTDeviceSettings* pDeviceSettings = GetDXUTState().GetCurrentDeviceSettings(); + if( FAILED( DXUTChangeDevice( pDeviceSettings, NULL, NULL, true, false ) ) ) + { + DXUTShutdown(); + return; + } + + // TODO: Handle display orientation changes in full-screen mode. + } + } + } + else if( DXGI_ERROR_DEVICE_REMOVED == hr ) + { + // Use a callback to ask the app if it would like to find a new device. + // If no device removed callback is set, then look for a new device + if( FAILED( DXUTHandleDeviceRemoved() ) ) + { + // TODO: use pD3DDevice->GetDeviceRemovedReason() + DXUTDisplayErrorMessage( DXUTERR_DEVICEREMOVED ); + DXUTShutdown(); + return; + } + } + else if( SUCCEEDED( hr ) ) + { + if( GetDXUTState().GetRenderingOccluded() ) + { + // Now that we're no longer occluded + // allow us to render again + GetDXUTState().SetRenderingOccluded( false ); + } + } + + // Update current frame # + int nFrame = GetDXUTState().GetCurrentFrameNumber(); + nFrame++; + GetDXUTState().SetCurrentFrameNumber( nFrame ); + + + // Update the D3D11 counter stats + //DXUTUpdateD3D11CounterStats(); + + // Check to see if the app should shutdown due to cmdline + if( GetDXUTState().GetOverrideQuitAfterFrame() != 0 ) + { + if( nFrame > GetDXUTState().GetOverrideQuitAfterFrame() ) + DXUTShutdown(); + } + + return; +} + +void ClearD3D11DeviceContext( ID3D11DeviceContext* pd3dDeviceContext ) +{ + // Unbind all objects from the immediate context + if (pd3dDeviceContext == NULL) return; + + ID3D11ShaderResourceView* pSRVs[16] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }; + ID3D11RenderTargetView* pRTVs[16] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }; + ID3D11DepthStencilView* pDSV = NULL; + ID3D11Buffer* pBuffers[16] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }; + ID3D11SamplerState* pSamplers[16] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }; + UINT StrideOffset[16] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }; + + // Shaders + pd3dDeviceContext->VSSetShader( NULL, NULL, 0 ); + pd3dDeviceContext->HSSetShader( NULL, NULL, 0 ); + pd3dDeviceContext->DSSetShader( NULL, NULL, 0 ); + pd3dDeviceContext->GSSetShader( NULL, NULL, 0 ); + pd3dDeviceContext->PSSetShader( NULL, NULL, 0 ); + + // IA clear + pd3dDeviceContext->IASetVertexBuffers( 0, 16, pBuffers, StrideOffset, StrideOffset ); + pd3dDeviceContext->IASetIndexBuffer( NULL, DXGI_FORMAT_R16_UINT, 0 ); + pd3dDeviceContext->IASetInputLayout( NULL ); + + // Constant buffers + pd3dDeviceContext->VSSetConstantBuffers( 0, 14, pBuffers ); + pd3dDeviceContext->HSSetConstantBuffers( 0, 14, pBuffers ); + pd3dDeviceContext->DSSetConstantBuffers( 0, 14, pBuffers ); + pd3dDeviceContext->GSSetConstantBuffers( 0, 14, pBuffers ); + pd3dDeviceContext->PSSetConstantBuffers( 0, 14, pBuffers ); + + // Resources + pd3dDeviceContext->VSSetShaderResources( 0, 16, pSRVs ); + pd3dDeviceContext->HSSetShaderResources( 0, 16, pSRVs ); + pd3dDeviceContext->DSSetShaderResources( 0, 16, pSRVs ); + pd3dDeviceContext->GSSetShaderResources( 0, 16, pSRVs ); + pd3dDeviceContext->PSSetShaderResources( 0, 16, pSRVs ); + + // Samplers + pd3dDeviceContext->VSSetSamplers( 0, 16, pSamplers ); + pd3dDeviceContext->HSSetSamplers( 0, 16, pSamplers ); + pd3dDeviceContext->DSSetSamplers( 0, 16, pSamplers ); + pd3dDeviceContext->GSSetSamplers( 0, 16, pSamplers ); + pd3dDeviceContext->PSSetSamplers( 0, 16, pSamplers ); + + // Render targets + pd3dDeviceContext->OMSetRenderTargets( 8, pRTVs, pDSV ); + + // States + FLOAT blendFactor[4] = { 0,0,0,0 }; + pd3dDeviceContext->OMSetBlendState( NULL, blendFactor, 0xFFFFFFFF ); + pd3dDeviceContext->OMSetDepthStencilState( NULL, 0 ); + pd3dDeviceContext->RSSetState( NULL ); +} + +//-------------------------------------------------------------------------------------- +// Cleans up the 3D environment by: +// - Calls the device lost callback +// - Calls the device destroyed callback +// - Releases the D3D device +//-------------------------------------------------------------------------------------- +void DXUTCleanup3DEnvironment11( bool bReleaseSettings ) +{ + ID3D11Device* pd3dDevice = DXUTGetD3D11Device(); + + if( pd3dDevice != NULL ) + { + if (GetDXUTState().GetD3D11RasterizerState()!= NULL ) + GetDXUTState().GetD3D11RasterizerState()->Release(); + + // Call ClearState to avoid tons of messy debug spew telling us that we're deleting bound objects + ID3D11DeviceContext* pImmediateContext = DXUTGetD3D11DeviceContext(); + ClearD3D11DeviceContext( pImmediateContext ); + + // Clear state and flush + pImmediateContext->ClearState(); + pImmediateContext->Flush(); + + // Call the app's SwapChain lost callback + GetDXUTState().SetInsideDeviceCallback( true ); + if( GetDXUTState().GetDeviceObjectsReset() ) + { + LPDXUTCALLBACKD3D11SWAPCHAINRELEASING pCallbackSwapChainReleasing = + GetDXUTState().GetD3D11SwapChainReleasingFunc(); + if( pCallbackSwapChainReleasing != NULL ) + pCallbackSwapChainReleasing( GetDXUTState().GetD3D11SwapChainReleasingFuncUserContext() ); + GetDXUTState().SetDeviceObjectsReset( false ); + } + + // Release our old depth stencil texture and view + ID3D11Texture2D* pDS = GetDXUTState().GetD3D11DepthStencil(); + SAFE_RELEASE( pDS ); + GetDXUTState().SetD3D11DepthStencil( NULL ); + ID3D11DepthStencilView* pDSV = GetDXUTState().GetD3D11DepthStencilView(); + SAFE_RELEASE( pDSV ); + GetDXUTState().SetD3D11DepthStencilView( NULL ); + + // Cleanup the render target view + ID3D11RenderTargetView* pRTV = GetDXUTState().GetD3D11RenderTargetView(); + SAFE_RELEASE( pRTV ); + GetDXUTState().SetD3D11RenderTargetView( NULL ); + + // Call the app's device destroyed callback + if( GetDXUTState().GetDeviceObjectsCreated() ) + { + LPDXUTCALLBACKD3D11DEVICEDESTROYED pCallbackDeviceDestroyed = GetDXUTState().GetD3D11DeviceDestroyedFunc(); + if( pCallbackDeviceDestroyed != NULL ) + pCallbackDeviceDestroyed( GetDXUTState().GetD3D11DeviceDestroyedFuncUserContext() ); + GetDXUTState().SetDeviceObjectsCreated( false ); + } + + GetDXUTState().SetInsideDeviceCallback( false ); + + // Release the swap chain + GetDXUTState().SetReleasingSwapChain( true ); + IDXGISwapChain* pSwapChain = DXUTGetDXGISwapChain(); + if( pSwapChain ) + { + pSwapChain->SetFullscreenState( FALSE, 0 ); + } + SAFE_RELEASE( pSwapChain ); + GetDXUTState().SetDXGISwapChain( NULL ); + GetDXUTState().SetReleasingSwapChain( false ); + + // Release the outputs. + IDXGIOutput** ppOutputArray = GetDXUTState().GetDXGIOutputArray(); + UINT OutputCount = GetDXUTState().GetDXGIOutputArraySize(); + for( UINT o = 0; o < OutputCount; ++o ) + SAFE_RELEASE( ppOutputArray[o] ); + delete[] ppOutputArray; + GetDXUTState().SetDXGIOutputArray( NULL ); + GetDXUTState().SetDXGIOutputArraySize( 0 ); + + // Release the D3D adapter. + IDXGIAdapter* pAdapter = GetDXUTState().GetDXGIAdapter(); + SAFE_RELEASE( pAdapter ); + GetDXUTState().SetDXGIAdapter( NULL ); + + // Release the counters + //DXUTDestroyD3D11Counters(); + + // Release the D3D11 immediate context (if it exists) because it has a extra ref count on it + ID3D11DeviceContext* pd3d11DeviceContext = GetDXUTState().GetD3D11DeviceContext(); + SAFE_RELEASE( pd3d11DeviceContext ); + GetDXUTState().SetD3D11DeviceContext( NULL ); + + // Release the D3D device and in debug configs, displays a message box if there + // are unrelease objects. + if( pd3dDevice ) + { + UINT references = pd3dDevice->Release(); + if( references > 0 ) + { + DXUTDisplayErrorMessage( DXUTERR_NONZEROREFCOUNT ); + DXUT_ERR( L"DXUTCleanup3DEnvironment", DXUTERR_NONZEROREFCOUNT ); + } + } + GetDXUTState().SetD3D11Device( NULL ); + + if( bReleaseSettings ) + { + DXUTDeviceSettings* pOldDeviceSettings = GetDXUTState().GetCurrentDeviceSettings(); + SAFE_DELETE(pOldDeviceSettings); + GetDXUTState().SetCurrentDeviceSettings( NULL ); + } + + DXGI_SURFACE_DESC* pBackBufferSurfaceDesc = GetDXUTState().GetBackBufferSurfaceDescDXGI(); + ZeroMemory( pBackBufferSurfaceDesc, sizeof( DXGI_SURFACE_DESC ) ); + + GetDXUTState().SetDeviceCreated( false ); + } +} + + +//-------------------------------------------------------------------------------------- +// Low level keyboard hook to disable Windows key to prevent accidental task switching. +//-------------------------------------------------------------------------------------- +LRESULT CALLBACK DXUTLowLevelKeyboardProc( int nCode, WPARAM wParam, LPARAM lParam ) +{ + if( nCode < 0 || nCode != HC_ACTION ) // do not process message + return CallNextHookEx( GetDXUTState().GetKeyboardHook(), nCode, wParam, lParam ); + + bool bEatKeystroke = false; + KBDLLHOOKSTRUCT* p = ( KBDLLHOOKSTRUCT* )lParam; + switch( wParam ) + { + case WM_KEYDOWN: + case WM_KEYUP: + { + bEatKeystroke = ( !GetDXUTState().GetAllowShortcutKeys() && + ( p->vkCode == VK_LWIN || p->vkCode == VK_RWIN ) ); + break; + } + } + + if( bEatKeystroke ) + return 1; + else + return CallNextHookEx( GetDXUTState().GetKeyboardHook(), nCode, wParam, lParam ); +} + + + +//-------------------------------------------------------------------------------------- +// Controls how DXUT behaves when fullscreen and windowed mode with regard to +// shortcut keys (Windows keys, StickyKeys shortcut, ToggleKeys shortcut, FilterKeys shortcut) +//-------------------------------------------------------------------------------------- +void WINAPI DXUTSetShortcutKeySettings( bool bAllowWhenFullscreen, bool bAllowWhenWindowed ) +{ + GetDXUTState().SetAllowShortcutKeysWhenWindowed( bAllowWhenWindowed ); + GetDXUTState().SetAllowShortcutKeysWhenFullscreen( bAllowWhenFullscreen ); + + // DXUTInit() records initial accessibility states so don't change them until then + if( GetDXUTState().GetDXUTInited() ) + { + if( DXUTIsWindowed() ) + DXUTAllowShortcutKeys( GetDXUTState().GetAllowShortcutKeysWhenWindowed() ); + else + DXUTAllowShortcutKeys( GetDXUTState().GetAllowShortcutKeysWhenFullscreen() ); + } +} + + +//-------------------------------------------------------------------------------------- +// Enables/disables Windows keys, and disables or restores the StickyKeys/ToggleKeys/FilterKeys +// shortcut to help prevent accidental task switching +//-------------------------------------------------------------------------------------- +void DXUTAllowShortcutKeys( bool bAllowKeys ) +{ + GetDXUTState().SetAllowShortcutKeys( bAllowKeys ); + + if( bAllowKeys ) + { + // Restore StickyKeys/etc to original state and enable Windows key + STICKYKEYS sk = GetDXUTState().GetStartupStickyKeys(); + TOGGLEKEYS tk = GetDXUTState().GetStartupToggleKeys(); + FILTERKEYS fk = GetDXUTState().GetStartupFilterKeys(); + + SystemParametersInfo( SPI_SETSTICKYKEYS, sizeof( STICKYKEYS ), &sk, 0 ); + SystemParametersInfo( SPI_SETTOGGLEKEYS, sizeof( TOGGLEKEYS ), &tk, 0 ); + SystemParametersInfo( SPI_SETFILTERKEYS, sizeof( FILTERKEYS ), &fk, 0 ); + + // Remove the keyboard hoook when it isn't needed to prevent any slow down of other apps + if( GetDXUTState().GetKeyboardHook() ) + { + UnhookWindowsHookEx( GetDXUTState().GetKeyboardHook() ); + GetDXUTState().SetKeyboardHook( NULL ); + } + } + else + { + // Set low level keyboard hook if haven't already + if( GetDXUTState().GetKeyboardHook() == NULL ) + { + // Set the low-level hook procedure. Only works on Windows 2000 and above + OSVERSIONINFO OSVersionInfo; + OSVersionInfo.dwOSVersionInfoSize = sizeof( OSVersionInfo ); + GetVersionEx( &OSVersionInfo ); + if( OSVersionInfo.dwPlatformId == VER_PLATFORM_WIN32_NT && OSVersionInfo.dwMajorVersion > 4 ) + { + HHOOK hKeyboardHook = SetWindowsHookEx( WH_KEYBOARD_LL, DXUTLowLevelKeyboardProc, + GetModuleHandle( NULL ), 0 ); + GetDXUTState().SetKeyboardHook( hKeyboardHook ); + } + } + + // Disable StickyKeys/etc shortcuts but if the accessibility feature is on, + // then leave the settings alone as its probably being usefully used + + STICKYKEYS skOff = GetDXUTState().GetStartupStickyKeys(); + if( ( skOff.dwFlags & SKF_STICKYKEYSON ) == 0 ) + { + // Disable the hotkey and the confirmation + skOff.dwFlags &= ~SKF_HOTKEYACTIVE; + skOff.dwFlags &= ~SKF_CONFIRMHOTKEY; + + SystemParametersInfo( SPI_SETSTICKYKEYS, sizeof( STICKYKEYS ), &skOff, 0 ); + } + + TOGGLEKEYS tkOff = GetDXUTState().GetStartupToggleKeys(); + if( ( tkOff.dwFlags & TKF_TOGGLEKEYSON ) == 0 ) + { + // Disable the hotkey and the confirmation + tkOff.dwFlags &= ~TKF_HOTKEYACTIVE; + tkOff.dwFlags &= ~TKF_CONFIRMHOTKEY; + + SystemParametersInfo( SPI_SETTOGGLEKEYS, sizeof( TOGGLEKEYS ), &tkOff, 0 ); + } + + FILTERKEYS fkOff = GetDXUTState().GetStartupFilterKeys(); + if( ( fkOff.dwFlags & FKF_FILTERKEYSON ) == 0 ) + { + // Disable the hotkey and the confirmation + fkOff.dwFlags &= ~FKF_HOTKEYACTIVE; + fkOff.dwFlags &= ~FKF_CONFIRMHOTKEY; + + SystemParametersInfo( SPI_SETFILTERKEYS, sizeof( FILTERKEYS ), &fkOff, 0 ); + } + } +} + + +//-------------------------------------------------------------------------------------- +// Pauses time or rendering. Keeps a ref count so pausing can be layered +//-------------------------------------------------------------------------------------- +void WINAPI DXUTPause( bool bPauseTime, bool bPauseRendering ) +{ + int nPauseTimeCount = GetDXUTState().GetPauseTimeCount(); + if( bPauseTime ) nPauseTimeCount++; + else + nPauseTimeCount--; + if( nPauseTimeCount < 0 ) nPauseTimeCount = 0; + GetDXUTState().SetPauseTimeCount( nPauseTimeCount ); + + int nPauseRenderingCount = GetDXUTState().GetPauseRenderingCount(); + if( bPauseRendering ) nPauseRenderingCount++; + else + nPauseRenderingCount--; + if( nPauseRenderingCount < 0 ) nPauseRenderingCount = 0; + GetDXUTState().SetPauseRenderingCount( nPauseRenderingCount ); + + if( nPauseTimeCount > 0 ) + { + // Stop the scene from animating + DXUTGetGlobalTimer()->Stop(); + } + else + { + // Restart the timer + DXUTGetGlobalTimer()->Start(); + } + + GetDXUTState().SetRenderingPaused( nPauseRenderingCount > 0 ); + GetDXUTState().SetTimePaused( nPauseTimeCount > 0 ); +} + + +//-------------------------------------------------------------------------------------- +// Starts a user defined timer callback +//-------------------------------------------------------------------------------------- +HRESULT WINAPI DXUTSetTimer( LPDXUTCALLBACKTIMER pCallbackTimer, float fTimeoutInSecs, UINT* pnIDEvent, + void* pCallbackUserContext ) +{ + if( pCallbackTimer == NULL ) + return DXUT_ERR_MSGBOX( L"DXUTSetTimer", E_INVALIDARG ); + + HRESULT hr; + DXUT_TIMER DXUTTimer; + DXUTTimer.pCallbackTimer = pCallbackTimer; + DXUTTimer.pCallbackUserContext = pCallbackUserContext; + DXUTTimer.fTimeoutInSecs = fTimeoutInSecs; + DXUTTimer.fCountdown = fTimeoutInSecs; + DXUTTimer.bEnabled = true; + DXUTTimer.nID = GetDXUTState().GetTimerLastID() + 1; + GetDXUTState().SetTimerLastID( DXUTTimer.nID ); + + CGrowableArray * pTimerList = GetDXUTState().GetTimerList(); + if( pTimerList == NULL ) + { + pTimerList = new CGrowableArray ; + if( pTimerList == NULL ) + return E_OUTOFMEMORY; + GetDXUTState().SetTimerList( pTimerList ); + } + + if( FAILED( hr = pTimerList->Add( DXUTTimer ) ) ) + return hr; + + if( pnIDEvent ) + *pnIDEvent = DXUTTimer.nID; + + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +// Stops a user defined timer callback +//-------------------------------------------------------------------------------------- +HRESULT WINAPI DXUTKillTimer( UINT nIDEvent ) +{ + CGrowableArray * pTimerList = GetDXUTState().GetTimerList(); + if( pTimerList == NULL ) + return S_FALSE; + + bool bFound = false; + + for( int i = 0; i < pTimerList->GetSize(); i++ ) + { + DXUT_TIMER DXUTTimer = pTimerList->GetAt( i ); + if( DXUTTimer.nID == nIDEvent ) + { + DXUTTimer.bEnabled = false; + pTimerList->SetAt( i, DXUTTimer ); + bFound = true; + break; + } + } + + if( !bFound ) + return DXUT_ERR_MSGBOX( L"DXUTKillTimer", E_INVALIDARG ); + + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +// Internal helper function to handle calling the user defined timer callbacks +//-------------------------------------------------------------------------------------- +void DXUTHandleTimers() +{ + float fElapsedTime = DXUTGetElapsedTime(); + + CGrowableArray * pTimerList = GetDXUTState().GetTimerList(); + if( pTimerList == NULL ) + return; + + // Walk through the list of timer callbacks + for( int i = 0; i < pTimerList->GetSize(); i++ ) + { + DXUT_TIMER DXUTTimer = pTimerList->GetAt( i ); + if( DXUTTimer.bEnabled ) + { + DXUTTimer.fCountdown -= fElapsedTime; + + // Call the callback if count down expired + if( DXUTTimer.fCountdown < 0 ) + { + DXUTTimer.pCallbackTimer( DXUTTimer.nID, DXUTTimer.pCallbackUserContext ); + // The callback my have changed the timer. + DXUTTimer = pTimerList->GetAt( i ); + DXUTTimer.fCountdown = DXUTTimer.fTimeoutInSecs; + } + pTimerList->SetAt( i, DXUTTimer ); + } + } +} + + +//-------------------------------------------------------------------------------------- +// Display an custom error msg box +//-------------------------------------------------------------------------------------- +void DXUTDisplayErrorMessage( HRESULT hr ) +{ + WCHAR strBuffer[512]; + + int nExitCode; + bool bFound = true; + switch( hr ) + { + case DXUTERR_NODIRECT3D: + { + nExitCode = 2; + if( DXUTDoesAppSupportD3D11() && !DXUTDoesAppSupportD3D9() ) + wcscpy_s( strBuffer, ARRAYSIZE(strBuffer), L"Could not initialize Direct3D 11. " ); + else + wcscpy_s( strBuffer, ARRAYSIZE(strBuffer), L"Could not initialize Direct3D 9. Check that the latest version of DirectX is correctly installed on your system. Also make sure that this program was compiled with header files that match the installed DirectX DLLs." ); + break; + } + case DXUTERR_NOCOMPATIBLEDEVICES: + nExitCode = 3; + if( GetSystemMetrics(0x1000) != 0 ) // SM_REMOTESESSION + wcscpy_s( strBuffer, ARRAYSIZE(strBuffer), L"Direct3D does not work over a remote session." ); + else + wcscpy_s( strBuffer, ARRAYSIZE(strBuffer), L"Could not find any compatible Direct3D devices." ); + break; + case DXUTERR_MEDIANOTFOUND: nExitCode = 4; wcscpy_s( strBuffer, ARRAYSIZE(strBuffer), L"Could not find required media." ); break; + case DXUTERR_NONZEROREFCOUNT: nExitCode = 5; wcscpy_s( strBuffer, ARRAYSIZE(strBuffer), L"The Direct3D device has a non-zero reference count, meaning some objects were not released." ); break; + case DXUTERR_CREATINGDEVICE: nExitCode = 6; wcscpy_s( strBuffer, ARRAYSIZE(strBuffer), L"Failed creating the Direct3D device." ); break; + case DXUTERR_RESETTINGDEVICE: nExitCode = 7; wcscpy_s( strBuffer, ARRAYSIZE(strBuffer), L"Failed resetting the Direct3D device." ); break; + case DXUTERR_CREATINGDEVICEOBJECTS: nExitCode = 8; wcscpy_s( strBuffer, ARRAYSIZE(strBuffer), L"An error occurred in the device create callback function." ); break; + case DXUTERR_RESETTINGDEVICEOBJECTS: nExitCode = 9; wcscpy_s( strBuffer, ARRAYSIZE(strBuffer), L"An error occurred in the device reset callback function." ); break; + // nExitCode 10 means the app exited using a REF device + case DXUTERR_DEVICEREMOVED: nExitCode = 11; wcscpy_s( strBuffer, ARRAYSIZE(strBuffer), L"The Direct3D device was removed." ); break; + default: bFound = false; nExitCode = 1; break; // nExitCode 1 means the API was incorrectly called + + } + + GetDXUTState().SetExitCode(nExitCode); + + bool bShowMsgBoxOnError = GetDXUTState().GetShowMsgBoxOnError(); + if( bFound && bShowMsgBoxOnError ) + { + if( DXUTGetWindowTitle()[0] == 0 ) + MessageBox( DXUTGetHWND(), strBuffer, L"DXUT Application", MB_ICONERROR | MB_OK ); + else + MessageBox( DXUTGetHWND(), strBuffer, DXUTGetWindowTitle(), MB_ICONERROR | MB_OK ); + } +} + + +//-------------------------------------------------------------------------------------- +// Internal function to map MK_* to an array index +//-------------------------------------------------------------------------------------- +int DXUTMapButtonToArrayIndex( BYTE vButton ) +{ + switch( vButton ) + { + case MK_LBUTTON: + return 0; + case VK_MBUTTON: + case MK_MBUTTON: + return 1; + case MK_RBUTTON: + return 2; + case VK_XBUTTON1: + case MK_XBUTTON1: + return 3; + case VK_XBUTTON2: + case MK_XBUTTON2: + return 4; + } + + return 0; +} + + + +//-------------------------------------------------------------------------------------- +// Toggle between full screen and windowed +//-------------------------------------------------------------------------------------- +HRESULT WINAPI DXUTToggleFullScreen() +{ + HRESULT hr; + DXUTDeviceSettings deviceSettings = DXUTGetDeviceSettings(); + DXUTDeviceSettings orginalDeviceSettings = DXUTGetDeviceSettings(); + + if (deviceSettings.ver == DXUT_D3D11_DEVICE) { + deviceSettings.d3d11.sd.Windowed = !deviceSettings.d3d11.sd.Windowed; // datut + if (!deviceSettings.d3d11.sd.Windowed) { + DXGI_MODE_DESC adapterDesktopDisplayMode = + { + 800, 600, { 60, 1 }, DXGI_FORMAT_R8G8B8A8_UNORM_SRGB + }; + DXUTGetD3D11AdapterDisplayMode( deviceSettings.d3d11.AdapterOrdinal, 0, &adapterDesktopDisplayMode ); + + + deviceSettings.d3d11.sd.BufferDesc = adapterDesktopDisplayMode; + }else { + RECT r = DXUTGetWindowClientRectAtModeChange(); + deviceSettings.d3d11.sd.BufferDesc.Height = r.bottom; + deviceSettings.d3d11.sd.BufferDesc.Width = r.right; + } + }else if (deviceSettings.ver == DXUT_D3D9_DEVICE){ + deviceSettings.d3d9.pp.Windowed = !deviceSettings.d3d9.pp.Windowed; + if (!deviceSettings.d3d9.pp.Windowed) { + D3DDISPLAYMODE adapterDesktopDisplayMode; + IDirect3D9* pD3D = DXUTGetD3D9Object(); + DXUTDeviceSettings* pDeviceSettings = GetDXUTState().GetCurrentDeviceSettings(); + pD3D->GetAdapterDisplayMode( pDeviceSettings->d3d9.AdapterOrdinal, &adapterDesktopDisplayMode ); + deviceSettings.d3d9.pp.BackBufferWidth = adapterDesktopDisplayMode.Width; + deviceSettings.d3d9.pp.BackBufferHeight = adapterDesktopDisplayMode.Height; + deviceSettings.d3d9.pp.BackBufferFormat = adapterDesktopDisplayMode.Format; + } else { + RECT r = DXUTGetWindowClientRectAtModeChange(); + deviceSettings.d3d9.pp.BackBufferHeight= r.bottom; + deviceSettings.d3d9.pp.FullScreen_RefreshRateInHz = 0; + deviceSettings.d3d9.pp.BackBufferWidth = r.right; + } + } + + hr = DXUTChangeDevice( &deviceSettings, NULL, NULL, false, false ); + + // If hr == E_ABORT, this means the app rejected the device settings in the ModifySettingsCallback so nothing changed + if( FAILED( hr ) && ( hr != E_ABORT ) ) + { + // Failed creating device, try to switch back. + HRESULT hr2 = DXUTChangeDevice( &orginalDeviceSettings, NULL, NULL, false, false ); + if( FAILED( hr2 ) ) + { + // If this failed, then shutdown + DXUTShutdown(); + } + } + + return hr; +} + + +//-------------------------------------------------------------------------------------- +// Toggle between HAL and WARP +//-------------------------------------------------------------------------------------- + +HRESULT WINAPI DXUTToggleWARP () { + HRESULT hr; + + DXUTDeviceSettings deviceSettings = DXUTGetDeviceSettings(); + DXUTDeviceSettings orginalDeviceSettings = DXUTGetDeviceSettings(); + + // Toggle between REF & HAL + if( DXUTIsCurrentDeviceD3D9() ) + { + + } + else + { + ID3D11SwitchToRef* pD3D11STR = NULL; + hr = DXUTGetD3D11Device()->QueryInterface( __uuidof( *pD3D11STR ), ( LPVOID* )&pD3D11STR ); + if( SUCCEEDED( hr ) ) + { + pD3D11STR->SetUseRef( pD3D11STR->GetUseRef() ? FALSE : TRUE ); + SAFE_RELEASE( pD3D11STR ); + return S_OK; + } + + if( deviceSettings.d3d11.DriverType == D3D_DRIVER_TYPE_HARDWARE || deviceSettings.d3d11.DriverType == D3D_DRIVER_TYPE_REFERENCE ) + deviceSettings.d3d11.DriverType = D3D_DRIVER_TYPE_WARP; + else if( deviceSettings.d3d11.DriverType == D3D_DRIVER_TYPE_REFERENCE || deviceSettings.d3d11.DriverType == D3D_DRIVER_TYPE_WARP ) + deviceSettings.d3d11.DriverType = D3D_DRIVER_TYPE_HARDWARE; + } + + hr = DXUTSnapDeviceSettingsToEnumDevice(&deviceSettings, false); + if( SUCCEEDED( hr ) ) + { + // Create a Direct3D device using the new device settings. + // If there is an existing device, then it will either reset or recreate the scene. + hr = DXUTChangeDevice( &deviceSettings, NULL, NULL, false, false ); + + // If hr == E_ABORT, this means the app rejected the device settings in the ModifySettingsCallback so nothing changed + if( FAILED( hr ) && ( hr != E_ABORT ) ) + { + // Failed creating device, try to switch back. + HRESULT hr2 = DXUTChangeDevice( &orginalDeviceSettings, NULL, NULL, false, false ); + if( FAILED( hr2 ) ) + { + // If this failed, then shutdown + DXUTShutdown(); + } + } + } + + return hr; +} +//-------------------------------------------------------------------------------------- +// Toggle between HAL and REF +//-------------------------------------------------------------------------------------- +HRESULT WINAPI DXUTToggleREF() +{ + HRESULT hr; + + DXUTDeviceSettings deviceSettings = DXUTGetDeviceSettings(); + DXUTDeviceSettings orginalDeviceSettings = DXUTGetDeviceSettings(); + + // Toggle between REF & HAL + if( DXUTIsCurrentDeviceD3D9() ) + { + if( deviceSettings.d3d9.DeviceType == D3DDEVTYPE_HAL ) + deviceSettings.d3d9.DeviceType = D3DDEVTYPE_REF; + else if( deviceSettings.d3d9.DeviceType == D3DDEVTYPE_REF ) + deviceSettings.d3d9.DeviceType = D3DDEVTYPE_HAL; + } + else + { + ID3D11SwitchToRef* pD3D11STR = NULL; + hr = DXUTGetD3D11Device()->QueryInterface( __uuidof( *pD3D11STR ), ( LPVOID* )&pD3D11STR ); + if( SUCCEEDED( hr ) ) + { + pD3D11STR->SetUseRef( pD3D11STR->GetUseRef() ? FALSE : TRUE ); + SAFE_RELEASE( pD3D11STR ); + return S_OK; + } + + if( deviceSettings.d3d11.DriverType == D3D_DRIVER_TYPE_HARDWARE ) + deviceSettings.d3d11.DriverType = D3D_DRIVER_TYPE_REFERENCE; + else if( deviceSettings.d3d11.DriverType == D3D_DRIVER_TYPE_REFERENCE ) + deviceSettings.d3d11.DriverType = D3D_DRIVER_TYPE_HARDWARE; + } + + hr = DXUTSnapDeviceSettingsToEnumDevice(&deviceSettings, false); + if( SUCCEEDED( hr ) ) + { + // Create a Direct3D device using the new device settings. + // If there is an existing device, then it will either reset or recreate the scene. + hr = DXUTChangeDevice( &deviceSettings, NULL, NULL, false, false ); + + // If hr == E_ABORT, this means the app rejected the device settings in the ModifySettingsCallback so nothing changed + if( FAILED( hr ) && ( hr != E_ABORT ) ) + { + // Failed creating device, try to switch back. + HRESULT hr2 = DXUTChangeDevice( &orginalDeviceSettings, NULL, NULL, false, false ); + if( FAILED( hr2 ) ) + { + // If this failed, then shutdown + DXUTShutdown(); + } + } + } + + return hr; +} + +//-------------------------------------------------------------------------------------- +// Checks to see if DXGI has switched us out of fullscreen or windowed mode +//-------------------------------------------------------------------------------------- +void DXUTCheckForDXGIFullScreenSwitch() +{ + DXUTDeviceSettings* pDeviceSettings = GetDXUTState().GetCurrentDeviceSettings(); + if( !DXUTIsD3D9( pDeviceSettings ) ) + { + IDXGISwapChain* pSwapChain = DXUTGetDXGISwapChain(); + DXGI_SWAP_CHAIN_DESC SCDesc; + pSwapChain->GetDesc( &SCDesc ); + + BOOL bIsWindowed = ( BOOL )DXUTIsWindowed(); + if( bIsWindowed != SCDesc.Windowed ) + { + pDeviceSettings->d3d11.sd.Windowed = SCDesc.Windowed; + + DXUTDeviceSettings deviceSettings = DXUTGetDeviceSettings(); + + if( bIsWindowed ) + { + GetDXUTState().SetWindowBackBufferWidthAtModeChange( deviceSettings.d3d11.sd.BufferDesc.Width ); + GetDXUTState().SetWindowBackBufferHeightAtModeChange( deviceSettings.d3d11.sd.BufferDesc.Height ); + } + else + { + GetDXUTState().SetFullScreenBackBufferWidthAtModeChange( deviceSettings.d3d11.sd.BufferDesc.Width ); + GetDXUTState().SetFullScreenBackBufferHeightAtModeChange( deviceSettings.d3d11.sd.BufferDesc.Height ); + } + } + } +} + +void DXUTResizeDXGIBuffers( UINT Width, UINT Height, BOOL bFullScreen ) +{ + HRESULT hr = S_OK; + RECT rcCurrentClient; + GetClientRect( DXUTGetHWND(), &rcCurrentClient ); + + DXUTDeviceSettings* pDevSettings = GetDXUTState().GetCurrentDeviceSettings(); + IDXGISwapChain* pSwapChain = DXUTGetDXGISwapChain(); + + ID3D11Device* pd3dDevice = DXUTGetD3D11Device(); + ID3D11DeviceContext* pd3dImmediateContext = DXUTGetD3D11DeviceContext(); + + // Determine if we're fullscreen + pDevSettings->d3d11.sd.Windowed = !bFullScreen; + + // Call releasing + GetDXUTState().SetInsideDeviceCallback( true ); + LPDXUTCALLBACKD3D11SWAPCHAINRELEASING pCallbackSwapChainReleasing = GetDXUTState().GetD3D11SwapChainReleasingFunc + (); + if( pCallbackSwapChainReleasing != NULL ) + pCallbackSwapChainReleasing( GetDXUTState().GetD3D11SwapChainResizedFuncUserContext() ); + GetDXUTState().SetInsideDeviceCallback( false ); + + // Release our old depth stencil texture and view + ID3D11Texture2D* pDS = GetDXUTState().GetD3D11DepthStencil(); + SAFE_RELEASE( pDS ); + GetDXUTState().SetD3D11DepthStencil( NULL ); + ID3D11DepthStencilView* pDSV = GetDXUTState().GetD3D11DepthStencilView(); + SAFE_RELEASE( pDSV ); + GetDXUTState().SetD3D11DepthStencilView( NULL ); + + // Release our old render target view + ID3D11RenderTargetView* pRTV = GetDXUTState().GetD3D11RenderTargetView(); + SAFE_RELEASE( pRTV ); + GetDXUTState().SetD3D11RenderTargetView( NULL ); + + // Alternate between 0 and DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH when resizing buffers. + // When in windowed mode, we want 0 since this allows the app to change to the desktop + // resolution from windowed mode during alt+enter. However, in fullscreen mode, we want + // the ability to change display modes from the Device Settings dialog. Therefore, we + // want to set the DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH flag. + UINT Flags = 0; + if( bFullScreen ) + Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH; + + // ResizeBuffers + V( pSwapChain->ResizeBuffers( pDevSettings->d3d11.sd.BufferCount, + Width, + Height, + pDevSettings->d3d11.sd.BufferDesc.Format, + Flags ) ); + + if( !GetDXUTState().GetDoNotStoreBufferSize() ) + { + pDevSettings->d3d11.sd.BufferDesc.Width = ( UINT )rcCurrentClient.right; + pDevSettings->d3d11.sd.BufferDesc.Height = ( UINT )rcCurrentClient.bottom; + } + + // Save off backbuffer desc + DXUTUpdateBackBufferDesc(); + + // Update the device stats text + DXUTUpdateStaticFrameStats(); + + // Setup the render target view and viewport + hr = DXUTCreateD3D11Views( pd3dDevice, pd3dImmediateContext, pDevSettings ); + if( FAILED( hr ) ) + { + DXUT_ERR( L"DXUTCreateD3D11Views", hr ); + return; + } + + // Setup cursor based on current settings (window/fullscreen mode, show cursor state, clip cursor state) + DXUTSetupCursor(); + + // Call the app's SwapChain reset callback + GetDXUTState().SetInsideDeviceCallback( true ); + const DXGI_SURFACE_DESC* pBackBufferSurfaceDesc = DXUTGetDXGIBackBufferSurfaceDesc(); + LPDXUTCALLBACKD3D11SWAPCHAINRESIZED pCallbackSwapChainResized = GetDXUTState().GetD3D11SwapChainResizedFunc(); + hr = S_OK; + if( pCallbackSwapChainResized != NULL ) + hr = pCallbackSwapChainResized( pd3dDevice, pSwapChain, pBackBufferSurfaceDesc, + GetDXUTState().GetD3D11SwapChainResizedFuncUserContext() ); + GetDXUTState().SetInsideDeviceCallback( false ); + if( FAILED( hr ) ) + { + // If callback failed, cleanup + DXUT_ERR( L"DeviceResetCallback", hr ); + if( hr != DXUTERR_MEDIANOTFOUND ) + hr = DXUTERR_RESETTINGDEVICEOBJECTS; + + GetDXUTState().SetInsideDeviceCallback( true ); + LPDXUTCALLBACKD3D11SWAPCHAINRELEASING pCallbackSwapChainReleasing = + GetDXUTState().GetD3D11SwapChainReleasingFunc(); + if( pCallbackSwapChainReleasing != NULL ) + pCallbackSwapChainReleasing( GetDXUTState().GetD3D11SwapChainResizedFuncUserContext() ); + GetDXUTState().SetInsideDeviceCallback( false ); + DXUTPause( false, false ); + PostQuitMessage( 0 ); + } + else + { + GetDXUTState().SetDeviceObjectsReset( true ); + DXUTPause( false, false ); + } +} + +//-------------------------------------------------------------------------------------- +// Checks if DXGI buffers need to change +//-------------------------------------------------------------------------------------- +void DXUTCheckForDXGIBufferChange() +{ + if(DXUTGetDXGISwapChain() != NULL && !GetDXUTState().GetReleasingSwapChain() ) + { + //DXUTgetdxgi + IDXGISwapChain* pSwapChain = DXUTGetDXGISwapChain(); + + // Determine if we're fullscreen + BOOL bFullScreen; + pSwapChain->GetFullscreenState( &bFullScreen, NULL ); + + DXUTResizeDXGIBuffers( 0, 0, bFullScreen ); + + ShowWindow( DXUTGetHWND(), SW_SHOW ); + } +} + +//-------------------------------------------------------------------------------------- +// Checks if the window client rect has changed and if it has, then reset the device +//-------------------------------------------------------------------------------------- +void DXUTCheckForWindowSizeChange() +{ + // Skip the check for various reasons + + if( GetDXUTState().GetIgnoreSizeChange() || !GetDXUTState().GetDeviceCreated() || + ( DXUTIsCurrentDeviceD3D9() && !DXUTIsWindowed() ) ) + return; + + DXUTDeviceSettings deviceSettings = DXUTGetDeviceSettings(); + if( DXUTIsD3D9( &deviceSettings ) ) + { + RECT rcCurrentClient; + GetClientRect( DXUTGetHWND(), &rcCurrentClient ); + + if( ( UINT )rcCurrentClient.right != DXUTGetBackBufferWidthFromDS( &deviceSettings ) || + ( UINT )rcCurrentClient.bottom != DXUTGetBackBufferHeightFromDS( &deviceSettings ) ) + { + // A new window size will require a new backbuffer size size + // Tell DXUTChangeDevice and D3D to size according to the HWND's client rect + if( DXUTIsD3D9( &deviceSettings ) ) deviceSettings.d3d9.pp.BackBufferWidth = 0; else deviceSettings.d3d11.sd.BufferDesc.Width = 0; + if( DXUTIsD3D9( &deviceSettings ) ) deviceSettings.d3d9.pp.BackBufferHeight = 0; else deviceSettings.d3d11.sd.BufferDesc.Height = 0; + + DXUTChangeDevice( &deviceSettings, NULL, NULL, false, false ); + } + } + else + { + DXUTCheckForDXGIBufferChange(); + } +} + + +//-------------------------------------------------------------------------------------- +// Checks to see if the HWND changed monitors, and if it did it creates a device +// from the monitor's adapter and recreates the scene. +//-------------------------------------------------------------------------------------- +void DXUTCheckForWindowChangingMonitors() +{ + // Skip this check for various reasons + if( !GetDXUTState().GetAutoChangeAdapter() || + GetDXUTState().GetIgnoreSizeChange() || !GetDXUTState().GetDeviceCreated() || !DXUTIsWindowed() ) + return; + + HRESULT hr; + HMONITOR hWindowMonitor = DXUTMonitorFromWindow( DXUTGetHWND(), MONITOR_DEFAULTTOPRIMARY ); + HMONITOR hAdapterMonitor = GetDXUTState().GetAdapterMonitor(); + if( hWindowMonitor != hAdapterMonitor ) + { + UINT newOrdinal; + if( SUCCEEDED( DXUTGetAdapterOrdinalFromMonitor( hWindowMonitor, &newOrdinal ) ) ) + { + // Find the closest valid device settings with the new ordinal + DXUTDeviceSettings deviceSettings = DXUTGetDeviceSettings(); + if( DXUTIsD3D9( &deviceSettings ) ) + { + deviceSettings.d3d9.AdapterOrdinal = newOrdinal; + } + else + { + deviceSettings.d3d11.AdapterOrdinal = newOrdinal; + UINT newOutput; + if( SUCCEEDED( DXUTGetOutputOrdinalFromMonitor( hWindowMonitor, &newOutput ) ) ) + deviceSettings.d3d11.Output = newOutput; + } + + hr = DXUTSnapDeviceSettingsToEnumDevice( &deviceSettings, false ); + if( SUCCEEDED( hr ) ) + { + // Create a Direct3D device using the new device settings. + // If there is an existing device, then it will either reset or recreate the scene. + hr = DXUTChangeDevice( &deviceSettings, NULL, NULL, false, false ); + + // If hr == E_ABORT, this means the app rejected the device settings in the ModifySettingsCallback + if( hr == E_ABORT ) + { + // so nothing changed and keep from attempting to switch adapters next time + GetDXUTState().SetAutoChangeAdapter( false ); + } + else if( FAILED( hr ) ) + { + DXUTShutdown(); + DXUTPause( false, false ); + return; + } + } + } + } +} + + +//-------------------------------------------------------------------------------------- +// Renders the scene using either D3D9 or D3D11 +//-------------------------------------------------------------------------------------- +void WINAPI DXUTRender3DEnvironment() +{ + if( DXUTIsCurrentDeviceD3D9() ) + DXUTRender3DEnvironment9(); + else + DXUTRender3DEnvironment11(); +} + + +//-------------------------------------------------------------------------------------- +// Cleans up both the D3D9 and D3D11 3D environment (but only one should be active at a time) +//-------------------------------------------------------------------------------------- +void DXUTCleanup3DEnvironment( bool bReleaseSettings ) +{ + if( DXUTGetD3D9Device() ) + DXUTCleanup3DEnvironment9( bReleaseSettings ); + if( DXUTGetD3D11Device() ) + DXUTCleanup3DEnvironment11( bReleaseSettings ); +} + + +//-------------------------------------------------------------------------------------- +// Returns the HMONITOR attached to an adapter/output +//-------------------------------------------------------------------------------------- +HMONITOR DXUTGetMonitorFromAdapter( DXUTDeviceSettings* pDeviceSettings ) +{ + if( pDeviceSettings->ver == DXUT_D3D9_DEVICE ) + { + IDirect3D9* pD3D = DXUTGetD3D9Object(); + return pD3D->GetAdapterMonitor( pDeviceSettings->d3d9.AdapterOrdinal ); + } + else if( pDeviceSettings->ver == DXUT_D3D11_DEVICE ) + { + CD3D11Enumeration* pD3DEnum = DXUTGetD3D11Enumeration(); + CD3D11EnumOutputInfo* pOutputInfo = pD3DEnum->GetOutputInfo( pDeviceSettings->d3d11.AdapterOrdinal, + pDeviceSettings->d3d11.Output ); + if( !pOutputInfo ) + return 0; + return DXUTMonitorFromRect( &pOutputInfo->Desc.DesktopCoordinates, MONITOR_DEFAULTTONEAREST ); + } + + return 0; +} + + +//-------------------------------------------------------------------------------------- +// Look for an adapter ordinal that is tied to a HMONITOR +//-------------------------------------------------------------------------------------- +HRESULT DXUTGetAdapterOrdinalFromMonitor( HMONITOR hMonitor, UINT* pAdapterOrdinal ) +{ + *pAdapterOrdinal = 0; + + if( DXUTIsCurrentDeviceD3D9() ) + { + CD3D9Enumeration* pd3dEnum = DXUTGetD3D9Enumeration(); + IDirect3D9* pD3D = DXUTGetD3D9Object(); + + CGrowableArray * pAdapterList = pd3dEnum->GetAdapterInfoList(); + for( int iAdapter = 0; iAdapter < pAdapterList->GetSize(); iAdapter++ ) + { + CD3D9EnumAdapterInfo* pAdapterInfo = pAdapterList->GetAt( iAdapter ); + HMONITOR hAdapterMonitor = pD3D->GetAdapterMonitor( pAdapterInfo->AdapterOrdinal ); + if( hAdapterMonitor == hMonitor ) + { + *pAdapterOrdinal = pAdapterInfo->AdapterOrdinal; + return S_OK; + } + } + } + else + { + // Get the monitor handle information + MONITORINFOEX mi; + mi.cbSize = sizeof( MONITORINFOEX ); + DXUTGetMonitorInfo( hMonitor, &mi ); + + // Search for this monitor in our enumeration hierarchy. + CD3D11Enumeration* pd3dEnum = DXUTGetD3D11Enumeration(); + CGrowableArray * pAdapterList = pd3dEnum->GetAdapterInfoList(); + for( int iAdapter = 0; iAdapter < pAdapterList->GetSize(); ++iAdapter ) + { + CD3D11EnumAdapterInfo* pAdapterInfo = pAdapterList->GetAt( iAdapter ); + for( int o = 0; o < pAdapterInfo->outputInfoList.GetSize(); ++o ) + { + CD3D11EnumOutputInfo* pOutputInfo = pAdapterInfo->outputInfoList.GetAt( o ); + // Convert output device name from MBCS to Unicode + if( wcsncmp( pOutputInfo->Desc.DeviceName, mi.szDevice, sizeof( mi.szDevice ) / sizeof + ( mi.szDevice[0] ) ) == 0 ) + { + *pAdapterOrdinal = pAdapterInfo->AdapterOrdinal; + return S_OK; + } + } + } + } + + return E_FAIL; +} + +//-------------------------------------------------------------------------------------- +// Look for a monitor ordinal that is tied to a HMONITOR (D3D11-only) +//-------------------------------------------------------------------------------------- +HRESULT DXUTGetOutputOrdinalFromMonitor( HMONITOR hMonitor, UINT* pOutputOrdinal ) +{ + // Get the monitor handle information + MONITORINFOEX mi; + mi.cbSize = sizeof( MONITORINFOEX ); + DXUTGetMonitorInfo( hMonitor, &mi ); + + // Search for this monitor in our enumeration hierarchy. + CD3D11Enumeration* pd3dEnum = DXUTGetD3D11Enumeration(); + CGrowableArray * pAdapterList = pd3dEnum->GetAdapterInfoList(); + for( int iAdapter = 0; iAdapter < pAdapterList->GetSize(); ++iAdapter ) + { + CD3D11EnumAdapterInfo* pAdapterInfo = pAdapterList->GetAt( iAdapter ); + for( int o = 0; o < pAdapterInfo->outputInfoList.GetSize(); ++o ) + { + CD3D11EnumOutputInfo* pOutputInfo = pAdapterInfo->outputInfoList.GetAt( o ); + DXGI_OUTPUT_DESC Desc; + pOutputInfo->m_pOutput->GetDesc( &Desc ); + + if( hMonitor == Desc.Monitor ) + { + *pOutputOrdinal = pOutputInfo->Output; + return S_OK; + } + } + } + + return E_FAIL; +} + +//-------------------------------------------------------------------------------------- +// This method is called when D3DERR_DEVICEREMOVED is returned from an API. DXUT +// calls the application's DeviceRemoved callback to inform it of the event. The +// application returns true if it wants DXUT to look for a closest device to run on. +// If no device is found, or the app returns false, DXUT shuts down. +//-------------------------------------------------------------------------------------- +HRESULT DXUTHandleDeviceRemoved() +{ + HRESULT hr = S_OK; + + // Device has been removed. Call the application's callback if set. If no callback + // has been set, then just look for a new device + bool bLookForNewDevice = true; + LPDXUTCALLBACKDEVICEREMOVED pDeviceRemovedFunc = GetDXUTState().GetDeviceRemovedFunc(); + if( pDeviceRemovedFunc ) + bLookForNewDevice = pDeviceRemovedFunc( GetDXUTState().GetDeviceRemovedFuncUserContext() ); + + if( bLookForNewDevice ) + { + DXUTDeviceSettings* pDeviceSettings = GetDXUTState().GetCurrentDeviceSettings(); + + + hr = DXUTSnapDeviceSettingsToEnumDevice( pDeviceSettings, false); + if( SUCCEEDED( hr ) ) + { + // Change to a Direct3D device created from the new device settings + // that is compatible with the removed device. + hr = DXUTChangeDevice( pDeviceSettings, NULL, NULL, true, false ); + if( SUCCEEDED( hr ) ) + return S_OK; + } + } + + // The app does not wish to continue or continuing is not possible. + return DXUTERR_DEVICEREMOVED; +} + + +//-------------------------------------------------------------------------------------- +// Stores back buffer surface desc in GetDXUTState().GetBackBufferSurfaceDesc10() +//-------------------------------------------------------------------------------------- +void DXUTUpdateBackBufferDesc() +{ + if( DXUTIsCurrentDeviceD3D9() ) + { + HRESULT hr; + IDirect3DSurface9* pBackBuffer; + hr = GetDXUTState().GetD3D9Device()->GetBackBuffer( 0, 0, D3DBACKBUFFER_TYPE_MONO, &pBackBuffer ); + D3DSURFACE_DESC* pBBufferSurfaceDesc = GetDXUTState().GetBackBufferSurfaceDesc9(); + ZeroMemory( pBBufferSurfaceDesc, sizeof( D3DSURFACE_DESC ) ); + if( SUCCEEDED( hr ) ) + { + pBackBuffer->GetDesc( pBBufferSurfaceDesc ); + SAFE_RELEASE( pBackBuffer ); + } + } + else + { + HRESULT hr; + ID3D11Texture2D* pBackBuffer; + hr = GetDXUTState().GetDXGISwapChain()->GetBuffer( 0, __uuidof( *pBackBuffer ), ( LPVOID* )&pBackBuffer ); + DXGI_SURFACE_DESC* pBBufferSurfaceDesc = GetDXUTState().GetBackBufferSurfaceDescDXGI(); + ZeroMemory( pBBufferSurfaceDesc, sizeof( DXGI_SURFACE_DESC ) ); + if( SUCCEEDED( hr ) ) + { + D3D11_TEXTURE2D_DESC TexDesc; + pBackBuffer->GetDesc( &TexDesc ); + pBBufferSurfaceDesc->Width = ( UINT )TexDesc.Width; + pBBufferSurfaceDesc->Height = ( UINT )TexDesc.Height; + pBBufferSurfaceDesc->Format = TexDesc.Format; + pBBufferSurfaceDesc->SampleDesc = TexDesc.SampleDesc; + SAFE_RELEASE( pBackBuffer ); + } + } +} + + +//-------------------------------------------------------------------------------------- +// Setup cursor based on current settings (window/fullscreen mode, show cursor state, clip cursor state) +//-------------------------------------------------------------------------------------- +void DXUTSetupCursor() +{ + if( DXUTIsCurrentDeviceD3D9() ) + { + // Show the cursor again if returning to fullscreen + IDirect3DDevice9* pd3dDevice = DXUTGetD3D9Device(); + if( !DXUTIsWindowed() && pd3dDevice ) + { + if( GetDXUTState().GetShowCursorWhenFullScreen() ) + { + SetCursor( NULL ); // Turn off Windows cursor in full screen mode + HCURSOR hCursor = ( HCURSOR )( ULONG_PTR )GetClassLongPtr( DXUTGetHWNDDeviceFullScreen(), + GCLP_HCURSOR ); + DXUTSetD3D9DeviceCursor( pd3dDevice, hCursor, false ); + DXUTGetD3D9Device()->ShowCursor( true ); + } + else + { + SetCursor( NULL ); // Turn off Windows cursor in full screen mode + DXUTGetD3D9Device()->ShowCursor( false ); + } + } + + // Clip cursor if requested + if( !DXUTIsWindowed() && GetDXUTState().GetClipCursorWhenFullScreen() ) + { + // Confine cursor to full screen window + RECT rcWindow; + GetWindowRect( DXUTGetHWNDDeviceFullScreen(), &rcWindow ); + ClipCursor( &rcWindow ); + } + else + { + ClipCursor( NULL ); + } + } + else + { + // Clip cursor if requested + if( !DXUTIsWindowed() && GetDXUTState().GetClipCursorWhenFullScreen() ) + { + // Confine cursor to full screen window + RECT rcWindow; + GetWindowRect( DXUTGetHWNDDeviceFullScreen(), &rcWindow ); + ClipCursor( &rcWindow ); + } + else + { + ClipCursor( NULL ); + } + } +} + + +//-------------------------------------------------------------------------------------- +// Updates the static part of the frame stats so it doesn't have be generated every frame +//-------------------------------------------------------------------------------------- +void DXUTUpdateStaticFrameStats() +{ + if( GetDXUTState().GetNoStats() ) + return; + + DXUTDeviceSettings* pDeviceSettings = GetDXUTState().GetCurrentDeviceSettings(); + if( NULL == pDeviceSettings ) + return; + + if( DXUTIsD3D9( pDeviceSettings ) ) + { + CD3D9Enumeration* pd3dEnum = DXUTGetD3D9Enumeration(); + if( NULL == pd3dEnum ) + return; + + CD3D9EnumDeviceSettingsCombo* pDeviceSettingsCombo = pd3dEnum->GetDeviceSettingsCombo( + pDeviceSettings->d3d9.AdapterOrdinal, pDeviceSettings->d3d9.DeviceType, + pDeviceSettings->d3d9.AdapterFormat, pDeviceSettings->d3d9.pp.BackBufferFormat, + pDeviceSettings->d3d9.pp.Windowed ); + if( NULL == pDeviceSettingsCombo ) + return; + + WCHAR strFmt[100]; + D3DPRESENT_PARAMETERS* pPP = &pDeviceSettings->d3d9.pp; + + if( pDeviceSettingsCombo->AdapterFormat == pDeviceSettingsCombo->BackBufferFormat ) + { + wcscpy_s( strFmt, 100, DXUTD3DFormatToString( pDeviceSettingsCombo->AdapterFormat, false ) ); + } + else + { + swprintf_s( strFmt, 100, L"backbuf %s, adapter %s", + DXUTD3DFormatToString( pDeviceSettingsCombo->BackBufferFormat, false ), + DXUTD3DFormatToString( pDeviceSettingsCombo->AdapterFormat, false ) ); + } + + WCHAR strDepthFmt[100]; + if( pPP->EnableAutoDepthStencil ) + { + swprintf_s( strDepthFmt, 100, L" (%s)", DXUTD3DFormatToString( pPP->AutoDepthStencilFormat, false ) ); + } + else + { + // No depth buffer + strDepthFmt[0] = 0; + } + + WCHAR strMultiSample[100]; + switch( pPP->MultiSampleType ) + { + case D3DMULTISAMPLE_NONMASKABLE: + wcscpy_s( strMultiSample, 100, L" (Nonmaskable Multisample)" ); break; + case D3DMULTISAMPLE_NONE: + wcscpy_s( strMultiSample, 100, L"" ); break; + default: + swprintf_s( strMultiSample, 100, L" (%dx Multisample)", pPP->MultiSampleType ); break; + } + + WCHAR* pstrStaticFrameStats = GetDXUTState().GetStaticFrameStats(); + swprintf_s( pstrStaticFrameStats, 256, L"D3D9 %%sVsync %s (%dx%d), %s%s%s", + ( pPP->PresentationInterval == D3DPRESENT_INTERVAL_IMMEDIATE ) ? L"off" : L"on", + pPP->BackBufferWidth, pPP->BackBufferHeight, + strFmt, strDepthFmt, strMultiSample ); + } + else + { + // D3D11 + CD3D11Enumeration* pd3dEnum = DXUTGetD3D11Enumeration(); + if( NULL == pd3dEnum ) + return; + + CD3D11EnumDeviceSettingsCombo* pDeviceSettingsCombo = pd3dEnum->GetDeviceSettingsCombo( + pDeviceSettings->d3d11.AdapterOrdinal, pDeviceSettings->d3d11.DriverType, pDeviceSettings->d3d11.Output, + pDeviceSettings->d3d11.sd.BufferDesc.Format, pDeviceSettings->d3d11.sd.Windowed ); + if( NULL == pDeviceSettingsCombo ) + return; + + WCHAR strFmt[100]; + + wcscpy_s( strFmt, 100, DXUTDXGIFormatToString( pDeviceSettingsCombo->BackBufferFormat, false ) ); + + WCHAR strMultiSample[100]; + swprintf_s( strMultiSample, 100, L" (MS%u, Q%u)", pDeviceSettings->d3d11.sd.SampleDesc.Count, + pDeviceSettings->d3d11.sd.SampleDesc.Quality ); + + WCHAR* pstrStaticFrameStats = GetDXUTState().GetStaticFrameStats(); + swprintf_s( pstrStaticFrameStats, 256, L"D3D11 %%sVsync %s (%dx%d), %s%s", + ( pDeviceSettings->d3d11.SyncInterval == 0 ) ? L"off" : L"on", + pDeviceSettings->d3d11.sd.BufferDesc.Width, pDeviceSettings->d3d11.sd.BufferDesc.Height, + strFmt, strMultiSample ); + } +} + + +//-------------------------------------------------------------------------------------- +// Updates the frames/sec stat once per second +//-------------------------------------------------------------------------------------- +void DXUTUpdateFrameStats() +{ + if( GetDXUTState().GetNoStats() ) + return; + + // Keep track of the frame count + double fLastTime = GetDXUTState().GetLastStatsUpdateTime(); + DWORD dwFrames = GetDXUTState().GetLastStatsUpdateFrames(); + double fAbsTime = GetDXUTState().GetAbsoluteTime(); + dwFrames++; + GetDXUTState().SetLastStatsUpdateFrames( dwFrames ); + + // Update the scene stats once per second + if( fAbsTime - fLastTime > 1.0f ) + { + float fFPS = ( float )( dwFrames / ( fAbsTime - fLastTime ) ); + GetDXUTState().SetFPS( fFPS ); + GetDXUTState().SetLastStatsUpdateTime( fAbsTime ); + GetDXUTState().SetLastStatsUpdateFrames( 0 ); + + WCHAR* pstrFPS = GetDXUTState().GetFPSStats(); + swprintf_s( pstrFPS, 64, L"%0.2f fps ", fFPS ); + } +} + +//-------------------------------------------------------------------------------------- +// Returns a string describing the current device. If bShowFPS is true, then +// the string contains the frames/sec. If "-nostats" was used in +// the command line, the string will be blank +//-------------------------------------------------------------------------------------- +LPCWSTR WINAPI DXUTGetFrameStats( bool bShowFPS ) +{ + WCHAR* pstrFrameStats = GetDXUTState().GetFrameStats(); + WCHAR* pstrFPS = ( bShowFPS ) ? GetDXUTState().GetFPSStats() : L""; + swprintf_s( pstrFrameStats, 256, GetDXUTState().GetStaticFrameStats(), pstrFPS ); + return pstrFrameStats; +} + + +//-------------------------------------------------------------------------------------- +// Updates the string which describes the device +//-------------------------------------------------------------------------------------- +void DXUTUpdateD3D9DeviceStats( D3DDEVTYPE DeviceType, DWORD BehaviorFlags, + D3DADAPTER_IDENTIFIER9* pAdapterIdentifier ) +{ + if( GetDXUTState().GetNoStats() ) + return; + + // Store device description + WCHAR* pstrDeviceStats = GetDXUTState().GetDeviceStats(); + if( DeviceType == D3DDEVTYPE_REF ) + wcscpy_s( pstrDeviceStats, 256, L"REF" ); + else if( DeviceType == D3DDEVTYPE_HAL ) + wcscpy_s( pstrDeviceStats, 256, L"HAL" ); + else if( DeviceType == D3DDEVTYPE_SW ) + wcscpy_s( pstrDeviceStats, 256, L"SW" ); + + if( DeviceType == D3DDEVTYPE_HAL ) + { + // Be sure not to overflow m_strDeviceStats when appending the adapter + // description, since it can be long. + wcscat_s( pstrDeviceStats, 256, L": " ); + + // Try to get a unique description from the CD3D9EnumDeviceSettingsCombo + DXUTDeviceSettings* pDeviceSettings = GetDXUTState().GetCurrentDeviceSettings(); + if( !pDeviceSettings ) + return; + + CD3D9Enumeration* pd3dEnum = DXUTGetD3D9Enumeration(); + CD3D9EnumDeviceSettingsCombo* pDeviceSettingsCombo = pd3dEnum->GetDeviceSettingsCombo( + pDeviceSettings->d3d9.AdapterOrdinal, pDeviceSettings->d3d9.DeviceType, + pDeviceSettings->d3d9.AdapterFormat, pDeviceSettings->d3d9.pp.BackBufferFormat, + pDeviceSettings->d3d9.pp.Windowed ); + if( pDeviceSettingsCombo ) + { + wcscat_s( pstrDeviceStats, 256, pDeviceSettingsCombo->pAdapterInfo->szUniqueDescription ); + } + else + { + const int cchDesc = sizeof( pAdapterIdentifier->Description ); + WCHAR szDescription[cchDesc]; + MultiByteToWideChar( CP_ACP, 0, pAdapterIdentifier->Description, -1, szDescription, cchDesc ); + szDescription[cchDesc - 1] = 0; + wcscat_s( pstrDeviceStats, 256, szDescription ); + } + } +} + + +//-------------------------------------------------------------------------------------- +// Updates the string which describes the device +//-------------------------------------------------------------------------------------- +void DXUTUpdateD3D11DeviceStats( D3D_DRIVER_TYPE DeviceType, DXGI_ADAPTER_DESC* pAdapterDesc ) +{ + if( GetDXUTState().GetNoStats() ) + return; + + // Store device description + WCHAR* pstrDeviceStats = GetDXUTState().GetDeviceStats(); + if( DeviceType == D3D_DRIVER_TYPE_REFERENCE ) + wcscpy_s( pstrDeviceStats, 256, L"REFERENCE" ); + else if( DeviceType == D3D_DRIVER_TYPE_HARDWARE ) + wcscpy_s( pstrDeviceStats, 256, L"HARDWARE" ); + else if( DeviceType == D3D_DRIVER_TYPE_SOFTWARE ) + wcscpy_s( pstrDeviceStats, 256, L"SOFTWARE" ); + else if( DeviceType == D3D_DRIVER_TYPE_WARP ) + wcscpy_s( pstrDeviceStats, 256, L"WARP" ); + + if( DeviceType == D3D_DRIVER_TYPE_HARDWARE ) + { + // Be sure not to overflow m_strDeviceStats when appending the adapter + // description, since it can be long. + wcscat_s( pstrDeviceStats, 256, L": " ); + + // Try to get a unique description from the CD3D11EnumDeviceSettingsCombo + DXUTDeviceSettings* pDeviceSettings = GetDXUTState().GetCurrentDeviceSettings(); + if( !pDeviceSettings ) + return; + + CD3D11Enumeration* pd3dEnum = DXUTGetD3D11Enumeration(); + CD3D11EnumDeviceSettingsCombo* pDeviceSettingsCombo = pd3dEnum->GetDeviceSettingsCombo( + pDeviceSettings->d3d11.AdapterOrdinal, pDeviceSettings->d3d11.DriverType, pDeviceSettings->d3d11.Output, + pDeviceSettings->d3d11.sd.BufferDesc.Format, pDeviceSettings->d3d11.sd.Windowed ); + if( pDeviceSettingsCombo ) + wcscat_s( pstrDeviceStats, 256, pDeviceSettingsCombo->pAdapterInfo->szUniqueDescription ); + else + wcscat_s( pstrDeviceStats, 256, pAdapterDesc->Description ); + } +} + + +//-------------------------------------------------------------------------------------- +// Misc functions +//-------------------------------------------------------------------------------------- +DXUTDeviceSettings WINAPI DXUTGetDeviceSettings() +{ + // Return a copy of device settings of the current device. If no device exists yet, then + // return a blank device settings struct + DXUTDeviceSettings* pDS = GetDXUTState().GetCurrentDeviceSettings(); + if( pDS ) + { + return *pDS; + } + else + { + DXUTDeviceSettings ds; + ZeroMemory( &ds, sizeof( DXUTDeviceSettings ) ); + return ds; + } +} + +D3DPRESENT_PARAMETERS WINAPI DXUTGetD3D9PresentParameters() +{ + // Return a copy of the present params of the current device. If no device exists yet, then + // return blank present params + DXUTDeviceSettings* pDS = GetDXUTState().GetCurrentDeviceSettings(); + if( pDS ) + { + return pDS->d3d9.pp; + } + else + { + D3DPRESENT_PARAMETERS pp; + ZeroMemory( &pp, sizeof( D3DPRESENT_PARAMETERS ) ); + return pp; + } +} + +bool WINAPI DXUTIsVsyncEnabled() +{ + DXUTDeviceSettings* pDS = GetDXUTState().GetCurrentDeviceSettings(); + if( pDS ) + { + if( DXUTIsD3D9( pDS ) ) + return ( pDS->d3d9.pp.PresentationInterval == D3DPRESENT_INTERVAL_IMMEDIATE ); + else + return ( pDS->d3d11.SyncInterval == 0 ); + } + else + { + return true; + } +}; + +HRESULT WINAPI DXUTGetD3D9DeviceCaps( DXUTDeviceSettings* pDeviceSettings, D3DCAPS9* pCaps ) +{ + IDirect3D9* pD3D = DXUTGetD3D9Object(); + return pD3D->GetDeviceCaps( pDeviceSettings->d3d9.AdapterOrdinal, pDeviceSettings->d3d9.DeviceType, pCaps ); +} + + +bool WINAPI DXUTIsKeyDown( BYTE vKey ) +{ + bool* bKeys = GetDXUTState().GetKeys(); + if( vKey >= 0xA0 && vKey <= 0xA5 ) // VK_LSHIFT, VK_RSHIFT, VK_LCONTROL, VK_RCONTROL, VK_LMENU, VK_RMENU + return GetAsyncKeyState( vKey ) != 0; // these keys only are tracked via GetAsyncKeyState() + else if( vKey >= 0x01 && vKey <= 0x06 && vKey != 0x03 ) // mouse buttons (VK_*BUTTON) + return DXUTIsMouseButtonDown( vKey ); + else + return bKeys[vKey]; +} + +bool WINAPI DXUTWasKeyPressed( BYTE vKey ) +{ + bool* bLastKeys = GetDXUTState().GetLastKeys(); + bool* bKeys = GetDXUTState().GetKeys(); + GetDXUTState().SetAppCalledWasKeyPressed( true ); + return ( !bLastKeys[vKey] && bKeys[vKey] ); +} + +bool WINAPI DXUTIsMouseButtonDown( BYTE vButton ) +{ + bool* bMouseButtons = GetDXUTState().GetMouseButtons(); + int nIndex = DXUTMapButtonToArrayIndex( vButton ); + return bMouseButtons[nIndex]; +} + +void WINAPI DXUTSetMultimonSettings( bool bAutoChangeAdapter ) +{ + GetDXUTState().SetAutoChangeAdapter( bAutoChangeAdapter ); +} + +void WINAPI DXUTSetHotkeyHandling( bool bAltEnterToToggleFullscreen, bool bEscapeToQuit, bool bPauseToToggleTimePause ) +{ + GetDXUTState().SetHandleEscape( bEscapeToQuit ); + GetDXUTState().SetHandleAltEnter( bAltEnterToToggleFullscreen ); + GetDXUTState().SetHandlePause( bPauseToToggleTimePause ); +} + +void WINAPI DXUTSetCursorSettings( bool bShowCursorWhenFullScreen, bool bClipCursorWhenFullScreen ) +{ + GetDXUTState().SetClipCursorWhenFullScreen( bClipCursorWhenFullScreen ); + GetDXUTState().SetShowCursorWhenFullScreen( bShowCursorWhenFullScreen ); + DXUTSetupCursor(); +} + +void WINAPI DXUTSetWindowSettings( bool bCallDefWindowProc ) +{ + GetDXUTState().SetCallDefWindowProc( bCallDefWindowProc ); +} + +void WINAPI DXUTSetConstantFrameTime( bool bEnabled, float fTimePerFrame ) +{ + if( GetDXUTState().GetOverrideConstantFrameTime() ) + { + bEnabled = GetDXUTState().GetOverrideConstantFrameTime(); + fTimePerFrame = GetDXUTState().GetOverrideConstantTimePerFrame(); + } + GetDXUTState().SetConstantFrameTime( bEnabled ); + GetDXUTState().SetTimePerFrame( fTimePerFrame ); +} + + +//-------------------------------------------------------------------------------------- +// Resets the state associated with DXUT +//-------------------------------------------------------------------------------------- +void WINAPI DXUTResetFrameworkState() +{ + GetDXUTState().Destroy(); + GetDXUTState().Create(); +} + + +//-------------------------------------------------------------------------------------- +// Closes down the window. When the window closes, it will cleanup everything +//-------------------------------------------------------------------------------------- +void WINAPI DXUTShutdown( int nExitCode ) +{ + HWND hWnd = DXUTGetHWND(); + if( hWnd != NULL ) + SendMessage( hWnd, WM_CLOSE, 0, 0 ); + + GetDXUTState().SetExitCode( nExitCode ); + + DXUTCleanup3DEnvironment( true ); + + // Restore shortcut keys (Windows key, accessibility shortcuts) to original state + // This is important to call here if the shortcuts are disabled, + // because accessibility setting changes are permanent. + // This means that if this is not done then the accessibility settings + // might not be the same as when the app was started. + // If the app crashes without restoring the settings, this is also true so it + // would be wise to backup/restore the settings from a file so they can be + // restored when the crashed app is run again. + DXUTAllowShortcutKeys( true ); + + // Shutdown D3D9 + IDirect3D9* pD3D = GetDXUTState().GetD3D9(); + SAFE_RELEASE( pD3D ); + GetDXUTState().SetD3D9( NULL ); + + // Shutdown D3D11 + IDXGIFactory1* pDXGIFactory = GetDXUTState().GetDXGIFactory(); + SAFE_RELEASE( pDXGIFactory ); + GetDXUTState().SetDXGIFactory( NULL ); + + if( GetDXUTState().GetOverrideRelaunchMCE() ) + DXUTReLaunchMediaCenter(); +} + +//-------------------------------------------------------------------------------------- +// Tells DXUT whether to operate in gamma correct mode +//-------------------------------------------------------------------------------------- +void WINAPI DXUTSetIsInGammaCorrectMode( bool bGammaCorrect ) +{ + GetDXUTState().SetIsInGammaCorrectMode( bGammaCorrect ); +} + + +void DXUTApplyDefaultDeviceSettings(DXUTDeviceSettings *modifySettings) { + ZeroMemory( modifySettings, sizeof( DXUTDeviceSettings ) ); + + + modifySettings->ver = DXUT_D3D11_DEVICE; + modifySettings->d3d11.AdapterOrdinal = 0; + modifySettings->d3d11.AutoCreateDepthStencil = true; + modifySettings->d3d11.AutoDepthStencilFormat = DXGI_FORMAT_D24_UNORM_S8_UINT; +#if defined(DEBUG) || defined(_DEBUG) + modifySettings->d3d11.CreateFlags |= D3D10_CREATE_DEVICE_DEBUG; +#else + modifySettings->d3d11.CreateFlags = 0; +#endif + modifySettings->d3d11.DriverType = D3D_DRIVER_TYPE_HARDWARE; + modifySettings->d3d11.Output = 0; + modifySettings->d3d11.PresentFlags = 0; + modifySettings->d3d11.sd.BufferCount = 2; + modifySettings->d3d11.sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM_SRGB; + modifySettings->d3d11.sd.BufferDesc.Height = 480; + modifySettings->d3d11.sd.BufferDesc.RefreshRate.Numerator = 60; + modifySettings->d3d11.sd.BufferDesc.RefreshRate.Denominator = 1; + modifySettings->d3d11.sd.BufferDesc.Scaling = DXGI_MODE_SCALING_UNSPECIFIED; + modifySettings->d3d11.sd.BufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED; + modifySettings->d3d11.sd.BufferDesc.Width = 640; + modifySettings->d3d11.sd.BufferUsage = 32; + modifySettings->d3d11.sd.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH ; + modifySettings->d3d11.sd.OutputWindow = DXUTGetHWND(); + modifySettings->d3d11.sd.SampleDesc.Count = 1; + modifySettings->d3d11.sd.SampleDesc.Quality = 0; + modifySettings->d3d11.sd.SwapEffect = DXGI_SWAP_EFFECT_DISCARD; + modifySettings->d3d11.sd.Windowed = 1; + modifySettings->d3d11.SyncInterval = 0; + + modifySettings->d3d9.AdapterFormat = D3DFMT_X8R8G8B8; + modifySettings->d3d9.AdapterOrdinal = 0; + modifySettings->d3d9.BehaviorFlags = D3DCREATE_HARDWARE_VERTEXPROCESSING; + modifySettings->d3d9.DeviceType = D3DDEVTYPE_HAL; + modifySettings->d3d9.pp.AutoDepthStencilFormat = D3DFMT_D24X8; + modifySettings->d3d9.pp.BackBufferCount = 1; + modifySettings->d3d9.pp.BackBufferFormat = D3DFMT_X8R8G8B8; + modifySettings->d3d9.pp.BackBufferHeight = 480; + modifySettings->d3d9.pp.BackBufferWidth = 640; + modifySettings->d3d9.pp.EnableAutoDepthStencil = 1; + modifySettings->d3d9.pp.Flags = 2; + modifySettings->d3d9.pp.FullScreen_RefreshRateInHz = 0; + modifySettings->d3d9.pp.hDeviceWindow = DXUTGetHWND(); + modifySettings->d3d9.pp.MultiSampleQuality = 0; + modifySettings->d3d9.pp.MultiSampleType = D3DMULTISAMPLE_NONE; + modifySettings->d3d9.pp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; + modifySettings->d3d9.pp.SwapEffect = D3DSWAPEFFECT_DISCARD; + modifySettings->d3d9.pp.Windowed = 1; +} + + + +//-------------------------------------------------------------------------------------- +// Update settings based on what is enumeratabled +//-------------------------------------------------------------------------------------- +HRESULT DXUTSnapDeviceSettingsToEnumDevice( DXUTDeviceSettings* pDeviceSettings, bool forceEnum, D3D_FEATURE_LEVEL forceFL ) { + bool bAppSupportsD3D9 = DXUTDoesAppSupportD3D9(); + bool bAppSupportsD3D11 = DXUTDoesAppSupportD3D11(); + + if( GetSystemMetrics(0x1000) != 0 ) {// SM_REMOTESESSION + pDeviceSettings->d3d11.sd.Windowed = 1; + pDeviceSettings->d3d9.pp.Windowed = 1; + } + int bestModeIndex=0; + int bestMSAAIndex=0; + + + //DXUTSetDefaultDeviceSettings + if (bAppSupportsD3D11 && pDeviceSettings->ver == DXUT_D3D11_DEVICE ) { + CD3D11Enumeration *pEnum = NULL; + + + pEnum = DXUTGetD3D11Enumeration( forceEnum, false, forceFL); + + CD3D11EnumAdapterInfo* pAdapterInfo = NULL; + CGrowableArray * pAdapterList = pEnum->GetAdapterInfoList(); + CD3D11EnumAdapterInfo* tempAdapterInfo = pAdapterList->GetAt( 0 ); + for( int iAdapter = 0; iAdapter < pAdapterList->GetSize(); iAdapter++ ) + { + tempAdapterInfo = pAdapterList->GetAt( iAdapter ); + if (tempAdapterInfo->AdapterOrdinal == pDeviceSettings->d3d11.AdapterOrdinal) pAdapterInfo = tempAdapterInfo; + } + if (pAdapterInfo == NULL) return E_FAIL; // no adapters found. + CD3D11EnumDeviceSettingsCombo* pDeviceSettingsCombo = NULL; + float biggestScore = 0; + + int combo = 0; + for( int iDeviceCombo = 0; iDeviceCombo < pAdapterInfo->deviceSettingsComboList.GetSize(); iDeviceCombo++ ) + { + CD3D11EnumDeviceSettingsCombo* tempDeviceSettingsCombo = pAdapterInfo->deviceSettingsComboList.GetAt( iDeviceCombo ); + + DXGI_MODE_DESC adapterDisplayMode; + DXUTGetD3D11AdapterDisplayMode( pAdapterInfo->AdapterOrdinal, 0, &adapterDisplayMode ); + + int bestMode; + int bestMSAA; + float score = DXUTRankD3D11DeviceCombo(tempDeviceSettingsCombo, &(pDeviceSettings->d3d11), &adapterDisplayMode, bestMode, bestMSAA ); + if (score > biggestScore) { + combo = iDeviceCombo; + biggestScore = score; + pDeviceSettingsCombo = tempDeviceSettingsCombo; + bestModeIndex = bestMode; + bestMSAAIndex = bestMSAA; + } + + } + if (NULL == pDeviceSettingsCombo ) { + return E_FAIL; // no settigns found. + } + + pDeviceSettings->d3d11.AdapterOrdinal = pDeviceSettingsCombo->AdapterOrdinal; + pDeviceSettings->d3d11.DriverType = pDeviceSettingsCombo->DeviceType; + pDeviceSettings->d3d11.Output = pDeviceSettingsCombo->Output; + + pDeviceSettings->d3d11.sd.Windowed = pDeviceSettingsCombo->Windowed; + if( GetSystemMetrics(0x1000) != 0 ) {// SM_REMOTESESSION + pDeviceSettings->d3d11.sd.Windowed = 1; + } + if (pDeviceSettingsCombo->pOutputInfo != NULL) { + DXGI_MODE_DESC bestDisplayMode; + bestDisplayMode = pDeviceSettingsCombo->pOutputInfo->displayModeList.GetAt(bestModeIndex); + if (!pDeviceSettingsCombo->Windowed) { + + pDeviceSettings->d3d11.sd.BufferDesc.Height = bestDisplayMode.Height; + pDeviceSettings->d3d11.sd.BufferDesc.Width = bestDisplayMode.Width; + pDeviceSettings->d3d11.sd.BufferDesc.RefreshRate.Numerator = bestDisplayMode.RefreshRate.Numerator; + pDeviceSettings->d3d11.sd.BufferDesc.RefreshRate.Denominator = bestDisplayMode.RefreshRate.Denominator; + pDeviceSettings->d3d11.sd.BufferDesc.Scaling = bestDisplayMode.Scaling; + pDeviceSettings->d3d11.sd.BufferDesc.ScanlineOrdering = bestDisplayMode.ScanlineOrdering; + } + } + if (pDeviceSettings->d3d11.DeviceFeatureLevel == 0) + pDeviceSettings->d3d11.DeviceFeatureLevel = pDeviceSettingsCombo->pDeviceInfo->SelectedLevel; + + + + + pDeviceSettings->d3d11.sd.SampleDesc.Count = pDeviceSettingsCombo->multiSampleCountList.GetAt(bestMSAAIndex); + if (pDeviceSettings->d3d11.sd.SampleDesc.Quality > pDeviceSettingsCombo->multiSampleQualityList.GetAt(bestMSAAIndex) - 1) + pDeviceSettings->d3d11.sd.SampleDesc.Quality = pDeviceSettingsCombo->multiSampleQualityList.GetAt(bestMSAAIndex) - 1; + + pDeviceSettings->d3d11.sd.BufferDesc.Format = pDeviceSettingsCombo->BackBufferFormat; + + return S_OK; + } + // didn't find a D3D11 adapter. + if (bAppSupportsD3D9) { + // Find the best combination of: + // Adapter Ordinal + // Device Type + // Adapter Format + // Back Buffer Format + // Windowed + // given what's available on the system and the match options combined with the device settings input. + // This combination of settings is encapsulated by the CD3D9EnumDeviceSettingsCombo class. + float fBestRanking = -1.0f; + CD3D9EnumDeviceSettingsCombo* pBestDeviceSettingsCombo = NULL; + D3DDISPLAYMODE adapterDesktopDisplayMode; + + IDirect3D9* pD3D = DXUTGetD3D9Object(); + CD3D9Enumeration* pd3dEnum = DXUTGetD3D9Enumeration( forceEnum ); + CGrowableArray * pAdapterList = pd3dEnum->GetAdapterInfoList(); + for( int iAdapter = 0; iAdapter < pAdapterList->GetSize(); iAdapter++ ) + { + CD3D9EnumAdapterInfo* pAdapterInfo = pAdapterList->GetAt( iAdapter ); + + // Get the desktop display mode of adapter + pD3D->GetAdapterDisplayMode( pAdapterInfo->AdapterOrdinal, &adapterDesktopDisplayMode ); + + // Enum all the device types supported by this adapter to find the best device settings + for( int iDeviceInfo = 0; iDeviceInfo < pAdapterInfo->deviceInfoList.GetSize(); iDeviceInfo++ ) + { + CD3D9EnumDeviceInfo* pDeviceInfo = pAdapterInfo->deviceInfoList.GetAt( iDeviceInfo ); + + // Enum all the device settings combinations. A device settings combination is + // a unique set of an adapter format, back buffer format, and IsWindowed. + for( int iDeviceCombo = 0; iDeviceCombo < pDeviceInfo->deviceSettingsComboList.GetSize(); iDeviceCombo++ ) + { + CD3D9EnumDeviceSettingsCombo* pDeviceSettingsCombo = pDeviceInfo->deviceSettingsComboList.GetAt( + iDeviceCombo ); + + // If windowed mode the adapter format has to be the same as the desktop + // display mode format so skip any that don't match + if( pDeviceSettingsCombo->Windowed && + ( pDeviceSettingsCombo->AdapterFormat != adapterDesktopDisplayMode.Format ) ) + continue; + + // Skip any combo that doesn't meet the preserve match options + int bestMode; + int bestMSAA; + + // Get a ranking number that describes how closely this device combo matches the optimal combo + float fCurRanking = DXUTRankD3D9DeviceCombo( pDeviceSettingsCombo, + &(pDeviceSettings->d3d9), &adapterDesktopDisplayMode, bestMode, bestMSAA ); + + // If this combo better matches the input device settings then save it + if( fCurRanking > fBestRanking ) + { + pBestDeviceSettingsCombo = pDeviceSettingsCombo; + fBestRanking = fCurRanking; + bestModeIndex = bestMode; + bestMSAAIndex = bestMSAA; + } + } + } + } + + // If no best device combination was found then fail + if( pBestDeviceSettingsCombo == NULL ) + return DXUTERR_NOCOMPATIBLEDEVICES; + + // Using the best device settings combo found, build valid device settings taking heed of + // the match options and the input device settings + pDeviceSettings->d3d9.AdapterFormat = pBestDeviceSettingsCombo->AdapterFormat;//D3DFMT_X8R8G8B8; + pDeviceSettings->d3d9.AdapterOrdinal = pBestDeviceSettingsCombo->AdapterOrdinal ;//0; + pDeviceSettings->d3d9.DeviceType = pBestDeviceSettingsCombo->DeviceType; + pDeviceSettings->d3d9.pp.BackBufferFormat = pBestDeviceSettingsCombo->BackBufferFormat;//D3DFMT_X8R8G8B8; + if( GetSystemMetrics(0x1000) != 0 ) {// SM_REMOTESESSION + pDeviceSettings->d3d9.pp.Windowed = 1; + } + if (!pBestDeviceSettingsCombo->Windowed) { + D3DDISPLAYMODE displayMode = pBestDeviceSettingsCombo->pAdapterInfo->displayModeList.GetAt( bestModeIndex ); + pDeviceSettings->d3d9.pp.BackBufferHeight = displayMode.Height; + pDeviceSettings->d3d9.pp.BackBufferWidth = displayMode.Width; + pDeviceSettings->d3d9.pp.FullScreen_RefreshRateInHz = displayMode.RefreshRate; + } + pDeviceSettings->d3d9.pp.hDeviceWindow = pBestDeviceSettingsCombo->Windowed ? DXUTGetHWNDDeviceWindowed() : DXUTGetHWNDDeviceFullScreen(); + if (pDeviceSettings->d3d9.pp.MultiSampleQuality > pBestDeviceSettingsCombo->multiSampleQualityList.GetAt(bestMSAAIndex) - 1) + pDeviceSettings->d3d9.pp.MultiSampleQuality = pBestDeviceSettingsCombo->multiSampleQualityList.GetAt( bestMSAAIndex )-1; + + pDeviceSettings->d3d9.pp.MultiSampleType = pBestDeviceSettingsCombo->multiSampleTypeList.GetAt( bestMSAAIndex );; + pDeviceSettings->d3d9.pp.Windowed = pBestDeviceSettingsCombo->Windowed; + return S_OK; + } + return E_FAIL; +} diff --git a/Demos/DX11ClothDemo/DXUT/Core/DXUT.h b/Demos/DX11ClothDemo/DXUT/Core/DXUT.h new file mode 100644 index 000000000..2d52b8d76 --- /dev/null +++ b/Demos/DX11ClothDemo/DXUT/Core/DXUT.h @@ -0,0 +1,378 @@ +//-------------------------------------------------------------------------------------- +// File: DXUT.h +// +// Copyright (c) Microsoft Corporation. All rights reserved. +//-------------------------------------------------------------------------------------- +#pragma once +#ifndef DXUT_H +#define DXUT_H + +#ifndef UNICODE +#error "DXUT requires a Unicode build. See the nearby comments for details" +// +// If you are using Microsoft Visual C++ .NET, under the General tab of the project +// properties change the Character Set to 'Use Unicode Character Set'. +// +// Windows XP and later are native Unicode so Unicode applications will perform better. +// For Windows 98 and Windows Me support, consider using the Microsoft Layer for Unicode (MSLU). +// +// To use MSLU, link against a set of libraries similar to this +// /nod:kernel32.lib /nod:advapi32.lib /nod:user32.lib /nod:gdi32.lib /nod:shell32.lib /nod:comdlg32.lib /nod:version.lib /nod:mpr.lib /nod:rasapi32.lib /nod:winmm.lib /nod:winspool.lib /nod:vfw32.lib /nod:secur32.lib /nod:oleacc.lib /nod:oledlg.lib /nod:sensapi.lib UnicoWS.lib kernel32.lib advapi32.lib user32.lib gdi32.lib shell32.lib comdlg32.lib version.lib mpr.lib rasapi32.lib winmm.lib winspool.lib vfw32.lib secur32.lib oleacc.lib oledlg.lib sensapi.lib dxerr.lib dxguid.lib d3dx9d.lib d3d9.lib comctl32.lib +// and put the unicows.dll (available for download from msdn.microsoft.com) in the exe's folder. +// +// For more details see the MSDN article titled: +// "MSLU: Develop Unicode Applications for Windows 9x Platforms with the Microsoft Layer for Unicode" +// at http://msdn.microsoft.com/msdnmag/issues/01/10/MSLU/default.aspx +// +#endif + +#include "dxsdkver.h" +#if ( _DXSDK_PRODUCT_MAJOR < 9 || _DXSDK_BUILD_MAJOR < 1455 ) +#error The installed DXSDK is out of date. +#endif + +#ifndef STRICT +#define STRICT +#endif + +// If app hasn't choosen, set to work with Windows 98, Windows Me, Windows 2000, Windows XP and beyond +#ifndef WINVER +#define WINVER 0x0500 +#endif +#ifndef _WIN32_WINDOWS +#define _WIN32_WINDOWS 0x0500 +#endif +#ifndef _WIN32_WINNT +#define _WIN32_WINNT 0x0600 +#endif + +// #define DXUT_AUTOLIB to automatically include the libs needed for DXUT +#ifdef DXUT_AUTOLIB +#pragma comment( lib, "dxerr.lib" ) +#pragma comment( lib, "dxguid.lib" ) +#pragma comment( lib, "d3d9.lib" ) +#if defined(DEBUG) || defined(_DEBUG) +#pragma comment( lib, "d3dx9d.lib" ) +#else +#pragma comment( lib, "d3dx9.lib" ) +#endif +#pragma comment( lib, "winmm.lib" ) +#pragma comment( lib, "comctl32.lib" ) +#endif + +#pragma warning( disable : 4100 ) // disable unreference formal parameter warnings for /W4 builds + +// Enable extra D3D debugging in debug builds if using the debug DirectX runtime. +// This makes D3D objects work well in the debugger watch window, but slows down +// performance slightly. +#if defined(DEBUG) || defined(_DEBUG) +#ifndef D3D_DEBUG_INFO +#define D3D_DEBUG_INFO +#endif +#endif + +// Standard Windows includes +#include +#include +#include +#include +#include +#include // for InitCommonControls() +#include // for ExtractIcon() +#include // for placement new +#include +#include +#include +#include + +// CRT's memory leak detection +#if defined(DEBUG) || defined(_DEBUG) +#include +#endif + +// Direct3D9 includes +#include +#include + + +// Direct3D11 includes +#include +#include +#include +#include + +// XInput includes +#include + +// HRESULT translation for Direct3D10 and other APIs +#include + + +#if defined(DEBUG) || defined(_DEBUG) +#ifndef V +#define V(x) { hr = (x); if( FAILED(hr) ) { DXUTTrace( __FILE__, (DWORD)__LINE__, hr, L#x, true ); } } +#endif +#ifndef V_RETURN +#define V_RETURN(x) { hr = (x); if( FAILED(hr) ) { return DXUTTrace( __FILE__, (DWORD)__LINE__, hr, L#x, true ); } } +#endif +#else +#ifndef V +#define V(x) { hr = (x); } +#endif +#ifndef V_RETURN +#define V_RETURN(x) { hr = (x); if( FAILED(hr) ) { return hr; } } +#endif +#endif + +#ifndef SAFE_DELETE +#define SAFE_DELETE(p) { if (p) { delete (p); (p)=NULL; } } +#endif +#ifndef SAFE_DELETE_ARRAY +#define SAFE_DELETE_ARRAY(p) { if (p) { delete[] (p); (p)=NULL; } } +#endif +#ifndef SAFE_RELEASE +#define SAFE_RELEASE(p) { if (p) { (p)->Release(); (p)=NULL; } } +#endif + + + +//-------------------------------------------------------------------------------------- +// Structs +//-------------------------------------------------------------------------------------- +struct DXUTD3D9DeviceSettings +{ + UINT AdapterOrdinal; + D3DDEVTYPE DeviceType; + D3DFORMAT AdapterFormat; + DWORD BehaviorFlags; + D3DPRESENT_PARAMETERS pp; +}; + +struct DXUTD3D11DeviceSettings +{ + UINT AdapterOrdinal; + D3D_DRIVER_TYPE DriverType; + UINT Output; + DXGI_SWAP_CHAIN_DESC sd; + UINT32 CreateFlags; + UINT32 SyncInterval; + DWORD PresentFlags; + bool AutoCreateDepthStencil; // DXUT will create the depth stencil resource and view if true + DXGI_FORMAT AutoDepthStencilFormat; + D3D_FEATURE_LEVEL DeviceFeatureLevel; +}; + +enum DXUTDeviceVersion +{ + DXUT_D3D9_DEVICE, + DXUT_D3D11_DEVICE +}; + +struct DXUTDeviceSettings +{ + DXUTDeviceVersion ver; + D3D_FEATURE_LEVEL MinimumFeatureLevel; + DXUTD3D9DeviceSettings d3d9; // only valid if ver == DXUT_D3D9_DEVICE + DXUTD3D11DeviceSettings d3d11; // only valid if ver == DXUT_D3D11_DEVICE +}; + + +//-------------------------------------------------------------------------------------- +// Error codes +//-------------------------------------------------------------------------------------- +#define DXUTERR_NODIRECT3D MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0x0901) +#define DXUTERR_NOCOMPATIBLEDEVICES MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0x0902) +#define DXUTERR_MEDIANOTFOUND MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0x0903) +#define DXUTERR_NONZEROREFCOUNT MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0x0904) +#define DXUTERR_CREATINGDEVICE MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0x0905) +#define DXUTERR_RESETTINGDEVICE MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0x0906) +#define DXUTERR_CREATINGDEVICEOBJECTS MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0x0907) +#define DXUTERR_RESETTINGDEVICEOBJECTS MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0x0908) +#define DXUTERR_DEVICEREMOVED MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0x090A) +#define DXUTERR_NODIRECT3D11 MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0x090) + +//-------------------------------------------------------------------------------------- +// Callback registration +//-------------------------------------------------------------------------------------- + +// General callbacks +typedef void (CALLBACK *LPDXUTCALLBACKFRAMEMOVE)( double fTime, float fElapsedTime, void* pUserContext ); +typedef void (CALLBACK *LPDXUTCALLBACKKEYBOARD)( UINT nChar, bool bKeyDown, bool bAltDown, void* pUserContext ); +typedef void (CALLBACK *LPDXUTCALLBACKMOUSE)( bool bLeftButtonDown, bool bRightButtonDown, bool bMiddleButtonDown, bool bSideButton1Down, bool bSideButton2Down, int nMouseWheelDelta, int xPos, int yPos, void* pUserContext ); +typedef LRESULT (CALLBACK *LPDXUTCALLBACKMSGPROC)( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, bool* pbNoFurtherProcessing, void* pUserContext ); +typedef void (CALLBACK *LPDXUTCALLBACKTIMER)( UINT idEvent, void* pUserContext ); +typedef bool (CALLBACK *LPDXUTCALLBACKMODIFYDEVICESETTINGS)( DXUTDeviceSettings* pDeviceSettings, void* pUserContext ); +typedef bool (CALLBACK *LPDXUTCALLBACKDEVICEREMOVED)( void* pUserContext ); + +// Direct3D 9 callbacks +typedef bool (CALLBACK *LPDXUTCALLBACKISD3D9DEVICEACCEPTABLE)( D3DCAPS9* pCaps, D3DFORMAT AdapterFormat, D3DFORMAT BackBufferFormat, bool bWindowed, void* pUserContext ); +typedef HRESULT (CALLBACK *LPDXUTCALLBACKD3D9DEVICECREATED)( IDirect3DDevice9* pd3dDevice, const D3DSURFACE_DESC* pBackBufferSurfaceDesc, void* pUserContext ); +typedef HRESULT (CALLBACK *LPDXUTCALLBACKD3D9DEVICERESET)( IDirect3DDevice9* pd3dDevice, const D3DSURFACE_DESC* pBackBufferSurfaceDesc, void* pUserContext ); +typedef void (CALLBACK *LPDXUTCALLBACKD3D9FRAMERENDER)( IDirect3DDevice9* pd3dDevice, double fTime, float fElapsedTime, void* pUserContext ); +typedef void (CALLBACK *LPDXUTCALLBACKD3D9DEVICELOST)( void* pUserContext ); +typedef void (CALLBACK *LPDXUTCALLBACKD3D9DEVICEDESTROYED)( void* pUserContext ); + +class CD3D11EnumAdapterInfo; +class CD3D11EnumDeviceInfo; +// Direct3D 11 callbacks +typedef bool (CALLBACK *LPDXUTCALLBACKISD3D11DEVICEACCEPTABLE)( const CD3D11EnumAdapterInfo *AdapterInfo, UINT Output, const CD3D11EnumDeviceInfo *DeviceInfo, DXGI_FORMAT BackBufferFormat, bool bWindowed, void* pUserContext ); +typedef HRESULT (CALLBACK *LPDXUTCALLBACKD3D11DEVICECREATED)( ID3D11Device* pd3dDevice, const DXGI_SURFACE_DESC* pBackBufferSurfaceDesc, void* pUserContext ); +typedef HRESULT (CALLBACK *LPDXUTCALLBACKD3D11SWAPCHAINRESIZED)( ID3D11Device* pd3dDevice, IDXGISwapChain *pSwapChain, const DXGI_SURFACE_DESC* pBackBufferSurfaceDesc, void* pUserContext ); +typedef void (CALLBACK *LPDXUTCALLBACKD3D11FRAMERENDER)( ID3D11Device* pd3dDevice, ID3D11DeviceContext* pd3dImmediateContext, double fTime, float fElapsedTime, void* pUserContext ); +typedef void (CALLBACK *LPDXUTCALLBACKD3D11SWAPCHAINRELEASING)( void* pUserContext ); +typedef void (CALLBACK *LPDXUTCALLBACKD3D11DEVICEDESTROYED)( void* pUserContext ); + +// General callbacks +void WINAPI DXUTSetCallbackFrameMove( LPDXUTCALLBACKFRAMEMOVE pCallback, void* pUserContext = NULL ); +void WINAPI DXUTSetCallbackKeyboard( LPDXUTCALLBACKKEYBOARD pCallback, void* pUserContext = NULL ); +void WINAPI DXUTSetCallbackMouse( LPDXUTCALLBACKMOUSE pCallback, bool bIncludeMouseMove = false, void* pUserContext = NULL ); +void WINAPI DXUTSetCallbackMsgProc( LPDXUTCALLBACKMSGPROC pCallback, void* pUserContext = NULL ); +void WINAPI DXUTSetCallbackDeviceChanging( LPDXUTCALLBACKMODIFYDEVICESETTINGS pCallback, void* pUserContext = NULL ); +void WINAPI DXUTSetCallbackDeviceRemoved( LPDXUTCALLBACKDEVICEREMOVED pCallback, void* pUserContext = NULL ); + +// Direct3D 9 callbacks +void WINAPI DXUTSetCallbackD3D9DeviceAcceptable( LPDXUTCALLBACKISD3D9DEVICEACCEPTABLE pCallback, void* pUserContext = NULL ); +void WINAPI DXUTSetCallbackD3D9DeviceCreated( LPDXUTCALLBACKD3D9DEVICECREATED pCallback, void* pUserContext = NULL ); +void WINAPI DXUTSetCallbackD3D9DeviceReset( LPDXUTCALLBACKD3D9DEVICERESET pCallback, void* pUserContext = NULL ); +void WINAPI DXUTSetCallbackD3D9FrameRender( LPDXUTCALLBACKD3D9FRAMERENDER pCallback, void* pUserContext = NULL ); +void WINAPI DXUTSetCallbackD3D9DeviceLost( LPDXUTCALLBACKD3D9DEVICELOST pCallback, void* pUserContext = NULL ); +void WINAPI DXUTSetCallbackD3D9DeviceDestroyed( LPDXUTCALLBACKD3D9DEVICEDESTROYED pCallback, void* pUserContext = NULL ); + +// Direct3D 11 callbacks +void WINAPI DXUTSetCallbackD3D11DeviceAcceptable( LPDXUTCALLBACKISD3D11DEVICEACCEPTABLE pCallback, void* pUserContext = NULL ); +void WINAPI DXUTSetCallbackD3D11DeviceCreated( LPDXUTCALLBACKD3D11DEVICECREATED pCallback, void* pUserContext = NULL ); +void WINAPI DXUTSetCallbackD3D11SwapChainResized( LPDXUTCALLBACKD3D11SWAPCHAINRESIZED pCallback, void* pUserContext = NULL ); +void WINAPI DXUTSetCallbackD3D11FrameRender( LPDXUTCALLBACKD3D11FRAMERENDER pCallback, void* pUserContext = NULL ); +void WINAPI DXUTSetCallbackD3D11SwapChainReleasing( LPDXUTCALLBACKD3D11SWAPCHAINRELEASING pCallback, void* pUserContext = NULL ); +void WINAPI DXUTSetCallbackD3D11DeviceDestroyed( LPDXUTCALLBACKD3D11DEVICEDESTROYED pCallback, void* pUserContext = NULL ); + + +//-------------------------------------------------------------------------------------- +// Initialization +//-------------------------------------------------------------------------------------- +HRESULT WINAPI DXUTInit( bool bParseCommandLine = true, + bool bShowMsgBoxOnError = true, + __in_opt WCHAR* strExtraCommandLineParams = NULL, + bool bThreadSafeDXUT = false ); + +// Choose either DXUTCreateWindow or DXUTSetWindow. If using DXUTSetWindow, consider using DXUTStaticWndProc +HRESULT WINAPI DXUTCreateWindow( const WCHAR* strWindowTitle = L"Direct3D Window", + HINSTANCE hInstance = NULL, HICON hIcon = NULL, HMENU hMenu = NULL, + int x = CW_USEDEFAULT, int y = CW_USEDEFAULT ); +HRESULT WINAPI DXUTSetWindow( HWND hWndFocus, HWND hWndDeviceFullScreen, HWND hWndDeviceWindowed, bool bHandleMessages = true ); +LRESULT CALLBACK DXUTStaticWndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ); + +// Choose either DXUTCreateDevice or DXUTSetD3D*Device or DXUTCreateD3DDeviceFromSettings + +HRESULT WINAPI DXUTCreateDevice(D3D_FEATURE_LEVEL reqFL, bool bWindowed= true, int nSuggestedWidth =0, int nSuggestedHeight =0 ); +HRESULT WINAPI DXUTCreateDeviceFromSettings( DXUTDeviceSettings* pDeviceSettings, bool bPreserveInput = false, bool bClipWindowToSingleAdapter = true ); +HRESULT WINAPI DXUTSetD3D9Device( IDirect3DDevice9* pd3dDevice ); +HRESULT WINAPI DXUTSetD3D11Device( ID3D11Device* pd3dDevice, IDXGISwapChain* pSwapChain ); + +// Choose either DXUTMainLoop or implement your own main loop +HRESULT WINAPI DXUTMainLoop( HACCEL hAccel = NULL ); + +// If not using DXUTMainLoop consider using DXUTRender3DEnvironment +void WINAPI DXUTRender3DEnvironment(); + + +//-------------------------------------------------------------------------------------- +// Common Tasks +//-------------------------------------------------------------------------------------- +HRESULT WINAPI DXUTToggleFullScreen(); +HRESULT WINAPI DXUTToggleREF(); +HRESULT WINAPI DXUTToggleWARP(); +void WINAPI DXUTPause( bool bPauseTime, bool bPauseRendering ); +void WINAPI DXUTSetConstantFrameTime( bool bConstantFrameTime, float fTimePerFrame = 0.0333f ); +void WINAPI DXUTSetCursorSettings( bool bShowCursorWhenFullScreen = false, bool bClipCursorWhenFullScreen = false ); +void WINAPI DXUTSetD3DVersionSupport( bool bAppCanUseD3D9 = true, bool bAppCanUseD3D11 = true ); +void WINAPI DXUTSetHotkeyHandling( bool bAltEnterToToggleFullscreen = true, bool bEscapeToQuit = true, bool bPauseToToggleTimePause = true ); +void WINAPI DXUTSetMultimonSettings( bool bAutoChangeAdapter = true ); +void WINAPI DXUTSetShortcutKeySettings( bool bAllowWhenFullscreen = false, bool bAllowWhenWindowed = true ); // Controls the Windows key, and accessibility shortcut keys +void WINAPI DXUTSetWindowSettings( bool bCallDefWindowProc = true ); +HRESULT WINAPI DXUTSetTimer( LPDXUTCALLBACKTIMER pCallbackTimer, float fTimeoutInSecs = 1.0f, UINT* pnIDEvent = NULL, void* pCallbackUserContext = NULL ); +HRESULT WINAPI DXUTKillTimer( UINT nIDEvent ); +void WINAPI DXUTResetFrameworkState(); +void WINAPI DXUTShutdown( int nExitCode = 0 ); +void WINAPI DXUTSetIsInGammaCorrectMode( bool bGammaCorrect ); +BOOL WINAPI DXUTGetMSAASwapChainCreated(); + +//-------------------------------------------------------------------------------------- +// State Retrieval +//-------------------------------------------------------------------------------------- + +// Direct3D 9 +IDirect3D9* WINAPI DXUTGetD3D9Object(); // Does not addref unlike typical Get* APIs +IDirect3DDevice9* WINAPI DXUTGetD3D9Device(); // Does not addref unlike typical Get* APIs +D3DPRESENT_PARAMETERS WINAPI DXUTGetD3D9PresentParameters(); +const D3DSURFACE_DESC* WINAPI DXUTGetD3D9BackBufferSurfaceDesc(); +const D3DCAPS9* WINAPI DXUTGetD3D9DeviceCaps(); +HRESULT WINAPI DXUTGetD3D9DeviceCaps( DXUTDeviceSettings* pDeviceSettings, D3DCAPS9* pCaps ); +bool WINAPI DXUTDoesAppSupportD3D9(); +bool WINAPI DXUTIsAppRenderingWithD3D9(); + + +// Direct3D 11 +IDXGIFactory1* WINAPI DXUTGetDXGIFactory(); // Does not addref unlike typical Get* APIs +IDXGISwapChain* WINAPI DXUTGetDXGISwapChain(); // Does not addref unlike typical Get* APIs +const DXGI_SURFACE_DESC* WINAPI DXUTGetDXGIBackBufferSurfaceDesc(); +bool WINAPI DXUTIsD3D11Available(); // If D3D11 APIs are availible +ID3D11Device* WINAPI DXUTGetD3D11Device(); // Does not addref unlike typical Get* APIs +ID3D11DeviceContext* WINAPI DXUTGetD3D11DeviceContext(); // Does not addref unlike typical Get* APIs +HRESULT WINAPI DXUTSetupD3D11Views( ID3D11DeviceContext* pd3dDeviceContext ); // Supports immediate or deferred context +D3D_FEATURE_LEVEL WINAPI DXUTGetD3D11DeviceFeatureLevel(); // Returns the D3D11 devices current feature level +ID3D11RenderTargetView* WINAPI DXUTGetD3D11RenderTargetView(); // Does not addref unlike typical Get* APIs +ID3D11DepthStencilView* WINAPI DXUTGetD3D11DepthStencilView(); // Does not addref unlike typical Get* APIs +bool WINAPI DXUTDoesAppSupportD3D11(); +bool WINAPI DXUTIsAppRenderingWithD3D11(); + + +// General +DXUTDeviceSettings WINAPI DXUTGetDeviceSettings(); +HINSTANCE WINAPI DXUTGetHINSTANCE(); +HWND WINAPI DXUTGetHWND(); +HWND WINAPI DXUTGetHWNDFocus(); +HWND WINAPI DXUTGetHWNDDeviceFullScreen(); +HWND WINAPI DXUTGetHWNDDeviceWindowed(); +RECT WINAPI DXUTGetWindowClientRect(); +LONG WINAPI DXUTGetWindowWidth(); +LONG WINAPI DXUTGetWindowHeight(); +RECT WINAPI DXUTGetWindowClientRectAtModeChange(); // Useful for returning to windowed mode with the same resolution as before toggle to full screen mode +RECT WINAPI DXUTGetFullsceenClientRectAtModeChange(); // Useful for returning to full screen mode with the same resolution as before toggle to windowed mode +double WINAPI DXUTGetTime(); +float WINAPI DXUTGetElapsedTime(); +bool WINAPI DXUTIsWindowed(); +bool WINAPI DXUTIsInGammaCorrectMode(); +float WINAPI DXUTGetFPS(); +LPCWSTR WINAPI DXUTGetWindowTitle(); +LPCWSTR WINAPI DXUTGetFrameStats( bool bIncludeFPS = false ); +LPCWSTR WINAPI DXUTGetDeviceStats(); + +bool WINAPI DXUTIsVsyncEnabled(); +bool WINAPI DXUTIsRenderingPaused(); +bool WINAPI DXUTIsTimePaused(); +bool WINAPI DXUTIsActive(); +int WINAPI DXUTGetExitCode(); +bool WINAPI DXUTGetShowMsgBoxOnError(); +bool WINAPI DXUTGetAutomation(); // Returns true if -automation parameter is used to launch the app +bool WINAPI DXUTIsKeyDown( BYTE vKey ); // Pass a virtual-key code, ex. VK_F1, 'A', VK_RETURN, VK_LSHIFT, etc +bool WINAPI DXUTWasKeyPressed( BYTE vKey ); // Like DXUTIsKeyDown() but return true only if the key was just pressed +bool WINAPI DXUTIsMouseButtonDown( BYTE vButton ); // Pass a virtual-key code: VK_LBUTTON, VK_RBUTTON, VK_MBUTTON, VK_XBUTTON1, VK_XBUTTON2 +HRESULT WINAPI DXUTCreateState(); // Optional method to create DXUT's memory. If its not called by the application it will be automatically called when needed +void WINAPI DXUTDestroyState(); // Optional method to destroy DXUT's memory. If its not called by the application it will be automatically called after the application exits WinMain + +//-------------------------------------------------------------------------------------- +// DXUT core layer includes +//-------------------------------------------------------------------------------------- +#include "DXUTmisc.h" +#include "DXUTDevice9.h" +#include "DXUTDevice11.h" + + + + +#endif + + + + diff --git a/Demos/DX11ClothDemo/DXUT/Core/DXUTDevice11.cpp b/Demos/DX11ClothDemo/DXUT/Core/DXUTDevice11.cpp new file mode 100644 index 000000000..7eaff555d --- /dev/null +++ b/Demos/DX11ClothDemo/DXUT/Core/DXUTDevice11.cpp @@ -0,0 +1,1154 @@ +//-------------------------------------------------------------------------------------- +// File: DXUTDevice11.cpp +// +// Enumerates D3D adapters, devices, modes, etc. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +//-------------------------------------------------------------------------------------- +#include "DXUT.h" +#undef min // use __min instead +#undef max // use __max instead + +//-------------------------------------------------------------------------------------- +// Forward declarations +//-------------------------------------------------------------------------------------- +extern void DXUTGetCallbackD3D11DeviceAcceptable( LPDXUTCALLBACKISD3D11DEVICEACCEPTABLE* ppCallbackIsDeviceAcceptable, void** ppUserContext ); + +static int __cdecl SortModesCallback( const void* arg1, const void* arg2 ); + +CD3D11Enumeration* g_pDXUTD3D11Enumeration = NULL; + + + + +HRESULT WINAPI DXUTCreateD3D11Enumeration() +{ + if( g_pDXUTD3D11Enumeration == NULL ) + { + g_pDXUTD3D11Enumeration = new CD3D11Enumeration(); + if( NULL == g_pDXUTD3D11Enumeration ) + return E_OUTOFMEMORY; + } + return S_OK; +} + +void WINAPI DXUTDestroyD3D11Enumeration() +{ + SAFE_DELETE( g_pDXUTD3D11Enumeration ); +} + +class DXUTMemoryHelperD3D11Enum +{ +public: +DXUTMemoryHelperD3D11Enum() +{ + DXUTCreateD3D11Enumeration(); +} +~DXUTMemoryHelperD3D11Enum() +{ + DXUTDestroyD3D11Enumeration(); +} +}; + + +//-------------------------------------------------------------------------------------- +CD3D11Enumeration* WINAPI DXUTGetD3D11Enumeration( bool bForceEnumerate, bool bEnumerateAllAdapterFormats, D3D_FEATURE_LEVEL forceFL ) +{ + // Using an static class with accessor function to allow control of the construction order + static DXUTMemoryHelperD3D11Enum d3d11enumMemory; + if( g_pDXUTD3D11Enumeration && ( !g_pDXUTD3D11Enumeration->HasEnumerated() || bForceEnumerate ) ) + { + g_pDXUTD3D11Enumeration->SetEnumerateAllAdapterFormats( bEnumerateAllAdapterFormats ); + LPDXUTCALLBACKISD3D11DEVICEACCEPTABLE pCallbackIsDeviceAcceptable; + void* pUserContext; + DXUTGetCallbackD3D11DeviceAcceptable( &pCallbackIsDeviceAcceptable, &pUserContext ); + g_pDXUTD3D11Enumeration->SetForceFeatureLevel(forceFL); + + g_pDXUTD3D11Enumeration->Enumerate( pCallbackIsDeviceAcceptable, pUserContext ); + } + + return g_pDXUTD3D11Enumeration; +} + + +//-------------------------------------------------------------------------------------- +CD3D11Enumeration::CD3D11Enumeration() +{ + m_bHasEnumerated = false; + m_IsD3D11DeviceAcceptableFunc = NULL; + m_pIsD3D11DeviceAcceptableFuncUserContext = NULL; + + m_nMinWidth = 640; + m_nMinHeight = 480; + m_nMaxWidth = UINT_MAX; + m_nMaxHeight = UINT_MAX; + m_bEnumerateAllAdapterFormats = false; + + m_nRefreshMin = 0; + m_nRefreshMax = UINT_MAX; + + ResetPossibleDepthStencilFormats(); +} + + +//-------------------------------------------------------------------------------------- +CD3D11Enumeration::~CD3D11Enumeration() +{ + ClearAdapterInfoList(); +} + + +//-------------------------------------------------------------------------------------- +// Enumerate for each adapter all of the supported display modes, +// device types, adapter formats, back buffer formats, window/full screen support, +// depth stencil formats, multisampling types/qualities, and presentations intervals. +// +// For each combination of device type (HAL/REF), adapter format, back buffer format, and +// IsWindowed it will call the app's ConfirmDevice callback. This allows the app +// to reject or allow that combination based on its caps/etc. It also allows the +// app to change the BehaviorFlags. The BehaviorFlags defaults non-pure HWVP +// if supported otherwise it will default to SWVP, however the app can change this +// through the ConfirmDevice callback. +//-------------------------------------------------------------------------------------- +HRESULT CD3D11Enumeration::Enumerate( LPDXUTCALLBACKISD3D11DEVICEACCEPTABLE IsD3D11DeviceAcceptableFunc, + void* pIsD3D11DeviceAcceptableFuncUserContext ) +{ + CDXUTPerfEventGenerator eventGenerator( DXUT_PERFEVENTCOLOR, L"DXUT D3D11 Enumeration" ); + HRESULT hr; + IDXGIFactory1* pFactory = DXUTGetDXGIFactory(); + if( pFactory == NULL ) + return E_FAIL; + + m_bHasEnumerated = true; + m_IsD3D11DeviceAcceptableFunc = IsD3D11DeviceAcceptableFunc; + m_pIsD3D11DeviceAcceptableFuncUserContext = pIsD3D11DeviceAcceptableFuncUserContext; + + ClearAdapterInfoList(); + + for( int index = 0; ; ++index ) + { + IDXGIAdapter* pAdapter = NULL; + hr = pFactory->EnumAdapters( index, &pAdapter ); + if( FAILED( hr ) ) // DXGIERR_NOT_FOUND is expected when the end of the list is hit + break; + + CD3D11EnumAdapterInfo* pAdapterInfo = new CD3D11EnumAdapterInfo; + if( !pAdapterInfo ) + { + SAFE_RELEASE( pAdapter ); + return E_OUTOFMEMORY; + } + ZeroMemory( pAdapterInfo, sizeof( CD3D11EnumAdapterInfo ) ); + pAdapterInfo->AdapterOrdinal = index; + pAdapter->GetDesc( &pAdapterInfo->AdapterDesc ); + pAdapterInfo->m_pAdapter = pAdapter; + + // Enumerate the device driver types on the adapter. + hr = EnumerateDevices( pAdapterInfo ); + if( FAILED( hr ) ) + { + delete pAdapterInfo; + continue; + } + + hr = EnumerateOutputs( pAdapterInfo ); + if( FAILED( hr ) || pAdapterInfo->outputInfoList.GetSize() <= 0 ) + { + delete pAdapterInfo; + continue; + } + + // Get info for each devicecombo on this device + if( FAILED( hr = EnumerateDeviceCombos( pFactory, pAdapterInfo ) ) ) + { + delete pAdapterInfo; + continue; + } + + hr = m_AdapterInfoList.Add( pAdapterInfo ); + if( FAILED( hr ) ) + { + delete pAdapterInfo; + return hr; + } + } + + + // If we did not get an adapter then we should still enumerate WARP and Ref. + if (m_AdapterInfoList.GetSize() == 0) { + + + CD3D11EnumAdapterInfo* pAdapterInfo = new CD3D11EnumAdapterInfo; + if( !pAdapterInfo ) + { + return E_OUTOFMEMORY; + } + ZeroMemory( pAdapterInfo, sizeof( CD3D11EnumAdapterInfo ) ); + pAdapterInfo->bAdapterUnavailable = true; + + hr = EnumerateDevices( pAdapterInfo ); + + // Get info for each devicecombo on this device + if( FAILED( hr = EnumerateDeviceCombosNoAdapter( pAdapterInfo ) ) ) + { + delete pAdapterInfo; + } + + if (!FAILED(hr)) hr = m_AdapterInfoList.Add( pAdapterInfo ); + } + + // + // Check for 2 or more adapters with the same name. Append the name + // with some instance number if that's the case to help distinguish + // them. + // + bool bUniqueDesc = true; + CD3D11EnumAdapterInfo* pAdapterInfo; + for( int i = 0; i < m_AdapterInfoList.GetSize(); i++ ) + { + CD3D11EnumAdapterInfo* pAdapterInfo1 = m_AdapterInfoList.GetAt( i ); + + for( int j = i + 1; j < m_AdapterInfoList.GetSize(); j++ ) + { + CD3D11EnumAdapterInfo* pAdapterInfo2 = m_AdapterInfoList.GetAt( j ); + if( wcsncmp( pAdapterInfo1->AdapterDesc.Description, + pAdapterInfo2->AdapterDesc.Description, DXGI_MAX_DEVICE_IDENTIFIER_STRING ) == 0 ) + { + bUniqueDesc = false; + break; + } + } + + if( !bUniqueDesc ) + break; + } + + for( int i = 0; i < m_AdapterInfoList.GetSize(); i++ ) + { + pAdapterInfo = m_AdapterInfoList.GetAt( i ); + + wcscpy_s( pAdapterInfo->szUniqueDescription, 100, pAdapterInfo->AdapterDesc.Description ); + if( !bUniqueDesc ) + { + WCHAR sz[100]; + swprintf_s( sz, 100, L" (#%d)", pAdapterInfo->AdapterOrdinal ); + wcscat_s( pAdapterInfo->szUniqueDescription, DXGI_MAX_DEVICE_IDENTIFIER_STRING, sz ); + } + } + + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +HRESULT CD3D11Enumeration::EnumerateOutputs( CD3D11EnumAdapterInfo* pAdapterInfo ) +{ + HRESULT hr; + IDXGIOutput* pOutput; + + for( int iOutput = 0; ; ++iOutput ) + { + pOutput = NULL; + hr = pAdapterInfo->m_pAdapter->EnumOutputs( iOutput, &pOutput ); + if( DXGI_ERROR_NOT_FOUND == hr ) + { + return S_OK; + } + else if( FAILED( hr ) ) + { + return hr; //Something bad happened. + } + else //Success! + { + CD3D11EnumOutputInfo* pOutputInfo = new CD3D11EnumOutputInfo; + if( !pOutputInfo ) + { + SAFE_RELEASE( pOutput ); + return E_OUTOFMEMORY; + } + ZeroMemory( pOutputInfo, sizeof( CD3D11EnumOutputInfo ) ); + pOutput->GetDesc( &pOutputInfo->Desc ); + pOutputInfo->Output = iOutput; + pOutputInfo->m_pOutput = pOutput; + + EnumerateDisplayModes( pOutputInfo ); + if( pOutputInfo->displayModeList.GetSize() <= 0 ) + { + // If this output has no valid display mode, do not save it. + delete pOutputInfo; + continue; + } + + hr = pAdapterInfo->outputInfoList.Add( pOutputInfo ); + if( FAILED( hr ) ) + { + delete pOutputInfo; + return hr; + } + } + } +} + + +//-------------------------------------------------------------------------------------- +HRESULT CD3D11Enumeration::EnumerateDisplayModes( CD3D11EnumOutputInfo* pOutputInfo ) +{ + HRESULT hr = S_OK; + DXGI_FORMAT allowedAdapterFormatArray[] = + { + DXGI_FORMAT_R8G8B8A8_UNORM_SRGB, //This is DXUT's preferred mode + + DXGI_FORMAT_R8G8B8A8_UNORM, + DXGI_FORMAT_R16G16B16A16_FLOAT, + DXGI_FORMAT_R10G10B10A2_UNORM + }; + int allowedAdapterFormatArrayCount = sizeof( allowedAdapterFormatArray ) / sizeof( allowedAdapterFormatArray[0] ); + + // Swap perferred modes for apps running in linear space + DXGI_FORMAT RemoteMode = DXGI_FORMAT_R8G8B8A8_UNORM_SRGB; + if( !DXUTIsInGammaCorrectMode() ) + { + allowedAdapterFormatArray[0] = DXGI_FORMAT_R8G8B8A8_UNORM; + allowedAdapterFormatArray[1] = DXGI_FORMAT_R8G8B8A8_UNORM_SRGB; + RemoteMode = DXGI_FORMAT_R8G8B8A8_UNORM; + } + + // The fast path only enumerates R8G8B8A8_UNORM_SRGB modes + if( !m_bEnumerateAllAdapterFormats ) + allowedAdapterFormatArrayCount = 1; + + for( int f = 0; f < allowedAdapterFormatArrayCount; ++f ) + { + // Fast-path: Try to grab at least 512 modes. + // This is to avoid calling GetDisplayModeList more times than necessary. + // GetDisplayModeList is an expensive call. + UINT NumModes = 512; + DXGI_MODE_DESC* pDesc = new DXGI_MODE_DESC[ NumModes ]; + assert( pDesc ); + if( !pDesc ) + return E_OUTOFMEMORY; + + hr = pOutputInfo->m_pOutput->GetDisplayModeList( allowedAdapterFormatArray[f], + DXGI_ENUM_MODES_SCALING, + &NumModes, + pDesc ); + if( DXGI_ERROR_NOT_FOUND == hr ) + { + SAFE_DELETE_ARRAY( pDesc ); + NumModes = 0; + break; + } + else if( MAKE_DXGI_HRESULT( 34 ) == hr && RemoteMode == allowedAdapterFormatArray[f] ) + { + // DXGI cannot enumerate display modes over a remote session. Therefore, create a fake display + // mode for the current screen resolution for the remote session. + if( 0 != GetSystemMetrics( 0x1000 ) ) // SM_REMOTESESSION + { + DEVMODE DevMode; + DevMode.dmSize = sizeof( DEVMODE ); + if( EnumDisplaySettings( NULL, ENUM_CURRENT_SETTINGS, &DevMode ) ) + { + NumModes = 1; + pDesc[0].Width = DevMode.dmPelsWidth; + pDesc[0].Height = DevMode.dmPelsHeight; + pDesc[0].Format = DXGI_FORMAT_R8G8B8A8_UNORM; + pDesc[0].RefreshRate.Numerator = 60; + pDesc[0].RefreshRate.Denominator = 1; + pDesc[0].ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_PROGRESSIVE; + pDesc[0].Scaling = DXGI_MODE_SCALING_CENTERED; + hr = S_OK; + } + } + } + else if( DXGI_ERROR_MORE_DATA == hr ) + { + // Slow path. There were more than 512 modes. + SAFE_DELETE_ARRAY( pDesc ); + hr = pOutputInfo->m_pOutput->GetDisplayModeList( allowedAdapterFormatArray[f], + DXGI_ENUM_MODES_SCALING, + &NumModes, + NULL ); + if( FAILED( hr ) ) + { + NumModes = 0; + break; + } + + pDesc = new DXGI_MODE_DESC[ NumModes ]; + assert( pDesc ); + if( !pDesc ) + return E_OUTOFMEMORY; + + hr = pOutputInfo->m_pOutput->GetDisplayModeList( allowedAdapterFormatArray[f], + DXGI_ENUM_MODES_SCALING, + &NumModes, + pDesc ); + if( FAILED( hr ) ) + { + SAFE_DELETE_ARRAY( pDesc ); + NumModes = 0; + break; + } + + } + + if( 0 == NumModes && 0 == f ) + { + // No R8G8B8A8_UNORM_SRGB modes! + // Abort the fast-path if we're on it + allowedAdapterFormatArrayCount = sizeof( allowedAdapterFormatArray ) / sizeof + ( allowedAdapterFormatArray[0] ); + SAFE_DELETE_ARRAY( pDesc ); + continue; + } + + if( SUCCEEDED( hr ) ) + { + for( UINT m = 0; m < NumModes; m++ ) + { + pOutputInfo->displayModeList.Add( pDesc[m] ); + } + } + + SAFE_DELETE_ARRAY( pDesc ); + } + + return hr; +} + + +//-------------------------------------------------------------------------------------- +HRESULT CD3D11Enumeration::EnumerateDevices( CD3D11EnumAdapterInfo* pAdapterInfo ) +{ + HRESULT hr; + DXUTDeviceSettings deviceSettings = DXUTGetDeviceSettings(); + const D3D_DRIVER_TYPE devTypeArray[] = + { + D3D_DRIVER_TYPE_HARDWARE, + D3D_DRIVER_TYPE_WARP, + D3D_DRIVER_TYPE_REFERENCE + }; + const UINT devTypeArrayCount = sizeof( devTypeArray ) / sizeof( devTypeArray[0] ); + + // Enumerate each Direct3D device type + for( UINT iDeviceType = 0; iDeviceType < devTypeArrayCount; iDeviceType++ ) + { + CD3D11EnumDeviceInfo* pDeviceInfo = new CD3D11EnumDeviceInfo; + if( pDeviceInfo == NULL ) + return E_OUTOFMEMORY; + + // Fill struct w/ AdapterOrdinal and D3DX10_DRIVER_TYPE + pDeviceInfo->AdapterOrdinal = pAdapterInfo->AdapterOrdinal; + pDeviceInfo->DeviceType = devTypeArray[iDeviceType]; + + D3D_FEATURE_LEVEL FeatureLevels[] = + { + D3D_FEATURE_LEVEL_11_0, + D3D_FEATURE_LEVEL_10_1, + D3D_FEATURE_LEVEL_10_0, + D3D_FEATURE_LEVEL_9_3, + D3D_FEATURE_LEVEL_9_2, + D3D_FEATURE_LEVEL_9_1 + }; + UINT NumFeatureLevels = ARRAYSIZE( FeatureLevels ); + + // Call D3D11CreateDevice to ensure that this is a D3D11 device. + ID3D11Device* pd3dDevice = NULL; + ID3D11DeviceContext* pd3dDeviceContext = NULL; + IDXGIAdapter* pAdapter = NULL; + //if( devTypeArray[iDeviceType] == D3D_DRIVER_TYPE_HARDWARE ) + // pAdapter = pAdapterInfo->m_pAdapter; + hr = DXUT_Dynamic_D3D11CreateDevice( pAdapter, + devTypeArray[iDeviceType], + ( HMODULE )0, + 0, + FeatureLevels, + NumFeatureLevels, + D3D11_SDK_VERSION, + &pd3dDevice, + &pDeviceInfo->MaxLevel, + &pd3dDeviceContext ); + if( FAILED( hr ) || pDeviceInfo->MaxLevel < deviceSettings.MinimumFeatureLevel) + { + delete pDeviceInfo; + continue; + } + + if (g_forceFL == 0 || g_forceFL == pDeviceInfo->MaxLevel) { + pDeviceInfo->SelectedLevel = pDeviceInfo->MaxLevel; + } + else if (g_forceFL > pDeviceInfo->MaxLevel) { + delete pDeviceInfo; + SAFE_RELEASE( pd3dDevice ); + SAFE_RELEASE( pd3dDeviceContext ); + continue; + } else { + // A device was created with a higher feature level that the user-specified feature level. + SAFE_RELEASE( pd3dDevice ); + SAFE_RELEASE( pd3dDeviceContext ); + D3D_FEATURE_LEVEL rtFL; + hr = DXUT_Dynamic_D3D11CreateDevice( pAdapter, + devTypeArray[iDeviceType], + ( HMODULE )0, + 0, + &g_forceFL, + 1, + D3D11_SDK_VERSION, + &pd3dDevice, + &rtFL, + &pd3dDeviceContext ); + + if( !FAILED( hr ) && rtFL == g_forceFL ) { + + pDeviceInfo->SelectedLevel = g_forceFL; + }else { + delete pDeviceInfo; + SAFE_RELEASE( pd3dDevice ); + SAFE_RELEASE( pd3dDeviceContext ); + continue; + } + } + + IDXGIDevice1* pDXGIDev = NULL; + hr = pd3dDevice->QueryInterface( __uuidof( IDXGIDevice1 ), ( LPVOID* )&pDXGIDev ); + if( SUCCEEDED( hr ) && pDXGIDev ) + { + SAFE_RELEASE( pAdapterInfo->m_pAdapter ); + pDXGIDev->GetAdapter( &pAdapterInfo->m_pAdapter ); + } + SAFE_RELEASE( pDXGIDev ); + + + D3D11_FEATURE_DATA_D3D10_X_HARDWARE_OPTIONS ho; + pd3dDevice->CheckFeatureSupport(D3D11_FEATURE_D3D10_X_HARDWARE_OPTIONS, &ho, sizeof(ho)); + pDeviceInfo->ComputeShaders_Plus_RawAndStructuredBuffers_Via_Shader_4_x = ho.ComputeShaders_Plus_RawAndStructuredBuffers_Via_Shader_4_x; + SAFE_RELEASE( pd3dDeviceContext ); + SAFE_RELEASE( pd3dDevice ); + pAdapterInfo->deviceInfoList.Add( pDeviceInfo ); + } + + return S_OK; +} + + +HRESULT CD3D11Enumeration::EnumerateDeviceCombosNoAdapter( CD3D11EnumAdapterInfo* pAdapterInfo ) +{ + // Iterate through each combination of device driver type, output, + // adapter format, and backbuffer format to build the adapter's device combo list. + // + + for( int device = 0; device < pAdapterInfo->deviceInfoList.GetSize(); ++device ) + { + CD3D11EnumDeviceInfo* pDeviceInfo = pAdapterInfo->deviceInfoList.GetAt( device ); + + DXGI_FORMAT BufferFormatArray[] = + { + DXGI_FORMAT_R8G8B8A8_UNORM_SRGB, //This is DXUT's preferred mode + + DXGI_FORMAT_R8G8B8A8_UNORM, + DXGI_FORMAT_R16G16B16A16_FLOAT, + DXGI_FORMAT_R10G10B10A2_UNORM + }; + const UINT BufferFormatArrayCount = sizeof( BufferFormatArray ) / sizeof + ( BufferFormatArray[0] ); + + // Swap perferred modes for apps running in linear space + if( !DXUTIsInGammaCorrectMode() ) + { + BufferFormatArray[0] = DXGI_FORMAT_R8G8B8A8_UNORM; + BufferFormatArray[1] = DXGI_FORMAT_R8G8B8A8_UNORM_SRGB; + } + + for( UINT iBufferFormat = 0; iBufferFormat < BufferFormatArrayCount; iBufferFormat++ ) + { + DXGI_FORMAT BufferFormat = BufferFormatArray[iBufferFormat]; + + + + // determine if there are any modes for this particular format + + + // If an application callback function has been provided, make sure this device + // is acceptable to the app. + if( m_IsD3D11DeviceAcceptableFunc != NULL ) + { + if( !m_IsD3D11DeviceAcceptableFunc( pAdapterInfo, + 0, + pDeviceInfo, + BufferFormat, + TRUE, + m_pIsD3D11DeviceAcceptableFuncUserContext ) ) + continue; + } + + // At this point, we have an adapter/device/backbufferformat/iswindowed + // DeviceCombo that is supported by the system. We still + // need to find one or more suitable depth/stencil buffer format, + // multisample type, and present interval. + CD3D11EnumDeviceSettingsCombo* pDeviceCombo = new CD3D11EnumDeviceSettingsCombo; + if( pDeviceCombo == NULL ) + return E_OUTOFMEMORY; + + pDeviceCombo->AdapterOrdinal = pDeviceInfo->AdapterOrdinal; + pDeviceCombo->DeviceType = pDeviceInfo->DeviceType; + pDeviceCombo->BackBufferFormat = BufferFormat; + pDeviceCombo->Windowed = TRUE; + pDeviceCombo->Output = 0; + pDeviceCombo->pAdapterInfo = pAdapterInfo; + pDeviceCombo->pDeviceInfo = pDeviceInfo; + pDeviceCombo->pOutputInfo = NULL; + + BuildMultiSampleQualityList( BufferFormat, pDeviceCombo ); + + if( FAILED( pAdapterInfo->deviceSettingsComboList.Add( pDeviceCombo ) ) ) + delete pDeviceCombo; + } + + } + + + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +HRESULT CD3D11Enumeration::EnumerateDeviceCombos( IDXGIFactory1* pFactory, CD3D11EnumAdapterInfo* pAdapterInfo ) +{ + // Iterate through each combination of device driver type, output, + // adapter format, and backbuffer format to build the adapter's device combo list. + // + + for( int output = 0; output < pAdapterInfo->outputInfoList.GetSize(); ++output ) + { + CD3D11EnumOutputInfo* pOutputInfo = pAdapterInfo->outputInfoList.GetAt( output ); + + for( int device = 0; device < pAdapterInfo->deviceInfoList.GetSize(); ++device ) + { + CD3D11EnumDeviceInfo* pDeviceInfo = pAdapterInfo->deviceInfoList.GetAt( device ); + + DXGI_FORMAT backBufferFormatArray[] = + { + DXGI_FORMAT_R8G8B8A8_UNORM_SRGB, //This is DXUT's preferred mode + + DXGI_FORMAT_R8G8B8A8_UNORM, + DXGI_FORMAT_R16G16B16A16_FLOAT, + DXGI_FORMAT_R10G10B10A2_UNORM + }; + const UINT backBufferFormatArrayCount = sizeof( backBufferFormatArray ) / sizeof + ( backBufferFormatArray[0] ); + + // Swap perferred modes for apps running in linear space + if( !DXUTIsInGammaCorrectMode() ) + { + backBufferFormatArray[0] = DXGI_FORMAT_R8G8B8A8_UNORM; + backBufferFormatArray[1] = DXGI_FORMAT_R8G8B8A8_UNORM_SRGB; + } + + for( UINT iBackBufferFormat = 0; iBackBufferFormat < backBufferFormatArrayCount; iBackBufferFormat++ ) + { + DXGI_FORMAT backBufferFormat = backBufferFormatArray[iBackBufferFormat]; + + for( int nWindowed = 0; nWindowed < 2; nWindowed++ ) + { + if( !nWindowed && pOutputInfo->displayModeList.GetSize() == 0 ) + continue; + + // determine if there are any modes for this particular format + UINT iModes = 0; + for( int i = 0; i < pOutputInfo->displayModeList.GetSize(); i++ ) + { + if( backBufferFormat == pOutputInfo->displayModeList.GetAt( i ).Format ) + iModes ++; + } + if( 0 == iModes ) + continue; + + // If an application callback function has been provided, make sure this device + // is acceptable to the app. + if( m_IsD3D11DeviceAcceptableFunc != NULL ) + { + if( !m_IsD3D11DeviceAcceptableFunc( pAdapterInfo, output, + pDeviceInfo, backBufferFormat, + FALSE != nWindowed, + m_pIsD3D11DeviceAcceptableFuncUserContext ) ) + continue; + } + + // At this point, we have an adapter/device/backbufferformat/iswindowed + // DeviceCombo that is supported by the system. We still + // need to find one or more suitable depth/stencil buffer format, + // multisample type, and present interval. + CD3D11EnumDeviceSettingsCombo* pDeviceCombo = new CD3D11EnumDeviceSettingsCombo; + if( pDeviceCombo == NULL ) + return E_OUTOFMEMORY; + + pDeviceCombo->AdapterOrdinal = pDeviceInfo->AdapterOrdinal; + pDeviceCombo->DeviceType = pDeviceInfo->DeviceType; + pDeviceCombo->BackBufferFormat = backBufferFormat; + pDeviceCombo->Windowed = ( nWindowed != 0 ); + pDeviceCombo->Output = pOutputInfo->Output; + pDeviceCombo->pAdapterInfo = pAdapterInfo; + pDeviceCombo->pDeviceInfo = pDeviceInfo; + pDeviceCombo->pOutputInfo = pOutputInfo; + + BuildMultiSampleQualityList( backBufferFormat, pDeviceCombo ); + + if( FAILED( pAdapterInfo->deviceSettingsComboList.Add( pDeviceCombo ) ) ) + delete pDeviceCombo; + } + } + } + } + + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +// Release all the allocated CD3D11EnumAdapterInfo objects and empty the list +//-------------------------------------------------------------------------------------- +void CD3D11Enumeration::ClearAdapterInfoList() +{ + CD3D11EnumAdapterInfo* pAdapterInfo; + for( int i = 0; i < m_AdapterInfoList.GetSize(); i++ ) + { + pAdapterInfo = m_AdapterInfoList.GetAt( i ); + delete pAdapterInfo; + } + + m_AdapterInfoList.RemoveAll(); +} + + +//-------------------------------------------------------------------------------------- +void CD3D11Enumeration::ResetPossibleDepthStencilFormats() +{ + m_DepthStencilPossibleList.RemoveAll(); + m_DepthStencilPossibleList.Add( DXGI_FORMAT_D32_FLOAT_S8X24_UINT ); + m_DepthStencilPossibleList.Add( DXGI_FORMAT_D32_FLOAT ); + m_DepthStencilPossibleList.Add( DXGI_FORMAT_D24_UNORM_S8_UINT ); + m_DepthStencilPossibleList.Add( DXGI_FORMAT_D16_UNORM ); +} + +//-------------------------------------------------------------------------------------- +void CD3D11Enumeration::SetEnumerateAllAdapterFormats( bool bEnumerateAllAdapterFormats ) +{ + m_bEnumerateAllAdapterFormats = bEnumerateAllAdapterFormats; +} + + +//-------------------------------------------------------------------------------------- +void CD3D11Enumeration::BuildMultiSampleQualityList( DXGI_FORMAT fmt, CD3D11EnumDeviceSettingsCombo* pDeviceCombo ) +{ + ID3D11Device* pd3dDevice = NULL; + ID3D11DeviceContext* pd3dDeviceContext = NULL; + IDXGIAdapter* pAdapter = NULL; + + //if( pDeviceCombo->DeviceType == D3D_DRIVER_TYPE_HARDWARE ) + // DXUTGetDXGIFactory()->EnumAdapters( pDeviceCombo->pAdapterInfo->AdapterOrdinal, &pAdapter ); + + //DXGI_ADAPTER_DESC dad; + //pAdapter->GetDesc(&dad); + + D3D_FEATURE_LEVEL *FeatureLevels = &(pDeviceCombo->pDeviceInfo->SelectedLevel); + D3D_FEATURE_LEVEL returnedFeatureLevel; + + UINT NumFeatureLevels = 1; + + HRESULT hr = DXUT_Dynamic_D3D11CreateDevice( pAdapter, + pDeviceCombo->DeviceType, + ( HMODULE )0, + 0, + FeatureLevels, + NumFeatureLevels, + D3D11_SDK_VERSION, + &pd3dDevice, + &returnedFeatureLevel, + &pd3dDeviceContext ) ; + + if( FAILED( hr)) return; + + if (returnedFeatureLevel != pDeviceCombo->pDeviceInfo->SelectedLevel) return; + + for( int i = 1; i <= D3D11_MAX_MULTISAMPLE_SAMPLE_COUNT; ++i ) + { + UINT Quality; + if( SUCCEEDED( pd3dDevice->CheckMultisampleQualityLevels( fmt, i, &Quality ) ) && Quality > 0 ) + { + //From D3D10 docs: When multisampling a texture, the number of quality levels available for an adapter is dependent on the texture + //format used and the number of samples requested. The maximum sample count is defined by + //D3D10_MAX_MULTISAMPLE_SAMPLE_COUNT in d3d10.h. If the returned value of pNumQualityLevels is 0, + //the format and sample count combination is not supported for the installed adapter. + + if (Quality != 0) { + pDeviceCombo->multiSampleCountList.Add( i ); + pDeviceCombo->multiSampleQualityList.Add( Quality ); + } + } + } + + SAFE_RELEASE( pAdapter ); + SAFE_RELEASE( pd3dDevice ); + SAFE_RELEASE (pd3dDeviceContext); +} + + +//-------------------------------------------------------------------------------------- +// Call GetAdapterInfoList() after Enumerate() to get a STL vector of +// CD3D11EnumAdapterInfo* +//-------------------------------------------------------------------------------------- +CGrowableArray * CD3D11Enumeration::GetAdapterInfoList() +{ + return &m_AdapterInfoList; +} + + +//-------------------------------------------------------------------------------------- +CD3D11EnumAdapterInfo* CD3D11Enumeration::GetAdapterInfo( UINT AdapterOrdinal ) +{ + for( int iAdapter = 0; iAdapter < m_AdapterInfoList.GetSize(); iAdapter++ ) + { + CD3D11EnumAdapterInfo* pAdapterInfo = m_AdapterInfoList.GetAt( iAdapter ); + if( pAdapterInfo->AdapterOrdinal == AdapterOrdinal ) + return pAdapterInfo; + } + + return NULL; +} + + +//-------------------------------------------------------------------------------------- +CD3D11EnumDeviceInfo* CD3D11Enumeration::GetDeviceInfo( UINT AdapterOrdinal, D3D_DRIVER_TYPE DeviceType ) +{ + CD3D11EnumAdapterInfo* pAdapterInfo = GetAdapterInfo( AdapterOrdinal ); + if( pAdapterInfo ) + { + for( int iDeviceInfo = 0; iDeviceInfo < pAdapterInfo->deviceInfoList.GetSize(); iDeviceInfo++ ) + { + CD3D11EnumDeviceInfo* pDeviceInfo = pAdapterInfo->deviceInfoList.GetAt( iDeviceInfo ); + if( pDeviceInfo->DeviceType == DeviceType ) + return pDeviceInfo; + } + } + + return NULL; +} + + +//-------------------------------------------------------------------------------------- +CD3D11EnumOutputInfo* CD3D11Enumeration::GetOutputInfo( UINT AdapterOrdinal, UINT Output ) +{ + CD3D11EnumAdapterInfo* pAdapterInfo = GetAdapterInfo( AdapterOrdinal ); + if( pAdapterInfo && pAdapterInfo->outputInfoList.GetSize() > int( Output ) ) + { + return pAdapterInfo->outputInfoList.GetAt( Output ); + } + + return NULL; +} + + +//-------------------------------------------------------------------------------------- +CD3D11EnumDeviceSettingsCombo* CD3D11Enumeration::GetDeviceSettingsCombo( UINT AdapterOrdinal, + D3D_DRIVER_TYPE DeviceType, UINT Output, + DXGI_FORMAT BackBufferFormat, BOOL Windowed ) +{ + CD3D11EnumAdapterInfo* pAdapterInfo = GetAdapterInfo( AdapterOrdinal ); + if( pAdapterInfo ) + { + for( int iDeviceCombo = 0; iDeviceCombo < pAdapterInfo->deviceSettingsComboList.GetSize(); iDeviceCombo++ ) + { + CD3D11EnumDeviceSettingsCombo* pDeviceSettingsCombo = pAdapterInfo->deviceSettingsComboList.GetAt( + iDeviceCombo ); + if( pDeviceSettingsCombo->BackBufferFormat == BackBufferFormat && + pDeviceSettingsCombo->Windowed == Windowed ) + return pDeviceSettingsCombo; + } + } + + return NULL; +} + + +//-------------------------------------------------------------------------------------- +CD3D11EnumOutputInfo::~CD3D11EnumOutputInfo( void ) +{ + SAFE_RELEASE( m_pOutput ); + displayModeList.RemoveAll(); +} + + +//-------------------------------------------------------------------------------------- +CD3D11EnumDeviceInfo::~CD3D11EnumDeviceInfo() +{ +} + + +//-------------------------------------------------------------------------------------- +CD3D11EnumAdapterInfo::~CD3D11EnumAdapterInfo( void ) +{ + for( int i = 0; i < outputInfoList.GetSize(); i++ ) + { + CD3D11EnumOutputInfo* pOutputInfo = outputInfoList.GetAt( i ); + delete pOutputInfo; + } + outputInfoList.RemoveAll(); + + for( int i = 0; i < deviceInfoList.GetSize(); ++i ) + { + CD3D11EnumDeviceInfo* pDeviceInfo = deviceInfoList.GetAt( i ); + delete pDeviceInfo; + } + deviceInfoList.RemoveAll(); + + for( int i = 0; i < deviceSettingsComboList.GetSize(); ++i ) + { + CD3D11EnumDeviceSettingsCombo* pDeviceCombo = deviceSettingsComboList.GetAt( i ); + delete pDeviceCombo; + } + deviceSettingsComboList.RemoveAll(); + + SAFE_RELEASE( m_pAdapter ); +} + +//-------------------------------------------------------------------------------------- +// Returns the number of color channel bits in the specified DXGI_FORMAT +//-------------------------------------------------------------------------------------- +UINT WINAPI DXUTGetDXGIColorChannelBits( DXGI_FORMAT fmt ) +{ + switch( fmt ) + { + case DXGI_FORMAT_R32G32B32A32_TYPELESS: + case DXGI_FORMAT_R32G32B32A32_FLOAT: + case DXGI_FORMAT_R32G32B32A32_UINT: + case DXGI_FORMAT_R32G32B32A32_SINT: + case DXGI_FORMAT_R32G32B32_TYPELESS: + case DXGI_FORMAT_R32G32B32_FLOAT: + case DXGI_FORMAT_R32G32B32_UINT: + case DXGI_FORMAT_R32G32B32_SINT: + return 32; + + case DXGI_FORMAT_R16G16B16A16_TYPELESS: + case DXGI_FORMAT_R16G16B16A16_FLOAT: + case DXGI_FORMAT_R16G16B16A16_UNORM: + case DXGI_FORMAT_R16G16B16A16_UINT: + case DXGI_FORMAT_R16G16B16A16_SNORM: + case DXGI_FORMAT_R16G16B16A16_SINT: + return 16; + + case DXGI_FORMAT_R10G10B10A2_TYPELESS: + case DXGI_FORMAT_R10G10B10A2_UNORM: + case DXGI_FORMAT_R10G10B10A2_UINT: + return 10; + + case DXGI_FORMAT_R8G8B8A8_TYPELESS: + case DXGI_FORMAT_R8G8B8A8_UNORM: + case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB: + case DXGI_FORMAT_R8G8B8A8_UINT: + case DXGI_FORMAT_R8G8B8A8_SNORM: + case DXGI_FORMAT_R8G8B8A8_SINT: + return 8; + + case DXGI_FORMAT_B5G6R5_UNORM: + case DXGI_FORMAT_B5G5R5A1_UNORM: + return 5; + + default: + return 0; + } +} + +//-------------------------------------------------------------------------------------- +// Returns a ranking number that describes how closely this device +// combo matches the optimal combo based on the match options and the optimal device settings +//-------------------------------------------------------------------------------------- +float DXUTRankD3D11DeviceCombo( CD3D11EnumDeviceSettingsCombo* pDeviceSettingsCombo, + DXUTD3D11DeviceSettings* pOptimalDeviceSettings, + DXGI_MODE_DESC* pAdapterDisplayMode, + int &bestModeIndex, + int &bestMSAAIndex + ) +{ + float fCurRanking = 0.0f; + + // Arbitrary weights. Gives preference to the ordinal, device type, and windowed + const float fAdapterOrdinalWeight = 1000.0f; + const float fAdapterOutputWeight = 500.0f; + const float fDeviceTypeWeight = 100.0f; + const float fWARPOverRefWeight = 80.0f; + + const float fWindowWeight = 10.0f; + const float fResolutionWeight = 1.0f; + const float fBackBufferFormatWeight = 1.0f; + const float fMultiSampleWeight = 1.0f; + const float fRefreshRateWeight = 1.0f; + + //--------------------- + // Adapter ordinal + //--------------------- + if( pDeviceSettingsCombo->AdapterOrdinal == pOptimalDeviceSettings->AdapterOrdinal ) + fCurRanking += fAdapterOrdinalWeight; + + //--------------------- + // Adapter ordinal + //--------------------- + if( pDeviceSettingsCombo->Output == pOptimalDeviceSettings->Output ) + fCurRanking += fAdapterOutputWeight; + + //--------------------- + // Device type + //--------------------- + if( pDeviceSettingsCombo->DeviceType == pOptimalDeviceSettings->DriverType ) + fCurRanking += fDeviceTypeWeight; + else if (pDeviceSettingsCombo->DeviceType == D3D_DRIVER_TYPE_WARP && pOptimalDeviceSettings->DriverType == D3D_DRIVER_TYPE_HARDWARE) { + fCurRanking += fWARPOverRefWeight; + } + + // Slightly prefer HAL + if( pDeviceSettingsCombo->DeviceType == D3DDEVTYPE_HAL ) + fCurRanking += 0.1f; + + //--------------------- + // Windowed + //--------------------- + if( pDeviceSettingsCombo->Windowed == pOptimalDeviceSettings->sd.Windowed ) + fCurRanking += fWindowWeight; + + //--------------------- + // Resolution + //--------------------- + bool bResolutionFound = false; + unsigned int best = 0xffffffff; + bestModeIndex=0; + for( int idm = 0; pDeviceSettingsCombo->pOutputInfo != NULL && idm < pDeviceSettingsCombo->pOutputInfo->displayModeList.GetSize() && !bResolutionFound; idm++ ) + { + DXGI_MODE_DESC displayMode = pDeviceSettingsCombo->pOutputInfo->displayModeList.GetAt( idm ); + if( displayMode.Width == pOptimalDeviceSettings->sd.BufferDesc.Width && + displayMode.Height == pOptimalDeviceSettings->sd.BufferDesc.Height ) + bResolutionFound = true; + + unsigned int current = + (UINT) abs ((int)displayMode.Width - (int)pOptimalDeviceSettings->sd.BufferDesc.Width) + + (UINT) abs ((int)displayMode.Height - (int)pOptimalDeviceSettings->sd.BufferDesc.Height ); + + if (current < best) { + best = current; + bestModeIndex= idm; + + } + + } + if( bResolutionFound ) + fCurRanking += fResolutionWeight; + + //--------------------- + // Back buffer format + //--------------------- + if( pDeviceSettingsCombo->BackBufferFormat == pOptimalDeviceSettings->sd.BufferDesc.Format ) + { + fCurRanking += fBackBufferFormatWeight; + } + else + { + int nBitDepthDelta = abs( ( long )DXUTGetDXGIColorChannelBits( pDeviceSettingsCombo->BackBufferFormat ) - + ( long )DXUTGetDXGIColorChannelBits( + pOptimalDeviceSettings->sd.BufferDesc.Format ) ); + float fScale = __max( 0.9f - ( float )nBitDepthDelta * 0.2f, 0.0f ); + fCurRanking += fScale * fBackBufferFormatWeight; + } + + //--------------------- + // Back buffer count + //--------------------- + // No caps for the back buffer count + + //--------------------- + // Multisample + //--------------------- + bool bMultiSampleFound = false; + bestMSAAIndex = 0; + for( int i = 0; i < pDeviceSettingsCombo->multiSampleCountList.GetSize(); i++ ) + { + UINT Count = pDeviceSettingsCombo->multiSampleCountList.GetAt( i ); + + if( Count == pOptimalDeviceSettings->sd.SampleDesc.Count ) + { + bestMSAAIndex = i; + bMultiSampleFound = true; + break; + } + } + if( bMultiSampleFound ) + fCurRanking += fMultiSampleWeight; + + //--------------------- + // Swap effect + //--------------------- + // No caps for swap effects + + //--------------------- + // Depth stencil + //--------------------- + // No caps for swap effects + + //--------------------- + // Present flags + //--------------------- + // No caps for the present flags + + //--------------------- + // Refresh rate + //--------------------- + bool bRefreshFound = false; + for( int idm = 0; pDeviceSettingsCombo->pOutputInfo != NULL && idm < pDeviceSettingsCombo->pOutputInfo->displayModeList.GetSize(); idm++ ) + { + DXGI_MODE_DESC displayMode = pDeviceSettingsCombo->pOutputInfo->displayModeList.GetAt( idm ); + if( fabs( float( displayMode.RefreshRate.Numerator ) / displayMode.RefreshRate.Denominator - + float( pOptimalDeviceSettings->sd.BufferDesc.RefreshRate.Numerator ) / + pOptimalDeviceSettings->sd.BufferDesc.RefreshRate.Denominator ) < 0.1f ) + bRefreshFound = true; + } + if( bRefreshFound ) + fCurRanking += fRefreshRateWeight; + + //--------------------- + // Present interval + //--------------------- + // No caps for the present flags + + return fCurRanking; +} + + +//-------------------------------------------------------------------------------------- +// Returns the DXGI_MODE_DESC struct for a given adapter and output +//-------------------------------------------------------------------------------------- +HRESULT WINAPI DXUTGetD3D11AdapterDisplayMode( UINT AdapterOrdinal, UINT nOutput, DXGI_MODE_DESC* pModeDesc ) +{ + if( !pModeDesc ) + return E_INVALIDARG; + + CD3D11Enumeration* pD3DEnum = DXUTGetD3D11Enumeration(); + CD3D11EnumOutputInfo* pOutputInfo = pD3DEnum->GetOutputInfo( AdapterOrdinal, nOutput ); + if( pOutputInfo ) + { + pModeDesc->Width = 640; + pModeDesc->Height = 480; + pModeDesc->RefreshRate.Numerator = 60; + pModeDesc->RefreshRate.Denominator = 1; + pModeDesc->Format = DXGI_FORMAT_R8G8B8A8_UNORM_SRGB; + pModeDesc->Scaling = DXGI_MODE_SCALING_UNSPECIFIED; + pModeDesc->ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED; + + DXGI_OUTPUT_DESC Desc; + pOutputInfo->m_pOutput->GetDesc( &Desc ); + pModeDesc->Width = Desc.DesktopCoordinates.right - Desc.DesktopCoordinates.left; + pModeDesc->Height = Desc.DesktopCoordinates.bottom - Desc.DesktopCoordinates.top; + } + + // TODO: verify this is needed + if( pModeDesc->Format == DXGI_FORMAT_B8G8R8A8_UNORM ) + pModeDesc->Format = DXGI_FORMAT_R8G8B8A8_UNORM; + + return S_OK; +} diff --git a/Demos/DX11ClothDemo/DXUT/Core/DXUTDevice11.h b/Demos/DX11ClothDemo/DXUT/Core/DXUTDevice11.h new file mode 100644 index 000000000..c15c571e7 --- /dev/null +++ b/Demos/DX11ClothDemo/DXUT/Core/DXUTDevice11.h @@ -0,0 +1,210 @@ +//-------------------------------------------------------------------------------------- +// File: DXUTDevice11.h +// +// Enumerates D3D adapters, devices, modes, etc. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +//-------------------------------------------------------------------------------------- +#pragma once +#ifndef DXUT_DEVICE11_H +#define DXUT_DEVICE11_H + +void DXUTApplyDefaultDeviceSettings(DXUTDeviceSettings *modifySettings); + +//-------------------------------------------------------------------------------------- +// Functions to get bit depth from formats +//-------------------------------------------------------------------------------------- +HRESULT WINAPI DXUTGetD3D11AdapterDisplayMode( UINT AdapterOrdinal, UINT Output, DXGI_MODE_DESC* pModeDesc ); + + + + +//-------------------------------------------------------------------------------------- +// Optional memory create/destory functions. If not call, these will be called automatically +//-------------------------------------------------------------------------------------- +HRESULT WINAPI DXUTCreateD3D11Enumeration(); +void WINAPI DXUTDestroyD3D11Enumeration(); + + + + +//-------------------------------------------------------------------------------------- +// Forward declarations +//-------------------------------------------------------------------------------------- +class CD3D11EnumAdapterInfo; +class CD3D11EnumDeviceInfo; +class CD3D11EnumOutputInfo; +struct CD3D11EnumDeviceSettingsCombo; + + + +//-------------------------------------------------------------------------------------- +// Enumerates available Direct3D10 adapters, devices, modes, etc. +// Use DXUTGetD3D9Enumeration() to access global instance +//-------------------------------------------------------------------------------------- +class CD3D11Enumeration +{ +public: + // These should be called before Enumerate(). + // + // Use these calls and the IsDeviceAcceptable to control the contents of + // the enumeration object, which affects the device selection and the device settings dialog. + void SetResolutionMinMax( UINT nMinWidth, UINT nMinHeight, UINT nMaxWidth, UINT nMaxHeight ); + void SetRefreshMinMax( UINT nMin, UINT nMax ); + void SetForceFeatureLevel( D3D_FEATURE_LEVEL forceFL) { + g_forceFL = forceFL; + }; + void SetMultisampleQualityMax( UINT nMax ); + CGrowableArray* GetPossibleDepthStencilFormatList(); + void ResetPossibleDepthStencilFormats(); + void SetEnumerateAllAdapterFormats( bool bEnumerateAllAdapterFormats ); + + // Call Enumerate() to enumerate available D3D11 adapters, devices, modes, etc. + bool HasEnumerated() { return m_bHasEnumerated; } + HRESULT Enumerate( LPDXUTCALLBACKISD3D11DEVICEACCEPTABLE IsD3D11DeviceAcceptableFunc, + void* pIsD3D11DeviceAcceptableFuncUserContext ); + + // These should be called after Enumerate() is called + CGrowableArray* GetAdapterInfoList(); + CD3D11EnumAdapterInfo* GetAdapterInfo( UINT AdapterOrdinal ); + CD3D11EnumDeviceInfo* GetDeviceInfo( UINT AdapterOrdinal, D3D_DRIVER_TYPE DeviceType ); + CD3D11EnumOutputInfo* GetOutputInfo( UINT AdapterOrdinal, UINT Output ); + CD3D11EnumDeviceSettingsCombo* GetDeviceSettingsCombo( DXUTD3D11DeviceSettings* pDeviceSettings ) { return GetDeviceSettingsCombo( pDeviceSettings->AdapterOrdinal, pDeviceSettings->DriverType, pDeviceSettings->Output, pDeviceSettings->sd.BufferDesc.Format, pDeviceSettings->sd.Windowed ); } + CD3D11EnumDeviceSettingsCombo* GetDeviceSettingsCombo( UINT AdapterOrdinal, D3D_DRIVER_TYPE DeviceType, UINT Output, DXGI_FORMAT BackBufferFormat, BOOL Windowed ); + + ~CD3D11Enumeration(); + +private: + friend HRESULT WINAPI DXUTCreateD3D11Enumeration(); + + // Use DXUTGetD3D11Enumeration() to access global instance + CD3D11Enumeration(); + + bool m_bHasEnumerated; + LPDXUTCALLBACKISD3D11DEVICEACCEPTABLE m_IsD3D11DeviceAcceptableFunc; + void* m_pIsD3D11DeviceAcceptableFuncUserContext; + + CGrowableArray m_DepthStencilPossibleList; + + UINT m_nMinWidth; + UINT m_nMaxWidth; + UINT m_nMinHeight; + UINT m_nMaxHeight; + UINT m_nRefreshMin; + UINT m_nRefreshMax; + UINT m_nMultisampleQualityMax; + bool m_bEnumerateAllAdapterFormats; + D3D_FEATURE_LEVEL g_forceFL; + + // Array of CD3D9EnumAdapterInfo* with unique AdapterOrdinals + CGrowableArray m_AdapterInfoList; + + HRESULT EnumerateOutputs( CD3D11EnumAdapterInfo *pAdapterInfo ); + HRESULT EnumerateDevices( CD3D11EnumAdapterInfo *pAdapterInfo ); + HRESULT EnumerateDeviceCombos( IDXGIFactory1 *pFactory, CD3D11EnumAdapterInfo* pAdapterInfo ); + HRESULT EnumerateDeviceCombosNoAdapter( CD3D11EnumAdapterInfo* pAdapterInfo ); + + HRESULT EnumerateDisplayModes( CD3D11EnumOutputInfo *pOutputInfo ); + void BuildMultiSampleQualityList( DXGI_FORMAT fmt, CD3D11EnumDeviceSettingsCombo* pDeviceCombo ); + void ClearAdapterInfoList(); +}; + +CD3D11Enumeration* WINAPI DXUTGetD3D11Enumeration(bool bForceEnumerate = false, bool EnumerateAllAdapterFormats = false, D3D_FEATURE_LEVEL forceFL = ((D3D_FEATURE_LEVEL )0) ); + + +#define DXGI_MAX_DEVICE_IDENTIFIER_STRING 128 + +//-------------------------------------------------------------------------------------- +// A class describing an adapter which contains a unique adapter ordinal +// that is installed on the system +//-------------------------------------------------------------------------------------- +class CD3D11EnumAdapterInfo +{ + const CD3D11EnumAdapterInfo &operator = ( const CD3D11EnumAdapterInfo &rhs ); + +public: + ~CD3D11EnumAdapterInfo(); + + UINT AdapterOrdinal; + DXGI_ADAPTER_DESC AdapterDesc; + WCHAR szUniqueDescription[DXGI_MAX_DEVICE_IDENTIFIER_STRING]; + IDXGIAdapter *m_pAdapter; + bool bAdapterUnavailable; + + CGrowableArray outputInfoList; // Array of CD3D11EnumOutputInfo* + CGrowableArray deviceInfoList; // Array of CD3D11EnumDeviceInfo* + // List of CD3D11EnumDeviceSettingsCombo* with a unique set + // of BackBufferFormat, and Windowed + CGrowableArray deviceSettingsComboList; +}; + + +class CD3D11EnumOutputInfo +{ + const CD3D11EnumOutputInfo &operator = ( const CD3D11EnumOutputInfo &rhs ); + +public: + ~CD3D11EnumOutputInfo(); + + UINT AdapterOrdinal; + UINT Output; + IDXGIOutput* m_pOutput; + DXGI_OUTPUT_DESC Desc; + + CGrowableArray displayModeList; // Array of supported D3DDISPLAYMODEs +}; + + +//-------------------------------------------------------------------------------------- +// A class describing a Direct3D10 device that contains a +// unique supported driver type +//-------------------------------------------------------------------------------------- +class CD3D11EnumDeviceInfo +{ + const CD3D11EnumDeviceInfo& operator =( const CD3D11EnumDeviceInfo& rhs ); + +public: + ~CD3D11EnumDeviceInfo(); + + UINT AdapterOrdinal; + D3D_DRIVER_TYPE DeviceType; + D3D_FEATURE_LEVEL SelectedLevel; + D3D_FEATURE_LEVEL MaxLevel; + BOOL ComputeShaders_Plus_RawAndStructuredBuffers_Via_Shader_4_x; +}; + + +//-------------------------------------------------------------------------------------- +// A struct describing device settings that contains a unique combination of +// adapter format, back buffer format, and windowed that is compatible with a +// particular Direct3D device and the app. +//-------------------------------------------------------------------------------------- +struct CD3D11EnumDeviceSettingsCombo +{ + UINT AdapterOrdinal; + D3D_DRIVER_TYPE DeviceType; + DXGI_FORMAT BackBufferFormat; + BOOL Windowed; + UINT Output; + + CGrowableArray multiSampleCountList; // List of valid sampling counts (multisampling) + CGrowableArray multiSampleQualityList; // List of number of quality levels for each multisample count + + CD3D11EnumAdapterInfo* pAdapterInfo; + CD3D11EnumDeviceInfo* pDeviceInfo; + CD3D11EnumOutputInfo* pOutputInfo; +}; + +float DXUTRankD3D11DeviceCombo( CD3D11EnumDeviceSettingsCombo* pDeviceSettingsCombo, + DXUTD3D11DeviceSettings* pOptimalDeviceSettings, + DXGI_MODE_DESC* pAdapterDisplayMode, + int &bestModeIndex, + int &bestMSAAIndex + ); + + + + +#endif + + diff --git a/Demos/DX11ClothDemo/DXUT/Core/DXUTDevice9.cpp b/Demos/DX11ClothDemo/DXUT/Core/DXUTDevice9.cpp new file mode 100644 index 000000000..a1d12e38f --- /dev/null +++ b/Demos/DX11ClothDemo/DXUT/Core/DXUTDevice9.cpp @@ -0,0 +1,1177 @@ +//-------------------------------------------------------------------------------------- +// File: DXUTDevice9.cpp +// +// Enumerates D3D adapters, devices, modes, etc. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +//-------------------------------------------------------------------------------------- +#include "DXUT.h" +#undef min // use __min instead +#undef max // use __max instead + +//-------------------------------------------------------------------------------------- +// Forward declarations +//-------------------------------------------------------------------------------------- +extern void DXUTGetCallbackD3D9DeviceAcceptable( LPDXUTCALLBACKISD3D9DEVICEACCEPTABLE* ppCallbackIsDeviceAcceptable, void** ppUserContext ); + + + + +static int __cdecl SortModesCallback( const void* arg1, const void* arg2 ); + + +CD3D9Enumeration* g_pDXUTD3D9Enumeration = NULL; + +HRESULT WINAPI DXUTCreateD3D9Enumeration() +{ + if( g_pDXUTD3D9Enumeration == NULL ) + { + g_pDXUTD3D9Enumeration = new CD3D9Enumeration(); + if( NULL == g_pDXUTD3D9Enumeration ) + return E_OUTOFMEMORY; + } + return S_OK; +} + +void WINAPI DXUTDestroyD3D9Enumeration() +{ + SAFE_DELETE( g_pDXUTD3D9Enumeration ); +} + +class DXUTMemoryHelperD3D9Enum +{ +public: +DXUTMemoryHelperD3D9Enum() +{ + DXUTCreateD3D9Enumeration(); +} +~DXUTMemoryHelperD3D9Enum() +{ + DXUTDestroyD3D9Enumeration(); +} +}; + +//-------------------------------------------------------------------------------------- +CD3D9Enumeration* WINAPI DXUTGetD3D9Enumeration( bool bForceEnumerate ) +{ + // Using an static class with accessor function to allow control of the construction order + static DXUTMemoryHelperD3D9Enum d3d9enumMemory; + + if( g_pDXUTD3D9Enumeration && ( !g_pDXUTD3D9Enumeration->HasEnumerated() || bForceEnumerate ) ) + { + LPDXUTCALLBACKISD3D9DEVICEACCEPTABLE pCallbackIsDeviceAcceptable; + void* pUserContext; + DXUTGetCallbackD3D9DeviceAcceptable( &pCallbackIsDeviceAcceptable, &pUserContext ); + g_pDXUTD3D9Enumeration->Enumerate( pCallbackIsDeviceAcceptable, pUserContext ); + } + + return g_pDXUTD3D9Enumeration; +} + + +//-------------------------------------------------------------------------------------- +CD3D9Enumeration::CD3D9Enumeration() +{ + m_bHasEnumerated = false; + m_pD3D = NULL; + m_IsD3D9DeviceAcceptableFunc = NULL; + m_pIsD3D9DeviceAcceptableFuncUserContext = NULL; + m_bRequirePostPixelShaderBlending = true; + + m_nMinWidth = 640; + m_nMinHeight = 480; + m_nMaxWidth = UINT_MAX; + m_nMaxHeight = UINT_MAX; + + m_nRefreshMin = 0; + m_nRefreshMax = UINT_MAX; + + m_nMultisampleQualityMax = 0xFFFF; + + ResetPossibleDepthStencilFormats(); + ResetPossibleMultisampleTypeList(); + ResetPossiblePresentIntervalList(); + SetPossibleVertexProcessingList( true, true, true, false ); +} + + +//-------------------------------------------------------------------------------------- +CD3D9Enumeration::~CD3D9Enumeration() +{ + ClearAdapterInfoList(); +} + + + +//-------------------------------------------------------------------------------------- +// Enumerate for each adapter all of the supported display modes, +// device types, adapter formats, back buffer formats, window/full screen support, +// depth stencil formats, multisampling types/qualities, and presentations intervals. +// +// For each combination of device type (HAL/REF), adapter format, back buffer format, and +// IsWindowed it will call the app's ConfirmDevice callback. This allows the app +// to reject or allow that combination based on its caps/etc. It also allows the +// app to change the BehaviorFlags. The BehaviorFlags defaults non-pure HWVP +// if supported otherwise it will default to SWVP, however the app can change this +// through the ConfirmDevice callback. +//-------------------------------------------------------------------------------------- +HRESULT CD3D9Enumeration::Enumerate( LPDXUTCALLBACKISD3D9DEVICEACCEPTABLE IsD3D9DeviceAcceptableFunc, + void* pIsD3D9DeviceAcceptableFuncUserContext ) +{ + CDXUTPerfEventGenerator eventGenerator( DXUT_PERFEVENTCOLOR, L"DXUT D3D9 Enumeration" ); + IDirect3D9* pD3D = DXUTGetD3D9Object(); + if( pD3D == NULL ) + { + pD3D = DXUTGetD3D9Object(); + if( pD3D == NULL ) + return DXUTERR_NODIRECT3D; + } + + m_bHasEnumerated = true; + m_pD3D = pD3D; + m_IsD3D9DeviceAcceptableFunc = IsD3D9DeviceAcceptableFunc; + m_pIsD3D9DeviceAcceptableFuncUserContext = pIsD3D9DeviceAcceptableFuncUserContext; + + HRESULT hr; + ClearAdapterInfoList(); + CGrowableArray adapterFormatList; + + const D3DFORMAT allowedAdapterFormatArray[] = + { + D3DFMT_X8R8G8B8, + D3DFMT_X1R5G5B5, + D3DFMT_R5G6B5, + D3DFMT_A2R10G10B10 + }; + const UINT allowedAdapterFormatArrayCount = sizeof( allowedAdapterFormatArray ) / sizeof + ( allowedAdapterFormatArray[0] ); + + UINT numAdapters = pD3D->GetAdapterCount(); + for( UINT adapterOrdinal = 0; adapterOrdinal < numAdapters; adapterOrdinal++ ) + { + CD3D9EnumAdapterInfo* pAdapterInfo = new CD3D9EnumAdapterInfo; + if( pAdapterInfo == NULL ) + return E_OUTOFMEMORY; + + pAdapterInfo->AdapterOrdinal = adapterOrdinal; + pD3D->GetAdapterIdentifier( adapterOrdinal, 0, &pAdapterInfo->AdapterIdentifier ); + + // Get list of all display modes on this adapter. + // Also build a temporary list of all display adapter formats. + adapterFormatList.RemoveAll(); + + for( UINT iFormatList = 0; iFormatList < allowedAdapterFormatArrayCount; iFormatList++ ) + { + D3DFORMAT allowedAdapterFormat = allowedAdapterFormatArray[iFormatList]; + UINT numAdapterModes = pD3D->GetAdapterModeCount( adapterOrdinal, allowedAdapterFormat ); + for( UINT mode = 0; mode < numAdapterModes; mode++ ) + { + D3DDISPLAYMODE displayMode; + pD3D->EnumAdapterModes( adapterOrdinal, allowedAdapterFormat, mode, &displayMode ); + + if( displayMode.Width < m_nMinWidth || + displayMode.Height < m_nMinHeight || + displayMode.Width > m_nMaxWidth || + displayMode.Height > m_nMaxHeight || + displayMode.RefreshRate < m_nRefreshMin || + displayMode.RefreshRate > m_nRefreshMax ) + { + continue; + } + + pAdapterInfo->displayModeList.Add( displayMode ); + + if( !adapterFormatList.Contains( displayMode.Format ) ) + adapterFormatList.Add( displayMode.Format ); + } + + } + + D3DDISPLAYMODE displayMode; + pD3D->GetAdapterDisplayMode( adapterOrdinal, &displayMode ); + if( !adapterFormatList.Contains( displayMode.Format ) ) + adapterFormatList.Add( displayMode.Format ); + + // Sort displaymode list + qsort( pAdapterInfo->displayModeList.GetData(), + pAdapterInfo->displayModeList.GetSize(), sizeof( D3DDISPLAYMODE ), + SortModesCallback ); + + // Get info for each device on this adapter + if( FAILED( EnumerateDevices( pAdapterInfo, &adapterFormatList ) ) ) + { + delete pAdapterInfo; + continue; + } + + // If at least one device on this adapter is available and compatible + // with the app, add the adapterInfo to the list + if( pAdapterInfo->deviceInfoList.GetSize() > 0 ) + { + hr = m_AdapterInfoList.Add( pAdapterInfo ); + if( FAILED( hr ) ) + return hr; + } + else + delete pAdapterInfo; + } + + // + // Check for 2 or more adapters with the same name. Append the name + // with some instance number if that's the case to help distinguish + // them. + // + bool bUniqueDesc = true; + CD3D9EnumAdapterInfo* pAdapterInfo; + for( int i = 0; i < m_AdapterInfoList.GetSize(); i++ ) + { + CD3D9EnumAdapterInfo* pAdapterInfo1 = m_AdapterInfoList.GetAt( i ); + + for( int j = i + 1; j < m_AdapterInfoList.GetSize(); j++ ) + { + CD3D9EnumAdapterInfo* pAdapterInfo2 = m_AdapterInfoList.GetAt( j ); + if( _stricmp( pAdapterInfo1->AdapterIdentifier.Description, + pAdapterInfo2->AdapterIdentifier.Description ) == 0 ) + { + bUniqueDesc = false; + break; + } + } + + if( !bUniqueDesc ) + break; + } + + for( int i = 0; i < m_AdapterInfoList.GetSize(); i++ ) + { + pAdapterInfo = m_AdapterInfoList.GetAt( i ); + + MultiByteToWideChar( CP_ACP, 0, + pAdapterInfo->AdapterIdentifier.Description, -1, + pAdapterInfo->szUniqueDescription, 100 ); + pAdapterInfo->szUniqueDescription[100] = 0; + + if( !bUniqueDesc ) + { + WCHAR sz[100]; + swprintf_s( sz, 100, L" (#%d)", pAdapterInfo->AdapterOrdinal ); + wcscat_s( pAdapterInfo->szUniqueDescription, 256, sz ); + + } + } + + return S_OK; +} + + + +//-------------------------------------------------------------------------------------- +// Enumerates D3D devices for a particular adapter. +//-------------------------------------------------------------------------------------- +HRESULT CD3D9Enumeration::EnumerateDevices( CD3D9EnumAdapterInfo* pAdapterInfo, + CGrowableArray * pAdapterFormatList ) +{ + HRESULT hr; + + const D3DDEVTYPE devTypeArray[] = + { + D3DDEVTYPE_HAL, + D3DDEVTYPE_SW, + D3DDEVTYPE_REF + }; + const UINT devTypeArrayCount = sizeof( devTypeArray ) / sizeof( devTypeArray[0] ); + + // Enumerate each Direct3D device type + for( UINT iDeviceType = 0; iDeviceType < devTypeArrayCount; iDeviceType++ ) + { + CD3D9EnumDeviceInfo* pDeviceInfo = new CD3D9EnumDeviceInfo; + if( pDeviceInfo == NULL ) + return E_OUTOFMEMORY; + + // Fill struct w/ AdapterOrdinal and D3DDEVTYPE + pDeviceInfo->AdapterOrdinal = pAdapterInfo->AdapterOrdinal; + pDeviceInfo->DeviceType = devTypeArray[iDeviceType]; + + // Store device caps + if( FAILED( hr = m_pD3D->GetDeviceCaps( pAdapterInfo->AdapterOrdinal, pDeviceInfo->DeviceType, + &pDeviceInfo->Caps ) ) ) + { + delete pDeviceInfo; + continue; + } + + if( pDeviceInfo->DeviceType != D3DDEVTYPE_HAL ) + { + // Create a temp device to verify that it is really possible to create a REF device + // [the developer DirectX redist has to be installed] + D3DDISPLAYMODE Mode; + m_pD3D->GetAdapterDisplayMode( 0, &Mode ); + D3DPRESENT_PARAMETERS pp; + ZeroMemory( &pp, sizeof( D3DPRESENT_PARAMETERS ) ); + pp.BackBufferWidth = 1; + pp.BackBufferHeight = 1; + pp.BackBufferFormat = Mode.Format; + pp.BackBufferCount = 1; + pp.SwapEffect = D3DSWAPEFFECT_COPY; + pp.Windowed = TRUE; + pp.hDeviceWindow = DXUTGetHWNDFocus(); + IDirect3DDevice9* pDevice = NULL; + if( FAILED( hr = m_pD3D->CreateDevice( pAdapterInfo->AdapterOrdinal, pDeviceInfo->DeviceType, + DXUTGetHWNDFocus(), + D3DCREATE_HARDWARE_VERTEXPROCESSING | D3DCREATE_FPU_PRESERVE, &pp, + &pDevice ) ) ) + { + delete pDeviceInfo; + continue; + } + SAFE_RELEASE( pDevice ); + } + + // Get info for each devicecombo on this device + if( FAILED( hr = EnumerateDeviceCombos( pAdapterInfo, pDeviceInfo, pAdapterFormatList ) ) ) + { + delete pDeviceInfo; + continue; + } + + // If at least one devicecombo for this device is found, + // add the deviceInfo to the list + if( pDeviceInfo->deviceSettingsComboList.GetSize() > 0 ) + pAdapterInfo->deviceInfoList.Add( pDeviceInfo ); + else + delete pDeviceInfo; + } + + return S_OK; +} + + + +//-------------------------------------------------------------------------------------- +// Enumerates DeviceCombos for a particular device. +//-------------------------------------------------------------------------------------- +HRESULT CD3D9Enumeration::EnumerateDeviceCombos( CD3D9EnumAdapterInfo* pAdapterInfo, CD3D9EnumDeviceInfo* pDeviceInfo, + CGrowableArray * pAdapterFormatList ) +{ + const D3DFORMAT backBufferFormatArray[] = + { + D3DFMT_A8R8G8B8, + D3DFMT_X8R8G8B8, + D3DFMT_A2R10G10B10, + D3DFMT_R5G6B5, + D3DFMT_A1R5G5B5, + D3DFMT_X1R5G5B5 + }; + const UINT backBufferFormatArrayCount = sizeof( backBufferFormatArray ) / sizeof( backBufferFormatArray[0] ); + + // See which adapter formats are supported by this device + for( int iFormat = 0; iFormat < pAdapterFormatList->GetSize(); iFormat++ ) + { + D3DFORMAT adapterFormat = pAdapterFormatList->GetAt( iFormat ); + + for( UINT iBackBufferFormat = 0; iBackBufferFormat < backBufferFormatArrayCount; iBackBufferFormat++ ) + { + D3DFORMAT backBufferFormat = backBufferFormatArray[iBackBufferFormat]; + + for( int nWindowed = 0; nWindowed < 2; nWindowed++ ) + { + if( !nWindowed && pAdapterInfo->displayModeList.GetSize() == 0 ) + continue; + + if( FAILED( m_pD3D->CheckDeviceType( pAdapterInfo->AdapterOrdinal, pDeviceInfo->DeviceType, + adapterFormat, backBufferFormat, nWindowed ) ) ) + { + continue; + } + + if( m_bRequirePostPixelShaderBlending ) + { + // If the backbuffer format doesn't support D3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING + // then alpha test, pixel fog, render-target blending, color write enable, and dithering. + // are not supported. + if( FAILED( m_pD3D->CheckDeviceFormat( pAdapterInfo->AdapterOrdinal, pDeviceInfo->DeviceType, + adapterFormat, D3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING, + D3DRTYPE_TEXTURE, backBufferFormat ) ) ) + { + continue; + } + } + + // If an application callback function has been provided, make sure this device + // is acceptable to the app. + if( m_IsD3D9DeviceAcceptableFunc != NULL ) + { + if( !m_IsD3D9DeviceAcceptableFunc( &pDeviceInfo->Caps, adapterFormat, backBufferFormat, + FALSE != nWindowed, m_pIsD3D9DeviceAcceptableFuncUserContext ) ) + continue; + } + + // At this point, we have an adapter/device/adapterformat/backbufferformat/iswindowed + // DeviceCombo that is supported by the system and acceptable to the app. We still + // need to find one or more suitable depth/stencil buffer format, + // multisample type, and present interval. + CD3D9EnumDeviceSettingsCombo* pDeviceCombo = new CD3D9EnumDeviceSettingsCombo; + if( pDeviceCombo == NULL ) + return E_OUTOFMEMORY; + + pDeviceCombo->AdapterOrdinal = pAdapterInfo->AdapterOrdinal; + pDeviceCombo->DeviceType = pDeviceInfo->DeviceType; + pDeviceCombo->AdapterFormat = adapterFormat; + pDeviceCombo->BackBufferFormat = backBufferFormat; + pDeviceCombo->Windowed = ( nWindowed != 0 ); + + BuildDepthStencilFormatList( pDeviceCombo ); + BuildMultiSampleTypeList( pDeviceCombo ); + if( pDeviceCombo->multiSampleTypeList.GetSize() == 0 ) + { + delete pDeviceCombo; + continue; + } + BuildDSMSConflictList( pDeviceCombo ); + BuildPresentIntervalList( pDeviceInfo, pDeviceCombo ); + pDeviceCombo->pAdapterInfo = pAdapterInfo; + pDeviceCombo->pDeviceInfo = pDeviceInfo; + + if( FAILED( pDeviceInfo->deviceSettingsComboList.Add( pDeviceCombo ) ) ) + delete pDeviceCombo; + } + } + } + + return S_OK; +} + + + +//-------------------------------------------------------------------------------------- +// Adds all depth/stencil formats that are compatible with the device +// and app to the given D3DDeviceCombo. +//-------------------------------------------------------------------------------------- +void CD3D9Enumeration::BuildDepthStencilFormatList( CD3D9EnumDeviceSettingsCombo* pDeviceCombo ) +{ + D3DFORMAT depthStencilFmt; + for( int idsf = 0; idsf < m_DepthStencilPossibleList.GetSize(); idsf++ ) + { + depthStencilFmt = m_DepthStencilPossibleList.GetAt( idsf ); + if( SUCCEEDED( m_pD3D->CheckDeviceFormat( pDeviceCombo->AdapterOrdinal, + pDeviceCombo->DeviceType, pDeviceCombo->AdapterFormat, + D3DUSAGE_DEPTHSTENCIL, D3DRTYPE_SURFACE, depthStencilFmt ) ) ) + { + if( SUCCEEDED( m_pD3D->CheckDepthStencilMatch( pDeviceCombo->AdapterOrdinal, + pDeviceCombo->DeviceType, pDeviceCombo->AdapterFormat, + pDeviceCombo->BackBufferFormat, depthStencilFmt ) ) ) + { + pDeviceCombo->depthStencilFormatList.Add( depthStencilFmt ); + } + } + } +} + + + + +//-------------------------------------------------------------------------------------- +// Adds all multisample types that are compatible with the device and app to +// the given D3DDeviceCombo. +//-------------------------------------------------------------------------------------- +void CD3D9Enumeration::BuildMultiSampleTypeList( CD3D9EnumDeviceSettingsCombo* pDeviceCombo ) +{ + D3DMULTISAMPLE_TYPE msType; + DWORD msQuality; + for( int imst = 0; imst < m_MultiSampleTypeList.GetSize(); imst++ ) + { + msType = m_MultiSampleTypeList.GetAt( imst ); + if( SUCCEEDED( m_pD3D->CheckDeviceMultiSampleType( pDeviceCombo->AdapterOrdinal, + pDeviceCombo->DeviceType, pDeviceCombo->BackBufferFormat, + pDeviceCombo->Windowed, msType, &msQuality ) ) ) + { + pDeviceCombo->multiSampleTypeList.Add( msType ); + if( msQuality > m_nMultisampleQualityMax + 1 ) + msQuality = m_nMultisampleQualityMax + 1; + pDeviceCombo->multiSampleQualityList.Add( msQuality ); + } + } +} + + + + +//-------------------------------------------------------------------------------------- +// Find any conflicts between the available depth/stencil formats and +// multisample types. +//-------------------------------------------------------------------------------------- +void CD3D9Enumeration::BuildDSMSConflictList( CD3D9EnumDeviceSettingsCombo* pDeviceCombo ) +{ + CD3D9EnumDSMSConflict DSMSConflict; + + for( int iDS = 0; iDS < pDeviceCombo->depthStencilFormatList.GetSize(); iDS++ ) + { + D3DFORMAT dsFmt = pDeviceCombo->depthStencilFormatList.GetAt( iDS ); + + for( int iMS = 0; iMS < pDeviceCombo->multiSampleTypeList.GetSize(); iMS++ ) + { + D3DMULTISAMPLE_TYPE msType = pDeviceCombo->multiSampleTypeList.GetAt( iMS ); + + if( FAILED( m_pD3D->CheckDeviceMultiSampleType( pDeviceCombo->AdapterOrdinal, pDeviceCombo->DeviceType, + dsFmt, pDeviceCombo->Windowed, msType, NULL ) ) ) + { + DSMSConflict.DSFormat = dsFmt; + DSMSConflict.MSType = msType; + pDeviceCombo->DSMSConflictList.Add( DSMSConflict ); + } + } + } +} + + +//-------------------------------------------------------------------------------------- +// Adds all present intervals that are compatible with the device and app +// to the given D3DDeviceCombo. +//-------------------------------------------------------------------------------------- +void CD3D9Enumeration::BuildPresentIntervalList( CD3D9EnumDeviceInfo* pDeviceInfo, + CD3D9EnumDeviceSettingsCombo* pDeviceCombo ) +{ + UINT pi; + for( int ipi = 0; ipi < m_PresentIntervalList.GetSize(); ipi++ ) + { + pi = m_PresentIntervalList.GetAt( ipi ); + if( pDeviceCombo->Windowed ) + { + if( pi == D3DPRESENT_INTERVAL_TWO || + pi == D3DPRESENT_INTERVAL_THREE || + pi == D3DPRESENT_INTERVAL_FOUR ) + { + // These intervals are not supported in windowed mode. + continue; + } + } + // Note that D3DPRESENT_INTERVAL_DEFAULT is zero, so you + // can't do a caps check for it -- it is always available. + if( pi == D3DPRESENT_INTERVAL_DEFAULT || + ( pDeviceInfo->Caps.PresentationIntervals & pi ) ) + { + pDeviceCombo->presentIntervalList.Add( pi ); + } + } +} + + + +//-------------------------------------------------------------------------------------- +// Release all the allocated CD3D9EnumAdapterInfo objects and empty the list +//-------------------------------------------------------------------------------------- +void CD3D9Enumeration::ClearAdapterInfoList() +{ + CD3D9EnumAdapterInfo* pAdapterInfo; + for( int i = 0; i < m_AdapterInfoList.GetSize(); i++ ) + { + pAdapterInfo = m_AdapterInfoList.GetAt( i ); + delete pAdapterInfo; + } + + m_AdapterInfoList.RemoveAll(); +} + + + +//-------------------------------------------------------------------------------------- +// Call GetAdapterInfoList() after Enumerate() to get a STL vector of +// CD3D9EnumAdapterInfo* +//-------------------------------------------------------------------------------------- +CGrowableArray * CD3D9Enumeration::GetAdapterInfoList() +{ + return &m_AdapterInfoList; +} + + + +//-------------------------------------------------------------------------------------- +CD3D9EnumAdapterInfo* CD3D9Enumeration::GetAdapterInfo( UINT AdapterOrdinal ) +{ + for( int iAdapter = 0; iAdapter < m_AdapterInfoList.GetSize(); iAdapter++ ) + { + CD3D9EnumAdapterInfo* pAdapterInfo = m_AdapterInfoList.GetAt( iAdapter ); + if( pAdapterInfo->AdapterOrdinal == AdapterOrdinal ) + return pAdapterInfo; + } + + return NULL; +} + + +//-------------------------------------------------------------------------------------- +CD3D9EnumDeviceInfo* CD3D9Enumeration::GetDeviceInfo( UINT AdapterOrdinal, D3DDEVTYPE DeviceType ) +{ + CD3D9EnumAdapterInfo* pAdapterInfo = GetAdapterInfo( AdapterOrdinal ); + if( pAdapterInfo ) + { + for( int iDeviceInfo = 0; iDeviceInfo < pAdapterInfo->deviceInfoList.GetSize(); iDeviceInfo++ ) + { + CD3D9EnumDeviceInfo* pDeviceInfo = pAdapterInfo->deviceInfoList.GetAt( iDeviceInfo ); + if( pDeviceInfo->DeviceType == DeviceType ) + return pDeviceInfo; + } + } + + return NULL; +} + + +//-------------------------------------------------------------------------------------- +// +//-------------------------------------------------------------------------------------- +CD3D9EnumDeviceSettingsCombo* CD3D9Enumeration::GetDeviceSettingsCombo( UINT AdapterOrdinal, D3DDEVTYPE DeviceType, + D3DFORMAT AdapterFormat, + D3DFORMAT BackBufferFormat, BOOL bWindowed ) +{ + CD3D9EnumDeviceInfo* pDeviceInfo = GetDeviceInfo( AdapterOrdinal, DeviceType ); + if( pDeviceInfo ) + { + for( int iDeviceCombo = 0; iDeviceCombo < pDeviceInfo->deviceSettingsComboList.GetSize(); iDeviceCombo++ ) + { + CD3D9EnumDeviceSettingsCombo* pDeviceSettingsCombo = pDeviceInfo->deviceSettingsComboList.GetAt( + iDeviceCombo ); + if( pDeviceSettingsCombo->AdapterFormat == AdapterFormat && + pDeviceSettingsCombo->BackBufferFormat == BackBufferFormat && + pDeviceSettingsCombo->Windowed == bWindowed ) + return pDeviceSettingsCombo; + } + } + + return NULL; +} + + +//-------------------------------------------------------------------------------------- +// Returns the number of color channel bits in the specified D3DFORMAT +//-------------------------------------------------------------------------------------- +UINT WINAPI DXUTGetD3D9ColorChannelBits( D3DFORMAT fmt ) +{ + switch( fmt ) + { + case D3DFMT_R8G8B8: + return 8; + case D3DFMT_A8R8G8B8: + return 8; + case D3DFMT_X8R8G8B8: + return 8; + case D3DFMT_R5G6B5: + return 5; + case D3DFMT_X1R5G5B5: + return 5; + case D3DFMT_A1R5G5B5: + return 5; + case D3DFMT_A4R4G4B4: + return 4; + case D3DFMT_R3G3B2: + return 2; + case D3DFMT_A8R3G3B2: + return 2; + case D3DFMT_X4R4G4B4: + return 4; + case D3DFMT_A2B10G10R10: + return 10; + case D3DFMT_A8B8G8R8: + return 8; + case D3DFMT_A2R10G10B10: + return 10; + case D3DFMT_A16B16G16R16: + return 16; + default: + return 0; + } +} + + +//-------------------------------------------------------------------------------------- +// Returns the number of alpha channel bits in the specified D3DFORMAT +//-------------------------------------------------------------------------------------- +UINT WINAPI DXUTGetAlphaChannelBits( D3DFORMAT fmt ) +{ + switch( fmt ) + { + case D3DFMT_R8G8B8: + return 0; + case D3DFMT_A8R8G8B8: + return 8; + case D3DFMT_X8R8G8B8: + return 0; + case D3DFMT_R5G6B5: + return 0; + case D3DFMT_X1R5G5B5: + return 0; + case D3DFMT_A1R5G5B5: + return 1; + case D3DFMT_A4R4G4B4: + return 4; + case D3DFMT_R3G3B2: + return 0; + case D3DFMT_A8R3G3B2: + return 8; + case D3DFMT_X4R4G4B4: + return 0; + case D3DFMT_A2B10G10R10: + return 2; + case D3DFMT_A8B8G8R8: + return 8; + case D3DFMT_A2R10G10B10: + return 2; + case D3DFMT_A16B16G16R16: + return 16; + default: + return 0; + } +} + + +//-------------------------------------------------------------------------------------- +// Returns the number of depth bits in the specified D3DFORMAT +//-------------------------------------------------------------------------------------- +UINT WINAPI DXUTGetDepthBits( D3DFORMAT fmt ) +{ + switch( fmt ) + { + case D3DFMT_D32F_LOCKABLE: + case D3DFMT_D32: + return 32; + + case D3DFMT_D24X8: + case D3DFMT_D24S8: + case D3DFMT_D24X4S4: + case D3DFMT_D24FS8: + return 24; + + case D3DFMT_D16_LOCKABLE: + case D3DFMT_D16: + return 16; + + case D3DFMT_D15S1: + return 15; + + default: + return 0; + } +} + + + + +//-------------------------------------------------------------------------------------- +// Returns the number of stencil bits in the specified D3DFORMAT +//-------------------------------------------------------------------------------------- +UINT WINAPI DXUTGetStencilBits( D3DFORMAT fmt ) +{ + switch( fmt ) + { + case D3DFMT_D16_LOCKABLE: + case D3DFMT_D16: + case D3DFMT_D32F_LOCKABLE: + case D3DFMT_D32: + case D3DFMT_D24X8: + return 0; + + case D3DFMT_D15S1: + return 1; + + case D3DFMT_D24X4S4: + return 4; + + case D3DFMT_D24S8: + case D3DFMT_D24FS8: + return 8; + + default: + return 0; + } +} + + + +//-------------------------------------------------------------------------------------- +// Used to sort D3DDISPLAYMODEs +//-------------------------------------------------------------------------------------- +static int __cdecl SortModesCallback( const void* arg1, const void* arg2 ) +{ + D3DDISPLAYMODE* pdm1 = ( D3DDISPLAYMODE* )arg1; + D3DDISPLAYMODE* pdm2 = ( D3DDISPLAYMODE* )arg2; + + if( pdm1->Width > pdm2->Width ) + return 1; + if( pdm1->Width < pdm2->Width ) + return -1; + if( pdm1->Height > pdm2->Height ) + return 1; + if( pdm1->Height < pdm2->Height ) + return -1; + if( pdm1->Format > pdm2->Format ) + return 1; + if( pdm1->Format < pdm2->Format ) + return -1; + if( pdm1->RefreshRate > pdm2->RefreshRate ) + return 1; + if( pdm1->RefreshRate < pdm2->RefreshRate ) + return -1; + return 0; +} + + + +//-------------------------------------------------------------------------------------- +CD3D9EnumAdapterInfo::~CD3D9EnumAdapterInfo( void ) +{ + CD3D9EnumDeviceInfo* pDeviceInfo; + for( int i = 0; i < deviceInfoList.GetSize(); i++ ) + { + pDeviceInfo = deviceInfoList.GetAt( i ); + delete pDeviceInfo; + } + deviceInfoList.RemoveAll(); +} + + + + +//-------------------------------------------------------------------------------------- +CD3D9EnumDeviceInfo::~CD3D9EnumDeviceInfo( void ) +{ + CD3D9EnumDeviceSettingsCombo* pDeviceCombo; + for( int i = 0; i < deviceSettingsComboList.GetSize(); i++ ) + { + pDeviceCombo = deviceSettingsComboList.GetAt( i ); + delete pDeviceCombo; + } + deviceSettingsComboList.RemoveAll(); +} + + +//-------------------------------------------------------------------------------------- +void CD3D9Enumeration::ResetPossibleDepthStencilFormats() +{ + m_DepthStencilPossibleList.RemoveAll(); + m_DepthStencilPossibleList.Add( D3DFMT_D16 ); + m_DepthStencilPossibleList.Add( D3DFMT_D15S1 ); + m_DepthStencilPossibleList.Add( D3DFMT_D24X8 ); + m_DepthStencilPossibleList.Add( D3DFMT_D24S8 ); + m_DepthStencilPossibleList.Add( D3DFMT_D24X4S4 ); + m_DepthStencilPossibleList.Add( D3DFMT_D32 ); +} + + +//-------------------------------------------------------------------------------------- +CGrowableArray * CD3D9Enumeration::GetPossibleDepthStencilFormatList() +{ + return &m_DepthStencilPossibleList; +} + + +//-------------------------------------------------------------------------------------- +CGrowableArray * CD3D9Enumeration::GetPossibleMultisampleTypeList() +{ + return &m_MultiSampleTypeList; +} + + +//-------------------------------------------------------------------------------------- +void CD3D9Enumeration::ResetPossibleMultisampleTypeList() +{ + m_MultiSampleTypeList.RemoveAll(); + m_MultiSampleTypeList.Add( D3DMULTISAMPLE_NONE ); + m_MultiSampleTypeList.Add( D3DMULTISAMPLE_NONMASKABLE ); + m_MultiSampleTypeList.Add( D3DMULTISAMPLE_2_SAMPLES ); + m_MultiSampleTypeList.Add( D3DMULTISAMPLE_3_SAMPLES ); + m_MultiSampleTypeList.Add( D3DMULTISAMPLE_4_SAMPLES ); + m_MultiSampleTypeList.Add( D3DMULTISAMPLE_5_SAMPLES ); + m_MultiSampleTypeList.Add( D3DMULTISAMPLE_6_SAMPLES ); + m_MultiSampleTypeList.Add( D3DMULTISAMPLE_7_SAMPLES ); + m_MultiSampleTypeList.Add( D3DMULTISAMPLE_8_SAMPLES ); + m_MultiSampleTypeList.Add( D3DMULTISAMPLE_9_SAMPLES ); + m_MultiSampleTypeList.Add( D3DMULTISAMPLE_10_SAMPLES ); + m_MultiSampleTypeList.Add( D3DMULTISAMPLE_11_SAMPLES ); + m_MultiSampleTypeList.Add( D3DMULTISAMPLE_12_SAMPLES ); + m_MultiSampleTypeList.Add( D3DMULTISAMPLE_13_SAMPLES ); + m_MultiSampleTypeList.Add( D3DMULTISAMPLE_14_SAMPLES ); + m_MultiSampleTypeList.Add( D3DMULTISAMPLE_15_SAMPLES ); + m_MultiSampleTypeList.Add( D3DMULTISAMPLE_16_SAMPLES ); +} + + +//-------------------------------------------------------------------------------------- +void CD3D9Enumeration::GetPossibleVertexProcessingList( bool* pbSoftwareVP, bool* pbHardwareVP, bool* pbPureHarewareVP, + bool* pbMixedVP ) +{ + *pbSoftwareVP = m_bSoftwareVP; + *pbHardwareVP = m_bHardwareVP; + *pbPureHarewareVP = m_bPureHarewareVP; + *pbMixedVP = m_bMixedVP; +} + + +//-------------------------------------------------------------------------------------- +void CD3D9Enumeration::SetPossibleVertexProcessingList( bool bSoftwareVP, bool bHardwareVP, bool bPureHarewareVP, + bool bMixedVP ) +{ + m_bSoftwareVP = bSoftwareVP; + m_bHardwareVP = bHardwareVP; + m_bPureHarewareVP = bPureHarewareVP; + m_bMixedVP = bMixedVP; +} + + +//-------------------------------------------------------------------------------------- +CGrowableArray * CD3D9Enumeration::GetPossiblePresentIntervalList() +{ + return &m_PresentIntervalList; +} + + +//-------------------------------------------------------------------------------------- +void CD3D9Enumeration::ResetPossiblePresentIntervalList() +{ + m_PresentIntervalList.RemoveAll(); + m_PresentIntervalList.Add( D3DPRESENT_INTERVAL_IMMEDIATE ); + m_PresentIntervalList.Add( D3DPRESENT_INTERVAL_DEFAULT ); + m_PresentIntervalList.Add( D3DPRESENT_INTERVAL_ONE ); + m_PresentIntervalList.Add( D3DPRESENT_INTERVAL_TWO ); + m_PresentIntervalList.Add( D3DPRESENT_INTERVAL_THREE ); + m_PresentIntervalList.Add( D3DPRESENT_INTERVAL_FOUR ); +} + + +//-------------------------------------------------------------------------------------- +void CD3D9Enumeration::SetResolutionMinMax( UINT nMinWidth, UINT nMinHeight, + UINT nMaxWidth, UINT nMaxHeight ) +{ + m_nMinWidth = nMinWidth; + m_nMinHeight = nMinHeight; + m_nMaxWidth = nMaxWidth; + m_nMaxHeight = nMaxHeight; +} + + +//-------------------------------------------------------------------------------------- +void CD3D9Enumeration::SetRefreshMinMax( UINT nMin, UINT nMax ) +{ + m_nRefreshMin = nMin; + m_nRefreshMax = nMax; +} + + +//-------------------------------------------------------------------------------------- +void CD3D9Enumeration::SetMultisampleQualityMax( UINT nMax ) +{ + if( nMax > 0xFFFF ) + nMax = 0xFFFF; + m_nMultisampleQualityMax = nMax; +} + + + +//-------------------------------------------------------------------------------------- +// Returns a ranking number that describes how closely this device +// combo matches the optimal combo based on the match options and the optimal device settings +//-------------------------------------------------------------------------------------- +float DXUTRankD3D9DeviceCombo( CD3D9EnumDeviceSettingsCombo* pDeviceSettingsCombo, + DXUTD3D9DeviceSettings* pOptimalDeviceSettings, + D3DDISPLAYMODE* pAdapterDesktopDisplayMode, + int &bestModeIndex, + int &bestMSAAIndex + ) +{ + float fCurRanking = 0.0f; + + // Arbitrary weights. Gives preference to the ordinal, device type, and windowed + const float fAdapterOrdinalWeight = 1000.0f; + const float fDeviceTypeWeight = 100.0f; + const float fWindowWeight = 10.0f; + const float fAdapterFormatWeight = 1.0f; + const float fVertexProcessingWeight = 1.0f; + const float fResolutionWeight = 1.0f; + const float fBackBufferFormatWeight = 1.0f; + const float fMultiSampleWeight = 1.0f; + const float fDepthStencilWeight = 1.0f; + const float fRefreshRateWeight = 1.0f; + const float fPresentIntervalWeight = 1.0f; + + //--------------------- + // Adapter ordinal + //--------------------- + if( pDeviceSettingsCombo->AdapterOrdinal == pOptimalDeviceSettings->AdapterOrdinal ) + fCurRanking += fAdapterOrdinalWeight; + + //--------------------- + // Device type + //--------------------- + if( pDeviceSettingsCombo->DeviceType == pOptimalDeviceSettings->DeviceType ) + fCurRanking += fDeviceTypeWeight; + // Slightly prefer HAL + if( pDeviceSettingsCombo->DeviceType == D3DDEVTYPE_HAL ) + fCurRanking += 0.1f; + + //--------------------- + // Windowed + //--------------------- + if( pDeviceSettingsCombo->Windowed == pOptimalDeviceSettings->pp.Windowed ) + fCurRanking += fWindowWeight; + + //--------------------- + // Adapter format + //--------------------- + if( pDeviceSettingsCombo->AdapterFormat == pOptimalDeviceSettings->AdapterFormat ) + { + fCurRanking += fAdapterFormatWeight; + } + else + { + int nBitDepthDelta = abs( ( long )DXUTGetD3D9ColorChannelBits( pDeviceSettingsCombo->AdapterFormat ) - + ( long )DXUTGetD3D9ColorChannelBits( pOptimalDeviceSettings->AdapterFormat ) ); + float fScale = __max( 0.9f - ( float )nBitDepthDelta * 0.2f, 0.0f ); + fCurRanking += fScale * fAdapterFormatWeight; + } + + if( !pDeviceSettingsCombo->Windowed ) + { + // Slightly prefer when it matches the desktop format or is D3DFMT_X8R8G8B8 + bool bAdapterOptimalMatch; + if( DXUTGetD3D9ColorChannelBits( pAdapterDesktopDisplayMode->Format ) >= 8 ) + bAdapterOptimalMatch = ( pDeviceSettingsCombo->AdapterFormat == pAdapterDesktopDisplayMode->Format ); + else + bAdapterOptimalMatch = ( pDeviceSettingsCombo->AdapterFormat == D3DFMT_X8R8G8B8 ); + + if( bAdapterOptimalMatch ) + fCurRanking += 0.1f; + } + + //--------------------- + // Vertex processing + //--------------------- + if( ( pOptimalDeviceSettings->BehaviorFlags & D3DCREATE_HARDWARE_VERTEXPROCESSING ) != 0 || + ( pOptimalDeviceSettings->BehaviorFlags & D3DCREATE_MIXED_VERTEXPROCESSING ) != 0 ) + { + if( ( pDeviceSettingsCombo->pDeviceInfo->Caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT ) != 0 ) + fCurRanking += fVertexProcessingWeight; + } + // Slightly prefer HW T&L + if( ( pDeviceSettingsCombo->pDeviceInfo->Caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT ) != 0 ) + fCurRanking += 0.1f; + + //--------------------- + // Resolution + //--------------------- + bool bResolutionFound = false; + unsigned int best = 0xffffffff; + bestModeIndex=0; + + + + + + for( int idm = 0; idm < pDeviceSettingsCombo->pAdapterInfo->displayModeList.GetSize(); idm++ ) + { + D3DDISPLAYMODE displayMode = pDeviceSettingsCombo->pAdapterInfo->displayModeList.GetAt( idm ); + if( displayMode.Format != pDeviceSettingsCombo->AdapterFormat ) + continue; + if( displayMode.Width == pOptimalDeviceSettings->pp.BackBufferWidth && + displayMode.Height == pOptimalDeviceSettings->pp.BackBufferHeight ) + bResolutionFound = true; + + unsigned int current = + (UINT) abs ((int)displayMode.Width - (int)pOptimalDeviceSettings->pp.BackBufferWidth) + + (UINT) abs ((int)displayMode.Height - (int)pOptimalDeviceSettings->pp.BackBufferHeight ); + if (current < best) { + best = current; + bestModeIndex= idm; + + } + + + } + if( bResolutionFound ) + fCurRanking += fResolutionWeight; + + //--------------------- + // Back buffer format + //--------------------- + if( pDeviceSettingsCombo->BackBufferFormat == pOptimalDeviceSettings->pp.BackBufferFormat ) + { + fCurRanking += fBackBufferFormatWeight; + } + else + { + int nBitDepthDelta = abs( ( long )DXUTGetD3D9ColorChannelBits( pDeviceSettingsCombo->BackBufferFormat ) - + ( long )DXUTGetD3D9ColorChannelBits( pOptimalDeviceSettings->pp.BackBufferFormat ) ); + float fScale = __max( 0.9f - ( float )nBitDepthDelta * 0.2f, 0.0f ); + fCurRanking += fScale * fBackBufferFormatWeight; + } + + // Check if this back buffer format is the same as + // the adapter format since this is preferred. + bool bAdapterMatchesBB = ( pDeviceSettingsCombo->BackBufferFormat == pDeviceSettingsCombo->AdapterFormat ); + if( bAdapterMatchesBB ) + fCurRanking += 0.1f; + + //--------------------- + // Back buffer count + //--------------------- + // No caps for the back buffer count + + //--------------------- + // Multisample + //--------------------- + bool bMultiSampleFound = false; + for( int i = 0; i < pDeviceSettingsCombo->multiSampleTypeList.GetSize(); i++ ) + { + D3DMULTISAMPLE_TYPE msType = pDeviceSettingsCombo->multiSampleTypeList.GetAt( i ); + DWORD msQuality = pDeviceSettingsCombo->multiSampleQualityList.GetAt( i ); + + if( msType == pOptimalDeviceSettings->pp.MultiSampleType && + msQuality > pOptimalDeviceSettings->pp.MultiSampleQuality ) + { + bMultiSampleFound = true; + bestMSAAIndex = i; + break; + } + } + if( bMultiSampleFound ) + fCurRanking += fMultiSampleWeight; + + //--------------------- + // Swap effect + //--------------------- + // No caps for swap effects + + //--------------------- + // Depth stencil + //--------------------- + if( pDeviceSettingsCombo->depthStencilFormatList.Contains( pOptimalDeviceSettings->pp.AutoDepthStencilFormat ) ) + fCurRanking += fDepthStencilWeight; + + //--------------------- + // Present flags + //--------------------- + // No caps for the present flags + + //--------------------- + // Refresh rate + //--------------------- + bool bRefreshFound = false; + for( int idm = 0; idm < pDeviceSettingsCombo->pAdapterInfo->displayModeList.GetSize(); idm++ ) + { + D3DDISPLAYMODE displayMode = pDeviceSettingsCombo->pAdapterInfo->displayModeList.GetAt( idm ); + if( displayMode.Format != pDeviceSettingsCombo->AdapterFormat ) + continue; + if( displayMode.RefreshRate == pOptimalDeviceSettings->pp.FullScreen_RefreshRateInHz ) + bRefreshFound = true; + } + if( bRefreshFound ) + fCurRanking += fRefreshRateWeight; + + //--------------------- + // Present interval + //--------------------- + // If keep present interval then check that the present interval is supported by this combo + if( pDeviceSettingsCombo->presentIntervalList.Contains( pOptimalDeviceSettings->pp.PresentationInterval ) ) + fCurRanking += fPresentIntervalWeight; + + return fCurRanking; +} + diff --git a/Demos/DX11ClothDemo/DXUT/Core/DXUTDevice9.h b/Demos/DX11ClothDemo/DXUT/Core/DXUTDevice9.h new file mode 100644 index 000000000..c5ee6db8e --- /dev/null +++ b/Demos/DX11ClothDemo/DXUT/Core/DXUTDevice9.h @@ -0,0 +1,207 @@ +//-------------------------------------------------------------------------------------- +// File: DXUTDevice9.h +// +// Enumerates D3D adapters, devices, modes, etc. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +//-------------------------------------------------------------------------------------- +#pragma once +#ifndef DXUT_DEVICE9_H +#define DXUT_DEVICE9_H + +//void DXUTApplyDefaultDeviceSettings(DXUTDeviceSettings *modifySettings); + +//-------------------------------------------------------------------------------------- +// Functions to get bit depth from formats +//-------------------------------------------------------------------------------------- +UINT WINAPI DXUTGetD3D9ColorChannelBits( D3DFORMAT fmt ); +UINT WINAPI DXUTGetAlphaChannelBits( D3DFORMAT fmt ); +UINT WINAPI DXUTGetStencilBits( D3DFORMAT fmt ); +UINT WINAPI DXUTGetDepthBits( D3DFORMAT fmt ); +UINT WINAPI DXUTGetDXGIColorChannelBits( DXGI_FORMAT fmt ); + + +//-------------------------------------------------------------------------------------- +// Forward declarations +//-------------------------------------------------------------------------------------- + +class CD3D9EnumAdapterInfo; +class CD3D9EnumDeviceInfo; +struct CD3D9EnumDeviceSettingsCombo; +struct CD3D9EnumDSMSConflict; + + + + + +//-------------------------------------------------------------------------------------- +// Optional memory create/destory functions. If not call, these will be called automatically +//-------------------------------------------------------------------------------------- +HRESULT WINAPI DXUTCreateD3D9Enumeration(); +void WINAPI DXUTDestroyD3D9Enumeration(); + + + +//-------------------------------------------------------------------------------------- +// Enumerates available Direct3D9 adapters, devices, modes, etc. +// Use DXUTGetD3D9Enumeration() to access global instance +//-------------------------------------------------------------------------------------- +class CD3D9Enumeration +{ +public: + // These should be called before Enumerate(). + // + // Use these calls and the IsDeviceAcceptable to control the contents of + // the enumeration object, which affects the device selection and the device settings dialog. + void SetRequirePostPixelShaderBlending( bool bRequire ) { m_bRequirePostPixelShaderBlending = bRequire; } + void SetResolutionMinMax( UINT nMinWidth, UINT nMinHeight, UINT nMaxWidth, UINT nMaxHeight ); + void SetRefreshMinMax( UINT nMin, UINT nMax ); + void SetMultisampleQualityMax( UINT nMax ); + void GetPossibleVertexProcessingList( bool* pbSoftwareVP, bool* pbHardwareVP, bool* pbPureHarewareVP, bool* pbMixedVP ); + void SetPossibleVertexProcessingList( bool bSoftwareVP, bool bHardwareVP, bool bPureHarewareVP, bool bMixedVP ); + CGrowableArray* GetPossibleDepthStencilFormatList(); + CGrowableArray* GetPossibleMultisampleTypeList(); + CGrowableArray* GetPossiblePresentIntervalList(); + void ResetPossibleDepthStencilFormats(); + void ResetPossibleMultisampleTypeList(); + void ResetPossiblePresentIntervalList(); + + // Call Enumerate() to enumerate available D3D adapters, devices, modes, etc. + bool HasEnumerated() { return m_bHasEnumerated; } + HRESULT Enumerate( LPDXUTCALLBACKISD3D9DEVICEACCEPTABLE IsD3D9DeviceAcceptableFunc = NULL, + void* pIsD3D9DeviceAcceptableFuncUserContext = NULL ); + + // These should be called after Enumerate() is called + CGrowableArray* GetAdapterInfoList(); + CD3D9EnumAdapterInfo* GetAdapterInfo( UINT AdapterOrdinal ); + CD3D9EnumDeviceInfo* GetDeviceInfo( UINT AdapterOrdinal, D3DDEVTYPE DeviceType ); + CD3D9EnumDeviceSettingsCombo* GetDeviceSettingsCombo( DXUTD3D9DeviceSettings* pD3D9DeviceSettings ) { return GetDeviceSettingsCombo( pD3D9DeviceSettings->AdapterOrdinal, pD3D9DeviceSettings->DeviceType, pD3D9DeviceSettings->AdapterFormat, pD3D9DeviceSettings->pp.BackBufferFormat, pD3D9DeviceSettings->pp.Windowed ); } + CD3D9EnumDeviceSettingsCombo* GetDeviceSettingsCombo( UINT AdapterOrdinal, D3DDEVTYPE DeviceType, D3DFORMAT AdapterFormat, D3DFORMAT BackBufferFormat, BOOL Windowed ); + + ~CD3D9Enumeration(); + +private: + friend HRESULT WINAPI DXUTCreateD3D9Enumeration(); + + // Use DXUTGetD3D9Enumeration() to access global instance + CD3D9Enumeration(); + + bool m_bHasEnumerated; + IDirect3D9* m_pD3D; + LPDXUTCALLBACKISD3D9DEVICEACCEPTABLE m_IsD3D9DeviceAcceptableFunc; + void* m_pIsD3D9DeviceAcceptableFuncUserContext; + bool m_bRequirePostPixelShaderBlending; + CGrowableArray m_DepthStencilPossibleList; + CGrowableArray m_MultiSampleTypeList; + CGrowableArray m_PresentIntervalList; + + bool m_bSoftwareVP; + bool m_bHardwareVP; + bool m_bPureHarewareVP; + bool m_bMixedVP; + + UINT m_nMinWidth; + UINT m_nMaxWidth; + UINT m_nMinHeight; + UINT m_nMaxHeight; + UINT m_nRefreshMin; + UINT m_nRefreshMax; + UINT m_nMultisampleQualityMax; + + // Array of CD3D9EnumAdapterInfo* with unique AdapterOrdinals + CGrowableArray m_AdapterInfoList; + + HRESULT EnumerateDevices( CD3D9EnumAdapterInfo* pAdapterInfo, CGrowableArray* pAdapterFormatList ); + HRESULT EnumerateDeviceCombos( CD3D9EnumAdapterInfo* pAdapterInfo, CD3D9EnumDeviceInfo* pDeviceInfo, CGrowableArray* pAdapterFormatList ); + void BuildDepthStencilFormatList( CD3D9EnumDeviceSettingsCombo* pDeviceCombo ); + void BuildMultiSampleTypeList( CD3D9EnumDeviceSettingsCombo* pDeviceCombo ); + void BuildDSMSConflictList( CD3D9EnumDeviceSettingsCombo* pDeviceCombo ); + void BuildPresentIntervalList( CD3D9EnumDeviceInfo* pDeviceInfo, CD3D9EnumDeviceSettingsCombo* pDeviceCombo ); + void ClearAdapterInfoList(); +}; + +CD3D9Enumeration* WINAPI DXUTGetD3D9Enumeration( bool bForceEnumerate = false ); + + +//-------------------------------------------------------------------------------------- +// A class describing an adapter which contains a unique adapter ordinal +// that is installed on the system +//-------------------------------------------------------------------------------------- +class CD3D9EnumAdapterInfo +{ +public: + ~CD3D9EnumAdapterInfo(); + + UINT AdapterOrdinal; + D3DADAPTER_IDENTIFIER9 AdapterIdentifier; + WCHAR szUniqueDescription[256]; + + CGrowableArray displayModeList; // Array of supported D3DDISPLAYMODEs + CGrowableArray deviceInfoList; // Array of CD3D9EnumDeviceInfo* with unique supported DeviceTypes +}; + + +//-------------------------------------------------------------------------------------- +// A class describing a Direct3D device that contains a +// unique supported device type +//-------------------------------------------------------------------------------------- +class CD3D9EnumDeviceInfo +{ +public: + ~CD3D9EnumDeviceInfo(); + + UINT AdapterOrdinal; + D3DDEVTYPE DeviceType; + D3DCAPS9 Caps; + + // List of CD3D9EnumDeviceSettingsCombo* with a unique set + // of AdapterFormat, BackBufferFormat, and Windowed + CGrowableArray deviceSettingsComboList; +}; + + +//-------------------------------------------------------------------------------------- +// A struct describing device settings that contains a unique combination of +// adapter format, back buffer format, and windowed that is compatible with a +// particular Direct3D device and the app. +//-------------------------------------------------------------------------------------- +struct CD3D9EnumDeviceSettingsCombo +{ + UINT AdapterOrdinal; + D3DDEVTYPE DeviceType; + D3DFORMAT AdapterFormat; + D3DFORMAT BackBufferFormat; + BOOL Windowed; + + CGrowableArray depthStencilFormatList; // List of D3DFORMATs + CGrowableArray multiSampleTypeList; // List of D3DMULTISAMPLE_TYPEs + CGrowableArray multiSampleQualityList; // List of number of quality levels for each multisample type + CGrowableArray presentIntervalList; // List of D3DPRESENT flags + CGrowableArray DSMSConflictList; // List of CD3D9EnumDSMSConflict + + CD3D9EnumAdapterInfo* pAdapterInfo; + CD3D9EnumDeviceInfo* pDeviceInfo; +}; + + +//-------------------------------------------------------------------------------------- +// A depth/stencil buffer format that is incompatible with a +// multisample type. +//-------------------------------------------------------------------------------------- +struct CD3D9EnumDSMSConflict +{ + D3DFORMAT DSFormat; + D3DMULTISAMPLE_TYPE MSType; +}; + + + +float DXUTRankD3D9DeviceCombo( CD3D9EnumDeviceSettingsCombo* pDeviceSettingsCombo, + DXUTD3D9DeviceSettings* pOptimalDeviceSettings, + D3DDISPLAYMODE* pAdapterDesktopDisplayMode, + int &bestModeIndex, + int &bestMSAAIndex + ); + + +#endif diff --git a/Demos/DX11ClothDemo/DXUT/Core/DXUTmisc.cpp b/Demos/DX11ClothDemo/DXUT/Core/DXUTmisc.cpp new file mode 100644 index 000000000..f60c5f4dd --- /dev/null +++ b/Demos/DX11ClothDemo/DXUT/Core/DXUTmisc.cpp @@ -0,0 +1,1785 @@ +//-------------------------------------------------------------------------------------- +// File: DXUTMisc.cpp +// +// Shortcut macros and functions for using DX objects +// +// Copyright (c) Microsoft Corporation. All rights reserved +//-------------------------------------------------------------------------------------- +#include "dxut.h" +#include +#define DXUT_GAMEPAD_TRIGGER_THRESHOLD 30 +#undef min // use __min instead +#undef max // use __max instead + +CDXUTTimer* WINAPI DXUTGetGlobalTimer() +{ + // Using an accessor function gives control of the construction order + static CDXUTTimer timer; + return &timer; +} + + +//-------------------------------------------------------------------------------------- +CDXUTTimer::CDXUTTimer() +{ + m_bTimerStopped = true; + m_llQPFTicksPerSec = 0; + + m_llStopTime = 0; + m_llLastElapsedTime = 0; + m_llBaseTime = 0; + + // Use QueryPerformanceFrequency to get the frequency of the counter + LARGE_INTEGER qwTicksPerSec = { 0 }; + QueryPerformanceFrequency( &qwTicksPerSec ); + m_llQPFTicksPerSec = qwTicksPerSec.QuadPart; +} + + +//-------------------------------------------------------------------------------------- +void CDXUTTimer::Reset() +{ + LARGE_INTEGER qwTime = GetAdjustedCurrentTime(); + + m_llBaseTime = qwTime.QuadPart; + m_llLastElapsedTime = qwTime.QuadPart; + m_llStopTime = 0; + m_bTimerStopped = FALSE; +} + + +//-------------------------------------------------------------------------------------- +void CDXUTTimer::Start() +{ + // Get the current time + LARGE_INTEGER qwTime = { 0 }; + QueryPerformanceCounter( &qwTime ); + + if( m_bTimerStopped ) + m_llBaseTime += qwTime.QuadPart - m_llStopTime; + m_llStopTime = 0; + m_llLastElapsedTime = qwTime.QuadPart; + m_bTimerStopped = FALSE; +} + + +//-------------------------------------------------------------------------------------- +void CDXUTTimer::Stop() +{ + if( !m_bTimerStopped ) + { + LARGE_INTEGER qwTime = { 0 }; + QueryPerformanceCounter( &qwTime ); + m_llStopTime = qwTime.QuadPart; + m_llLastElapsedTime = qwTime.QuadPart; + m_bTimerStopped = TRUE; + } +} + + +//-------------------------------------------------------------------------------------- +void CDXUTTimer::Advance() +{ + m_llStopTime += m_llQPFTicksPerSec / 10; +} + + +//-------------------------------------------------------------------------------------- +double CDXUTTimer::GetAbsoluteTime() +{ + LARGE_INTEGER qwTime = { 0 }; + QueryPerformanceCounter( &qwTime ); + + double fTime = qwTime.QuadPart / ( double )m_llQPFTicksPerSec; + + return fTime; +} + + +//-------------------------------------------------------------------------------------- +double CDXUTTimer::GetTime() +{ + LARGE_INTEGER qwTime = GetAdjustedCurrentTime(); + + double fAppTime = ( double )( qwTime.QuadPart - m_llBaseTime ) / ( double )m_llQPFTicksPerSec; + + return fAppTime; +} + + +//-------------------------------------------------------------------------------------- +void CDXUTTimer::GetTimeValues( double* pfTime, double* pfAbsoluteTime, float* pfElapsedTime ) +{ + assert( pfTime && pfAbsoluteTime && pfElapsedTime ); + + LARGE_INTEGER qwTime = GetAdjustedCurrentTime(); + + float fElapsedTime = (float) ((double) ( qwTime.QuadPart - m_llLastElapsedTime ) / (double) m_llQPFTicksPerSec); + m_llLastElapsedTime = qwTime.QuadPart; + + // Clamp the timer to non-negative values to ensure the timer is accurate. + // fElapsedTime can be outside this range if processor goes into a + // power save mode or we somehow get shuffled to another processor. + // However, the main thread should call SetThreadAffinityMask to ensure that + // we don't get shuffled to another processor. Other worker threads should NOT call + // SetThreadAffinityMask, but use a shared copy of the timer data gathered from + // the main thread. + if( fElapsedTime < 0.0f ) + fElapsedTime = 0.0f; + + *pfAbsoluteTime = qwTime.QuadPart / ( double )m_llQPFTicksPerSec; + *pfTime = ( qwTime.QuadPart - m_llBaseTime ) / ( double )m_llQPFTicksPerSec; + *pfElapsedTime = fElapsedTime; +} + + +//-------------------------------------------------------------------------------------- +float CDXUTTimer::GetElapsedTime() +{ + LARGE_INTEGER qwTime = GetAdjustedCurrentTime(); + + double fElapsedTime = (float) ((double) ( qwTime.QuadPart - m_llLastElapsedTime ) / (double) m_llQPFTicksPerSec); + m_llLastElapsedTime = qwTime.QuadPart; + + // See the explanation about clamping in CDXUTTimer::GetTimeValues() + if( fElapsedTime < 0.0f ) + fElapsedTime = 0.0f; + + return ( float )fElapsedTime; +} + + +//-------------------------------------------------------------------------------------- +// If stopped, returns time when stopped otherwise returns current time +//-------------------------------------------------------------------------------------- +LARGE_INTEGER CDXUTTimer::GetAdjustedCurrentTime() +{ + LARGE_INTEGER qwTime; + if( m_llStopTime != 0 ) + qwTime.QuadPart = m_llStopTime; + else + QueryPerformanceCounter( &qwTime ); + return qwTime; +} + +//-------------------------------------------------------------------------------------- +bool CDXUTTimer::IsStopped() +{ + return m_bTimerStopped; +} + +//-------------------------------------------------------------------------------------- +// Limit the current thread to one processor (the current one). This ensures that timing code +// runs on only one processor, and will not suffer any ill effects from power management. +// See "Game Timing and Multicore Processors" for more details +//-------------------------------------------------------------------------------------- +void CDXUTTimer::LimitThreadAffinityToCurrentProc() +{ + HANDLE hCurrentProcess = GetCurrentProcess(); + + // Get the processor affinity mask for this process + DWORD_PTR dwProcessAffinityMask = 0; + DWORD_PTR dwSystemAffinityMask = 0; + + if( GetProcessAffinityMask( hCurrentProcess, &dwProcessAffinityMask, &dwSystemAffinityMask ) != 0 && + dwProcessAffinityMask ) + { + // Find the lowest processor that our process is allows to run against + DWORD_PTR dwAffinityMask = ( dwProcessAffinityMask & ( ( ~dwProcessAffinityMask ) + 1 ) ); + + // Set this as the processor that our thread must always run against + // This must be a subset of the process affinity mask + HANDLE hCurrentThread = GetCurrentThread(); + if( INVALID_HANDLE_VALUE != hCurrentThread ) + { + SetThreadAffinityMask( hCurrentThread, dwAffinityMask ); + CloseHandle( hCurrentThread ); + } + } + + CloseHandle( hCurrentProcess ); +} + + +//-------------------------------------------------------------------------------------- +// Returns the string for the given D3DFORMAT. +//-------------------------------------------------------------------------------------- +LPCWSTR WINAPI DXUTD3DFormatToString( D3DFORMAT format, bool bWithPrefix ) +{ + WCHAR* pstr = NULL; + switch( format ) + { + case D3DFMT_UNKNOWN: + pstr = L"D3DFMT_UNKNOWN"; break; + case D3DFMT_R8G8B8: + pstr = L"D3DFMT_R8G8B8"; break; + case D3DFMT_A8R8G8B8: + pstr = L"D3DFMT_A8R8G8B8"; break; + case D3DFMT_X8R8G8B8: + pstr = L"D3DFMT_X8R8G8B8"; break; + case D3DFMT_R5G6B5: + pstr = L"D3DFMT_R5G6B5"; break; + case D3DFMT_X1R5G5B5: + pstr = L"D3DFMT_X1R5G5B5"; break; + case D3DFMT_A1R5G5B5: + pstr = L"D3DFMT_A1R5G5B5"; break; + case D3DFMT_A4R4G4B4: + pstr = L"D3DFMT_A4R4G4B4"; break; + case D3DFMT_R3G3B2: + pstr = L"D3DFMT_R3G3B2"; break; + case D3DFMT_A8: + pstr = L"D3DFMT_A8"; break; + case D3DFMT_A8R3G3B2: + pstr = L"D3DFMT_A8R3G3B2"; break; + case D3DFMT_X4R4G4B4: + pstr = L"D3DFMT_X4R4G4B4"; break; + case D3DFMT_A2B10G10R10: + pstr = L"D3DFMT_A2B10G10R10"; break; + case D3DFMT_A8B8G8R8: + pstr = L"D3DFMT_A8B8G8R8"; break; + case D3DFMT_X8B8G8R8: + pstr = L"D3DFMT_X8B8G8R8"; break; + case D3DFMT_G16R16: + pstr = L"D3DFMT_G16R16"; break; + case D3DFMT_A2R10G10B10: + pstr = L"D3DFMT_A2R10G10B10"; break; + case D3DFMT_A16B16G16R16: + pstr = L"D3DFMT_A16B16G16R16"; break; + case D3DFMT_A8P8: + pstr = L"D3DFMT_A8P8"; break; + case D3DFMT_P8: + pstr = L"D3DFMT_P8"; break; + case D3DFMT_L8: + pstr = L"D3DFMT_L8"; break; + case D3DFMT_A8L8: + pstr = L"D3DFMT_A8L8"; break; + case D3DFMT_A4L4: + pstr = L"D3DFMT_A4L4"; break; + case D3DFMT_V8U8: + pstr = L"D3DFMT_V8U8"; break; + case D3DFMT_L6V5U5: + pstr = L"D3DFMT_L6V5U5"; break; + case D3DFMT_X8L8V8U8: + pstr = L"D3DFMT_X8L8V8U8"; break; + case D3DFMT_Q8W8V8U8: + pstr = L"D3DFMT_Q8W8V8U8"; break; + case D3DFMT_V16U16: + pstr = L"D3DFMT_V16U16"; break; + case D3DFMT_A2W10V10U10: + pstr = L"D3DFMT_A2W10V10U10"; break; + case D3DFMT_UYVY: + pstr = L"D3DFMT_UYVY"; break; + case D3DFMT_YUY2: + pstr = L"D3DFMT_YUY2"; break; + case D3DFMT_DXT1: + pstr = L"D3DFMT_DXT1"; break; + case D3DFMT_DXT2: + pstr = L"D3DFMT_DXT2"; break; + case D3DFMT_DXT3: + pstr = L"D3DFMT_DXT3"; break; + case D3DFMT_DXT4: + pstr = L"D3DFMT_DXT4"; break; + case D3DFMT_DXT5: + pstr = L"D3DFMT_DXT5"; break; + case D3DFMT_D16_LOCKABLE: + pstr = L"D3DFMT_D16_LOCKABLE"; break; + case D3DFMT_D32: + pstr = L"D3DFMT_D32"; break; + case D3DFMT_D15S1: + pstr = L"D3DFMT_D15S1"; break; + case D3DFMT_D24S8: + pstr = L"D3DFMT_D24S8"; break; + case D3DFMT_D24X8: + pstr = L"D3DFMT_D24X8"; break; + case D3DFMT_D24X4S4: + pstr = L"D3DFMT_D24X4S4"; break; + case D3DFMT_D16: + pstr = L"D3DFMT_D16"; break; + case D3DFMT_L16: + pstr = L"D3DFMT_L16"; break; + case D3DFMT_VERTEXDATA: + pstr = L"D3DFMT_VERTEXDATA"; break; + case D3DFMT_INDEX16: + pstr = L"D3DFMT_INDEX16"; break; + case D3DFMT_INDEX32: + pstr = L"D3DFMT_INDEX32"; break; + case D3DFMT_Q16W16V16U16: + pstr = L"D3DFMT_Q16W16V16U16"; break; + case D3DFMT_MULTI2_ARGB8: + pstr = L"D3DFMT_MULTI2_ARGB8"; break; + case D3DFMT_R16F: + pstr = L"D3DFMT_R16F"; break; + case D3DFMT_G16R16F: + pstr = L"D3DFMT_G16R16F"; break; + case D3DFMT_A16B16G16R16F: + pstr = L"D3DFMT_A16B16G16R16F"; break; + case D3DFMT_R32F: + pstr = L"D3DFMT_R32F"; break; + case D3DFMT_G32R32F: + pstr = L"D3DFMT_G32R32F"; break; + case D3DFMT_A32B32G32R32F: + pstr = L"D3DFMT_A32B32G32R32F"; break; + case D3DFMT_CxV8U8: + pstr = L"D3DFMT_CxV8U8"; break; + default: + pstr = L"Unknown format"; break; + } + if( bWithPrefix || wcsstr( pstr, L"D3DFMT_" ) == NULL ) + return pstr; + else + return pstr + lstrlen( L"D3DFMT_" ); +} + + +//-------------------------------------------------------------------------------------- +// Returns the string for the given DXGI_FORMAT. +//-------------------------------------------------------------------------------------- +LPCWSTR WINAPI DXUTDXGIFormatToString( DXGI_FORMAT format, bool bWithPrefix ) +{ + WCHAR* pstr = NULL; + switch( format ) + { + case DXGI_FORMAT_R32G32B32A32_TYPELESS: + pstr = L"DXGI_FORMAT_R32G32B32A32_TYPELESS"; break; + case DXGI_FORMAT_R32G32B32A32_FLOAT: + pstr = L"DXGI_FORMAT_R32G32B32A32_FLOAT"; break; + case DXGI_FORMAT_R32G32B32A32_UINT: + pstr = L"DXGI_FORMAT_R32G32B32A32_UINT"; break; + case DXGI_FORMAT_R32G32B32A32_SINT: + pstr = L"DXGI_FORMAT_R32G32B32A32_SINT"; break; + case DXGI_FORMAT_R32G32B32_TYPELESS: + pstr = L"DXGI_FORMAT_R32G32B32_TYPELESS"; break; + case DXGI_FORMAT_R32G32B32_FLOAT: + pstr = L"DXGI_FORMAT_R32G32B32_FLOAT"; break; + case DXGI_FORMAT_R32G32B32_UINT: + pstr = L"DXGI_FORMAT_R32G32B32_UINT"; break; + case DXGI_FORMAT_R32G32B32_SINT: + pstr = L"DXGI_FORMAT_R32G32B32_SINT"; break; + case DXGI_FORMAT_R16G16B16A16_TYPELESS: + pstr = L"DXGI_FORMAT_R16G16B16A16_TYPELESS"; break; + case DXGI_FORMAT_R16G16B16A16_FLOAT: + pstr = L"DXGI_FORMAT_R16G16B16A16_FLOAT"; break; + case DXGI_FORMAT_R16G16B16A16_UNORM: + pstr = L"DXGI_FORMAT_R16G16B16A16_UNORM"; break; + case DXGI_FORMAT_R16G16B16A16_UINT: + pstr = L"DXGI_FORMAT_R16G16B16A16_UINT"; break; + case DXGI_FORMAT_R16G16B16A16_SNORM: + pstr = L"DXGI_FORMAT_R16G16B16A16_SNORM"; break; + case DXGI_FORMAT_R16G16B16A16_SINT: + pstr = L"DXGI_FORMAT_R16G16B16A16_SINT"; break; + case DXGI_FORMAT_R32G32_TYPELESS: + pstr = L"DXGI_FORMAT_R32G32_TYPELESS"; break; + case DXGI_FORMAT_R32G32_FLOAT: + pstr = L"DXGI_FORMAT_R32G32_FLOAT"; break; + case DXGI_FORMAT_R32G32_UINT: + pstr = L"DXGI_FORMAT_R32G32_UINT"; break; + case DXGI_FORMAT_R32G32_SINT: + pstr = L"DXGI_FORMAT_R32G32_SINT"; break; + case DXGI_FORMAT_R32G8X24_TYPELESS: + pstr = L"DXGI_FORMAT_R32G8X24_TYPELESS"; break; + case DXGI_FORMAT_D32_FLOAT_S8X24_UINT: + pstr = L"DXGI_FORMAT_D32_FLOAT_S8X24_UINT"; break; + case DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS: + pstr = L"DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS"; break; + case DXGI_FORMAT_X32_TYPELESS_G8X24_UINT: + pstr = L"DXGI_FORMAT_X32_TYPELESS_G8X24_UINT"; break; + case DXGI_FORMAT_R10G10B10A2_TYPELESS: + pstr = L"DXGI_FORMAT_R10G10B10A2_TYPELESS"; break; + case DXGI_FORMAT_R10G10B10A2_UNORM: + pstr = L"DXGI_FORMAT_R10G10B10A2_UNORM"; break; + case DXGI_FORMAT_R10G10B10A2_UINT: + pstr = L"DXGI_FORMAT_R10G10B10A2_UINT"; break; + case DXGI_FORMAT_R11G11B10_FLOAT: + pstr = L"DXGI_FORMAT_R11G11B10_FLOAT"; break; + case DXGI_FORMAT_R8G8B8A8_TYPELESS: + pstr = L"DXGI_FORMAT_R8G8B8A8_TYPELESS"; break; + case DXGI_FORMAT_R8G8B8A8_UNORM: + pstr = L"DXGI_FORMAT_R8G8B8A8_UNORM"; break; + case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB: + pstr = L"DXGI_FORMAT_R8G8B8A8_UNORM_SRGB"; break; + case DXGI_FORMAT_R8G8B8A8_UINT: + pstr = L"DXGI_FORMAT_R8G8B8A8_UINT"; break; + case DXGI_FORMAT_R8G8B8A8_SNORM: + pstr = L"DXGI_FORMAT_R8G8B8A8_SNORM"; break; + case DXGI_FORMAT_R8G8B8A8_SINT: + pstr = L"DXGI_FORMAT_R8G8B8A8_SINT"; break; + case DXGI_FORMAT_R16G16_TYPELESS: + pstr = L"DXGI_FORMAT_R16G16_TYPELESS"; break; + case DXGI_FORMAT_R16G16_FLOAT: + pstr = L"DXGI_FORMAT_R16G16_FLOAT"; break; + case DXGI_FORMAT_R16G16_UNORM: + pstr = L"DXGI_FORMAT_R16G16_UNORM"; break; + case DXGI_FORMAT_R16G16_UINT: + pstr = L"DXGI_FORMAT_R16G16_UINT"; break; + case DXGI_FORMAT_R16G16_SNORM: + pstr = L"DXGI_FORMAT_R16G16_SNORM"; break; + case DXGI_FORMAT_R16G16_SINT: + pstr = L"DXGI_FORMAT_R16G16_SINT"; break; + case DXGI_FORMAT_R32_TYPELESS: + pstr = L"DXGI_FORMAT_R32_TYPELESS"; break; + case DXGI_FORMAT_D32_FLOAT: + pstr = L"DXGI_FORMAT_D32_FLOAT"; break; + case DXGI_FORMAT_R32_FLOAT: + pstr = L"DXGI_FORMAT_R32_FLOAT"; break; + case DXGI_FORMAT_R32_UINT: + pstr = L"DXGI_FORMAT_R32_UINT"; break; + case DXGI_FORMAT_R32_SINT: + pstr = L"DXGI_FORMAT_R32_SINT"; break; + case DXGI_FORMAT_R24G8_TYPELESS: + pstr = L"DXGI_FORMAT_R24G8_TYPELESS"; break; + case DXGI_FORMAT_D24_UNORM_S8_UINT: + pstr = L"DXGI_FORMAT_D24_UNORM_S8_UINT"; break; + case DXGI_FORMAT_R24_UNORM_X8_TYPELESS: + pstr = L"DXGI_FORMAT_R24_UNORM_X8_TYPELESS"; break; + case DXGI_FORMAT_X24_TYPELESS_G8_UINT: + pstr = L"DXGI_FORMAT_X24_TYPELESS_G8_UINT"; break; + case DXGI_FORMAT_R8G8_TYPELESS: + pstr = L"DXGI_FORMAT_R8G8_TYPELESS"; break; + case DXGI_FORMAT_R8G8_UNORM: + pstr = L"DXGI_FORMAT_R8G8_UNORM"; break; + case DXGI_FORMAT_R8G8_UINT: + pstr = L"DXGI_FORMAT_R8G8_UINT"; break; + case DXGI_FORMAT_R8G8_SNORM: + pstr = L"DXGI_FORMAT_R8G8_SNORM"; break; + case DXGI_FORMAT_R8G8_SINT: + pstr = L"DXGI_FORMAT_R8G8_SINT"; break; + case DXGI_FORMAT_R16_TYPELESS: + pstr = L"DXGI_FORMAT_R16_TYPELESS"; break; + case DXGI_FORMAT_R16_FLOAT: + pstr = L"DXGI_FORMAT_R16_FLOAT"; break; + case DXGI_FORMAT_D16_UNORM: + pstr = L"DXGI_FORMAT_D16_UNORM"; break; + case DXGI_FORMAT_R16_UNORM: + pstr = L"DXGI_FORMAT_R16_UNORM"; break; + case DXGI_FORMAT_R16_UINT: + pstr = L"DXGI_FORMAT_R16_UINT"; break; + case DXGI_FORMAT_R16_SNORM: + pstr = L"DXGI_FORMAT_R16_SNORM"; break; + case DXGI_FORMAT_R16_SINT: + pstr = L"DXGI_FORMAT_R16_SINT"; break; + case DXGI_FORMAT_R8_TYPELESS: + pstr = L"DXGI_FORMAT_R8_TYPELESS"; break; + case DXGI_FORMAT_R8_UNORM: + pstr = L"DXGI_FORMAT_R8_UNORM"; break; + case DXGI_FORMAT_R8_UINT: + pstr = L"DXGI_FORMAT_R8_UINT"; break; + case DXGI_FORMAT_R8_SNORM: + pstr = L"DXGI_FORMAT_R8_SNORM"; break; + case DXGI_FORMAT_R8_SINT: + pstr = L"DXGI_FORMAT_R8_SINT"; break; + case DXGI_FORMAT_A8_UNORM: + pstr = L"DXGI_FORMAT_A8_UNORM"; break; + case DXGI_FORMAT_R1_UNORM: + pstr = L"DXGI_FORMAT_R1_UNORM"; break; + case DXGI_FORMAT_R9G9B9E5_SHAREDEXP: + pstr = L"DXGI_FORMAT_R9G9B9E5_SHAREDEXP"; break; + case DXGI_FORMAT_R8G8_B8G8_UNORM: + pstr = L"DXGI_FORMAT_R8G8_B8G8_UNORM"; break; + case DXGI_FORMAT_G8R8_G8B8_UNORM: + pstr = L"DXGI_FORMAT_G8R8_G8B8_UNORM"; break; + case DXGI_FORMAT_BC1_TYPELESS: + pstr = L"DXGI_FORMAT_BC1_TYPELESS"; break; + case DXGI_FORMAT_BC1_UNORM: + pstr = L"DXGI_FORMAT_BC1_UNORM"; break; + case DXGI_FORMAT_BC1_UNORM_SRGB: + pstr = L"DXGI_FORMAT_BC1_UNORM_SRGB"; break; + case DXGI_FORMAT_BC2_TYPELESS: + pstr = L"DXGI_FORMAT_BC2_TYPELESS"; break; + case DXGI_FORMAT_BC2_UNORM: + pstr = L"DXGI_FORMAT_BC2_UNORM"; break; + case DXGI_FORMAT_BC2_UNORM_SRGB: + pstr = L"DXGI_FORMAT_BC2_UNORM_SRGB"; break; + case DXGI_FORMAT_BC3_TYPELESS: + pstr = L"DXGI_FORMAT_BC3_TYPELESS"; break; + case DXGI_FORMAT_BC3_UNORM: + pstr = L"DXGI_FORMAT_BC3_UNORM"; break; + case DXGI_FORMAT_BC3_UNORM_SRGB: + pstr = L"DXGI_FORMAT_BC3_UNORM_SRGB"; break; + case DXGI_FORMAT_BC4_TYPELESS: + pstr = L"DXGI_FORMAT_BC4_TYPELESS"; break; + case DXGI_FORMAT_BC4_UNORM: + pstr = L"DXGI_FORMAT_BC4_UNORM"; break; + case DXGI_FORMAT_BC4_SNORM: + pstr = L"DXGI_FORMAT_BC4_SNORM"; break; + case DXGI_FORMAT_BC5_TYPELESS: + pstr = L"DXGI_FORMAT_BC5_TYPELESS"; break; + case DXGI_FORMAT_BC5_UNORM: + pstr = L"DXGI_FORMAT_BC5_UNORM"; break; + case DXGI_FORMAT_BC5_SNORM: + pstr = L"DXGI_FORMAT_BC5_SNORM"; break; + case DXGI_FORMAT_B5G6R5_UNORM: + pstr = L"DXGI_FORMAT_B5G6R5_UNORM"; break; + case DXGI_FORMAT_B5G5R5A1_UNORM: + pstr = L"DXGI_FORMAT_B5G5R5A1_UNORM"; break; + case DXGI_FORMAT_B8G8R8A8_UNORM: + pstr = L"DXGI_FORMAT_B8G8R8A8_UNORM"; break; + default: + pstr = L"Unknown format"; break; + } + if( bWithPrefix || wcsstr( pstr, L"DXGI_FORMAT_" ) == NULL ) + return pstr; + else + return pstr + lstrlen( L"DXGI_FORMAT_" ); +} + + +//-------------------------------------------------------------------------------------- +// Outputs to the debug stream a formatted Unicode string with a variable-argument list. +//-------------------------------------------------------------------------------------- +VOID WINAPI DXUTOutputDebugStringW( LPCWSTR strMsg, ... ) +{ +#if defined(DEBUG) || defined(_DEBUG) + WCHAR strBuffer[512]; + + va_list args; + va_start(args, strMsg); + vswprintf_s( strBuffer, 512, strMsg, args ); + strBuffer[511] = L'\0'; + va_end(args); + + OutputDebugString( strBuffer ); +#else + UNREFERENCED_PARAMETER( strMsg ); +#endif +} + + +//-------------------------------------------------------------------------------------- +// Outputs to the debug stream a formatted MBCS string with a variable-argument list. +//-------------------------------------------------------------------------------------- +VOID WINAPI DXUTOutputDebugStringA( LPCSTR strMsg, ... ) +{ +#if defined(DEBUG) || defined(_DEBUG) + CHAR strBuffer[512]; + + va_list args; + va_start(args, strMsg); + sprintf_s( strBuffer, 512, strMsg, args ); + strBuffer[511] = '\0'; + va_end(args); + + OutputDebugStringA( strBuffer ); +#else + UNREFERENCED_PARAMETER( strMsg ); +#endif +} + + +//-------------------------------------------------------------------------------------- +// Direct3D9 dynamic linking support -- calls top-level D3D9 APIs with graceful +// failure if APIs are not present. +//-------------------------------------------------------------------------------------- + +// Function prototypes +typedef IDirect3D9* (WINAPI * LPDIRECT3DCREATE9) (UINT); +typedef INT (WINAPI * LPD3DPERF_BEGINEVENT)(D3DCOLOR, LPCWSTR); +typedef INT (WINAPI * LPD3DPERF_ENDEVENT)(void); +typedef VOID (WINAPI * LPD3DPERF_SETMARKER)(D3DCOLOR, LPCWSTR); +typedef VOID (WINAPI * LPD3DPERF_SETREGION)(D3DCOLOR, LPCWSTR); +typedef BOOL (WINAPI * LPD3DPERF_QUERYREPEATFRAME)(void); +typedef VOID (WINAPI * LPD3DPERF_SETOPTIONS)( DWORD dwOptions ); +typedef DWORD (WINAPI * LPD3DPERF_GETSTATUS)( void ); +typedef HRESULT (WINAPI * LPCREATEDXGIFACTORY)(REFIID, void ** ); +typedef HRESULT (WINAPI * LPD3D11CREATEDEVICE)( IDXGIAdapter*, D3D_DRIVER_TYPE, HMODULE, UINT32, D3D_FEATURE_LEVEL*, UINT, UINT32, ID3D11Device**, D3D_FEATURE_LEVEL*, ID3D11DeviceContext** ); + +// Module and function pointers +static HMODULE s_hModD3D9 = NULL; +static LPDIRECT3DCREATE9 s_DynamicDirect3DCreate9 = NULL; +static LPD3DPERF_BEGINEVENT s_DynamicD3DPERF_BeginEvent = NULL; +static LPD3DPERF_ENDEVENT s_DynamicD3DPERF_EndEvent = NULL; +static LPD3DPERF_SETMARKER s_DynamicD3DPERF_SetMarker = NULL; +static LPD3DPERF_SETREGION s_DynamicD3DPERF_SetRegion = NULL; +static LPD3DPERF_QUERYREPEATFRAME s_DynamicD3DPERF_QueryRepeatFrame = NULL; +static LPD3DPERF_SETOPTIONS s_DynamicD3DPERF_SetOptions = NULL; +static LPD3DPERF_GETSTATUS s_DynamicD3DPERF_GetStatus = NULL; +static HMODULE s_hModDXGI = NULL; +static LPCREATEDXGIFACTORY s_DynamicCreateDXGIFactory = NULL; +static HMODULE s_hModD3D11 = NULL; +static LPD3D11CREATEDEVICE s_DynamicD3D11CreateDevice = NULL; + +// Ensure function pointers are initialized +static bool DXUT_EnsureD3D9APIs( void ) +{ + // If the module is non-NULL, this function has already been called. Note + // that this doesn't guarantee that all ProcAddresses were found. + if( s_hModD3D9 != NULL ) + return true; + + // This may fail if Direct3D 9 isn't installed + s_hModD3D9 = LoadLibrary( L"d3d9.dll" ); + if( s_hModD3D9 != NULL ) + { + s_DynamicDirect3DCreate9 = (LPDIRECT3DCREATE9)GetProcAddress( s_hModD3D9, "Direct3DCreate9" ); + s_DynamicD3DPERF_BeginEvent = (LPD3DPERF_BEGINEVENT)GetProcAddress( s_hModD3D9, "D3DPERF_BeginEvent" ); + s_DynamicD3DPERF_EndEvent = (LPD3DPERF_ENDEVENT)GetProcAddress( s_hModD3D9, "D3DPERF_EndEvent" ); + s_DynamicD3DPERF_SetMarker = (LPD3DPERF_SETMARKER)GetProcAddress( s_hModD3D9, "D3DPERF_SetMarker" ); + s_DynamicD3DPERF_SetRegion = (LPD3DPERF_SETREGION)GetProcAddress( s_hModD3D9, "D3DPERF_SetRegion" ); + s_DynamicD3DPERF_QueryRepeatFrame = (LPD3DPERF_QUERYREPEATFRAME)GetProcAddress( s_hModD3D9, "D3DPERF_QueryRepeatFrame" ); + s_DynamicD3DPERF_SetOptions = (LPD3DPERF_SETOPTIONS)GetProcAddress( s_hModD3D9, "D3DPERF_SetOptions" ); + s_DynamicD3DPERF_GetStatus = (LPD3DPERF_GETSTATUS)GetProcAddress( s_hModD3D9, "D3DPERF_GetStatus" ); + } + + return s_hModD3D9 != NULL; +} + +bool DXUT_EnsureD3D11APIs( void ) +{ + // If both modules are non-NULL, this function has already been called. Note + // that this doesn't guarantee that all ProcAddresses were found. + if( s_hModD3D11 != NULL && s_hModDXGI != NULL ) + return true; + + // This may fail if Direct3D 11 isn't installed + s_hModD3D11 = LoadLibrary( L"d3d11.dll" ); + if( s_hModD3D11 != NULL ) + { + s_DynamicD3D11CreateDevice = ( LPD3D11CREATEDEVICE )GetProcAddress( s_hModD3D11, "D3D11CreateDevice" ); + } + + if( !s_DynamicCreateDXGIFactory ) + { + s_hModDXGI = LoadLibrary( L"dxgi.dll" ); + if( s_hModDXGI ) + { + s_DynamicCreateDXGIFactory = ( LPCREATEDXGIFACTORY )GetProcAddress( s_hModDXGI, "CreateDXGIFactory1" ); + } + + return ( s_hModDXGI != NULL ) && ( s_hModD3D11 != NULL ); + } + + return ( s_hModD3D11 != NULL ); +} + +IDirect3D9* WINAPI DXUT_Dynamic_Direct3DCreate9( UINT SDKVersion ) +{ + if( DXUT_EnsureD3D9APIs() && s_DynamicDirect3DCreate9 != NULL ) + return s_DynamicDirect3DCreate9( SDKVersion ); + else + return NULL; +} + +int WINAPI DXUT_Dynamic_D3DPERF_BeginEvent( D3DCOLOR col, LPCWSTR wszName ) +{ + if( DXUT_EnsureD3D9APIs() && s_DynamicD3DPERF_BeginEvent != NULL ) + return s_DynamicD3DPERF_BeginEvent( col, wszName ); + else + return -1; +} + +int WINAPI DXUT_Dynamic_D3DPERF_EndEvent( void ) +{ + if( DXUT_EnsureD3D9APIs() && s_DynamicD3DPERF_EndEvent != NULL ) + return s_DynamicD3DPERF_EndEvent(); + else + return -1; +} + +void WINAPI DXUT_Dynamic_D3DPERF_SetMarker( D3DCOLOR col, LPCWSTR wszName ) +{ + if( DXUT_EnsureD3D9APIs() && s_DynamicD3DPERF_SetMarker != NULL ) + s_DynamicD3DPERF_SetMarker( col, wszName ); +} + +void WINAPI DXUT_Dynamic_D3DPERF_SetRegion( D3DCOLOR col, LPCWSTR wszName ) +{ + if( DXUT_EnsureD3D9APIs() && s_DynamicD3DPERF_SetRegion != NULL ) + s_DynamicD3DPERF_SetRegion( col, wszName ); +} + +BOOL WINAPI DXUT_Dynamic_D3DPERF_QueryRepeatFrame( void ) +{ + if( DXUT_EnsureD3D9APIs() && s_DynamicD3DPERF_QueryRepeatFrame != NULL ) + return s_DynamicD3DPERF_QueryRepeatFrame(); + else + return FALSE; +} + +void WINAPI DXUT_Dynamic_D3DPERF_SetOptions( DWORD dwOptions ) +{ + if( DXUT_EnsureD3D9APIs() && s_DynamicD3DPERF_SetOptions != NULL ) + s_DynamicD3DPERF_SetOptions( dwOptions ); +} + +DWORD WINAPI DXUT_Dynamic_D3DPERF_GetStatus( void ) +{ + if( DXUT_EnsureD3D9APIs() && s_DynamicD3DPERF_GetStatus != NULL ) + return s_DynamicD3DPERF_GetStatus(); + else + return 0; +} + +HRESULT WINAPI DXUT_Dynamic_CreateDXGIFactory1( REFIID rInterface, void** ppOut ) +{ + if( DXUT_EnsureD3D11APIs() && s_DynamicCreateDXGIFactory != NULL ) + return s_DynamicCreateDXGIFactory( rInterface, ppOut ); + else + return DXUTERR_NODIRECT3D11; +} + + + +HRESULT WINAPI DXUT_Dynamic_D3D11CreateDevice( IDXGIAdapter* pAdapter, + D3D_DRIVER_TYPE DriverType, + HMODULE Software, + UINT32 Flags, + D3D_FEATURE_LEVEL* pFeatureLevels, + UINT FeatureLevels, + UINT32 SDKVersion, + ID3D11Device** ppDevice, + D3D_FEATURE_LEVEL* pFeatureLevel, + ID3D11DeviceContext** ppImmediateContext ) +{ + if( DXUT_EnsureD3D11APIs() && s_DynamicD3D11CreateDevice != NULL ) + return s_DynamicD3D11CreateDevice( pAdapter, DriverType, Software, Flags, pFeatureLevels, FeatureLevels, + SDKVersion, ppDevice, pFeatureLevel, ppImmediateContext ); + else + return DXUTERR_NODIRECT3D11; +} + +//-------------------------------------------------------------------------------------- +// Trace a string description of a decl +//-------------------------------------------------------------------------------------- +void WINAPI DXUTTraceDecl( D3DVERTEXELEMENT9 decl[MAX_FVF_DECL_SIZE] ) +{ + int iDecl = 0; + for( iDecl = 0; iDecl < MAX_FVF_DECL_SIZE; iDecl++ ) + { + if( decl[iDecl].Stream == 0xFF ) + break; + + DXUTOutputDebugString( L"decl[%d]=Stream:%d, Offset:%d, %s, %s, %s, UsageIndex:%d\n", iDecl, + decl[iDecl].Stream, + decl[iDecl].Offset, + DXUTTraceD3DDECLTYPEtoString( decl[iDecl].Type ), + DXUTTraceD3DDECLMETHODtoString( decl[iDecl].Method ), + DXUTTraceD3DDECLUSAGEtoString( decl[iDecl].Usage ), + decl[iDecl].UsageIndex ); + } + + DXUTOutputDebugString( L"decl[%d]=D3DDECL_END\n", iDecl ); +} + +#define TRACE_ID(iD) case iD: return L#iD; + +//-------------------------------------------------------------------------------------- +WCHAR* WINAPI DXUTTraceWindowsMessage( UINT uMsg ) +{ + switch( uMsg ) + { + TRACE_ID(WM_NULL); + TRACE_ID(WM_CREATE); + TRACE_ID(WM_DESTROY); + TRACE_ID(WM_MOVE); + TRACE_ID(WM_SIZE); + TRACE_ID(WM_ACTIVATE); + TRACE_ID(WM_SETFOCUS); + TRACE_ID(WM_KILLFOCUS); + TRACE_ID(WM_ENABLE); + TRACE_ID(WM_SETREDRAW); + TRACE_ID(WM_SETTEXT); + TRACE_ID(WM_GETTEXT); + TRACE_ID(WM_GETTEXTLENGTH); + TRACE_ID(WM_PAINT); + TRACE_ID(WM_CLOSE); + TRACE_ID(WM_QUERYENDSESSION); + TRACE_ID(WM_QUERYOPEN); + TRACE_ID(WM_ENDSESSION); + TRACE_ID(WM_QUIT); + TRACE_ID(WM_ERASEBKGND); + TRACE_ID(WM_SYSCOLORCHANGE); + TRACE_ID(WM_SHOWWINDOW); + TRACE_ID(WM_WININICHANGE); + TRACE_ID(WM_DEVMODECHANGE); + TRACE_ID(WM_ACTIVATEAPP); + TRACE_ID(WM_FONTCHANGE); + TRACE_ID(WM_TIMECHANGE); + TRACE_ID(WM_CANCELMODE); + TRACE_ID(WM_SETCURSOR); + TRACE_ID(WM_MOUSEACTIVATE); + TRACE_ID(WM_CHILDACTIVATE); + TRACE_ID(WM_QUEUESYNC); + TRACE_ID(WM_GETMINMAXINFO); + TRACE_ID(WM_PAINTICON); + TRACE_ID(WM_ICONERASEBKGND); + TRACE_ID(WM_NEXTDLGCTL); + TRACE_ID(WM_SPOOLERSTATUS); + TRACE_ID(WM_DRAWITEM); + TRACE_ID(WM_MEASUREITEM); + TRACE_ID(WM_DELETEITEM); + TRACE_ID(WM_VKEYTOITEM); + TRACE_ID(WM_CHARTOITEM); + TRACE_ID(WM_SETFONT); + TRACE_ID(WM_GETFONT); + TRACE_ID(WM_SETHOTKEY); + TRACE_ID(WM_GETHOTKEY); + TRACE_ID(WM_QUERYDRAGICON); + TRACE_ID(WM_COMPAREITEM); + TRACE_ID(WM_GETOBJECT); + TRACE_ID(WM_COMPACTING); + TRACE_ID(WM_COMMNOTIFY); + TRACE_ID(WM_WINDOWPOSCHANGING); + TRACE_ID(WM_WINDOWPOSCHANGED); + TRACE_ID(WM_POWER); + TRACE_ID(WM_COPYDATA); + TRACE_ID(WM_CANCELJOURNAL); + TRACE_ID(WM_NOTIFY); + TRACE_ID(WM_INPUTLANGCHANGEREQUEST); + TRACE_ID(WM_INPUTLANGCHANGE); + TRACE_ID(WM_TCARD); + TRACE_ID(WM_HELP); + TRACE_ID(WM_USERCHANGED); + TRACE_ID(WM_NOTIFYFORMAT); + TRACE_ID(WM_CONTEXTMENU); + TRACE_ID(WM_STYLECHANGING); + TRACE_ID(WM_STYLECHANGED); + TRACE_ID(WM_DISPLAYCHANGE); + TRACE_ID(WM_GETICON); + TRACE_ID(WM_SETICON); + TRACE_ID(WM_NCCREATE); + TRACE_ID(WM_NCDESTROY); + TRACE_ID(WM_NCCALCSIZE); + TRACE_ID(WM_NCHITTEST); + TRACE_ID(WM_NCPAINT); + TRACE_ID(WM_NCACTIVATE); + TRACE_ID(WM_GETDLGCODE); + TRACE_ID(WM_SYNCPAINT); + TRACE_ID(WM_NCMOUSEMOVE); + TRACE_ID(WM_NCLBUTTONDOWN); + TRACE_ID(WM_NCLBUTTONUP); + TRACE_ID(WM_NCLBUTTONDBLCLK); + TRACE_ID(WM_NCRBUTTONDOWN); + TRACE_ID(WM_NCRBUTTONUP); + TRACE_ID(WM_NCRBUTTONDBLCLK); + TRACE_ID(WM_NCMBUTTONDOWN); + TRACE_ID(WM_NCMBUTTONUP); + TRACE_ID(WM_NCMBUTTONDBLCLK); + TRACE_ID(WM_NCXBUTTONDOWN); + TRACE_ID(WM_NCXBUTTONUP); + TRACE_ID(WM_NCXBUTTONDBLCLK); + TRACE_ID(WM_INPUT); + TRACE_ID(WM_KEYDOWN); + TRACE_ID(WM_KEYUP); + TRACE_ID(WM_CHAR); + TRACE_ID(WM_DEADCHAR); + TRACE_ID(WM_SYSKEYDOWN); + TRACE_ID(WM_SYSKEYUP); + TRACE_ID(WM_SYSCHAR); + TRACE_ID(WM_SYSDEADCHAR); + TRACE_ID(WM_UNICHAR); + TRACE_ID(WM_IME_STARTCOMPOSITION); + TRACE_ID(WM_IME_ENDCOMPOSITION); + TRACE_ID(WM_IME_COMPOSITION); + TRACE_ID(WM_INITDIALOG); + TRACE_ID(WM_COMMAND); + TRACE_ID(WM_SYSCOMMAND); + TRACE_ID(WM_TIMER); + TRACE_ID(WM_HSCROLL); + TRACE_ID(WM_VSCROLL); + TRACE_ID(WM_INITMENU); + TRACE_ID(WM_INITMENUPOPUP); + TRACE_ID(WM_MENUSELECT); + TRACE_ID(WM_MENUCHAR); + TRACE_ID(WM_ENTERIDLE); + TRACE_ID(WM_MENURBUTTONUP); + TRACE_ID(WM_MENUDRAG); + TRACE_ID(WM_MENUGETOBJECT); + TRACE_ID(WM_UNINITMENUPOPUP); + TRACE_ID(WM_MENUCOMMAND); + TRACE_ID(WM_CHANGEUISTATE); + TRACE_ID(WM_UPDATEUISTATE); + TRACE_ID(WM_QUERYUISTATE); + TRACE_ID(WM_CTLCOLORMSGBOX); + TRACE_ID(WM_CTLCOLOREDIT); + TRACE_ID(WM_CTLCOLORLISTBOX); + TRACE_ID(WM_CTLCOLORBTN); + TRACE_ID(WM_CTLCOLORDLG); + TRACE_ID(WM_CTLCOLORSCROLLBAR); + TRACE_ID(WM_CTLCOLORSTATIC); + TRACE_ID(MN_GETHMENU); + TRACE_ID(WM_MOUSEMOVE); + TRACE_ID(WM_LBUTTONDOWN); + TRACE_ID(WM_LBUTTONUP); + TRACE_ID(WM_LBUTTONDBLCLK); + TRACE_ID(WM_RBUTTONDOWN); + TRACE_ID(WM_RBUTTONUP); + TRACE_ID(WM_RBUTTONDBLCLK); + TRACE_ID(WM_MBUTTONDOWN); + TRACE_ID(WM_MBUTTONUP); + TRACE_ID(WM_MBUTTONDBLCLK); + TRACE_ID(WM_MOUSEWHEEL); + TRACE_ID(WM_XBUTTONDOWN); + TRACE_ID(WM_XBUTTONUP); + TRACE_ID(WM_XBUTTONDBLCLK); + TRACE_ID(WM_PARENTNOTIFY); + TRACE_ID(WM_ENTERMENULOOP); + TRACE_ID(WM_EXITMENULOOP); + TRACE_ID(WM_NEXTMENU); + TRACE_ID(WM_SIZING); + TRACE_ID(WM_CAPTURECHANGED); + TRACE_ID(WM_MOVING); + TRACE_ID(WM_POWERBROADCAST); + TRACE_ID(WM_DEVICECHANGE); + TRACE_ID(WM_MDICREATE); + TRACE_ID(WM_MDIDESTROY); + TRACE_ID(WM_MDIACTIVATE); + TRACE_ID(WM_MDIRESTORE); + TRACE_ID(WM_MDINEXT); + TRACE_ID(WM_MDIMAXIMIZE); + TRACE_ID(WM_MDITILE); + TRACE_ID(WM_MDICASCADE); + TRACE_ID(WM_MDIICONARRANGE); + TRACE_ID(WM_MDIGETACTIVE); + TRACE_ID(WM_MDISETMENU); + TRACE_ID(WM_ENTERSIZEMOVE); + TRACE_ID(WM_EXITSIZEMOVE); + TRACE_ID(WM_DROPFILES); + TRACE_ID(WM_MDIREFRESHMENU); + TRACE_ID(WM_IME_SETCONTEXT); + TRACE_ID(WM_IME_NOTIFY); + TRACE_ID(WM_IME_CONTROL); + TRACE_ID(WM_IME_COMPOSITIONFULL); + TRACE_ID(WM_IME_SELECT); + TRACE_ID(WM_IME_CHAR); + TRACE_ID(WM_IME_REQUEST); + TRACE_ID(WM_IME_KEYDOWN); + TRACE_ID(WM_IME_KEYUP); + TRACE_ID(WM_MOUSEHOVER); + TRACE_ID(WM_MOUSELEAVE); + TRACE_ID(WM_NCMOUSEHOVER); + TRACE_ID(WM_NCMOUSELEAVE); + TRACE_ID(WM_WTSSESSION_CHANGE); + TRACE_ID(WM_TABLET_FIRST); + TRACE_ID(WM_TABLET_LAST); + TRACE_ID(WM_CUT); + TRACE_ID(WM_COPY); + TRACE_ID(WM_PASTE); + TRACE_ID(WM_CLEAR); + TRACE_ID(WM_UNDO); + TRACE_ID(WM_RENDERFORMAT); + TRACE_ID(WM_RENDERALLFORMATS); + TRACE_ID(WM_DESTROYCLIPBOARD); + TRACE_ID(WM_DRAWCLIPBOARD); + TRACE_ID(WM_PAINTCLIPBOARD); + TRACE_ID(WM_VSCROLLCLIPBOARD); + TRACE_ID(WM_SIZECLIPBOARD); + TRACE_ID(WM_ASKCBFORMATNAME); + TRACE_ID(WM_CHANGECBCHAIN); + TRACE_ID(WM_HSCROLLCLIPBOARD); + TRACE_ID(WM_QUERYNEWPALETTE); + TRACE_ID(WM_PALETTEISCHANGING); + TRACE_ID(WM_PALETTECHANGED); + TRACE_ID(WM_HOTKEY); + TRACE_ID(WM_PRINT); + TRACE_ID(WM_PRINTCLIENT); + TRACE_ID(WM_APPCOMMAND); + TRACE_ID(WM_THEMECHANGED); + TRACE_ID(WM_HANDHELDFIRST); + TRACE_ID(WM_HANDHELDLAST); + TRACE_ID(WM_AFXFIRST); + TRACE_ID(WM_AFXLAST); + TRACE_ID(WM_PENWINFIRST); + TRACE_ID(WM_PENWINLAST); + TRACE_ID(WM_APP); + default: + return L"Unknown"; + } +} + + +//-------------------------------------------------------------------------------------- +WCHAR* WINAPI DXUTTraceD3DDECLTYPEtoString( BYTE t ) +{ + switch( t ) + { + case D3DDECLTYPE_FLOAT1: + return L"D3DDECLTYPE_FLOAT1"; + case D3DDECLTYPE_FLOAT2: + return L"D3DDECLTYPE_FLOAT2"; + case D3DDECLTYPE_FLOAT3: + return L"D3DDECLTYPE_FLOAT3"; + case D3DDECLTYPE_FLOAT4: + return L"D3DDECLTYPE_FLOAT4"; + case D3DDECLTYPE_D3DCOLOR: + return L"D3DDECLTYPE_D3DCOLOR"; + case D3DDECLTYPE_UBYTE4: + return L"D3DDECLTYPE_UBYTE4"; + case D3DDECLTYPE_SHORT2: + return L"D3DDECLTYPE_SHORT2"; + case D3DDECLTYPE_SHORT4: + return L"D3DDECLTYPE_SHORT4"; + case D3DDECLTYPE_UBYTE4N: + return L"D3DDECLTYPE_UBYTE4N"; + case D3DDECLTYPE_SHORT2N: + return L"D3DDECLTYPE_SHORT2N"; + case D3DDECLTYPE_SHORT4N: + return L"D3DDECLTYPE_SHORT4N"; + case D3DDECLTYPE_USHORT2N: + return L"D3DDECLTYPE_USHORT2N"; + case D3DDECLTYPE_USHORT4N: + return L"D3DDECLTYPE_USHORT4N"; + case D3DDECLTYPE_UDEC3: + return L"D3DDECLTYPE_UDEC3"; + case D3DDECLTYPE_DEC3N: + return L"D3DDECLTYPE_DEC3N"; + case D3DDECLTYPE_FLOAT16_2: + return L"D3DDECLTYPE_FLOAT16_2"; + case D3DDECLTYPE_FLOAT16_4: + return L"D3DDECLTYPE_FLOAT16_4"; + case D3DDECLTYPE_UNUSED: + return L"D3DDECLTYPE_UNUSED"; + default: + return L"D3DDECLTYPE Unknown"; + } +} + +WCHAR* WINAPI DXUTTraceD3DDECLMETHODtoString( BYTE m ) +{ + switch( m ) + { + case D3DDECLMETHOD_DEFAULT: + return L"D3DDECLMETHOD_DEFAULT"; + case D3DDECLMETHOD_PARTIALU: + return L"D3DDECLMETHOD_PARTIALU"; + case D3DDECLMETHOD_PARTIALV: + return L"D3DDECLMETHOD_PARTIALV"; + case D3DDECLMETHOD_CROSSUV: + return L"D3DDECLMETHOD_CROSSUV"; + case D3DDECLMETHOD_UV: + return L"D3DDECLMETHOD_UV"; + case D3DDECLMETHOD_LOOKUP: + return L"D3DDECLMETHOD_LOOKUP"; + case D3DDECLMETHOD_LOOKUPPRESAMPLED: + return L"D3DDECLMETHOD_LOOKUPPRESAMPLED"; + default: + return L"D3DDECLMETHOD Unknown"; + } +} + +WCHAR* WINAPI DXUTTraceD3DDECLUSAGEtoString( BYTE u ) +{ + switch( u ) + { + case D3DDECLUSAGE_POSITION: + return L"D3DDECLUSAGE_POSITION"; + case D3DDECLUSAGE_BLENDWEIGHT: + return L"D3DDECLUSAGE_BLENDWEIGHT"; + case D3DDECLUSAGE_BLENDINDICES: + return L"D3DDECLUSAGE_BLENDINDICES"; + case D3DDECLUSAGE_NORMAL: + return L"D3DDECLUSAGE_NORMAL"; + case D3DDECLUSAGE_PSIZE: + return L"D3DDECLUSAGE_PSIZE"; + case D3DDECLUSAGE_TEXCOORD: + return L"D3DDECLUSAGE_TEXCOORD"; + case D3DDECLUSAGE_TANGENT: + return L"D3DDECLUSAGE_TANGENT"; + case D3DDECLUSAGE_BINORMAL: + return L"D3DDECLUSAGE_BINORMAL"; + case D3DDECLUSAGE_TESSFACTOR: + return L"D3DDECLUSAGE_TESSFACTOR"; + case D3DDECLUSAGE_POSITIONT: + return L"D3DDECLUSAGE_POSITIONT"; + case D3DDECLUSAGE_COLOR: + return L"D3DDECLUSAGE_COLOR"; + case D3DDECLUSAGE_FOG: + return L"D3DDECLUSAGE_FOG"; + case D3DDECLUSAGE_DEPTH: + return L"D3DDECLUSAGE_DEPTH"; + case D3DDECLUSAGE_SAMPLE: + return L"D3DDECLUSAGE_SAMPLE"; + default: + return L"D3DDECLUSAGE Unknown"; + } +} + + +//-------------------------------------------------------------------------------------- +// Multimon API handling for OSes with or without multimon API support +//-------------------------------------------------------------------------------------- +#define DXUT_PRIMARY_MONITOR ((HMONITOR)0x12340042) +typedef HMONITOR ( WINAPI* LPMONITORFROMWINDOW )( HWND, DWORD ); +typedef BOOL ( WINAPI* LPGETMONITORINFO )( HMONITOR, LPMONITORINFO ); +typedef HMONITOR ( WINAPI* LPMONITORFROMRECT )( LPCRECT lprcScreenCoords, DWORD dwFlags ); + +BOOL WINAPI DXUTGetMonitorInfo( HMONITOR hMonitor, LPMONITORINFO lpMonitorInfo ) +{ + static bool s_bInited = false; + static LPGETMONITORINFO s_pFnGetMonitorInfo = NULL; + if( !s_bInited ) + { + s_bInited = true; + HMODULE hUser32 = GetModuleHandle( L"USER32" ); + if( hUser32 ) + { + OSVERSIONINFOA osvi = + { + 0 + }; osvi.dwOSVersionInfoSize = sizeof( osvi ); GetVersionExA( ( OSVERSIONINFOA* )&osvi ); + bool bNT = ( VER_PLATFORM_WIN32_NT == osvi.dwPlatformId ); + s_pFnGetMonitorInfo = ( LPGETMONITORINFO )( bNT ? GetProcAddress( hUser32, + "GetMonitorInfoW" ) : + GetProcAddress( hUser32, "GetMonitorInfoA" ) ); + } + } + + if( s_pFnGetMonitorInfo ) + return s_pFnGetMonitorInfo( hMonitor, lpMonitorInfo ); + + RECT rcWork; + if( ( hMonitor == DXUT_PRIMARY_MONITOR ) && lpMonitorInfo && ( lpMonitorInfo->cbSize >= sizeof( MONITORINFO ) ) && + SystemParametersInfoA( SPI_GETWORKAREA, 0, &rcWork, 0 ) ) + { + lpMonitorInfo->rcMonitor.left = 0; + lpMonitorInfo->rcMonitor.top = 0; + lpMonitorInfo->rcMonitor.right = GetSystemMetrics( SM_CXSCREEN ); + lpMonitorInfo->rcMonitor.bottom = GetSystemMetrics( SM_CYSCREEN ); + lpMonitorInfo->rcWork = rcWork; + lpMonitorInfo->dwFlags = MONITORINFOF_PRIMARY; + return TRUE; + } + return FALSE; +} + + +HMONITOR WINAPI DXUTMonitorFromWindow( HWND hWnd, DWORD dwFlags ) +{ + static bool s_bInited = false; + static LPMONITORFROMWINDOW s_pFnGetMonitorFromWindow = NULL; + if( !s_bInited ) + { + s_bInited = true; + HMODULE hUser32 = GetModuleHandle( L"USER32" ); + if( hUser32 ) s_pFnGetMonitorFromWindow = ( LPMONITORFROMWINDOW )GetProcAddress( hUser32, + "MonitorFromWindow" ); + } + + if( s_pFnGetMonitorFromWindow ) + return s_pFnGetMonitorFromWindow( hWnd, dwFlags ); + else + return DXUT_PRIMARY_MONITOR; +} + + +HMONITOR WINAPI DXUTMonitorFromRect( LPCRECT lprcScreenCoords, DWORD dwFlags ) +{ + static bool s_bInited = false; + static LPMONITORFROMRECT s_pFnGetMonitorFromRect = NULL; + if( !s_bInited ) + { + s_bInited = true; + HMODULE hUser32 = GetModuleHandle( L"USER32" ); + if( hUser32 ) s_pFnGetMonitorFromRect = ( LPMONITORFROMRECT )GetProcAddress( hUser32, "MonitorFromRect" ); + } + + if( s_pFnGetMonitorFromRect ) + return s_pFnGetMonitorFromRect( lprcScreenCoords, dwFlags ); + else + return DXUT_PRIMARY_MONITOR; +} + + +//-------------------------------------------------------------------------------------- +// Get the desktop resolution of an adapter. This isn't the same as the current resolution +// from GetAdapterDisplayMode since the device might be fullscreen +//-------------------------------------------------------------------------------------- +void WINAPI DXUTGetDesktopResolution( UINT AdapterOrdinal, UINT* pWidth, UINT* pHeight ) +{ + DXUTDeviceSettings DeviceSettings = DXUTGetDeviceSettings(); + + WCHAR strDeviceName[256] = {0}; + DEVMODE devMode; + ZeroMemory( &devMode, sizeof( DEVMODE ) ); + devMode.dmSize = sizeof( DEVMODE ); + if( DeviceSettings.ver == DXUT_D3D9_DEVICE ) + { + CD3D9Enumeration* pd3dEnum = DXUTGetD3D9Enumeration(); + CD3D9EnumAdapterInfo* pAdapterInfo = pd3dEnum->GetAdapterInfo( AdapterOrdinal ); + if( pAdapterInfo ) + { + MultiByteToWideChar( CP_ACP, 0, pAdapterInfo->AdapterIdentifier.DeviceName, -1, strDeviceName, 256 ); + strDeviceName[255] = 0; + } + } + else + { + CD3D11Enumeration* pd3dEnum = DXUTGetD3D11Enumeration(); + CD3D11EnumOutputInfo* pOutputInfo = pd3dEnum->GetOutputInfo( AdapterOrdinal, DeviceSettings.d3d11.Output ); + if( pOutputInfo ) + { + wcscpy_s( strDeviceName, 256, pOutputInfo->Desc.DeviceName ); + } + } + + EnumDisplaySettings( strDeviceName, ENUM_REGISTRY_SETTINGS, &devMode ); + if( pWidth ) + *pWidth = devMode.dmPelsWidth; + if( pHeight ) + *pHeight = devMode.dmPelsHeight; +} + + +//-------------------------------------------------------------------------------------- +// Display error msg box to help debug +//-------------------------------------------------------------------------------------- +HRESULT WINAPI DXUTTrace( const CHAR* strFile, DWORD dwLine, HRESULT hr, + const WCHAR* strMsg, bool bPopMsgBox ) +{ + bool bShowMsgBoxOnError = DXUTGetShowMsgBoxOnError(); + if( bPopMsgBox && bShowMsgBoxOnError == false ) + bPopMsgBox = false; + + return DXTrace( strFile, dwLine, hr, strMsg, bPopMsgBox ); +} + + +//-------------------------------------------------------------------------------------- + +//-------------------------------------------------------------------------------------- +void WINAPI DXUTConvertDeviceSettings11to9( DXUTD3D11DeviceSettings* pIn, DXUTD3D9DeviceSettings* pOut ) +{ + pOut->AdapterOrdinal = pIn->AdapterOrdinal; + + if( pIn->DriverType == D3D_DRIVER_TYPE_HARDWARE ) + pOut->DeviceType = D3DDEVTYPE_HAL; + else if( pIn->DriverType == D3D_DRIVER_TYPE_REFERENCE ) + pOut->DeviceType = D3DDEVTYPE_REF; + else if( pIn->DriverType == D3D_DRIVER_TYPE_NULL ) + pOut->DeviceType = D3DDEVTYPE_NULLREF; + + pOut->AdapterFormat = ConvertFormatDXGIToD3D9( pIn->sd.BufferDesc.Format ); + pOut->BehaviorFlags = D3DCREATE_HARDWARE_VERTEXPROCESSING; + pOut->pp.BackBufferWidth = pIn->sd.BufferDesc.Width; + pOut->pp.BackBufferHeight = pIn->sd.BufferDesc.Height; + pOut->pp.BackBufferFormat = ConvertFormatDXGIToD3D9( pIn->sd.BufferDesc.Format ); + pOut->pp.BackBufferCount = pIn->sd.BufferCount; + pOut->pp.MultiSampleType = ( D3DMULTISAMPLE_TYPE )pIn->sd.SampleDesc.Count; + pOut->pp.MultiSampleQuality = pIn->sd.SampleDesc.Quality; + pOut->pp.SwapEffect = D3DSWAPEFFECT_DISCARD; + pOut->pp.hDeviceWindow = pIn->sd.OutputWindow; + pOut->pp.Windowed = pIn->sd.Windowed; + pOut->pp.EnableAutoDepthStencil = true; + pOut->pp.AutoDepthStencilFormat = D3DFMT_D24FS8; + pOut->pp.Flags = 0; + if( pIn->sd.BufferDesc.RefreshRate.Denominator == 0 ) + pOut->pp.FullScreen_RefreshRateInHz = 60; + else + pOut->pp.FullScreen_RefreshRateInHz = pIn->sd.BufferDesc.RefreshRate.Numerator / + pIn->sd.BufferDesc.RefreshRate.Denominator; + + switch( pIn->SyncInterval ) + { + case 0: + pOut->pp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; break; + case 2: + pOut->pp.PresentationInterval = D3DPRESENT_INTERVAL_TWO; break; + case 3: + pOut->pp.PresentationInterval = D3DPRESENT_INTERVAL_THREE; break; + case 4: + pOut->pp.PresentationInterval = D3DPRESENT_INTERVAL_FOUR; break; + + case 1: + default: + pOut->pp.PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT; + break; + } +} + + +//-------------------------------------------------------------------------------------- +void WINAPI DXUTConvertDeviceSettings9to11( DXUTD3D9DeviceSettings* pIn, DXUTD3D11DeviceSettings* pOut ) +{ + pOut->AdapterOrdinal = pIn->AdapterOrdinal; + + if( pIn->DeviceType == D3DDEVTYPE_HAL ) + pOut->DriverType = D3D_DRIVER_TYPE_HARDWARE; + else if( pIn->DeviceType == D3DDEVTYPE_REF ) + pOut->DriverType = D3D_DRIVER_TYPE_REFERENCE; + else if( pIn->DeviceType == D3DDEVTYPE_NULLREF ) + pOut->DriverType = D3D_DRIVER_TYPE_NULL; + + pOut->Output = 0; + + pOut->sd.BufferDesc.Width = pIn->pp.BackBufferWidth; + pOut->sd.BufferDesc.Height = pIn->pp.BackBufferHeight; + pOut->sd.BufferDesc.RefreshRate.Numerator = pIn->pp.FullScreen_RefreshRateInHz; + pOut->sd.BufferDesc.RefreshRate.Denominator = 1; + pOut->sd.BufferDesc.Format = ConvertFormatD3D9ToDXGI( pIn->pp.BackBufferFormat ); + + if( pIn->pp.MultiSampleType == D3DMULTISAMPLE_NONMASKABLE ) + { + pOut->sd.SampleDesc.Count = pIn->pp.MultiSampleQuality; + pOut->sd.SampleDesc.Quality = 0; + } + else + { + pOut->sd.SampleDesc.Count = pIn->pp.MultiSampleType; + pOut->sd.SampleDesc.Quality = pIn->pp.MultiSampleQuality; + } + + pOut->sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; + pOut->sd.BufferCount = pIn->pp.BackBufferCount; + pOut->sd.OutputWindow = pIn->pp.hDeviceWindow; + pOut->sd.Windowed = pIn->pp.Windowed; + +#if defined(DEBUG) || defined(_DEBUG) + pOut->CreateFlags = D3D11_CREATE_DEVICE_DEBUG; +#else + pOut->CreateFlags = 0; +#endif + + switch( pIn->pp.PresentationInterval ) + { + case D3DPRESENT_INTERVAL_IMMEDIATE: + pOut->SyncInterval = 0; break; + case D3DPRESENT_INTERVAL_ONE: + pOut->SyncInterval = 1; break; + case D3DPRESENT_INTERVAL_TWO: + pOut->SyncInterval = 2; break; + case D3DPRESENT_INTERVAL_THREE: + pOut->SyncInterval = 3; break; + case D3DPRESENT_INTERVAL_FOUR: + pOut->SyncInterval = 4; break; + + case D3DPRESENT_INTERVAL_DEFAULT: + default: + pOut->SyncInterval = 1; + break; + } + + pOut->PresentFlags = 0; +} + + + +DXGI_FORMAT WINAPI ConvertFormatD3D9ToDXGI( D3DFORMAT fmt ) +{ + switch( fmt ) + { + case D3DFMT_UNKNOWN: + return DXGI_FORMAT_UNKNOWN; + case D3DFMT_R8G8B8: + case D3DFMT_A8R8G8B8: + case D3DFMT_X8R8G8B8: + return DXGI_FORMAT_R8G8B8A8_UNORM; + case D3DFMT_R5G6B5: + return DXGI_FORMAT_B5G6R5_UNORM; + case D3DFMT_X1R5G5B5: + case D3DFMT_A1R5G5B5: + return DXGI_FORMAT_B5G5R5A1_UNORM; + case D3DFMT_A4R4G4B4: + return DXGI_FORMAT_R8G8B8A8_UNORM; + case D3DFMT_R3G3B2: + return DXGI_FORMAT_R8G8B8A8_UNORM; + case D3DFMT_A8: + return DXGI_FORMAT_A8_UNORM; + case D3DFMT_A8R3G3B2: + return DXGI_FORMAT_R8G8B8A8_UNORM; + case D3DFMT_X4R4G4B4: + return DXGI_FORMAT_R8G8B8A8_UNORM; + case D3DFMT_A2B10G10R10: + return DXGI_FORMAT_R10G10B10A2_UNORM; + case D3DFMT_A8B8G8R8: + case D3DFMT_X8B8G8R8: + return DXGI_FORMAT_B8G8R8A8_UNORM; + case D3DFMT_G16R16: + return DXGI_FORMAT_R16G16_UNORM; + case D3DFMT_A2R10G10B10: + return DXGI_FORMAT_R10G10B10A2_UNORM; + case D3DFMT_A16B16G16R16: + return DXGI_FORMAT_R16G16B16A16_UNORM; + case D3DFMT_R16F: + return DXGI_FORMAT_R16_FLOAT; + case D3DFMT_G16R16F: + return DXGI_FORMAT_R16G16_FLOAT; + case D3DFMT_A16B16G16R16F: + return DXGI_FORMAT_R16G16B16A16_FLOAT; + case D3DFMT_R32F: + return DXGI_FORMAT_R32_FLOAT; + case D3DFMT_G32R32F: + return DXGI_FORMAT_R32G32_FLOAT; + case D3DFMT_A32B32G32R32F: + return DXGI_FORMAT_R32G32B32A32_FLOAT; + } + return DXGI_FORMAT_UNKNOWN; +} + + +D3DFORMAT WINAPI ConvertFormatDXGIToD3D9( DXGI_FORMAT fmt ) +{ + switch( fmt ) + { + case DXGI_FORMAT_UNKNOWN: + return D3DFMT_UNKNOWN; + case DXGI_FORMAT_R8G8B8A8_UNORM: + return D3DFMT_A8R8G8B8; + case DXGI_FORMAT_B5G6R5_UNORM: + return D3DFMT_R5G6B5; + case DXGI_FORMAT_B5G5R5A1_UNORM: + return D3DFMT_A1R5G5B5; + case DXGI_FORMAT_A8_UNORM: + return D3DFMT_A8; + case DXGI_FORMAT_R10G10B10A2_UNORM: + return D3DFMT_A2B10G10R10; + case DXGI_FORMAT_B8G8R8A8_UNORM: + return D3DFMT_A8B8G8R8; + case DXGI_FORMAT_R16G16_UNORM: + return D3DFMT_G16R16; + case DXGI_FORMAT_R16G16B16A16_UNORM: + return D3DFMT_A16B16G16R16; + case DXGI_FORMAT_R16_FLOAT: + return D3DFMT_R16F; + case DXGI_FORMAT_R16G16_FLOAT: + return D3DFMT_G16R16F; + case DXGI_FORMAT_R16G16B16A16_FLOAT: + return D3DFMT_A16B16G16R16F; + case DXGI_FORMAT_R32_FLOAT: + return D3DFMT_R32F; + case DXGI_FORMAT_R32G32_FLOAT: + return D3DFMT_G32R32F; + case DXGI_FORMAT_R32G32B32A32_FLOAT: + return D3DFMT_A32B32G32R32F; + } + return D3DFMT_UNKNOWN; +} + +//-------------------------------------------------------------------------------------- +IDirect3DDevice9* WINAPI DXUTCreateRefDevice9( HWND hWnd, bool bNullRef ) +{ + HRESULT hr; + IDirect3D9* pD3D = DXUT_Dynamic_Direct3DCreate9( D3D_SDK_VERSION ); + if( NULL == pD3D ) + return NULL; + + D3DDISPLAYMODE Mode; + pD3D->GetAdapterDisplayMode( 0, &Mode ); + + D3DPRESENT_PARAMETERS pp; + ZeroMemory( &pp, sizeof( D3DPRESENT_PARAMETERS ) ); + pp.BackBufferWidth = 1; + pp.BackBufferHeight = 1; + pp.BackBufferFormat = Mode.Format; + pp.BackBufferCount = 1; + pp.SwapEffect = D3DSWAPEFFECT_COPY; + pp.Windowed = TRUE; + pp.hDeviceWindow = hWnd; + + IDirect3DDevice9* pd3dDevice = NULL; + hr = pD3D->CreateDevice( D3DADAPTER_DEFAULT, bNullRef ? D3DDEVTYPE_NULLREF : D3DDEVTYPE_REF, + hWnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &pp, &pd3dDevice ); + + SAFE_RELEASE( pD3D ); + return pd3dDevice; +} + + +//-------------------------------------------------------------------------------------- +// Helper function to launch the Media Center UI after the program terminates +//-------------------------------------------------------------------------------------- +bool DXUTReLaunchMediaCenter() +{ + // Get the path to Media Center + WCHAR szExpandedPath[MAX_PATH]; + if( !ExpandEnvironmentStrings( L"%SystemRoot%\\ehome\\ehshell.exe", szExpandedPath, MAX_PATH ) ) + return false; + + // Skip if ehshell.exe doesn't exist + if( GetFileAttributes( szExpandedPath ) == 0xFFFFFFFF ) + return false; + + // Launch ehshell.exe + INT_PTR result = ( INT_PTR )ShellExecute( NULL, TEXT( "open" ), szExpandedPath, NULL, NULL, SW_SHOWNORMAL ); + return ( result > 32 ); +} + +typedef DWORD ( WINAPI* LPXINPUTGETSTATE )( DWORD dwUserIndex, XINPUT_STATE* pState ); +typedef DWORD ( WINAPI* LPXINPUTSETSTATE )( DWORD dwUserIndex, XINPUT_VIBRATION* pVibration ); +typedef DWORD ( WINAPI* LPXINPUTGETCAPABILITIES )( DWORD dwUserIndex, DWORD dwFlags, + XINPUT_CAPABILITIES* pCapabilities ); +typedef void ( WINAPI* LPXINPUTENABLE )( BOOL bEnable ); + +//-------------------------------------------------------------------------------------- +// Does extra processing on XInput data to make it slightly more convenient to use +//-------------------------------------------------------------------------------------- +HRESULT DXUTGetGamepadState( DWORD dwPort, DXUT_GAMEPAD* pGamePad, bool bThumbstickDeadZone, + bool bSnapThumbstickToCardinals ) +{ + if( dwPort >= DXUT_MAX_CONTROLLERS || pGamePad == NULL ) + return E_FAIL; + + static LPXINPUTGETSTATE s_pXInputGetState = NULL; + static LPXINPUTGETCAPABILITIES s_pXInputGetCapabilities = NULL; + if( NULL == s_pXInputGetState || NULL == s_pXInputGetCapabilities ) + { + HINSTANCE hInst = LoadLibrary( XINPUT_DLL ); + if( hInst ) + { + s_pXInputGetState = ( LPXINPUTGETSTATE )GetProcAddress( hInst, "XInputGetState" ); + s_pXInputGetCapabilities = ( LPXINPUTGETCAPABILITIES )GetProcAddress( hInst, "XInputGetCapabilities" ); + } + } + if( s_pXInputGetState == NULL ) + return E_FAIL; + + XINPUT_STATE InputState; + DWORD dwResult = s_pXInputGetState( dwPort, &InputState ); + + // Track insertion and removals + BOOL bWasConnected = pGamePad->bConnected; + pGamePad->bConnected = ( dwResult == ERROR_SUCCESS ); + pGamePad->bRemoved = ( bWasConnected && !pGamePad->bConnected ); + pGamePad->bInserted = ( !bWasConnected && pGamePad->bConnected ); + + // Don't update rest of the state if not connected + if( !pGamePad->bConnected ) + return S_OK; + + // Store the capabilities of the device + if( pGamePad->bInserted ) + { + ZeroMemory( pGamePad, sizeof( DXUT_GAMEPAD ) ); + pGamePad->bConnected = true; + pGamePad->bInserted = true; + if( s_pXInputGetCapabilities ) + s_pXInputGetCapabilities( dwPort, XINPUT_DEVTYPE_GAMEPAD, &pGamePad->caps ); + } + + // Copy gamepad to local structure (assumes that XINPUT_GAMEPAD at the front in CONTROLER_STATE) + memcpy( pGamePad, &InputState.Gamepad, sizeof( XINPUT_GAMEPAD ) ); + + if( bSnapThumbstickToCardinals ) + { + // Apply deadzone to each axis independantly to slightly snap to up/down/left/right + if( pGamePad->sThumbLX < XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE && + pGamePad->sThumbLX > -XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE ) + pGamePad->sThumbLX = 0; + if( pGamePad->sThumbLY < XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE && + pGamePad->sThumbLY > -XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE ) + pGamePad->sThumbLY = 0; + if( pGamePad->sThumbRX < XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE && + pGamePad->sThumbRX > -XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE ) + pGamePad->sThumbRX = 0; + if( pGamePad->sThumbRY < XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE && + pGamePad->sThumbRY > -XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE ) + pGamePad->sThumbRY = 0; + } + else if( bThumbstickDeadZone ) + { + // Apply deadzone if centered + if( ( pGamePad->sThumbLX < XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE && + pGamePad->sThumbLX > -XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE ) && + ( pGamePad->sThumbLY < XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE && + pGamePad->sThumbLY > -XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE ) ) + { + pGamePad->sThumbLX = 0; + pGamePad->sThumbLY = 0; + } + if( ( pGamePad->sThumbRX < XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE && + pGamePad->sThumbRX > -XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE ) && + ( pGamePad->sThumbRY < XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE && + pGamePad->sThumbRY > -XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE ) ) + { + pGamePad->sThumbRX = 0; + pGamePad->sThumbRY = 0; + } + } + + // Convert [-1,+1] range + pGamePad->fThumbLX = pGamePad->sThumbLX / 32767.0f; + pGamePad->fThumbLY = pGamePad->sThumbLY / 32767.0f; + pGamePad->fThumbRX = pGamePad->sThumbRX / 32767.0f; + pGamePad->fThumbRY = pGamePad->sThumbRY / 32767.0f; + + // Get the boolean buttons that have been pressed since the last call. + // Each button is represented by one bit. + pGamePad->wPressedButtons = ( pGamePad->wLastButtons ^ pGamePad->wButtons ) & pGamePad->wButtons; + pGamePad->wLastButtons = pGamePad->wButtons; + + // Figure out if the left trigger has been pressed or released + bool bPressed = ( pGamePad->bLeftTrigger > DXUT_GAMEPAD_TRIGGER_THRESHOLD ); + pGamePad->bPressedLeftTrigger = ( bPressed ) ? !pGamePad->bLastLeftTrigger : false; + pGamePad->bLastLeftTrigger = bPressed; + + // Figure out if the right trigger has been pressed or released + bPressed = ( pGamePad->bRightTrigger > DXUT_GAMEPAD_TRIGGER_THRESHOLD ); + pGamePad->bPressedRightTrigger = ( bPressed ) ? !pGamePad->bLastRightTrigger : false; + pGamePad->bLastRightTrigger = bPressed; + + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +// Don't pause the game or deactive the window without first stopping rumble otherwise +// the controller will continue to rumble +//-------------------------------------------------------------------------------------- +void DXUTEnableXInput( bool bEnable ) +{ + static LPXINPUTENABLE s_pXInputEnable = NULL; + if( NULL == s_pXInputEnable ) + { + HINSTANCE hInst = LoadLibrary( XINPUT_DLL ); + if( hInst ) + s_pXInputEnable = ( LPXINPUTENABLE )GetProcAddress( hInst, "XInputEnable" ); + } + + if( s_pXInputEnable ) + s_pXInputEnable( bEnable ); +} + + +//-------------------------------------------------------------------------------------- +// Don't pause the game or deactive the window without first stopping rumble otherwise +// the controller will continue to rumble +//-------------------------------------------------------------------------------------- +HRESULT DXUTStopRumbleOnAllControllers() +{ + static LPXINPUTSETSTATE s_pXInputSetState = NULL; + if( NULL == s_pXInputSetState ) + { + HINSTANCE hInst = LoadLibrary( XINPUT_DLL ); + if( hInst ) + s_pXInputSetState = ( LPXINPUTSETSTATE )GetProcAddress( hInst, "XInputSetState" ); + } + if( s_pXInputSetState == NULL ) + return E_FAIL; + + XINPUT_VIBRATION vibration; + vibration.wLeftMotorSpeed = 0; + vibration.wRightMotorSpeed = 0; + for( int iUserIndex = 0; iUserIndex < DXUT_MAX_CONTROLLERS; iUserIndex++ ) + s_pXInputSetState( iUserIndex, &vibration ); + + return S_OK; +} + +//-------------------------------------------------------------------------------------- +// Helper functions to create SRGB formats from typeless formats and vice versa +//-------------------------------------------------------------------------------------- +DXGI_FORMAT MAKE_SRGB( DXGI_FORMAT format ) +{ + if( !DXUTIsInGammaCorrectMode() ) + return format; + + switch( format ) + { + case DXGI_FORMAT_R8G8B8A8_TYPELESS: + case DXGI_FORMAT_R8G8B8A8_UNORM: + case DXGI_FORMAT_R8G8B8A8_UINT: + case DXGI_FORMAT_R8G8B8A8_SNORM: + case DXGI_FORMAT_R8G8B8A8_SINT: + return DXGI_FORMAT_R8G8B8A8_UNORM_SRGB; + + case DXGI_FORMAT_BC1_TYPELESS: + case DXGI_FORMAT_BC1_UNORM: + return DXGI_FORMAT_BC1_UNORM_SRGB; + case DXGI_FORMAT_BC2_TYPELESS: + case DXGI_FORMAT_BC2_UNORM: + return DXGI_FORMAT_BC2_UNORM_SRGB; + case DXGI_FORMAT_BC3_TYPELESS: + case DXGI_FORMAT_BC3_UNORM: + return DXGI_FORMAT_BC3_UNORM_SRGB; + + }; + + return format; +} + +//-------------------------------------------------------------------------------------- +DXGI_FORMAT MAKE_TYPELESS( DXGI_FORMAT format ) +{ + if( !DXUTIsInGammaCorrectMode() ) + return format; + + switch( format ) + { + case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB: + case DXGI_FORMAT_R8G8B8A8_UNORM: + case DXGI_FORMAT_R8G8B8A8_UINT: + case DXGI_FORMAT_R8G8B8A8_SNORM: + case DXGI_FORMAT_R8G8B8A8_SINT: + return DXGI_FORMAT_R8G8B8A8_TYPELESS; + + case DXGI_FORMAT_BC1_UNORM_SRGB: + case DXGI_FORMAT_BC1_UNORM: + return DXGI_FORMAT_BC1_TYPELESS; + case DXGI_FORMAT_BC2_UNORM_SRGB: + case DXGI_FORMAT_BC2_UNORM: + return DXGI_FORMAT_BC2_TYPELESS; + case DXGI_FORMAT_BC3_UNORM_SRGB: + case DXGI_FORMAT_BC3_UNORM: + return DXGI_FORMAT_BC3_TYPELESS; + }; + + return format; +} + +//-------------------------------------------------------------------------------------- +HRESULT DXUTSnapD3D9Screenshot( LPCTSTR szFileName ) +{ + HRESULT hr = S_OK; + IDirect3DDevice9* pDev = DXUTGetD3D9Device(); + if( !pDev ) + return E_FAIL; + + IDirect3DSurface9* pBackBuffer = NULL; + V_RETURN( pDev->GetBackBuffer( 0, 0, D3DBACKBUFFER_TYPE_MONO, &pBackBuffer ) ); + + return D3DXSaveSurfaceToFile( szFileName, D3DXIFF_BMP, pBackBuffer, NULL, NULL ); +} + + + + +//-------------------------------------------------------------------------------------- +HRESULT DXUTSnapD3D11Screenshot( LPCTSTR szFileName, D3DX11_IMAGE_FILE_FORMAT iff ) +{ + IDXGISwapChain *pSwap = DXUTGetDXGISwapChain(); + + if (!pSwap) + return E_FAIL; + + ID3D11Texture2D* pBackBuffer; + HRESULT hr = pSwap->GetBuffer( 0, __uuidof( *pBackBuffer ), ( LPVOID* )&pBackBuffer ); + if (hr != S_OK) + return hr; + + ID3D11DeviceContext *dc = DXUTGetD3D11DeviceContext(); + if (!dc) { + SAFE_RELEASE(pBackBuffer); + return E_FAIL; + } + ID3D11Device *pDevice = DXUTGetD3D11Device(); + if (!dc) { + SAFE_RELEASE(pBackBuffer); + return E_FAIL; + } + + D3D11_TEXTURE2D_DESC dsc; + pBackBuffer->GetDesc(&dsc); + D3D11_RESOURCE_DIMENSION dim; + pBackBuffer->GetType(&dim); + // special case msaa textures + ID3D11Texture2D *pCompatableTexture = pBackBuffer; + if ( dsc.SampleDesc.Count > 1) { + D3D11_TEXTURE2D_DESC dsc_new = dsc; + dsc_new.SampleDesc.Count = 1; + dsc_new.SampleDesc.Quality = 0; + dsc_new.Usage = D3D11_USAGE_DEFAULT; + dsc_new.BindFlags = 0; + dsc_new.CPUAccessFlags = 0; + ID3D11Texture2D *resolveTexture; + hr = pDevice->CreateTexture2D(&dsc_new, NULL, &resolveTexture); + dc->ResolveSubresource(resolveTexture, 0, pBackBuffer, 0, dsc.Format); + pCompatableTexture = resolveTexture; + pCompatableTexture->GetDesc(&dsc); + } + + hr = D3DX11SaveTextureToFileW(dc, pCompatableTexture, iff, szFileName); + + + SAFE_RELEASE(pBackBuffer); + SAFE_RELEASE(pCompatableTexture); + + return hr; + +} diff --git a/Demos/DX11ClothDemo/DXUT/Core/DXUTmisc.h b/Demos/DX11ClothDemo/DXUT/Core/DXUTmisc.h new file mode 100644 index 000000000..74ac06405 --- /dev/null +++ b/Demos/DX11ClothDemo/DXUT/Core/DXUTmisc.h @@ -0,0 +1,594 @@ +//-------------------------------------------------------------------------------------- +// File: DXUTMisc.h +// +// Helper functions for Direct3D programming. +// +// Copyright (c) Microsoft Corporation. All rights reserved +//-------------------------------------------------------------------------------------- +#pragma once +#ifndef DXUT_MISC_H +#define DXUT_MISC_H + +#ifndef MAX_FVF_DECL_SIZE +#define MAX_FVF_DECL_SIZE MAXD3DDECLLENGTH + 1 // +1 for END +#endif + +//-------------------------------------------------------------------------------------- +// XInput helper state/function +// This performs extra processing on XInput gamepad data to make it slightly more convenient to use +// +// Example usage: +// +// DXUT_GAMEPAD gamepad[4]; +// for( DWORD iPort=0; iPort class CGrowableArray +{ +public: + CGrowableArray() { m_pData = NULL; m_nSize = 0; m_nMaxSize = 0; } + CGrowableArray( const CGrowableArray& a ) { for( int i=0; i < a.m_nSize; i++ ) Add( a.m_pData[i] ); } + ~CGrowableArray() { RemoveAll(); } + + const TYPE& operator[]( int nIndex ) const { return GetAt( nIndex ); } + TYPE& operator[]( int nIndex ) { return GetAt( nIndex ); } + + CGrowableArray& operator=( const CGrowableArray& a ) { if( this == &a ) return *this; RemoveAll(); for( int i=0; i < a.m_nSize; i++ ) Add( a.m_pData[i] ); return *this; } + + HRESULT SetSize( int nNewMaxSize ); + HRESULT Add( const TYPE& value ); + HRESULT Insert( int nIndex, const TYPE& value ); + HRESULT SetAt( int nIndex, const TYPE& value ); + TYPE& GetAt( int nIndex ) const { assert( nIndex >= 0 && nIndex < m_nSize ); return m_pData[nIndex]; } + int GetSize() const { return m_nSize; } + TYPE* GetData() { return m_pData; } + bool Contains( const TYPE& value ){ return ( -1 != IndexOf( value ) ); } + + int IndexOf( const TYPE& value ) { return ( m_nSize > 0 ) ? IndexOf( value, 0, m_nSize ) : -1; } + int IndexOf( const TYPE& value, int iStart ) { return IndexOf( value, iStart, m_nSize - iStart ); } + int IndexOf( const TYPE& value, int nIndex, int nNumElements ); + + int LastIndexOf( const TYPE& value ) { return ( m_nSize > 0 ) ? LastIndexOf( value, m_nSize-1, m_nSize ) : -1; } + int LastIndexOf( const TYPE& value, int nIndex ) { return LastIndexOf( value, nIndex, nIndex+1 ); } + int LastIndexOf( const TYPE& value, int nIndex, int nNumElements ); + + HRESULT Remove( int nIndex ); + void RemoveAll() { SetSize(0); } + void Reset() { m_nSize = 0; } + +protected: + TYPE* m_pData; // the actual array of data + int m_nSize; // # of elements (upperBound - 1) + int m_nMaxSize; // max allocated + + HRESULT SetSizeInternal( int nNewMaxSize ); // This version doesn't call ctor or dtor. +}; + + +//-------------------------------------------------------------------------------------- +// Performs timer operations +// Use DXUTGetGlobalTimer() to get the global instance +//-------------------------------------------------------------------------------------- +class CDXUTTimer +{ +public: + CDXUTTimer(); + + void Reset(); // resets the timer + void Start(); // starts the timer + void Stop(); // stop (or pause) the timer + void Advance(); // advance the timer by 0.1 seconds + double GetAbsoluteTime(); // get the absolute system time + double GetTime(); // get the current time + float GetElapsedTime(); // get the time that elapsed between Get*ElapsedTime() calls + void GetTimeValues( double* pfTime, double* pfAbsoluteTime, float* pfElapsedTime ); // get all time values at once + bool IsStopped(); // returns true if timer stopped + + // Limit the current thread to one processor (the current one). This ensures that timing code runs + // on only one processor, and will not suffer any ill effects from power management. + void LimitThreadAffinityToCurrentProc(); + +protected: + LARGE_INTEGER GetAdjustedCurrentTime(); + + bool m_bUsingQPF; + bool m_bTimerStopped; + LONGLONG m_llQPFTicksPerSec; + + LONGLONG m_llStopTime; + LONGLONG m_llLastElapsedTime; + LONGLONG m_llBaseTime; +}; + +CDXUTTimer* WINAPI DXUTGetGlobalTimer(); + + +//-------------------------------------------------------------------------------------- +// Returns the string for the given D3DFORMAT. +// bWithPrefix determines whether the string should include the "D3DFMT_" +//-------------------------------------------------------------------------------------- +LPCWSTR WINAPI DXUTD3DFormatToString( D3DFORMAT format, bool bWithPrefix ); + + +//-------------------------------------------------------------------------------------- +// Returns the string for the given DXGI_FORMAT. +// bWithPrefix determines whether the string should include the "DXGI_FORMAT_" +//-------------------------------------------------------------------------------------- +LPCWSTR WINAPI DXUTDXGIFormatToString( DXGI_FORMAT format, bool bWithPrefix ); + + +//-------------------------------------------------------------------------------------- +// Device settings conversion +//-------------------------------------------------------------------------------------- +void WINAPI DXUTConvertDeviceSettings11to9( DXUTD3D11DeviceSettings* pIn, DXUTD3D9DeviceSettings* pOut ); +void WINAPI DXUTConvertDeviceSettings9to11( DXUTD3D9DeviceSettings* pIn, DXUTD3D11DeviceSettings* pOut ); + +DXGI_FORMAT WINAPI ConvertFormatD3D9ToDXGI( D3DFORMAT fmt ); +D3DFORMAT WINAPI ConvertFormatDXGIToD3D9( DXGI_FORMAT fmt ); + + +//-------------------------------------------------------------------------------------- +// Debug printing support +// See dxerr.h for more debug printing support +//-------------------------------------------------------------------------------------- +void WINAPI DXUTOutputDebugStringW( LPCWSTR strMsg, ... ); +void WINAPI DXUTOutputDebugStringA( LPCSTR strMsg, ... ); +HRESULT WINAPI DXUTTrace( const CHAR* strFile, DWORD dwLine, HRESULT hr, const WCHAR* strMsg, bool bPopMsgBox ); +void WINAPI DXUTTraceDecl( D3DVERTEXELEMENT9 decl[MAX_FVF_DECL_SIZE] ); +WCHAR* WINAPI DXUTTraceD3DDECLUSAGEtoString( BYTE u ); +WCHAR* WINAPI DXUTTraceD3DDECLMETHODtoString( BYTE m ); +WCHAR* WINAPI DXUTTraceD3DDECLTYPEtoString( BYTE t ); +WCHAR* WINAPI DXUTTraceWindowsMessage( UINT uMsg ); + +#ifdef UNICODE +#define DXUTOutputDebugString DXUTOutputDebugStringW +#else +#define DXUTOutputDebugString DXUTOutputDebugStringA +#endif + +// These macros are very similar to dxerr's but it special cases the HRESULT defined +// by DXUT to pop better message boxes. +#if defined(DEBUG) || defined(_DEBUG) +#define DXUT_ERR(str,hr) DXUTTrace( __FILE__, (DWORD)__LINE__, hr, str, false ) +#define DXUT_ERR_MSGBOX(str,hr) DXUTTrace( __FILE__, (DWORD)__LINE__, hr, str, true ) +#define DXUTTRACE DXUTOutputDebugString +#else +#define DXUT_ERR(str,hr) (hr) +#define DXUT_ERR_MSGBOX(str,hr) (hr) +#define DXUTTRACE (__noop) +#endif + + +//-------------------------------------------------------------------------------------- +// Direct3D9 dynamic linking support -- calls top-level D3D9 APIs with graceful +// failure if APIs are not present. +//-------------------------------------------------------------------------------------- + +IDirect3D9 * WINAPI DXUT_Dynamic_Direct3DCreate9(UINT SDKVersion); +int WINAPI DXUT_Dynamic_D3DPERF_BeginEvent( D3DCOLOR col, LPCWSTR wszName ); +int WINAPI DXUT_Dynamic_D3DPERF_EndEvent( void ); +void WINAPI DXUT_Dynamic_D3DPERF_SetMarker( D3DCOLOR col, LPCWSTR wszName ); +void WINAPI DXUT_Dynamic_D3DPERF_SetRegion( D3DCOLOR col, LPCWSTR wszName ); +BOOL WINAPI DXUT_Dynamic_D3DPERF_QueryRepeatFrame( void ); +void WINAPI DXUT_Dynamic_D3DPERF_SetOptions( DWORD dwOptions ); +DWORD WINAPI DXUT_Dynamic_D3DPERF_GetStatus( void ); +HRESULT WINAPI DXUT_Dynamic_CreateDXGIFactory1( REFIID rInterface, void** ppOut ); + +HRESULT WINAPI DXUT_Dynamic_D3D11CreateDevice( IDXGIAdapter* pAdapter, + D3D_DRIVER_TYPE DriverType, + HMODULE Software, + UINT32 Flags, + D3D_FEATURE_LEVEL* pFeatureLevels, + UINT FeatureLevels, + UINT32 SDKVersion, + ID3D11Device** ppDevice, + D3D_FEATURE_LEVEL* pFeatureLevel, + ID3D11DeviceContext** ppImmediateContext ); + +bool DXUT_EnsureD3D11APIs( void ); + + +//-------------------------------------------------------------------------------------- +// Profiling/instrumentation support +//-------------------------------------------------------------------------------------- + +//-------------------------------------------------------------------------------------- +// Some D3DPERF APIs take a color that can be used when displaying user events in +// performance analysis tools. The following constants are provided for your +// convenience, but you can use any colors you like. +//-------------------------------------------------------------------------------------- +const D3DCOLOR DXUT_PERFEVENTCOLOR = D3DCOLOR_XRGB( 200, 100, 100 ); +const D3DCOLOR DXUT_PERFEVENTCOLOR2 = D3DCOLOR_XRGB( 100, 200, 100 ); +const D3DCOLOR DXUT_PERFEVENTCOLOR3 = D3DCOLOR_XRGB( 100, 100, 200 ); + +//-------------------------------------------------------------------------------------- +// The following macros provide a convenient way for your code to call the D3DPERF +// functions only when PROFILE is defined. If PROFILE is not defined (as for the final +// release version of a program), these macros evaluate to nothing, so no detailed event +// information is embedded in your shipping program. It is recommended that you create +// and use three build configurations for your projects: +// Debug (nonoptimized code, asserts active, PROFILE defined to assist debugging) +// Profile (optimized code, asserts disabled, PROFILE defined to assist optimization) +// Release (optimized code, asserts disabled, PROFILE not defined) +//-------------------------------------------------------------------------------------- +#ifdef PROFILE +// PROFILE is defined, so these macros call the D3DPERF functions +#define DXUT_BeginPerfEvent( color, pstrMessage ) DXUT_Dynamic_D3DPERF_BeginEvent( color, pstrMessage ) +#define DXUT_EndPerfEvent() DXUT_Dynamic_D3DPERF_EndEvent() +#define DXUT_SetPerfMarker( color, pstrMessage ) DXUT_Dynamic_D3DPERF_SetMarker( color, pstrMessage ) +#else +// PROFILE is not defined, so these macros do nothing +#define DXUT_BeginPerfEvent( color, pstrMessage ) (__noop) +#define DXUT_EndPerfEvent() (__noop) +#define DXUT_SetPerfMarker( color, pstrMessage ) (__noop) +#endif + +//-------------------------------------------------------------------------------------- +// CDXUTPerfEventGenerator is a helper class that makes it easy to attach begin and end +// events to a block of code. Simply define a CDXUTPerfEventGenerator variable anywhere +// in a block of code, and the class's constructor will call DXUT_BeginPerfEvent when +// the block of code begins, and the class's destructor will call DXUT_EndPerfEvent when +// the block ends. +//-------------------------------------------------------------------------------------- +class CDXUTPerfEventGenerator +{ +public: +CDXUTPerfEventGenerator( D3DCOLOR color, LPCWSTR pstrMessage ) +{ + DXUT_BeginPerfEvent( color, pstrMessage ); +} +~CDXUTPerfEventGenerator( void ) +{ + DXUT_EndPerfEvent(); +} +}; + + +//-------------------------------------------------------------------------------------- +// Multimon handling to support OSes with or without multimon API support. +// Purposely avoiding the use of multimon.h so DXUT.lib doesn't require +// COMPILE_MULTIMON_STUBS and cause complication with MFC or other users of multimon.h +//-------------------------------------------------------------------------------------- +#ifndef MONITOR_DEFAULTTOPRIMARY +#define MONITORINFOF_PRIMARY 0x00000001 +#define MONITOR_DEFAULTTONULL 0x00000000 +#define MONITOR_DEFAULTTOPRIMARY 0x00000001 +#define MONITOR_DEFAULTTONEAREST 0x00000002 +typedef struct tagMONITORINFO +{ + DWORD cbSize; + RECT rcMonitor; + RECT rcWork; + DWORD dwFlags; +} MONITORINFO, *LPMONITORINFO; +typedef struct tagMONITORINFOEXW : public tagMONITORINFO +{ + WCHAR szDevice[CCHDEVICENAME]; +} MONITORINFOEXW, *LPMONITORINFOEXW; +typedef MONITORINFOEXW MONITORINFOEX; +typedef LPMONITORINFOEXW LPMONITORINFOEX; +#endif + +HMONITOR WINAPI DXUTMonitorFromWindow( HWND hWnd, DWORD dwFlags ); +HMONITOR WINAPI DXUTMonitorFromRect( LPCRECT lprcScreenCoords, DWORD dwFlags ); +BOOL WINAPI DXUTGetMonitorInfo( HMONITOR hMonitor, LPMONITORINFO lpMonitorInfo ); +void WINAPI DXUTGetDesktopResolution( UINT AdapterOrdinal, UINT* pWidth, UINT* pHeight ); + + +//-------------------------------------------------------------------------------------- +// Implementation of CGrowableArray +//-------------------------------------------------------------------------------------- + +// This version doesn't call ctor or dtor. +template HRESULT CGrowableArray ::SetSizeInternal( int nNewMaxSize ) +{ + if( nNewMaxSize < 0 || ( nNewMaxSize > INT_MAX / sizeof( TYPE ) ) ) + { + assert( false ); + return E_INVALIDARG; + } + + if( nNewMaxSize == 0 ) + { + // Shrink to 0 size & cleanup + if( m_pData ) + { + free( m_pData ); + m_pData = NULL; + } + + m_nMaxSize = 0; + m_nSize = 0; + } + else if( m_pData == NULL || nNewMaxSize > m_nMaxSize ) + { + // Grow array + int nGrowBy = ( m_nMaxSize == 0 ) ? 16 : m_nMaxSize; + + // Limit nGrowBy to keep m_nMaxSize less than INT_MAX + if( ( UINT )m_nMaxSize + ( UINT )nGrowBy > ( UINT )INT_MAX ) + nGrowBy = INT_MAX - m_nMaxSize; + + nNewMaxSize = __max( nNewMaxSize, m_nMaxSize + nGrowBy ); + + // Verify that (nNewMaxSize * sizeof(TYPE)) is not greater than UINT_MAX or the realloc will overrun + if( sizeof( TYPE ) > UINT_MAX / ( UINT )nNewMaxSize ) + return E_INVALIDARG; + + TYPE* pDataNew = ( TYPE* )realloc( m_pData, nNewMaxSize * sizeof( TYPE ) ); + if( pDataNew == NULL ) + return E_OUTOFMEMORY; + + m_pData = pDataNew; + m_nMaxSize = nNewMaxSize; + } + + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +template HRESULT CGrowableArray ::SetSize( int nNewMaxSize ) +{ + int nOldSize = m_nSize; + + if( nOldSize > nNewMaxSize ) + { + assert( m_pData ); + if( m_pData ) + { + // Removing elements. Call dtor. + + for( int i = nNewMaxSize; i < nOldSize; ++i ) + m_pData[i].~TYPE(); + } + } + + // Adjust buffer. Note that there's no need to check for error + // since if it happens, nOldSize == nNewMaxSize will be true.) + HRESULT hr = SetSizeInternal( nNewMaxSize ); + + if( nOldSize < nNewMaxSize ) + { + assert( m_pData ); + if( m_pData ) + { + // Adding elements. Call ctor. + + for( int i = nOldSize; i < nNewMaxSize; ++i ) + ::new ( &m_pData[i] ) TYPE; + } + } + + return hr; +} + + +//-------------------------------------------------------------------------------------- +template HRESULT CGrowableArray ::Add( const TYPE& value ) +{ + HRESULT hr; + if( FAILED( hr = SetSizeInternal( m_nSize + 1 ) ) ) + return hr; + + // Construct the new element + ::new ( &m_pData[m_nSize] ) TYPE; + + // Assign + m_pData[m_nSize] = value; + ++m_nSize; + + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +template HRESULT CGrowableArray ::Insert( int nIndex, const TYPE& value ) +{ + HRESULT hr; + + // Validate index + if( nIndex < 0 || + nIndex > m_nSize ) + { + assert( false ); + return E_INVALIDARG; + } + + // Prepare the buffer + if( FAILED( hr = SetSizeInternal( m_nSize + 1 ) ) ) + return hr; + + // Shift the array + MoveMemory( &m_pData[nIndex + 1], &m_pData[nIndex], sizeof( TYPE ) * ( m_nSize - nIndex ) ); + + // Construct the new element + ::new ( &m_pData[nIndex] ) TYPE; + + // Set the value and increase the size + m_pData[nIndex] = value; + ++m_nSize; + + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +template HRESULT CGrowableArray ::SetAt( int nIndex, const TYPE& value ) +{ + // Validate arguments + if( nIndex < 0 || + nIndex >= m_nSize ) + { + assert( false ); + return E_INVALIDARG; + } + + m_pData[nIndex] = value; + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +// Searches for the specified value and returns the index of the first occurrence +// within the section of the data array that extends from iStart and contains the +// specified number of elements. Returns -1 if value is not found within the given +// section. +//-------------------------------------------------------------------------------------- +template int CGrowableArray ::IndexOf( const TYPE& value, int iStart, int nNumElements ) +{ + // Validate arguments + if( iStart < 0 || + iStart >= m_nSize || + nNumElements < 0 || + iStart + nNumElements > m_nSize ) + { + assert( false ); + return -1; + } + + // Search + for( int i = iStart; i < ( iStart + nNumElements ); i++ ) + { + if( value == m_pData[i] ) + return i; + } + + // Not found + return -1; +} + + +//-------------------------------------------------------------------------------------- +// Searches for the specified value and returns the index of the last occurrence +// within the section of the data array that contains the specified number of elements +// and ends at iEnd. Returns -1 if value is not found within the given section. +//-------------------------------------------------------------------------------------- +template int CGrowableArray ::LastIndexOf( const TYPE& value, int iEnd, int nNumElements ) +{ + // Validate arguments + if( iEnd < 0 || + iEnd >= m_nSize || + nNumElements < 0 || + iEnd - nNumElements < 0 ) + { + assert( false ); + return -1; + } + + // Search + for( int i = iEnd; i > ( iEnd - nNumElements ); i-- ) + { + if( value == m_pData[i] ) + return i; + } + + // Not found + return -1; +} + + + +//-------------------------------------------------------------------------------------- +template HRESULT CGrowableArray ::Remove( int nIndex ) +{ + if( nIndex < 0 || + nIndex >= m_nSize ) + { + assert( false ); + return E_INVALIDARG; + } + + // Destruct the element to be removed + m_pData[nIndex].~TYPE(); + + // Compact the array and decrease the size + MoveMemory( &m_pData[nIndex], &m_pData[nIndex + 1], sizeof( TYPE ) * ( m_nSize - ( nIndex + 1 ) ) ); + --m_nSize; + + return S_OK; +} + +//-------------------------------------------------------------------------------------- +// Creates a REF or NULLREF D3D9 device and returns that device. The caller should call +// Release() when done with the device. +//-------------------------------------------------------------------------------------- +IDirect3DDevice9* WINAPI DXUTCreateRefDevice9( HWND hWnd, bool bNullRef = true ); + +//-------------------------------------------------------------------------------------- +// Creates a REF or NULLREF D3D10 device and returns the device. The caller should call +// Release() when done with the device. +//-------------------------------------------------------------------------------------- +//test d3d10 version ID3D10Device* WINAPI DXUTCreateRefDevice10( bool bNullRef = true ); + +//-------------------------------------------------------------------------------------- +// Helper function to launch the Media Center UI after the program terminates +//-------------------------------------------------------------------------------------- +bool DXUTReLaunchMediaCenter(); + +//-------------------------------------------------------------------------------------- +// Helper functions to create SRGB formats from typeless formats and vice versa +//-------------------------------------------------------------------------------------- +DXGI_FORMAT MAKE_SRGB( DXGI_FORMAT format ); +DXGI_FORMAT MAKE_TYPELESS( DXGI_FORMAT format ); + +#endif diff --git a/Demos/DX11ClothDemo/DXUT/Core/dpiaware.manifest b/Demos/DX11ClothDemo/DXUT/Core/dpiaware.manifest new file mode 100644 index 000000000..3d5eccc32 --- /dev/null +++ b/Demos/DX11ClothDemo/DXUT/Core/dpiaware.manifest @@ -0,0 +1,7 @@ + + + + true + + + \ No newline at end of file diff --git a/Demos/DX11ClothDemo/DXUT/Optional/DXUTLockFreePipe.h b/Demos/DX11ClothDemo/DXUT/Optional/DXUTLockFreePipe.h new file mode 100644 index 000000000..ed1074783 --- /dev/null +++ b/Demos/DX11ClothDemo/DXUT/Optional/DXUTLockFreePipe.h @@ -0,0 +1,227 @@ +//-------------------------------------------------------------------------------------- +// DXUTLockFreePipe.h +// +// See the "Lockless Programming Considerations for Xbox 360 and Microsoft Windows" +// article in the DirectX SDK for more details. +// +// http://msdn2.microsoft.com/en-us/library/bb310595.aspx +// +// XNA Developer Connection +// Copyright (C) Microsoft Corporation. All rights reserved. +//-------------------------------------------------------------------------------------- +#pragma once + +#include + +#ifdef _XBOX_VER + // Prevent the CPU from rearranging loads + // and stores, sufficiently for read-acquire + // and write-release. + #define DXUTImportBarrier __lwsync + #define DXUTExportBarrier __lwsync +#else + #pragma pack(push) + #pragma pack(8) + #include + #pragma pack (pop) + + extern "C" + void _ReadWriteBarrier(); + #pragma intrinsic(_ReadWriteBarrier) + + // Prevent the compiler from rearranging loads + // and stores, sufficiently for read-acquire + // and write-release. This is sufficient on + // x86 and x64. + #define DXUTImportBarrier _ReadWriteBarrier + #define DXUTExportBarrier _ReadWriteBarrier +#endif + +// +// Pipe class designed for use by at most two threads: one reader, one writer. +// Access by more than two threads isn't guaranteed to be safe. +// +// In order to provide efficient access the size of the buffer is passed +// as a template parameter and restricted to powers of two less than 31. +// + +template class DXUTLockFreePipe +{ +public: + DXUTLockFreePipe() : m_readOffset( 0 ), + m_writeOffset( 0 ) + { + } + + DWORD GetBufferSize() const + { + return c_cbBufferSize; + } + + __forceinline unsigned long BytesAvailable() const + { + return m_writeOffset - m_readOffset; + } + + bool __forceinline Read( void* pvDest, unsigned long cbDest ) + { + // Store the read and write offsets into local variables--this is + // essentially a snapshot of their values so that they stay constant + // for the duration of the function (and so we don't end up with cache + // misses due to false sharing). + DWORD readOffset = m_readOffset; + DWORD writeOffset = m_writeOffset; + + // Compare the two offsets to see if we have anything to read. + // Note that we don't do anything to synchronize the offsets here. + // Really there's not much we *can* do unless we're willing to completely + // synchronize access to the entire object. We have to assume that as we + // read, someone else may be writing, and the write offset we have now + // may be out of date by the time we read it. Fortunately that's not a + // very big deal. We might miss reading some data that was just written. + // But the assumption is that we'll be back before long to grab more data + // anyway. + // + // Note that this comparison works because we're careful to constrain + // the total buffer size to be a power of 2, which means it will divide + // evenly into ULONG_MAX+1. That, and the fact that the offsets are + // unsigned, means that the calculation returns correct results even + // when the values wrap around. + DWORD cbAvailable = writeOffset - readOffset; + if( cbDest > cbAvailable ) + { + return false; + } + + // The data has been made available, but we need to make sure + // that our view on the data is up to date -- at least as up to + // date as the control values we just read. We need to prevent + // the compiler or CPU from moving any of the data reads before + // the control value reads. This import barrier serves this + // purpose, on Xbox 360 and on Windows. + + // Reading a control value and then having a barrier is known + // as a "read-acquire." + DXUTImportBarrier(); + + unsigned char* pbDest = ( unsigned char* )pvDest; + + unsigned long actualReadOffset = readOffset & c_sizeMask; + unsigned long bytesLeft = cbDest; + + // + // Copy from the tail, then the head. Note that there's no explicit + // check to see if the write offset comes between the read offset + // and the end of the buffer--that particular condition is implicitly + // checked by the comparison with AvailableToRead(), above. If copying + // cbDest bytes off the tail would cause us to cross the write offset, + // then the previous comparison would have failed since that would imply + // that there were less than cbDest bytes available to read. + // + unsigned long cbTailBytes = min( bytesLeft, c_cbBufferSize - actualReadOffset ); + memcpy( pbDest, m_pbBuffer + actualReadOffset, cbTailBytes ); + bytesLeft -= cbTailBytes; + + if( bytesLeft ) + { + memcpy( pbDest + cbTailBytes, m_pbBuffer, bytesLeft ); + } + + // When we update the read offset we are, effectively, 'freeing' buffer + // memory so that the writing thread can use it. We need to make sure that + // we don't free the memory before we have finished reading it. That is, + // we need to make sure that the write to m_readOffset can't get reordered + // above the reads of the buffer data. The only way to guarantee this is to + // have an export barrier to prevent both compiler and CPU rearrangements. + DXUTExportBarrier(); + + // Advance the read offset. From the CPUs point of view this is several + // operations--read, modify, store--and we'd normally want to make sure that + // all of the operations happened atomically. But in the case of a single + // reader, only one thread updates this value and so the only operation that + // must be atomic is the store. That's lucky, because 32-bit aligned stores are + // atomic on all modern processors. + // + readOffset += cbDest; + m_readOffset = readOffset; + + return true; + } + + bool __forceinline Write( const void* pvSrc, unsigned long cbSrc ) + { + // Reading the read offset here has the same caveats as reading + // the write offset had in the Read() function above. + DWORD readOffset = m_readOffset; + DWORD writeOffset = m_writeOffset; + + // Compute the available write size. This comparison relies on + // the fact that the buffer size is always a power of 2, and the + // offsets are unsigned integers, so that when the write pointer + // wraps around the subtraction still yields a value (assuming + // we haven't messed up somewhere else) between 0 and c_cbBufferSize - 1. + DWORD cbAvailable = c_cbBufferSize - ( writeOffset - readOffset ); + if( cbSrc > cbAvailable ) + { + return false; + } + + // It is theoretically possible for writes of the data to be reordered + // above the reads to see if the data is available. Improbable perhaps, + // but possible. This barrier guarantees that the reordering will not + // happen. + DXUTImportBarrier(); + + // Write the data + const unsigned char* pbSrc = ( const unsigned char* )pvSrc; + unsigned long actualWriteOffset = writeOffset & c_sizeMask; + unsigned long bytesLeft = cbSrc; + + // See the explanation in the Read() function as to why we don't + // explicitly check against the read offset here. + unsigned long cbTailBytes = min( bytesLeft, c_cbBufferSize - actualWriteOffset ); + memcpy( m_pbBuffer + actualWriteOffset, pbSrc, cbTailBytes ); + bytesLeft -= cbTailBytes; + + if( bytesLeft ) + { + memcpy( m_pbBuffer, pbSrc + cbTailBytes, bytesLeft ); + } + + // Now it's time to update the write offset, but since the updated position + // of the write offset will imply that there's data to be read, we need to + // make sure that the data all actually gets written before the update to + // the write offset. The writes could be reordered by the compiler (on any + // platform) or by the CPU (on Xbox 360). We need a barrier which prevents + // the writes from being reordered past each other. + // + // Having a barrier and then writing a control value is called "write-release." + DXUTExportBarrier(); + + // See comments in Read() as to why this operation isn't interlocked. + writeOffset += cbSrc; + m_writeOffset = writeOffset; + + return true; + } + +private: + // Values derived from the buffer size template parameter + // + const static BYTE c_cbBufferSizeLog2 = min( cbBufferSizeLog2, 31 ); + const static DWORD c_cbBufferSize = ( 1 << c_cbBufferSizeLog2 ); + const static DWORD c_sizeMask = c_cbBufferSize - 1; + + // Leave these private and undefined to prevent their use + DXUTLockFreePipe( const DXUTLockFreePipe& ); + DXUTLockFreePipe& operator =( const DXUTLockFreePipe& ); + + // Member data + // + BYTE m_pbBuffer[c_cbBufferSize]; + // Note that these offsets are not clamped to the buffer size. + // Instead the calculations rely on wrapping at ULONG_MAX+1. + // See the comments in Read() for details. + volatile DWORD __declspec( align( 4 ) ) m_readOffset; + volatile DWORD __declspec( align( 4 ) ) m_writeOffset; +}; \ No newline at end of file diff --git a/Demos/DX11ClothDemo/DXUT/Optional/DXUTShapes.cpp b/Demos/DX11ClothDemo/DXUT/Optional/DXUTShapes.cpp new file mode 100644 index 000000000..9084926e4 --- /dev/null +++ b/Demos/DX11ClothDemo/DXUT/Optional/DXUTShapes.cpp @@ -0,0 +1,5663 @@ +//-------------------------------------------------------------------------------------- +// File: DXUTShapes.cpp +// +// Shape creation functions for DXUT +// +// Copyright (c) Microsoft Corporation. All rights reserved +//-------------------------------------------------------------------------------------- +#include "DXUT.h" +#include "DXUTShapes.h" + + +//-------------------------------------------------------------------------------------- +// VERTEX is the vertex layout for all DXUT created shapes +//-------------------------------------------------------------------------------------- +struct VERTEX +{ + D3DXVECTOR3 pos; + D3DXVECTOR3 norm; +}; + +static const D3D10_INPUT_ELEMENT_DESC s_ShapeLayout[] = +{ + { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D10_INPUT_PER_VERTEX_DATA, 0 }, + { "NORMAL", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 12, D3D10_INPUT_PER_VERTEX_DATA, 0 }, +}; + + +//-------------------------------------------------------------------------------------- +static inline void sincosf( float angle, float* psin, float* pcos ) +{ + *psin = sinf( angle ); + *pcos = cosf( angle ); +} + + +//-------------------------------------------------------------------------------------- +// Create D3DX10Mesh from the input vertex and index data +//-------------------------------------------------------------------------------------- +HRESULT CreateShapeMesh( ID3D10Device* pDev10, ID3DX10Mesh** ppMesh, VERTEX* pVertices, UINT NumVertices, + WORD* pIndices, UINT NumIndices ) +{ + HRESULT hr = S_OK; + + // Create the mesh + hr = D3DX10CreateMesh( pDev10, + s_ShapeLayout, + sizeof( s_ShapeLayout ) / sizeof( s_ShapeLayout[0] ), + s_ShapeLayout[0].SemanticName, + NumVertices, + NumIndices / 3, + 0, + ppMesh ); + if( FAILED( hr ) ) + return hr; + + // Set the Vertex Data + ( *ppMesh )->SetVertexData( 0, pVertices ); + + // Set the Index Data + ( *ppMesh )->SetIndexData( pIndices, NumIndices ); + + // Set attributes + DWORD dwNumAttr = 1; + D3DX10_ATTRIBUTE_RANGE* pAttr = new D3DX10_ATTRIBUTE_RANGE[dwNumAttr]; + if( !pAttr ) + return E_OUTOFMEMORY; + + pAttr[0].AttribId = 0; + pAttr[0].FaceStart = 0; + pAttr[0].FaceCount = NumIndices / 3; + pAttr[0].VertexStart = 0; + pAttr[0].VertexCount = NumVertices; + ( *ppMesh )->SetAttributeTable( pAttr, dwNumAttr ); + SAFE_DELETE_ARRAY( pAttr ); + + // Create the internal mesh VBs and IBs + ( *ppMesh )->CommitToDevice(); + + return hr; +} + + +//---------------------------------------------------------------------------- +// Box +//---------------------------------------------------------------------------- +static float cubeN[6][3] = +{ + {-1.0f, 0.0f, 0.0f}, {0.0f, 1.0f, 0.0f}, {1.0f, 0.0f, 0.0f}, + {0.0f, -1.0f, 0.0f}, {0.0f, 0.0f, 1.0f}, {0.0f, 0.0f, -1.0f} +}; + +static WORD cubeF[6][4] = +{ + { 0, 1, 5, 4 }, { 4, 5, 6, 7 }, { 7, 6, 2, 3 }, + { 1, 0, 3, 2 }, { 1, 2, 6, 5 }, { 0, 4, 7, 3 } +}; + +static float cubeV[8][3] = +{ + // Lower tier (lower in y) + {-.5f, -.5f, -.5f}, + {-.5f, -.5f, .5f}, + { .5f, -.5f, .5f}, + { .5f, -.5f, -.5f}, + + // Upper tier + {-.5f, .5f, -.5f}, + {-.5f, .5f, .5f}, + { .5f, .5f, .5f}, + { .5f, .5f, -.5f}, +}; + +static float cubeT[4][2] = +{ + // Lower tier (lower in y) + {0.0f, 0.0f}, + {0.0f, 1.0f}, + {1.0f, 1.0f}, + {1.0f, 0.0f} +}; + +static WORD cubeFT[6][4] = +{ + { 3, 0, 1, 2 }, { 0, 1, 2, 3 }, { 1, 2, 3, 0 }, + { 0, 1, 2, 3 }, { 3, 0, 1, 2 }, { 0, 1, 2, 3 } +}; + + +//-------------------------------------------------------------------------------------- +// MakeBox helper +//-------------------------------------------------------------------------------------- +static void MakeBox( +VERTEX* pVertices, +DWORD* pPointRep, +WORD* pwIndices, +float fWidth, +float fHeight, +float fDepth ) +{ + // Fill in the data + VERTEX* pVertex = pVertices; + WORD* pwFace = pwIndices; + UINT iVertex = 0; + + // i iterates over the faces, 2 triangles per face + for( int i = 0; i < 6; i++ ) + { + for( int j = 0; j < 4; j++ ) + { + pVertex->pos.x = cubeV[cubeF[i][j]][0] * fWidth; + pVertex->pos.y = cubeV[cubeF[i][j]][1] * fHeight; + pVertex->pos.z = cubeV[cubeF[i][j]][2] * fDepth; + + pVertex->norm.x = cubeN[i][0]; + pVertex->norm.y = cubeN[i][1]; + pVertex->norm.z = cubeN[i][2]; + + if( pPointRep != NULL ) + { + *pPointRep = cubeF[i][j]; + pPointRep++; + } + + pVertex++; + } + + pwFace[0] = ( WORD )( iVertex ); + pwFace[1] = ( WORD )( iVertex + 1 ); + pwFace[2] = ( WORD )( iVertex + 2 ); + pwFace += 3; + + pwFace[0] = ( WORD )( iVertex + 2 ); + pwFace[1] = ( WORD )( iVertex + 3 ); + pwFace[2] = ( WORD )( iVertex ); + pwFace += 3; + + iVertex += 4; + } +} + + +//-------------------------------------------------------------------------------------- +// DXUTCreateBox - create a box mesh +//-------------------------------------------------------------------------------------- +HRESULT WINAPI DXUTCreateBox( ID3D10Device* pDevice, float fWidth, float fHeight, float fDepth, ID3DX10Mesh** ppMesh ) +{ + HRESULT hr = S_OK; + + WORD* pwIndices = NULL; + VERTEX* pVertices = NULL; + + // Set up the defaults + if( D3DX_DEFAULT_FLOAT == fWidth ) + fWidth = 1.0f; + if( D3DX_DEFAULT_FLOAT == fHeight ) + fHeight = 1.0f; + if( D3DX_DEFAULT_FLOAT == fDepth ) + fDepth = 1.0f; + + + // Validate parameters + if( !pDevice ) + return D3DERR_INVALIDCALL; + if( !ppMesh ) + return D3DERR_INVALIDCALL; + if( fWidth < 0.0f ) + return D3DERR_INVALIDCALL; + if( fHeight < 0.0f ) + return D3DERR_INVALIDCALL; + if( fDepth < 0.0f ) + return D3DERR_INVALIDCALL; + + // Create the mesh + UINT cFaces = 12; + UINT cVertices = 24; + + // Create enough memory for the vertices and indices + pVertices = new VERTEX[ cVertices ]; + if( !pVertices ) + return E_OUTOFMEMORY; + pwIndices = new WORD[ cFaces * 3 ]; + if( !pwIndices ) + return E_OUTOFMEMORY; + + // Create a box + MakeBox( pVertices, NULL, pwIndices, fWidth, fHeight, fDepth ); + + // Create a mesh + hr = CreateShapeMesh( pDevice, ppMesh, pVertices, cVertices, pwIndices, cFaces * 3 ); + + // Free up the memory + SAFE_DELETE_ARRAY( pVertices ); + SAFE_DELETE_ARRAY( pwIndices ); + + return hr; + +} + +#define CACHE_SIZE 240 + +//---------------------------------------------------------------------------- +// MakeCylinder helper +//---------------------------------------------------------------------------- +static void MakeCylinder( +VERTEX* pVertices, +DWORD* pPointReps, +WORD* pwIndices, +float fRadius1, +float fRadius2, +float fLength, +UINT uSlices, +UINT uStacks ) +{ + UINT i, j; + + // Sin/Cos caches + float sinI[CACHE_SIZE], cosI[CACHE_SIZE]; + + for( i = 0; i < uSlices; i++ ) + sincosf( 2.0f * D3DX_PI * i / uSlices, sinI + i, cosI + i ); + + + // Compute side normal angle + float fDeltaRadius = fRadius2 - fRadius1; + float fSideLength = sqrtf( fDeltaRadius * fDeltaRadius + fLength * fLength ); + + float fNormalXY = ( fSideLength > 0.00001f ) ? ( fLength / fSideLength ) : 1.0f; + float fNormalZ = ( fSideLength > 0.00001f ) ? ( -fDeltaRadius / fSideLength ) : 0.0f; + + + + // Generate vertices + VERTEX* pVertex = pVertices; + float fZ, fRadius; + DWORD iVertex; + + // Base cap (uSlices + 1) + fZ = fLength * -0.5f; + fRadius = fRadius1; + iVertex = 0; + + pVertex->pos = D3DXVECTOR3( 0.0f, 0.0f, fZ ); + pVertex->norm = D3DXVECTOR3( 0.0f, 0.0f, -1.0f ); + pVertex++; + if( pPointReps != NULL ) + pPointReps[iVertex] = iVertex; + iVertex++; + + for( i = 0; i < uSlices; i++ ) + { + pVertex->pos = D3DXVECTOR3( fRadius * sinI[i], fRadius * cosI[i], fZ ); + pVertex->norm = D3DXVECTOR3( 0.0f, 0.0f, -1.0f ); + pVertex++; + + // link into stack vertices, which follow + if( pPointReps != NULL ) + pPointReps[iVertex] = iVertex + uSlices; + iVertex++; + } + + // Stacks ((uStacks + 1)*uSlices) + for( j = 0; j <= uStacks; j++ ) + { + float f = ( float )j / ( float )uStacks; + + fZ = fLength * ( f - 0.5f ); + fRadius = fRadius1 + f * fDeltaRadius; + + for( i = 0; i < uSlices; i++ ) + { + pVertex->pos = D3DXVECTOR3( fRadius * sinI[i], fRadius * cosI[i], fZ ); + pVertex->norm = D3DXVECTOR3( fNormalXY * sinI[i], fNormalXY * cosI[i], fNormalZ ); + pVertex++; + if( pPointReps != NULL ) + pPointReps[iVertex] = iVertex; + iVertex++; + } + } + + // Top cap (uSlices + 1) + fZ = fLength * 0.5f; + fRadius = fRadius2; + + for( i = 0; i < uSlices; i++ ) + { + pVertex->pos = D3DXVECTOR3( fRadius * sinI[i], fRadius * cosI[i], fZ ); + pVertex->norm = D3DXVECTOR3( 0.0f, 0.0f, 1.0f ); + pVertex++; + + // link into stack vertices, which precede + if( pPointReps != NULL ) + pPointReps[iVertex] = iVertex - uSlices; + iVertex++; + } + + pVertex->pos = D3DXVECTOR3( 0.0f, 0.0f, fZ ); + pVertex->norm = D3DXVECTOR3( 0.0f, 0.0f, 1.0f ); + pVertex++; + if( pPointReps != NULL ) + pPointReps[iVertex] = iVertex; + iVertex++; + + + + // Generate indices + WORD* pwFace = pwIndices; + UINT uRowA, uRowB; + + // Z+ pole (uSlices) + uRowA = 0; + uRowB = 1; + + for( i = 0; i < uSlices - 1; i++ ) + { + pwFace[0] = ( WORD )( uRowA ); + pwFace[1] = ( WORD )( uRowB + i ); + pwFace[2] = ( WORD )( uRowB + i + 1 ); + pwFace += 3; + } + + pwFace[0] = ( WORD )( uRowA ); + pwFace[1] = ( WORD )( uRowB + i ); + pwFace[2] = ( WORD )( uRowB ); + pwFace += 3; + + // Interior stacks (uStacks * uSlices * 2) + for( j = 0; j < uStacks; j++ ) + { + uRowA = 1 + ( j + 1 ) * uSlices; + uRowB = uRowA + uSlices; + + for( i = 0; i < uSlices - 1; i++ ) + { + pwFace[0] = ( WORD )( uRowA + i ); + pwFace[1] = ( WORD )( uRowB + i ); + pwFace[2] = ( WORD )( uRowA + i + 1 ); + pwFace += 3; + + pwFace[0] = ( WORD )( uRowA + i + 1 ); + pwFace[1] = ( WORD )( uRowB + i ); + pwFace[2] = ( WORD )( uRowB + i + 1 ); + pwFace += 3; + } + + pwFace[0] = ( WORD )( uRowA + i ); + pwFace[1] = ( WORD )( uRowB + i ); + pwFace[2] = ( WORD )( uRowA ); + pwFace += 3; + + pwFace[0] = ( WORD )( uRowA ); + pwFace[1] = ( WORD )( uRowB + i ); + pwFace[2] = ( WORD )( uRowB ); + pwFace += 3; + } + + // Z- pole (uSlices) + uRowA = 1 + ( uStacks + 2 ) * uSlices; + uRowB = uRowA + uSlices; + + for( i = 0; i < uSlices - 1; i++ ) + { + pwFace[0] = ( WORD )( uRowA + i ); + pwFace[1] = ( WORD )( uRowB ); + pwFace[2] = ( WORD )( uRowA + i + 1 ); + pwFace += 3; + } + + pwFace[0] = ( WORD )( uRowA + i ); + pwFace[1] = ( WORD )( uRowB ); + pwFace[2] = ( WORD )( uRowA ); + pwFace += 3; +} + + +//---------------------------------------------------------------------------- +// DXUTCreateCylinder - create a cylinder mesh +//---------------------------------------------------------------------------- +HRESULT WINAPI DXUTCreateCylinder( ID3D10Device* pDevice, float fRadius1, float fRadius2, float fLength, UINT uSlices, + UINT uStacks, ID3DX10Mesh** ppMesh ) +{ + HRESULT hr = S_OK; + + WORD* pwIndices = NULL; + VERTEX* pVertices = NULL; + + // Set up the defaults + if( D3DX_DEFAULT_FLOAT == fRadius1 ) + fRadius1 = 1.0f; + if( D3DX_DEFAULT_FLOAT == fRadius2 ) + fRadius2 = 1.0f; + if( D3DX_DEFAULT_FLOAT == fLength ) + fLength = 1.0f; + if( D3DX_DEFAULT == uSlices ) + uSlices = 8; + if( D3DX_DEFAULT == uStacks ) + uStacks = 8; + + + // Validate parameters + if( !pDevice ) + return D3DERR_INVALIDCALL; + if( !ppMesh ) + return D3DERR_INVALIDCALL; + if( fRadius1 < 0.0f ) + return D3DERR_INVALIDCALL; + if( fRadius2 < 0.0f ) + return D3DERR_INVALIDCALL; + if( fLength < 0.0f ) + return D3DERR_INVALIDCALL; + if( uSlices < 2 ) + return D3DERR_INVALIDCALL; + if( uStacks < 1 ) + return D3DERR_INVALIDCALL; + if( uSlices >= CACHE_SIZE ) + uSlices = CACHE_SIZE - 1; + + // Create the mesh + UINT cFaces = ( uStacks + 1 ) * uSlices * 2; + UINT cVertices = 2 + ( uStacks + 3 ) * uSlices; + + // Create enough memory for the vertices and indices + pVertices = new VERTEX[ cVertices ]; + if( !pVertices ) + return E_OUTOFMEMORY; + pwIndices = new WORD[ cFaces * 3 ]; + if( !pwIndices ) + return E_OUTOFMEMORY; + + // Create a cylinder + MakeCylinder( pVertices, NULL, pwIndices, fRadius1, fRadius2, + fLength, uSlices, uStacks ); + + // Create a mesh + hr = CreateShapeMesh( pDevice, ppMesh, pVertices, cVertices, pwIndices, cFaces * 3 ); + + // Free up the memory + SAFE_DELETE_ARRAY( pVertices ); + SAFE_DELETE_ARRAY( pwIndices ); + + return hr; +} + + +//-------------------------------------------------------------------------------------- +// MakePolygon helper +//-------------------------------------------------------------------------------------- +static void MakePolygon( VERTEX* pVertices, + WORD* pwIndices, + float fLength, + UINT uSides ) +{ + // Calculate the radius + float radius = fLength * 0.5f / sinf( D3DX_PI / ( float )uSides ); + float angle = ( float )( 2.0f * D3DX_PI / ( float )uSides ); + + // Fill in vertices + VERTEX* pVertex = pVertices; + + pVertex->pos = D3DXVECTOR3( 0.0f, 0.0f, 0.0f ); + pVertex->norm = D3DXVECTOR3( 0.0f, 0.0f, 1.0f ); + pVertex++; + + for( UINT j = 0; j < uSides; j++ ) + { + float s, c; + sincosf( angle * j, &s, &c ); + + pVertex->pos = D3DXVECTOR3( c * radius, s * radius, 0.0f ); + pVertex->norm = D3DXVECTOR3( 0.0f, 0.0f, 1.0f ); + pVertex++; + } + + // Fill in indices + WORD* pwFace = pwIndices; + + UINT iFace; + for( iFace = 0; iFace < uSides - 1; iFace++ ) + { + pwFace[0] = 0; + pwFace[1] = ( WORD )iFace + 1; + pwFace[2] = ( WORD )iFace + 2; + + pwFace += 3; + } + + // handle the wrapping of the last case + pwFace[0] = 0; + pwFace[1] = ( WORD )iFace + 1; + pwFace[2] = 1; +} + + +//---------------------------------------------------------------------------- +// DXUTCreatePolygon - create a polygon mesh +//---------------------------------------------------------------------------- +HRESULT WINAPI DXUTCreatePolygon( ID3D10Device* pDevice, float fLength, UINT uSides, ID3DX10Mesh** ppMesh ) +{ + HRESULT hr = S_OK; + WORD* pwIndices = NULL; + VERTEX* pVertices = NULL; + + // Set up the defaults + if( D3DX_DEFAULT == uSides ) + uSides = 3; + if( D3DX_DEFAULT_FLOAT == fLength ) + fLength = 1.0f; + + + // Validate parameters + if( !pDevice ) + return D3DERR_INVALIDCALL; + if( !ppMesh ) + return D3DERR_INVALIDCALL; + if( fLength < 0.0f ) + return D3DERR_INVALIDCALL; + if( uSides < 3 ) + return D3DERR_INVALIDCALL; + + // Create the mesh + UINT cFaces = uSides; + UINT cVertices = uSides + 1; + + // Create enough memory for the vertices and indices + pVertices = new VERTEX[ cVertices ]; + if( !pVertices ) + return E_OUTOFMEMORY; + pwIndices = new WORD[ cFaces * 3 ]; + if( !pwIndices ) + return E_OUTOFMEMORY; + + // Create a polygon + MakePolygon( pVertices, pwIndices, fLength, uSides ); + + // Create a mesh + hr = CreateShapeMesh( pDevice, ppMesh, pVertices, cVertices, pwIndices, cFaces * 3 ); + + // Free up the memory + SAFE_DELETE_ARRAY( pVertices ); + SAFE_DELETE_ARRAY( pwIndices ); + + return hr; +} + + +//--------------------------------------------------------------------- +// MakeSphere helper +//--------------------------------------------------------------------- +static void MakeSphere( +VERTEX* pVertices, +WORD* pwIndices, +float fRadius, +UINT uSlices, +UINT uStacks ) +{ + UINT i, j; + + + // Sin/Cos caches + float sinI[CACHE_SIZE], cosI[CACHE_SIZE]; + float sinJ[CACHE_SIZE], cosJ[CACHE_SIZE]; + + for( i = 0; i < uSlices; i++ ) + sincosf( 2.0f * D3DX_PI * i / uSlices, sinI + i, cosI + i ); + + for( j = 0; j < uStacks; j++ ) + sincosf( D3DX_PI * j / uStacks, sinJ + j, cosJ + j ); + + + + // Generate vertices + VERTEX* pVertex = pVertices; + + // +Z pole + pVertex->pos = D3DXVECTOR3( 0.0f, 0.0f, fRadius ); + pVertex->norm = D3DXVECTOR3( 0.0f, 0.0f, 1.0f ); + pVertex++; + + // Stacks + for( j = 1; j < uStacks; j++ ) + { + for( i = 0; i < uSlices; i++ ) + { + D3DXVECTOR3 norm( sinI[i]* sinJ[j], cosI[i]* sinJ[j], cosJ[j] ); + + pVertex->pos = norm * fRadius; + pVertex->norm = norm; + + pVertex++; + } + } + + // Z- pole + pVertex->pos = D3DXVECTOR3( 0.0f, 0.0f, -fRadius ); + pVertex->norm = D3DXVECTOR3( 0.0f, 0.0f, -1.0f ); + pVertex++; + + + + // Generate indices + WORD* pwFace = pwIndices; + UINT uRowA, uRowB; + + // Z+ pole + uRowA = 0; + uRowB = 1; + + for( i = 0; i < uSlices - 1; i++ ) + { + pwFace[0] = ( WORD )( uRowA ); + pwFace[1] = ( WORD )( uRowB + i + 1 ); + pwFace[2] = ( WORD )( uRowB + i ); + pwFace += 3; + } + + pwFace[0] = ( WORD )( uRowA ); + pwFace[1] = ( WORD )( uRowB ); + pwFace[2] = ( WORD )( uRowB + i ); + pwFace += 3; + + // Interior stacks + for( j = 1; j < uStacks - 1; j++ ) + { + uRowA = 1 + ( j - 1 ) * uSlices; + uRowB = uRowA + uSlices; + + for( i = 0; i < uSlices - 1; i++ ) + { + pwFace[0] = ( WORD )( uRowA + i ); + pwFace[1] = ( WORD )( uRowA + i + 1 ); + pwFace[2] = ( WORD )( uRowB + i ); + pwFace += 3; + + pwFace[0] = ( WORD )( uRowA + i + 1 ); + pwFace[1] = ( WORD )( uRowB + i + 1 ); + pwFace[2] = ( WORD )( uRowB + i ); + pwFace += 3; + } + + pwFace[0] = ( WORD )( uRowA + i ); + pwFace[1] = ( WORD )( uRowA ); + pwFace[2] = ( WORD )( uRowB + i ); + pwFace += 3; + + pwFace[0] = ( WORD )( uRowA ); + pwFace[1] = ( WORD )( uRowB ); + pwFace[2] = ( WORD )( uRowB + i ); + pwFace += 3; + } + + // Z- pole + uRowA = 1 + ( uStacks - 2 ) * uSlices; + uRowB = uRowA + uSlices; + + for( i = 0; i < uSlices - 1; i++ ) + { + pwFace[0] = ( WORD )( uRowA + i ); + pwFace[1] = ( WORD )( uRowA + i + 1 ); + pwFace[2] = ( WORD )( uRowB ); + pwFace += 3; + } + + pwFace[0] = ( WORD )( uRowA + i ); + pwFace[1] = ( WORD )( uRowA ); + pwFace[2] = ( WORD )( uRowB ); + pwFace += 3; +} + + +//---------------------------------------------------------------------------- +// DXUTCreateSphere - create a sphere mesh +//---------------------------------------------------------------------------- +HRESULT WINAPI DXUTCreateSphere( ID3D10Device* pDevice, float fRadius, UINT uSlices, UINT uStacks, + ID3DX10Mesh** ppMesh ) +{ + HRESULT hr = S_OK; + + WORD* pwIndices = NULL; + VERTEX* pVertices = NULL; + + // Set up the defaults + if( D3DX_DEFAULT_FLOAT == fRadius ) + fRadius = 1.0f; + if( D3DX_DEFAULT == uSlices ) + uSlices = 8; + if( D3DX_DEFAULT == uStacks ) + uStacks = 8; + + // Validate parameters + if( !pDevice ) + return D3DERR_INVALIDCALL; + if( !ppMesh ) + return D3DERR_INVALIDCALL; + if( fRadius < 0.0f ) + return D3DERR_INVALIDCALL; + if( uSlices < 2 ) + return D3DERR_INVALIDCALL; + if( uStacks < 2 ) + return D3DERR_INVALIDCALL; + + if( uSlices > CACHE_SIZE ) + uSlices = CACHE_SIZE; + if( uStacks > CACHE_SIZE ) + uStacks = CACHE_SIZE; + + // Create the mesh + UINT cFaces = 2 * ( uStacks - 1 ) * uSlices; + UINT cVertices = ( uStacks - 1 ) * uSlices + 2; + + // Create enough memory for the vertices and indices + pVertices = new VERTEX[ cVertices ]; + if( !pVertices ) + return E_OUTOFMEMORY; + pwIndices = new WORD[ cFaces * 3 ]; + if( !pwIndices ) + return E_OUTOFMEMORY; + + // Create a sphere + MakeSphere( pVertices, pwIndices, fRadius, uSlices, uStacks ); + + // Create a mesh + hr = CreateShapeMesh( pDevice, ppMesh, pVertices, cVertices, pwIndices, cFaces * 3 ); + + // Free up the memory + SAFE_DELETE_ARRAY( pVertices ); + SAFE_DELETE_ARRAY( pwIndices ); + + return hr; +} + + +//--------------------------------------------------------------------- +// MakeTorus helper +//--------------------------------------------------------------------- +static void MakeTorus( +VERTEX* pVertices, +WORD* pwIndices, +float fInnerRadius, +float fOuterRadius, +UINT uSides, +UINT uRings ) +{ + UINT i, j; + + // + // Compute the vertices + // + + VERTEX* pVertex = pVertices; + + for( i = 0; i < uRings; i++ ) + { + float theta = ( float )i * 2.0f * D3DX_PI / ( float )uRings; + float st, ct; + + sincosf( theta, &st, &ct ); + + for( j = 0; j < uSides; j++ ) + { + float phi = ( float )j * 2.0f * D3DX_PI / uSides; + float sp, cp; + + sincosf( phi, &sp, &cp ); + + pVertex->pos.x = ct * ( fOuterRadius + fInnerRadius * cp ); + pVertex->pos.y = -st * ( fOuterRadius + fInnerRadius * cp ); + pVertex->pos.z = sp * fInnerRadius; + + pVertex->norm.x = ct * cp; + pVertex->norm.y = -st * cp; + pVertex->norm.z = sp; + + pVertex++; + } + } + + // + // Compute the indices: + // There are uRings * uSides faces + // Each face has 2 triangles (6 indices) + // + + // Tube i has indices: + // Left Edge: i*(uSides+1) -- i*(uSides+1)+uSides + // Right Edge: (i+1)*(uSides+1) -- (i+1)*(uSides+1)+uSides + // + // Face j on tube i has the 4 indices: + // Left Edge: i*(uSides+1)+j -- i*(uSides+1)+j+1 + // Right Edge: (i+1)*(uSides+1)+j -- (i+1)*(uSides+1)+j+1 + // + WORD* pwFace = pwIndices; + + for( i = 0; i < uRings - 1; i++ ) + { + for( j = 0; j < uSides - 1; j++ ) + { + + // Tri 1 (Top-Left tri, CCW) + pwFace[0] = ( WORD )( i * uSides + j ); + pwFace[1] = ( WORD )( i * uSides + j + 1 ); + pwFace[2] = ( WORD )( ( i + 1 ) * uSides + j ); + pwFace += 3; + + // Tri 2 (Bottom-Right tri, CCW) + pwFace[0] = ( WORD )( ( i + 1 ) * uSides + j ); + pwFace[1] = ( WORD )( i * uSides + j + 1 ); + pwFace[2] = ( WORD )( ( i + 1 ) * uSides + j + 1 ); + pwFace += 3; + } + + // Tri 1 (Top-Left tri, CCW) + pwFace[0] = ( WORD )( i * uSides + j ); + pwFace[1] = ( WORD )( i * uSides ); + pwFace[2] = ( WORD )( ( i + 1 ) * uSides + j ); + pwFace += 3; + + // Tri 2 (Bottom-Right tri, CCW) + pwFace[0] = ( WORD )( ( i + 1 ) * uSides + j ); + pwFace[1] = ( WORD )( i * uSides + 0 ); + pwFace[2] = ( WORD )( ( i + 1 ) * uSides + 0 ); + pwFace += 3; + } + + + // join the two ends of the tube + for( j = 0; j < uSides - 1; j++ ) + { + // Tri 1 (Top-Left tri, CCW) + pwFace[0] = ( WORD )( i * uSides + j ); + pwFace[1] = ( WORD )( i * uSides + j + 1 ); + pwFace[2] = ( WORD )( j ); + pwFace += 3; + + // Tri 2 (Bottom-Right tri, CCW) + pwFace[0] = ( WORD )( j ); + pwFace[1] = ( WORD )( i * uSides + j + 1 ); + pwFace[2] = ( WORD )( j + 1 ); + pwFace += 3; + } + + // Tri 1 (Top-Left tri, CCW) + pwFace[0] = ( WORD )( i * uSides + j ); + pwFace[1] = ( WORD )( i * uSides ); + pwFace[2] = ( WORD )( j ); + pwFace += 3; + + // Tri 2 (Bottom-Right tri, CCW) + pwFace[0] = ( WORD )( j ); + pwFace[1] = ( WORD )( i * uSides ); + pwFace[2] = ( WORD )( 0 ); + pwFace += 3; +} + + +//---------------------------------------------------------------------------- +// DXUTCreateTorus - create a torus mesh +//---------------------------------------------------------------------------- +HRESULT WINAPI DXUTCreateTorus( ID3D10Device* pDevice, float fInnerRadius, float fOuterRadius, UINT uSides, + UINT uRings, ID3DX10Mesh** ppMesh ) +{ + HRESULT hr = S_OK; + + WORD* pwIndices = NULL; + VERTEX* pVertices = NULL; + + + // Set up the defaults + if( D3DX_DEFAULT_FLOAT == fInnerRadius ) + fInnerRadius = 1.0f; + if( D3DX_DEFAULT_FLOAT == fOuterRadius ) + fOuterRadius = 2.0f; + if( D3DX_DEFAULT == uSides ) + uSides = 8; + if( D3DX_DEFAULT == uRings ) + uRings = 15; + + // Validate parameters + if( !pDevice ) + return D3DERR_INVALIDCALL; + if( !ppMesh ) + return D3DERR_INVALIDCALL; + if( fInnerRadius < 0.0f ) + return D3DERR_INVALIDCALL; + if( fOuterRadius < 0.0f ) + return D3DERR_INVALIDCALL; + if( uSides < 3 ) + return D3DERR_INVALIDCALL; + if( uRings < 3 ) + return D3DERR_INVALIDCALL; + + // Create the mesh + UINT cFaces = 2 * uSides * uRings; + UINT cVertices = uRings * uSides; + + // Create enough memory for the vertices and indices + pVertices = new VERTEX[ cVertices ]; + if( !pVertices ) + return E_OUTOFMEMORY; + pwIndices = new WORD[ cFaces * 3 ]; + if( !pwIndices ) + return E_OUTOFMEMORY; + + // Create a torus + MakeTorus( pVertices, pwIndices, fInnerRadius, fOuterRadius, + uSides, uRings ); + + // Create a mesh + hr = CreateShapeMesh( pDevice, ppMesh, pVertices, cVertices, pwIndices, cFaces * 3 ); + + // Free up the memory + SAFE_DELETE_ARRAY( pVertices ); + SAFE_DELETE_ARRAY( pwIndices ); + + return hr; +} + + +//---------------------------------------------------------------------------- +// Teapot data +//---------------------------------------------------------------------------- +#define NUMTEAPOTVERTICES 1178 +#define NUMTEAPOTINDICES 6768 + +static float teapotPositionsFloats[NUMTEAPOTVERTICES*3] = +{ + 0.678873f, 0.330678f, 0.000000f, + 0.669556f, 0.358022f, 0.000000f, + 0.671003f, 0.374428f, 0.000000f, + 0.680435f, 0.379897f, 0.000000f, + 0.695077f, 0.374428f, 0.000000f, + 0.712148f, 0.358022f, 0.000000f, + 0.728873f, 0.330678f, 0.000000f, + 0.654243f, 0.330678f, 0.187963f, + 0.645254f, 0.358022f, 0.185461f, + 0.646650f, 0.374428f, 0.185850f, + 0.655751f, 0.379897f, 0.188383f, + 0.669877f, 0.374428f, 0.192314f, + 0.686348f, 0.358022f, 0.196898f, + 0.702484f, 0.330678f, 0.201389f, + 0.584502f, 0.330678f, 0.355704f, + 0.576441f, 0.358022f, 0.350969f, + 0.577693f, 0.374428f, 0.351704f, + 0.585854f, 0.379897f, 0.356498f, + 0.598522f, 0.374428f, 0.363938f, + 0.613292f, 0.358022f, 0.372613f, + 0.627762f, 0.330678f, 0.381111f, + 0.475873f, 0.330678f, 0.497000f, + 0.469258f, 0.358022f, 0.490385f, + 0.470285f, 0.374428f, 0.491412f, + 0.476982f, 0.379897f, 0.498109f, + 0.487377f, 0.374428f, 0.508505f, + 0.499498f, 0.358022f, 0.520626f, + 0.511373f, 0.330678f, 0.532500f, + 0.334576f, 0.330678f, 0.605630f, + 0.329842f, 0.358022f, 0.597569f, + 0.330577f, 0.374428f, 0.598820f, + 0.335370f, 0.379897f, 0.606982f, + 0.342810f, 0.374428f, 0.619649f, + 0.351485f, 0.358022f, 0.634419f, + 0.359984f, 0.330678f, 0.648889f, + 0.166836f, 0.330678f, 0.675370f, + 0.164334f, 0.358022f, 0.666381f, + 0.164722f, 0.374428f, 0.667777f, + 0.167255f, 0.379897f, 0.676878f, + 0.171187f, 0.374428f, 0.691004f, + 0.175771f, 0.358022f, 0.707475f, + 0.180262f, 0.330678f, 0.723611f, + -0.021127f, 0.330678f, 0.700000f, + -0.021127f, 0.358022f, 0.690683f, + -0.021127f, 0.374428f, 0.692130f, + -0.021127f, 0.379897f, 0.701563f, + -0.021127f, 0.374428f, 0.716204f, + -0.021127f, 0.358022f, 0.733276f, + -0.021127f, 0.330678f, 0.750000f, + -0.224715f, 0.330678f, 0.675370f, + -0.215631f, 0.358022f, 0.666381f, + -0.211606f, 0.374428f, 0.667777f, + -0.211463f, 0.379897f, 0.676878f, + -0.214020f, 0.374428f, 0.691004f, + -0.218098f, 0.358022f, 0.707475f, + -0.222516f, 0.330678f, 0.723611f, + -0.396831f, 0.330678f, 0.605630f, + -0.383671f, 0.358022f, 0.597569f, + -0.378758f, 0.374428f, 0.598820f, + -0.380125f, 0.379897f, 0.606982f, + -0.385806f, 0.374428f, 0.619649f, + -0.393832f, 0.358022f, 0.634419f, + -0.402238f, 0.330678f, 0.648889f, + -0.535002f, 0.330678f, 0.497000f, + -0.521278f, 0.358022f, 0.490385f, + -0.517539f, 0.374428f, 0.491412f, + -0.521346f, 0.379897f, 0.498109f, + -0.530257f, 0.374428f, 0.508505f, + -0.541831f, 0.358022f, 0.520626f, + -0.553627f, 0.330678f, 0.532500f, + -0.636757f, 0.330678f, 0.355704f, + -0.624483f, 0.358022f, 0.350969f, + -0.622910f, 0.374428f, 0.351704f, + -0.629359f, 0.379897f, 0.356498f, + -0.641146f, 0.374428f, 0.363938f, + -0.655593f, 0.358022f, 0.372613f, + -0.670016f, 0.330678f, 0.381111f, + -0.699623f, 0.330678f, 0.187963f, + -0.689317f, 0.358022f, 0.185461f, + -0.689830f, 0.374428f, 0.185850f, + -0.698396f, 0.379897f, 0.188382f, + -0.712247f, 0.374428f, 0.192314f, + -0.728617f, 0.358022f, 0.196898f, + -0.744738f, 0.330678f, 0.201389f, + -0.721127f, 0.330678f, 0.000000f, + -0.711810f, 0.358022f, 0.000000f, + -0.713257f, 0.374428f, 0.000000f, + -0.722690f, 0.379897f, 0.000000f, + -0.737331f, 0.374428f, 0.000000f, + -0.754403f, 0.358022f, 0.000000f, + -0.771127f, 0.330678f, 0.000000f, + -0.696498f, 0.330678f, -0.187963f, + -0.687508f, 0.358022f, -0.185461f, + -0.688904f, 0.374428f, -0.185850f, + -0.698005f, 0.379897f, -0.188383f, + -0.712131f, 0.374428f, -0.192314f, + -0.728602f, 0.358022f, -0.196898f, + -0.744738f, 0.330678f, -0.201389f, + -0.626757f, 0.330678f, -0.355704f, + -0.618696f, 0.358022f, -0.350969f, + -0.619948f, 0.374428f, -0.351704f, + -0.628109f, 0.379897f, -0.356498f, + -0.640776f, 0.374428f, -0.363938f, + -0.655546f, 0.358022f, -0.372613f, + -0.670016f, 0.330678f, -0.381111f, + -0.518127f, 0.330678f, -0.497000f, + -0.511512f, 0.358022f, -0.490385f, + -0.512539f, 0.374428f, -0.491412f, + -0.519237f, 0.379897f, -0.498109f, + -0.529632f, 0.374428f, -0.508505f, + -0.541753f, 0.358022f, -0.520626f, + -0.553627f, 0.330678f, -0.532500f, + -0.376831f, 0.330678f, -0.605630f, + -0.372096f, 0.358022f, -0.597569f, + -0.372832f, 0.374428f, -0.598820f, + -0.377625f, 0.379897f, -0.606982f, + -0.385065f, 0.374428f, -0.619649f, + -0.393740f, 0.358022f, -0.634419f, + -0.402238f, 0.330678f, -0.648889f, + -0.209090f, 0.330678f, -0.675370f, + -0.206588f, 0.358022f, -0.666381f, + -0.206977f, 0.374428f, -0.667777f, + -0.209510f, 0.379897f, -0.676878f, + -0.213441f, 0.374428f, -0.691004f, + -0.218025f, 0.358022f, -0.707475f, + -0.222516f, 0.330678f, -0.723611f, + -0.021127f, 0.330678f, -0.700000f, + -0.021127f, 0.358022f, -0.690683f, + -0.021127f, 0.374428f, -0.692130f, + -0.021127f, 0.379897f, -0.701563f, + -0.021127f, 0.374428f, -0.716204f, + -0.021127f, 0.358022f, -0.733276f, + -0.021127f, 0.330678f, -0.750000f, + 0.166836f, 0.330678f, -0.675370f, + 0.164334f, 0.358022f, -0.666381f, + 0.164722f, 0.374428f, -0.667777f, + 0.167255f, 0.379897f, -0.676878f, + 0.171187f, 0.374428f, -0.691004f, + 0.175771f, 0.358022f, -0.707475f, + 0.180262f, 0.330678f, -0.723611f, + 0.334576f, 0.330678f, -0.605630f, + 0.329842f, 0.358022f, -0.597569f, + 0.330577f, 0.374428f, -0.598820f, + 0.335370f, 0.379897f, -0.606982f, + 0.342810f, 0.374428f, -0.619649f, + 0.351485f, 0.358022f, -0.634419f, + 0.359984f, 0.330678f, -0.648889f, + 0.475873f, 0.330678f, -0.497000f, + 0.469258f, 0.358022f, -0.490385f, + 0.470285f, 0.374428f, -0.491412f, + 0.476982f, 0.379897f, -0.498109f, + 0.487377f, 0.374428f, -0.508505f, + 0.499498f, 0.358022f, -0.520626f, + 0.511373f, 0.330678f, -0.532500f, + 0.584502f, 0.330678f, -0.355704f, + 0.576441f, 0.358022f, -0.350969f, + 0.577693f, 0.374428f, -0.351704f, + 0.585854f, 0.379897f, -0.356498f, + 0.598522f, 0.374428f, -0.363938f, + 0.613292f, 0.358022f, -0.372613f, + 0.627762f, 0.330678f, -0.381111f, + 0.654243f, 0.330678f, -0.187963f, + 0.645254f, 0.358022f, -0.185461f, + 0.646650f, 0.374428f, -0.185850f, + 0.655751f, 0.379897f, -0.188382f, + 0.669877f, 0.374428f, -0.192314f, + 0.686348f, 0.358022f, -0.196898f, + 0.702484f, 0.330678f, -0.201389f, + 0.790794f, 0.199602f, 0.000000f, + 0.849243f, 0.069567f, 0.000000f, + 0.900748f, -0.058384f, 0.000000f, + 0.941836f, -0.183211f, 0.000000f, + 0.969035f, -0.303870f, 0.000000f, + 0.978873f, -0.419322f, 0.000000f, + 0.762227f, 0.199602f, 0.218016f, + 0.818619f, 0.069567f, 0.233711f, + 0.868312f, -0.058384f, 0.247541f, + 0.907954f, -0.183211f, 0.258573f, + 0.934196f, -0.303870f, 0.265877f, + 0.943688f, -0.419322f, 0.268519f, + 0.681335f, 0.199602f, 0.412576f, + 0.731904f, 0.069567f, 0.442277f, + 0.776465f, -0.058384f, 0.468449f, + 0.812014f, -0.183211f, 0.489328f, + 0.835546f, -0.303870f, 0.503149f, + 0.844058f, -0.419322f, 0.508148f, + 0.555337f, 0.199602f, 0.576464f, + 0.596836f, 0.069567f, 0.617963f, + 0.633404f, -0.058384f, 0.654531f, + 0.662577f, -0.183211f, 0.683704f, + 0.681888f, -0.303870f, 0.703015f, + 0.688873f, -0.419322f, 0.710000f, + 0.391449f, 0.199602f, 0.702462f, + 0.421150f, 0.069567f, 0.753032f, + 0.447322f, -0.058384f, 0.797593f, + 0.468201f, -0.183211f, 0.833141f, + 0.482022f, -0.303870f, 0.856674f, + 0.487021f, -0.419322f, 0.865185f, + 0.196889f, 0.199602f, 0.783354f, + 0.212583f, 0.069567f, 0.839746f, + 0.226413f, -0.058384f, 0.889439f, + 0.237446f, -0.183211f, 0.929081f, + 0.244750f, -0.303870f, 0.955323f, + 0.247391f, -0.419322f, 0.964815f, + -0.021127f, 0.199602f, 0.811921f, + -0.021127f, 0.069567f, 0.870370f, + -0.021127f, -0.058384f, 0.921875f, + -0.021127f, -0.183211f, 0.962963f, + -0.021127f, -0.303870f, 0.990162f, + -0.021127f, -0.419322f, 1.000000f, + -0.239143f, 0.199602f, 0.783354f, + -0.254838f, 0.069567f, 0.839746f, + -0.268668f, -0.058384f, 0.889439f, + -0.279701f, -0.183211f, 0.929081f, + -0.287004f, -0.303870f, 0.955323f, + -0.289646f, -0.419322f, 0.964815f, + -0.433704f, 0.199602f, 0.702462f, + -0.463404f, 0.069567f, 0.753032f, + -0.489576f, -0.058384f, 0.797593f, + -0.510455f, -0.183211f, 0.833141f, + -0.524276f, -0.303870f, 0.856674f, + -0.529275f, -0.419322f, 0.865185f, + -0.597591f, 0.199602f, 0.576464f, + -0.639090f, 0.069567f, 0.617963f, + -0.675658f, -0.058384f, 0.654531f, + -0.704831f, -0.183211f, 0.683704f, + -0.724142f, -0.303870f, 0.703015f, + -0.731127f, -0.419322f, 0.710000f, + -0.723589f, 0.199602f, 0.412576f, + -0.774159f, 0.069567f, 0.442277f, + -0.818720f, -0.058384f, 0.468449f, + -0.854269f, -0.183211f, 0.489328f, + -0.877801f, -0.303870f, 0.503149f, + -0.886312f, -0.419322f, 0.508148f, + -0.804481f, 0.199602f, 0.218016f, + -0.860873f, 0.069567f, 0.233711f, + -0.910566f, -0.058384f, 0.247540f, + -0.950208f, -0.183211f, 0.258573f, + -0.976450f, -0.303870f, 0.265877f, + -0.985942f, -0.419322f, 0.268518f, + -0.833049f, 0.199602f, 0.000000f, + -0.891498f, 0.069567f, 0.000000f, + -0.943002f, -0.058384f, 0.000000f, + -0.984090f, -0.183211f, 0.000000f, + -1.011289f, -0.303870f, 0.000000f, + -1.021127f, -0.419322f, 0.000000f, + -0.804481f, 0.199602f, -0.218016f, + -0.860873f, 0.069567f, -0.233711f, + -0.910566f, -0.058384f, -0.247541f, + -0.950208f, -0.183211f, -0.258573f, + -0.976450f, -0.303870f, -0.265877f, + -0.985942f, -0.419322f, -0.268519f, + -0.723589f, 0.199602f, -0.412576f, + -0.774159f, 0.069567f, -0.442277f, + -0.818720f, -0.058384f, -0.468449f, + -0.854269f, -0.183211f, -0.489328f, + -0.877801f, -0.303870f, -0.503149f, + -0.886312f, -0.419322f, -0.508148f, + -0.597591f, 0.199602f, -0.576464f, + -0.639090f, 0.069567f, -0.617963f, + -0.675658f, -0.058384f, -0.654531f, + -0.704831f, -0.183211f, -0.683704f, + -0.724142f, -0.303870f, -0.703015f, + -0.731127f, -0.419322f, -0.710000f, + -0.433704f, 0.199602f, -0.702462f, + -0.463404f, 0.069567f, -0.753032f, + -0.489576f, -0.058384f, -0.797593f, + -0.510455f, -0.183211f, -0.833141f, + -0.524276f, -0.303870f, -0.856674f, + -0.529275f, -0.419322f, -0.865185f, + -0.239143f, 0.199602f, -0.783354f, + -0.254838f, 0.069567f, -0.839746f, + -0.268668f, -0.058384f, -0.889439f, + -0.279701f, -0.183211f, -0.929081f, + -0.287004f, -0.303870f, -0.955323f, + -0.289646f, -0.419322f, -0.964815f, + -0.021127f, 0.199602f, -0.811921f, + -0.021127f, 0.069567f, -0.870370f, + -0.021127f, -0.058384f, -0.921875f, + -0.021127f, -0.183211f, -0.962963f, + -0.021127f, -0.303870f, -0.990162f, + -0.021127f, -0.419322f, -1.000000f, + 0.196889f, 0.199602f, -0.783354f, + 0.212583f, 0.069567f, -0.839746f, + 0.226413f, -0.058384f, -0.889439f, + 0.237446f, -0.183211f, -0.929081f, + 0.244750f, -0.303870f, -0.955323f, + 0.247391f, -0.419322f, -0.964815f, + 0.391449f, 0.199602f, -0.702462f, + 0.421150f, 0.069567f, -0.753032f, + 0.447322f, -0.058384f, -0.797593f, + 0.468201f, -0.183211f, -0.833141f, + 0.482022f, -0.303870f, -0.856674f, + 0.487021f, -0.419322f, -0.865185f, + 0.555337f, 0.199602f, -0.576464f, + 0.596836f, 0.069567f, -0.617963f, + 0.633404f, -0.058384f, -0.654531f, + 0.662577f, -0.183211f, -0.683704f, + 0.681888f, -0.303870f, -0.703015f, + 0.688873f, -0.419322f, -0.710000f, + 0.681335f, 0.199602f, -0.412576f, + 0.731904f, 0.069567f, -0.442277f, + 0.776465f, -0.058384f, -0.468449f, + 0.812014f, -0.183211f, -0.489328f, + 0.835546f, -0.303870f, -0.503149f, + 0.844058f, -0.419322f, -0.508148f, + 0.762227f, 0.199602f, -0.218016f, + 0.818619f, 0.069567f, -0.233711f, + 0.868312f, -0.058384f, -0.247540f, + 0.907954f, -0.183211f, -0.258573f, + 0.934196f, -0.303870f, -0.265877f, + 0.943688f, -0.419322f, -0.268518f, + 0.960354f, -0.522620f, 0.000000f, + 0.914058f, -0.608211f, 0.000000f, + 0.853873f, -0.677134f, 0.000000f, + 0.793688f, -0.730433f, 0.000000f, + 0.747391f, -0.769148f, 0.000000f, + 0.728873f, -0.794322f, 0.000000f, + 0.925821f, -0.522620f, 0.263546f, + 0.881153f, -0.608211f, 0.251115f, + 0.823086f, -0.677134f, 0.234954f, + 0.765018f, -0.730433f, 0.218793f, + 0.720351f, -0.769148f, 0.206361f, + 0.702484f, -0.794322f, 0.201389f, + 0.828036f, -0.522620f, 0.498738f, + 0.787981f, -0.608211f, 0.475213f, + 0.735910f, -0.677134f, 0.444630f, + 0.683839f, -0.730433f, 0.414047f, + 0.643784f, -0.769148f, 0.390521f, + 0.627762f, -0.794322f, 0.381111f, + 0.675725f, -0.522620f, 0.696852f, + 0.642854f, -0.608211f, 0.663981f, + 0.600123f, -0.677134f, 0.621250f, + 0.557391f, -0.730433f, 0.578519f, + 0.524521f, -0.769148f, 0.545648f, + 0.511373f, -0.794322f, 0.532500f, + 0.477611f, -0.522620f, 0.849163f, + 0.454085f, -0.608211f, 0.809108f, + 0.423502f, -0.677134f, 0.757037f, + 0.392919f, -0.730433f, 0.704966f, + 0.369394f, -0.769148f, 0.664911f, + 0.359984f, -0.794322f, 0.648889f, + 0.242419f, -0.522620f, 0.946948f, + 0.229987f, -0.608211f, 0.902281f, + 0.213826f, -0.677134f, 0.844213f, + 0.197666f, -0.730433f, 0.786145f, + 0.185234f, -0.769148f, 0.741478f, + 0.180262f, -0.794322f, 0.723611f, + -0.021127f, -0.522620f, 0.981482f, + -0.021127f, -0.608211f, 0.935185f, + -0.021127f, -0.677134f, 0.875000f, + -0.021127f, -0.730433f, 0.814815f, + -0.021127f, -0.769148f, 0.768519f, + -0.021127f, -0.794322f, 0.750000f, + -0.284673f, -0.522620f, 0.946948f, + -0.272242f, -0.608211f, 0.902281f, + -0.256081f, -0.677134f, 0.844213f, + -0.239920f, -0.730433f, 0.786145f, + -0.227489f, -0.769148f, 0.741478f, + -0.222516f, -0.794322f, 0.723611f, + -0.519865f, -0.522620f, 0.849163f, + -0.496340f, -0.608211f, 0.809108f, + -0.465757f, -0.677134f, 0.757037f, + -0.435174f, -0.730433f, 0.704966f, + -0.411649f, -0.769148f, 0.664911f, + -0.402238f, -0.794322f, 0.648889f, + -0.717979f, -0.522620f, 0.696852f, + -0.685109f, -0.608211f, 0.663981f, + -0.642377f, -0.677134f, 0.621250f, + -0.599646f, -0.730433f, 0.578519f, + -0.566775f, -0.769148f, 0.545648f, + -0.553627f, -0.794322f, 0.532500f, + -0.870290f, -0.522620f, 0.498738f, + -0.830236f, -0.608211f, 0.475213f, + -0.778164f, -0.677134f, 0.444630f, + -0.726093f, -0.730433f, 0.414047f, + -0.686038f, -0.769148f, 0.390521f, + -0.670016f, -0.794322f, 0.381111f, + -0.968075f, -0.522620f, 0.263546f, + -0.923408f, -0.608211f, 0.251115f, + -0.865340f, -0.677134f, 0.234954f, + -0.807273f, -0.730433f, 0.218793f, + -0.762605f, -0.769148f, 0.206361f, + -0.744738f, -0.794322f, 0.201389f, + -1.002609f, -0.522620f, 0.000000f, + -0.956312f, -0.608211f, 0.000000f, + -0.896127f, -0.677134f, 0.000000f, + -0.835942f, -0.730433f, 0.000000f, + -0.789646f, -0.769148f, 0.000000f, + -0.771127f, -0.794322f, 0.000000f, + -0.968075f, -0.522620f, -0.263546f, + -0.923408f, -0.608211f, -0.251115f, + -0.865340f, -0.677134f, -0.234954f, + -0.807273f, -0.730433f, -0.218793f, + -0.762605f, -0.769148f, -0.206361f, + -0.744738f, -0.794322f, -0.201389f, + -0.870290f, -0.522620f, -0.498738f, + -0.830236f, -0.608211f, -0.475213f, + -0.778164f, -0.677134f, -0.444630f, + -0.726093f, -0.730433f, -0.414047f, + -0.686038f, -0.769148f, -0.390521f, + -0.670016f, -0.794322f, -0.381111f, + -0.717979f, -0.522620f, -0.696852f, + -0.685109f, -0.608211f, -0.663981f, + -0.642377f, -0.677134f, -0.621250f, + -0.599646f, -0.730433f, -0.578519f, + -0.566775f, -0.769148f, -0.545648f, + -0.553627f, -0.794322f, -0.532500f, + -0.519865f, -0.522620f, -0.849163f, + -0.496340f, -0.608211f, -0.809108f, + -0.465757f, -0.677134f, -0.757037f, + -0.435174f, -0.730433f, -0.704966f, + -0.411648f, -0.769148f, -0.664911f, + -0.402238f, -0.794322f, -0.648889f, + -0.284673f, -0.522620f, -0.946948f, + -0.272242f, -0.608211f, -0.902281f, + -0.256081f, -0.677134f, -0.844213f, + -0.239920f, -0.730433f, -0.786145f, + -0.227489f, -0.769148f, -0.741478f, + -0.222516f, -0.794322f, -0.723611f, + -0.021127f, -0.522620f, -0.981482f, + -0.021127f, -0.608211f, -0.935185f, + -0.021127f, -0.677134f, -0.875000f, + -0.021127f, -0.730433f, -0.814815f, + -0.021127f, -0.769148f, -0.768519f, + -0.021127f, -0.794322f, -0.750000f, + 0.242419f, -0.522620f, -0.946948f, + 0.229987f, -0.608211f, -0.902281f, + 0.213827f, -0.677134f, -0.844213f, + 0.197666f, -0.730433f, -0.786145f, + 0.185234f, -0.769148f, -0.741478f, + 0.180262f, -0.794322f, -0.723611f, + 0.477611f, -0.522620f, -0.849163f, + 0.454085f, -0.608211f, -0.809108f, + 0.423502f, -0.677134f, -0.757037f, + 0.392919f, -0.730433f, -0.704966f, + 0.369394f, -0.769148f, -0.664911f, + 0.359984f, -0.794322f, -0.648889f, + 0.675725f, -0.522620f, -0.696852f, + 0.642854f, -0.608211f, -0.663981f, + 0.600123f, -0.677134f, -0.621250f, + 0.557391f, -0.730433f, -0.578519f, + 0.524521f, -0.769148f, -0.545648f, + 0.511373f, -0.794322f, -0.532500f, + 0.828036f, -0.522620f, -0.498738f, + 0.787981f, -0.608211f, -0.475213f, + 0.735910f, -0.677134f, -0.444630f, + 0.683839f, -0.730433f, -0.414047f, + 0.643784f, -0.769148f, -0.390521f, + 0.627762f, -0.794322f, -0.381111f, + 0.925821f, -0.522620f, -0.263546f, + 0.881153f, -0.608211f, -0.251115f, + 0.823086f, -0.677134f, -0.234954f, + 0.765018f, -0.730433f, -0.218793f, + 0.720351f, -0.769148f, -0.206361f, + 0.702484f, -0.794322f, -0.201389f, + 0.722796f, -0.812898f, 0.000000f, + 0.692762f, -0.830433f, 0.000000f, + 0.621060f, -0.845884f, 0.000000f, + 0.489984f, -0.858211f, 0.000000f, + 0.281824f, -0.866370f, 0.000000f, + -0.021127f, -0.869322f, 0.000000f, + 0.696621f, -0.812898f, 0.199757f, + 0.667643f, -0.830433f, 0.191692f, + 0.598465f, -0.845884f, 0.172439f, + 0.472000f, -0.858211f, 0.137243f, + 0.271165f, -0.866370f, 0.081348f, + 0.622505f, -0.812898f, 0.378023f, + 0.596519f, -0.830433f, 0.362761f, + 0.534484f, -0.845884f, 0.326326f, + 0.421079f, -0.858211f, 0.259720f, + 0.240982f, -0.866370f, 0.153944f, + 0.507059f, -0.812898f, 0.528186f, + 0.485734f, -0.830433f, 0.506861f, + 0.434826f, -0.845884f, 0.455953f, + 0.341762f, -0.858211f, 0.362889f, + 0.193968f, -0.866370f, 0.215095f, + 0.356896f, -0.812898f, 0.643632f, + 0.341634f, -0.830433f, 0.617646f, + 0.305199f, -0.845884f, 0.555611f, + 0.238593f, -0.858211f, 0.442206f, + 0.132817f, -0.866370f, 0.262109f, + 0.178630f, -0.812898f, 0.717749f, + 0.170565f, -0.830433f, 0.688771f, + 0.151312f, -0.845884f, 0.619592f, + 0.116116f, -0.858211f, 0.493128f, + 0.060221f, -0.866370f, 0.292292f, + -0.021127f, -0.812898f, 0.743924f, + -0.021127f, -0.830433f, 0.713889f, + -0.021127f, -0.845884f, 0.642188f, + -0.021127f, -0.858211f, 0.511111f, + -0.021127f, -0.866370f, 0.302951f, + -0.220884f, -0.812898f, 0.717749f, + -0.212820f, -0.830433f, 0.688771f, + -0.193566f, -0.845884f, 0.619592f, + -0.158370f, -0.858211f, 0.493128f, + -0.102475f, -0.866370f, 0.292292f, + -0.399151f, -0.812898f, 0.643632f, + -0.383889f, -0.830433f, 0.617646f, + -0.347454f, -0.845884f, 0.555611f, + -0.280847f, -0.858211f, 0.442206f, + -0.175071f, -0.866370f, 0.262109f, + -0.549313f, -0.812898f, 0.528186f, + -0.527988f, -0.830433f, 0.506861f, + -0.477080f, -0.845884f, 0.455953f, + -0.384016f, -0.858211f, 0.362889f, + -0.236223f, -0.866370f, 0.215095f, + -0.664759f, -0.812898f, 0.378023f, + -0.638773f, -0.830433f, 0.362761f, + -0.576738f, -0.845884f, 0.326326f, + -0.463333f, -0.858211f, 0.259720f, + -0.283236f, -0.866370f, 0.153944f, + -0.738876f, -0.812898f, 0.199757f, + -0.709898f, -0.830433f, 0.191692f, + -0.640719f, -0.845884f, 0.172439f, + -0.514255f, -0.858211f, 0.137243f, + -0.313419f, -0.866370f, 0.081348f, + -0.765051f, -0.812898f, 0.000000f, + -0.735016f, -0.830433f, 0.000000f, + -0.663315f, -0.845884f, 0.000000f, + -0.532238f, -0.858211f, 0.000000f, + -0.324079f, -0.866370f, 0.000000f, + -0.738876f, -0.812898f, -0.199757f, + -0.709898f, -0.830433f, -0.191692f, + -0.640719f, -0.845884f, -0.172439f, + -0.514255f, -0.858211f, -0.137243f, + -0.313419f, -0.866370f, -0.081348f, + -0.664759f, -0.812898f, -0.378023f, + -0.638773f, -0.830433f, -0.362761f, + -0.576738f, -0.845884f, -0.326326f, + -0.463333f, -0.858211f, -0.259720f, + -0.283236f, -0.866370f, -0.153944f, + -0.549313f, -0.812898f, -0.528186f, + -0.527988f, -0.830433f, -0.506861f, + -0.477080f, -0.845884f, -0.455953f, + -0.384016f, -0.858211f, -0.362889f, + -0.236223f, -0.866370f, -0.215095f, + -0.399151f, -0.812898f, -0.643632f, + -0.383889f, -0.830433f, -0.617646f, + -0.347454f, -0.845884f, -0.555611f, + -0.280847f, -0.858211f, -0.442206f, + -0.175071f, -0.866370f, -0.262109f, + -0.220884f, -0.812898f, -0.717749f, + -0.212820f, -0.830433f, -0.688771f, + -0.193566f, -0.845884f, -0.619592f, + -0.158370f, -0.858211f, -0.493128f, + -0.102475f, -0.866370f, -0.292292f, + -0.021127f, -0.812898f, -0.743924f, + -0.021127f, -0.830433f, -0.713889f, + -0.021127f, -0.845884f, -0.642188f, + -0.021127f, -0.858211f, -0.511111f, + -0.021127f, -0.866370f, -0.302951f, + 0.178630f, -0.812898f, -0.717749f, + 0.170565f, -0.830433f, -0.688771f, + 0.151312f, -0.845884f, -0.619592f, + 0.116116f, -0.858211f, -0.493128f, + 0.060221f, -0.866370f, -0.292292f, + 0.356896f, -0.812898f, -0.643632f, + 0.341634f, -0.830433f, -0.617646f, + 0.305199f, -0.845884f, -0.555611f, + 0.238593f, -0.858211f, -0.442206f, + 0.132817f, -0.866370f, -0.262109f, + 0.507059f, -0.812898f, -0.528186f, + 0.485734f, -0.830433f, -0.506861f, + 0.434826f, -0.845884f, -0.455953f, + 0.341762f, -0.858211f, -0.362889f, + 0.193968f, -0.866370f, -0.215095f, + 0.622505f, -0.812898f, -0.378023f, + 0.596519f, -0.830433f, -0.362761f, + 0.534484f, -0.845884f, -0.326326f, + 0.421079f, -0.858211f, -0.259720f, + 0.240982f, -0.866370f, -0.153944f, + 0.696621f, -0.812898f, -0.199757f, + 0.667643f, -0.830433f, -0.191692f, + 0.598465f, -0.845884f, -0.172439f, + 0.472000f, -0.858211f, -0.137243f, + 0.271165f, -0.866370f, -0.081348f, + -0.821127f, 0.143178f, 0.000000f, + -0.983396f, 0.142657f, 0.000000f, + -1.119275f, 0.139012f, 0.000000f, + -1.227377f, 0.129116f, 0.000000f, + -1.306313f, 0.109845f, 0.000000f, + -1.354692f, 0.078074f, 0.000000f, + -1.371127f, 0.030678f, 0.000000f, + -0.817424f, 0.151512f, 0.062500f, + -0.984648f, 0.150952f, 0.062500f, + -1.124351f, 0.147036f, 0.062500f, + -1.235248f, 0.136407f, 0.062500f, + -1.316052f, 0.115709f, 0.062500f, + -1.365477f, 0.081585f, 0.062500f, + -1.382239f, 0.030678f, 0.062500f, + -0.808164f, 0.172345f, 0.100000f, + -0.987777f, 0.171689f, 0.100000f, + -1.137040f, 0.167098f, 0.100000f, + -1.254924f, 0.154637f, 0.100000f, + -1.340400f, 0.130370f, 0.100000f, + -1.392441f, 0.090362f, 0.100000f, + -1.410016f, 0.030678f, 0.100000f, + -0.796127f, 0.199428f, 0.112500f, + -0.991845f, 0.198647f, 0.112500f, + -1.153535f, 0.193178f, 0.112500f, + -1.280502f, 0.178335f, 0.112500f, + -1.372053f, 0.149428f, 0.112500f, + -1.427493f, 0.101772f, 0.112500f, + -1.446127f, 0.030678f, 0.112500f, + -0.784090f, 0.226511f, 0.100000f, + -0.995913f, 0.225605f, 0.100000f, + -1.170030f, 0.219258f, 0.100000f, + -1.306081f, 0.202032f, 0.100000f, + -1.403706f, 0.168487f, 0.100000f, + -1.462545f, 0.113182f, 0.100000f, + -1.482238f, 0.030678f, 0.100000f, + -0.774831f, 0.247345f, 0.062500f, + -0.999042f, 0.246342f, 0.062500f, + -1.182719f, 0.239320f, 0.062500f, + -1.325757f, 0.220261f, 0.062500f, + -1.428054f, 0.183147f, 0.062500f, + -1.489509f, 0.121959f, 0.062500f, + -1.510016f, 0.030678f, 0.062500f, + -0.771127f, 0.255678f, 0.000000f, + -1.000294f, 0.254636f, 0.000000f, + -1.187794f, 0.247345f, 0.000000f, + -1.333627f, 0.227553f, 0.000000f, + -1.437794f, 0.189011f, 0.000000f, + -1.500294f, 0.125470f, 0.000000f, + -1.521127f, 0.030678f, 0.000000f, + -0.774831f, 0.247345f, -0.062500f, + -0.999042f, 0.246342f, -0.062500f, + -1.182719f, 0.239320f, -0.062500f, + -1.325757f, 0.220261f, -0.062500f, + -1.428054f, 0.183147f, -0.062500f, + -1.489509f, 0.121959f, -0.062500f, + -1.510016f, 0.030678f, -0.062500f, + -0.784090f, 0.226511f, -0.100000f, + -0.995913f, 0.225605f, -0.100000f, + -1.170030f, 0.219258f, -0.100000f, + -1.306081f, 0.202032f, -0.100000f, + -1.403706f, 0.168487f, -0.100000f, + -1.462545f, 0.113182f, -0.100000f, + -1.482238f, 0.030678f, -0.100000f, + -0.796127f, 0.199428f, -0.112500f, + -0.991845f, 0.198647f, -0.112500f, + -1.153535f, 0.193178f, -0.112500f, + -1.280502f, 0.178335f, -0.112500f, + -1.372053f, 0.149428f, -0.112500f, + -1.427493f, 0.101772f, -0.112500f, + -1.446127f, 0.030678f, -0.112500f, + -0.808164f, 0.172345f, -0.100000f, + -0.987777f, 0.171689f, -0.100000f, + -1.137040f, 0.167098f, -0.100000f, + -1.254924f, 0.154637f, -0.100000f, + -1.340400f, 0.130370f, -0.100000f, + -1.392441f, 0.090362f, -0.100000f, + -1.410016f, 0.030678f, -0.100000f, + -0.817424f, 0.151512f, -0.062500f, + -0.984648f, 0.150952f, -0.062500f, + -1.124351f, 0.147036f, -0.062500f, + -1.235248f, 0.136407f, -0.062500f, + -1.316052f, 0.115709f, -0.062500f, + -1.365477f, 0.081585f, -0.062500f, + -1.382239f, 0.030678f, -0.062500f, + -1.362563f, -0.033905f, 0.000000f, + -1.335942f, -0.110988f, 0.000000f, + -1.289877f, -0.194322f, 0.000000f, + -1.222979f, -0.277655f, 0.000000f, + -1.133859f, -0.354739f, 0.000000f, + -1.021127f, -0.419322f, 0.000000f, + -1.373219f, -0.037332f, 0.062500f, + -1.345270f, -0.116647f, 0.062500f, + -1.297053f, -0.201440f, 0.062500f, + -1.227232f, -0.285886f, 0.062500f, + -1.134467f, -0.364159f, 0.062500f, + -1.017424f, -0.430433f, 0.062500f, + -1.399861f, -0.045900f, 0.100000f, + -1.368590f, -0.130793f, 0.100000f, + -1.314993f, -0.219235f, 0.100000f, + -1.237862f, -0.306462f, 0.100000f, + -1.135989f, -0.387709f, 0.100000f, + -1.008164f, -0.458211f, 0.100000f, + -1.434495f, -0.057039f, 0.112500f, + -1.398905f, -0.149183f, 0.112500f, + -1.338315f, -0.242369f, 0.112500f, + -1.251683f, -0.333211f, 0.112500f, + -1.137967f, -0.418324f, 0.112500f, + -0.996127f, -0.494322f, 0.112500f, + -1.469130f, -0.068177f, 0.100000f, + -1.429221f, -0.167573f, 0.100000f, + -1.361637f, -0.265502f, 0.100000f, + -1.265503f, -0.359960f, 0.100000f, + -1.139946f, -0.448939f, 0.100000f, + -0.984090f, -0.530433f, 0.100000f, + -1.495772f, -0.076745f, 0.062500f, + -1.452540f, -0.181719f, 0.062500f, + -1.379576f, -0.283298f, 0.062500f, + -1.276134f, -0.380536f, 0.062500f, + -1.141468f, -0.472489f, 0.062500f, + -0.974831f, -0.558211f, 0.062500f, + -1.506428f, -0.080173f, 0.000000f, + -1.461868f, -0.187377f, 0.000000f, + -1.386752f, -0.290416f, 0.000000f, + -1.280387f, -0.388766f, 0.000000f, + -1.142076f, -0.481909f, 0.000000f, + -0.971127f, -0.569322f, 0.000000f, + -1.495772f, -0.076745f, -0.062500f, + -1.452540f, -0.181719f, -0.062500f, + -1.379576f, -0.283298f, -0.062500f, + -1.276134f, -0.380536f, -0.062500f, + -1.141468f, -0.472489f, -0.062500f, + -0.974831f, -0.558211f, -0.062500f, + -1.469130f, -0.068177f, -0.100000f, + -1.429221f, -0.167573f, -0.100000f, + -1.361637f, -0.265502f, -0.100000f, + -1.265503f, -0.359960f, -0.100000f, + -1.139946f, -0.448939f, -0.100000f, + -0.984090f, -0.530433f, -0.100000f, + -1.434495f, -0.057039f, -0.112500f, + -1.398905f, -0.149183f, -0.112500f, + -1.338315f, -0.242369f, -0.112500f, + -1.251683f, -0.333211f, -0.112500f, + -1.137967f, -0.418324f, -0.112500f, + -0.996127f, -0.494322f, -0.112500f, + -1.399861f, -0.045900f, -0.100000f, + -1.368590f, -0.130793f, -0.100000f, + -1.314993f, -0.219235f, -0.100000f, + -1.237862f, -0.306462f, -0.100000f, + -1.135989f, -0.387709f, -0.100000f, + -1.008164f, -0.458211f, -0.100000f, + -1.373219f, -0.037332f, -0.062500f, + -1.345270f, -0.116647f, -0.062500f, + -1.297053f, -0.201440f, -0.062500f, + -1.227232f, -0.285886f, -0.062500f, + -1.134467f, -0.364159f, -0.062500f, + -1.017424f, -0.430433f, -0.062500f, + 0.828873f, -0.156822f, 0.000000f, + 1.008271f, -0.131127f, 0.000000f, + 1.114058f, -0.063766f, 0.000000f, + 1.172623f, 0.030678f, 0.000000f, + 1.210354f, 0.137623f, 0.000000f, + 1.253641f, 0.242484f, 0.000000f, + 1.328873f, 0.330678f, 0.000000f, + 0.828873f, -0.187377f, 0.137500f, + 1.015061f, -0.156719f, 0.131173f, + 1.123935f, -0.083314f, 0.115355f, + 1.183734f, 0.017484f, 0.094792f, + 1.222700f, 0.130318f, 0.074228f, + 1.269073f, 0.239835f, 0.058411f, + 1.351095f, 0.330678f, 0.052083f, + 0.828873f, -0.263766f, 0.220000f, + 1.032036f, -0.220698f, 0.209877f, + 1.148626f, -0.132182f, 0.184568f, + 1.211512f, -0.015502f, 0.151667f, + 1.253564f, 0.112057f, 0.118765f, + 1.307654f, 0.233212f, 0.093457f, + 1.406651f, 0.330678f, 0.083333f, + 0.828873f, -0.363072f, 0.247500f, + 1.054104f, -0.303870f, 0.236111f, + 1.180725f, -0.195711f, 0.207639f, + 1.247623f, -0.058384f, 0.170625f, + 1.293688f, 0.088317f, 0.133611f, + 1.357808f, 0.224602f, 0.105139f, + 1.478873f, 0.330678f, 0.093750f, + 0.828873f, -0.462377f, 0.220000f, + 1.076172f, -0.387043f, 0.209877f, + 1.212823f, -0.259240f, 0.184568f, + 1.283734f, -0.101266f, 0.151667f, + 1.333811f, 0.064577f, 0.118765f, + 1.407962f, 0.215992f, 0.093457f, + 1.551095f, 0.330678f, 0.083333f, + 0.828873f, -0.538766f, 0.137500f, + 1.093148f, -0.451022f, 0.131173f, + 1.237515f, -0.308108f, 0.115355f, + 1.311512f, -0.134252f, 0.094792f, + 1.364675f, 0.046316f, 0.074228f, + 1.446543f, 0.209369f, 0.058410f, + 1.606651f, 0.330678f, 0.052083f, + 0.828873f, -0.569322f, 0.000000f, + 1.099938f, -0.476614f, 0.000000f, + 1.247391f, -0.327655f, 0.000000f, + 1.322623f, -0.147447f, 0.000000f, + 1.377021f, 0.039012f, 0.000000f, + 1.461975f, 0.206720f, 0.000000f, + 1.628873f, 0.330678f, 0.000000f, + 0.828873f, -0.538766f, -0.137500f, + 1.093148f, -0.451022f, -0.131173f, + 1.237515f, -0.308108f, -0.115355f, + 1.311512f, -0.134252f, -0.094792f, + 1.364675f, 0.046316f, -0.074228f, + 1.446543f, 0.209369f, -0.058410f, + 1.606651f, 0.330678f, -0.052083f, + 0.828873f, -0.462377f, -0.220000f, + 1.076172f, -0.387043f, -0.209877f, + 1.212823f, -0.259240f, -0.184568f, + 1.283734f, -0.101266f, -0.151667f, + 1.333811f, 0.064577f, -0.118765f, + 1.407962f, 0.215992f, -0.093457f, + 1.551095f, 0.330678f, -0.083333f, + 0.828873f, -0.363072f, -0.247500f, + 1.054104f, -0.303870f, -0.236111f, + 1.180725f, -0.195711f, -0.207639f, + 1.247623f, -0.058384f, -0.170625f, + 1.293688f, 0.088317f, -0.133611f, + 1.357808f, 0.224602f, -0.105139f, + 1.478873f, 0.330678f, -0.093750f, + 0.828873f, -0.263766f, -0.220000f, + 1.032036f, -0.220698f, -0.209877f, + 1.148626f, -0.132182f, -0.184568f, + 1.211512f, -0.015502f, -0.151667f, + 1.253564f, 0.112057f, -0.118765f, + 1.307654f, 0.233212f, -0.093457f, + 1.406651f, 0.330678f, -0.083333f, + 0.828873f, -0.187377f, -0.137500f, + 1.015061f, -0.156719f, -0.131173f, + 1.123935f, -0.083314f, -0.115355f, + 1.183734f, 0.017484f, -0.094792f, + 1.222700f, 0.130318f, -0.074228f, + 1.269073f, 0.239835f, -0.058410f, + 1.351095f, 0.330678f, -0.052083f, + 1.353410f, 0.346303f, 0.000000f, + 1.375169f, 0.355678f, 0.000000f, + 1.391373f, 0.358803f, 0.000000f, + 1.399243f, 0.355678f, 0.000000f, + 1.396003f, 0.346303f, 0.000000f, + 1.378873f, 0.330678f, 0.000000f, + 1.377077f, 0.346641f, 0.050540f, + 1.398763f, 0.356295f, 0.046682f, + 1.413711f, 0.359584f, 0.041667f, + 1.419477f, 0.356450f, 0.036651f, + 1.413617f, 0.346834f, 0.032793f, + 1.393688f, 0.330678f, 0.031250f, + 1.436244f, 0.347485f, 0.080864f, + 1.457748f, 0.357839f, 0.074691f, + 1.469556f, 0.361538f, 0.066667f, + 1.470060f, 0.358379f, 0.058642f, + 1.457652f, 0.348160f, 0.052469f, + 1.430725f, 0.330678f, 0.050000f, + 1.513161f, 0.348582f, 0.090972f, + 1.534428f, 0.359845f, 0.084028f, + 1.542154f, 0.364077f, 0.075000f, + 1.535817f, 0.360886f, 0.065972f, + 1.514897f, 0.349884f, 0.059028f, + 1.478873f, 0.330678f, 0.056250f, + 1.590078f, 0.349679f, 0.080864f, + 1.611109f, 0.361851f, 0.074691f, + 1.614753f, 0.366616f, 0.066667f, + 1.601575f, 0.363394f, 0.058642f, + 1.572143f, 0.351608f, 0.052469f, + 1.527021f, 0.330678f, 0.050000f, + 1.649245f, 0.350523f, 0.050540f, + 1.670094f, 0.363394f, 0.046682f, + 1.670597f, 0.368569f, 0.041667f, + 1.652158f, 0.365323f, 0.036651f, + 1.616178f, 0.352934f, 0.032793f, + 1.564058f, 0.330678f, 0.031250f, + 1.672912f, 0.350860f, 0.000000f, + 1.693688f, 0.364011f, 0.000000f, + 1.692935f, 0.369350f, 0.000000f, + 1.672391f, 0.366095f, 0.000000f, + 1.633792f, 0.353465f, 0.000000f, + 1.578873f, 0.330678f, 0.000000f, + 1.649245f, 0.350523f, -0.050540f, + 1.670094f, 0.363394f, -0.046682f, + 1.670597f, 0.368569f, -0.041667f, + 1.652158f, 0.365323f, -0.036651f, + 1.616178f, 0.352934f, -0.032793f, + 1.564058f, 0.330678f, -0.031250f, + 1.590078f, 0.349679f, -0.080864f, + 1.611109f, 0.361851f, -0.074691f, + 1.614753f, 0.366616f, -0.066667f, + 1.601575f, 0.363394f, -0.058642f, + 1.572143f, 0.351608f, -0.052469f, + 1.527021f, 0.330678f, -0.050000f, + 1.513161f, 0.348582f, -0.090972f, + 1.534428f, 0.359845f, -0.084028f, + 1.542154f, 0.364077f, -0.075000f, + 1.535817f, 0.360886f, -0.065972f, + 1.514897f, 0.349884f, -0.059028f, + 1.478873f, 0.330678f, -0.056250f, + 1.436244f, 0.347485f, -0.080864f, + 1.457748f, 0.357839f, -0.074691f, + 1.469556f, 0.361538f, -0.066667f, + 1.470060f, 0.358379f, -0.058642f, + 1.457652f, 0.348160f, -0.052469f, + 1.430725f, 0.330678f, -0.050000f, + 1.377077f, 0.346641f, -0.050540f, + 1.398763f, 0.356295f, -0.046682f, + 1.413711f, 0.359584f, -0.041667f, + 1.419477f, 0.356450f, -0.036651f, + 1.413617f, 0.346834f, -0.032793f, + 1.393688f, 0.330678f, -0.031250f, + -0.021127f, 0.705678f, 0.000000f, + 0.118225f, 0.694220f, 0.000000f, + 0.160354f, 0.664011f, 0.000000f, + 0.141373f, 0.621303f, 0.000000f, + 0.097391f, 0.572345f, 0.000000f, + 0.064521f, 0.523386f, 0.000000f, + 0.078873f, 0.480678f, 0.000000f, + 0.113346f, 0.694220f, 0.037539f, + 0.154000f, 0.664011f, 0.048885f, + 0.135681f, 0.621303f, 0.043764f, + 0.093237f, 0.572345f, 0.031902f, + 0.061512f, 0.523386f, 0.023022f, + 0.075354f, 0.480678f, 0.026852f, + 0.099515f, 0.694220f, 0.070966f, + 0.135987f, 0.664011f, 0.092417f, + 0.119549f, 0.621303f, 0.082741f, + 0.081463f, 0.572345f, 0.060324f, + 0.052990f, 0.523386f, 0.043553f, + 0.065391f, 0.480678f, 0.050815f, + 0.077943f, 0.694220f, 0.099070f, + 0.107891f, 0.664011f, 0.129019f, + 0.094388f, 0.621303f, 0.115516f, + 0.063104f, 0.572345f, 0.084231f, + 0.039709f, 0.523386f, 0.060836f, + 0.049873f, 0.480678f, 0.071000f, + 0.049838f, 0.694220f, 0.120642f, + 0.071290f, 0.664011f, 0.157114f, + 0.061614f, 0.621303f, 0.140676f, + 0.039197f, 0.572345f, 0.102590f, + 0.022426f, 0.523386f, 0.074117f, + 0.029688f, 0.480678f, 0.086519f, + 0.016412f, 0.694220f, 0.134473f, + 0.027758f, 0.664011f, 0.175127f, + 0.022637f, 0.621303f, 0.156808f, + 0.010774f, 0.572345f, 0.114364f, + 0.001895f, 0.523386f, 0.082639f, + 0.005725f, 0.480678f, 0.096482f, + -0.021127f, 0.694220f, 0.139352f, + -0.021127f, 0.664011f, 0.181482f, + -0.021127f, 0.621303f, 0.162500f, + -0.021127f, 0.572345f, 0.118519f, + -0.021127f, 0.523386f, 0.085648f, + -0.021127f, 0.480678f, 0.100000f, + -0.058666f, 0.694220f, 0.134473f, + -0.070013f, 0.664011f, 0.175127f, + -0.064892f, 0.621303f, 0.156808f, + -0.053029f, 0.572345f, 0.114364f, + -0.044149f, 0.523386f, 0.082639f, + -0.047979f, 0.480678f, 0.096481f, + -0.092093f, 0.694220f, 0.120642f, + -0.113544f, 0.664011f, 0.157114f, + -0.103868f, 0.621303f, 0.140676f, + -0.081451f, 0.572345f, 0.102590f, + -0.064680f, 0.523386f, 0.074117f, + -0.071942f, 0.480678f, 0.086519f, + -0.120197f, 0.694220f, 0.099070f, + -0.150146f, 0.664011f, 0.129019f, + -0.136643f, 0.621303f, 0.115516f, + -0.105359f, 0.572345f, 0.084231f, + -0.081963f, 0.523386f, 0.060836f, + -0.092127f, 0.480678f, 0.071000f, + -0.141770f, 0.694220f, 0.070966f, + -0.178241f, 0.664011f, 0.092417f, + -0.161803f, 0.621303f, 0.082741f, + -0.123717f, 0.572345f, 0.060324f, + -0.095244f, 0.523386f, 0.043553f, + -0.107646f, 0.480678f, 0.050815f, + -0.155600f, 0.694220f, 0.037539f, + -0.196254f, 0.664011f, 0.048885f, + -0.177936f, 0.621303f, 0.043764f, + -0.135491f, 0.572345f, 0.031902f, + -0.103767f, 0.523386f, 0.023022f, + -0.117609f, 0.480678f, 0.026852f, + -0.160479f, 0.694220f, 0.000000f, + -0.202609f, 0.664011f, 0.000000f, + -0.183627f, 0.621303f, 0.000000f, + -0.139646f, 0.572345f, 0.000000f, + -0.106775f, 0.523386f, 0.000000f, + -0.121127f, 0.480678f, 0.000000f, + -0.155600f, 0.694220f, -0.037539f, + -0.196254f, 0.664011f, -0.048885f, + -0.177936f, 0.621303f, -0.043764f, + -0.135491f, 0.572345f, -0.031902f, + -0.103767f, 0.523386f, -0.023022f, + -0.117609f, 0.480678f, -0.026852f, + -0.141770f, 0.694220f, -0.070966f, + -0.178241f, 0.664011f, -0.092417f, + -0.161803f, 0.621303f, -0.082741f, + -0.123717f, 0.572345f, -0.060324f, + -0.095244f, 0.523386f, -0.043553f, + -0.107646f, 0.480678f, -0.050815f, + -0.120197f, 0.694220f, -0.099070f, + -0.150146f, 0.664011f, -0.129019f, + -0.136643f, 0.621303f, -0.115516f, + -0.105359f, 0.572345f, -0.084231f, + -0.081963f, 0.523386f, -0.060836f, + -0.092127f, 0.480678f, -0.071000f, + -0.092093f, 0.694220f, -0.120642f, + -0.113544f, 0.664011f, -0.157114f, + -0.103868f, 0.621303f, -0.140676f, + -0.081451f, 0.572345f, -0.102590f, + -0.064680f, 0.523386f, -0.074117f, + -0.071942f, 0.480678f, -0.086519f, + -0.058666f, 0.694220f, -0.134473f, + -0.070013f, 0.664011f, -0.175127f, + -0.064892f, 0.621303f, -0.156808f, + -0.053029f, 0.572345f, -0.114364f, + -0.044149f, 0.523386f, -0.082639f, + -0.047979f, 0.480678f, -0.096482f, + -0.021127f, 0.694220f, -0.139352f, + -0.021127f, 0.664011f, -0.181482f, + -0.021127f, 0.621303f, -0.162500f, + -0.021127f, 0.572345f, -0.118519f, + -0.021127f, 0.523386f, -0.085648f, + -0.021127f, 0.480678f, -0.100000f, + 0.016412f, 0.694220f, -0.134473f, + 0.027758f, 0.664011f, -0.175127f, + 0.022637f, 0.621303f, -0.156808f, + 0.010774f, 0.572345f, -0.114364f, + 0.001895f, 0.523386f, -0.082639f, + 0.005725f, 0.480678f, -0.096481f, + 0.049838f, 0.694220f, -0.120642f, + 0.071290f, 0.664011f, -0.157114f, + 0.061614f, 0.621303f, -0.140676f, + 0.039197f, 0.572345f, -0.102590f, + 0.022426f, 0.523386f, -0.074117f, + 0.029688f, 0.480678f, -0.086519f, + 0.077943f, 0.694220f, -0.099070f, + 0.107891f, 0.664011f, -0.129019f, + 0.094388f, 0.621303f, -0.115516f, + 0.063104f, 0.572345f, -0.084231f, + 0.039709f, 0.523386f, -0.060836f, + 0.049873f, 0.480678f, -0.071000f, + 0.099515f, 0.694220f, -0.070966f, + 0.135987f, 0.664011f, -0.092417f, + 0.119549f, 0.621303f, -0.082741f, + 0.081463f, 0.572345f, -0.060324f, + 0.052990f, 0.523386f, -0.043553f, + 0.065391f, 0.480678f, -0.050815f, + 0.113346f, 0.694220f, -0.037539f, + 0.154000f, 0.664011f, -0.048885f, + 0.135681f, 0.621303f, -0.043764f, + 0.093237f, 0.572345f, -0.031902f, + 0.061512f, 0.523386f, -0.023022f, + 0.075354f, 0.480678f, -0.026852f, + 0.154336f, 0.448734f, 0.000000f, + 0.265910f, 0.425123f, 0.000000f, + 0.391373f, 0.405678f, 0.000000f, + 0.508502f, 0.386234f, 0.000000f, + 0.595077f, 0.362623f, 0.000000f, + 0.628873f, 0.330678f, 0.000000f, + 0.148162f, 0.448734f, 0.047115f, + 0.255810f, 0.425123f, 0.077075f, + 0.376859f, 0.405678f, 0.110764f, + 0.489867f, 0.386234f, 0.142215f, + 0.573395f, 0.362623f, 0.165462f, + 0.606002f, 0.330678f, 0.174537f, + 0.130681f, 0.448734f, 0.089161f, + 0.227213f, 0.425123f, 0.145857f, + 0.335762f, 0.405678f, 0.209611f, + 0.437101f, 0.386234f, 0.269130f, + 0.512003f, 0.362623f, 0.313123f, + 0.541243f, 0.330678f, 0.330296f, + 0.103451f, 0.448734f, 0.124579f, + 0.182669f, 0.425123f, 0.203796f, + 0.271748f, 0.405678f, 0.292875f, + 0.354910f, 0.386234f, 0.376037f, + 0.416377f, 0.362623f, 0.437505f, + 0.440373f, 0.330678f, 0.461500f, + 0.068034f, 0.448734f, 0.151808f, + 0.124730f, 0.425123f, 0.248340f, + 0.188484f, 0.405678f, 0.356889f, + 0.248003f, 0.386234f, 0.458228f, + 0.291995f, 0.362623f, 0.533130f, + 0.309169f, 0.330678f, 0.562370f, + 0.025988f, 0.448734f, 0.169289f, + 0.055948f, 0.425123f, 0.276938f, + 0.089637f, 0.405678f, 0.397986f, + 0.121088f, 0.386234f, 0.510995f, + 0.144335f, 0.362623f, 0.594523f, + 0.153410f, 0.330678f, 0.627130f, + -0.021127f, 0.448734f, 0.175463f, + -0.021127f, 0.425123f, 0.287037f, + -0.021127f, 0.405678f, 0.412500f, + -0.021127f, 0.386234f, 0.529630f, + -0.021127f, 0.362623f, 0.616204f, + -0.021127f, 0.330678f, 0.650000f, + -0.068242f, 0.448734f, 0.169289f, + -0.098202f, 0.425123f, 0.276938f, + -0.131891f, 0.405678f, 0.397986f, + -0.163343f, 0.386234f, 0.510995f, + -0.186589f, 0.362623f, 0.594523f, + -0.195664f, 0.330678f, 0.627130f, + -0.110288f, 0.448734f, 0.151808f, + -0.166985f, 0.425123f, 0.248340f, + -0.230738f, 0.405678f, 0.356889f, + -0.290258f, 0.386234f, 0.458228f, + -0.334250f, 0.362623f, 0.533130f, + -0.351424f, 0.330678f, 0.562370f, + -0.145706f, 0.448734f, 0.124579f, + -0.224924f, 0.425123f, 0.203796f, + -0.314002f, 0.405678f, 0.292875f, + -0.397164f, 0.386234f, 0.376037f, + -0.458632f, 0.362623f, 0.437505f, + -0.482627f, 0.330678f, 0.461500f, + -0.172935f, 0.448734f, 0.089161f, + -0.269467f, 0.425123f, 0.145857f, + -0.378016f, 0.405678f, 0.209611f, + -0.479355f, 0.386234f, 0.269130f, + -0.554258f, 0.362623f, 0.313123f, + -0.583498f, 0.330678f, 0.330296f, + -0.190416f, 0.448734f, 0.047115f, + -0.298065f, 0.425123f, 0.077075f, + -0.419113f, 0.405678f, 0.110764f, + -0.532122f, 0.386234f, 0.142215f, + -0.615650f, 0.362623f, 0.165462f, + -0.648257f, 0.330678f, 0.174537f, + -0.196590f, 0.448734f, 0.000000f, + -0.308164f, 0.425123f, 0.000000f, + -0.433627f, 0.405678f, 0.000000f, + -0.550757f, 0.386234f, 0.000000f, + -0.637331f, 0.362623f, 0.000000f, + -0.671127f, 0.330678f, 0.000000f, + -0.190416f, 0.448734f, -0.047115f, + -0.298065f, 0.425123f, -0.077075f, + -0.419113f, 0.405678f, -0.110764f, + -0.532122f, 0.386234f, -0.142215f, + -0.615650f, 0.362623f, -0.165462f, + -0.648257f, 0.330678f, -0.174537f, + -0.172935f, 0.448734f, -0.089161f, + -0.269467f, 0.425123f, -0.145857f, + -0.378016f, 0.405678f, -0.209611f, + -0.479355f, 0.386234f, -0.269130f, + -0.554258f, 0.362623f, -0.313123f, + -0.583498f, 0.330678f, -0.330296f, + -0.145706f, 0.448734f, -0.124579f, + -0.224924f, 0.425123f, -0.203796f, + -0.314002f, 0.405678f, -0.292875f, + -0.397164f, 0.386234f, -0.376037f, + -0.458632f, 0.362623f, -0.437505f, + -0.482627f, 0.330678f, -0.461500f, + -0.110288f, 0.448734f, -0.151808f, + -0.166985f, 0.425123f, -0.248340f, + -0.230738f, 0.405678f, -0.356889f, + -0.290258f, 0.386234f, -0.458228f, + -0.334250f, 0.362623f, -0.533130f, + -0.351424f, 0.330678f, -0.562370f, + -0.068242f, 0.448734f, -0.169289f, + -0.098202f, 0.425123f, -0.276938f, + -0.131891f, 0.405678f, -0.397986f, + -0.163343f, 0.386234f, -0.510995f, + -0.186589f, 0.362623f, -0.594523f, + -0.195664f, 0.330678f, -0.627130f, + -0.021127f, 0.448734f, -0.175463f, + -0.021127f, 0.425123f, -0.287037f, + -0.021127f, 0.405678f, -0.412500f, + -0.021127f, 0.386234f, -0.529630f, + -0.021127f, 0.362623f, -0.616204f, + -0.021127f, 0.330678f, -0.650000f, + 0.025988f, 0.448734f, -0.169289f, + 0.055948f, 0.425123f, -0.276938f, + 0.089637f, 0.405678f, -0.397986f, + 0.121088f, 0.386234f, -0.510995f, + 0.144335f, 0.362623f, -0.594523f, + 0.153410f, 0.330678f, -0.627130f, + 0.068034f, 0.448734f, -0.151808f, + 0.124730f, 0.425123f, -0.248340f, + 0.188484f, 0.405678f, -0.356889f, + 0.248003f, 0.386234f, -0.458228f, + 0.291996f, 0.362623f, -0.533130f, + 0.309169f, 0.330678f, -0.562370f, + 0.103451f, 0.448734f, -0.124579f, + 0.182669f, 0.425123f, -0.203796f, + 0.271748f, 0.405678f, -0.292875f, + 0.354910f, 0.386234f, -0.376037f, + 0.416377f, 0.362623f, -0.437505f, + 0.440373f, 0.330678f, -0.461500f, + 0.130681f, 0.448734f, -0.089161f, + 0.227213f, 0.425123f, -0.145857f, + 0.335762f, 0.405678f, -0.209611f, + 0.437101f, 0.386234f, -0.269130f, + 0.512003f, 0.362623f, -0.313123f, + 0.541243f, 0.330678f, -0.330296f, + 0.148162f, 0.448734f, -0.047115f, + 0.255810f, 0.425123f, -0.077075f, + 0.376859f, 0.405678f, -0.110764f, + 0.489867f, 0.386234f, -0.142215f, + 0.573395f, 0.362623f, -0.165462f, + 0.606002f, 0.330678f, -0.174537f, +}; +static D3DXVECTOR3* teapotPositions = ( D3DXVECTOR3* )teapotPositionsFloats; + +static float teapotNormalsfloats[NUMTEAPOTVERTICES*3] = +{ + -0.945751f, -0.322256f, -0.041309f, + -0.992771f, -0.120019f, -0.001089f, + -0.842751f, 0.538169f, 0.012052f, + -0.083588f, 0.996288f, 0.020560f, + 0.532170f, 0.846603f, 0.007614f, + 0.779300f, 0.626641f, 0.003491f, + 0.879896f, 0.475165f, 0.001103f, + -0.902413f, -0.322783f, -0.285416f, + -0.958558f, -0.120097f, -0.258348f, + -0.816875f, 0.538579f, -0.206514f, + -0.086190f, 0.996277f, -0.001604f, + 0.511484f, 0.846942f, 0.145167f, + 0.751363f, 0.627164f, 0.205227f, + 0.849281f, 0.475682f, 0.229015f, + -0.797449f, -0.323303f, -0.509461f, + -0.858625f, -0.120328f, -0.498282f, + -0.735017f, 0.538957f, -0.411431f, + -0.082580f, 0.996294f, -0.024043f, + 0.455735f, 0.847352f, 0.272581f, + 0.671856f, 0.627868f, 0.392927f, + 0.760399f, 0.476384f, 0.441420f, + -0.639341f, -0.323439f, -0.697589f, + -0.701183f, -0.120461f, -0.702731f, + -0.604040f, 0.539064f, -0.586980f, + -0.073399f, 0.996309f, -0.044511f, + 0.369925f, 0.847499f, 0.380659f, + 0.547722f, 0.628143f, 0.552663f, + 0.620826f, 0.476660f, 0.622391f, + -0.437782f, -0.323142f, -0.839003f, + -0.496373f, -0.120437f, -0.859715f, + -0.432443f, 0.538876f, -0.722914f, + -0.059523f, 0.996312f, -0.061801f, + 0.259388f, 0.847326f, 0.463418f, + 0.386844f, 0.627880f, 0.675366f, + 0.439492f, 0.476398f, 0.761506f, + -0.204681f, -0.322547f, -0.924159f, + -0.256209f, -0.120257f, -0.959112f, + -0.230122f, 0.538458f, -0.810621f, + -0.041668f, 0.996304f, -0.075119f, + 0.130300f, 0.846904f, 0.515534f, + 0.198391f, 0.627182f, 0.753183f, + 0.226852f, 0.475703f, 0.849850f, + 0.035941f, -0.330214f, -0.943221f, + -0.001376f, -0.125569f, -0.992084f, + -0.012701f, 0.535792f, -0.844254f, + -0.020672f, 0.996343f, -0.082901f, + -0.007571f, 0.846427f, 0.532451f, + -0.003482f, 0.626608f, 0.779327f, + -0.001103f, 0.475165f, 0.879896f, + 0.269574f, -0.386954f, -0.881814f, + 0.249993f, -0.181783f, -0.951030f, + 0.211872f, 0.499984f, -0.839718f, + 0.002768f, 0.995768f, -0.091859f, + -0.146446f, 0.844150f, 0.515718f, + -0.205497f, 0.625909f, 0.752335f, + -0.229034f, 0.475536f, 0.849358f, + 0.482854f, -0.445924f, -0.753661f, + 0.483883f, -0.261599f, -0.835118f, + 0.442338f, 0.434016f, -0.784836f, + 0.036680f, 0.993502f, -0.107746f, + -0.278510f, 0.839949f, 0.465746f, + -0.394390f, 0.624142f, 0.674465f, + -0.441541f, 0.475913f, 0.760624f, + 0.669165f, -0.453044f, -0.589041f, + 0.686401f, -0.287530f, -0.667967f, + 0.643212f, 0.404496f, -0.650124f, + 0.074604f, 0.991460f, -0.106959f, + -0.391289f, 0.837987f, 0.380356f, + -0.555484f, 0.623132f, 0.550586f, + -0.622636f, 0.476008f, 0.621080f, + 0.821788f, -0.407716f, -0.398036f, + 0.849894f, -0.244430f, -0.466834f, + 0.778095f, 0.435804f, -0.452374f, + 0.095458f, 0.992115f, -0.081218f, + -0.473659f, 0.839871f, 0.265074f, + -0.678265f, 0.623724f, 0.388490f, + -0.761768f, 0.475842f, 0.439641f, + 0.919150f, -0.348512f, -0.183583f, + 0.956218f, -0.171139f, -0.237398f, + 0.838823f, 0.493898f, -0.229000f, + 0.094322f, 0.994404f, -0.047578f, + -0.520640f, 0.843596f, 0.131452f, + -0.754753f, 0.625180f, 0.198741f, + -0.849997f, 0.475426f, 0.226882f, + 0.945537f, -0.322183f, 0.046446f, + 0.991881f, -0.126966f, 0.007216f, + 0.847572f, 0.530605f, -0.008996f, + 0.087879f, 0.995918f, -0.020615f, + -0.533063f, 0.846041f, -0.007711f, + -0.779612f, 0.626253f, -0.003532f, + -0.879926f, 0.475109f, -0.001109f, + 0.902413f, -0.322783f, 0.285416f, + 0.958558f, -0.120097f, 0.258348f, + 0.816875f, 0.538579f, 0.206514f, + 0.086190f, 0.996277f, 0.001604f, + -0.511484f, 0.846942f, -0.145167f, + -0.751363f, 0.627164f, -0.205227f, + -0.849281f, 0.475682f, -0.229015f, + 0.797449f, -0.323303f, 0.509461f, + 0.858625f, -0.120328f, 0.498282f, + 0.735017f, 0.538957f, 0.411431f, + 0.082580f, 0.996294f, 0.024043f, + -0.455735f, 0.847352f, -0.272581f, + -0.671856f, 0.627868f, -0.392927f, + -0.760399f, 0.476384f, -0.441420f, + 0.639341f, -0.323439f, 0.697589f, + 0.701183f, -0.120461f, 0.702731f, + 0.604040f, 0.539064f, 0.586980f, + 0.073399f, 0.996309f, 0.044511f, + -0.369925f, 0.847499f, -0.380659f, + -0.547722f, 0.628143f, -0.552663f, + -0.620826f, 0.476660f, -0.622391f, + 0.437782f, -0.323142f, 0.839003f, + 0.496373f, -0.120437f, 0.859715f, + 0.432443f, 0.538876f, 0.722914f, + 0.059523f, 0.996312f, 0.061801f, + -0.259388f, 0.847326f, -0.463418f, + -0.386844f, 0.627880f, -0.675366f, + -0.439492f, 0.476398f, -0.761506f, + 0.204681f, -0.322547f, 0.924159f, + 0.256209f, -0.120257f, 0.959112f, + 0.230122f, 0.538458f, 0.810621f, + 0.041668f, 0.996304f, 0.075119f, + -0.130300f, 0.846904f, -0.515534f, + -0.198391f, 0.627182f, -0.753183f, + -0.226852f, 0.475703f, -0.849850f, + -0.041309f, -0.322256f, 0.945751f, + -0.001089f, -0.120019f, 0.992771f, + 0.012052f, 0.538169f, 0.842751f, + 0.020560f, 0.996288f, 0.083588f, + 0.007614f, 0.846603f, -0.532170f, + 0.003491f, 0.626641f, -0.779300f, + 0.001103f, 0.475165f, -0.879896f, + -0.285416f, -0.322783f, 0.902413f, + -0.258348f, -0.120097f, 0.958558f, + -0.206514f, 0.538579f, 0.816875f, + -0.001604f, 0.996277f, 0.086190f, + 0.145167f, 0.846942f, -0.511484f, + 0.205227f, 0.627164f, -0.751363f, + 0.229015f, 0.475682f, -0.849281f, + -0.509461f, -0.323303f, 0.797449f, + -0.498282f, -0.120328f, 0.858625f, + -0.411431f, 0.538957f, 0.735017f, + -0.024043f, 0.996294f, 0.082580f, + 0.272581f, 0.847352f, -0.455735f, + 0.392927f, 0.627868f, -0.671856f, + 0.441420f, 0.476384f, -0.760399f, + -0.697589f, -0.323439f, 0.639341f, + -0.702731f, -0.120461f, 0.701183f, + -0.586980f, 0.539064f, 0.604040f, + -0.044511f, 0.996309f, 0.073399f, + 0.380659f, 0.847499f, -0.369925f, + 0.552663f, 0.628143f, -0.547722f, + 0.622391f, 0.476660f, -0.620826f, + -0.839003f, -0.323142f, 0.437782f, + -0.859715f, -0.120437f, 0.496373f, + -0.722914f, 0.538876f, 0.432443f, + -0.061801f, 0.996312f, 0.059523f, + 0.463418f, 0.847326f, -0.259388f, + 0.675366f, 0.627880f, -0.386844f, + 0.761506f, 0.476398f, -0.439492f, + -0.924159f, -0.322547f, 0.204681f, + -0.959112f, -0.120257f, 0.256209f, + -0.810621f, 0.538458f, 0.230122f, + -0.075119f, 0.996304f, 0.041668f, + 0.515534f, 0.846904f, -0.130300f, + 0.753183f, 0.627182f, -0.198391f, + 0.849850f, 0.475703f, -0.226852f, + 0.908180f, 0.418579f, 0.000170f, + 0.920061f, 0.391776f, 0.000335f, + 0.939254f, 0.343222f, 0.000478f, + 0.963807f, 0.266599f, 0.000552f, + 0.988261f, 0.152772f, 0.000449f, + 0.998933f, -0.046187f, -0.000262f, + 0.876892f, 0.419073f, 0.235451f, + 0.888349f, 0.392247f, 0.238702f, + 0.906891f, 0.343648f, 0.243832f, + 0.930644f, 0.266938f, 0.250291f, + 0.954351f, 0.152959f, 0.256551f, + 0.964867f, -0.046304f, 0.258627f, + 0.785456f, 0.419734f, 0.454843f, + 0.795707f, 0.392883f, 0.460971f, + 0.812334f, 0.344228f, 0.470766f, + 0.833667f, 0.267414f, 0.483207f, + 0.855012f, 0.153250f, 0.495448f, + 0.864663f, -0.046372f, 0.500207f, + 0.641599f, 0.419990f, 0.641841f, + 0.649935f, 0.393130f, 0.650410f, + 0.663494f, 0.344457f, 0.664173f, + 0.680925f, 0.267607f, 0.681710f, + 0.698421f, 0.153377f, 0.699059f, + 0.706532f, -0.046369f, 0.706160f, + 0.454545f, 0.419737f, 0.785627f, + 0.460384f, 0.392890f, 0.796043f, + 0.469929f, 0.344241f, 0.812813f, + 0.482239f, 0.267436f, 0.834220f, + 0.494660f, 0.153286f, 0.855462f, + 0.500666f, -0.046300f, 0.864402f, + 0.235117f, 0.419078f, 0.876980f, + 0.238044f, 0.392258f, 0.888521f, + 0.242894f, 0.343667f, 0.907136f, + 0.249206f, 0.266970f, 0.930926f, + 0.255668f, 0.153012f, 0.954579f, + 0.259142f, -0.046198f, 0.964734f, + -0.000170f, 0.418579f, 0.908181f, + -0.000335f, 0.391776f, 0.920061f, + -0.000478f, 0.343222f, 0.939254f, + -0.000552f, 0.266599f, 0.963807f, + -0.000449f, 0.152772f, 0.988261f, + 0.000262f, -0.046187f, 0.998933f, + -0.235451f, 0.419073f, 0.876892f, + -0.238702f, 0.392247f, 0.888349f, + -0.243832f, 0.343648f, 0.906891f, + -0.250291f, 0.266938f, 0.930644f, + -0.256551f, 0.152959f, 0.954351f, + -0.258627f, -0.046304f, 0.964867f, + -0.454843f, 0.419734f, 0.785456f, + -0.460971f, 0.392883f, 0.795707f, + -0.470766f, 0.344228f, 0.812334f, + -0.483207f, 0.267414f, 0.833667f, + -0.495448f, 0.153250f, 0.855012f, + -0.500207f, -0.046372f, 0.864663f, + -0.641841f, 0.419990f, 0.641599f, + -0.650410f, 0.393130f, 0.649935f, + -0.664173f, 0.344457f, 0.663494f, + -0.681710f, 0.267607f, 0.680925f, + -0.699059f, 0.153377f, 0.698421f, + -0.706160f, -0.046369f, 0.706532f, + -0.785627f, 0.419737f, 0.454545f, + -0.796043f, 0.392890f, 0.460384f, + -0.812813f, 0.344241f, 0.469929f, + -0.834220f, 0.267436f, 0.482239f, + -0.855462f, 0.153286f, 0.494660f, + -0.864402f, -0.046300f, 0.500666f, + -0.876980f, 0.419078f, 0.235117f, + -0.888521f, 0.392258f, 0.238044f, + -0.907136f, 0.343667f, 0.242894f, + -0.930926f, 0.266970f, 0.249206f, + -0.954579f, 0.153012f, 0.255668f, + -0.964734f, -0.046198f, 0.259142f, + -0.908181f, 0.418579f, -0.000170f, + -0.920061f, 0.391776f, -0.000335f, + -0.939254f, 0.343222f, -0.000478f, + -0.963807f, 0.266599f, -0.000552f, + -0.988261f, 0.152772f, -0.000449f, + -0.998933f, -0.046187f, 0.000262f, + -0.876892f, 0.419073f, -0.235451f, + -0.888349f, 0.392247f, -0.238702f, + -0.906891f, 0.343648f, -0.243832f, + -0.930644f, 0.266938f, -0.250291f, + -0.954351f, 0.152959f, -0.256551f, + -0.964867f, -0.046304f, -0.258627f, + -0.785456f, 0.419734f, -0.454843f, + -0.795707f, 0.392883f, -0.460971f, + -0.812334f, 0.344228f, -0.470766f, + -0.833667f, 0.267414f, -0.483207f, + -0.855012f, 0.153250f, -0.495448f, + -0.864663f, -0.046372f, -0.500207f, + -0.641599f, 0.419990f, -0.641841f, + -0.649935f, 0.393130f, -0.650410f, + -0.663494f, 0.344457f, -0.664173f, + -0.680925f, 0.267607f, -0.681710f, + -0.698421f, 0.153377f, -0.699059f, + -0.706532f, -0.046369f, -0.706160f, + -0.454545f, 0.419737f, -0.785627f, + -0.460384f, 0.392890f, -0.796043f, + -0.469929f, 0.344241f, -0.812813f, + -0.482239f, 0.267436f, -0.834220f, + -0.494660f, 0.153286f, -0.855462f, + -0.500666f, -0.046300f, -0.864402f, + -0.235117f, 0.419078f, -0.876980f, + -0.238044f, 0.392258f, -0.888521f, + -0.242894f, 0.343667f, -0.907136f, + -0.249206f, 0.266970f, -0.930926f, + -0.255668f, 0.153012f, -0.954579f, + -0.259142f, -0.046198f, -0.964734f, + 0.000170f, 0.418579f, -0.908181f, + 0.000335f, 0.391776f, -0.920061f, + 0.000478f, 0.343222f, -0.939254f, + 0.000552f, 0.266599f, -0.963807f, + 0.000449f, 0.152772f, -0.988261f, + -0.000262f, -0.046187f, -0.998933f, + 0.235451f, 0.419073f, -0.876892f, + 0.238702f, 0.392247f, -0.888349f, + 0.243832f, 0.343648f, -0.906891f, + 0.250291f, 0.266938f, -0.930644f, + 0.256551f, 0.152959f, -0.954351f, + 0.258627f, -0.046304f, -0.964867f, + 0.454843f, 0.419734f, -0.785456f, + 0.460971f, 0.392883f, -0.795707f, + 0.470766f, 0.344228f, -0.812334f, + 0.483207f, 0.267414f, -0.833667f, + 0.495448f, 0.153250f, -0.855012f, + 0.500207f, -0.046372f, -0.864663f, + 0.641841f, 0.419990f, -0.641599f, + 0.650410f, 0.393130f, -0.649935f, + 0.664173f, 0.344457f, -0.663494f, + 0.681710f, 0.267607f, -0.680925f, + 0.699059f, 0.153377f, -0.698421f, + 0.706160f, -0.046369f, -0.706532f, + 0.785627f, 0.419737f, -0.454545f, + 0.796043f, 0.392890f, -0.460384f, + 0.812813f, 0.344241f, -0.469929f, + 0.834220f, 0.267436f, -0.482239f, + 0.855462f, 0.153286f, -0.494660f, + 0.864402f, -0.046300f, -0.500666f, + 0.876980f, 0.419078f, -0.235117f, + 0.888521f, 0.392258f, -0.238044f, + 0.907136f, 0.343667f, -0.242894f, + 0.930926f, 0.266970f, -0.249206f, + 0.954579f, 0.153012f, -0.255668f, + 0.964734f, -0.046198f, -0.259142f, + 0.943833f, -0.330414f, -0.002283f, + 0.821403f, -0.570341f, -0.002745f, + 0.709541f, -0.704661f, -0.001958f, + 0.652305f, -0.757957f, -0.000466f, + 0.728669f, -0.684856f, 0.003576f, + 0.889124f, -0.457656f, 0.003164f, + 0.912037f, -0.330868f, 0.242313f, + 0.793697f, -0.570897f, 0.210051f, + 0.685340f, -0.705168f, 0.181787f, + 0.629635f, -0.758420f, 0.168401f, + 0.702387f, -0.685364f, 0.192168f, + 0.857690f, -0.458122f, 0.233435f, + 0.817716f, -0.331385f, 0.470664f, + 0.711528f, -0.571608f, 0.408646f, + 0.614071f, -0.705839f, 0.353140f, + 0.563713f, -0.759034f, 0.325721f, + 0.627891f, -0.686037f, 0.367569f, + 0.767411f, -0.458787f, 0.447879f, + 0.668728f, -0.331557f, 0.665486f, + 0.582010f, -0.571874f, 0.578122f, + 0.502096f, -0.706097f, 0.499327f, + 0.460496f, -0.759271f, 0.459838f, + 0.511760f, -0.686297f, 0.516816f, + 0.625950f, -0.459060f, 0.630437f, + 0.474660f, -0.331321f, 0.815429f, + 0.413434f, -0.571590f, 0.708771f, + 0.356547f, -0.705839f, 0.612100f, + 0.326530f, -0.759035f, 0.563244f, + 0.361346f, -0.686040f, 0.631489f, + 0.442349f, -0.458832f, 0.770585f, + 0.246794f, -0.330773f, 0.910869f, + 0.215429f, -0.570870f, 0.792274f, + 0.185619f, -0.705168f, 0.684313f, + 0.169311f, -0.758421f, 0.629390f, + 0.185170f, -0.685368f, 0.704260f, + 0.227231f, -0.458188f, 0.859319f, + 0.002283f, -0.330414f, 0.943833f, + 0.002745f, -0.570341f, 0.821403f, + 0.001958f, -0.704661f, 0.709541f, + 0.000466f, -0.757957f, 0.652305f, + -0.003576f, -0.684856f, 0.728669f, + -0.003164f, -0.457656f, 0.889124f, + -0.242313f, -0.330868f, 0.912037f, + -0.210051f, -0.570897f, 0.793697f, + -0.181787f, -0.705168f, 0.685340f, + -0.168401f, -0.758420f, 0.629635f, + -0.192168f, -0.685364f, 0.702387f, + -0.233435f, -0.458122f, 0.857690f, + -0.470664f, -0.331385f, 0.817716f, + -0.408646f, -0.571608f, 0.711528f, + -0.353140f, -0.705839f, 0.614071f, + -0.325721f, -0.759034f, 0.563713f, + -0.367569f, -0.686037f, 0.627891f, + -0.447879f, -0.458787f, 0.767411f, + -0.665486f, -0.331557f, 0.668728f, + -0.578122f, -0.571874f, 0.582010f, + -0.499327f, -0.706097f, 0.502096f, + -0.459838f, -0.759271f, 0.460496f, + -0.516816f, -0.686297f, 0.511760f, + -0.630437f, -0.459060f, 0.625950f, + -0.815429f, -0.331321f, 0.474660f, + -0.708771f, -0.571590f, 0.413434f, + -0.612100f, -0.705839f, 0.356547f, + -0.563244f, -0.759035f, 0.326530f, + -0.631489f, -0.686040f, 0.361346f, + -0.770585f, -0.458832f, 0.442349f, + -0.910869f, -0.330773f, 0.246794f, + -0.792274f, -0.570870f, 0.215429f, + -0.684313f, -0.705168f, 0.185619f, + -0.629390f, -0.758421f, 0.169311f, + -0.704260f, -0.685368f, 0.185170f, + -0.859319f, -0.458188f, 0.227231f, + -0.943833f, -0.330414f, 0.002283f, + -0.821403f, -0.570341f, 0.002745f, + -0.709541f, -0.704661f, 0.001958f, + -0.652305f, -0.757957f, 0.000466f, + -0.728669f, -0.684856f, -0.003576f, + -0.889124f, -0.457656f, -0.003164f, + -0.912037f, -0.330868f, -0.242313f, + -0.793697f, -0.570897f, -0.210051f, + -0.685340f, -0.705168f, -0.181787f, + -0.629635f, -0.758420f, -0.168401f, + -0.702387f, -0.685364f, -0.192168f, + -0.857690f, -0.458122f, -0.233435f, + -0.817716f, -0.331385f, -0.470664f, + -0.711528f, -0.571608f, -0.408646f, + -0.614071f, -0.705839f, -0.353140f, + -0.563713f, -0.759034f, -0.325721f, + -0.627891f, -0.686037f, -0.367569f, + -0.767411f, -0.458787f, -0.447879f, + -0.668728f, -0.331557f, -0.665486f, + -0.582010f, -0.571874f, -0.578122f, + -0.502096f, -0.706097f, -0.499327f, + -0.460496f, -0.759271f, -0.459838f, + -0.511760f, -0.686297f, -0.516816f, + -0.625950f, -0.459060f, -0.630437f, + -0.474660f, -0.331321f, -0.815429f, + -0.413434f, -0.571590f, -0.708771f, + -0.356547f, -0.705839f, -0.612100f, + -0.326530f, -0.759035f, -0.563244f, + -0.361346f, -0.686040f, -0.631489f, + -0.442349f, -0.458832f, -0.770585f, + -0.246794f, -0.330773f, -0.910869f, + -0.215429f, -0.570870f, -0.792274f, + -0.185619f, -0.705168f, -0.684313f, + -0.169311f, -0.758421f, -0.629390f, + -0.185170f, -0.685368f, -0.704260f, + -0.227231f, -0.458188f, -0.859319f, + -0.002283f, -0.330414f, -0.943833f, + -0.002745f, -0.570341f, -0.821403f, + -0.001958f, -0.704661f, -0.709541f, + -0.000466f, -0.757957f, -0.652305f, + 0.003576f, -0.684856f, -0.728669f, + 0.003164f, -0.457656f, -0.889124f, + 0.242313f, -0.330868f, -0.912037f, + 0.210051f, -0.570897f, -0.793697f, + 0.181787f, -0.705168f, -0.685340f, + 0.168401f, -0.758420f, -0.629635f, + 0.192168f, -0.685364f, -0.702387f, + 0.233435f, -0.458122f, -0.857690f, + 0.470664f, -0.331385f, -0.817716f, + 0.408646f, -0.571608f, -0.711528f, + 0.353140f, -0.705839f, -0.614071f, + 0.325721f, -0.759034f, -0.563713f, + 0.367569f, -0.686037f, -0.627891f, + 0.447879f, -0.458787f, -0.767411f, + 0.665486f, -0.331557f, -0.668728f, + 0.578122f, -0.571874f, -0.582010f, + 0.499327f, -0.706097f, -0.502096f, + 0.459838f, -0.759271f, -0.460496f, + 0.516816f, -0.686297f, -0.511760f, + 0.630437f, -0.459060f, -0.625950f, + 0.815429f, -0.331321f, -0.474660f, + 0.708771f, -0.571590f, -0.413434f, + 0.612100f, -0.705839f, -0.356547f, + 0.563244f, -0.759035f, -0.326530f, + 0.631489f, -0.686040f, -0.361346f, + 0.770585f, -0.458832f, -0.442349f, + 0.910869f, -0.330773f, -0.246794f, + 0.792274f, -0.570870f, -0.215429f, + 0.684313f, -0.705168f, -0.185619f, + 0.629390f, -0.758421f, -0.169311f, + 0.704260f, -0.685368f, -0.185170f, + 0.859319f, -0.458188f, -0.227231f, + 0.777345f, -0.628990f, -0.010332f, + 0.361793f, -0.932236f, -0.006477f, + 0.152402f, -0.988315f, -0.002559f, + 0.066422f, -0.997791f, -0.001190f, + 0.027401f, -0.999624f, -0.001027f, + 0.000000f, -1.000000f, 0.000000f, + 0.753154f, -0.629440f, 0.191218f, + 0.350766f, -0.932386f, 0.087291f, + 0.147688f, -0.988344f, 0.036926f, + 0.064386f, -0.997796f, 0.016021f, + 0.026706f, -0.999625f, 0.006087f, + 0.677297f, -0.629962f, 0.380023f, + 0.315543f, -0.932612f, 0.175124f, + 0.132774f, -0.988389f, 0.073881f, + 0.057900f, -0.997805f, 0.032133f, + 0.024157f, -0.999626f, 0.012794f, + 0.556310f, -0.630147f, 0.541695f, + 0.259523f, -0.932707f, 0.250409f, + 0.109137f, -0.988408f, 0.105540f, + 0.047613f, -0.997809f, 0.045941f, + 0.020018f, -0.999627f, 0.018575f, + 0.398014f, -0.629932f, 0.666911f, + 0.186318f, -0.932635f, 0.308995f, + 0.078296f, -0.988394f, 0.130182f, + 0.034185f, -0.997806f, 0.056696f, + 0.014564f, -0.999627f, 0.023117f, + 0.211443f, -0.629395f, 0.747766f, + 0.099921f, -0.932420f, 0.347287f, + 0.041912f, -0.988352f, 0.146303f, + 0.018338f, -0.997798f, 0.063741f, + 0.008087f, -0.999625f, 0.026150f, + 0.010332f, -0.628990f, 0.777345f, + 0.006477f, -0.932236f, 0.361793f, + 0.002559f, -0.988315f, 0.152402f, + 0.001190f, -0.997791f, 0.066422f, + 0.001027f, -0.999624f, 0.027401f, + -0.191218f, -0.629440f, 0.753154f, + -0.087291f, -0.932386f, 0.350766f, + -0.036926f, -0.988344f, 0.147688f, + -0.016021f, -0.997796f, 0.064386f, + -0.006087f, -0.999625f, 0.026706f, + -0.380023f, -0.629962f, 0.677297f, + -0.175124f, -0.932612f, 0.315543f, + -0.073881f, -0.988389f, 0.132774f, + -0.032133f, -0.997805f, 0.057900f, + -0.012794f, -0.999626f, 0.024157f, + -0.541695f, -0.630147f, 0.556310f, + -0.250409f, -0.932707f, 0.259523f, + -0.105540f, -0.988408f, 0.109137f, + -0.045941f, -0.997809f, 0.047613f, + -0.018575f, -0.999627f, 0.020018f, + -0.666911f, -0.629932f, 0.398014f, + -0.308995f, -0.932635f, 0.186318f, + -0.130182f, -0.988394f, 0.078296f, + -0.056696f, -0.997806f, 0.034185f, + -0.023117f, -0.999627f, 0.014564f, + -0.747766f, -0.629395f, 0.211443f, + -0.347287f, -0.932420f, 0.099921f, + -0.146303f, -0.988352f, 0.041912f, + -0.063741f, -0.997798f, 0.018338f, + -0.026150f, -0.999625f, 0.008087f, + -0.777345f, -0.628990f, 0.010332f, + -0.361793f, -0.932236f, 0.006477f, + -0.152402f, -0.988315f, 0.002559f, + -0.066422f, -0.997791f, 0.001190f, + -0.027401f, -0.999624f, 0.001027f, + -0.753154f, -0.629440f, -0.191218f, + -0.350766f, -0.932386f, -0.087291f, + -0.147688f, -0.988344f, -0.036926f, + -0.064386f, -0.997796f, -0.016021f, + -0.026706f, -0.999625f, -0.006087f, + -0.677297f, -0.629962f, -0.380023f, + -0.315543f, -0.932612f, -0.175124f, + -0.132774f, -0.988389f, -0.073881f, + -0.057900f, -0.997805f, -0.032133f, + -0.024157f, -0.999626f, -0.012794f, + -0.556310f, -0.630147f, -0.541695f, + -0.259523f, -0.932707f, -0.250409f, + -0.109137f, -0.988408f, -0.105540f, + -0.047613f, -0.997809f, -0.045941f, + -0.020018f, -0.999627f, -0.018575f, + -0.398014f, -0.629932f, -0.666911f, + -0.186318f, -0.932635f, -0.308995f, + -0.078296f, -0.988394f, -0.130182f, + -0.034185f, -0.997806f, -0.056696f, + -0.014564f, -0.999627f, -0.023117f, + -0.211443f, -0.629395f, -0.747766f, + -0.099921f, -0.932420f, -0.347287f, + -0.041912f, -0.988352f, -0.146303f, + -0.018338f, -0.997798f, -0.063741f, + -0.008087f, -0.999625f, -0.026150f, + -0.010332f, -0.628990f, -0.777345f, + -0.006477f, -0.932236f, -0.361793f, + -0.002559f, -0.988315f, -0.152402f, + -0.001190f, -0.997791f, -0.066422f, + -0.001027f, -0.999624f, -0.027401f, + 0.191218f, -0.629440f, -0.753154f, + 0.087291f, -0.932386f, -0.350766f, + 0.036926f, -0.988344f, -0.147688f, + 0.016021f, -0.997796f, -0.064386f, + 0.006087f, -0.999625f, -0.026706f, + 0.380023f, -0.629962f, -0.677297f, + 0.175124f, -0.932612f, -0.315543f, + 0.073881f, -0.988389f, -0.132774f, + 0.032133f, -0.997805f, -0.057900f, + 0.012794f, -0.999626f, -0.024157f, + 0.541695f, -0.630147f, -0.556310f, + 0.250409f, -0.932707f, -0.259523f, + 0.105540f, -0.988408f, -0.109137f, + 0.045941f, -0.997809f, -0.047613f, + 0.018575f, -0.999627f, -0.020018f, + 0.666911f, -0.629932f, -0.398014f, + 0.308995f, -0.932635f, -0.186318f, + 0.130182f, -0.988394f, -0.078296f, + 0.056696f, -0.997806f, -0.034185f, + 0.023117f, -0.999627f, -0.014564f, + 0.747766f, -0.629395f, -0.211443f, + 0.347287f, -0.932420f, -0.099921f, + 0.146303f, -0.988352f, -0.041912f, + 0.063741f, -0.997798f, -0.018338f, + 0.026150f, -0.999625f, -0.008087f, + 0.003252f, -0.999017f, 0.044215f, + 0.015240f, -0.999884f, -0.000426f, + 0.059928f, -0.998202f, -0.000876f, + 0.167134f, -0.985934f, -0.001083f, + 0.403838f, -0.914830f, -0.000203f, + 0.792445f, -0.609943f, 0.000242f, + 0.995161f, -0.098254f, -0.001013f, + 0.003195f, -0.927908f, 0.372795f, + 0.015041f, -0.949764f, 0.312606f, + 0.059227f, -0.948266f, 0.311904f, + 0.164453f, -0.933549f, 0.318499f, + 0.388162f, -0.854219f, 0.345890f, + 0.729394f, -0.561905f, 0.390189f, + 0.912351f, -0.095332f, 0.398156f, + 0.002232f, -0.597680f, 0.801731f, + 0.010830f, -0.681497f, 0.731741f, + 0.043613f, -0.679614f, 0.732272f, + 0.120047f, -0.660320f, 0.741327f, + 0.267930f, -0.580441f, 0.768962f, + 0.467285f, -0.367107f, 0.804287f, + 0.584006f, -0.067606f, 0.808929f, + -0.000653f, 0.152635f, 0.988282f, + -0.002559f, 0.000905f, 0.999996f, + -0.007405f, 0.000384f, 0.999972f, + -0.016090f, -0.004746f, 0.999859f, + -0.025703f, -0.019620f, 0.999477f, + -0.020936f, -0.035053f, 0.999166f, + -0.002824f, -0.023899f, 0.999710f, + -0.003296f, 0.756255f, 0.654269f, + -0.015405f, 0.681251f, 0.731887f, + -0.059217f, 0.676283f, 0.734258f, + -0.158438f, 0.643792f, 0.748619f, + -0.334170f, 0.526967f, 0.781432f, + -0.518177f, 0.278028f, 0.808822f, + -0.588929f, 0.016391f, 0.808019f, + -0.004352f, 0.967350f, 0.253408f, + -0.020677f, 0.949300f, 0.313691f, + -0.081844f, 0.945117f, 0.316317f, + -0.226175f, 0.916097f, 0.331076f, + -0.500500f, 0.784289f, 0.366594f, + -0.804374f, 0.439635f, 0.399630f, + -0.916460f, 0.037237f, 0.398390f, + -0.004517f, 0.999011f, -0.044228f, + -0.021584f, 0.999767f, 0.000265f, + -0.086245f, 0.996274f, 0.000157f, + -0.240673f, 0.970606f, -0.000608f, + -0.540280f, 0.841484f, -0.001597f, + -0.877811f, 0.479008f, 0.000390f, + -0.999074f, 0.043021f, 0.000686f, + -0.004094f, 0.927919f, -0.372759f, + -0.019687f, 0.949518f, -0.313093f, + -0.079023f, 0.945545f, -0.315752f, + -0.219600f, 0.917458f, -0.331734f, + -0.488715f, 0.790534f, -0.369071f, + -0.797673f, 0.452036f, -0.399226f, + -0.916555f, 0.045675f, -0.397293f, + -0.002516f, 0.597699f, -0.801716f, + -0.012433f, 0.681272f, -0.731925f, + -0.050950f, 0.677183f, -0.734048f, + -0.140298f, 0.648898f, -0.747829f, + -0.303501f, 0.546934f, -0.780224f, + -0.495541f, 0.315794f, -0.809143f, + -0.586888f, 0.043544f, -0.808497f, + 0.000557f, -0.152599f, -0.988288f, + 0.002074f, -0.000969f, -0.999997f, + 0.005499f, -0.001410f, -0.999984f, + 0.011569f, 0.000546f, -0.999933f, + 0.019331f, 0.010342f, -0.999760f, + 0.017294f, 0.025347f, -0.999529f, + 0.002733f, 0.020710f, -0.999782f, + 0.002668f, -0.756195f, -0.654340f, + 0.012416f, -0.681586f, -0.731633f, + 0.047946f, -0.679845f, -0.731787f, + 0.130533f, -0.659594f, -0.740200f, + 0.293034f, -0.569168f, -0.768231f, + 0.500213f, -0.318883f, -0.805047f, + 0.587808f, -0.026599f, -0.808563f, + 0.003191f, -0.967332f, -0.253494f, + 0.014981f, -0.949482f, -0.313464f, + 0.058954f, -0.947784f, -0.313417f, + 0.164056f, -0.933187f, -0.319761f, + 0.391212f, -0.853217f, -0.344925f, + 0.743675f, -0.542841f, -0.390219f, + 0.913602f, -0.073956f, -0.399828f, + 0.972925f, 0.231121f, -0.000918f, + 0.912330f, 0.409438f, -0.003849f, + 0.828029f, 0.560649f, -0.006408f, + 0.716807f, 0.697239f, -0.006712f, + 0.575989f, 0.817451f, -0.003302f, + 0.495133f, 0.867633f, -0.045350f, + 0.893985f, 0.213142f, 0.394158f, + 0.840605f, 0.383895f, 0.382108f, + 0.768860f, 0.531454f, 0.355543f, + 0.672509f, 0.665677f, 0.323426f, + 0.545610f, 0.779633f, 0.307380f, + 0.479303f, 0.843050f, 0.244000f, + 0.576388f, 0.133958f, 0.806122f, + 0.544470f, 0.253746f, 0.799478f, + 0.508754f, 0.364144f, 0.780108f, + 0.461180f, 0.471780f, 0.751490f, + 0.387281f, 0.561166f, 0.731509f, + 0.371347f, 0.666129f, 0.646818f, + 0.002410f, -0.014515f, 0.999892f, + 0.001301f, -0.016411f, 0.999865f, + 0.000720f, -0.020201f, 0.999796f, + 0.003256f, -0.021359f, 0.999767f, + 0.008876f, -0.013337f, 0.999872f, + 0.072759f, 0.131709f, 0.988615f, + -0.569088f, -0.161451f, 0.806271f, + -0.524317f, -0.294841f, 0.798850f, + -0.472635f, -0.410610f, 0.779754f, + -0.415783f, -0.508606f, 0.753953f, + -0.349674f, -0.579676f, 0.736006f, + -0.279208f, -0.530698f, 0.800252f, + -0.885693f, -0.241406f, 0.396574f, + -0.803204f, -0.449996f, 0.390343f, + -0.697513f, -0.613444f, 0.370354f, + -0.588462f, -0.732277f, 0.342757f, + -0.485206f, -0.813008f, 0.321860f, + -0.425879f, -0.823534f, 0.374725f, + -0.965787f, -0.259335f, 0.000592f, + -0.872611f, -0.488406f, 0.003010f, + -0.748651f, -0.662945f, 0.005037f, + -0.622443f, -0.782648f, 0.005056f, + -0.509112f, -0.860697f, 0.002551f, + -0.455515f, -0.889038f, 0.046023f, + -0.888605f, -0.232245f, -0.395529f, + -0.809378f, -0.443445f, -0.385051f, + -0.704052f, -0.611598f, -0.360913f, + -0.592713f, -0.733528f, -0.332607f, + -0.486334f, -0.814293f, -0.316868f, + -0.441890f, -0.860789f, -0.252538f, + -0.574477f, -0.139332f, -0.806575f, + -0.532235f, -0.275661f, -0.800460f, + -0.480844f, -0.396171f, -0.782201f, + -0.423172f, -0.499323f, -0.756044f, + -0.355443f, -0.574187f, -0.737543f, + -0.348424f, -0.670745f, -0.654753f, + -0.001891f, 0.012937f, -0.999915f, + 0.001397f, 0.011921f, -0.999928f, + 0.005089f, 0.014178f, -0.999887f, + 0.004896f, 0.016722f, -0.999848f, + -0.002003f, 0.012285f, -0.999922f, + -0.068183f, -0.130578f, -0.989091f, + 0.573387f, 0.149188f, -0.805587f, + 0.541227f, 0.266714f, -0.797456f, + 0.503525f, 0.377270f, -0.777258f, + 0.451452f, 0.484144f, -0.749530f, + 0.372386f, 0.571022f, -0.731616f, + 0.289707f, 0.529053f, -0.797604f, + 0.892654f, 0.216131f, -0.395546f, + 0.837234f, 0.384836f, -0.388510f, + 0.763231f, 0.531640f, -0.367202f, + 0.665469f, 0.666102f, -0.336837f, + 0.537995f, 0.781974f, -0.314766f, + 0.455324f, 0.810920f, -0.367545f, + -0.145927f, 0.987044f, 0.066705f, + -0.350253f, 0.936641f, -0.005157f, + -0.710995f, 0.703191f, -0.003047f, + -0.899400f, 0.437101f, 0.004678f, + -0.930238f, 0.366579f, 0.016656f, + -0.845840f, 0.533040f, 0.020564f, + -0.646372f, 0.763018f, 0.002776f, + -0.128906f, 0.841567f, 0.524546f, + -0.292019f, 0.852082f, 0.434375f, + -0.615355f, 0.675119f, 0.406882f, + -0.799678f, 0.453205f, 0.393853f, + -0.814130f, 0.384381f, 0.435251f, + -0.711742f, 0.496654f, 0.496746f, + -0.538718f, 0.683956f, 0.491922f, + -0.054328f, 0.445430f, 0.893667f, + -0.120328f, 0.535740f, 0.835765f, + -0.285367f, 0.495269f, 0.820533f, + -0.427214f, 0.405516f, 0.808112f, + -0.455262f, 0.354182f, 0.816880f, + -0.386518f, 0.375163f, 0.842530f, + -0.289150f, 0.468105f, 0.835027f, + 0.075157f, -0.092491f, 0.992873f, + 0.130249f, 0.040179f, 0.990667f, + 0.205304f, 0.124938f, 0.970691f, + 0.176764f, 0.184322f, 0.966840f, + 0.082193f, 0.182483f, 0.979767f, + 0.009842f, 0.124532f, 0.992167f, + -0.004171f, 0.105296f, 0.994432f, + 0.213849f, -0.587755f, 0.780264f, + 0.361728f, -0.447069f, 0.818097f, + 0.601635f, -0.258541f, 0.755772f, + 0.672221f, -0.099063f, 0.733693f, + 0.583247f, -0.084870f, 0.807849f, + 0.409251f, -0.235708f, 0.881451f, + 0.284284f, -0.385654f, 0.877755f, + 0.302637f, -0.880762f, 0.364237f, + 0.496428f, -0.756105f, 0.426456f, + 0.790450f, -0.487110f, 0.371365f, + 0.895860f, -0.277360f, 0.347141f, + 0.865262f, -0.295907f, 0.404673f, + 0.690272f, -0.542643f, 0.478606f, + 0.467747f, -0.753579f, 0.461879f, + 0.321563f, -0.944505f, -0.067141f, + 0.531566f, -0.847002f, 0.005046f, + 0.833505f, -0.552508f, 0.002163f, + 0.944185f, -0.329343f, -0.006880f, + 0.932318f, -0.361245f, -0.016874f, + 0.768639f, -0.639601f, -0.010215f, + 0.513002f, -0.858387f, 0.000964f, + 0.278331f, -0.809595f, -0.516806f, + 0.491568f, -0.763636f, -0.418594f, + 0.788478f, -0.493107f, -0.367624f, + 0.891089f, -0.275271f, -0.360815f, + 0.856479f, -0.282922f, -0.431739f, + 0.692218f, -0.527331f, -0.492704f, + 0.473487f, -0.749262f, -0.463052f, + 0.166654f, -0.429938f, -0.887344f, + 0.339768f, -0.458348f, -0.821264f, + 0.590160f, -0.276240f, -0.758553f, + 0.668115f, -0.103914f, -0.736766f, + 0.590009f, -0.076740f, -0.803741f, + 0.433287f, -0.219357f, -0.874154f, + 0.299036f, -0.368898f, -0.880052f, + 0.027869f, 0.102187f, -0.994375f, + 0.088152f, 0.031815f, -0.995599f, + 0.174456f, 0.096185f, -0.979956f, + 0.188708f, 0.161291f, -0.968697f, + 0.127686f, 0.175774f, -0.976115f, + 0.054509f, 0.130986f, -0.989885f, + 0.015877f, 0.116730f, -0.993037f, + -0.081072f, 0.607187f, -0.790412f, + -0.164116f, 0.522469f, -0.836715f, + -0.319626f, 0.463405f, -0.826495f, + -0.422971f, 0.383450f, -0.821013f, + -0.424534f, 0.353597f, -0.833511f, + -0.351612f, 0.388106f, -0.851905f, + -0.270475f, 0.475063f, -0.837352f, + -0.133739f, 0.917541f, -0.374476f, + -0.316043f, 0.839490f, -0.442011f, + -0.631181f, 0.656649f, -0.412823f, + -0.807405f, 0.443017f, -0.389658f, + -0.821659f, 0.386229f, -0.419171f, + -0.707748f, 0.517393f, -0.481037f, + -0.526814f, 0.693790f, -0.491043f, + -0.461017f, 0.887371f, -0.005987f, + -0.290675f, 0.956710f, -0.014601f, + 0.085518f, 0.995086f, -0.049913f, + 0.887713f, 0.456166f, -0.062285f, + 0.822992f, -0.567263f, 0.029937f, + 0.659878f, -0.743158f, 0.110798f, + -0.391094f, 0.831360f, 0.394824f, + -0.253310f, 0.936825f, 0.241231f, + 0.015366f, 0.995010f, -0.098588f, + 0.520185f, 0.549881f, -0.653482f, + 0.628856f, -0.382376f, -0.677000f, + 0.578948f, -0.646092f, -0.497378f, + -0.223422f, 0.660928f, 0.716420f, + -0.156131f, 0.874986f, 0.458282f, + -0.036467f, 0.998264f, -0.046261f, + 0.156637f, 0.682491f, -0.713913f, + 0.263632f, 0.005571f, -0.964607f, + 0.312409f, -0.324778f, -0.892704f, + -0.001751f, 0.339383f, 0.940647f, + -0.021119f, 0.759902f, 0.649695f, + -0.044404f, 0.998121f, 0.042219f, + -0.032529f, 0.802862f, -0.595277f, + -0.008745f, 0.371564f, -0.928366f, + 0.042529f, 0.077913f, -0.996053f, + 0.280020f, -0.238192f, 0.929975f, + 0.227305f, 0.491486f, 0.840699f, + -0.003105f, 0.987407f, 0.158172f, + -0.143918f, 0.895866f, -0.420370f, + -0.200177f, 0.683872f, -0.701604f, + -0.187188f, 0.500198f, -0.845437f, + 0.453673f, -0.746835f, 0.486229f, + 0.692158f, -0.080062f, 0.717291f, + 0.185758f, 0.942536f, 0.277704f, + -0.211188f, 0.955274f, -0.207004f, + -0.312961f, 0.881061f, -0.354665f, + -0.336331f, 0.811345f, -0.478122f, + 0.482445f, -0.875816f, -0.013906f, + 0.913013f, -0.405572f, -0.043811f, + 0.506909f, 0.853920f, 0.117742f, + -0.234033f, 0.972124f, 0.014295f, + -0.348033f, 0.937468f, 0.005277f, + -0.384064f, 0.921073f, -0.064185f, + 0.457762f, -0.717668f, -0.524792f, + 0.683347f, -0.063014f, -0.727369f, + 0.357361f, 0.898186f, -0.256038f, + -0.207010f, 0.947863f, 0.242287f, + -0.314387f, 0.872357f, 0.374372f, + -0.361040f, 0.872819f, 0.328385f, + 0.280225f, -0.218552f, -0.934724f, + 0.261124f, 0.434074f, -0.862203f, + 0.060553f, 0.978577f, -0.196775f, + -0.131809f, 0.881094f, 0.454203f, + -0.195016f, 0.658858f, 0.726550f, + -0.247824f, 0.630359f, 0.735684f, + 0.008860f, 0.321862f, -0.946745f, + 0.001382f, 0.733189f, -0.680023f, + -0.012720f, 0.997949f, -0.062734f, + -0.011656f, 0.785221f, 0.619106f, + 0.000967f, 0.344022f, 0.938961f, + -0.037360f, 0.214324f, 0.976048f, + -0.213360f, 0.648838f, -0.730401f, + -0.140052f, 0.865891f, -0.480227f, + -0.000809f, 0.999500f, 0.031611f, + 0.194529f, 0.659081f, 0.726478f, + 0.266832f, -0.005234f, 0.963729f, + 0.219380f, -0.217247f, 0.951145f, + -0.384886f, 0.827121f, -0.409553f, + -0.240915f, 0.932642f, -0.268588f, + 0.065830f, 0.996786f, 0.045658f, + 0.597011f, 0.507703f, 0.621141f, + 0.613004f, -0.369418f, 0.698395f, + 0.486873f, -0.566787f, 0.664610f, + 0.000000f, 1.000000f, 0.000000f, + 0.395791f, 0.918207f, 0.015676f, + 0.964544f, 0.263762f, 0.009177f, + 0.839041f, -0.544056f, -0.003654f, + 0.788969f, -0.614430f, 0.001943f, + 0.991025f, -0.133647f, 0.002953f, + 0.732531f, 0.680606f, -0.013206f, + 0.377669f, 0.918491f, 0.117221f, + 0.929557f, 0.263662f, 0.257694f, + 0.811158f, -0.544801f, 0.212638f, + 0.761156f, -0.615195f, 0.205370f, + 0.956515f, -0.133833f, 0.259168f, + 0.710689f, 0.680955f, 0.176694f, + 0.333696f, 0.918791f, 0.210878f, + 0.830713f, 0.263784f, 0.490239f, + 0.727549f, -0.545809f, 0.415650f, + 0.681011f, -0.616288f, 0.395491f, + 0.856413f, -0.134443f, 0.498480f, + 0.640176f, 0.681271f, 0.355027f, + 0.267591f, 0.918878f, 0.289928f, + 0.675416f, 0.263955f, 0.688579f, + 0.594970f, -0.546203f, 0.589638f, + 0.555330f, -0.616730f, 0.557901f, + 0.698694f, -0.134804f, 0.702606f, + 0.526898f, 0.681345f, 0.508082f, + 0.183499f, 0.918711f, 0.349712f, + 0.474031f, 0.264098f, 0.839969f, + 0.422194f, -0.545768f, 0.723802f, + 0.392296f, -0.616276f, 0.682867f, + 0.493598f, -0.134679f, 0.859199f, + 0.378184f, 0.681197f, 0.626856f, + 0.086498f, 0.918378f, 0.386136f, + 0.239605f, 0.264096f, 0.934261f, + 0.219887f, -0.544743f, 0.809262f, + 0.201667f, -0.615183f, 0.762155f, + 0.253529f, -0.134173f, 0.957977f, + 0.202631f, 0.680866f, 0.703820f, + -0.015676f, 0.918207f, 0.395791f, + -0.009177f, 0.263762f, 0.964544f, + 0.003654f, -0.544057f, 0.839041f, + -0.001943f, -0.614430f, 0.788969f, + -0.002953f, -0.133647f, 0.991025f, + 0.013206f, 0.680606f, 0.732531f, + -0.117221f, 0.918491f, 0.377669f, + -0.257694f, 0.263662f, 0.929557f, + -0.212638f, -0.544801f, 0.811158f, + -0.205370f, -0.615195f, 0.761156f, + -0.259168f, -0.133833f, 0.956515f, + -0.176694f, 0.680955f, 0.710689f, + -0.210878f, 0.918791f, 0.333696f, + -0.490239f, 0.263784f, 0.830713f, + -0.415650f, -0.545809f, 0.727549f, + -0.395491f, -0.616288f, 0.681011f, + -0.498480f, -0.134443f, 0.856413f, + -0.355027f, 0.681271f, 0.640176f, + -0.289928f, 0.918878f, 0.267591f, + -0.688579f, 0.263955f, 0.675416f, + -0.589638f, -0.546203f, 0.594970f, + -0.557901f, -0.616730f, 0.555330f, + -0.702606f, -0.134804f, 0.698694f, + -0.508082f, 0.681345f, 0.526898f, + -0.349712f, 0.918711f, 0.183499f, + -0.839969f, 0.264098f, 0.474031f, + -0.723802f, -0.545768f, 0.422194f, + -0.682867f, -0.616276f, 0.392296f, + -0.859199f, -0.134679f, 0.493598f, + -0.626856f, 0.681197f, 0.378184f, + -0.386136f, 0.918378f, 0.086498f, + -0.934261f, 0.264096f, 0.239605f, + -0.809262f, -0.544743f, 0.219887f, + -0.762155f, -0.615183f, 0.201667f, + -0.957977f, -0.134173f, 0.253529f, + -0.703820f, 0.680866f, 0.202631f, + -0.395791f, 0.918207f, -0.015676f, + -0.964544f, 0.263762f, -0.009177f, + -0.839041f, -0.544057f, 0.003654f, + -0.788969f, -0.614430f, -0.001943f, + -0.991025f, -0.133647f, -0.002953f, + -0.732531f, 0.680606f, 0.013206f, + -0.377669f, 0.918491f, -0.117221f, + -0.929557f, 0.263662f, -0.257694f, + -0.811158f, -0.544801f, -0.212638f, + -0.761156f, -0.615195f, -0.205370f, + -0.956515f, -0.133833f, -0.259168f, + -0.710689f, 0.680955f, -0.176694f, + -0.333696f, 0.918791f, -0.210878f, + -0.830713f, 0.263784f, -0.490239f, + -0.727549f, -0.545809f, -0.415650f, + -0.681011f, -0.616288f, -0.395491f, + -0.856413f, -0.134443f, -0.498480f, + -0.640176f, 0.681271f, -0.355027f, + -0.267591f, 0.918878f, -0.289928f, + -0.675416f, 0.263955f, -0.688579f, + -0.594970f, -0.546203f, -0.589638f, + -0.555330f, -0.616730f, -0.557901f, + -0.698694f, -0.134804f, -0.702606f, + -0.526898f, 0.681345f, -0.508082f, + -0.183499f, 0.918711f, -0.349712f, + -0.474031f, 0.264098f, -0.839969f, + -0.422194f, -0.545768f, -0.723802f, + -0.392296f, -0.616276f, -0.682867f, + -0.493598f, -0.134679f, -0.859199f, + -0.378184f, 0.681197f, -0.626856f, + -0.086498f, 0.918378f, -0.386136f, + -0.239605f, 0.264096f, -0.934261f, + -0.219887f, -0.544743f, -0.809262f, + -0.201667f, -0.615183f, -0.762155f, + -0.253529f, -0.134173f, -0.957977f, + -0.202631f, 0.680866f, -0.703820f, + 0.015676f, 0.918207f, -0.395791f, + 0.009177f, 0.263762f, -0.964544f, + -0.003654f, -0.544057f, -0.839041f, + 0.001943f, -0.614430f, -0.788969f, + 0.002953f, -0.133647f, -0.991025f, + -0.013206f, 0.680606f, -0.732531f, + 0.117221f, 0.918491f, -0.377669f, + 0.257694f, 0.263662f, -0.929557f, + 0.212638f, -0.544801f, -0.811158f, + 0.205370f, -0.615195f, -0.761156f, + 0.259168f, -0.133833f, -0.956515f, + 0.176694f, 0.680955f, -0.710689f, + 0.210878f, 0.918791f, -0.333696f, + 0.490239f, 0.263784f, -0.830713f, + 0.415650f, -0.545809f, -0.727549f, + 0.395491f, -0.616288f, -0.681011f, + 0.498480f, -0.134443f, -0.856413f, + 0.355027f, 0.681271f, -0.640176f, + 0.289928f, 0.918878f, -0.267591f, + 0.688579f, 0.263955f, -0.675416f, + 0.589638f, -0.546203f, -0.594970f, + 0.557901f, -0.616730f, -0.555330f, + 0.702606f, -0.134804f, -0.698694f, + 0.508082f, 0.681345f, -0.526898f, + 0.349712f, 0.918711f, -0.183499f, + 0.839969f, 0.264098f, -0.474031f, + 0.723802f, -0.545768f, -0.422194f, + 0.682867f, -0.616276f, -0.392296f, + 0.859199f, -0.134679f, -0.493598f, + 0.626856f, 0.681197f, -0.378184f, + 0.386136f, 0.918378f, -0.086498f, + 0.934261f, 0.264096f, -0.239605f, + 0.809262f, -0.544743f, -0.219887f, + 0.762155f, -0.615183f, -0.201667f, + 0.957977f, -0.134173f, -0.253529f, + 0.703820f, 0.680866f, -0.202631f, + 0.299763f, 0.954005f, -0.004004f, + 0.180158f, 0.983637f, -0.001176f, + 0.158462f, 0.987365f, 0.000232f, + 0.213709f, 0.976895f, 0.002171f, + 0.489301f, 0.872063f, 0.009504f, + 0.686607f, 0.726410f, -0.029990f, + 0.290238f, 0.954117f, 0.073644f, + 0.174086f, 0.983681f, 0.045452f, + 0.152777f, 0.987401f, 0.041212f, + 0.205547f, 0.976963f, 0.057393f, + 0.469598f, 0.872357f, 0.135911f, + 0.670656f, 0.726754f, 0.148493f, + 0.260698f, 0.954280f, 0.146242f, + 0.156021f, 0.983742f, 0.088932f, + 0.136587f, 0.987448f, 0.079312f, + 0.183282f, 0.977046f, 0.108577f, + 0.417739f, 0.872696f, 0.252776f, + 0.608331f, 0.727460f, 0.317389f, + 0.214008f, 0.954348f, 0.208377f, + 0.127716f, 0.983767f, 0.126063f, + 0.111442f, 0.987466f, 0.111767f, + 0.149005f, 0.977076f, 0.152056f, + 0.338347f, 0.872812f, 0.351738f, + 0.505565f, 0.727811f, 0.463351f, + 0.153158f, 0.954293f, 0.256647f, + 0.090962f, 0.983745f, 0.154830f, + 0.078913f, 0.987448f, 0.136822f, + 0.104831f, 0.977040f, 0.185479f, + 0.236319f, 0.872663f, 0.427333f, + 0.369272f, 0.727651f, 0.578067f, + 0.081449f, 0.954136f, 0.288080f, + 0.047744f, 0.983685f, 0.173450f, + 0.040760f, 0.987400f, 0.152903f, + 0.053164f, 0.976955f, 0.206721f, + 0.117360f, 0.872307f, 0.474665f, + 0.207008f, 0.727038f, 0.654648f, + 0.004004f, 0.954005f, 0.299763f, + 0.001176f, 0.983637f, 0.180158f, + -0.000232f, 0.987365f, 0.158462f, + -0.002171f, 0.976895f, 0.213709f, + -0.009504f, 0.872063f, 0.489301f, + 0.029990f, 0.726410f, 0.686607f, + -0.073644f, 0.954117f, 0.290238f, + -0.045452f, 0.983681f, 0.174086f, + -0.041212f, 0.987401f, 0.152777f, + -0.057393f, 0.976963f, 0.205547f, + -0.135911f, 0.872357f, 0.469598f, + -0.148493f, 0.726754f, 0.670656f, + -0.146242f, 0.954280f, 0.260698f, + -0.088932f, 0.983742f, 0.156021f, + -0.079312f, 0.987448f, 0.136587f, + -0.108577f, 0.977046f, 0.183282f, + -0.252776f, 0.872696f, 0.417739f, + -0.317389f, 0.727460f, 0.608331f, + -0.208377f, 0.954348f, 0.214008f, + -0.126063f, 0.983767f, 0.127716f, + -0.111767f, 0.987466f, 0.111442f, + -0.152056f, 0.977076f, 0.149005f, + -0.351738f, 0.872812f, 0.338347f, + -0.463351f, 0.727811f, 0.505565f, + -0.256647f, 0.954293f, 0.153158f, + -0.154830f, 0.983745f, 0.090962f, + -0.136822f, 0.987448f, 0.078913f, + -0.185479f, 0.977040f, 0.104831f, + -0.427333f, 0.872663f, 0.236319f, + -0.578067f, 0.727651f, 0.369272f, + -0.288080f, 0.954136f, 0.081449f, + -0.173450f, 0.983685f, 0.047744f, + -0.152903f, 0.987400f, 0.040760f, + -0.206721f, 0.976955f, 0.053164f, + -0.474665f, 0.872307f, 0.117360f, + -0.654648f, 0.727038f, 0.207008f, + -0.299763f, 0.954005f, 0.004004f, + -0.180158f, 0.983637f, 0.001176f, + -0.158462f, 0.987365f, -0.000232f, + -0.213709f, 0.976895f, -0.002171f, + -0.489301f, 0.872063f, -0.009504f, + -0.686607f, 0.726410f, 0.029990f, + -0.290238f, 0.954117f, -0.073644f, + -0.174086f, 0.983681f, -0.045452f, + -0.152777f, 0.987401f, -0.041212f, + -0.205547f, 0.976963f, -0.057393f, + -0.469598f, 0.872357f, -0.135911f, + -0.670656f, 0.726754f, -0.148493f, + -0.260698f, 0.954280f, -0.146242f, + -0.156021f, 0.983742f, -0.088932f, + -0.136587f, 0.987448f, -0.079312f, + -0.183282f, 0.977046f, -0.108577f, + -0.417739f, 0.872696f, -0.252776f, + -0.608331f, 0.727460f, -0.317389f, + -0.214008f, 0.954348f, -0.208377f, + -0.127716f, 0.983767f, -0.126063f, + -0.111442f, 0.987466f, -0.111767f, + -0.149005f, 0.977076f, -0.152056f, + -0.338347f, 0.872812f, -0.351738f, + -0.505565f, 0.727811f, -0.463351f, + -0.153158f, 0.954293f, -0.256647f, + -0.090962f, 0.983745f, -0.154830f, + -0.078913f, 0.987448f, -0.136822f, + -0.104831f, 0.977040f, -0.185479f, + -0.236319f, 0.872663f, -0.427333f, + -0.369272f, 0.727651f, -0.578067f, + -0.081449f, 0.954136f, -0.288080f, + -0.047744f, 0.983685f, -0.173450f, + -0.040760f, 0.987400f, -0.152903f, + -0.053164f, 0.976955f, -0.206721f, + -0.117360f, 0.872307f, -0.474665f, + -0.207008f, 0.727038f, -0.654648f, + -0.004004f, 0.954005f, -0.299763f, + -0.001176f, 0.983637f, -0.180158f, + 0.000232f, 0.987365f, -0.158462f, + 0.002171f, 0.976895f, -0.213709f, + 0.009504f, 0.872063f, -0.489301f, + -0.029990f, 0.726410f, -0.686607f, + 0.073644f, 0.954117f, -0.290238f, + 0.045452f, 0.983681f, -0.174086f, + 0.041212f, 0.987401f, -0.152777f, + 0.057393f, 0.976963f, -0.205547f, + 0.135911f, 0.872357f, -0.469598f, + 0.148493f, 0.726754f, -0.670656f, + 0.146242f, 0.954280f, -0.260698f, + 0.088932f, 0.983742f, -0.156021f, + 0.079312f, 0.987448f, -0.136587f, + 0.108577f, 0.977046f, -0.183282f, + 0.252776f, 0.872696f, -0.417739f, + 0.317389f, 0.727460f, -0.608331f, + 0.208377f, 0.954348f, -0.214008f, + 0.126063f, 0.983767f, -0.127716f, + 0.111767f, 0.987466f, -0.111442f, + 0.152056f, 0.977076f, -0.149005f, + 0.351738f, 0.872812f, -0.338347f, + 0.463351f, 0.727811f, -0.505565f, + 0.256647f, 0.954293f, -0.153158f, + 0.154830f, 0.983745f, -0.090962f, + 0.136822f, 0.987448f, -0.078913f, + 0.185479f, 0.977040f, -0.104831f, + 0.427333f, 0.872663f, -0.236319f, + 0.578067f, 0.727651f, -0.369272f, + 0.288080f, 0.954136f, -0.081449f, + 0.173450f, 0.983685f, -0.047744f, + 0.152903f, 0.987400f, -0.040760f, + 0.206721f, 0.976955f, -0.053164f, + 0.474665f, 0.872307f, -0.117360f, + 0.654648f, 0.727038f, -0.207008f, +}; +static D3DXVECTOR3* teapotNormals = ( D3DXVECTOR3* )teapotNormalsfloats; + +static WORD teapotIndices[NUMTEAPOTINDICES] = +{ + 0, 7, 8, + 8, 1, 0, + 1, 8, 9, + 9, 2, 1, + 2, 9, 10, + 10, 3, 2, + 3, 10, 11, + 11, 4, 3, + 4, 11, 12, + 12, 5, 4, + 5, 12, 13, + 13, 6, 5, + 7, 14, 15, + 15, 8, 7, + 8, 15, 16, + 16, 9, 8, + 9, 16, 17, + 17, 10, 9, + 10, 17, 18, + 18, 11, 10, + 11, 18, 19, + 19, 12, 11, + 12, 19, 20, + 20, 13, 12, + 14, 21, 22, + 22, 15, 14, + 15, 22, 23, + 23, 16, 15, + 16, 23, 24, + 24, 17, 16, + 17, 24, 25, + 25, 18, 17, + 18, 25, 26, + 26, 19, 18, + 19, 26, 27, + 27, 20, 19, + 21, 28, 29, + 29, 22, 21, + 22, 29, 30, + 30, 23, 22, + 23, 30, 31, + 31, 24, 23, + 24, 31, 32, + 32, 25, 24, + 25, 32, 33, + 33, 26, 25, + 26, 33, 34, + 34, 27, 26, + 28, 35, 36, + 36, 29, 28, + 29, 36, 37, + 37, 30, 29, + 30, 37, 38, + 38, 31, 30, + 31, 38, 39, + 39, 32, 31, + 32, 39, 40, + 40, 33, 32, + 33, 40, 41, + 41, 34, 33, + 35, 42, 43, + 43, 36, 35, + 36, 43, 44, + 44, 37, 36, + 37, 44, 45, + 45, 38, 37, + 38, 45, 46, + 46, 39, 38, + 39, 46, 47, + 47, 40, 39, + 40, 47, 48, + 48, 41, 40, + 42, 49, 50, + 50, 43, 42, + 43, 50, 51, + 51, 44, 43, + 44, 51, 52, + 52, 45, 44, + 45, 52, 53, + 53, 46, 45, + 46, 53, 54, + 54, 47, 46, + 47, 54, 55, + 55, 48, 47, + 49, 56, 57, + 57, 50, 49, + 50, 57, 58, + 58, 51, 50, + 51, 58, 59, + 59, 52, 51, + 52, 59, 60, + 60, 53, 52, + 53, 60, 61, + 61, 54, 53, + 54, 61, 62, + 62, 55, 54, + 56, 63, 64, + 64, 57, 56, + 57, 64, 65, + 65, 58, 57, + 58, 65, 66, + 66, 59, 58, + 59, 66, 67, + 67, 60, 59, + 60, 67, 68, + 68, 61, 60, + 61, 68, 69, + 69, 62, 61, + 63, 70, 71, + 71, 64, 63, + 64, 71, 72, + 72, 65, 64, + 65, 72, 73, + 73, 66, 65, + 66, 73, 74, + 74, 67, 66, + 67, 74, 75, + 75, 68, 67, + 68, 75, 76, + 76, 69, 68, + 70, 77, 78, + 78, 71, 70, + 71, 78, 79, + 79, 72, 71, + 72, 79, 80, + 80, 73, 72, + 73, 80, 81, + 81, 74, 73, + 74, 81, 82, + 82, 75, 74, + 75, 82, 83, + 83, 76, 75, + 77, 84, 85, + 85, 78, 77, + 78, 85, 86, + 86, 79, 78, + 79, 86, 87, + 87, 80, 79, + 80, 87, 88, + 88, 81, 80, + 81, 88, 89, + 89, 82, 81, + 82, 89, 90, + 90, 83, 82, + 84, 91, 92, + 92, 85, 84, + 85, 92, 93, + 93, 86, 85, + 86, 93, 94, + 94, 87, 86, + 87, 94, 95, + 95, 88, 87, + 88, 95, 96, + 96, 89, 88, + 89, 96, 97, + 97, 90, 89, + 91, 98, 99, + 99, 92, 91, + 92, 99, 100, + 100, 93, 92, + 93, 100, 101, + 101, 94, 93, + 94, 101, 102, + 102, 95, 94, + 95, 102, 103, + 103, 96, 95, + 96, 103, 104, + 104, 97, 96, + 98, 105, 106, + 106, 99, 98, + 99, 106, 107, + 107, 100, 99, + 100, 107, 108, + 108, 101, 100, + 101, 108, 109, + 109, 102, 101, + 102, 109, 110, + 110, 103, 102, + 103, 110, 111, + 111, 104, 103, + 105, 112, 113, + 113, 106, 105, + 106, 113, 114, + 114, 107, 106, + 107, 114, 115, + 115, 108, 107, + 108, 115, 116, + 116, 109, 108, + 109, 116, 117, + 117, 110, 109, + 110, 117, 118, + 118, 111, 110, + 112, 119, 120, + 120, 113, 112, + 113, 120, 121, + 121, 114, 113, + 114, 121, 122, + 122, 115, 114, + 115, 122, 123, + 123, 116, 115, + 116, 123, 124, + 124, 117, 116, + 117, 124, 125, + 125, 118, 117, + 119, 126, 127, + 127, 120, 119, + 120, 127, 128, + 128, 121, 120, + 121, 128, 129, + 129, 122, 121, + 122, 129, 130, + 130, 123, 122, + 123, 130, 131, + 131, 124, 123, + 124, 131, 132, + 132, 125, 124, + 126, 133, 134, + 134, 127, 126, + 127, 134, 135, + 135, 128, 127, + 128, 135, 136, + 136, 129, 128, + 129, 136, 137, + 137, 130, 129, + 130, 137, 138, + 138, 131, 130, + 131, 138, 139, + 139, 132, 131, + 133, 140, 141, + 141, 134, 133, + 134, 141, 142, + 142, 135, 134, + 135, 142, 143, + 143, 136, 135, + 136, 143, 144, + 144, 137, 136, + 137, 144, 145, + 145, 138, 137, + 138, 145, 146, + 146, 139, 138, + 140, 147, 148, + 148, 141, 140, + 141, 148, 149, + 149, 142, 141, + 142, 149, 150, + 150, 143, 142, + 143, 150, 151, + 151, 144, 143, + 144, 151, 152, + 152, 145, 144, + 145, 152, 153, + 153, 146, 145, + 147, 154, 155, + 155, 148, 147, + 148, 155, 156, + 156, 149, 148, + 149, 156, 157, + 157, 150, 149, + 150, 157, 158, + 158, 151, 150, + 151, 158, 159, + 159, 152, 151, + 152, 159, 160, + 160, 153, 152, + 154, 161, 162, + 162, 155, 154, + 155, 162, 163, + 163, 156, 155, + 156, 163, 164, + 164, 157, 156, + 157, 164, 165, + 165, 158, 157, + 158, 165, 166, + 166, 159, 158, + 159, 166, 167, + 167, 160, 159, + 161, 0, 1, + 1, 162, 161, + 162, 1, 2, + 2, 163, 162, + 163, 2, 3, + 3, 164, 163, + 164, 3, 4, + 4, 165, 164, + 165, 4, 5, + 5, 166, 165, + 166, 5, 6, + 6, 167, 166, + 6, 13, 174, + 174, 168, 6, + 168, 174, 175, + 175, 169, 168, + 169, 175, 176, + 176, 170, 169, + 170, 176, 177, + 177, 171, 170, + 171, 177, 178, + 178, 172, 171, + 172, 178, 179, + 179, 173, 172, + 13, 20, 180, + 180, 174, 13, + 174, 180, 181, + 181, 175, 174, + 175, 181, 182, + 182, 176, 175, + 176, 182, 183, + 183, 177, 176, + 177, 183, 184, + 184, 178, 177, + 178, 184, 185, + 185, 179, 178, + 20, 27, 186, + 186, 180, 20, + 180, 186, 187, + 187, 181, 180, + 181, 187, 188, + 188, 182, 181, + 182, 188, 189, + 189, 183, 182, + 183, 189, 190, + 190, 184, 183, + 184, 190, 191, + 191, 185, 184, + 27, 34, 192, + 192, 186, 27, + 186, 192, 193, + 193, 187, 186, + 187, 193, 194, + 194, 188, 187, + 188, 194, 195, + 195, 189, 188, + 189, 195, 196, + 196, 190, 189, + 190, 196, 197, + 197, 191, 190, + 34, 41, 198, + 198, 192, 34, + 192, 198, 199, + 199, 193, 192, + 193, 199, 200, + 200, 194, 193, + 194, 200, 201, + 201, 195, 194, + 195, 201, 202, + 202, 196, 195, + 196, 202, 203, + 203, 197, 196, + 41, 48, 204, + 204, 198, 41, + 198, 204, 205, + 205, 199, 198, + 199, 205, 206, + 206, 200, 199, + 200, 206, 207, + 207, 201, 200, + 201, 207, 208, + 208, 202, 201, + 202, 208, 209, + 209, 203, 202, + 48, 55, 210, + 210, 204, 48, + 204, 210, 211, + 211, 205, 204, + 205, 211, 212, + 212, 206, 205, + 206, 212, 213, + 213, 207, 206, + 207, 213, 214, + 214, 208, 207, + 208, 214, 215, + 215, 209, 208, + 55, 62, 216, + 216, 210, 55, + 210, 216, 217, + 217, 211, 210, + 211, 217, 218, + 218, 212, 211, + 212, 218, 219, + 219, 213, 212, + 213, 219, 220, + 220, 214, 213, + 214, 220, 221, + 221, 215, 214, + 62, 69, 222, + 222, 216, 62, + 216, 222, 223, + 223, 217, 216, + 217, 223, 224, + 224, 218, 217, + 218, 224, 225, + 225, 219, 218, + 219, 225, 226, + 226, 220, 219, + 220, 226, 227, + 227, 221, 220, + 69, 76, 228, + 228, 222, 69, + 222, 228, 229, + 229, 223, 222, + 223, 229, 230, + 230, 224, 223, + 224, 230, 231, + 231, 225, 224, + 225, 231, 232, + 232, 226, 225, + 226, 232, 233, + 233, 227, 226, + 76, 83, 234, + 234, 228, 76, + 228, 234, 235, + 235, 229, 228, + 229, 235, 236, + 236, 230, 229, + 230, 236, 237, + 237, 231, 230, + 231, 237, 238, + 238, 232, 231, + 232, 238, 239, + 239, 233, 232, + 83, 90, 240, + 240, 234, 83, + 234, 240, 241, + 241, 235, 234, + 235, 241, 242, + 242, 236, 235, + 236, 242, 243, + 243, 237, 236, + 237, 243, 244, + 244, 238, 237, + 238, 244, 245, + 245, 239, 238, + 90, 97, 246, + 246, 240, 90, + 240, 246, 247, + 247, 241, 240, + 241, 247, 248, + 248, 242, 241, + 242, 248, 249, + 249, 243, 242, + 243, 249, 250, + 250, 244, 243, + 244, 250, 251, + 251, 245, 244, + 97, 104, 252, + 252, 246, 97, + 246, 252, 253, + 253, 247, 246, + 247, 253, 254, + 254, 248, 247, + 248, 254, 255, + 255, 249, 248, + 249, 255, 256, + 256, 250, 249, + 250, 256, 257, + 257, 251, 250, + 104, 111, 258, + 258, 252, 104, + 252, 258, 259, + 259, 253, 252, + 253, 259, 260, + 260, 254, 253, + 254, 260, 261, + 261, 255, 254, + 255, 261, 262, + 262, 256, 255, + 256, 262, 263, + 263, 257, 256, + 111, 118, 264, + 264, 258, 111, + 258, 264, 265, + 265, 259, 258, + 259, 265, 266, + 266, 260, 259, + 260, 266, 267, + 267, 261, 260, + 261, 267, 268, + 268, 262, 261, + 262, 268, 269, + 269, 263, 262, + 118, 125, 270, + 270, 264, 118, + 264, 270, 271, + 271, 265, 264, + 265, 271, 272, + 272, 266, 265, + 266, 272, 273, + 273, 267, 266, + 267, 273, 274, + 274, 268, 267, + 268, 274, 275, + 275, 269, 268, + 125, 132, 276, + 276, 270, 125, + 270, 276, 277, + 277, 271, 270, + 271, 277, 278, + 278, 272, 271, + 272, 278, 279, + 279, 273, 272, + 273, 279, 280, + 280, 274, 273, + 274, 280, 281, + 281, 275, 274, + 132, 139, 282, + 282, 276, 132, + 276, 282, 283, + 283, 277, 276, + 277, 283, 284, + 284, 278, 277, + 278, 284, 285, + 285, 279, 278, + 279, 285, 286, + 286, 280, 279, + 280, 286, 287, + 287, 281, 280, + 139, 146, 288, + 288, 282, 139, + 282, 288, 289, + 289, 283, 282, + 283, 289, 290, + 290, 284, 283, + 284, 290, 291, + 291, 285, 284, + 285, 291, 292, + 292, 286, 285, + 286, 292, 293, + 293, 287, 286, + 146, 153, 294, + 294, 288, 146, + 288, 294, 295, + 295, 289, 288, + 289, 295, 296, + 296, 290, 289, + 290, 296, 297, + 297, 291, 290, + 291, 297, 298, + 298, 292, 291, + 292, 298, 299, + 299, 293, 292, + 153, 160, 300, + 300, 294, 153, + 294, 300, 301, + 301, 295, 294, + 295, 301, 302, + 302, 296, 295, + 296, 302, 303, + 303, 297, 296, + 297, 303, 304, + 304, 298, 297, + 298, 304, 305, + 305, 299, 298, + 160, 167, 306, + 306, 300, 160, + 300, 306, 307, + 307, 301, 300, + 301, 307, 308, + 308, 302, 301, + 302, 308, 309, + 309, 303, 302, + 303, 309, 310, + 310, 304, 303, + 304, 310, 311, + 311, 305, 304, + 167, 6, 168, + 168, 306, 167, + 306, 168, 169, + 169, 307, 306, + 307, 169, 170, + 170, 308, 307, + 308, 170, 171, + 171, 309, 308, + 309, 171, 172, + 172, 310, 309, + 310, 172, 173, + 173, 311, 310, + 173, 179, 318, + 318, 312, 173, + 312, 318, 319, + 319, 313, 312, + 313, 319, 320, + 320, 314, 313, + 314, 320, 321, + 321, 315, 314, + 315, 321, 322, + 322, 316, 315, + 316, 322, 323, + 323, 317, 316, + 179, 185, 324, + 324, 318, 179, + 318, 324, 325, + 325, 319, 318, + 319, 325, 326, + 326, 320, 319, + 320, 326, 327, + 327, 321, 320, + 321, 327, 328, + 328, 322, 321, + 322, 328, 329, + 329, 323, 322, + 185, 191, 330, + 330, 324, 185, + 324, 330, 331, + 331, 325, 324, + 325, 331, 332, + 332, 326, 325, + 326, 332, 333, + 333, 327, 326, + 327, 333, 334, + 334, 328, 327, + 328, 334, 335, + 335, 329, 328, + 191, 197, 336, + 336, 330, 191, + 330, 336, 337, + 337, 331, 330, + 331, 337, 338, + 338, 332, 331, + 332, 338, 339, + 339, 333, 332, + 333, 339, 340, + 340, 334, 333, + 334, 340, 341, + 341, 335, 334, + 197, 203, 342, + 342, 336, 197, + 336, 342, 343, + 343, 337, 336, + 337, 343, 344, + 344, 338, 337, + 338, 344, 345, + 345, 339, 338, + 339, 345, 346, + 346, 340, 339, + 340, 346, 347, + 347, 341, 340, + 203, 209, 348, + 348, 342, 203, + 342, 348, 349, + 349, 343, 342, + 343, 349, 350, + 350, 344, 343, + 344, 350, 351, + 351, 345, 344, + 345, 351, 352, + 352, 346, 345, + 346, 352, 353, + 353, 347, 346, + 209, 215, 354, + 354, 348, 209, + 348, 354, 355, + 355, 349, 348, + 349, 355, 356, + 356, 350, 349, + 350, 356, 357, + 357, 351, 350, + 351, 357, 358, + 358, 352, 351, + 352, 358, 359, + 359, 353, 352, + 215, 221, 360, + 360, 354, 215, + 354, 360, 361, + 361, 355, 354, + 355, 361, 362, + 362, 356, 355, + 356, 362, 363, + 363, 357, 356, + 357, 363, 364, + 364, 358, 357, + 358, 364, 365, + 365, 359, 358, + 221, 227, 366, + 366, 360, 221, + 360, 366, 367, + 367, 361, 360, + 361, 367, 368, + 368, 362, 361, + 362, 368, 369, + 369, 363, 362, + 363, 369, 370, + 370, 364, 363, + 364, 370, 371, + 371, 365, 364, + 227, 233, 372, + 372, 366, 227, + 366, 372, 373, + 373, 367, 366, + 367, 373, 374, + 374, 368, 367, + 368, 374, 375, + 375, 369, 368, + 369, 375, 376, + 376, 370, 369, + 370, 376, 377, + 377, 371, 370, + 233, 239, 378, + 378, 372, 233, + 372, 378, 379, + 379, 373, 372, + 373, 379, 380, + 380, 374, 373, + 374, 380, 381, + 381, 375, 374, + 375, 381, 382, + 382, 376, 375, + 376, 382, 383, + 383, 377, 376, + 239, 245, 384, + 384, 378, 239, + 378, 384, 385, + 385, 379, 378, + 379, 385, 386, + 386, 380, 379, + 380, 386, 387, + 387, 381, 380, + 381, 387, 388, + 388, 382, 381, + 382, 388, 389, + 389, 383, 382, + 245, 251, 390, + 390, 384, 245, + 384, 390, 391, + 391, 385, 384, + 385, 391, 392, + 392, 386, 385, + 386, 392, 393, + 393, 387, 386, + 387, 393, 394, + 394, 388, 387, + 388, 394, 395, + 395, 389, 388, + 251, 257, 396, + 396, 390, 251, + 390, 396, 397, + 397, 391, 390, + 391, 397, 398, + 398, 392, 391, + 392, 398, 399, + 399, 393, 392, + 393, 399, 400, + 400, 394, 393, + 394, 400, 401, + 401, 395, 394, + 257, 263, 402, + 402, 396, 257, + 396, 402, 403, + 403, 397, 396, + 397, 403, 404, + 404, 398, 397, + 398, 404, 405, + 405, 399, 398, + 399, 405, 406, + 406, 400, 399, + 400, 406, 407, + 407, 401, 400, + 263, 269, 408, + 408, 402, 263, + 402, 408, 409, + 409, 403, 402, + 403, 409, 410, + 410, 404, 403, + 404, 410, 411, + 411, 405, 404, + 405, 411, 412, + 412, 406, 405, + 406, 412, 413, + 413, 407, 406, + 269, 275, 414, + 414, 408, 269, + 408, 414, 415, + 415, 409, 408, + 409, 415, 416, + 416, 410, 409, + 410, 416, 417, + 417, 411, 410, + 411, 417, 418, + 418, 412, 411, + 412, 418, 419, + 419, 413, 412, + 275, 281, 420, + 420, 414, 275, + 414, 420, 421, + 421, 415, 414, + 415, 421, 422, + 422, 416, 415, + 416, 422, 423, + 423, 417, 416, + 417, 423, 424, + 424, 418, 417, + 418, 424, 425, + 425, 419, 418, + 281, 287, 426, + 426, 420, 281, + 420, 426, 427, + 427, 421, 420, + 421, 427, 428, + 428, 422, 421, + 422, 428, 429, + 429, 423, 422, + 423, 429, 430, + 430, 424, 423, + 424, 430, 431, + 431, 425, 424, + 287, 293, 432, + 432, 426, 287, + 426, 432, 433, + 433, 427, 426, + 427, 433, 434, + 434, 428, 427, + 428, 434, 435, + 435, 429, 428, + 429, 435, 436, + 436, 430, 429, + 430, 436, 437, + 437, 431, 430, + 293, 299, 438, + 438, 432, 293, + 432, 438, 439, + 439, 433, 432, + 433, 439, 440, + 440, 434, 433, + 434, 440, 441, + 441, 435, 434, + 435, 441, 442, + 442, 436, 435, + 436, 442, 443, + 443, 437, 436, + 299, 305, 444, + 444, 438, 299, + 438, 444, 445, + 445, 439, 438, + 439, 445, 446, + 446, 440, 439, + 440, 446, 447, + 447, 441, 440, + 441, 447, 448, + 448, 442, 441, + 442, 448, 449, + 449, 443, 442, + 305, 311, 450, + 450, 444, 305, + 444, 450, 451, + 451, 445, 444, + 445, 451, 452, + 452, 446, 445, + 446, 452, 453, + 453, 447, 446, + 447, 453, 454, + 454, 448, 447, + 448, 454, 455, + 455, 449, 448, + 311, 173, 312, + 312, 450, 311, + 450, 312, 313, + 313, 451, 450, + 451, 313, 314, + 314, 452, 451, + 452, 314, 315, + 315, 453, 452, + 453, 315, 316, + 316, 454, 453, + 454, 316, 317, + 317, 455, 454, + 317, 323, 462, + 462, 456, 317, + 456, 462, 463, + 463, 457, 456, + 457, 463, 464, + 464, 458, 457, + 458, 464, 465, + 465, 459, 458, + 459, 465, 466, + 466, 460, 459, + 460, 466, 461, + 323, 329, 467, + 467, 462, 323, + 462, 467, 468, + 468, 463, 462, + 463, 468, 469, + 469, 464, 463, + 464, 469, 470, + 470, 465, 464, + 465, 470, 471, + 471, 466, 465, + 466, 471, 461, + 329, 335, 472, + 472, 467, 329, + 467, 472, 473, + 473, 468, 467, + 468, 473, 474, + 474, 469, 468, + 469, 474, 475, + 475, 470, 469, + 470, 475, 476, + 476, 471, 470, + 471, 476, 461, + 335, 341, 477, + 477, 472, 335, + 472, 477, 478, + 478, 473, 472, + 473, 478, 479, + 479, 474, 473, + 474, 479, 480, + 480, 475, 474, + 475, 480, 481, + 481, 476, 475, + 476, 481, 461, + 341, 347, 482, + 482, 477, 341, + 477, 482, 483, + 483, 478, 477, + 478, 483, 484, + 484, 479, 478, + 479, 484, 485, + 485, 480, 479, + 480, 485, 486, + 486, 481, 480, + 481, 486, 461, + 347, 353, 487, + 487, 482, 347, + 482, 487, 488, + 488, 483, 482, + 483, 488, 489, + 489, 484, 483, + 484, 489, 490, + 490, 485, 484, + 485, 490, 491, + 491, 486, 485, + 486, 491, 461, + 353, 359, 492, + 492, 487, 353, + 487, 492, 493, + 493, 488, 487, + 488, 493, 494, + 494, 489, 488, + 489, 494, 495, + 495, 490, 489, + 490, 495, 496, + 496, 491, 490, + 491, 496, 461, + 359, 365, 497, + 497, 492, 359, + 492, 497, 498, + 498, 493, 492, + 493, 498, 499, + 499, 494, 493, + 494, 499, 500, + 500, 495, 494, + 495, 500, 501, + 501, 496, 495, + 496, 501, 461, + 365, 371, 502, + 502, 497, 365, + 497, 502, 503, + 503, 498, 497, + 498, 503, 504, + 504, 499, 498, + 499, 504, 505, + 505, 500, 499, + 500, 505, 506, + 506, 501, 500, + 501, 506, 461, + 371, 377, 507, + 507, 502, 371, + 502, 507, 508, + 508, 503, 502, + 503, 508, 509, + 509, 504, 503, + 504, 509, 510, + 510, 505, 504, + 505, 510, 511, + 511, 506, 505, + 506, 511, 461, + 377, 383, 512, + 512, 507, 377, + 507, 512, 513, + 513, 508, 507, + 508, 513, 514, + 514, 509, 508, + 509, 514, 515, + 515, 510, 509, + 510, 515, 516, + 516, 511, 510, + 511, 516, 461, + 383, 389, 517, + 517, 512, 383, + 512, 517, 518, + 518, 513, 512, + 513, 518, 519, + 519, 514, 513, + 514, 519, 520, + 520, 515, 514, + 515, 520, 521, + 521, 516, 515, + 516, 521, 461, + 389, 395, 522, + 522, 517, 389, + 517, 522, 523, + 523, 518, 517, + 518, 523, 524, + 524, 519, 518, + 519, 524, 525, + 525, 520, 519, + 520, 525, 526, + 526, 521, 520, + 521, 526, 461, + 395, 401, 527, + 527, 522, 395, + 522, 527, 528, + 528, 523, 522, + 523, 528, 529, + 529, 524, 523, + 524, 529, 530, + 530, 525, 524, + 525, 530, 531, + 531, 526, 525, + 526, 531, 461, + 401, 407, 532, + 532, 527, 401, + 527, 532, 533, + 533, 528, 527, + 528, 533, 534, + 534, 529, 528, + 529, 534, 535, + 535, 530, 529, + 530, 535, 536, + 536, 531, 530, + 531, 536, 461, + 407, 413, 537, + 537, 532, 407, + 532, 537, 538, + 538, 533, 532, + 533, 538, 539, + 539, 534, 533, + 534, 539, 540, + 540, 535, 534, + 535, 540, 541, + 541, 536, 535, + 536, 541, 461, + 413, 419, 542, + 542, 537, 413, + 537, 542, 543, + 543, 538, 537, + 538, 543, 544, + 544, 539, 538, + 539, 544, 545, + 545, 540, 539, + 540, 545, 546, + 546, 541, 540, + 541, 546, 461, + 419, 425, 547, + 547, 542, 419, + 542, 547, 548, + 548, 543, 542, + 543, 548, 549, + 549, 544, 543, + 544, 549, 550, + 550, 545, 544, + 545, 550, 551, + 551, 546, 545, + 546, 551, 461, + 425, 431, 552, + 552, 547, 425, + 547, 552, 553, + 553, 548, 547, + 548, 553, 554, + 554, 549, 548, + 549, 554, 555, + 555, 550, 549, + 550, 555, 556, + 556, 551, 550, + 551, 556, 461, + 431, 437, 557, + 557, 552, 431, + 552, 557, 558, + 558, 553, 552, + 553, 558, 559, + 559, 554, 553, + 554, 559, 560, + 560, 555, 554, + 555, 560, 561, + 561, 556, 555, + 556, 561, 461, + 437, 443, 562, + 562, 557, 437, + 557, 562, 563, + 563, 558, 557, + 558, 563, 564, + 564, 559, 558, + 559, 564, 565, + 565, 560, 559, + 560, 565, 566, + 566, 561, 560, + 561, 566, 461, + 443, 449, 567, + 567, 562, 443, + 562, 567, 568, + 568, 563, 562, + 563, 568, 569, + 569, 564, 563, + 564, 569, 570, + 570, 565, 564, + 565, 570, 571, + 571, 566, 565, + 566, 571, 461, + 449, 455, 572, + 572, 567, 449, + 567, 572, 573, + 573, 568, 567, + 568, 573, 574, + 574, 569, 568, + 569, 574, 575, + 575, 570, 569, + 570, 575, 576, + 576, 571, 570, + 571, 576, 461, + 455, 317, 456, + 456, 572, 455, + 572, 456, 457, + 457, 573, 572, + 573, 457, 458, + 458, 574, 573, + 574, 458, 459, + 459, 575, 574, + 575, 459, 460, + 460, 576, 575, + 576, 460, 461, + 577, 584, 585, + 585, 578, 577, + 578, 585, 586, + 586, 579, 578, + 579, 586, 587, + 587, 580, 579, + 580, 587, 588, + 588, 581, 580, + 581, 588, 589, + 589, 582, 581, + 582, 589, 590, + 590, 583, 582, + 584, 591, 592, + 592, 585, 584, + 585, 592, 593, + 593, 586, 585, + 586, 593, 594, + 594, 587, 586, + 587, 594, 595, + 595, 588, 587, + 588, 595, 596, + 596, 589, 588, + 589, 596, 597, + 597, 590, 589, + 591, 598, 599, + 599, 592, 591, + 592, 599, 600, + 600, 593, 592, + 593, 600, 601, + 601, 594, 593, + 594, 601, 602, + 602, 595, 594, + 595, 602, 603, + 603, 596, 595, + 596, 603, 604, + 604, 597, 596, + 598, 605, 606, + 606, 599, 598, + 599, 606, 607, + 607, 600, 599, + 600, 607, 608, + 608, 601, 600, + 601, 608, 609, + 609, 602, 601, + 602, 609, 610, + 610, 603, 602, + 603, 610, 611, + 611, 604, 603, + 605, 612, 613, + 613, 606, 605, + 606, 613, 614, + 614, 607, 606, + 607, 614, 615, + 615, 608, 607, + 608, 615, 616, + 616, 609, 608, + 609, 616, 617, + 617, 610, 609, + 610, 617, 618, + 618, 611, 610, + 612, 619, 620, + 620, 613, 612, + 613, 620, 621, + 621, 614, 613, + 614, 621, 622, + 622, 615, 614, + 615, 622, 623, + 623, 616, 615, + 616, 623, 624, + 624, 617, 616, + 617, 624, 625, + 625, 618, 617, + 619, 626, 627, + 627, 620, 619, + 620, 627, 628, + 628, 621, 620, + 621, 628, 629, + 629, 622, 621, + 622, 629, 630, + 630, 623, 622, + 623, 630, 631, + 631, 624, 623, + 624, 631, 632, + 632, 625, 624, + 626, 633, 634, + 634, 627, 626, + 627, 634, 635, + 635, 628, 627, + 628, 635, 636, + 636, 629, 628, + 629, 636, 637, + 637, 630, 629, + 630, 637, 638, + 638, 631, 630, + 631, 638, 639, + 639, 632, 631, + 633, 640, 641, + 641, 634, 633, + 634, 641, 642, + 642, 635, 634, + 635, 642, 643, + 643, 636, 635, + 636, 643, 644, + 644, 637, 636, + 637, 644, 645, + 645, 638, 637, + 638, 645, 646, + 646, 639, 638, + 640, 647, 648, + 648, 641, 640, + 641, 648, 649, + 649, 642, 641, + 642, 649, 650, + 650, 643, 642, + 643, 650, 651, + 651, 644, 643, + 644, 651, 652, + 652, 645, 644, + 645, 652, 653, + 653, 646, 645, + 647, 654, 655, + 655, 648, 647, + 648, 655, 656, + 656, 649, 648, + 649, 656, 657, + 657, 650, 649, + 650, 657, 658, + 658, 651, 650, + 651, 658, 659, + 659, 652, 651, + 652, 659, 660, + 660, 653, 652, + 654, 577, 578, + 578, 655, 654, + 655, 578, 579, + 579, 656, 655, + 656, 579, 580, + 580, 657, 656, + 657, 580, 581, + 581, 658, 657, + 658, 581, 582, + 582, 659, 658, + 659, 582, 583, + 583, 660, 659, + 583, 590, 667, + 667, 661, 583, + 661, 667, 668, + 668, 662, 661, + 662, 668, 669, + 669, 663, 662, + 663, 669, 670, + 670, 664, 663, + 664, 670, 671, + 671, 665, 664, + 665, 671, 672, + 672, 666, 665, + 590, 597, 673, + 673, 667, 590, + 667, 673, 674, + 674, 668, 667, + 668, 674, 675, + 675, 669, 668, + 669, 675, 676, + 676, 670, 669, + 670, 676, 677, + 677, 671, 670, + 671, 677, 678, + 678, 672, 671, + 597, 604, 679, + 679, 673, 597, + 673, 679, 680, + 680, 674, 673, + 674, 680, 681, + 681, 675, 674, + 675, 681, 682, + 682, 676, 675, + 676, 682, 683, + 683, 677, 676, + 677, 683, 684, + 684, 678, 677, + 604, 611, 685, + 685, 679, 604, + 679, 685, 686, + 686, 680, 679, + 680, 686, 687, + 687, 681, 680, + 681, 687, 688, + 688, 682, 681, + 682, 688, 689, + 689, 683, 682, + 683, 689, 690, + 690, 684, 683, + 611, 618, 691, + 691, 685, 611, + 685, 691, 692, + 692, 686, 685, + 686, 692, 693, + 693, 687, 686, + 687, 693, 694, + 694, 688, 687, + 688, 694, 695, + 695, 689, 688, + 689, 695, 696, + 696, 690, 689, + 618, 625, 697, + 697, 691, 618, + 691, 697, 698, + 698, 692, 691, + 692, 698, 699, + 699, 693, 692, + 693, 699, 700, + 700, 694, 693, + 694, 700, 701, + 701, 695, 694, + 695, 701, 702, + 702, 696, 695, + 625, 632, 703, + 703, 697, 625, + 697, 703, 704, + 704, 698, 697, + 698, 704, 705, + 705, 699, 698, + 699, 705, 706, + 706, 700, 699, + 700, 706, 707, + 707, 701, 700, + 701, 707, 708, + 708, 702, 701, + 632, 639, 709, + 709, 703, 632, + 703, 709, 710, + 710, 704, 703, + 704, 710, 711, + 711, 705, 704, + 705, 711, 712, + 712, 706, 705, + 706, 712, 713, + 713, 707, 706, + 707, 713, 714, + 714, 708, 707, + 639, 646, 715, + 715, 709, 639, + 709, 715, 716, + 716, 710, 709, + 710, 716, 717, + 717, 711, 710, + 711, 717, 718, + 718, 712, 711, + 712, 718, 719, + 719, 713, 712, + 713, 719, 720, + 720, 714, 713, + 646, 653, 721, + 721, 715, 646, + 715, 721, 722, + 722, 716, 715, + 716, 722, 723, + 723, 717, 716, + 717, 723, 724, + 724, 718, 717, + 718, 724, 725, + 725, 719, 718, + 719, 725, 726, + 726, 720, 719, + 653, 660, 727, + 727, 721, 653, + 721, 727, 728, + 728, 722, 721, + 722, 728, 729, + 729, 723, 722, + 723, 729, 730, + 730, 724, 723, + 724, 730, 731, + 731, 725, 724, + 725, 731, 732, + 732, 726, 725, + 660, 583, 661, + 661, 727, 660, + 727, 661, 662, + 662, 728, 727, + 728, 662, 663, + 663, 729, 728, + 729, 663, 664, + 664, 730, 729, + 730, 664, 665, + 665, 731, 730, + 731, 665, 666, + 666, 732, 731, + 733, 740, 741, + 741, 734, 733, + 734, 741, 742, + 742, 735, 734, + 735, 742, 743, + 743, 736, 735, + 736, 743, 744, + 744, 737, 736, + 737, 744, 745, + 745, 738, 737, + 738, 745, 746, + 746, 739, 738, + 740, 747, 748, + 748, 741, 740, + 741, 748, 749, + 749, 742, 741, + 742, 749, 750, + 750, 743, 742, + 743, 750, 751, + 751, 744, 743, + 744, 751, 752, + 752, 745, 744, + 745, 752, 753, + 753, 746, 745, + 747, 754, 755, + 755, 748, 747, + 748, 755, 756, + 756, 749, 748, + 749, 756, 757, + 757, 750, 749, + 750, 757, 758, + 758, 751, 750, + 751, 758, 759, + 759, 752, 751, + 752, 759, 760, + 760, 753, 752, + 754, 761, 762, + 762, 755, 754, + 755, 762, 763, + 763, 756, 755, + 756, 763, 764, + 764, 757, 756, + 757, 764, 765, + 765, 758, 757, + 758, 765, 766, + 766, 759, 758, + 759, 766, 767, + 767, 760, 759, + 761, 768, 769, + 769, 762, 761, + 762, 769, 770, + 770, 763, 762, + 763, 770, 771, + 771, 764, 763, + 764, 771, 772, + 772, 765, 764, + 765, 772, 773, + 773, 766, 765, + 766, 773, 774, + 774, 767, 766, + 768, 775, 776, + 776, 769, 768, + 769, 776, 777, + 777, 770, 769, + 770, 777, 778, + 778, 771, 770, + 771, 778, 779, + 779, 772, 771, + 772, 779, 780, + 780, 773, 772, + 773, 780, 781, + 781, 774, 773, + 775, 782, 783, + 783, 776, 775, + 776, 783, 784, + 784, 777, 776, + 777, 784, 785, + 785, 778, 777, + 778, 785, 786, + 786, 779, 778, + 779, 786, 787, + 787, 780, 779, + 780, 787, 788, + 788, 781, 780, + 782, 789, 790, + 790, 783, 782, + 783, 790, 791, + 791, 784, 783, + 784, 791, 792, + 792, 785, 784, + 785, 792, 793, + 793, 786, 785, + 786, 793, 794, + 794, 787, 786, + 787, 794, 795, + 795, 788, 787, + 789, 796, 797, + 797, 790, 789, + 790, 797, 798, + 798, 791, 790, + 791, 798, 799, + 799, 792, 791, + 792, 799, 800, + 800, 793, 792, + 793, 800, 801, + 801, 794, 793, + 794, 801, 802, + 802, 795, 794, + 796, 803, 804, + 804, 797, 796, + 797, 804, 805, + 805, 798, 797, + 798, 805, 806, + 806, 799, 798, + 799, 806, 807, + 807, 800, 799, + 800, 807, 808, + 808, 801, 800, + 801, 808, 809, + 809, 802, 801, + 803, 810, 811, + 811, 804, 803, + 804, 811, 812, + 812, 805, 804, + 805, 812, 813, + 813, 806, 805, + 806, 813, 814, + 814, 807, 806, + 807, 814, 815, + 815, 808, 807, + 808, 815, 816, + 816, 809, 808, + 810, 733, 734, + 734, 811, 810, + 811, 734, 735, + 735, 812, 811, + 812, 735, 736, + 736, 813, 812, + 813, 736, 737, + 737, 814, 813, + 814, 737, 738, + 738, 815, 814, + 815, 738, 739, + 739, 816, 815, + 739, 746, 823, + 823, 817, 739, + 817, 823, 824, + 824, 818, 817, + 818, 824, 825, + 825, 819, 818, + 819, 825, 826, + 826, 820, 819, + 820, 826, 827, + 827, 821, 820, + 821, 827, 828, + 828, 822, 821, + 746, 753, 829, + 829, 823, 746, + 823, 829, 830, + 830, 824, 823, + 824, 830, 831, + 831, 825, 824, + 825, 831, 832, + 832, 826, 825, + 826, 832, 833, + 833, 827, 826, + 827, 833, 834, + 834, 828, 827, + 753, 760, 835, + 835, 829, 753, + 829, 835, 836, + 836, 830, 829, + 830, 836, 837, + 837, 831, 830, + 831, 837, 838, + 838, 832, 831, + 832, 838, 839, + 839, 833, 832, + 833, 839, 840, + 840, 834, 833, + 760, 767, 841, + 841, 835, 760, + 835, 841, 842, + 842, 836, 835, + 836, 842, 843, + 843, 837, 836, + 837, 843, 844, + 844, 838, 837, + 838, 844, 845, + 845, 839, 838, + 839, 845, 846, + 846, 840, 839, + 767, 774, 847, + 847, 841, 767, + 841, 847, 848, + 848, 842, 841, + 842, 848, 849, + 849, 843, 842, + 843, 849, 850, + 850, 844, 843, + 844, 850, 851, + 851, 845, 844, + 845, 851, 852, + 852, 846, 845, + 774, 781, 853, + 853, 847, 774, + 847, 853, 854, + 854, 848, 847, + 848, 854, 855, + 855, 849, 848, + 849, 855, 856, + 856, 850, 849, + 850, 856, 857, + 857, 851, 850, + 851, 857, 858, + 858, 852, 851, + 781, 788, 859, + 859, 853, 781, + 853, 859, 860, + 860, 854, 853, + 854, 860, 861, + 861, 855, 854, + 855, 861, 862, + 862, 856, 855, + 856, 862, 863, + 863, 857, 856, + 857, 863, 864, + 864, 858, 857, + 788, 795, 865, + 865, 859, 788, + 859, 865, 866, + 866, 860, 859, + 860, 866, 867, + 867, 861, 860, + 861, 867, 868, + 868, 862, 861, + 862, 868, 869, + 869, 863, 862, + 863, 869, 870, + 870, 864, 863, + 795, 802, 871, + 871, 865, 795, + 865, 871, 872, + 872, 866, 865, + 866, 872, 873, + 873, 867, 866, + 867, 873, 874, + 874, 868, 867, + 868, 874, 875, + 875, 869, 868, + 869, 875, 876, + 876, 870, 869, + 802, 809, 877, + 877, 871, 802, + 871, 877, 878, + 878, 872, 871, + 872, 878, 879, + 879, 873, 872, + 873, 879, 880, + 880, 874, 873, + 874, 880, 881, + 881, 875, 874, + 875, 881, 882, + 882, 876, 875, + 809, 816, 883, + 883, 877, 809, + 877, 883, 884, + 884, 878, 877, + 878, 884, 885, + 885, 879, 878, + 879, 885, 886, + 886, 880, 879, + 880, 886, 887, + 887, 881, 880, + 881, 887, 888, + 888, 882, 881, + 816, 739, 817, + 817, 883, 816, + 883, 817, 818, + 818, 884, 883, + 884, 818, 819, + 819, 885, 884, + 885, 819, 820, + 820, 886, 885, + 886, 820, 821, + 821, 887, 886, + 887, 821, 822, + 822, 888, 887, + 896, 890, 889, + 890, 896, 897, + 897, 891, 890, + 891, 897, 898, + 898, 892, 891, + 892, 898, 899, + 899, 893, 892, + 893, 899, 900, + 900, 894, 893, + 894, 900, 901, + 901, 895, 894, + 902, 896, 889, + 896, 902, 903, + 903, 897, 896, + 897, 903, 904, + 904, 898, 897, + 898, 904, 905, + 905, 899, 898, + 899, 905, 906, + 906, 900, 899, + 900, 906, 907, + 907, 901, 900, + 908, 902, 889, + 902, 908, 909, + 909, 903, 902, + 903, 909, 910, + 910, 904, 903, + 904, 910, 911, + 911, 905, 904, + 905, 911, 912, + 912, 906, 905, + 906, 912, 913, + 913, 907, 906, + 914, 908, 889, + 908, 914, 915, + 915, 909, 908, + 909, 915, 916, + 916, 910, 909, + 910, 916, 917, + 917, 911, 910, + 911, 917, 918, + 918, 912, 911, + 912, 918, 919, + 919, 913, 912, + 920, 914, 889, + 914, 920, 921, + 921, 915, 914, + 915, 921, 922, + 922, 916, 915, + 916, 922, 923, + 923, 917, 916, + 917, 923, 924, + 924, 918, 917, + 918, 924, 925, + 925, 919, 918, + 926, 920, 889, + 920, 926, 927, + 927, 921, 920, + 921, 927, 928, + 928, 922, 921, + 922, 928, 929, + 929, 923, 922, + 923, 929, 930, + 930, 924, 923, + 924, 930, 931, + 931, 925, 924, + 932, 926, 889, + 926, 932, 933, + 933, 927, 926, + 927, 933, 934, + 934, 928, 927, + 928, 934, 935, + 935, 929, 928, + 929, 935, 936, + 936, 930, 929, + 930, 936, 937, + 937, 931, 930, + 938, 932, 889, + 932, 938, 939, + 939, 933, 932, + 933, 939, 940, + 940, 934, 933, + 934, 940, 941, + 941, 935, 934, + 935, 941, 942, + 942, 936, 935, + 936, 942, 943, + 943, 937, 936, + 944, 938, 889, + 938, 944, 945, + 945, 939, 938, + 939, 945, 946, + 946, 940, 939, + 940, 946, 947, + 947, 941, 940, + 941, 947, 948, + 948, 942, 941, + 942, 948, 949, + 949, 943, 942, + 950, 944, 889, + 944, 950, 951, + 951, 945, 944, + 945, 951, 952, + 952, 946, 945, + 946, 952, 953, + 953, 947, 946, + 947, 953, 954, + 954, 948, 947, + 948, 954, 955, + 955, 949, 948, + 956, 950, 889, + 950, 956, 957, + 957, 951, 950, + 951, 957, 958, + 958, 952, 951, + 952, 958, 959, + 959, 953, 952, + 953, 959, 960, + 960, 954, 953, + 954, 960, 961, + 961, 955, 954, + 962, 956, 889, + 956, 962, 963, + 963, 957, 956, + 957, 963, 964, + 964, 958, 957, + 958, 964, 965, + 965, 959, 958, + 959, 965, 966, + 966, 960, 959, + 960, 966, 967, + 967, 961, 960, + 968, 962, 889, + 962, 968, 969, + 969, 963, 962, + 963, 969, 970, + 970, 964, 963, + 964, 970, 971, + 971, 965, 964, + 965, 971, 972, + 972, 966, 965, + 966, 972, 973, + 973, 967, 966, + 974, 968, 889, + 968, 974, 975, + 975, 969, 968, + 969, 975, 976, + 976, 970, 969, + 970, 976, 977, + 977, 971, 970, + 971, 977, 978, + 978, 972, 971, + 972, 978, 979, + 979, 973, 972, + 980, 974, 889, + 974, 980, 981, + 981, 975, 974, + 975, 981, 982, + 982, 976, 975, + 976, 982, 983, + 983, 977, 976, + 977, 983, 984, + 984, 978, 977, + 978, 984, 985, + 985, 979, 978, + 986, 980, 889, + 980, 986, 987, + 987, 981, 980, + 981, 987, 988, + 988, 982, 981, + 982, 988, 989, + 989, 983, 982, + 983, 989, 990, + 990, 984, 983, + 984, 990, 991, + 991, 985, 984, + 992, 986, 889, + 986, 992, 993, + 993, 987, 986, + 987, 993, 994, + 994, 988, 987, + 988, 994, 995, + 995, 989, 988, + 989, 995, 996, + 996, 990, 989, + 990, 996, 997, + 997, 991, 990, + 998, 992, 889, + 992, 998, 999, + 999, 993, 992, + 993, 999, 1000, + 1000, 994, 993, + 994, 1000, 1001, + 1001, 995, 994, + 995, 1001, 1002, + 1002, 996, 995, + 996, 1002, 1003, + 1003, 997, 996, + 1004, 998, 889, + 998, 1004, 1005, + 1005, 999, 998, + 999, 1005, 1006, + 1006, 1000, 999, + 1000, 1006, 1007, + 1007, 1001, 1000, + 1001, 1007, 1008, + 1008, 1002, 1001, + 1002, 1008, 1009, + 1009, 1003, 1002, + 1010, 1004, 889, + 1004, 1010, 1011, + 1011, 1005, 1004, + 1005, 1011, 1012, + 1012, 1006, 1005, + 1006, 1012, 1013, + 1013, 1007, 1006, + 1007, 1013, 1014, + 1014, 1008, 1007, + 1008, 1014, 1015, + 1015, 1009, 1008, + 1016, 1010, 889, + 1010, 1016, 1017, + 1017, 1011, 1010, + 1011, 1017, 1018, + 1018, 1012, 1011, + 1012, 1018, 1019, + 1019, 1013, 1012, + 1013, 1019, 1020, + 1020, 1014, 1013, + 1014, 1020, 1021, + 1021, 1015, 1014, + 1022, 1016, 889, + 1016, 1022, 1023, + 1023, 1017, 1016, + 1017, 1023, 1024, + 1024, 1018, 1017, + 1018, 1024, 1025, + 1025, 1019, 1018, + 1019, 1025, 1026, + 1026, 1020, 1019, + 1020, 1026, 1027, + 1027, 1021, 1020, + 1028, 1022, 889, + 1022, 1028, 1029, + 1029, 1023, 1022, + 1023, 1029, 1030, + 1030, 1024, 1023, + 1024, 1030, 1031, + 1031, 1025, 1024, + 1025, 1031, 1032, + 1032, 1026, 1025, + 1026, 1032, 1033, + 1033, 1027, 1026, + 890, 1028, 889, + 1028, 890, 891, + 891, 1029, 1028, + 1029, 891, 892, + 892, 1030, 1029, + 1030, 892, 893, + 893, 1031, 1030, + 1031, 893, 894, + 894, 1032, 1031, + 1032, 894, 895, + 895, 1033, 1032, + 895, 901, 1040, + 1040, 1034, 895, + 1034, 1040, 1041, + 1041, 1035, 1034, + 1035, 1041, 1042, + 1042, 1036, 1035, + 1036, 1042, 1043, + 1043, 1037, 1036, + 1037, 1043, 1044, + 1044, 1038, 1037, + 1038, 1044, 1045, + 1045, 1039, 1038, + 901, 907, 1046, + 1046, 1040, 901, + 1040, 1046, 1047, + 1047, 1041, 1040, + 1041, 1047, 1048, + 1048, 1042, 1041, + 1042, 1048, 1049, + 1049, 1043, 1042, + 1043, 1049, 1050, + 1050, 1044, 1043, + 1044, 1050, 1051, + 1051, 1045, 1044, + 907, 913, 1052, + 1052, 1046, 907, + 1046, 1052, 1053, + 1053, 1047, 1046, + 1047, 1053, 1054, + 1054, 1048, 1047, + 1048, 1054, 1055, + 1055, 1049, 1048, + 1049, 1055, 1056, + 1056, 1050, 1049, + 1050, 1056, 1057, + 1057, 1051, 1050, + 913, 919, 1058, + 1058, 1052, 913, + 1052, 1058, 1059, + 1059, 1053, 1052, + 1053, 1059, 1060, + 1060, 1054, 1053, + 1054, 1060, 1061, + 1061, 1055, 1054, + 1055, 1061, 1062, + 1062, 1056, 1055, + 1056, 1062, 1063, + 1063, 1057, 1056, + 919, 925, 1064, + 1064, 1058, 919, + 1058, 1064, 1065, + 1065, 1059, 1058, + 1059, 1065, 1066, + 1066, 1060, 1059, + 1060, 1066, 1067, + 1067, 1061, 1060, + 1061, 1067, 1068, + 1068, 1062, 1061, + 1062, 1068, 1069, + 1069, 1063, 1062, + 925, 931, 1070, + 1070, 1064, 925, + 1064, 1070, 1071, + 1071, 1065, 1064, + 1065, 1071, 1072, + 1072, 1066, 1065, + 1066, 1072, 1073, + 1073, 1067, 1066, + 1067, 1073, 1074, + 1074, 1068, 1067, + 1068, 1074, 1075, + 1075, 1069, 1068, + 931, 937, 1076, + 1076, 1070, 931, + 1070, 1076, 1077, + 1077, 1071, 1070, + 1071, 1077, 1078, + 1078, 1072, 1071, + 1072, 1078, 1079, + 1079, 1073, 1072, + 1073, 1079, 1080, + 1080, 1074, 1073, + 1074, 1080, 1081, + 1081, 1075, 1074, + 937, 943, 1082, + 1082, 1076, 937, + 1076, 1082, 1083, + 1083, 1077, 1076, + 1077, 1083, 1084, + 1084, 1078, 1077, + 1078, 1084, 1085, + 1085, 1079, 1078, + 1079, 1085, 1086, + 1086, 1080, 1079, + 1080, 1086, 1087, + 1087, 1081, 1080, + 943, 949, 1088, + 1088, 1082, 943, + 1082, 1088, 1089, + 1089, 1083, 1082, + 1083, 1089, 1090, + 1090, 1084, 1083, + 1084, 1090, 1091, + 1091, 1085, 1084, + 1085, 1091, 1092, + 1092, 1086, 1085, + 1086, 1092, 1093, + 1093, 1087, 1086, + 949, 955, 1094, + 1094, 1088, 949, + 1088, 1094, 1095, + 1095, 1089, 1088, + 1089, 1095, 1096, + 1096, 1090, 1089, + 1090, 1096, 1097, + 1097, 1091, 1090, + 1091, 1097, 1098, + 1098, 1092, 1091, + 1092, 1098, 1099, + 1099, 1093, 1092, + 955, 961, 1100, + 1100, 1094, 955, + 1094, 1100, 1101, + 1101, 1095, 1094, + 1095, 1101, 1102, + 1102, 1096, 1095, + 1096, 1102, 1103, + 1103, 1097, 1096, + 1097, 1103, 1104, + 1104, 1098, 1097, + 1098, 1104, 1105, + 1105, 1099, 1098, + 961, 967, 1106, + 1106, 1100, 961, + 1100, 1106, 1107, + 1107, 1101, 1100, + 1101, 1107, 1108, + 1108, 1102, 1101, + 1102, 1108, 1109, + 1109, 1103, 1102, + 1103, 1109, 1110, + 1110, 1104, 1103, + 1104, 1110, 1111, + 1111, 1105, 1104, + 967, 973, 1112, + 1112, 1106, 967, + 1106, 1112, 1113, + 1113, 1107, 1106, + 1107, 1113, 1114, + 1114, 1108, 1107, + 1108, 1114, 1115, + 1115, 1109, 1108, + 1109, 1115, 1116, + 1116, 1110, 1109, + 1110, 1116, 1117, + 1117, 1111, 1110, + 973, 979, 1118, + 1118, 1112, 973, + 1112, 1118, 1119, + 1119, 1113, 1112, + 1113, 1119, 1120, + 1120, 1114, 1113, + 1114, 1120, 1121, + 1121, 1115, 1114, + 1115, 1121, 1122, + 1122, 1116, 1115, + 1116, 1122, 1123, + 1123, 1117, 1116, + 979, 985, 1124, + 1124, 1118, 979, + 1118, 1124, 1125, + 1125, 1119, 1118, + 1119, 1125, 1126, + 1126, 1120, 1119, + 1120, 1126, 1127, + 1127, 1121, 1120, + 1121, 1127, 1128, + 1128, 1122, 1121, + 1122, 1128, 1129, + 1129, 1123, 1122, + 985, 991, 1130, + 1130, 1124, 985, + 1124, 1130, 1131, + 1131, 1125, 1124, + 1125, 1131, 1132, + 1132, 1126, 1125, + 1126, 1132, 1133, + 1133, 1127, 1126, + 1127, 1133, 1134, + 1134, 1128, 1127, + 1128, 1134, 1135, + 1135, 1129, 1128, + 991, 997, 1136, + 1136, 1130, 991, + 1130, 1136, 1137, + 1137, 1131, 1130, + 1131, 1137, 1138, + 1138, 1132, 1131, + 1132, 1138, 1139, + 1139, 1133, 1132, + 1133, 1139, 1140, + 1140, 1134, 1133, + 1134, 1140, 1141, + 1141, 1135, 1134, + 997, 1003, 1142, + 1142, 1136, 997, + 1136, 1142, 1143, + 1143, 1137, 1136, + 1137, 1143, 1144, + 1144, 1138, 1137, + 1138, 1144, 1145, + 1145, 1139, 1138, + 1139, 1145, 1146, + 1146, 1140, 1139, + 1140, 1146, 1147, + 1147, 1141, 1140, + 1003, 1009, 1148, + 1148, 1142, 1003, + 1142, 1148, 1149, + 1149, 1143, 1142, + 1143, 1149, 1150, + 1150, 1144, 1143, + 1144, 1150, 1151, + 1151, 1145, 1144, + 1145, 1151, 1152, + 1152, 1146, 1145, + 1146, 1152, 1153, + 1153, 1147, 1146, + 1009, 1015, 1154, + 1154, 1148, 1009, + 1148, 1154, 1155, + 1155, 1149, 1148, + 1149, 1155, 1156, + 1156, 1150, 1149, + 1150, 1156, 1157, + 1157, 1151, 1150, + 1151, 1157, 1158, + 1158, 1152, 1151, + 1152, 1158, 1159, + 1159, 1153, 1152, + 1015, 1021, 1160, + 1160, 1154, 1015, + 1154, 1160, 1161, + 1161, 1155, 1154, + 1155, 1161, 1162, + 1162, 1156, 1155, + 1156, 1162, 1163, + 1163, 1157, 1156, + 1157, 1163, 1164, + 1164, 1158, 1157, + 1158, 1164, 1165, + 1165, 1159, 1158, + 1021, 1027, 1166, + 1166, 1160, 1021, + 1160, 1166, 1167, + 1167, 1161, 1160, + 1161, 1167, 1168, + 1168, 1162, 1161, + 1162, 1168, 1169, + 1169, 1163, 1162, + 1163, 1169, 1170, + 1170, 1164, 1163, + 1164, 1170, 1171, + 1171, 1165, 1164, + 1027, 1033, 1172, + 1172, 1166, 1027, + 1166, 1172, 1173, + 1173, 1167, 1166, + 1167, 1173, 1174, + 1174, 1168, 1167, + 1168, 1174, 1175, + 1175, 1169, 1168, + 1169, 1175, 1176, + 1176, 1170, 1169, + 1170, 1176, 1177, + 1177, 1171, 1170, + 1033, 895, 1034, + 1034, 1172, 1033, + 1172, 1034, 1035, + 1035, 1173, 1172, + 1173, 1035, 1036, + 1036, 1174, 1173, + 1174, 1036, 1037, + 1037, 1175, 1174, + 1175, 1037, 1038, + 1038, 1176, 1175, + 1176, 1038, 1039, + 1039, 1177, 1176, +}; + + +//---------------------------------------------------------------------------- +// MakeTeapot Helper +//---------------------------------------------------------------------------- +static void MakeTeapot( +VERTEX* pVertices, +WORD* pwIndices ) +{ + DWORD iVertex; + + // Copy vertices + for( iVertex = 0; iVertex < NUMTEAPOTVERTICES; iVertex++ ) + { + pVertices[iVertex].pos = teapotPositions[iVertex]; + pVertices[iVertex].norm = teapotNormals[iVertex]; + } + + // Copy face indices + WORD* pwFace = pwIndices; + WORD* pwFaceLim = pwFace + NUMTEAPOTINDICES; + WORD* pwTeapotFace = teapotIndices; + + while( pwFace < pwFaceLim ) + { + pwFace[0] = pwTeapotFace[0]; + pwFace[1] = pwTeapotFace[1]; + pwFace[2] = pwTeapotFace[2]; + + pwFace += 3; + pwTeapotFace += 3; + } +} + + +//---------------------------------------------------------------------------- +// DXUTCreateTeapot - createa teapot mesh +//---------------------------------------------------------------------------- +HRESULT WINAPI DXUTCreateTeapot( ID3D10Device* pDevice, ID3DX10Mesh** ppMesh ) +{ + HRESULT hr = S_OK; + + WORD* pwIndices = NULL; + VERTEX* pVertices = NULL; + + + // Validate parameters + if( !pDevice ) + return D3DERR_INVALIDCALL; + if( !ppMesh ) + return D3DERR_INVALIDCALL; + + // Create the mesh + UINT cFaces = NUMTEAPOTINDICES / 3; + UINT cVertices = NUMTEAPOTVERTICES; + + // Create enough memory for the vertices and indices + pVertices = new VERTEX[ cVertices ]; + if( !pVertices ) + return E_OUTOFMEMORY; + pwIndices = new WORD[ cFaces * 3 ]; + if( !pwIndices ) + return E_OUTOFMEMORY; + + // Create a teapot + MakeTeapot( pVertices, pwIndices ); + + // Create a mesh + hr = CreateShapeMesh( pDevice, ppMesh, pVertices, cVertices, pwIndices, cFaces * 3 ); + + // Free up the memory + SAFE_DELETE_ARRAY( pVertices ); + SAFE_DELETE_ARRAY( pwIndices ); + + return hr; +} diff --git a/Demos/DX11ClothDemo/DXUT/Optional/DXUTShapes.h b/Demos/DX11ClothDemo/DXUT/Optional/DXUTShapes.h new file mode 100644 index 000000000..c289231dd --- /dev/null +++ b/Demos/DX11ClothDemo/DXUT/Optional/DXUTShapes.h @@ -0,0 +1,24 @@ +//-------------------------------------------------------------------------------------- +// File: DXUTShapes.h +// +// Shape creation functions for DXUT +// +// Copyright (c) Microsoft Corporation. All rights reserved +//-------------------------------------------------------------------------------------- +#pragma once +#ifndef DXUT_SHAPES_H +#define DXUT_SHAPES_H +#include +#include + +HRESULT WINAPI DXUTCreateBox( ID3D10Device* pDevice, float fWidth, float fHeight, float fDepth, ID3DX10Mesh** ppMesh ); +HRESULT WINAPI DXUTCreateCylinder( ID3D10Device* pDevice, float fRadius1, float fRadius2, float fLength, UINT uSlices, + UINT uStacks, ID3DX10Mesh** ppMesh ); +HRESULT WINAPI DXUTCreatePolygon( ID3D10Device* pDevice, float fLength, UINT uSides, ID3DX10Mesh** ppMesh ); +HRESULT WINAPI DXUTCreateSphere( ID3D10Device* pDevice, float fRadius, UINT uSlices, UINT uStacks, + ID3DX10Mesh** ppMesh ); +HRESULT WINAPI DXUTCreateTorus( ID3D10Device* pDevice, float fInnerRadius, float fOuterRadius, UINT uSides, + UINT uRings, ID3DX10Mesh** ppMesh ); +HRESULT WINAPI DXUTCreateTeapot( ID3D10Device* pDevice, ID3DX10Mesh** ppMesh ); + +#endif diff --git a/Demos/DX11ClothDemo/DXUT/Optional/DXUTcamera.cpp b/Demos/DX11ClothDemo/DXUT/Optional/DXUTcamera.cpp new file mode 100644 index 000000000..8142e7cfc --- /dev/null +++ b/Demos/DX11ClothDemo/DXUT/Optional/DXUTcamera.cpp @@ -0,0 +1,1525 @@ +//-------------------------------------------------------------------------------------- +// File: DXUTcamera.cpp +// +// Copyright (c) Microsoft Corporation. All rights reserved +//-------------------------------------------------------------------------------------- +#include "DXUT.h" +#include "DXUTcamera.h" +#include "DXUTres.h" +#undef min // use __min instead +#undef max // use __max instead + +//-------------------------------------------------------------------------------------- +CD3DArcBall::CD3DArcBall() +{ + Reset(); + m_vDownPt = D3DXVECTOR3( 0, 0, 0 ); + m_vCurrentPt = D3DXVECTOR3( 0, 0, 0 ); + m_Offset.x = m_Offset.y = 0; + + RECT rc; + GetClientRect( GetForegroundWindow(), &rc ); + SetWindow( rc.right, rc.bottom ); +} + + + + + +//-------------------------------------------------------------------------------------- +void CD3DArcBall::Reset() +{ + D3DXQuaternionIdentity( &m_qDown ); + D3DXQuaternionIdentity( &m_qNow ); + D3DXMatrixIdentity( &m_mRotation ); + D3DXMatrixIdentity( &m_mTranslation ); + D3DXMatrixIdentity( &m_mTranslationDelta ); + m_bDrag = FALSE; + m_fRadiusTranslation = 1.0f; + m_fRadius = 1.0f; +} + + + + +//-------------------------------------------------------------------------------------- +D3DXVECTOR3 CD3DArcBall::ScreenToVector( float fScreenPtX, float fScreenPtY ) +{ + // Scale to screen + FLOAT x = -( fScreenPtX - m_Offset.x - m_nWidth / 2 ) / ( m_fRadius * m_nWidth / 2 ); + FLOAT y = ( fScreenPtY - m_Offset.y - m_nHeight / 2 ) / ( m_fRadius * m_nHeight / 2 ); + + FLOAT z = 0.0f; + FLOAT mag = x * x + y * y; + + if( mag > 1.0f ) + { + FLOAT scale = 1.0f / sqrtf( mag ); + x *= scale; + y *= scale; + } + else + z = sqrtf( 1.0f - mag ); + + // Return vector + return D3DXVECTOR3( x, y, z ); +} + + + + +//-------------------------------------------------------------------------------------- +D3DXQUATERNION CD3DArcBall::QuatFromBallPoints( const D3DXVECTOR3& vFrom, const D3DXVECTOR3& vTo ) +{ + D3DXVECTOR3 vPart; + float fDot = D3DXVec3Dot( &vFrom, &vTo ); + D3DXVec3Cross( &vPart, &vFrom, &vTo ); + + return D3DXQUATERNION( vPart.x, vPart.y, vPart.z, fDot ); +} + + + + +//-------------------------------------------------------------------------------------- +void CD3DArcBall::OnBegin( int nX, int nY ) +{ + // Only enter the drag state if the click falls + // inside the click rectangle. + if( nX >= m_Offset.x && + nX < m_Offset.x + m_nWidth && + nY >= m_Offset.y && + nY < m_Offset.y + m_nHeight ) + { + m_bDrag = true; + m_qDown = m_qNow; + m_vDownPt = ScreenToVector( ( float )nX, ( float )nY ); + } +} + + + + +//-------------------------------------------------------------------------------------- +void CD3DArcBall::OnMove( int nX, int nY ) +{ + if( m_bDrag ) + { + m_vCurrentPt = ScreenToVector( ( float )nX, ( float )nY ); + m_qNow = m_qDown * QuatFromBallPoints( m_vDownPt, m_vCurrentPt ); + } +} + + + + +//-------------------------------------------------------------------------------------- +void CD3DArcBall::OnEnd() +{ + m_bDrag = false; +} + + + + +//-------------------------------------------------------------------------------------- +// Desc: +//-------------------------------------------------------------------------------------- +LRESULT CD3DArcBall::HandleMessages( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) +{ + // Current mouse position + int iMouseX = ( short )LOWORD( lParam ); + int iMouseY = ( short )HIWORD( lParam ); + + switch( uMsg ) + { + case WM_LBUTTONDOWN: + case WM_LBUTTONDBLCLK: + SetCapture( hWnd ); + OnBegin( iMouseX, iMouseY ); + return TRUE; + + case WM_LBUTTONUP: + ReleaseCapture(); + OnEnd(); + return TRUE; + case WM_CAPTURECHANGED: + if( ( HWND )lParam != hWnd ) + { + ReleaseCapture(); + OnEnd(); + } + return TRUE; + + case WM_RBUTTONDOWN: + case WM_RBUTTONDBLCLK: + case WM_MBUTTONDOWN: + case WM_MBUTTONDBLCLK: + SetCapture( hWnd ); + // Store off the position of the cursor when the button is pressed + m_ptLastMouse.x = iMouseX; + m_ptLastMouse.y = iMouseY; + return TRUE; + + case WM_RBUTTONUP: + case WM_MBUTTONUP: + ReleaseCapture(); + return TRUE; + + case WM_MOUSEMOVE: + if( MK_LBUTTON & wParam ) + { + OnMove( iMouseX, iMouseY ); + } + else if( ( MK_RBUTTON & wParam ) || ( MK_MBUTTON & wParam ) ) + { + // Normalize based on size of window and bounding sphere radius + FLOAT fDeltaX = ( m_ptLastMouse.x - iMouseX ) * m_fRadiusTranslation / m_nWidth; + FLOAT fDeltaY = ( m_ptLastMouse.y - iMouseY ) * m_fRadiusTranslation / m_nHeight; + + if( wParam & MK_RBUTTON ) + { + D3DXMatrixTranslation( &m_mTranslationDelta, -2 * fDeltaX, 2 * fDeltaY, 0.0f ); + D3DXMatrixMultiply( &m_mTranslation, &m_mTranslation, &m_mTranslationDelta ); + } + else // wParam & MK_MBUTTON + { + D3DXMatrixTranslation( &m_mTranslationDelta, 0.0f, 0.0f, 5 * fDeltaY ); + D3DXMatrixMultiply( &m_mTranslation, &m_mTranslation, &m_mTranslationDelta ); + } + + // Store mouse coordinate + m_ptLastMouse.x = iMouseX; + m_ptLastMouse.y = iMouseY; + } + return TRUE; + } + + return FALSE; +} + + + + +//-------------------------------------------------------------------------------------- +// Constructor +//-------------------------------------------------------------------------------------- +CBaseCamera::CBaseCamera() +{ + m_cKeysDown = 0; + ZeroMemory( m_aKeys, sizeof( BYTE ) * CAM_MAX_KEYS ); + ZeroMemory( m_GamePad, sizeof( DXUT_GAMEPAD ) * DXUT_MAX_CONTROLLERS ); + + // Set attributes for the view matrix + D3DXVECTOR3 vEyePt = D3DXVECTOR3( 0.0f, 0.0f, 0.0f ); + D3DXVECTOR3 vLookatPt = D3DXVECTOR3( 0.0f, 0.0f, 1.0f ); + + // Setup the view matrix + SetViewParams( &vEyePt, &vLookatPt ); + + // Setup the projection matrix + SetProjParams( D3DX_PI / 4, 1.0f, 1.0f, 1000.0f ); + + GetCursorPos( &m_ptLastMousePosition ); + m_bMouseLButtonDown = false; + m_bMouseMButtonDown = false; + m_bMouseRButtonDown = false; + m_nCurrentButtonMask = 0; + m_nMouseWheelDelta = 0; + + m_fCameraYawAngle = 0.0f; + m_fCameraPitchAngle = 0.0f; + + SetRect( &m_rcDrag, LONG_MIN, LONG_MIN, LONG_MAX, LONG_MAX ); + m_vVelocity = D3DXVECTOR3( 0, 0, 0 ); + m_bMovementDrag = false; + m_vVelocityDrag = D3DXVECTOR3( 0, 0, 0 ); + m_fDragTimer = 0.0f; + m_fTotalDragTimeToZero = 0.25; + m_vRotVelocity = D3DXVECTOR2( 0, 0 ); + + m_fRotationScaler = 0.01f; + m_fMoveScaler = 5.0f; + + m_bInvertPitch = false; + m_bEnableYAxisMovement = true; + m_bEnablePositionMovement = true; + + m_vMouseDelta = D3DXVECTOR2( 0, 0 ); + m_fFramesToSmoothMouseData = 2.0f; + + m_bClipToBoundary = false; + m_vMinBoundary = D3DXVECTOR3( -1, -1, -1 ); + m_vMaxBoundary = D3DXVECTOR3( 1, 1, 1 ); + + m_bResetCursorAfterMove = false; +} + + +//-------------------------------------------------------------------------------------- +// Client can call this to change the position and direction of camera +//-------------------------------------------------------------------------------------- +VOID CBaseCamera::SetViewParams( D3DXVECTOR3* pvEyePt, D3DXVECTOR3* pvLookatPt ) +{ + if( NULL == pvEyePt || NULL == pvLookatPt ) + return; + + m_vDefaultEye = m_vEye = *pvEyePt; + m_vDefaultLookAt = m_vLookAt = *pvLookatPt; + + // Calc the view matrix + D3DXVECTOR3 vUp( 0,1,0 ); + D3DXMatrixLookAtLH( &m_mView, pvEyePt, pvLookatPt, &vUp ); + + D3DXMATRIX mInvView; + D3DXMatrixInverse( &mInvView, NULL, &m_mView ); + + // The axis basis vectors and camera position are stored inside the + // position matrix in the 4 rows of the camera's world matrix. + // To figure out the yaw/pitch of the camera, we just need the Z basis vector + D3DXVECTOR3* pZBasis = ( D3DXVECTOR3* )&mInvView._31; + + m_fCameraYawAngle = atan2f( pZBasis->x, pZBasis->z ); + float fLen = sqrtf( pZBasis->z * pZBasis->z + pZBasis->x * pZBasis->x ); + m_fCameraPitchAngle = -atan2f( pZBasis->y, fLen ); +} + + + + +//-------------------------------------------------------------------------------------- +// Calculates the projection matrix based on input params +//-------------------------------------------------------------------------------------- +VOID CBaseCamera::SetProjParams( FLOAT fFOV, FLOAT fAspect, FLOAT fNearPlane, + FLOAT fFarPlane ) +{ + // Set attributes for the projection matrix + m_fFOV = fFOV; + m_fAspect = fAspect; + m_fNearPlane = fNearPlane; + m_fFarPlane = fFarPlane; + + D3DXMatrixPerspectiveFovLH( &m_mProj, fFOV, fAspect, fNearPlane, fFarPlane ); +} + + + + +//-------------------------------------------------------------------------------------- +// Call this from your message proc so this class can handle window messages +//-------------------------------------------------------------------------------------- +LRESULT CBaseCamera::HandleMessages( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) +{ + UNREFERENCED_PARAMETER( hWnd ); + UNREFERENCED_PARAMETER( lParam ); + + switch( uMsg ) + { + case WM_KEYDOWN: + { + // Map this key to a D3DUtil_CameraKeys enum and update the + // state of m_aKeys[] by adding the KEY_WAS_DOWN_MASK|KEY_IS_DOWN_MASK mask + // only if the key is not down + D3DUtil_CameraKeys mappedKey = MapKey( ( UINT )wParam ); + if( mappedKey != CAM_UNKNOWN ) + { + if( FALSE == IsKeyDown( m_aKeys[mappedKey] ) ) + { + m_aKeys[ mappedKey ] = KEY_WAS_DOWN_MASK | KEY_IS_DOWN_MASK; + ++m_cKeysDown; + } + } + break; + } + + case WM_KEYUP: + { + // Map this key to a D3DUtil_CameraKeys enum and update the + // state of m_aKeys[] by removing the KEY_IS_DOWN_MASK mask. + D3DUtil_CameraKeys mappedKey = MapKey( ( UINT )wParam ); + if( mappedKey != CAM_UNKNOWN && ( DWORD )mappedKey < 8 ) + { + m_aKeys[ mappedKey ] &= ~KEY_IS_DOWN_MASK; + --m_cKeysDown; + } + break; + } + + case WM_RBUTTONDOWN: + case WM_MBUTTONDOWN: + case WM_LBUTTONDOWN: + case WM_RBUTTONDBLCLK: + case WM_MBUTTONDBLCLK: + case WM_LBUTTONDBLCLK: + { + // Compute the drag rectangle in screen coord. + POINT ptCursor = + { + ( short )LOWORD( lParam ), ( short )HIWORD( lParam ) + }; + + // Update member var state + if( ( uMsg == WM_LBUTTONDOWN || uMsg == WM_LBUTTONDBLCLK ) && PtInRect( &m_rcDrag, ptCursor ) ) + { + m_bMouseLButtonDown = true; m_nCurrentButtonMask |= MOUSE_LEFT_BUTTON; + } + if( ( uMsg == WM_MBUTTONDOWN || uMsg == WM_MBUTTONDBLCLK ) && PtInRect( &m_rcDrag, ptCursor ) ) + { + m_bMouseMButtonDown = true; m_nCurrentButtonMask |= MOUSE_MIDDLE_BUTTON; + } + if( ( uMsg == WM_RBUTTONDOWN || uMsg == WM_RBUTTONDBLCLK ) && PtInRect( &m_rcDrag, ptCursor ) ) + { + m_bMouseRButtonDown = true; m_nCurrentButtonMask |= MOUSE_RIGHT_BUTTON; + } + + // Capture the mouse, so if the mouse button is + // released outside the window, we'll get the WM_LBUTTONUP message + SetCapture( hWnd ); + GetCursorPos( &m_ptLastMousePosition ); + return TRUE; + } + + case WM_RBUTTONUP: + case WM_MBUTTONUP: + case WM_LBUTTONUP: + { + // Update member var state + if( uMsg == WM_LBUTTONUP ) + { + m_bMouseLButtonDown = false; m_nCurrentButtonMask &= ~MOUSE_LEFT_BUTTON; + } + if( uMsg == WM_MBUTTONUP ) + { + m_bMouseMButtonDown = false; m_nCurrentButtonMask &= ~MOUSE_MIDDLE_BUTTON; + } + if( uMsg == WM_RBUTTONUP ) + { + m_bMouseRButtonDown = false; m_nCurrentButtonMask &= ~MOUSE_RIGHT_BUTTON; + } + + // Release the capture if no mouse buttons down + if( !m_bMouseLButtonDown && + !m_bMouseRButtonDown && + !m_bMouseMButtonDown ) + { + ReleaseCapture(); + } + break; + } + + case WM_CAPTURECHANGED: + { + if( ( HWND )lParam != hWnd ) + { + if( ( m_nCurrentButtonMask & MOUSE_LEFT_BUTTON ) || + ( m_nCurrentButtonMask & MOUSE_MIDDLE_BUTTON ) || + ( m_nCurrentButtonMask & MOUSE_RIGHT_BUTTON ) ) + { + m_bMouseLButtonDown = false; + m_bMouseMButtonDown = false; + m_bMouseRButtonDown = false; + m_nCurrentButtonMask &= ~MOUSE_LEFT_BUTTON; + m_nCurrentButtonMask &= ~MOUSE_MIDDLE_BUTTON; + m_nCurrentButtonMask &= ~MOUSE_RIGHT_BUTTON; + ReleaseCapture(); + } + } + break; + } + + case WM_MOUSEWHEEL: + // Update member var state + m_nMouseWheelDelta += ( short )HIWORD( wParam ); + break; + } + + return FALSE; +} + +//-------------------------------------------------------------------------------------- +// Figure out the velocity based on keyboard input & drag if any +//-------------------------------------------------------------------------------------- +void CBaseCamera::GetInput( bool bGetKeyboardInput, bool bGetMouseInput, bool bGetGamepadInput, + bool bResetCursorAfterMove ) +{ + m_vKeyboardDirection = D3DXVECTOR3( 0, 0, 0 ); + if( bGetKeyboardInput ) + { + // Update acceleration vector based on keyboard state + if( IsKeyDown( m_aKeys[CAM_MOVE_FORWARD] ) ) + m_vKeyboardDirection.z += 1.0f; + if( IsKeyDown( m_aKeys[CAM_MOVE_BACKWARD] ) ) + m_vKeyboardDirection.z -= 1.0f; + if( m_bEnableYAxisMovement ) + { + if( IsKeyDown( m_aKeys[CAM_MOVE_UP] ) ) + m_vKeyboardDirection.y += 1.0f; + if( IsKeyDown( m_aKeys[CAM_MOVE_DOWN] ) ) + m_vKeyboardDirection.y -= 1.0f; + } + if( IsKeyDown( m_aKeys[CAM_STRAFE_RIGHT] ) ) + m_vKeyboardDirection.x += 1.0f; + if( IsKeyDown( m_aKeys[CAM_STRAFE_LEFT] ) ) + m_vKeyboardDirection.x -= 1.0f; + } + + if( bGetMouseInput ) + { + UpdateMouseDelta(); + } + + if( bGetGamepadInput ) + { + m_vGamePadLeftThumb = D3DXVECTOR3( 0, 0, 0 ); + m_vGamePadRightThumb = D3DXVECTOR3( 0, 0, 0 ); + + // Get controller state + for( DWORD iUserIndex = 0; iUserIndex < DXUT_MAX_CONTROLLERS; iUserIndex++ ) + { + DXUTGetGamepadState( iUserIndex, &m_GamePad[iUserIndex], true, true ); + + // Mark time if the controller is in a non-zero state + if( m_GamePad[iUserIndex].wButtons || + m_GamePad[iUserIndex].sThumbLX || m_GamePad[iUserIndex].sThumbLX || + m_GamePad[iUserIndex].sThumbRX || m_GamePad[iUserIndex].sThumbRY || + m_GamePad[iUserIndex].bLeftTrigger || m_GamePad[iUserIndex].bRightTrigger ) + { + m_GamePadLastActive[iUserIndex] = DXUTGetTime(); + } + } + + // Find out which controller was non-zero last + int iMostRecentlyActive = -1; + double fMostRecentlyActiveTime = 0.0f; + for( DWORD iUserIndex = 0; iUserIndex < DXUT_MAX_CONTROLLERS; iUserIndex++ ) + { + if( m_GamePadLastActive[iUserIndex] > fMostRecentlyActiveTime ) + { + fMostRecentlyActiveTime = m_GamePadLastActive[iUserIndex]; + iMostRecentlyActive = iUserIndex; + } + } + + // Use the most recent non-zero controller if its connected + if( iMostRecentlyActive >= 0 && m_GamePad[iMostRecentlyActive].bConnected ) + { + m_vGamePadLeftThumb.x = m_GamePad[iMostRecentlyActive].fThumbLX; + m_vGamePadLeftThumb.y = 0.0f; + m_vGamePadLeftThumb.z = m_GamePad[iMostRecentlyActive].fThumbLY; + + m_vGamePadRightThumb.x = m_GamePad[iMostRecentlyActive].fThumbRX; + m_vGamePadRightThumb.y = 0.0f; + m_vGamePadRightThumb.z = m_GamePad[iMostRecentlyActive].fThumbRY; + } + } +} + + +//-------------------------------------------------------------------------------------- +// Figure out the mouse delta based on mouse movement +//-------------------------------------------------------------------------------------- +void CBaseCamera::UpdateMouseDelta() +{ + POINT ptCurMouseDelta; + POINT ptCurMousePos; + + // Get current position of mouse + GetCursorPos( &ptCurMousePos ); + + // Calc how far it's moved since last frame + ptCurMouseDelta.x = ptCurMousePos.x - m_ptLastMousePosition.x; + ptCurMouseDelta.y = ptCurMousePos.y - m_ptLastMousePosition.y; + + // Record current position for next time + m_ptLastMousePosition = ptCurMousePos; + + if( m_bResetCursorAfterMove && DXUTIsActive() ) + { + // Set position of camera to center of desktop, + // so it always has room to move. This is very useful + // if the cursor is hidden. If this isn't done and cursor is hidden, + // then invisible cursor will hit the edge of the screen + // and the user can't tell what happened + POINT ptCenter; + + // Get the center of the current monitor + MONITORINFO mi; + mi.cbSize = sizeof( MONITORINFO ); + DXUTGetMonitorInfo( DXUTMonitorFromWindow( DXUTGetHWND(), MONITOR_DEFAULTTONEAREST ), &mi ); + ptCenter.x = ( mi.rcMonitor.left + mi.rcMonitor.right ) / 2; + ptCenter.y = ( mi.rcMonitor.top + mi.rcMonitor.bottom ) / 2; + SetCursorPos( ptCenter.x, ptCenter.y ); + m_ptLastMousePosition = ptCenter; + } + + // Smooth the relative mouse data over a few frames so it isn't + // jerky when moving slowly at low frame rates. + float fPercentOfNew = 1.0f / m_fFramesToSmoothMouseData; + float fPercentOfOld = 1.0f - fPercentOfNew; + m_vMouseDelta.x = m_vMouseDelta.x * fPercentOfOld + ptCurMouseDelta.x * fPercentOfNew; + m_vMouseDelta.y = m_vMouseDelta.y * fPercentOfOld + ptCurMouseDelta.y * fPercentOfNew; + + m_vRotVelocity = m_vMouseDelta * m_fRotationScaler; +} + + + + +//-------------------------------------------------------------------------------------- +// Figure out the velocity based on keyboard input & drag if any +//-------------------------------------------------------------------------------------- +void CBaseCamera::UpdateVelocity( float fElapsedTime ) +{ + D3DXMATRIX mRotDelta; + D3DXVECTOR2 vGamePadRightThumb = D3DXVECTOR2( m_vGamePadRightThumb.x, -m_vGamePadRightThumb.z ); + m_vRotVelocity = m_vMouseDelta * m_fRotationScaler + vGamePadRightThumb * 0.02f; + + D3DXVECTOR3 vAccel = m_vKeyboardDirection + m_vGamePadLeftThumb; + + // Normalize vector so if moving 2 dirs (left & forward), + // the camera doesn't move faster than if moving in 1 dir + D3DXVec3Normalize( &vAccel, &vAccel ); + + // Scale the acceleration vector + vAccel *= m_fMoveScaler; + + if( m_bMovementDrag ) + { + // Is there any acceleration this frame? + if( D3DXVec3LengthSq( &vAccel ) > 0 ) + { + // If so, then this means the user has pressed a movement key\ + // so change the velocity immediately to acceleration + // upon keyboard input. This isn't normal physics + // but it will give a quick response to keyboard input + m_vVelocity = vAccel; + m_fDragTimer = m_fTotalDragTimeToZero; + m_vVelocityDrag = vAccel / m_fDragTimer; + } + else + { + // If no key being pressed, then slowly decrease velocity to 0 + if( m_fDragTimer > 0 ) + { + // Drag until timer is <= 0 + m_vVelocity -= m_vVelocityDrag * fElapsedTime; + m_fDragTimer -= fElapsedTime; + } + else + { + // Zero velocity + m_vVelocity = D3DXVECTOR3( 0, 0, 0 ); + } + } + } + else + { + // No drag, so immediately change the velocity + m_vVelocity = vAccel; + } +} + + + + +//-------------------------------------------------------------------------------------- +// Clamps pV to lie inside m_vMinBoundary & m_vMaxBoundary +//-------------------------------------------------------------------------------------- +void CBaseCamera::ConstrainToBoundary( D3DXVECTOR3* pV ) +{ + // Constrain vector to a bounding box + pV->x = __max( pV->x, m_vMinBoundary.x ); + pV->y = __max( pV->y, m_vMinBoundary.y ); + pV->z = __max( pV->z, m_vMinBoundary.z ); + + pV->x = __min( pV->x, m_vMaxBoundary.x ); + pV->y = __min( pV->y, m_vMaxBoundary.y ); + pV->z = __min( pV->z, m_vMaxBoundary.z ); +} + + + + +//-------------------------------------------------------------------------------------- +// Maps a windows virtual key to an enum +//-------------------------------------------------------------------------------------- +D3DUtil_CameraKeys CBaseCamera::MapKey( UINT nKey ) +{ + // This could be upgraded to a method that's user-definable but for + // simplicity, we'll use a hardcoded mapping. + switch( nKey ) + { + case VK_CONTROL: + return CAM_CONTROLDOWN; + case VK_LEFT: + return CAM_STRAFE_LEFT; + case VK_RIGHT: + return CAM_STRAFE_RIGHT; + case VK_UP: + return CAM_MOVE_FORWARD; + case VK_DOWN: + return CAM_MOVE_BACKWARD; + case VK_PRIOR: + return CAM_MOVE_UP; // pgup + case VK_NEXT: + return CAM_MOVE_DOWN; // pgdn + + case 'A': + return CAM_STRAFE_LEFT; + case 'D': + return CAM_STRAFE_RIGHT; + case 'W': + return CAM_MOVE_FORWARD; + case 'S': + return CAM_MOVE_BACKWARD; + case 'Q': + return CAM_MOVE_DOWN; + case 'E': + return CAM_MOVE_UP; + + case VK_NUMPAD4: + return CAM_STRAFE_LEFT; + case VK_NUMPAD6: + return CAM_STRAFE_RIGHT; + case VK_NUMPAD8: + return CAM_MOVE_FORWARD; + case VK_NUMPAD2: + return CAM_MOVE_BACKWARD; + case VK_NUMPAD9: + return CAM_MOVE_UP; + case VK_NUMPAD3: + return CAM_MOVE_DOWN; + + case VK_HOME: + return CAM_RESET; + } + + return CAM_UNKNOWN; +} + + + + +//-------------------------------------------------------------------------------------- +// Reset the camera's position back to the default +//-------------------------------------------------------------------------------------- +VOID CBaseCamera::Reset() +{ + SetViewParams( &m_vDefaultEye, &m_vDefaultLookAt ); +} + + + + +//-------------------------------------------------------------------------------------- +// Constructor +//-------------------------------------------------------------------------------------- +CFirstPersonCamera::CFirstPersonCamera() : m_nActiveButtonMask( 0x07 ) +{ + m_bRotateWithoutButtonDown = false; +} + + + + +//-------------------------------------------------------------------------------------- +// Update the view matrix based on user input & elapsed time +//-------------------------------------------------------------------------------------- +VOID CFirstPersonCamera::FrameMove( FLOAT fElapsedTime ) +{ + if( DXUTGetGlobalTimer()->IsStopped() ) { + if (DXUTGetFPS() == 0.0f) fElapsedTime = 0; + else fElapsedTime = 1.0f / DXUTGetFPS(); + } + + if( IsKeyDown( m_aKeys[CAM_RESET] ) ) + Reset(); + + // Get keyboard/mouse/gamepad input + GetInput( m_bEnablePositionMovement, ( m_nActiveButtonMask & m_nCurrentButtonMask ) || m_bRotateWithoutButtonDown, + true, m_bResetCursorAfterMove ); + + //// Get the mouse movement (if any) if the mouse button are down + //if( (m_nActiveButtonMask & m_nCurrentButtonMask) || m_bRotateWithoutButtonDown ) + // UpdateMouseDelta( fElapsedTime ); + + // Get amount of velocity based on the keyboard input and drag (if any) + UpdateVelocity( fElapsedTime ); + + // Simple euler method to calculate position delta + D3DXVECTOR3 vPosDelta = m_vVelocity * fElapsedTime; + + // If rotating the camera + if( ( m_nActiveButtonMask & m_nCurrentButtonMask ) || + m_bRotateWithoutButtonDown || + m_vGamePadRightThumb.x != 0 || + m_vGamePadRightThumb.z != 0 ) + { + // Update the pitch & yaw angle based on mouse movement + float fYawDelta = m_vRotVelocity.x; + float fPitchDelta = m_vRotVelocity.y; + + // Invert pitch if requested + if( m_bInvertPitch ) + fPitchDelta = -fPitchDelta; + + m_fCameraPitchAngle += fPitchDelta; + m_fCameraYawAngle += fYawDelta; + + // Limit pitch to straight up or straight down + m_fCameraPitchAngle = __max( -D3DX_PI / 2.0f, m_fCameraPitchAngle ); + m_fCameraPitchAngle = __min( +D3DX_PI / 2.0f, m_fCameraPitchAngle ); + } + + // Make a rotation matrix based on the camera's yaw & pitch + D3DXMATRIX mCameraRot; + D3DXMatrixRotationYawPitchRoll( &mCameraRot, m_fCameraYawAngle, m_fCameraPitchAngle, 0 ); + + // Transform vectors based on camera's rotation matrix + D3DXVECTOR3 vWorldUp, vWorldAhead; + D3DXVECTOR3 vLocalUp = D3DXVECTOR3( 0, 1, 0 ); + D3DXVECTOR3 vLocalAhead = D3DXVECTOR3( 0, 0, 1 ); + D3DXVec3TransformCoord( &vWorldUp, &vLocalUp, &mCameraRot ); + D3DXVec3TransformCoord( &vWorldAhead, &vLocalAhead, &mCameraRot ); + + // Transform the position delta by the camera's rotation + D3DXVECTOR3 vPosDeltaWorld; + if( !m_bEnableYAxisMovement ) + { + // If restricting Y movement, do not include pitch + // when transforming position delta vector. + D3DXMatrixRotationYawPitchRoll( &mCameraRot, m_fCameraYawAngle, 0.0f, 0.0f ); + } + D3DXVec3TransformCoord( &vPosDeltaWorld, &vPosDelta, &mCameraRot ); + + // Move the eye position + m_vEye += vPosDeltaWorld; + if( m_bClipToBoundary ) + ConstrainToBoundary( &m_vEye ); + + // Update the lookAt position based on the eye position + m_vLookAt = m_vEye + vWorldAhead; + + // Update the view matrix + D3DXMatrixLookAtLH( &m_mView, &m_vEye, &m_vLookAt, &vWorldUp ); + + D3DXMatrixInverse( &m_mCameraWorld, NULL, &m_mView ); +} + + +//-------------------------------------------------------------------------------------- +// Enable or disable each of the mouse buttons for rotation drag. +//-------------------------------------------------------------------------------------- +void CFirstPersonCamera::SetRotateButtons( bool bLeft, bool bMiddle, bool bRight, bool bRotateWithoutButtonDown ) +{ + m_nActiveButtonMask = ( bLeft ? MOUSE_LEFT_BUTTON : 0 ) | + ( bMiddle ? MOUSE_MIDDLE_BUTTON : 0 ) | + ( bRight ? MOUSE_RIGHT_BUTTON : 0 ); + m_bRotateWithoutButtonDown = bRotateWithoutButtonDown; +} + + +//-------------------------------------------------------------------------------------- +// Constructor +//-------------------------------------------------------------------------------------- +CModelViewerCamera::CModelViewerCamera() +{ + D3DXMatrixIdentity( &m_mWorld ); + D3DXMatrixIdentity( &m_mModelRot ); + D3DXMatrixIdentity( &m_mModelLastRot ); + D3DXMatrixIdentity( &m_mCameraRotLast ); + m_vModelCenter = D3DXVECTOR3( 0, 0, 0 ); + m_fRadius = 5.0f; + m_fDefaultRadius = 5.0f; + m_fMinRadius = 1.0f; + m_fMaxRadius = FLT_MAX; + m_bLimitPitch = false; + m_bEnablePositionMovement = false; + m_bAttachCameraToModel = false; + + m_nRotateModelButtonMask = MOUSE_LEFT_BUTTON; + m_nZoomButtonMask = MOUSE_WHEEL; + m_nRotateCameraButtonMask = MOUSE_RIGHT_BUTTON; + m_bDragSinceLastUpdate = true; +} + + + + +//-------------------------------------------------------------------------------------- +// Update the view matrix & the model's world matrix based +// on user input & elapsed time +//-------------------------------------------------------------------------------------- +VOID CModelViewerCamera::FrameMove( FLOAT fElapsedTime ) +{ + if( IsKeyDown( m_aKeys[CAM_RESET] ) ) + Reset(); + + // If no dragged has happend since last time FrameMove is called, + // and no camera key is held down, then no need to handle again. + if( !m_bDragSinceLastUpdate && 0 == m_cKeysDown ) + return; + m_bDragSinceLastUpdate = false; + + //// If no mouse button is held down, + //// Get the mouse movement (if any) if the mouse button are down + //if( m_nCurrentButtonMask != 0 ) + // UpdateMouseDelta( fElapsedTime ); + + GetInput( m_bEnablePositionMovement, m_nCurrentButtonMask != 0, true, false ); + + // Get amount of velocity based on the keyboard input and drag (if any) + UpdateVelocity( fElapsedTime ); + + // Simple euler method to calculate position delta + D3DXVECTOR3 vPosDelta = m_vVelocity * fElapsedTime; + + // Change the radius from the camera to the model based on wheel scrolling + if( m_nMouseWheelDelta && m_nZoomButtonMask == MOUSE_WHEEL ) + m_fRadius -= m_nMouseWheelDelta * m_fRadius * 0.1f / 120.0f; + m_fRadius = __min( m_fMaxRadius, m_fRadius ); + m_fRadius = __max( m_fMinRadius, m_fRadius ); + m_nMouseWheelDelta = 0; + + // Get the inverse of the arcball's rotation matrix + D3DXMATRIX mCameraRot; + D3DXMatrixInverse( &mCameraRot, NULL, m_ViewArcBall.GetRotationMatrix() ); + + // Transform vectors based on camera's rotation matrix + D3DXVECTOR3 vWorldUp, vWorldAhead; + D3DXVECTOR3 vLocalUp = D3DXVECTOR3( 0, 1, 0 ); + D3DXVECTOR3 vLocalAhead = D3DXVECTOR3( 0, 0, 1 ); + D3DXVec3TransformCoord( &vWorldUp, &vLocalUp, &mCameraRot ); + D3DXVec3TransformCoord( &vWorldAhead, &vLocalAhead, &mCameraRot ); + + // Transform the position delta by the camera's rotation + D3DXVECTOR3 vPosDeltaWorld; + D3DXVec3TransformCoord( &vPosDeltaWorld, &vPosDelta, &mCameraRot ); + + // Move the lookAt position + m_vLookAt += vPosDeltaWorld; + if( m_bClipToBoundary ) + ConstrainToBoundary( &m_vLookAt ); + + // Update the eye point based on a radius away from the lookAt position + m_vEye = m_vLookAt - vWorldAhead * m_fRadius; + + // Update the view matrix + D3DXMatrixLookAtLH( &m_mView, &m_vEye, &m_vLookAt, &vWorldUp ); + + D3DXMATRIX mInvView; + D3DXMatrixInverse( &mInvView, NULL, &m_mView ); + mInvView._41 = mInvView._42 = mInvView._43 = 0; + + D3DXMATRIX mModelLastRotInv; + D3DXMatrixInverse( &mModelLastRotInv, NULL, &m_mModelLastRot ); + + // Accumulate the delta of the arcball's rotation in view space. + // Note that per-frame delta rotations could be problematic over long periods of time. + D3DXMATRIX mModelRot; + mModelRot = *m_WorldArcBall.GetRotationMatrix(); + m_mModelRot *= m_mView * mModelLastRotInv * mModelRot * mInvView; + + if( m_ViewArcBall.IsBeingDragged() && m_bAttachCameraToModel && !IsKeyDown( m_aKeys[CAM_CONTROLDOWN] ) ) + { + // Attach camera to model by inverse of the model rotation + D3DXMATRIX mCameraLastRotInv; + D3DXMatrixInverse( &mCameraLastRotInv, NULL, &m_mCameraRotLast ); + D3DXMATRIX mCameraRotDelta = mCameraLastRotInv * mCameraRot; // local to world matrix + m_mModelRot *= mCameraRotDelta; + } + m_mCameraRotLast = mCameraRot; + + m_mModelLastRot = mModelRot; + + // Since we're accumulating delta rotations, we need to orthonormalize + // the matrix to prevent eventual matrix skew + D3DXVECTOR3* pXBasis = ( D3DXVECTOR3* )&m_mModelRot._11; + D3DXVECTOR3* pYBasis = ( D3DXVECTOR3* )&m_mModelRot._21; + D3DXVECTOR3* pZBasis = ( D3DXVECTOR3* )&m_mModelRot._31; + D3DXVec3Normalize( pXBasis, pXBasis ); + D3DXVec3Cross( pYBasis, pZBasis, pXBasis ); + D3DXVec3Normalize( pYBasis, pYBasis ); + D3DXVec3Cross( pZBasis, pXBasis, pYBasis ); + + // Translate the rotation matrix to the same position as the lookAt position + m_mModelRot._41 = m_vLookAt.x; + m_mModelRot._42 = m_vLookAt.y; + m_mModelRot._43 = m_vLookAt.z; + + // Translate world matrix so its at the center of the model + D3DXMATRIX mTrans; + D3DXMatrixTranslation( &mTrans, -m_vModelCenter.x, -m_vModelCenter.y, -m_vModelCenter.z ); + m_mWorld = mTrans * m_mModelRot; +} + + +void CModelViewerCamera::SetDragRect( RECT& rc ) +{ + CBaseCamera::SetDragRect( rc ); + + m_WorldArcBall.SetOffset( rc.left, rc.top ); + m_ViewArcBall.SetOffset( rc.left, rc.top ); + SetWindow( rc.right - rc.left, rc.bottom - rc.top ); +} + + +//-------------------------------------------------------------------------------------- +// Reset the camera's position back to the default +//-------------------------------------------------------------------------------------- +VOID CModelViewerCamera::Reset() +{ + CBaseCamera::Reset(); + + D3DXMatrixIdentity( &m_mWorld ); + D3DXMatrixIdentity( &m_mModelRot ); + D3DXMatrixIdentity( &m_mModelLastRot ); + D3DXMatrixIdentity( &m_mCameraRotLast ); + + m_fRadius = m_fDefaultRadius; + m_WorldArcBall.Reset(); + m_ViewArcBall.Reset(); +} + + +//-------------------------------------------------------------------------------------- +// Override for setting the view parameters +//-------------------------------------------------------------------------------------- +void CModelViewerCamera::SetViewParams( D3DXVECTOR3* pvEyePt, D3DXVECTOR3* pvLookatPt ) +{ + CBaseCamera::SetViewParams( pvEyePt, pvLookatPt ); + + // Propogate changes to the member arcball + D3DXQUATERNION quat; + D3DXMATRIXA16 mRotation; + D3DXVECTOR3 vUp( 0,1,0 ); + D3DXMatrixLookAtLH( &mRotation, pvEyePt, pvLookatPt, &vUp ); + D3DXQuaternionRotationMatrix( &quat, &mRotation ); + m_ViewArcBall.SetQuatNow( quat ); + + // Set the radius according to the distance + D3DXVECTOR3 vEyeToPoint; + D3DXVec3Subtract( &vEyeToPoint, pvLookatPt, pvEyePt ); + SetRadius( D3DXVec3Length( &vEyeToPoint ) ); + + // View information changed. FrameMove should be called. + m_bDragSinceLastUpdate = true; +} + + + +//-------------------------------------------------------------------------------------- +// Call this from your message proc so this class can handle window messages +//-------------------------------------------------------------------------------------- +LRESULT CModelViewerCamera::HandleMessages( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) +{ + CBaseCamera::HandleMessages( hWnd, uMsg, wParam, lParam ); + + if( ( ( uMsg == WM_LBUTTONDOWN || uMsg == WM_LBUTTONDBLCLK ) && m_nRotateModelButtonMask & MOUSE_LEFT_BUTTON ) || + ( ( uMsg == WM_MBUTTONDOWN || uMsg == WM_MBUTTONDBLCLK ) && m_nRotateModelButtonMask & MOUSE_MIDDLE_BUTTON ) || + ( ( uMsg == WM_RBUTTONDOWN || uMsg == WM_RBUTTONDBLCLK ) && m_nRotateModelButtonMask & MOUSE_RIGHT_BUTTON ) ) + { + int iMouseX = ( short )LOWORD( lParam ); + int iMouseY = ( short )HIWORD( lParam ); + m_WorldArcBall.OnBegin( iMouseX, iMouseY ); + } + + if( ( ( uMsg == WM_LBUTTONDOWN || uMsg == WM_LBUTTONDBLCLK ) && m_nRotateCameraButtonMask & MOUSE_LEFT_BUTTON ) || + ( ( uMsg == WM_MBUTTONDOWN || uMsg == WM_MBUTTONDBLCLK ) && + m_nRotateCameraButtonMask & MOUSE_MIDDLE_BUTTON ) || + ( ( uMsg == WM_RBUTTONDOWN || uMsg == WM_RBUTTONDBLCLK ) && m_nRotateCameraButtonMask & MOUSE_RIGHT_BUTTON ) ) + { + int iMouseX = ( short )LOWORD( lParam ); + int iMouseY = ( short )HIWORD( lParam ); + m_ViewArcBall.OnBegin( iMouseX, iMouseY ); + } + + if( uMsg == WM_MOUSEMOVE ) + { + int iMouseX = ( short )LOWORD( lParam ); + int iMouseY = ( short )HIWORD( lParam ); + m_WorldArcBall.OnMove( iMouseX, iMouseY ); + m_ViewArcBall.OnMove( iMouseX, iMouseY ); + } + + if( ( uMsg == WM_LBUTTONUP && m_nRotateModelButtonMask & MOUSE_LEFT_BUTTON ) || + ( uMsg == WM_MBUTTONUP && m_nRotateModelButtonMask & MOUSE_MIDDLE_BUTTON ) || + ( uMsg == WM_RBUTTONUP && m_nRotateModelButtonMask & MOUSE_RIGHT_BUTTON ) ) + { + m_WorldArcBall.OnEnd(); + } + + if( ( uMsg == WM_LBUTTONUP && m_nRotateCameraButtonMask & MOUSE_LEFT_BUTTON ) || + ( uMsg == WM_MBUTTONUP && m_nRotateCameraButtonMask & MOUSE_MIDDLE_BUTTON ) || + ( uMsg == WM_RBUTTONUP && m_nRotateCameraButtonMask & MOUSE_RIGHT_BUTTON ) ) + { + m_ViewArcBall.OnEnd(); + } + + if( uMsg == WM_CAPTURECHANGED ) + { + if( ( HWND )lParam != hWnd ) + { + if( ( m_nRotateModelButtonMask & MOUSE_LEFT_BUTTON ) || + ( m_nRotateModelButtonMask & MOUSE_MIDDLE_BUTTON ) || + ( m_nRotateModelButtonMask & MOUSE_RIGHT_BUTTON ) ) + { + m_WorldArcBall.OnEnd(); + } + + if( ( m_nRotateCameraButtonMask & MOUSE_LEFT_BUTTON ) || + ( m_nRotateCameraButtonMask & MOUSE_MIDDLE_BUTTON ) || + ( m_nRotateCameraButtonMask & MOUSE_RIGHT_BUTTON ) ) + { + m_ViewArcBall.OnEnd(); + } + } + } + + if( uMsg == WM_LBUTTONDOWN || + uMsg == WM_LBUTTONDBLCLK || + uMsg == WM_MBUTTONDOWN || + uMsg == WM_MBUTTONDBLCLK || + uMsg == WM_RBUTTONDOWN || + uMsg == WM_RBUTTONDBLCLK || + uMsg == WM_LBUTTONUP || + uMsg == WM_MBUTTONUP || + uMsg == WM_RBUTTONUP || + uMsg == WM_MOUSEWHEEL || + uMsg == WM_MOUSEMOVE ) + { + m_bDragSinceLastUpdate = true; + } + + return FALSE; +} + + + +//-------------------------------------------------------------------------------------- +// D3D9 +IDirect3DDevice9* CDXUTDirectionWidget::s_pd3d9Device = NULL; +ID3DXEffect* CDXUTDirectionWidget::s_pD3D9Effect = NULL; +ID3DXMesh* CDXUTDirectionWidget::s_pD3D9Mesh = NULL; +D3DXHANDLE CDXUTDirectionWidget::s_hRenderWith1LightNoTexture = NULL; +D3DXHANDLE CDXUTDirectionWidget::s_hMaterialDiffuseColor = NULL; +D3DXHANDLE CDXUTDirectionWidget::s_hLightDir = NULL; +D3DXHANDLE CDXUTDirectionWidget::s_hWorldViewProjection = NULL; +D3DXHANDLE CDXUTDirectionWidget::s_hWorld = NULL; + + +//-------------------------------------------------------------------------------------- +CDXUTDirectionWidget::CDXUTDirectionWidget() +{ + m_fRadius = 1.0f; + m_vDefaultDir = D3DXVECTOR3( 0, 1, 0 ); + m_vCurrentDir = m_vDefaultDir; + m_nRotateMask = MOUSE_RIGHT_BUTTON; + + D3DXMatrixIdentity( &m_mView ); + D3DXMatrixIdentity( &m_mRot ); + D3DXMatrixIdentity( &m_mRotSnapshot ); +} + + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTDirectionWidget::StaticOnD3D9CreateDevice( IDirect3DDevice9* pd3dDevice ) +{ + HRESULT hr; + + s_pd3d9Device = pd3dDevice; + + const char* g_strBuffer = + "float4 g_MaterialDiffuseColor; // Material's diffuse color\r\n" + "float3 g_LightDir; // Light's direction in world space\r\n" + "float4x4 g_mWorld; // World matrix for object\r\n" + "float4x4 g_mWorldViewProjection; // World * View * Projection matrix\r\n" + "\r\n" + "struct VS_OUTPUT\r\n" + "{\r\n" + " float4 Position : POSITION; // vertex position\r\n" + " float4 Diffuse : COLOR0; // vertex diffuse color\r\n" + "};\r\n" + "\r\n" + "VS_OUTPUT RenderWith1LightNoTextureVS( float4 vPos : POSITION,\r\n" + " float3 vNormal : NORMAL )\r\n" + "{\r\n" + " VS_OUTPUT Output;\r\n" + "\r\n" + " // Transform the position from object space to homogeneous projection space\r\n" + " Output.Position = mul(vPos, g_mWorldViewProjection);\r\n" + "\r\n" + " // Transform the normal from object space to world space\r\n" + " float3 vNormalWorldSpace;\r\n" + " vNormalWorldSpace = normalize(mul(vNormal, (float3x3)g_mWorld)); // normal (world space)\r\n" + "\r\n" + " // Compute simple directional lighting equation\r\n" + " Output.Diffuse.rgb = g_MaterialDiffuseColor * max(0,dot(vNormalWorldSpace, g_LightDir));\r\n" + " Output.Diffuse.a = 1.0f;\r\n" + "\r\n" + " return Output;\r\n" + "}\r\n" + "\r\n" + "float4 RenderWith1LightNoTexturePS( float4 Diffuse : COLOR0 ) : COLOR0\r\n" + "{\r\n" + " return Diffuse;\r\n" + "}\r\n" + "\r\n" + "technique RenderWith1LightNoTexture\r\n" + "{\r\n" + " pass P0\r\n" + " {\r\n" + " VertexShader = compile vs_2_0 RenderWith1LightNoTextureVS();\r\n" + " PixelShader = compile ps_2_0 RenderWith1LightNoTexturePS();\r\n" + " }\r\n" + "}\r\n" + ""; + + UINT dwBufferSize = ( UINT )strlen( g_strBuffer ) + 1; + + V_RETURN( D3DXCreateEffect( s_pd3d9Device, g_strBuffer, dwBufferSize, NULL, NULL, D3DXFX_NOT_CLONEABLE, + NULL, &s_pD3D9Effect, NULL ) ); + + // Save technique handles for use when rendering + s_hRenderWith1LightNoTexture = s_pD3D9Effect->GetTechniqueByName( "RenderWith1LightNoTexture" ); + s_hMaterialDiffuseColor = s_pD3D9Effect->GetParameterByName( NULL, "g_MaterialDiffuseColor" ); + s_hLightDir = s_pD3D9Effect->GetParameterByName( NULL, "g_LightDir" ); + s_hWorld = s_pD3D9Effect->GetParameterByName( NULL, "g_mWorld" ); + s_hWorldViewProjection = s_pD3D9Effect->GetParameterByName( NULL, "g_mWorldViewProjection" ); + + // Load the mesh with D3DX and get back a ID3DXMesh*. For this + // sample we'll ignore the X file's embedded materials since we know + // exactly the model we're loading. See the mesh samples such as + // "OptimizedMesh" for a more generic mesh loading example. + V_RETURN( DXUTCreateArrowMeshFromInternalArray( s_pd3d9Device, &s_pD3D9Mesh ) ); + + // Optimize the mesh for this graphics card's vertex cache + // so when rendering the mesh's triangle list the vertices will + // cache hit more often so it won't have to re-execute the vertex shader + // on those vertices so it will improve perf. + DWORD* rgdwAdjacency = new DWORD[s_pD3D9Mesh->GetNumFaces() * 3]; + if( rgdwAdjacency == NULL ) + return E_OUTOFMEMORY; + V( s_pD3D9Mesh->GenerateAdjacency( 1e-6f, rgdwAdjacency ) ); + V( s_pD3D9Mesh->OptimizeInplace( D3DXMESHOPT_VERTEXCACHE, rgdwAdjacency, NULL, NULL, NULL ) ); + delete []rgdwAdjacency; + + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTDirectionWidget::OnD3D9ResetDevice( const D3DSURFACE_DESC* pBackBufferSurfaceDesc ) +{ + m_ArcBall.SetWindow( pBackBufferSurfaceDesc->Width, pBackBufferSurfaceDesc->Height ); + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +void CDXUTDirectionWidget::StaticOnD3D9LostDevice() +{ + if( s_pD3D9Effect ) + s_pD3D9Effect->OnLostDevice(); +} + + +//-------------------------------------------------------------------------------------- +void CDXUTDirectionWidget::StaticOnD3D9DestroyDevice() +{ + SAFE_RELEASE( s_pD3D9Effect ); + SAFE_RELEASE( s_pD3D9Mesh ); +} + + +//-------------------------------------------------------------------------------------- +LRESULT CDXUTDirectionWidget::HandleMessages( HWND hWnd, UINT uMsg, + WPARAM wParam, LPARAM lParam ) +{ + switch( uMsg ) + { + case WM_LBUTTONDOWN: + case WM_MBUTTONDOWN: + case WM_RBUTTONDOWN: + { + if( ( ( m_nRotateMask & MOUSE_LEFT_BUTTON ) != 0 && uMsg == WM_LBUTTONDOWN ) || + ( ( m_nRotateMask & MOUSE_MIDDLE_BUTTON ) != 0 && uMsg == WM_MBUTTONDOWN ) || + ( ( m_nRotateMask & MOUSE_RIGHT_BUTTON ) != 0 && uMsg == WM_RBUTTONDOWN ) ) + { + int iMouseX = ( int )( short )LOWORD( lParam ); + int iMouseY = ( int )( short )HIWORD( lParam ); + m_ArcBall.OnBegin( iMouseX, iMouseY ); + SetCapture( hWnd ); + } + return TRUE; + } + + case WM_MOUSEMOVE: + { + if( m_ArcBall.IsBeingDragged() ) + { + int iMouseX = ( int )( short )LOWORD( lParam ); + int iMouseY = ( int )( short )HIWORD( lParam ); + m_ArcBall.OnMove( iMouseX, iMouseY ); + UpdateLightDir(); + } + return TRUE; + } + + case WM_LBUTTONUP: + case WM_MBUTTONUP: + case WM_RBUTTONUP: + { + if( ( ( m_nRotateMask & MOUSE_LEFT_BUTTON ) != 0 && uMsg == WM_LBUTTONUP ) || + ( ( m_nRotateMask & MOUSE_MIDDLE_BUTTON ) != 0 && uMsg == WM_MBUTTONUP ) || + ( ( m_nRotateMask & MOUSE_RIGHT_BUTTON ) != 0 && uMsg == WM_RBUTTONUP ) ) + { + m_ArcBall.OnEnd(); + ReleaseCapture(); + } + + UpdateLightDir(); + return TRUE; + } + + case WM_CAPTURECHANGED: + { + if( ( HWND )lParam != hWnd ) + { + if( ( m_nRotateMask & MOUSE_LEFT_BUTTON ) || + ( m_nRotateMask & MOUSE_MIDDLE_BUTTON ) || + ( m_nRotateMask & MOUSE_RIGHT_BUTTON ) ) + { + m_ArcBall.OnEnd(); + ReleaseCapture(); + } + } + return TRUE; + } + } + + return 0; +} + + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTDirectionWidget::OnRender9( D3DXCOLOR color, const D3DXMATRIX* pmView, + const D3DXMATRIX* pmProj, const D3DXVECTOR3* pEyePt ) +{ + m_mView = *pmView; + + // Render the light spheres so the user can visually see the light dir + UINT iPass, cPasses; + D3DXMATRIX mRotate; + D3DXMATRIX mScale; + D3DXMATRIX mTrans; + D3DXMATRIXA16 mWorldViewProj; + HRESULT hr; + + V( s_pD3D9Effect->SetTechnique( s_hRenderWith1LightNoTexture ) ); + V( s_pD3D9Effect->SetVector( s_hMaterialDiffuseColor, ( D3DXVECTOR4* )&color ) ); + + D3DXVECTOR3 vEyePt; + D3DXVec3Normalize( &vEyePt, pEyePt ); + V( s_pD3D9Effect->SetValue( s_hLightDir, &vEyePt, sizeof( D3DXVECTOR3 ) ) ); + + // Rotate arrow model to point towards origin + D3DXMATRIX mRotateA, mRotateB; + D3DXVECTOR3 vAt = D3DXVECTOR3( 0, 0, 0 ); + D3DXVECTOR3 vUp = D3DXVECTOR3( 0, 1, 0 ); + D3DXMatrixRotationX( &mRotateB, D3DX_PI ); + D3DXMatrixLookAtLH( &mRotateA, &m_vCurrentDir, &vAt, &vUp ); + D3DXMatrixInverse( &mRotateA, NULL, &mRotateA ); + mRotate = mRotateB * mRotateA; + + D3DXVECTOR3 vL = m_vCurrentDir * m_fRadius * 1.0f; + D3DXMatrixTranslation( &mTrans, vL.x, vL.y, vL.z ); + D3DXMatrixScaling( &mScale, m_fRadius * 0.2f, m_fRadius * 0.2f, m_fRadius * 0.2f ); + + D3DXMATRIX mWorld = mRotate * mScale * mTrans; + mWorldViewProj = mWorld * ( m_mView )*( *pmProj ); + + V( s_pD3D9Effect->SetMatrix( s_hWorldViewProjection, &mWorldViewProj ) ); + V( s_pD3D9Effect->SetMatrix( s_hWorld, &mWorld ) ); + + for( int iSubset = 0; iSubset < 2; iSubset++ ) + { + V( s_pD3D9Effect->Begin( &cPasses, 0 ) ); + for( iPass = 0; iPass < cPasses; iPass++ ) + { + V( s_pD3D9Effect->BeginPass( iPass ) ); + V( s_pD3D9Mesh->DrawSubset( iSubset ) ); + V( s_pD3D9Effect->EndPass() ); + } + V( s_pD3D9Effect->End() ); + } + + return S_OK; +} + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTDirectionWidget::UpdateLightDir() +{ + D3DXMATRIX mInvView; + D3DXMatrixInverse( &mInvView, NULL, &m_mView ); + mInvView._41 = mInvView._42 = mInvView._43 = 0; + + D3DXMATRIX mLastRotInv; + D3DXMatrixInverse( &mLastRotInv, NULL, &m_mRotSnapshot ); + + D3DXMATRIX mRot = *m_ArcBall.GetRotationMatrix(); + m_mRotSnapshot = mRot; + + // Accumulate the delta of the arcball's rotation in view space. + // Note that per-frame delta rotations could be problematic over long periods of time. + m_mRot *= m_mView * mLastRotInv * mRot * mInvView; + + // Since we're accumulating delta rotations, we need to orthonormalize + // the matrix to prevent eventual matrix skew + D3DXVECTOR3* pXBasis = ( D3DXVECTOR3* )&m_mRot._11; + D3DXVECTOR3* pYBasis = ( D3DXVECTOR3* )&m_mRot._21; + D3DXVECTOR3* pZBasis = ( D3DXVECTOR3* )&m_mRot._31; + D3DXVec3Normalize( pXBasis, pXBasis ); + D3DXVec3Cross( pYBasis, pZBasis, pXBasis ); + D3DXVec3Normalize( pYBasis, pYBasis ); + D3DXVec3Cross( pZBasis, pXBasis, pYBasis ); + + // Transform the default direction vector by the light's rotation matrix + D3DXVec3TransformNormal( &m_vCurrentDir, &m_vDefaultDir, &m_mRot ); + + return S_OK; +} + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTDirectionWidget::StaticOnD3D11CreateDevice( ID3D11Device* pd3dDevice, ID3D11DeviceContext* pd3dImmediateContext ) +{ + + + //s_pd3d10Device = pd3dDevice; + + //const char* g_strBuffer = + // "float4 g_MaterialDiffuseColor; // Material's diffuse color\r\n" + // "float4 g_LightDir; // Light's direction in world space\r\n" + // "float4x4 g_mWorld; // World matrix for object\r\n" + // "float4x4 g_mWorldViewProjection; // World * View * Projection matrix\r\n" + // "\r\n" + // "struct VS_OUTPUT\r\n" + // "{\r\n" + // " float4 Position : SV_POSITION; // vertex position\r\n" + // " float4 Diffuse : COLOR0; // vertex diffuse color\r\n" + // "};\r\n" + // "\r\n" + // "VS_OUTPUT RenderWith1LightNoTextureVS( float3 vPos : POSITION,\r\n" + // " float3 vNormal : NORMAL )\r\n" + // "{\r\n" + // " VS_OUTPUT Output;\r\n" + // "\r\n" + // " // Transform the position from object space to homogeneous projection space\r\n" + // " Output.Position = mul( float4(vPos,1), g_mWorldViewProjection);\r\n" + // "\r\n" + // " // Transform the normal from object space to world space\r\n" + // " float3 vNormalWorldSpace;\r\n" + // " vNormalWorldSpace = normalize(mul(vNormal, (float3x3)g_mWorld)); // normal (world space)\r\n" + // "\r\n" + // " // Compute simple directional lighting equation\r\n" + // " Output.Diffuse.rgb = g_MaterialDiffuseColor * max(0,dot(vNormalWorldSpace, g_LightDir));\r\n" + // " Output.Diffuse.a = 1.0f;\r\n" + // "\r\n" + // " return Output;\r\n" + // "}\r\n" + // "\r\n" + // "float4 RenderWith1LightNoTexturePS( VS_OUTPUT Input ) : SV_TARGET\r\n" + // "{\r\n" + // " return Input.Diffuse;\r\n" + // "}\r\n" + // "\r\n" + // "technique10 RenderWith1LightNoTexture\r\n" + // "{\r\n" + // " pass p0\r\n" + // " {\r\n" + // " SetVertexShader( CompileShader( vs_4_0, RenderWith1LightNoTextureVS() ) );\r\n" + // " SetGeometryShader( NULL );\r\n" + // " SetPixelShader( CompileShader( ps_4_0, RenderWith1LightNoTexturePS() ) );\r\n" + // " }\r\n" + // "}\r\n" + // ""; + + //UINT dwBufferSize = ( UINT )strlen( g_strBuffer ) + 1; + + //HRESULT hr = D3DX10CreateEffectFromMemory( g_strBuffer, dwBufferSize, "None", NULL, NULL, "fx_4_0", + // D3D10_SHADER_ENABLE_STRICTNESS, 0, pd3dDevice, NULL, + // NULL, &s_pD3D10Effect, NULL, NULL ); + //if( FAILED( hr ) ) + // return hr; + + //s_pRenderTech = s_pD3D10Effect->GetTechniqueByName( "RenderWith1LightNoTexture" ); + //g_pMaterialDiffuseColor = s_pD3D10Effect->GetVariableByName( "g_MaterialDiffuseColor" )->AsVector(); + //g_pLightDir = s_pD3D10Effect->GetVariableByName( "g_LightDir" )->AsVector(); + //g_pmWorld = s_pD3D10Effect->GetVariableByName( "g_mWorld" )->AsMatrix(); + //g_pmWorldViewProjection = s_pD3D10Effect->GetVariableByName( "g_mWorldViewProjection" )->AsMatrix(); + + //const D3D10_INPUT_ELEMENT_DESC layout[] = + //{ + // { "POSITION", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 0, D3D10_INPUT_PER_VERTEX_DATA, 0 }, + // { "NORMAL", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 12, D3D10_INPUT_PER_VERTEX_DATA, 0 }, + //}; + //D3D10_PASS_DESC PassDesc; + //V_RETURN( s_pRenderTech->GetPassByIndex( 0 )->GetDesc( &PassDesc ) ); + //V_RETURN( pd3dDevice->CreateInputLayout( layout, 2, PassDesc.pIAInputSignature, + // PassDesc.IAInputSignatureSize, &s_pVertexLayout ) ); + + //TODO: Add loading code here + + return S_OK; +} + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTDirectionWidget::OnRender11( D3DXCOLOR color, const D3DXMATRIX* pmView, const D3DXMATRIX* pmProj, + const D3DXVECTOR3* pEyePt ) +{ + // NO D3DX11 YET + // m_mView = *pmView; + + // // Render the light spheres so the user can visually see the light dir + // D3DXMATRIX mRotate; + // D3DXMATRIX mScale; + // D3DXMATRIX mTrans; + // D3DXMATRIXA16 mWorldViewProj; + + // g_pMaterialDiffuseColor->SetFloatVector( ( float* )&color ); + // D3DXVECTOR3 vEyePt; + // D3DXVec3Normalize( &vEyePt, pEyePt ); + // g_pLightDir->SetFloatVector( ( float* )&vEyePt ); + + // // Rotate arrow model to point towards origin + // D3DXMATRIX mRotateA, mRotateB; + // D3DXVECTOR3 vAt = D3DXVECTOR3( 0, 0, 0 ); + // D3DXVECTOR3 vUp = D3DXVECTOR3( 0, 1, 0 ); + // D3DXMatrixRotationX( &mRotateB, D3DX_PI ); + // D3DXMatrixLookAtLH( &mRotateA, &m_vCurrentDir, &vAt, &vUp ); + // D3DXMatrixInverse( &mRotateA, NULL, &mRotateA ); + // mRotate = mRotateB * mRotateA; + + // D3DXVECTOR3 vL = m_vCurrentDir * m_fRadius * 1.0f; + // D3DXMatrixTranslation( &mTrans, vL.x, vL.y, vL.z ); + // D3DXMatrixScaling( &mScale, m_fRadius * 0.2f, m_fRadius * 0.2f, m_fRadius * 0.2f ); + + // D3DXMATRIX mWorld = mRotate * mScale * mTrans; + // mWorldViewProj = mWorld * ( m_mView )*( *pmProj ); + + // g_pmWorldViewProjection->SetMatrix( ( float* )&mWorldViewProj ); + // g_pmWorld->SetMatrix( ( float* )&mWorld ); + + // s_pd3d10Device->IASetInputLayout( s_pVertexLayout ); + + //TODO: Add rendering code here + + return S_OK; +} + +//-------------------------------------------------------------------------------------- +void CDXUTDirectionWidget::StaticOnD3D11DestroyDevice() +{ +// SAFE_RELEASE( s_pVertexLayout ); +// SAFE_RELEASE( s_pD3D11Effect ); +} diff --git a/Demos/DX11ClothDemo/DXUT/Optional/DXUTcamera.h b/Demos/DX11ClothDemo/DXUT/Optional/DXUTcamera.h new file mode 100644 index 000000000..6325fa81b --- /dev/null +++ b/Demos/DX11ClothDemo/DXUT/Optional/DXUTcamera.h @@ -0,0 +1,517 @@ +//-------------------------------------------------------------------------------------- +// File: Camera.h +// +// Helper functions for Direct3D programming. +// +// Copyright (c) Microsoft Corporation. All rights reserved +//-------------------------------------------------------------------------------------- +#pragma once +#ifndef CAMERA_H +#define CAMERA_H + +//-------------------------------------------------------------------------------------- +class CD3DArcBall +{ +public: + CD3DArcBall(); + + // Functions to change behavior + void Reset(); + void SetTranslationRadius( FLOAT fRadiusTranslation ) + { + m_fRadiusTranslation = fRadiusTranslation; + } + void SetWindow( INT nWidth, INT nHeight, FLOAT fRadius = 0.9f ) + { + m_nWidth = nWidth; m_nHeight = nHeight; m_fRadius = fRadius; + m_vCenter = D3DXVECTOR2( m_nWidth / 2.0f, m_nHeight / 2.0f ); + } + void SetOffset( INT nX, INT nY ) + { + m_Offset.x = nX; m_Offset.y = nY; + } + + // Call these from client and use GetRotationMatrix() to read new rotation matrix + void OnBegin( int nX, int nY ); // start the rotation (pass current mouse position) + void OnMove( int nX, int nY ); // continue the rotation (pass current mouse position) + void OnEnd(); // end the rotation + + // Or call this to automatically handle left, middle, right buttons + LRESULT HandleMessages( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ); + + // Functions to get/set state + const D3DXMATRIX* GetRotationMatrix() + { + return D3DXMatrixRotationQuaternion( &m_mRotation, &m_qNow ); + }; + const D3DXMATRIX* GetTranslationMatrix() const + { + return &m_mTranslation; + } + const D3DXMATRIX* GetTranslationDeltaMatrix() const + { + return &m_mTranslationDelta; + } + bool IsBeingDragged() const + { + return m_bDrag; + } + D3DXQUATERNION GetQuatNow() const + { + return m_qNow; + } + void SetQuatNow( D3DXQUATERNION q ) + { + m_qNow = q; + } + + static D3DXQUATERNION WINAPI QuatFromBallPoints( const D3DXVECTOR3& vFrom, const D3DXVECTOR3& vTo ); + + +protected: + D3DXMATRIXA16 m_mRotation; // Matrix for arc ball's orientation + D3DXMATRIXA16 m_mTranslation; // Matrix for arc ball's position + D3DXMATRIXA16 m_mTranslationDelta; // Matrix for arc ball's position + + POINT m_Offset; // window offset, or upper-left corner of window + INT m_nWidth; // arc ball's window width + INT m_nHeight; // arc ball's window height + D3DXVECTOR2 m_vCenter; // center of arc ball + FLOAT m_fRadius; // arc ball's radius in screen coords + FLOAT m_fRadiusTranslation; // arc ball's radius for translating the target + + D3DXQUATERNION m_qDown; // Quaternion before button down + D3DXQUATERNION m_qNow; // Composite quaternion for current drag + bool m_bDrag; // Whether user is dragging arc ball + + POINT m_ptLastMouse; // position of last mouse point + D3DXVECTOR3 m_vDownPt; // starting point of rotation arc + D3DXVECTOR3 m_vCurrentPt; // current point of rotation arc + + D3DXVECTOR3 ScreenToVector( float fScreenPtX, float fScreenPtY ); +}; + + +//-------------------------------------------------------------------------------------- +// used by CCamera to map WM_KEYDOWN keys +//-------------------------------------------------------------------------------------- +enum D3DUtil_CameraKeys +{ + CAM_STRAFE_LEFT = 0, + CAM_STRAFE_RIGHT, + CAM_MOVE_FORWARD, + CAM_MOVE_BACKWARD, + CAM_MOVE_UP, + CAM_MOVE_DOWN, + CAM_RESET, + CAM_CONTROLDOWN, + CAM_MAX_KEYS, + CAM_UNKNOWN = 0xFF +}; + +#define KEY_WAS_DOWN_MASK 0x80 +#define KEY_IS_DOWN_MASK 0x01 + +#define MOUSE_LEFT_BUTTON 0x01 +#define MOUSE_MIDDLE_BUTTON 0x02 +#define MOUSE_RIGHT_BUTTON 0x04 +#define MOUSE_WHEEL 0x08 + + +//-------------------------------------------------------------------------------------- +// Simple base camera class that moves and rotates. The base class +// records mouse and keyboard input for use by a derived class, and +// keeps common state. +//-------------------------------------------------------------------------------------- +class CBaseCamera +{ +public: + CBaseCamera(); + + // Call these from client and use Get*Matrix() to read new matrices + virtual LRESULT HandleMessages( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ); + virtual void FrameMove( FLOAT fElapsedTime ) = 0; + + // Functions to change camera matrices + virtual void Reset(); + virtual void SetViewParams( D3DXVECTOR3* pvEyePt, D3DXVECTOR3* pvLookatPt ); + virtual void SetProjParams( FLOAT fFOV, FLOAT fAspect, FLOAT fNearPlane, FLOAT fFarPlane ); + + // Functions to change behavior + virtual void SetDragRect( RECT& rc ) + { + m_rcDrag = rc; + } + void SetInvertPitch( bool bInvertPitch ) + { + m_bInvertPitch = bInvertPitch; + } + void SetDrag( bool bMovementDrag, FLOAT fTotalDragTimeToZero = 0.25f ) + { + m_bMovementDrag = bMovementDrag; m_fTotalDragTimeToZero = fTotalDragTimeToZero; + } + void SetEnableYAxisMovement( bool bEnableYAxisMovement ) + { + m_bEnableYAxisMovement = bEnableYAxisMovement; + } + void SetEnablePositionMovement( bool bEnablePositionMovement ) + { + m_bEnablePositionMovement = bEnablePositionMovement; + } + void SetClipToBoundary( bool bClipToBoundary, D3DXVECTOR3* pvMinBoundary, + D3DXVECTOR3* pvMaxBoundary ) + { + m_bClipToBoundary = bClipToBoundary; if( pvMinBoundary ) m_vMinBoundary = *pvMinBoundary; + if( pvMaxBoundary ) m_vMaxBoundary = *pvMaxBoundary; + } + void SetScalers( FLOAT fRotationScaler = 0.01f, FLOAT fMoveScaler = 5.0f ) + { + m_fRotationScaler = fRotationScaler; m_fMoveScaler = fMoveScaler; + } + void SetNumberOfFramesToSmoothMouseData( int nFrames ) + { + if( nFrames > 0 ) m_fFramesToSmoothMouseData = ( float )nFrames; + } + void SetResetCursorAfterMove( bool bResetCursorAfterMove ) + { + m_bResetCursorAfterMove = bResetCursorAfterMove; + } + + // Functions to get state + const D3DXMATRIX* GetViewMatrix() const + { + return &m_mView; + } + const D3DXMATRIX* GetProjMatrix() const + { + return &m_mProj; + } + const D3DXVECTOR3* GetEyePt() const + { + return &m_vEye; + } + const D3DXVECTOR3* GetLookAtPt() const + { + return &m_vLookAt; + } + float GetNearClip() const + { + return m_fNearPlane; + } + float GetFarClip() const + { + return m_fFarPlane; + } + + bool IsBeingDragged() const + { + return ( m_bMouseLButtonDown || m_bMouseMButtonDown || m_bMouseRButtonDown ); + } + bool IsMouseLButtonDown() const + { + return m_bMouseLButtonDown; + } + bool IsMouseMButtonDown() const + { + return m_bMouseMButtonDown; + } + bool IsMouseRButtonDown() const + { + return m_bMouseRButtonDown; + } + +protected: + // Functions to map a WM_KEYDOWN key to a D3DUtil_CameraKeys enum + virtual D3DUtil_CameraKeys MapKey( UINT nKey ); + bool IsKeyDown( BYTE key ) const + { + return( ( key & KEY_IS_DOWN_MASK ) == KEY_IS_DOWN_MASK ); + } + bool WasKeyDown( BYTE key ) const + { + return( ( key & KEY_WAS_DOWN_MASK ) == KEY_WAS_DOWN_MASK ); + } + + void ConstrainToBoundary( D3DXVECTOR3* pV ); + void UpdateMouseDelta(); + void UpdateVelocity( float fElapsedTime ); + void GetInput( bool bGetKeyboardInput, bool bGetMouseInput, bool bGetGamepadInput, + bool bResetCursorAfterMove ); + + D3DXMATRIX m_mView; // View matrix + D3DXMATRIX m_mProj; // Projection matrix + + DXUT_GAMEPAD m_GamePad[DXUT_MAX_CONTROLLERS]; // XInput controller state + D3DXVECTOR3 m_vGamePadLeftThumb; + D3DXVECTOR3 m_vGamePadRightThumb; + double m_GamePadLastActive[DXUT_MAX_CONTROLLERS]; + + int m_cKeysDown; // Number of camera keys that are down. + BYTE m_aKeys[CAM_MAX_KEYS]; // State of input - KEY_WAS_DOWN_MASK|KEY_IS_DOWN_MASK + D3DXVECTOR3 m_vKeyboardDirection; // Direction vector of keyboard input + POINT m_ptLastMousePosition; // Last absolute position of mouse cursor + bool m_bMouseLButtonDown; // True if left button is down + bool m_bMouseMButtonDown; // True if middle button is down + bool m_bMouseRButtonDown; // True if right button is down + int m_nCurrentButtonMask; // mask of which buttons are down + int m_nMouseWheelDelta; // Amount of middle wheel scroll (+/-) + D3DXVECTOR2 m_vMouseDelta; // Mouse relative delta smoothed over a few frames + float m_fFramesToSmoothMouseData; // Number of frames to smooth mouse data over + + D3DXVECTOR3 m_vDefaultEye; // Default camera eye position + D3DXVECTOR3 m_vDefaultLookAt; // Default LookAt position + D3DXVECTOR3 m_vEye; // Camera eye position + D3DXVECTOR3 m_vLookAt; // LookAt position + float m_fCameraYawAngle; // Yaw angle of camera + float m_fCameraPitchAngle; // Pitch angle of camera + + RECT m_rcDrag; // Rectangle within which a drag can be initiated. + D3DXVECTOR3 m_vVelocity; // Velocity of camera + bool m_bMovementDrag; // If true, then camera movement will slow to a stop otherwise movement is instant + D3DXVECTOR3 m_vVelocityDrag; // Velocity drag force + FLOAT m_fDragTimer; // Countdown timer to apply drag + FLOAT m_fTotalDragTimeToZero; // Time it takes for velocity to go from full to 0 + D3DXVECTOR2 m_vRotVelocity; // Velocity of camera + + float m_fFOV; // Field of view + float m_fAspect; // Aspect ratio + float m_fNearPlane; // Near plane + float m_fFarPlane; // Far plane + + float m_fRotationScaler; // Scaler for rotation + float m_fMoveScaler; // Scaler for movement + + bool m_bInvertPitch; // Invert the pitch axis + bool m_bEnablePositionMovement; // If true, then the user can translate the camera/model + bool m_bEnableYAxisMovement; // If true, then camera can move in the y-axis + + bool m_bClipToBoundary; // If true, then the camera will be clipped to the boundary + D3DXVECTOR3 m_vMinBoundary; // Min point in clip boundary + D3DXVECTOR3 m_vMaxBoundary; // Max point in clip boundary + + bool m_bResetCursorAfterMove;// If true, the class will reset the cursor position so that the cursor always has space to move +}; + + +//-------------------------------------------------------------------------------------- +// Simple first person camera class that moves and rotates. +// It allows yaw and pitch but not roll. It uses WM_KEYDOWN and +// GetCursorPos() to respond to keyboard and mouse input and updates the +// view matrix based on input. +//-------------------------------------------------------------------------------------- +class CFirstPersonCamera : public CBaseCamera +{ +public: + CFirstPersonCamera(); + + // Call these from client and use Get*Matrix() to read new matrices + virtual void FrameMove( FLOAT fElapsedTime ); + + // Functions to change behavior + void SetRotateButtons( bool bLeft, bool bMiddle, bool bRight, bool bRotateWithoutButtonDown = false ); + + // Functions to get state + D3DXMATRIX* GetWorldMatrix() + { + return &m_mCameraWorld; + } + + const D3DXVECTOR3* GetWorldRight() const + { + return ( D3DXVECTOR3* )&m_mCameraWorld._11; + } + const D3DXVECTOR3* GetWorldUp() const + { + return ( D3DXVECTOR3* )&m_mCameraWorld._21; + } + const D3DXVECTOR3* GetWorldAhead() const + { + return ( D3DXVECTOR3* )&m_mCameraWorld._31; + } + const D3DXVECTOR3* GetEyePt() const + { + return ( D3DXVECTOR3* )&m_mCameraWorld._41; + } + +protected: + D3DXMATRIX m_mCameraWorld; // World matrix of the camera (inverse of the view matrix) + + int m_nActiveButtonMask; // Mask to determine which button to enable for rotation + bool m_bRotateWithoutButtonDown; +}; + + +//-------------------------------------------------------------------------------------- +// Simple model viewing camera class that rotates around the object. +//-------------------------------------------------------------------------------------- +class CModelViewerCamera : public CBaseCamera +{ +public: + CModelViewerCamera(); + + // Call these from client and use Get*Matrix() to read new matrices + virtual LRESULT HandleMessages( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ); + virtual void FrameMove( FLOAT fElapsedTime ); + + + // Functions to change behavior + virtual void SetDragRect( RECT& rc ); + void Reset(); + void SetViewParams( D3DXVECTOR3* pvEyePt, D3DXVECTOR3* pvLookatPt ); + void SetButtonMasks( int nRotateModelButtonMask = MOUSE_LEFT_BUTTON, int nZoomButtonMask = MOUSE_WHEEL, + int nRotateCameraButtonMask = MOUSE_RIGHT_BUTTON ) + { + m_nRotateModelButtonMask = nRotateModelButtonMask, m_nZoomButtonMask = nZoomButtonMask; + m_nRotateCameraButtonMask = nRotateCameraButtonMask; + } + void SetAttachCameraToModel( bool bEnable = false ) + { + m_bAttachCameraToModel = bEnable; + } + void SetWindow( int nWidth, int nHeight, float fArcballRadius=0.9f ) + { + m_WorldArcBall.SetWindow( nWidth, nHeight, fArcballRadius ); + m_ViewArcBall.SetWindow( nWidth, nHeight, fArcballRadius ); + } + void SetRadius( float fDefaultRadius=5.0f, float fMinRadius=1.0f, float fMaxRadius=FLT_MAX ) + { + m_fDefaultRadius = m_fRadius = fDefaultRadius; m_fMinRadius = fMinRadius; m_fMaxRadius = fMaxRadius; + m_bDragSinceLastUpdate = true; + } + void SetModelCenter( D3DXVECTOR3 vModelCenter ) + { + m_vModelCenter = vModelCenter; + } + void SetLimitPitch( bool bLimitPitch ) + { + m_bLimitPitch = bLimitPitch; + } + void SetViewQuat( D3DXQUATERNION q ) + { + m_ViewArcBall.SetQuatNow( q ); m_bDragSinceLastUpdate = true; + } + void SetWorldQuat( D3DXQUATERNION q ) + { + m_WorldArcBall.SetQuatNow( q ); m_bDragSinceLastUpdate = true; + } + + // Functions to get state + const D3DXMATRIX* GetWorldMatrix() const + { + return &m_mWorld; + } + void SetWorldMatrix( D3DXMATRIX& mWorld ) + { + m_mWorld = mWorld; m_bDragSinceLastUpdate = true; + } + +protected: + CD3DArcBall m_WorldArcBall; + CD3DArcBall m_ViewArcBall; + D3DXVECTOR3 m_vModelCenter; + D3DXMATRIX m_mModelLastRot; // Last arcball rotation matrix for model + D3DXMATRIX m_mModelRot; // Rotation matrix of model + D3DXMATRIX m_mWorld; // World matrix of model + + int m_nRotateModelButtonMask; + int m_nZoomButtonMask; + int m_nRotateCameraButtonMask; + + bool m_bAttachCameraToModel; + bool m_bLimitPitch; + float m_fRadius; // Distance from the camera to model + float m_fDefaultRadius; // Distance from the camera to model + float m_fMinRadius; // Min radius + float m_fMaxRadius; // Max radius + bool m_bDragSinceLastUpdate; // True if mouse drag has happened since last time FrameMove is called. + + D3DXMATRIX m_mCameraRotLast; + +}; + +//-------------------------------------------------------------------------------------- +// Manages the mesh, direction, mouse events of a directional arrow that +// rotates around a radius controlled by an arcball +//-------------------------------------------------------------------------------------- +class CDXUTDirectionWidget +{ +public: + CDXUTDirectionWidget(); + + static HRESULT WINAPI StaticOnD3D9CreateDevice( IDirect3DDevice9* pd3dDevice ); + HRESULT OnD3D9ResetDevice( const D3DSURFACE_DESC* pBackBufferSurfaceDesc ); + HRESULT OnRender9( D3DXCOLOR color, const D3DXMATRIX* pmView, const D3DXMATRIX* pmProj, + const D3DXVECTOR3* pEyePt ); + LRESULT HandleMessages( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ); + static void WINAPI StaticOnD3D9LostDevice(); + static void WINAPI StaticOnD3D9DestroyDevice(); + + static HRESULT WINAPI StaticOnD3D11CreateDevice( ID3D11Device* pd3dDevice, ID3D11DeviceContext* pd3dImmediateContext ); + HRESULT OnRender11( D3DXCOLOR color, const D3DXMATRIX* pmView, const D3DXMATRIX* pmProj, + const D3DXVECTOR3* pEyePt ); + static void WINAPI StaticOnD3D11DestroyDevice(); + + D3DXVECTOR3 GetLightDirection() + { + return m_vCurrentDir; + }; + void SetLightDirection( D3DXVECTOR3 vDir ) + { + m_vDefaultDir = m_vCurrentDir = vDir; + }; + void SetButtonMask( int nRotate = MOUSE_RIGHT_BUTTON ) + { + m_nRotateMask = nRotate; + } + + float GetRadius() + { + return m_fRadius; + }; + void SetRadius( float fRadius ) + { + m_fRadius = fRadius; + }; + + bool IsBeingDragged() + { + return m_ArcBall.IsBeingDragged(); + }; + +protected: + HRESULT UpdateLightDir(); + + // D3D9 objects + static IDirect3DDevice9* s_pd3d9Device; + static ID3DXEffect* s_pD3D9Effect; + static ID3DXMesh* s_pD3D9Mesh; + static D3DXHANDLE s_hRenderWith1LightNoTexture; + static D3DXHANDLE s_hMaterialDiffuseColor; + static D3DXHANDLE s_hLightDir; + static D3DXHANDLE s_hWorldViewProjection; + static D3DXHANDLE s_hWorld; + + // D3D10 objects + //static ID3D10Device* s_pd3d10Device; + //static ID3D10Effect* s_pD3D10Effect; + //TODO: add some sort of d3d10 mesh object here + //static ID3D10InputLayout* s_pVertexLayout; + //static ID3D10EffectTechnique* s_pRenderTech; + //static ID3D10EffectVectorVariable* g_pMaterialDiffuseColor; + //static ID3D10EffectVectorVariable* g_pLightDir; + //static ID3D10EffectMatrixVariable* g_pmWorld; + //static ID3D10EffectMatrixVariable* g_pmWorldViewProjection; + + D3DXMATRIXA16 m_mRot; + D3DXMATRIXA16 m_mRotSnapshot; + float m_fRadius; + int m_nRotateMask; + CD3DArcBall m_ArcBall; + D3DXVECTOR3 m_vDefaultDir; + D3DXVECTOR3 m_vCurrentDir; + D3DXMATRIX m_mView; +}; + + + +#endif diff --git a/Demos/DX11ClothDemo/DXUT/Optional/DXUTgui.cpp b/Demos/DX11ClothDemo/DXUT/Optional/DXUTgui.cpp new file mode 100644 index 000000000..dba0b1718 --- /dev/null +++ b/Demos/DX11ClothDemo/DXUT/Optional/DXUTgui.cpp @@ -0,0 +1,7241 @@ +//-------------------------------------------------------------------------------------- +// File: DXUTgui.cpp +// +// Copyright (c) Microsoft Corporation. All rights reserved. +//-------------------------------------------------------------------------------------- +#include "DXUT.h" +#include "DXUTgui.h" +#include "DXUTsettingsDlg.h" +#include "DXUTres.h" + +#include "SDKMisc.h" + +#undef min // use __min instead +#undef max // use __max instead + +#ifndef WM_XBUTTONDOWN +#define WM_XBUTTONDOWN 0x020B // (not always defined) +#endif +#ifndef WM_XBUTTONUP +#define WM_XBUTTONUP 0x020C // (not always defined) +#endif +#ifndef WM_MOUSEWHEEL +#define WM_MOUSEWHEEL 0x020A // (not always defined) +#endif +#ifndef WHEEL_DELTA +#define WHEEL_DELTA 120 // (not always defined) +#endif + +// Minimum scroll bar thumb size +#define SCROLLBAR_MINTHUMBSIZE 8 + +// Delay and repeat period when clicking on the scroll bar arrows +#define SCROLLBAR_ARROWCLICK_DELAY 0.33 +#define SCROLLBAR_ARROWCLICK_REPEAT 0.05 + +#define DXUT_NEAR_BUTTON_DEPTH 0.6f +#define DXUT_FAR_BUTTON_DEPTH 0.8f + +#define DXUT_MAX_GUI_SPRITES 500 + +D3DCOLORVALUE D3DCOLOR_TO_D3DCOLORVALUE( D3DCOLOR c ) +{ + D3DCOLORVALUE cv = + { + ( ( c >> 16 ) & 0xFF ) / 255.0f, + ( ( c >> 8 ) & 0xFF ) / 255.0f, + ( c & 0xFF ) / 255.0f, + ( ( c >> 24 ) & 0xFF ) / 255.0f + }; + return cv; +} + +#define UNISCRIBE_DLLNAME L"usp10.dll" + +#define GETPROCADDRESS( Module, APIName, Temp ) \ + Temp = GetProcAddress( Module, #APIName ); \ + if( Temp ) \ + *(FARPROC*)&_##APIName = Temp + +#define PLACEHOLDERPROC( APIName ) \ + _##APIName = Dummy_##APIName + +#define IMM32_DLLNAME L"imm32.dll" +#define VER_DLLNAME L"version.dll" + +CHAR g_strUIEffectFile[] = \ + "Texture2D g_Texture;"\ + ""\ + "SamplerState Sampler"\ + "{"\ + " Filter = MIN_MAG_MIP_LINEAR;"\ + " AddressU = Wrap;"\ + " AddressV = Wrap;"\ + "};"\ + ""\ + "BlendState UIBlend"\ + "{"\ + " AlphaToCoverageEnable = FALSE;"\ + " BlendEnable[0] = TRUE;"\ + " SrcBlend = SRC_ALPHA;"\ + " DestBlend = INV_SRC_ALPHA;"\ + " BlendOp = ADD;"\ + " SrcBlendAlpha = ONE;"\ + " DestBlendAlpha = ZERO;"\ + " BlendOpAlpha = ADD;"\ + " RenderTargetWriteMask[0] = 0x0F;"\ + "};"\ + ""\ + "BlendState NoBlending"\ + "{"\ + " BlendEnable[0] = FALSE;"\ + " RenderTargetWriteMask[0] = 0x0F;"\ + "};"\ + ""\ + "DepthStencilState DisableDepth"\ + "{"\ + " DepthEnable = false;"\ + "};"\ + "DepthStencilState EnableDepth"\ + "{"\ + " DepthEnable = true;"\ + "};"\ + "struct VS_OUTPUT"\ + "{"\ + " float4 Pos : POSITION;"\ + " float4 Dif : COLOR;"\ + " float2 Tex : TEXCOORD;"\ + "};"\ + ""\ + "VS_OUTPUT VS( float3 vPos : POSITION,"\ + " float4 Dif : COLOR,"\ + " float2 vTexCoord0 : TEXCOORD )"\ + "{"\ + " VS_OUTPUT Output;"\ + ""\ + " Output.Pos = float4( vPos, 1.0f );"\ + " Output.Dif = Dif;"\ + " Output.Tex = vTexCoord0;"\ + ""\ + " return Output;"\ + "}"\ + ""\ + "float4 PS( VS_OUTPUT In ) : SV_Target"\ + "{"\ + " return g_Texture.Sample( Sampler, In.Tex ) * In.Dif;"\ + "}"\ + ""\ + "float4 PSUntex( VS_OUTPUT In ) : SV_Target"\ + "{"\ + " return In.Dif;"\ + "}"\ + ""\ + "technique10 RenderUI"\ + "{"\ + " pass P0"\ + " {"\ + " SetVertexShader( CompileShader( vs_4_0, VS() ) );"\ + " SetGeometryShader( NULL );"\ + " SetPixelShader( CompileShader( ps_4_0, PS() ) );"\ + " SetDepthStencilState( DisableDepth, 0 );"\ + " SetBlendState( UIBlend, float4( 0.0f, 0.0f, 0.0f, 0.0f ), 0xFFFFFFFF );"\ + " }"\ + "}"\ + "technique10 RenderUIUntex"\ + "{"\ + " pass P0"\ + " {"\ + " SetVertexShader( CompileShader( vs_4_0, VS() ) );"\ + " SetGeometryShader( NULL );"\ + " SetPixelShader( CompileShader( ps_4_0, PSUntex() ) );"\ + " SetDepthStencilState( DisableDepth, 0 );"\ + " SetBlendState( UIBlend, float4( 0.0f, 0.0f, 0.0f, 0.0f ), 0xFFFFFFFF );"\ + " }"\ + "}"\ + "technique10 RestoreState"\ + "{"\ + " pass P0"\ + " {"\ + " SetDepthStencilState( EnableDepth, 0 );"\ + " SetBlendState( NoBlending, float4( 0.0f, 0.0f, 0.0f, 0.0f ), 0xFFFFFFFF );"\ + " }"\ + "}"; +const UINT g_uUIEffectFileSize = sizeof( g_strUIEffectFile ); + + +// DXUT_MAX_EDITBOXLENGTH is the maximum string length allowed in edit boxes, +// including the NULL terminator. +// +// Uniscribe does not support strings having bigger-than-16-bits length. +// This means that the string must be less than 65536 characters long, +// including the NULL terminator. +#define DXUT_MAX_EDITBOXLENGTH 0xFFFF + + +double CDXUTDialog::s_fTimeRefresh = 0.0f; +CDXUTControl* CDXUTDialog::s_pControlFocus = NULL; // The control which has focus +CDXUTControl* CDXUTDialog::s_pControlPressed = NULL; // The control currently pressed + + +struct DXUT_SCREEN_VERTEX +{ + float x, y, z, h; + D3DCOLOR color; + float tu, tv; + + static DWORD FVF; +}; +DWORD DXUT_SCREEN_VERTEX::FVF = D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_TEX1; + + +struct DXUT_SCREEN_VERTEX_UNTEX +{ + float x, y, z, h; + D3DCOLOR color; + + static DWORD FVF; +}; +DWORD DXUT_SCREEN_VERTEX_UNTEX::FVF = D3DFVF_XYZRHW | D3DFVF_DIFFUSE; + + +struct DXUT_SCREEN_VERTEX_10 +{ + float x, y, z; + D3DCOLORVALUE color; + float tu, tv; +}; + + +inline int RectWidth( RECT& rc ) +{ + return ( ( rc ).right - ( rc ).left ); +} +inline int RectHeight( RECT& rc ) +{ + return ( ( rc ).bottom - ( rc ).top ); +} + + +HRESULT InitFont11( ID3D11Device* pd3d11Device, ID3D11InputLayout* pInputLayout ); +void EndFont11(); + +//-------------------------------------------------------------------------------------- +// CDXUTDialog class +//-------------------------------------------------------------------------------------- + +//-------------------------------------------------------------------------------------- +CDXUTDialog::CDXUTDialog() +{ + m_x = 0; + m_y = 0; + m_width = 0; + m_height = 0; + + m_pManager = NULL; + m_bVisible = true; + m_bCaption = false; + m_bMinimized = false; + m_bDrag = false; + m_wszCaption[0] = L'\0'; + m_nCaptionHeight = 18; + + m_colorTopLeft = 0; + m_colorTopRight = 0; + m_colorBottomLeft = 0; + m_colorBottomRight = 0; + + m_pCallbackEvent = NULL; + m_pCallbackEventUserContext = NULL; + + m_fTimeLastRefresh = 0; + + m_pControlMouseOver = NULL; + + m_pNextDialog = this; + m_pPrevDialog = this; + + m_nDefaultControlID = 0xffff; + m_bNonUserEvents = false; + m_bKeyboardInput = false; + m_bMouseInput = true; +} + + +//-------------------------------------------------------------------------------------- +CDXUTDialog::~CDXUTDialog() +{ + int i = 0; + + RemoveAllControls(); + + m_Fonts.RemoveAll(); + m_Textures.RemoveAll(); + + for( i = 0; i < m_DefaultElements.GetSize(); i++ ) + { + DXUTElementHolder* pElementHolder = m_DefaultElements.GetAt( i ); + SAFE_DELETE( pElementHolder ); + } + + m_DefaultElements.RemoveAll(); +} + + +//-------------------------------------------------------------------------------------- +void CDXUTDialog::Init( CDXUTDialogResourceManager* pManager, bool bRegisterDialog ) +{ + m_pManager = pManager; + if( bRegisterDialog ) + pManager->RegisterDialog( this ); + + SetTexture( 0, MAKEINTRESOURCE( 0xFFFF ), ( HMODULE )0xFFFF ); + InitDefaultElements(); +} + + +//-------------------------------------------------------------------------------------- +void CDXUTDialog::Init( CDXUTDialogResourceManager* pManager, bool bRegisterDialog, LPCWSTR pszControlTextureFilename ) +{ + m_pManager = pManager; + if( bRegisterDialog ) + pManager->RegisterDialog( this ); + SetTexture( 0, pszControlTextureFilename ); + InitDefaultElements(); +} + + +//-------------------------------------------------------------------------------------- +void CDXUTDialog::Init( CDXUTDialogResourceManager* pManager, bool bRegisterDialog, + LPCWSTR szControlTextureResourceName, HMODULE hControlTextureResourceModule ) +{ + m_pManager = pManager; + if( bRegisterDialog ) + pManager->RegisterDialog( this ); + + SetTexture( 0, szControlTextureResourceName, hControlTextureResourceModule ); + InitDefaultElements(); +} + + +//-------------------------------------------------------------------------------------- +void CDXUTDialog::SetCallback( PCALLBACKDXUTGUIEVENT pCallback, void* pUserContext ) +{ + // If this assert triggers, you need to call CDXUTDialog::Init() first. This change + // was made so that the DXUT's GUI could become seperate and optional from DXUT's core. The + // creation and interfacing with CDXUTDialogResourceManager is now the responsibility + // of the application if it wishes to use DXUT's GUI. + assert( m_pManager != NULL && L"To fix call CDXUTDialog::Init() first. See comments for details." ); + + m_pCallbackEvent = pCallback; + m_pCallbackEventUserContext = pUserContext; +} + + +//-------------------------------------------------------------------------------------- +void CDXUTDialog::RemoveControl( int ID ) +{ + for( int i = 0; i < m_Controls.GetSize(); i++ ) + { + CDXUTControl* pControl = m_Controls.GetAt( i ); + if( pControl->GetID() == ID ) + { + // Clean focus first + ClearFocus(); + + // Clear references to this control + if( s_pControlFocus == pControl ) + s_pControlFocus = NULL; + if( s_pControlPressed == pControl ) + s_pControlPressed = NULL; + if( m_pControlMouseOver == pControl ) + m_pControlMouseOver = NULL; + + SAFE_DELETE( pControl ); + m_Controls.Remove( i ); + + return; + } + } +} + + +//-------------------------------------------------------------------------------------- +void CDXUTDialog::RemoveAllControls() +{ + if( s_pControlFocus && s_pControlFocus->m_pDialog == this ) + s_pControlFocus = NULL; + if( s_pControlPressed && s_pControlPressed->m_pDialog == this ) + s_pControlPressed = NULL; + m_pControlMouseOver = NULL; + + for( int i = 0; i < m_Controls.GetSize(); i++ ) + { + CDXUTControl* pControl = m_Controls.GetAt( i ); + SAFE_DELETE( pControl ); + } + + m_Controls.RemoveAll(); +} + + +//-------------------------------------------------------------------------------------- +CDXUTDialogResourceManager::CDXUTDialogResourceManager() +{ + // Begin D3D9-specific + m_pd3d9Device = NULL; + m_pStateBlock = NULL; + m_pSprite = NULL; + + // Begin D3D11-specific + // Shaders + m_pVSRenderUI11 = NULL; + m_pPSRenderUI11 = NULL; + m_pPSRenderUIUntex11 = NULL; + + // States + m_pDepthStencilStateUI11 = NULL; + m_pRasterizerStateUI11 = NULL; + m_pBlendStateUI11 = NULL; + m_pSamplerStateUI11 = NULL; + m_pDepthStencilStateStored11 = NULL; + m_pRasterizerStateStored11 = NULL; + m_pBlendStateStored11 = NULL; + m_pSamplerStateStored11 = NULL; + + m_pInputLayout11 = NULL; + m_pVBScreenQuad11 = NULL; + m_pSpriteBuffer11 = NULL; +} + + +//-------------------------------------------------------------------------------------- +CDXUTDialogResourceManager::~CDXUTDialogResourceManager() +{ + int i; + for( i = 0; i < m_FontCache.GetSize(); i++ ) + { + DXUTFontNode* pFontNode = m_FontCache.GetAt( i ); + SAFE_DELETE( pFontNode ); + } + m_FontCache.RemoveAll(); + + for( i = 0; i < m_TextureCache.GetSize(); i++ ) + { + DXUTTextureNode* pTextureNode = m_TextureCache.GetAt( i ); + SAFE_DELETE( pTextureNode ); + } + m_TextureCache.RemoveAll(); + + CUniBuffer::Uninitialize(); +} + + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTDialogResourceManager::OnD3D9CreateDevice( LPDIRECT3DDEVICE9 pd3dDevice ) +{ + HRESULT hr = S_OK; + int i = 0; + + m_pd3d9Device = pd3dDevice; + + for( i = 0; i < m_FontCache.GetSize(); i++ ) + { + hr = CreateFont9( i ); + if( FAILED( hr ) ) + return hr; + } + + for( i = 0; i < m_TextureCache.GetSize(); i++ ) + { + hr = CreateTexture9( i ); + if( FAILED( hr ) ) + return hr; + } + + hr = D3DXCreateSprite( pd3dDevice, &m_pSprite ); + if( FAILED( hr ) ) + return DXUT_ERR( L"D3DXCreateSprite", hr ); + + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTDialogResourceManager::OnD3D9ResetDevice() +{ + HRESULT hr = S_OK; + + for( int i = 0; i < m_FontCache.GetSize(); i++ ) + { + DXUTFontNode* pFontNode = m_FontCache.GetAt( i ); + + if( pFontNode->pFont9 ) + pFontNode->pFont9->OnResetDevice(); + } + + if( m_pSprite ) + m_pSprite->OnResetDevice(); + + V_RETURN( m_pd3d9Device->CreateStateBlock( D3DSBT_ALL, &m_pStateBlock ) ); + + return S_OK; +} + +//-------------------------------------------------------------------------------------- +bool CDXUTDialogResourceManager::MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) +{ + return false; +} + + +//-------------------------------------------------------------------------------------- +void CDXUTDialogResourceManager::OnD3D9LostDevice() +{ + for( int i = 0; i < m_FontCache.GetSize(); i++ ) + { + DXUTFontNode* pFontNode = m_FontCache.GetAt( i ); + + if( pFontNode->pFont9 ) + pFontNode->pFont9->OnLostDevice(); + } + + if( m_pSprite ) + m_pSprite->OnLostDevice(); + + SAFE_RELEASE( m_pStateBlock ); +} + + +//-------------------------------------------------------------------------------------- +void CDXUTDialogResourceManager::OnD3D9DestroyDevice() +{ + int i = 0; + + m_pd3d9Device = NULL; + + // Release the resources but don't clear the cache, as these will need to be + // recreated if the device is recreated + for( i = 0; i < m_FontCache.GetSize(); i++ ) + { + DXUTFontNode* pFontNode = m_FontCache.GetAt( i ); + SAFE_RELEASE( pFontNode->pFont9 ); + } + + for( i = 0; i < m_TextureCache.GetSize(); i++ ) + { + DXUTTextureNode* pTextureNode = m_TextureCache.GetAt( i ); + SAFE_RELEASE( pTextureNode->pTexture9 ); + } + + SAFE_RELEASE( m_pSprite ); +} + + + +HRESULT CDXUTDialogResourceManager::OnD3D11CreateDevice( ID3D11Device* pd3dDevice, ID3D11DeviceContext* pd3d11DeviceContext ) +{ + m_pd3d11Device = pd3dDevice; + m_pd3d11DeviceContext = pd3d11DeviceContext; + + HRESULT hr = S_OK; + + // Compile Shaders + ID3DBlob* pVSBlob = NULL; + ID3DBlob* pPSBlob = NULL; + ID3DBlob* pPSUntexBlob = NULL; + V_RETURN( D3DCompile( g_strUIEffectFile, g_uUIEffectFileSize, "none", NULL, NULL, "VS", "vs_4_0_level_9_1", + D3D10_SHADER_ENABLE_BACKWARDS_COMPATIBILITY, 0, &pVSBlob, NULL ) ); + V_RETURN( D3DCompile( g_strUIEffectFile, g_uUIEffectFileSize, "none", NULL, NULL, "PS", "ps_4_0_level_9_1", + D3D10_SHADER_ENABLE_BACKWARDS_COMPATIBILITY, 0, &pPSBlob, NULL ) ); + V_RETURN( D3DCompile( g_strUIEffectFile, g_uUIEffectFileSize, "none", NULL, NULL, "PSUntex", "ps_4_0_level_9_1", + D3D10_SHADER_ENABLE_BACKWARDS_COMPATIBILITY, 0, &pPSUntexBlob, NULL ) ); +//D3D10_SHADER_ENABLE_STRICTNESS + + // Create Shaders + V_RETURN( pd3dDevice->CreateVertexShader( pVSBlob->GetBufferPointer(), pVSBlob->GetBufferSize(), NULL, &m_pVSRenderUI11 ) ); + V_RETURN( pd3dDevice->CreatePixelShader( pPSBlob->GetBufferPointer(), pPSBlob->GetBufferSize(), NULL, &m_pPSRenderUI11 ) ); + V_RETURN( pd3dDevice->CreatePixelShader( pPSUntexBlob->GetBufferPointer(), pPSUntexBlob->GetBufferSize(), NULL, &m_pPSRenderUIUntex11 ) ); + + // States + D3D11_DEPTH_STENCIL_DESC DSDesc; + ZeroMemory( &DSDesc, sizeof( D3D11_DEPTH_STENCIL_DESC ) ); + DSDesc.DepthEnable = FALSE; + DSDesc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ALL; + DSDesc.DepthFunc = D3D11_COMPARISON_LESS; + DSDesc.StencilEnable = FALSE; + V_RETURN( pd3dDevice->CreateDepthStencilState( &DSDesc, &m_pDepthStencilStateUI11 ) ); + + D3D11_RASTERIZER_DESC RSDesc; + RSDesc.AntialiasedLineEnable = FALSE; + RSDesc.CullMode = D3D11_CULL_BACK; + RSDesc.DepthBias = 0; + RSDesc.DepthBiasClamp = 0.0f; + RSDesc.DepthClipEnable = TRUE; + RSDesc.FillMode = D3D11_FILL_SOLID; + RSDesc.FrontCounterClockwise = FALSE; + RSDesc.MultisampleEnable = TRUE; + RSDesc.ScissorEnable = FALSE; + RSDesc.SlopeScaledDepthBias = 0.0f; + V_RETURN( pd3dDevice->CreateRasterizerState( &RSDesc, &m_pRasterizerStateUI11 ) ); + + D3D11_BLEND_DESC BSDesc; + ZeroMemory( &BSDesc, sizeof( D3D11_BLEND_DESC ) ); + + BSDesc.RenderTarget[0].BlendEnable = TRUE; + BSDesc.RenderTarget[0].SrcBlend = D3D11_BLEND_SRC_ALPHA; + BSDesc.RenderTarget[0].DestBlend = D3D11_BLEND_INV_SRC_ALPHA; + BSDesc.RenderTarget[0].BlendOp = D3D11_BLEND_OP_ADD; + BSDesc.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_ONE; + BSDesc.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_ZERO; + BSDesc.RenderTarget[0].BlendOpAlpha = D3D11_BLEND_OP_ADD; + BSDesc.RenderTarget[0].RenderTargetWriteMask = 0x0F; + + V_RETURN( pd3dDevice->CreateBlendState( &BSDesc, &m_pBlendStateUI11 ) ); + + D3D11_SAMPLER_DESC SSDesc; + ZeroMemory( &SSDesc, sizeof( D3D11_SAMPLER_DESC ) ); + SSDesc.Filter = D3D11_FILTER_ANISOTROPIC ; + SSDesc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP; + SSDesc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP; + SSDesc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP; + SSDesc.ComparisonFunc = D3D11_COMPARISON_NEVER; + SSDesc.MaxAnisotropy = 16; + SSDesc.MinLOD = 0; + SSDesc.MaxLOD = D3D11_FLOAT32_MAX; + if ( pd3dDevice->GetFeatureLevel() < D3D_FEATURE_LEVEL_9_3 ) { + SSDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR; + SSDesc.MaxAnisotropy = 0; + } + V_RETURN( pd3dDevice->CreateSamplerState( &SSDesc, &m_pSamplerStateUI11 ) ); + + // Create the font and texture objects in the cache arrays. + int i = 0; + for( i = 0; i < m_FontCache.GetSize(); i++ ) + { + hr = CreateFont11( i ); + if( FAILED( hr ) ) + return hr; + } + + for( i = 0; i < m_TextureCache.GetSize(); i++ ) + { + hr = CreateTexture11( i ); + if( FAILED( hr ) ) + return hr; + } + + // Create input layout + const D3D11_INPUT_ELEMENT_DESC layout[] = + { + { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 }, + { "COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0 }, + { "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 28, D3D11_INPUT_PER_VERTEX_DATA, 0 }, + }; + + V_RETURN( pd3dDevice->CreateInputLayout( layout, ARRAYSIZE( layout ), pVSBlob->GetBufferPointer(), pVSBlob->GetBufferSize(), &m_pInputLayout11 ) ); + + // Release the blobs + SAFE_RELEASE( pVSBlob ); + SAFE_RELEASE( pPSBlob ); + SAFE_RELEASE( pPSUntexBlob ); + + // Create a vertex buffer quad for rendering later + D3D11_BUFFER_DESC BufDesc; + BufDesc.ByteWidth = sizeof( DXUT_SCREEN_VERTEX_10 ) * 4; + BufDesc.Usage = D3D11_USAGE_DYNAMIC; + BufDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER; + BufDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; + BufDesc.MiscFlags = 0; + V_RETURN( pd3dDevice->CreateBuffer( &BufDesc, NULL, &m_pVBScreenQuad11 ) ); + + // Init the D3D11 font + InitFont11( pd3dDevice, m_pInputLayout11 ); + + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTDialogResourceManager::OnD3D11ResizedSwapChain( ID3D11Device* pd3dDevice, + const DXGI_SURFACE_DESC* pBackBufferSurfaceDesc ) +{ + HRESULT hr = S_OK; + + m_nBackBufferWidth = pBackBufferSurfaceDesc->Width; + m_nBackBufferHeight = pBackBufferSurfaceDesc->Height; + + return hr; +} + + +//-------------------------------------------------------------------------------------- +void CDXUTDialogResourceManager::OnD3D11ReleasingSwapChain() +{ +} + + +//-------------------------------------------------------------------------------------- +void CDXUTDialogResourceManager::OnD3D11DestroyDevice() +{ + int i; + + // Release the resources but don't clear the cache, as these will need to be + // recreated if the device is recreated + + for( i = 0; i < m_TextureCache.GetSize(); i++ ) + { + DXUTTextureNode* pTextureNode = m_TextureCache.GetAt( i ); + SAFE_RELEASE( pTextureNode->pTexResView11 ); + SAFE_RELEASE( pTextureNode->pTexture11 ); + } + + // D3D11 + SAFE_RELEASE( m_pVBScreenQuad11 ); + SAFE_RELEASE( m_pSpriteBuffer11 ); + m_SpriteBufferBytes11 = 0; + SAFE_RELEASE( m_pInputLayout11 ); + + // Shaders + SAFE_RELEASE( m_pVSRenderUI11 ); + SAFE_RELEASE( m_pPSRenderUI11 ); + SAFE_RELEASE( m_pPSRenderUIUntex11 ); + + // States + SAFE_RELEASE( m_pDepthStencilStateUI11 ); + SAFE_RELEASE( m_pRasterizerStateUI11 ); + SAFE_RELEASE( m_pBlendStateUI11 ); + SAFE_RELEASE( m_pSamplerStateUI11 ); + + SAFE_RELEASE( m_pDepthStencilStateStored11 ); + SAFE_RELEASE( m_pRasterizerStateStored11 ); + SAFE_RELEASE( m_pBlendStateStored11 ); + SAFE_RELEASE( m_pSamplerStateStored11 ); + + EndFont11(); +} + +//-------------------------------------------------------------------------------------- +void CDXUTDialogResourceManager::StoreD3D11State( ID3D11DeviceContext* pd3dImmediateContext ) +{ + pd3dImmediateContext->OMGetDepthStencilState( &m_pDepthStencilStateStored11, &m_StencilRefStored11 ); + pd3dImmediateContext->RSGetState( &m_pRasterizerStateStored11 ); + pd3dImmediateContext->OMGetBlendState( &m_pBlendStateStored11, m_BlendFactorStored11, &m_SampleMaskStored11 ); + pd3dImmediateContext->PSGetSamplers( 0, 1, &m_pSamplerStateStored11 ); +} + +//-------------------------------------------------------------------------------------- +void CDXUTDialogResourceManager::RestoreD3D11State( ID3D11DeviceContext* pd3dImmediateContext ) +{ + pd3dImmediateContext->OMSetDepthStencilState( m_pDepthStencilStateStored11, m_StencilRefStored11 ); + pd3dImmediateContext->RSSetState( m_pRasterizerStateStored11 ); + pd3dImmediateContext->OMSetBlendState( m_pBlendStateStored11, m_BlendFactorStored11, m_SampleMaskStored11 ); + pd3dImmediateContext->PSSetSamplers( 0, 1, &m_pSamplerStateStored11 ); + + SAFE_RELEASE( m_pDepthStencilStateStored11 ); + SAFE_RELEASE( m_pRasterizerStateStored11 ); + SAFE_RELEASE( m_pBlendStateStored11 ); + SAFE_RELEASE( m_pSamplerStateStored11 ); +} + +//-------------------------------------------------------------------------------------- +void CDXUTDialogResourceManager::ApplyRenderUI11( ID3D11DeviceContext* pd3dImmediateContext ) +{ + // Shaders + pd3dImmediateContext->VSSetShader( m_pVSRenderUI11, NULL, 0 ); + pd3dImmediateContext->HSSetShader( NULL, NULL, 0 ); + pd3dImmediateContext->DSSetShader( NULL, NULL, 0 ); + pd3dImmediateContext->GSSetShader( NULL, NULL, 0 ); + pd3dImmediateContext->PSSetShader( m_pPSRenderUI11, NULL, 0 ); + + // States + pd3dImmediateContext->OMSetDepthStencilState( m_pDepthStencilStateUI11, 0 ); + pd3dImmediateContext->RSSetState( m_pRasterizerStateUI11 ); + float BlendFactor[4] = { 0, 0, 0, 0 }; + pd3dImmediateContext->OMSetBlendState( m_pBlendStateUI11, BlendFactor, 0xFFFFFFFF ); + pd3dImmediateContext->PSSetSamplers( 0, 1, &m_pSamplerStateUI11 ); +} + +//-------------------------------------------------------------------------------------- +void CDXUTDialogResourceManager::ApplyRenderUIUntex11( ID3D11DeviceContext* pd3dImmediateContext ) +{ + // Shaders + pd3dImmediateContext->VSSetShader( m_pVSRenderUI11, NULL, 0 ); + pd3dImmediateContext->HSSetShader( NULL, NULL, 0 ); + pd3dImmediateContext->DSSetShader( NULL, NULL, 0 ); + pd3dImmediateContext->GSSetShader( NULL, NULL, 0 ); + pd3dImmediateContext->PSSetShader( m_pPSRenderUIUntex11, NULL, 0 ); + + // States + pd3dImmediateContext->OMSetDepthStencilState( m_pDepthStencilStateUI11, 0 ); + pd3dImmediateContext->RSSetState( m_pRasterizerStateUI11 ); + float BlendFactor[4] = { 0, 0, 0, 0 }; + pd3dImmediateContext->OMSetBlendState( m_pBlendStateUI11, BlendFactor, 0xFFFFFFFF ); + pd3dImmediateContext->PSSetSamplers( 0, 1, &m_pSamplerStateUI11 ); +} + +//-------------------------------------------------------------------------------------- +void CDXUTDialogResourceManager::BeginSprites11( ) +{ + m_SpriteVertices.Reset(); +} + +//-------------------------------------------------------------------------------------- +void CDXUTDialogResourceManager::EndSprites11( ID3D11Device* pd3dDevice, ID3D11DeviceContext* pd3dImmediateContext ) +{ + + // ensure our buffer size can hold our sprites + UINT SpriteDataBytes = m_SpriteVertices.GetSize() * sizeof( DXUTSpriteVertex ); + if( m_SpriteBufferBytes11 < SpriteDataBytes ) + { + SAFE_RELEASE( m_pSpriteBuffer11 ); + m_SpriteBufferBytes11 = SpriteDataBytes; + + D3D11_BUFFER_DESC BufferDesc; + BufferDesc.ByteWidth = m_SpriteBufferBytes11; + BufferDesc.Usage = D3D11_USAGE_DYNAMIC; + BufferDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER; + BufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; + BufferDesc.MiscFlags = 0; + + pd3dDevice->CreateBuffer( &BufferDesc, NULL, &m_pSpriteBuffer11 ); + } + + // Copy the sprites over + D3D11_BOX destRegion; + destRegion.left = 0; + destRegion.right = SpriteDataBytes; + destRegion.top = 0; + destRegion.bottom = 1; + destRegion.front = 0; + destRegion.back = 1; + D3D11_MAPPED_SUBRESOURCE MappedResource; + if ( S_OK == pd3dImmediateContext->Map( m_pSpriteBuffer11, 0, D3D11_MAP_WRITE_DISCARD, 0, &MappedResource ) ) { + CopyMemory( MappedResource.pData, (void*)m_SpriteVertices.GetData(), SpriteDataBytes ); + pd3dImmediateContext->Unmap(m_pSpriteBuffer11, 0); + } + + // Draw + UINT Stride = sizeof( DXUTSpriteVertex ); + UINT Offset = 0; + pd3dImmediateContext->IASetVertexBuffers( 0, 1, &m_pSpriteBuffer11, &Stride, &Offset ); + pd3dImmediateContext->IASetInputLayout( m_pInputLayout11 ); + pd3dImmediateContext->IASetPrimitiveTopology( D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST ); + pd3dImmediateContext->Draw( m_SpriteVertices.GetSize(), 0 ); + + m_SpriteVertices.Reset(); +} + +//-------------------------------------------------------------------------------------- +bool CDXUTDialogResourceManager::RegisterDialog( CDXUTDialog* pDialog ) +{ + // Check that the dialog isn't already registered. + for( int i = 0; i < m_Dialogs.GetSize(); ++i ) + if( m_Dialogs.GetAt( i ) == pDialog ) + return true; + + // Add to the list. + if( FAILED( m_Dialogs.Add( pDialog ) ) ) + return false; + + // Set up next and prev pointers. + if( m_Dialogs.GetSize() > 1 ) + m_Dialogs[m_Dialogs.GetSize() - 2]->SetNextDialog( pDialog ); + m_Dialogs[m_Dialogs.GetSize() - 1]->SetNextDialog( m_Dialogs[0] ); + + return true; +} + + +//-------------------------------------------------------------------------------------- +void CDXUTDialogResourceManager::UnregisterDialog( CDXUTDialog* pDialog ) +{ + // Search for the dialog in the list. + for( int i = 0; i < m_Dialogs.GetSize(); ++i ) + if( m_Dialogs.GetAt( i ) == pDialog ) + { + m_Dialogs.Remove( i ); + if( m_Dialogs.GetSize() > 0 ) + { + int l, r; + + if( 0 == i ) + l = m_Dialogs.GetSize() - 1; + else + l = i - 1; + + if( m_Dialogs.GetSize() == i ) + r = 0; + else + r = i; + + m_Dialogs[l]->SetNextDialog( m_Dialogs[r] ); + } + return; + } +} + + +//-------------------------------------------------------------------------------------- +void CDXUTDialogResourceManager::EnableKeyboardInputForAllDialogs() +{ + // Enable keyboard input for all registered dialogs + for( int i = 0; i < m_Dialogs.GetSize(); ++i ) + m_Dialogs[i]->EnableKeyboardInput( true ); +} + + +//-------------------------------------------------------------------------------------- +void CDXUTDialog::Refresh() +{ + if( s_pControlFocus ) + s_pControlFocus->OnFocusOut(); + + if( m_pControlMouseOver ) + m_pControlMouseOver->OnMouseLeave(); + + s_pControlFocus = NULL; + s_pControlPressed = NULL; + m_pControlMouseOver = NULL; + + for( int i = 0; i < m_Controls.GetSize(); i++ ) + { + CDXUTControl* pControl = m_Controls.GetAt( i ); + pControl->Refresh(); + } + + if( m_bKeyboardInput ) + FocusDefaultControl(); +} + + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTDialog::OnRender( float fElapsedTime ) +{ + if( m_pManager->GetD3D9Device() ) + return OnRender9( fElapsedTime ); + else + return OnRender11( fElapsedTime ); +} + + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTDialog::OnRender9( float fElapsedTime ) +{ + // If this assert triggers, you need to call CDXUTDialogResourceManager::On*Device() from inside + // the application's device callbacks. See the SDK samples for an example of how to do this. + assert( m_pManager->GetD3D9Device() && m_pManager->m_pStateBlock && + L"To fix hook up CDXUTDialogResourceManager to device callbacks. See comments for details" ); + + // See if the dialog needs to be refreshed + if( m_fTimeLastRefresh < s_fTimeRefresh ) + { + m_fTimeLastRefresh = DXUTGetTime(); + Refresh(); + } + + // For invisible dialog, out now. + if( !m_bVisible || + ( m_bMinimized && !m_bCaption ) ) + return S_OK; + + IDirect3DDevice9* pd3dDevice = m_pManager->GetD3D9Device(); + + // Set up a state block here and restore it when finished drawing all the controls + m_pManager->m_pStateBlock->Capture(); + + //pd3dDevice->SetSamplerState(0, D3DSAMP_SRGBTEXTURE, TRUE); + //pd3dDevice->SetRenderState( D3DRS_SRGBWRITEENABLE, TRUE ); + + pd3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE ); + pd3dDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA ); + pd3dDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA ); + pd3dDevice->SetRenderState( D3DRS_ALPHATESTENABLE, FALSE ); + pd3dDevice->SetRenderState( D3DRS_SEPARATEALPHABLENDENABLE, FALSE ); + pd3dDevice->SetRenderState( D3DRS_BLENDOP, D3DBLENDOP_ADD ); + pd3dDevice->SetRenderState( D3DRS_COLORWRITEENABLE, D3DCOLORWRITEENABLE_ALPHA | D3DCOLORWRITEENABLE_BLUE | + D3DCOLORWRITEENABLE_GREEN | D3DCOLORWRITEENABLE_RED ); + pd3dDevice->SetRenderState( D3DRS_SHADEMODE, D3DSHADE_GOURAUD ); + pd3dDevice->SetRenderState( D3DRS_FOGENABLE, FALSE ); + pd3dDevice->SetRenderState( D3DRS_ZWRITEENABLE, FALSE ); + pd3dDevice->SetRenderState( D3DRS_FILLMODE, D3DFILL_SOLID ); + pd3dDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_CCW ); + + pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG2 ); + pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE ); + pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1 ); + pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE ); + pd3dDevice->SetTextureStageState( 0, D3DTSS_RESULTARG, D3DTA_CURRENT ); + pd3dDevice->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_DISABLE ); + pd3dDevice->SetTextureStageState( 1, D3DTSS_ALPHAOP, D3DTOP_DISABLE ); + + BOOL bBackgroundIsVisible = ( m_colorTopLeft | m_colorTopRight | m_colorBottomRight | m_colorBottomLeft ) & + 0xff000000; + if( !m_bMinimized && bBackgroundIsVisible ) + { + DXUT_SCREEN_VERTEX_UNTEX vertices[4] = + { + ( float )m_x, ( float )m_y, 0.5f, 1.0f, m_colorTopLeft, + ( float )m_x + m_width, ( float )m_y, 0.5f, 1.0f, m_colorTopRight, + ( float )m_x + m_width, ( float )m_y + m_height, 0.5f, 1.0f, m_colorBottomRight, + ( float )m_x, ( float )m_y + m_height, 0.5f, 1.0f, m_colorBottomLeft, + }; + + pd3dDevice->SetVertexShader( NULL ); + pd3dDevice->SetPixelShader( NULL ); + + pd3dDevice->SetRenderState( D3DRS_ZENABLE, FALSE ); + + pd3dDevice->SetFVF( DXUT_SCREEN_VERTEX_UNTEX::FVF ); + pd3dDevice->DrawPrimitiveUP( D3DPT_TRIANGLEFAN, 2, vertices, sizeof( DXUT_SCREEN_VERTEX_UNTEX ) ); + } + + pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE ); + pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE ); + pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE ); + + pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE ); + pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE ); + pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE ); + + pd3dDevice->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR ); + + DXUTTextureNode* pTextureNode = GetTexture( 0 ); + pd3dDevice->SetTexture( 0, pTextureNode->pTexture9 ); + + m_pManager->m_pSprite->Begin( D3DXSPRITE_DONOTSAVESTATE ); + + // Render the caption if it's enabled. + if( m_bCaption ) + { + // DrawSprite will offset the rect down by + // m_nCaptionHeight, so adjust the rect higher + // here to negate the effect. + RECT rc = + { + 0, -m_nCaptionHeight, m_width, 0 + }; + DrawSprite9( &m_CapElement, &rc ); + rc.left += 5; // Make a left margin + WCHAR wszOutput[256]; + wcscpy_s( wszOutput, 256, m_wszCaption ); + if( m_bMinimized ) + wcscat_s( wszOutput, 256, L" (Minimized)" ); + DrawText9( wszOutput, &m_CapElement, &rc, true ); + } + + // If the dialog is minimized, skip rendering + // its controls. + if( !m_bMinimized ) + { + for( int i = 0; i < m_Controls.GetSize(); i++ ) + { + CDXUTControl* pControl = m_Controls.GetAt( i ); + + // Focused control is drawn last + if( pControl == s_pControlFocus ) + continue; + + pControl->Render( fElapsedTime ); + } + + if( s_pControlFocus != NULL && s_pControlFocus->m_pDialog == this ) + s_pControlFocus->Render( fElapsedTime ); + } + + m_pManager->m_pSprite->End(); + + m_pManager->m_pStateBlock->Apply(); + + return S_OK; +} + + + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTDialog::OnRender11( float fElapsedTime ) +{ + // If this assert triggers, you need to call CDXUTDialogResourceManager::On*Device() from inside + // the application's device callbacks. See the SDK samples for an example of how to do this. + assert( m_pManager->GetD3D11Device() && + L"To fix hook up CDXUTDialogResourceManager to device callbacks. See comments for details" ); + + // See if the dialog needs to be refreshed + if( m_fTimeLastRefresh < s_fTimeRefresh ) + { + m_fTimeLastRefresh = DXUTGetTime(); + Refresh(); + } + + // For invisible dialog, out now. + if( !m_bVisible || + ( m_bMinimized && !m_bCaption ) ) + return S_OK; + + ID3D11Device* pd3dDevice = m_pManager->GetD3D11Device(); + ID3D11DeviceContext* pd3dDeviceContext = m_pManager->GetD3D11DeviceContext(); + + // Set up a state block here and restore it when finished drawing all the controls + m_pManager->StoreD3D11State( pd3dDeviceContext ); + + BOOL bBackgroundIsVisible = ( m_colorTopLeft | m_colorTopRight | m_colorBottomRight | m_colorBottomLeft ) & + 0xff000000; + if( !m_bMinimized && bBackgroundIsVisible ) + { + // Convert the draw rectangle from screen coordinates to clip space coordinates. + float Left, Right, Top, Bottom; + Left = m_x * 2.0f / m_pManager->m_nBackBufferWidth - 1.0f; + Right = ( m_x + m_width ) * 2.0f / m_pManager->m_nBackBufferWidth - 1.0f; + Top = 1.0f - m_y * 2.0f / m_pManager->m_nBackBufferHeight; + Bottom = 1.0f - ( m_y + m_height ) * 2.0f / m_pManager->m_nBackBufferHeight; + + DXUT_SCREEN_VERTEX_10 vertices[4] = + { + Left, Top, 0.5f, D3DCOLOR_TO_D3DCOLORVALUE( m_colorTopLeft ), 0.0f, 0.0f, + Right, Top, 0.5f, D3DCOLOR_TO_D3DCOLORVALUE( m_colorTopRight ), 1.0f, 0.0f, + Left, Bottom, 0.5f, D3DCOLOR_TO_D3DCOLORVALUE( m_colorBottomLeft ), 0.0f, 1.0f, + Right, Bottom, 0.5f, D3DCOLOR_TO_D3DCOLORVALUE( m_colorBottomRight ), 1.0f, 1.0f, + }; + + //DXUT_SCREEN_VERTEX_10 *pVB; + D3D11_MAPPED_SUBRESOURCE MappedData; + if( SUCCEEDED( pd3dDeviceContext->Map( m_pManager->m_pVBScreenQuad11, 0, D3D11_MAP_WRITE_DISCARD, + 0, &MappedData ) ) ) + { + CopyMemory( MappedData.pData, vertices, sizeof( vertices ) ); + pd3dDeviceContext->Unmap( m_pManager->m_pVBScreenQuad11, 0 ); + } + + // Set the quad VB as current + UINT stride = sizeof( DXUT_SCREEN_VERTEX_10 ); + UINT offset = 0; + pd3dDeviceContext->IASetVertexBuffers( 0, 1, &m_pManager->m_pVBScreenQuad11, &stride, &offset ); + pd3dDeviceContext->IASetInputLayout( m_pManager->m_pInputLayout11 ); + pd3dDeviceContext->IASetPrimitiveTopology( D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP ); + + // Setup for rendering + m_pManager->ApplyRenderUIUntex11( pd3dDeviceContext ); + pd3dDeviceContext->Draw( 4, 0 ); + } + + DXUTTextureNode* pTextureNode = GetTexture( 0 ); + pd3dDeviceContext->PSSetShaderResources( 0, 1, &pTextureNode->pTexResView11 ); + + // Sort depth back to front + m_pManager->BeginSprites11(); + BeginText11(); + + m_pManager->ApplyRenderUI11( pd3dDeviceContext ); + + // Render the caption if it's enabled. + if( m_bCaption ) + { + // DrawSprite will offset the rect down by + // m_nCaptionHeight, so adjust the rect higher + // here to negate the effect. + RECT rc = { 0, -m_nCaptionHeight, m_width, 0 }; + DrawSprite11( &m_CapElement, &rc, 0.99f ); + rc.left += 5; // Make a left margin + WCHAR wszOutput[256]; + wcscpy_s( wszOutput, 256, m_wszCaption ); + if( m_bMinimized ) + wcscat_s( wszOutput, 256, L" (Minimized)" ); + DrawText11( pd3dDevice, pd3dDeviceContext, wszOutput, &m_CapElement, &rc, true ); + } + + // If the dialog is minimized, skip rendering + // its controls. + if( !m_bMinimized ) + { + for( int i = 0; i < m_Controls.GetSize(); i++ ) + { + CDXUTControl* pControl = m_Controls.GetAt( i ); + + // Focused control is drawn last + if( pControl == s_pControlFocus ) + continue; + + pControl->Render( fElapsedTime ); + } + + if( s_pControlFocus != NULL && s_pControlFocus->m_pDialog == this ) + s_pControlFocus->Render( fElapsedTime ); + } + + // End sprites + if( m_bCaption ) + { + m_pManager->EndSprites11( pd3dDevice, pd3dDeviceContext ); + EndText11( pd3dDevice, pd3dDeviceContext ); + } + m_pManager->RestoreD3D11State( pd3dDeviceContext ); + + return S_OK; +} + +//-------------------------------------------------------------------------------------- +VOID CDXUTDialog::SendEvent( UINT nEvent, bool bTriggeredByUser, CDXUTControl* pControl ) +{ + // If no callback has been registered there's nowhere to send the event to + if( m_pCallbackEvent == NULL ) + return; + + // Discard events triggered programatically if these types of events haven't been + // enabled + if( !bTriggeredByUser && !m_bNonUserEvents ) + return; + + m_pCallbackEvent( nEvent, pControl->GetID(), pControl, m_pCallbackEventUserContext ); +} + + +//-------------------------------------------------------------------------------------- +int CDXUTDialogResourceManager::AddFont( LPCWSTR strFaceName, LONG height, LONG weight ) +{ + // See if this font already exists + for( int i = 0; i < m_FontCache.GetSize(); i++ ) + { + DXUTFontNode* pFontNode = m_FontCache.GetAt( i ); + size_t nLen = 0; + nLen = wcsnlen( strFaceName, MAX_PATH); + if( 0 == _wcsnicmp( pFontNode->strFace, strFaceName, nLen ) && + pFontNode->nHeight == height && + pFontNode->nWeight == weight ) + { + return i; + } + } + + // Add a new font and try to create it + DXUTFontNode* pNewFontNode = new DXUTFontNode; + if( pNewFontNode == NULL ) + return -1; + + ZeroMemory( pNewFontNode, sizeof( DXUTFontNode ) ); + wcscpy_s( pNewFontNode->strFace, MAX_PATH, strFaceName ); + pNewFontNode->nHeight = height; + pNewFontNode->nWeight = weight; + m_FontCache.Add( pNewFontNode ); + + int iFont = m_FontCache.GetSize() - 1; + + // If a device is available, try to create immediately + if( m_pd3d9Device ) + CreateFont9( iFont ); + + return iFont; +} + + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTDialog::SetFont( UINT index, LPCWSTR strFaceName, LONG height, LONG weight ) +{ + // If this assert triggers, you need to call CDXUTDialog::Init() first. This change + // was made so that the DXUT's GUI could become seperate and optional from DXUT's core. The + // creation and interfacing with CDXUTDialogResourceManager is now the responsibility + // of the application if it wishes to use DXUT's GUI. + assert( m_pManager != NULL && L"To fix call CDXUTDialog::Init() first. See comments for details." ); + + // Make sure the list is at least as large as the index being set + UINT i; + for( i = m_Fonts.GetSize(); i <= index; i++ ) + { + m_Fonts.Add( -1 ); + } + + int iFont = m_pManager->AddFont( strFaceName, height, weight ); + m_Fonts.SetAt( index, iFont ); + + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +DXUTFontNode* CDXUTDialog::GetFont( UINT index ) +{ + if( NULL == m_pManager ) + return NULL; + return m_pManager->GetFontNode( m_Fonts.GetAt( index ) ); +} + + +//-------------------------------------------------------------------------------------- +int CDXUTDialogResourceManager::AddTexture( LPCWSTR strFilename ) +{ + // See if this texture already exists + for( int i = 0; i < m_TextureCache.GetSize(); i++ ) + { + DXUTTextureNode* pTextureNode = m_TextureCache.GetAt( i ); + size_t nLen = 0; + nLen = wcsnlen( strFilename, MAX_PATH); + if( pTextureNode->bFileSource && // Sources must match + 0 == _wcsnicmp( pTextureNode->strFilename, strFilename, nLen ) ) + { + return i; + } + } + + // Add a new texture and try to create it + DXUTTextureNode* pNewTextureNode = new DXUTTextureNode; + if( pNewTextureNode == NULL ) + return -1; + + ZeroMemory( pNewTextureNode, sizeof( DXUTTextureNode ) ); + pNewTextureNode->bFileSource = true; + wcscpy_s( pNewTextureNode->strFilename, MAX_PATH, strFilename ); + + m_TextureCache.Add( pNewTextureNode ); + + int iTexture = m_TextureCache.GetSize() - 1; + + // If a device is available, try to create immediately + if( m_pd3d9Device ) + CreateTexture9( iTexture ); + + return iTexture; +} + + +//-------------------------------------------------------------------------------------- +int CDXUTDialogResourceManager::AddTexture( LPCWSTR strResourceName, HMODULE hResourceModule ) +{ + // See if this texture already exists + for( int i = 0; i < m_TextureCache.GetSize(); i++ ) + { + DXUTTextureNode* pTextureNode = m_TextureCache.GetAt( i ); + if( !pTextureNode->bFileSource && // Sources must match + pTextureNode->hResourceModule == hResourceModule ) // Module handles must match + { + if( IS_INTRESOURCE( strResourceName ) ) + { + // Integer-based ID + if( ( INT_PTR )strResourceName == pTextureNode->nResourceID ) + return i; + } + else + { + // String-based ID + size_t nLen = 0; + nLen = wcsnlen ( strResourceName, MAX_PATH ); + if( 0 == _wcsnicmp( pTextureNode->strFilename, strResourceName, nLen ) ) + return i; + } + } + } + + // Add a new texture and try to create it + DXUTTextureNode* pNewTextureNode = new DXUTTextureNode; + if( pNewTextureNode == NULL ) + return -1; + + ZeroMemory( pNewTextureNode, sizeof( DXUTTextureNode ) ); + pNewTextureNode->hResourceModule = hResourceModule; + if( IS_INTRESOURCE( strResourceName ) ) + { + pNewTextureNode->nResourceID = ( int )( size_t )strResourceName; + } + else + { + pNewTextureNode->nResourceID = 0; + wcscpy_s( pNewTextureNode->strFilename, MAX_PATH, strResourceName ); + } + + m_TextureCache.Add( pNewTextureNode ); + + int iTexture = m_TextureCache.GetSize() - 1; + + // If a device is available, try to create immediately + if( m_pd3d9Device ) + CreateTexture9( iTexture ); + + return iTexture; +} + + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTDialog::SetTexture( UINT index, LPCWSTR strFilename ) +{ + // If this assert triggers, you need to call CDXUTDialog::Init() first. This change + // was made so that the DXUT's GUI could become seperate and optional from DXUT's core. The + // creation and interfacing with CDXUTDialogResourceManager is now the responsibility + // of the application if it wishes to use DXUT's GUI. + assert( m_pManager != NULL && L"To fix this, call CDXUTDialog::Init() first. See comments for details." ); + + // Make sure the list is at least as large as the index being set + for( UINT i = m_Textures.GetSize(); i <= index; i++ ) + { + m_Textures.Add( -1 ); + } + + int iTexture = m_pManager->AddTexture( strFilename ); + + m_Textures.SetAt( index, iTexture ); + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTDialog::SetTexture( UINT index, LPCWSTR strResourceName, HMODULE hResourceModule ) +{ + // If this assert triggers, you need to call CDXUTDialog::Init() first. This change + // was made so that the DXUT's GUI could become seperate and optional from DXUT's core. The + // creation and interfacing with CDXUTDialogResourceManager is now the responsibility + // of the application if it wishes to use DXUT's GUI. + assert( m_pManager != NULL && L"To fix this, call CDXUTDialog::Init() first. See comments for details." ); + + // Make sure the list is at least as large as the index being set + for( UINT i = m_Textures.GetSize(); i <= index; i++ ) + { + m_Textures.Add( -1 ); + } + + int iTexture = m_pManager->AddTexture( strResourceName, hResourceModule ); + + m_Textures.SetAt( index, iTexture ); + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +DXUTTextureNode* CDXUTDialog::GetTexture( UINT index ) +{ + if( NULL == m_pManager ) + return NULL; + return m_pManager->GetTextureNode( m_Textures.GetAt( index ) ); +} + + + +//-------------------------------------------------------------------------------------- +bool CDXUTDialog::MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) +{ + bool bHandled = false; + + // For invisible dialog, do not handle anything. + if( !m_bVisible ) + return false; + + // If automation command-line switch is on, enable this dialog's keyboard input + // upon any key press or mouse click. + if( DXUTGetAutomation() && + ( WM_LBUTTONDOWN == uMsg || WM_LBUTTONDBLCLK == uMsg || WM_KEYDOWN == uMsg ) ) + { + m_pManager->EnableKeyboardInputForAllDialogs(); + } + + // If caption is enable, check for clicks in the caption area. + if( m_bCaption ) + { + if( uMsg == WM_LBUTTONDOWN || uMsg == WM_LBUTTONDBLCLK ) + { + POINT mousePoint = + { + short( LOWORD( lParam ) ), short( HIWORD( lParam ) ) + }; + + if( mousePoint.x >= m_x && mousePoint.x < m_x + m_width && + mousePoint.y >= m_y && mousePoint.y < m_y + m_nCaptionHeight ) + { + m_bDrag = true; + SetCapture( DXUTGetHWND() ); + return true; + } + } + else if( uMsg == WM_LBUTTONUP && m_bDrag ) + { + POINT mousePoint = + { + short( LOWORD( lParam ) ), short( HIWORD( lParam ) ) + }; + + if( mousePoint.x >= m_x && mousePoint.x < m_x + m_width && + mousePoint.y >= m_y && mousePoint.y < m_y + m_nCaptionHeight ) + { + ReleaseCapture(); + m_bDrag = false; + m_bMinimized = !m_bMinimized; + return true; + } + } + } + + // If the dialog is minimized, don't send any messages to controls. + if( m_bMinimized ) + return false; + + // If a control is in focus, it belongs to this dialog, and it's enabled, then give + // it the first chance at handling the message. + if( s_pControlFocus && + s_pControlFocus->m_pDialog == this && + s_pControlFocus->GetEnabled() ) + { + // If the control MsgProc handles it, then we don't. + if( s_pControlFocus->MsgProc( uMsg, wParam, lParam ) ) + return true; + } + + switch( uMsg ) + { + case WM_SIZE: + case WM_MOVE: + { + // Handle sizing and moving messages so that in case the mouse cursor is moved out + // of an UI control because of the window adjustment, we can properly + // unhighlight the highlighted control. + POINT pt = + { + -1, -1 + }; + OnMouseMove( pt ); + break; + } + + case WM_ACTIVATEAPP: + // Call OnFocusIn()/OnFocusOut() of the control that currently has the focus + // as the application is activated/deactivated. This matches the Windows + // behavior. + if( s_pControlFocus && + s_pControlFocus->m_pDialog == this && + s_pControlFocus->GetEnabled() ) + { + if( wParam ) + s_pControlFocus->OnFocusIn(); + else + s_pControlFocus->OnFocusOut(); + } + break; + + // Keyboard messages + case WM_KEYDOWN: + case WM_SYSKEYDOWN: + case WM_KEYUP: + case WM_SYSKEYUP: + { + // If a control is in focus, it belongs to this dialog, and it's enabled, then give + // it the first chance at handling the message. + if( s_pControlFocus && + s_pControlFocus->m_pDialog == this && + s_pControlFocus->GetEnabled() ) + { + if( s_pControlFocus->HandleKeyboard( uMsg, wParam, lParam ) ) + return true; + } + + // Not yet handled, see if this matches a control's hotkey + // Activate the hotkey if the focus doesn't belong to an + // edit box. + if( uMsg == WM_KEYDOWN && ( !s_pControlFocus || + ( s_pControlFocus->GetType() != DXUT_CONTROL_EDITBOX + && s_pControlFocus->GetType() != DXUT_CONTROL_IMEEDITBOX ) ) ) + { + for( int i = 0; i < m_Controls.GetSize(); i++ ) + { + CDXUTControl* pControl = m_Controls.GetAt( i ); + if( pControl->GetHotkey() == wParam ) + { + pControl->OnHotkey(); + return true; + } + } + } + + // Not yet handled, check for focus messages + if( uMsg == WM_KEYDOWN ) + { + // If keyboard input is not enabled, this message should be ignored + if( !m_bKeyboardInput ) + return false; + + switch( wParam ) + { + case VK_RIGHT: + case VK_DOWN: + if( s_pControlFocus != NULL ) + { + return OnCycleFocus( true ); + } + break; + + case VK_LEFT: + case VK_UP: + if( s_pControlFocus != NULL ) + { + return OnCycleFocus( false ); + } + break; + + case VK_TAB: + { + bool bShiftDown = ( ( GetKeyState( VK_SHIFT ) & 0x8000 ) != 0 ); + return OnCycleFocus( !bShiftDown ); + } + } + } + + break; + } + + + // Mouse messages + case WM_MOUSEMOVE: + case WM_LBUTTONDOWN: + case WM_LBUTTONUP: + case WM_MBUTTONDOWN: + case WM_MBUTTONUP: + case WM_RBUTTONDOWN: + case WM_RBUTTONUP: + case WM_XBUTTONDOWN: + case WM_XBUTTONUP: + case WM_LBUTTONDBLCLK: + case WM_MBUTTONDBLCLK: + case WM_RBUTTONDBLCLK: + case WM_XBUTTONDBLCLK: + case WM_MOUSEWHEEL: + { + // If not accepting mouse input, return false to indicate the message should still + // be handled by the application (usually to move the camera). + if( !m_bMouseInput ) + return false; + + POINT mousePoint = + { + short( LOWORD( lParam ) ), short( HIWORD( lParam ) ) + }; + mousePoint.x -= m_x; + mousePoint.y -= m_y; + + // If caption is enabled, offset the Y coordinate by the negative of its height. + if( m_bCaption ) + mousePoint.y -= m_nCaptionHeight; + + // If a control is in focus, it belongs to this dialog, and it's enabled, then give + // it the first chance at handling the message. + if( s_pControlFocus && + s_pControlFocus->m_pDialog == this && + s_pControlFocus->GetEnabled() ) + { + if( s_pControlFocus->HandleMouse( uMsg, mousePoint, wParam, lParam ) ) + return true; + } + + // Not yet handled, see if the mouse is over any controls + CDXUTControl* pControl = GetControlAtPoint( mousePoint ); + if( pControl != NULL && pControl->GetEnabled() ) + { + bHandled = pControl->HandleMouse( uMsg, mousePoint, wParam, lParam ); + if( bHandled ) + return true; + } + else + { + // Mouse not over any controls in this dialog, if there was a control + // which had focus it just lost it + if( uMsg == WM_LBUTTONDOWN && + s_pControlFocus && + s_pControlFocus->m_pDialog == this ) + { + s_pControlFocus->OnFocusOut(); + s_pControlFocus = NULL; + } + } + + // Still not handled, hand this off to the dialog. Return false to indicate the + // message should still be handled by the application (usually to move the camera). + switch( uMsg ) + { + case WM_MOUSEMOVE: + OnMouseMove( mousePoint ); + return false; + } + + break; + } + + case WM_CAPTURECHANGED: + { + // The application has lost mouse capture. + // The dialog object may not have received + // a WM_MOUSEUP when capture changed. Reset + // m_bDrag so that the dialog does not mistakenly + // think the mouse button is still held down. + if( ( HWND )lParam != hWnd ) + m_bDrag = false; + } + } + + return false; +} + +//-------------------------------------------------------------------------------------- +CDXUTControl* CDXUTDialog::GetControlAtPoint( POINT pt ) +{ + // Search through all child controls for the first one which + // contains the mouse point + for( int i = 0; i < m_Controls.GetSize(); i++ ) + { + CDXUTControl* pControl = m_Controls.GetAt( i ); + + if( pControl == NULL ) + { + continue; + } + + // We only return the current control if it is visible + // and enabled. Because GetControlAtPoint() is used to do mouse + // hittest, it makes sense to perform this filtering. + if( pControl->ContainsPoint( pt ) && pControl->GetEnabled() && pControl->GetVisible() ) + { + return pControl; + } + } + + return NULL; +} + + +//-------------------------------------------------------------------------------------- +bool CDXUTDialog::GetControlEnabled( int ID ) +{ + CDXUTControl* pControl = GetControl( ID ); + if( pControl == NULL ) + return false; + + return pControl->GetEnabled(); +} + + + +//-------------------------------------------------------------------------------------- +void CDXUTDialog::SetControlEnabled( int ID, bool bEnabled ) +{ + CDXUTControl* pControl = GetControl( ID ); + if( pControl == NULL ) + return; + + pControl->SetEnabled( bEnabled ); +} + + +//-------------------------------------------------------------------------------------- +void CDXUTDialog::OnMouseUp( POINT pt ) +{ + s_pControlPressed = NULL; + m_pControlMouseOver = NULL; +} + + +//-------------------------------------------------------------------------------------- +void CDXUTDialog::OnMouseMove( POINT pt ) +{ + // Figure out which control the mouse is over now + CDXUTControl* pControl = GetControlAtPoint( pt ); + + // If the mouse is still over the same control, nothing needs to be done + if( pControl == m_pControlMouseOver ) + return; + + // Handle mouse leaving the old control + if( m_pControlMouseOver ) + m_pControlMouseOver->OnMouseLeave(); + + // Handle mouse entering the new control + m_pControlMouseOver = pControl; + if( pControl != NULL ) + m_pControlMouseOver->OnMouseEnter(); +} + + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTDialog::SetDefaultElement( UINT nControlType, UINT iElement, CDXUTElement* pElement ) +{ + // If this Element type already exist in the list, simply update the stored Element + for( int i = 0; i < m_DefaultElements.GetSize(); i++ ) + { + DXUTElementHolder* pElementHolder = m_DefaultElements.GetAt( i ); + + if( pElementHolder->nControlType == nControlType && + pElementHolder->iElement == iElement ) + { + pElementHolder->Element = *pElement; + return S_OK; + } + } + + // Otherwise, add a new entry + DXUTElementHolder* pNewHolder; + pNewHolder = new DXUTElementHolder; + if( pNewHolder == NULL ) + return E_OUTOFMEMORY; + + pNewHolder->nControlType = nControlType; + pNewHolder->iElement = iElement; + pNewHolder->Element = *pElement; + + HRESULT hr = m_DefaultElements.Add( pNewHolder ); + if( FAILED( hr ) ) + { + delete pNewHolder; + } + return hr; +} + + +//-------------------------------------------------------------------------------------- +CDXUTElement* CDXUTDialog::GetDefaultElement( UINT nControlType, UINT iElement ) +{ + for( int i = 0; i < m_DefaultElements.GetSize(); i++ ) + { + DXUTElementHolder* pElementHolder = m_DefaultElements.GetAt( i ); + + if( pElementHolder->nControlType == nControlType && + pElementHolder->iElement == iElement ) + { + return &pElementHolder->Element; + } + } + + return NULL; +} + + + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTDialog::AddStatic( int ID, LPCWSTR strText, int x, int y, int width, int height, bool bIsDefault, + CDXUTStatic** ppCreated ) +{ + HRESULT hr = S_OK; + + CDXUTStatic* pStatic = new CDXUTStatic( this ); + + if( ppCreated != NULL ) + *ppCreated = pStatic; + + if( pStatic == NULL ) + return E_OUTOFMEMORY; + + hr = AddControl( pStatic ); + if( FAILED( hr ) ) + return hr; + + // Set the ID and list index + pStatic->SetID( ID ); + pStatic->SetText( strText ); + pStatic->SetLocation( x, y ); + pStatic->SetSize( width, height ); + pStatic->m_bIsDefault = bIsDefault; + + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTDialog::AddButton( int ID, LPCWSTR strText, int x, int y, int width, int height, UINT nHotkey, + bool bIsDefault, CDXUTButton** ppCreated ) +{ + HRESULT hr = S_OK; + + CDXUTButton* pButton = new CDXUTButton( this ); + + if( ppCreated != NULL ) + *ppCreated = pButton; + + if( pButton == NULL ) + return E_OUTOFMEMORY; + + hr = AddControl( pButton ); + if( FAILED( hr ) ) + return hr; + + // Set the ID and list index + pButton->SetID( ID ); + pButton->SetText( strText ); + pButton->SetLocation( x, y ); + pButton->SetSize( width, height ); + pButton->SetHotkey( nHotkey ); + pButton->m_bIsDefault = bIsDefault; + + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTDialog::AddCheckBox( int ID, LPCWSTR strText, int x, int y, int width, int height, bool bChecked, + UINT nHotkey, bool bIsDefault, CDXUTCheckBox** ppCreated ) +{ + HRESULT hr = S_OK; + + CDXUTCheckBox* pCheckBox = new CDXUTCheckBox( this ); + + if( ppCreated != NULL ) + *ppCreated = pCheckBox; + + if( pCheckBox == NULL ) + return E_OUTOFMEMORY; + + hr = AddControl( pCheckBox ); + if( FAILED( hr ) ) + return hr; + + // Set the ID and list index + pCheckBox->SetID( ID ); + pCheckBox->SetText( strText ); + pCheckBox->SetLocation( x, y ); + pCheckBox->SetSize( width, height ); + pCheckBox->SetHotkey( nHotkey ); + pCheckBox->m_bIsDefault = bIsDefault; + pCheckBox->SetChecked( bChecked ); + + return S_OK; +} + + + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTDialog::AddRadioButton( int ID, UINT nButtonGroup, LPCWSTR strText, int x, int y, int width, int height, + bool bChecked, UINT nHotkey, bool bIsDefault, CDXUTRadioButton** ppCreated ) +{ + HRESULT hr = S_OK; + + CDXUTRadioButton* pRadioButton = new CDXUTRadioButton( this ); + + if( ppCreated != NULL ) + *ppCreated = pRadioButton; + + if( pRadioButton == NULL ) + return E_OUTOFMEMORY; + + hr = AddControl( pRadioButton ); + if( FAILED( hr ) ) + return hr; + + // Set the ID and list index + pRadioButton->SetID( ID ); + pRadioButton->SetText( strText ); + pRadioButton->SetButtonGroup( nButtonGroup ); + pRadioButton->SetLocation( x, y ); + pRadioButton->SetSize( width, height ); + pRadioButton->SetHotkey( nHotkey ); + pRadioButton->SetChecked( bChecked ); + pRadioButton->m_bIsDefault = bIsDefault; + pRadioButton->SetChecked( bChecked ); + + return S_OK; +} + + + + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTDialog::AddComboBox( int ID, int x, int y, int width, int height, UINT nHotkey, bool bIsDefault, + CDXUTComboBox** ppCreated ) +{ + HRESULT hr = S_OK; + + CDXUTComboBox* pComboBox = new CDXUTComboBox( this ); + + if( ppCreated != NULL ) + *ppCreated = pComboBox; + + if( pComboBox == NULL ) + return E_OUTOFMEMORY; + + hr = AddControl( pComboBox ); + if( FAILED( hr ) ) + return hr; + + // Set the ID and list index + pComboBox->SetID( ID ); + pComboBox->SetLocation( x, y ); + pComboBox->SetSize( width, height ); + pComboBox->SetHotkey( nHotkey ); + pComboBox->m_bIsDefault = bIsDefault; + + return S_OK; +} + + + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTDialog::AddSlider( int ID, int x, int y, int width, int height, int min, int max, int value, + bool bIsDefault, CDXUTSlider** ppCreated ) +{ + HRESULT hr = S_OK; + + CDXUTSlider* pSlider = new CDXUTSlider( this ); + + if( ppCreated != NULL ) + *ppCreated = pSlider; + + if( pSlider == NULL ) + return E_OUTOFMEMORY; + + hr = AddControl( pSlider ); + if( FAILED( hr ) ) + return hr; + + // Set the ID and list index + pSlider->SetID( ID ); + pSlider->SetLocation( x, y ); + pSlider->SetSize( width, height ); + pSlider->m_bIsDefault = bIsDefault; + pSlider->SetRange( min, max ); + pSlider->SetValue( value ); + pSlider->UpdateRects(); + + return S_OK; +} + + + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTDialog::AddEditBox( int ID, LPCWSTR strText, int x, int y, int width, int height, bool bIsDefault, + CDXUTEditBox** ppCreated ) +{ + HRESULT hr = S_OK; + + CDXUTEditBox* pEditBox = new CDXUTEditBox( this ); + + if( ppCreated != NULL ) + *ppCreated = pEditBox; + + if( pEditBox == NULL ) + return E_OUTOFMEMORY; + + hr = AddControl( pEditBox ); + if( FAILED( hr ) ) + return hr; + + // Set the ID and position + pEditBox->SetID( ID ); + pEditBox->SetLocation( x, y ); + pEditBox->SetSize( width, height ); + pEditBox->m_bIsDefault = bIsDefault; + + if( strText ) + pEditBox->SetText( strText ); + + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTDialog::AddListBox( int ID, int x, int y, int width, int height, DWORD dwStyle, CDXUTListBox** ppCreated ) +{ + HRESULT hr = S_OK; + CDXUTListBox* pListBox = new CDXUTListBox( this ); + + if( ppCreated != NULL ) + *ppCreated = pListBox; + + if( pListBox == NULL ) + return E_OUTOFMEMORY; + + hr = AddControl( pListBox ); + if( FAILED( hr ) ) + return hr; + + // Set the ID and position + pListBox->SetID( ID ); + pListBox->SetLocation( x, y ); + pListBox->SetSize( width, height ); + pListBox->SetStyle( dwStyle ); + + return S_OK; +} + + + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTDialog::InitControl( CDXUTControl* pControl ) +{ + HRESULT hr; + + if( pControl == NULL ) + return E_INVALIDARG; + + pControl->m_Index = m_Controls.GetSize(); + + // Look for a default Element entries + for( int i = 0; i < m_DefaultElements.GetSize(); i++ ) + { + DXUTElementHolder* pElementHolder = m_DefaultElements.GetAt( i ); + if( pElementHolder->nControlType == pControl->GetType() ) + pControl->SetElement( pElementHolder->iElement, &pElementHolder->Element ); + } + + V_RETURN( pControl->OnInit() ); + + return S_OK; +} + + + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTDialog::AddControl( CDXUTControl* pControl ) +{ + HRESULT hr = S_OK; + + hr = InitControl( pControl ); + if( FAILED( hr ) ) + return DXTRACE_ERR( L"CDXUTDialog::InitControl", hr ); + + // Add to the list + hr = m_Controls.Add( pControl ); + if( FAILED( hr ) ) + { + return DXTRACE_ERR( L"CGrowableArray::Add", hr ); + } + + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +CDXUTControl* CDXUTDialog::GetControl( int ID ) +{ + // Try to find the control with the given ID + for( int i = 0; i < m_Controls.GetSize(); i++ ) + { + CDXUTControl* pControl = m_Controls.GetAt( i ); + + if( pControl->GetID() == ID ) + { + return pControl; + } + } + + // Not found + return NULL; +} + + + +//-------------------------------------------------------------------------------------- +CDXUTControl* CDXUTDialog::GetControl( int ID, UINT nControlType ) +{ + // Try to find the control with the given ID + for( int i = 0; i < m_Controls.GetSize(); i++ ) + { + CDXUTControl* pControl = m_Controls.GetAt( i ); + + if( pControl->GetID() == ID && pControl->GetType() == nControlType ) + { + return pControl; + } + } + + // Not found + return NULL; +} + + + +//-------------------------------------------------------------------------------------- +CDXUTControl* CDXUTDialog::GetNextControl( CDXUTControl* pControl ) +{ + int index = pControl->m_Index + 1; + + CDXUTDialog* pDialog = pControl->m_pDialog; + + // Cycle through dialogs in the loop to find the next control. Note + // that if only one control exists in all looped dialogs it will + // be the returned 'next' control. + while( index >= ( int )pDialog->m_Controls.GetSize() ) + { + pDialog = pDialog->m_pNextDialog; + index = 0; + } + + return pDialog->m_Controls.GetAt( index ); +} + +//-------------------------------------------------------------------------------------- +CDXUTControl* CDXUTDialog::GetPrevControl( CDXUTControl* pControl ) +{ + int index = pControl->m_Index - 1; + + CDXUTDialog* pDialog = pControl->m_pDialog; + + // Cycle through dialogs in the loop to find the next control. Note + // that if only one control exists in all looped dialogs it will + // be the returned 'previous' control. + while( index < 0 ) + { + pDialog = pDialog->m_pPrevDialog; + if( pDialog == NULL ) + pDialog = pControl->m_pDialog; + + index = pDialog->m_Controls.GetSize() - 1; + } + + return pDialog->m_Controls.GetAt( index ); +} + + +//-------------------------------------------------------------------------------------- +void CDXUTDialog::ClearRadioButtonGroup( UINT nButtonGroup ) +{ + // Find all radio buttons with the given group number + for( int i = 0; i < m_Controls.GetSize(); i++ ) + { + CDXUTControl* pControl = m_Controls.GetAt( i ); + + if( pControl->GetType() == DXUT_CONTROL_RADIOBUTTON ) + { + CDXUTRadioButton* pRadioButton = ( CDXUTRadioButton* )pControl; + + if( pRadioButton->GetButtonGroup() == nButtonGroup ) + pRadioButton->SetChecked( false, false ); + } + } +} + + + +//-------------------------------------------------------------------------------------- +void CDXUTDialog::ClearComboBox( int ID ) +{ + CDXUTComboBox* pComboBox = GetComboBox( ID ); + if( pComboBox == NULL ) + return; + + pComboBox->RemoveAllItems(); +} + + + + +//-------------------------------------------------------------------------------------- +void CDXUTDialog::RequestFocus( CDXUTControl* pControl ) +{ + if( s_pControlFocus == pControl ) + return; + + if( !pControl->CanHaveFocus() ) + return; + + if( s_pControlFocus ) + s_pControlFocus->OnFocusOut(); + + pControl->OnFocusIn(); + s_pControlFocus = pControl; +} + + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTDialog::DrawRect( RECT* pRect, D3DCOLOR color ) +{ + if( m_pManager->GetD3D9Device() ) + return DrawRect9( pRect, color ); + return E_FAIL; +} + + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTDialog::DrawRect9( RECT* pRect, D3DCOLOR color ) +{ + RECT rcScreen = *pRect; + OffsetRect( &rcScreen, m_x, m_y ); + + // If caption is enabled, offset the Y position by its height. + if( m_bCaption ) + OffsetRect( &rcScreen, 0, m_nCaptionHeight ); + + DXUT_SCREEN_VERTEX vertices[4] = + { + ( float )rcScreen.left - 0.5f, ( float )rcScreen.top - 0.5f, 0.5f, 1.0f, color, 0, 0, + ( float )rcScreen.right - 0.5f, ( float )rcScreen.top - 0.5f, 0.5f, 1.0f, color, 0, 0, + ( float )rcScreen.right - 0.5f, ( float )rcScreen.bottom - 0.5f, 0.5f, 1.0f, color, 0, 0, + ( float )rcScreen.left - 0.5f, ( float )rcScreen.bottom - 0.5f, 0.5f, 1.0f, color, 0, 0, + }; + + IDirect3DDevice9* pd3dDevice = m_pManager->GetD3D9Device(); + + // Since we're doing our own drawing here we need to flush the sprites + m_pManager->m_pSprite->Flush(); + IDirect3DVertexDeclaration9* pDecl = NULL; + pd3dDevice->GetVertexDeclaration( &pDecl ); // Preserve the sprite's current vertex decl + pd3dDevice->SetFVF( DXUT_SCREEN_VERTEX::FVF ); + + pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG2 ); + pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG2 ); + + pd3dDevice->DrawPrimitiveUP( D3DPT_TRIANGLEFAN, 2, vertices, sizeof( DXUT_SCREEN_VERTEX ) ); + + pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE ); + pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE ); + + // Restore the vertex decl + pd3dDevice->SetVertexDeclaration( pDecl ); + pDecl->Release(); + + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTDialog::DrawPolyLine( POINT* apPoints, UINT nNumPoints, D3DCOLOR color ) +{ + DXUT_SCREEN_VERTEX* vertices = new DXUT_SCREEN_VERTEX[ nNumPoints ]; + if( vertices == NULL ) + return E_OUTOFMEMORY; + + DXUT_SCREEN_VERTEX* pVertex = vertices; + POINT* pt = apPoints; + for( UINT i = 0; i < nNumPoints; i++ ) + { + pVertex->x = m_x + ( float )pt->x; + pVertex->y = m_y + ( float )pt->y; + pVertex->z = 0.5f; + pVertex->h = 1.0f; + pVertex->color = color; + pVertex->tu = 0.0f; + pVertex->tv = 0.0f; + + pVertex++; + pt++; + } + + IDirect3DDevice9* pd3dDevice = m_pManager->GetD3D9Device(); + + // Since we're doing our own drawing here we need to flush the sprites + m_pManager->m_pSprite->Flush(); + IDirect3DVertexDeclaration9* pDecl = NULL; + pd3dDevice->GetVertexDeclaration( &pDecl ); // Preserve the sprite's current vertex decl + pd3dDevice->SetFVF( DXUT_SCREEN_VERTEX::FVF ); + + pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG2 ); + pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG2 ); + + pd3dDevice->DrawPrimitiveUP( D3DPT_LINESTRIP, nNumPoints - 1, vertices, sizeof( DXUT_SCREEN_VERTEX ) ); + + pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE ); + pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE ); + + // Restore the vertex decl + pd3dDevice->SetVertexDeclaration( pDecl ); + pDecl->Release(); + + SAFE_DELETE_ARRAY( vertices ); + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTDialog::DrawSprite( CDXUTElement* pElement, RECT* prcDest, float fDepth ) +{ + if( m_pManager->GetD3D9Device() ) + return DrawSprite9( pElement, prcDest ); + else + return DrawSprite11( pElement, prcDest, fDepth ); +} + + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTDialog::DrawSprite9( CDXUTElement* pElement, RECT* prcDest ) +{ + // No need to draw fully transparent layers + if( pElement->TextureColor.Current.a == 0 ) + return S_OK; + + RECT rcTexture = pElement->rcTexture; + + RECT rcScreen = *prcDest; + OffsetRect( &rcScreen, m_x, m_y ); + + // If caption is enabled, offset the Y position by its height. + if( m_bCaption ) + OffsetRect( &rcScreen, 0, m_nCaptionHeight ); + + DXUTTextureNode* pTextureNode = GetTexture( pElement->iTexture ); + if( pTextureNode == NULL ) + return E_FAIL; + + float fScaleX = ( float )RectWidth( rcScreen ) / RectWidth( rcTexture ); + float fScaleY = ( float )RectHeight( rcScreen ) / RectHeight( rcTexture ); + + D3DXMATRIXA16 matTransform; + D3DXMatrixScaling( &matTransform, fScaleX, fScaleY, 1.0f ); + + m_pManager->m_pSprite->SetTransform( &matTransform ); + + D3DXVECTOR3 vPos( ( float )rcScreen.left, ( float )rcScreen.top, 0.0f ); + + vPos.x /= fScaleX; + vPos.y /= fScaleY; + + return m_pManager->m_pSprite->Draw( pTextureNode->pTexture9, &rcTexture, NULL, &vPos, + pElement->TextureColor.Current ); +} + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTDialog::DrawSprite11( CDXUTElement* pElement, RECT* prcDest, float fDepth ) +{ + // No need to draw fully transparent layers + if( pElement->TextureColor.Current.a == 0 ) + return S_OK; + + RECT rcTexture = pElement->rcTexture; + + RECT rcScreen = *prcDest; + OffsetRect( &rcScreen, m_x, m_y ); + + // If caption is enabled, offset the Y position by its height. + if( m_bCaption ) + OffsetRect( &rcScreen, 0, m_nCaptionHeight ); + + DXUTTextureNode* pTextureNode = GetTexture( pElement->iTexture ); + if( pTextureNode == NULL ) + return E_FAIL; + + float fBBWidth = ( float )m_pManager->m_nBackBufferWidth; + float fBBHeight = ( float )m_pManager->m_nBackBufferHeight; + float fTexWidth = ( float )pTextureNode->dwWidth; + float fTexHeight = ( float )pTextureNode->dwHeight; + + float fRectLeft = rcScreen.left / fBBWidth; + float fRectTop = 1.0f - rcScreen.top / fBBHeight; + float fRectRight = rcScreen.right / fBBWidth; + float fRectBottom = 1.0f - rcScreen.bottom / fBBHeight; + + fRectLeft = fRectLeft * 2.0f - 1.0f; + fRectTop = fRectTop * 2.0f - 1.0f; + fRectRight = fRectRight * 2.0f - 1.0f; + fRectBottom = fRectBottom * 2.0f - 1.0f; + + float fTexLeft = rcTexture.left / fTexWidth; + float fTexTop = rcTexture.top / fTexHeight; + float fTexRight = rcTexture.right / fTexWidth; + float fTexBottom = rcTexture.bottom / fTexHeight; + + // Add 6 sprite vertices + DXUTSpriteVertex SpriteVertex; + + // tri1 + SpriteVertex.vPos = D3DXVECTOR3( fRectLeft, fRectTop, fDepth ); + SpriteVertex.vTex = D3DXVECTOR2( fTexLeft, fTexTop ); + SpriteVertex.vColor = pElement->TextureColor.Current; + m_pManager->m_SpriteVertices.Add( SpriteVertex ); + + SpriteVertex.vPos = D3DXVECTOR3( fRectRight, fRectTop, fDepth ); + SpriteVertex.vTex = D3DXVECTOR2( fTexRight, fTexTop ); + SpriteVertex.vColor = pElement->TextureColor.Current; + m_pManager->m_SpriteVertices.Add( SpriteVertex ); + + SpriteVertex.vPos = D3DXVECTOR3( fRectLeft, fRectBottom, fDepth ); + SpriteVertex.vTex = D3DXVECTOR2( fTexLeft, fTexBottom ); + SpriteVertex.vColor = pElement->TextureColor.Current; + m_pManager->m_SpriteVertices.Add( SpriteVertex ); + + // tri2 + SpriteVertex.vPos = D3DXVECTOR3( fRectRight, fRectTop, fDepth ); + SpriteVertex.vTex = D3DXVECTOR2( fTexRight, fTexTop ); + SpriteVertex.vColor = pElement->TextureColor.Current; + m_pManager->m_SpriteVertices.Add( SpriteVertex ); + + SpriteVertex.vPos = D3DXVECTOR3( fRectRight, fRectBottom, fDepth ); + SpriteVertex.vTex = D3DXVECTOR2( fTexRight, fTexBottom ); + SpriteVertex.vColor = pElement->TextureColor.Current; + m_pManager->m_SpriteVertices.Add( SpriteVertex ); + + SpriteVertex.vPos = D3DXVECTOR3( fRectLeft, fRectBottom, fDepth ); + SpriteVertex.vTex = D3DXVECTOR2( fTexLeft, fTexBottom ); + SpriteVertex.vColor = pElement->TextureColor.Current; + m_pManager->m_SpriteVertices.Add( SpriteVertex ); + + // TODO: Why are we drawing the sprite every time? This is very inefficient, but the sprite workaround doesn't have support for sorting now, so we have to + // draw a sprite every time to keep the order correct between sprites and text. + m_pManager->EndSprites11( DXUTGetD3D11Device(), DXUTGetD3D11DeviceContext() ); + + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTDialog::CalcTextRect( LPCWSTR strText, CDXUTElement* pElement, RECT* prcDest, int nCount ) +{ + HRESULT hr = S_OK; + + DXUTFontNode* pFontNode = GetFont( pElement->iFont ); + if( pFontNode == NULL ) + return E_FAIL; + + DWORD dwTextFormat = pElement->dwTextFormat | DT_CALCRECT; + // Since we are only computing the rectangle, we don't need a sprite. + if( pFontNode->pFont9 ) + { + hr = pFontNode->pFont9->DrawText( NULL, strText, nCount, prcDest, dwTextFormat, pElement->FontColor.Current ); + if( FAILED( hr ) ) + return hr; + } + + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTDialog::DrawText( LPCWSTR strText, CDXUTElement* pElement, RECT* prcDest, bool bShadow, int nCount, bool bCenter ) +{ + if( m_pManager->GetD3D9Device() ) + return DrawText9( strText, pElement, prcDest, bShadow, nCount ); + else + return DrawText11( m_pManager->GetD3D11Device(), m_pManager->GetD3D11DeviceContext(), strText, pElement, prcDest, bShadow, nCount, bCenter ); +} + + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTDialog::DrawText9( LPCWSTR strText, CDXUTElement* pElement, RECT* prcDest, bool bShadow, int nCount ) +{ + HRESULT hr = S_OK; + + // No need to draw fully transparent layers + if( pElement->FontColor.Current.a == 0 ) + return S_OK; + + RECT rcScreen = *prcDest; + OffsetRect( &rcScreen, m_x, m_y ); + + // If caption is enabled, offset the Y position by its height. + if( m_bCaption ) + OffsetRect( &rcScreen, 0, m_nCaptionHeight ); + + D3DXMATRIX matTransform; + D3DXMatrixIdentity( &matTransform ); + m_pManager->m_pSprite->SetTransform( &matTransform ); + + DXUTFontNode* pFontNode = GetFont( pElement->iFont ); + + if( bShadow ) + { + RECT rcShadow = rcScreen; + OffsetRect( &rcShadow, 1, 1 ); + hr = pFontNode->pFont9->DrawText( m_pManager->m_pSprite, strText, nCount, &rcShadow, pElement->dwTextFormat, + D3DCOLOR_ARGB( DWORD( pElement->FontColor.Current.a * 255 ), 0, 0, 0 ) ); + if( FAILED( hr ) ) + return hr; + } + + hr = pFontNode->pFont9->DrawText( m_pManager->m_pSprite, strText, nCount, &rcScreen, pElement->dwTextFormat, + pElement->FontColor.Current ); + if( FAILED( hr ) ) + return hr; + + return S_OK; +} + +ID3D11Buffer* g_pFontBuffer11 = NULL; +UINT g_FontBufferBytes11 = 0; +CGrowableArray g_FontVertices; +ID3D11ShaderResourceView* g_pFont11 = NULL; +ID3D11InputLayout* g_pInputLayout11 = NULL; +HRESULT InitFont11( ID3D11Device* pd3d11Device, ID3D11InputLayout* pInputLayout ) +{ + HRESULT hr = S_OK; + WCHAR str[MAX_PATH]; + V_RETURN( DXUTFindDXSDKMediaFileCch( str, MAX_PATH, L"UI\\Font.dds" ) ); + + if (pd3d11Device->GetFeatureLevel() < D3D_FEATURE_LEVEL_10_0 ) { + + D3DX11_IMAGE_INFO dii; + D3DX11GetImageInfoFromFile( str, NULL, &dii, NULL ); + + D3DX11_IMAGE_LOAD_INFO dili; + dili.BindFlags = D3DX11_DEFAULT; + dili.CpuAccessFlags = D3DX11_DEFAULT; + dili.Depth = D3DX11_DEFAULT; + dili.Filter = D3DX11_DEFAULT; + dili.FirstMipLevel = 0; + dili.Format = DXGI_FORMAT_R8G8B8A8_UNORM; + dili.Height = D3DX11_DEFAULT; + dili.MipFilter = D3DX11_DEFAULT; + dili.MipLevels = 1; + dili.MiscFlags = D3DX11_DEFAULT; + dili.pSrcInfo = &dii; + dili.Usage = D3D11_USAGE_DEFAULT ; + dili.Width = D3DX11_DEFAULT; + + V_RETURN( D3DX11CreateShaderResourceViewFromFile( pd3d11Device, str, &dili, NULL, &g_pFont11, &hr) ); + } else { + V_RETURN( D3DX11CreateShaderResourceViewFromFile( pd3d11Device, str, NULL, NULL, &g_pFont11, &hr) ); + + } + + + g_pInputLayout11 = pInputLayout; + return hr; +} + +void EndFont11() +{ + SAFE_RELEASE( g_pFontBuffer11 ); + g_FontBufferBytes11 = 0; + SAFE_RELEASE( g_pFont11 ); +} + +void BeginText11() +{ + g_FontVertices.Reset(); +} + +void DrawText11DXUT( ID3D11Device* pd3dDevice, ID3D11DeviceContext* pd3d11DeviceContext, + LPCWSTR strText, RECT rcScreen, D3DXCOLOR vFontColor, + float fBBWidth, float fBBHeight, bool bCenter ) +{ + float fCharTexSizeX = 0.010526315f; + //float fGlyphSizeX = 14.0f / fBBWidth; + //float fGlyphSizeY = 32.0f / fBBHeight; + float fGlyphSizeX = 15.0f / fBBWidth; + float fGlyphSizeY = 42.0f / fBBHeight; + + + float fRectLeft = rcScreen.left / fBBWidth; + float fRectTop = 1.0f - rcScreen.top / fBBHeight; + + fRectLeft = fRectLeft * 2.0f - 1.0f; + fRectTop = fRectTop * 2.0f - 1.0f; + + int NumChars = (int)wcslen( strText ); + if (bCenter) { + float fRectRight = rcScreen.right / fBBWidth; + fRectRight = fRectRight * 2.0f - 1.0f; + float fRectBottom = 1.0f - rcScreen.bottom / fBBHeight; + fRectBottom = fRectBottom * 2.0f - 1.0f; + float fcenterx = ((fRectRight - fRectLeft) - (float)NumChars*fGlyphSizeX) *0.5f; + float fcentery = ((fRectTop - fRectBottom) - (float)1*fGlyphSizeY) *0.5f; + fRectLeft += fcenterx ; + fRectTop -= fcentery; + } + float fOriginalLeft = fRectLeft; + float fTexTop = 0.0f; + float fTexBottom = 1.0f; + + float fDepth = 0.5f; + for( int i=0; i 126 ) + { + continue; + } + + // Add 6 sprite vertices + DXUTSpriteVertex SpriteVertex; + float fRectRight = fRectLeft + fGlyphSizeX; + float fRectBottom = fRectTop - fGlyphSizeY; + float fTexLeft = ( strText[i] - 32 ) * fCharTexSizeX; + float fTexRight = fTexLeft + fCharTexSizeX; + + // tri1 + SpriteVertex.vPos = D3DXVECTOR3( fRectLeft, fRectTop, fDepth ); + SpriteVertex.vTex = D3DXVECTOR2( fTexLeft, fTexTop ); + SpriteVertex.vColor = vFontColor; + g_FontVertices.Add( SpriteVertex ); + + SpriteVertex.vPos = D3DXVECTOR3( fRectRight, fRectTop, fDepth ); + SpriteVertex.vTex = D3DXVECTOR2( fTexRight, fTexTop ); + SpriteVertex.vColor = vFontColor; + g_FontVertices.Add( SpriteVertex ); + + SpriteVertex.vPos = D3DXVECTOR3( fRectLeft, fRectBottom, fDepth ); + SpriteVertex.vTex = D3DXVECTOR2( fTexLeft, fTexBottom ); + SpriteVertex.vColor = vFontColor; + g_FontVertices.Add( SpriteVertex ); + + // tri2 + SpriteVertex.vPos = D3DXVECTOR3( fRectRight, fRectTop, fDepth ); + SpriteVertex.vTex = D3DXVECTOR2( fTexRight, fTexTop ); + SpriteVertex.vColor = vFontColor; + g_FontVertices.Add( SpriteVertex ); + + SpriteVertex.vPos = D3DXVECTOR3( fRectRight, fRectBottom, fDepth ); + SpriteVertex.vTex = D3DXVECTOR2( fTexRight, fTexBottom ); + SpriteVertex.vColor = vFontColor; + g_FontVertices.Add( SpriteVertex ); + + SpriteVertex.vPos = D3DXVECTOR3( fRectLeft, fRectBottom, fDepth ); + SpriteVertex.vTex = D3DXVECTOR2( fTexLeft, fTexBottom ); + SpriteVertex.vColor = vFontColor; + g_FontVertices.Add( SpriteVertex ); + + fRectLeft += fGlyphSizeX; + + } + + // TODO: We have to end text after every line so that rendering order between sprites and fonts is preserved + EndText11( pd3dDevice, pd3d11DeviceContext ); +} + +void EndText11( ID3D11Device* pd3dDevice, ID3D11DeviceContext* pd3d11DeviceContext ) +{ + + // ensure our buffer size can hold our sprites + UINT FontDataBytes = g_FontVertices.GetSize() * sizeof( DXUTSpriteVertex ); + if( g_FontBufferBytes11 < FontDataBytes ) + { + SAFE_RELEASE( g_pFontBuffer11 ); + g_FontBufferBytes11 = FontDataBytes; + + D3D11_BUFFER_DESC BufferDesc; + BufferDesc.ByteWidth = g_FontBufferBytes11; + BufferDesc.Usage = D3D11_USAGE_DYNAMIC; + BufferDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER; + BufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; + BufferDesc.MiscFlags = 0; + + pd3dDevice->CreateBuffer( &BufferDesc, NULL, &g_pFontBuffer11 ); + } + + // Copy the sprites over + D3D11_BOX destRegion; + destRegion.left = 0; + destRegion.right = FontDataBytes; + destRegion.top = 0; + destRegion.bottom = 1; + destRegion.front = 0; + destRegion.back = 1; + D3D11_MAPPED_SUBRESOURCE MappedResource; + if ( S_OK == pd3d11DeviceContext->Map( g_pFontBuffer11, 0, D3D11_MAP_WRITE_DISCARD, 0, &MappedResource ) ) { + CopyMemory( MappedResource.pData, (void*)g_FontVertices.GetData(), FontDataBytes ); + pd3d11DeviceContext->Unmap(g_pFontBuffer11, 0); + } + + ID3D11ShaderResourceView* pOldTexture = NULL; + pd3d11DeviceContext->PSGetShaderResources( 0, 1, &pOldTexture ); + pd3d11DeviceContext->PSSetShaderResources( 0, 1, &g_pFont11 ); + + // Draw + UINT Stride = sizeof( DXUTSpriteVertex ); + UINT Offset = 0; + pd3d11DeviceContext->IASetVertexBuffers( 0, 1, &g_pFontBuffer11, &Stride, &Offset ); + pd3d11DeviceContext->IASetInputLayout( g_pInputLayout11 ); + pd3d11DeviceContext->IASetPrimitiveTopology( D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST ); + pd3d11DeviceContext->Draw( g_FontVertices.GetSize(), 0 ); + + pd3d11DeviceContext->PSSetShaderResources( 0, 1, &pOldTexture ); + SAFE_RELEASE( pOldTexture ); + + g_FontVertices.Reset(); +} + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTDialog::DrawText11( ID3D11Device* pd3dDevice, ID3D11DeviceContext* pd3d11DeviceContext, + LPCWSTR strText, CDXUTElement* pElement, RECT* prcDest, bool bShadow, int nCount, bool bCenter ) +{ + //HRESULT hr = S_OK; + + // No need to draw fully transparent layers + if( pElement->FontColor.Current.a == 0 ) + return S_OK; + + RECT rcScreen = *prcDest; + OffsetRect( &rcScreen, m_x, m_y); + + // If caption is enabled, offset the Y position by its height. + if( m_bCaption ) + OffsetRect( &rcScreen, 0, m_nCaptionHeight ); + + float fBBWidth = ( float )m_pManager->m_nBackBufferWidth; + float fBBHeight = ( float )m_pManager->m_nBackBufferHeight; + + if( bShadow ) + { + RECT rcShadow = rcScreen; + OffsetRect( &rcShadow, 1, 1 ); + + D3DXCOLOR vShadowColor( 0,0,0, 1.0f ); + DrawText11DXUT( pd3dDevice, pd3d11DeviceContext, + strText, rcShadow, vShadowColor, + fBBWidth, fBBHeight, bCenter ); + + } + + D3DXCOLOR vFontColor( pElement->FontColor.Current.r, pElement->FontColor.Current.g, pElement->FontColor.Current.b, 1.0f ); + DrawText11DXUT( pd3dDevice, pd3d11DeviceContext, + strText, rcScreen, vFontColor, + fBBWidth, fBBHeight, bCenter ); + + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +void CDXUTDialog::SetBackgroundColors( D3DCOLOR colorTopLeft, D3DCOLOR colorTopRight, D3DCOLOR colorBottomLeft, + D3DCOLOR colorBottomRight ) +{ + m_colorTopLeft = colorTopLeft; + m_colorTopRight = colorTopRight; + m_colorBottomLeft = colorBottomLeft; + m_colorBottomRight = colorBottomRight; +} + + +//-------------------------------------------------------------------------------------- +void CDXUTDialog::SetNextDialog( CDXUTDialog* pNextDialog ) +{ + if( pNextDialog == NULL ) + pNextDialog = this; + + m_pNextDialog = pNextDialog; + if( pNextDialog ) + m_pNextDialog->m_pPrevDialog = this; +} + + +//-------------------------------------------------------------------------------------- +void CDXUTDialog::ClearFocus() +{ + if( s_pControlFocus ) + { + s_pControlFocus->OnFocusOut(); + s_pControlFocus = NULL; + } + + ReleaseCapture(); +} + + +//-------------------------------------------------------------------------------------- +void CDXUTDialog::FocusDefaultControl() +{ + // Check for default control in this dialog + for( int i = 0; i < m_Controls.GetSize(); i++ ) + { + CDXUTControl* pControl = m_Controls.GetAt( i ); + if( pControl->m_bIsDefault ) + { + // Remove focus from the current control + ClearFocus(); + + // Give focus to the default control + s_pControlFocus = pControl; + s_pControlFocus->OnFocusIn(); + return; + } + } +} + + +//-------------------------------------------------------------------------------------- +bool CDXUTDialog::OnCycleFocus( bool bForward ) +{ + CDXUTControl* pControl = NULL; + CDXUTDialog* pDialog = NULL; // pDialog and pLastDialog are used to track wrapping of + CDXUTDialog* pLastDialog; // focus from first control to last or vice versa. + + if( s_pControlFocus == NULL ) + { + // If s_pControlFocus is NULL, we focus the first control of first dialog in + // the case that bForward is true, and focus the last control of last dialog when + // bForward is false. + // + if( bForward ) + { + // Search for the first control from the start of the dialog + // array. + for( int d = 0; d < m_pManager->m_Dialogs.GetSize(); ++d ) + { + pDialog = pLastDialog = m_pManager->m_Dialogs.GetAt( d ); + if( pDialog && pDialog->m_Controls.GetSize() > 0 ) + { + pControl = pDialog->m_Controls.GetAt( 0 ); + break; + } + } + + if( !pDialog || !pControl ) + { + // No dialog has been registered yet or no controls have been + // added to the dialogs. Cannot proceed. + return true; + } + } + else + { + // Search for the first control from the end of the dialog + // array. + for( int d = m_pManager->m_Dialogs.GetSize() - 1; d >= 0; --d ) + { + pDialog = pLastDialog = m_pManager->m_Dialogs.GetAt( d ); + if( pDialog && pDialog->m_Controls.GetSize() > 0 ) + { + pControl = pDialog->m_Controls.GetAt( pDialog->m_Controls.GetSize() - 1 ); + break; + } + } + + if( !pDialog || !pControl ) + { + // No dialog has been registered yet or no controls have been + // added to the dialogs. Cannot proceed. + return true; + } + } + } + else if( s_pControlFocus->m_pDialog != this ) + { + // If a control belonging to another dialog has focus, let that other + // dialog handle this event by returning false. + // + return false; + } + else + { + // Focused control belongs to this dialog. Cycle to the + // next/previous control. + pLastDialog = s_pControlFocus->m_pDialog; + pControl = ( bForward ) ? GetNextControl( s_pControlFocus ) : GetPrevControl( s_pControlFocus ); + pDialog = pControl->m_pDialog; + } + + for( int i = 0; i < 0xffff; i++ ) + { + // If we just wrapped from last control to first or vice versa, + // set the focused control to NULL. This state, where no control + // has focus, allows the camera to work. + int nLastDialogIndex = m_pManager->m_Dialogs.IndexOf( pLastDialog ); + int nDialogIndex = m_pManager->m_Dialogs.IndexOf( pDialog ); + if( ( !bForward && nLastDialogIndex < nDialogIndex ) || + ( bForward && nDialogIndex < nLastDialogIndex ) ) + { + if( s_pControlFocus ) + s_pControlFocus->OnFocusOut(); + s_pControlFocus = NULL; + return true; + } + + // If we've gone in a full circle then focus doesn't change + if( pControl == s_pControlFocus ) + return true; + + // If the dialog accepts keybord input and the control can have focus then + // move focus + if( pControl->m_pDialog->m_bKeyboardInput && pControl->CanHaveFocus() ) + { + if( s_pControlFocus ) + s_pControlFocus->OnFocusOut(); + s_pControlFocus = pControl; + s_pControlFocus->OnFocusIn(); + return true; + } + + pLastDialog = pDialog; + pControl = ( bForward ) ? GetNextControl( pControl ) : GetPrevControl( pControl ); + pDialog = pControl->m_pDialog; + } + + // If we reached this point, the chain of dialogs didn't form a complete loop + DXTRACE_ERR( L"CDXUTDialog: Multiple dialogs are improperly chained together", E_FAIL ); + return false; +} + + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTDialogResourceManager::CreateFont9( UINT iFont ) +{ + HRESULT hr = S_OK; + + DXUTFontNode* pFontNode = m_FontCache.GetAt( iFont ); + + SAFE_RELEASE( pFontNode->pFont9 ); + + V_RETURN( D3DXCreateFont( m_pd3d9Device, pFontNode->nHeight, 0, pFontNode->nWeight, 1, FALSE, DEFAULT_CHARSET, + OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, + pFontNode->strFace, &pFontNode->pFont9 ) ); + + return S_OK; +} + + + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTDialogResourceManager::CreateFont11( UINT iFont ) +{ + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTDialogResourceManager::CreateTexture9( UINT iTexture ) +{ + HRESULT hr = S_OK; + + DXUTTextureNode* pTextureNode = m_TextureCache.GetAt( iTexture ); + + + D3DXIMAGE_INFO info; + + if( !pTextureNode->bFileSource ) + { + if( pTextureNode->nResourceID == 0xFFFF && pTextureNode->hResourceModule == ( HMODULE )0xFFFF ) + { + hr = DXUTCreateGUITextureFromInternalArray9( m_pd3d9Device, &pTextureNode->pTexture9, &info ); + if( FAILED( hr ) ) + return DXTRACE_ERR( L"D3DXCreateTextureFromFileInMemoryEx", hr ); + } + else + { + LPCWSTR pID = pTextureNode->nResourceID ? ( LPCWSTR )( size_t )pTextureNode->nResourceID : + pTextureNode->strFilename; + + // Create texture from resource + hr = D3DXCreateTextureFromResourceEx( m_pd3d9Device, pTextureNode->hResourceModule, pID, D3DX_DEFAULT, + D3DX_DEFAULT, + 1, 0, D3DFMT_UNKNOWN, D3DPOOL_MANAGED, + D3DX_DEFAULT, D3DX_DEFAULT, 0, + &info, NULL, &pTextureNode->pTexture9 ); + if( FAILED( hr ) ) + return DXTRACE_ERR( L"D3DXCreateTextureFromResourceEx", hr ); + } + } + else + { + // Make sure there's a texture to create + if( pTextureNode->strFilename[0] == 0 ) + return S_OK; + + // Create texture from file + hr = D3DXCreateTextureFromFileEx( m_pd3d9Device, pTextureNode->strFilename, D3DX_DEFAULT, D3DX_DEFAULT, + 1, 0, D3DFMT_UNKNOWN, D3DPOOL_MANAGED, + D3DX_DEFAULT, D3DX_DEFAULT, 0, + &info, NULL, &pTextureNode->pTexture9 ); + if( FAILED( hr ) ) + { + return DXTRACE_ERR( L"D3DXCreateTextureFromFileEx", hr ); + } + } + + // Store dimensions + pTextureNode->dwWidth = info.Width; + pTextureNode->dwHeight = info.Height; + + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTDialogResourceManager::CreateTexture11( UINT iTexture ) +{ + HRESULT hr = S_OK; + + DXUTTextureNode* pTextureNode = m_TextureCache.GetAt( iTexture ); + + if( !pTextureNode->bFileSource ) + { + if( pTextureNode->nResourceID == 0xFFFF && pTextureNode->hResourceModule == ( HMODULE )0xFFFF ) + { + hr = DXUTCreateGUITextureFromInternalArray11( m_pd3d11Device, &pTextureNode->pTexture11, NULL ); + if( FAILED( hr ) ) + return DXTRACE_ERR( L"D3DX10CreateResourceFromFileInMemory", hr ); + } + //else + //{ + // LPCWSTR pID = pTextureNode->nResourceID ? ( LPCWSTR )( size_t )pTextureNode->nResourceID : + // pTextureNode->strFilename; + + // D3DX10_IMAGE_INFO SrcInfo; + // D3DX10GetImageInfoFromResource( NULL, pID, NULL, &SrcInfo, NULL ); + + // // Create texture from resource + // ID3D10Resource* pRes; + // D3DX10_IMAGE_LOAD_INFO loadInfo; + // loadInfo.Width = D3DX10_DEFAULT; + // loadInfo.Height = D3DX10_DEFAULT; + // loadInfo.Depth = D3DX10_DEFAULT; + // loadInfo.FirstMipLevel = 0; + // loadInfo.MipLevels = 1; + // loadInfo.Usage = D3D10_USAGE_DEFAULT; + // loadInfo.BindFlags = D3D10_BIND_SHADER_RESOURCE; + // loadInfo.CpuAccessFlags = 0; + // loadInfo.MiscFlags = 0; + // loadInfo.Format = MAKE_TYPELESS( SrcInfo.Format ); + // loadInfo.Filter = D3DX10_FILTER_NONE; + // loadInfo.MipFilter = D3DX10_FILTER_NONE; + // loadInfo.pSrcInfo = &SrcInfo; + + // hr = D3DX10CreateTextureFromResource( m_pd3d10Device, pTextureNode->hResourceModule, pID, &loadInfo, + // NULL, &pRes, NULL ); + // if( FAILED( hr ) ) + // return DXTRACE_ERR( L"D3DX10CreateResourceFromResource", hr ); + // hr = pRes->QueryInterface( __uuidof( ID3D10Texture2D ), ( LPVOID* )&pTextureNode->pTexture10 ); + // SAFE_RELEASE( pRes ); + // if( FAILED( hr ) ) + // return hr; + //} + } + else + { + // + //// Make sure there's a texture to create + //if( pTextureNode->strFilename[0] == 0 ) + // return S_OK; + + //D3DX10_IMAGE_INFO SrcInfo; + //D3DX10GetImageInfoFromFile( pTextureNode->strFilename, NULL, &SrcInfo, NULL ); + + //// Create texture from file + //ID3D10Resource* pRes; + //D3DX10_IMAGE_LOAD_INFO loadInfo; + //loadInfo.Width = D3DX10_DEFAULT; + //loadInfo.Height = D3DX10_DEFAULT; + //loadInfo.Depth = D3DX10_DEFAULT; + //loadInfo.FirstMipLevel = 0; + //loadInfo.MipLevels = 1; + //loadInfo.Usage = D3D10_USAGE_DEFAULT; + //loadInfo.BindFlags = D3D10_BIND_SHADER_RESOURCE; + //loadInfo.CpuAccessFlags = 0; + //loadInfo.MiscFlags = 0; + //loadInfo.Format = MAKE_TYPELESS( SrcInfo.Format ); + //loadInfo.Filter = D3DX10_FILTER_NONE; + //loadInfo.MipFilter = D3DX10_FILTER_NONE; + //loadInfo.pSrcInfo = &SrcInfo; + //hr = D3DX10CreateTextureFromFile( m_pd3d10Device, pTextureNode->strFilename, &loadInfo, NULL, &pRes, NULL ); + //if( FAILED( hr ) ) + //{ + // return DXTRACE_ERR( L"D3DX10CreateResourceFromFileEx", hr ); + //} + //hr = pRes->QueryInterface( __uuidof( ID3D10Texture2D ), ( LPVOID* )&pTextureNode->pTexture10 ); + //SAFE_RELEASE( pRes ); + //if( FAILED( hr ) ) + // return hr; + // + } + + // Store dimensions + D3D11_TEXTURE2D_DESC desc; + pTextureNode->pTexture11->GetDesc( &desc ); + pTextureNode->dwWidth = desc.Width; + pTextureNode->dwHeight = desc.Height; + + // Create resource view + D3D11_SHADER_RESOURCE_VIEW_DESC SRVDesc; + SRVDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; + SRVDesc.Format = MAKE_SRGB( desc.Format ); + SRVDesc.Texture2D.MipLevels = 1; + SRVDesc.Texture2D.MostDetailedMip = 0; + hr = m_pd3d11Device->CreateShaderResourceView( pTextureNode->pTexture11, &SRVDesc, &pTextureNode->pTexResView11 ); + + return hr; +} + + +//-------------------------------------------------------------------------------------- +void CDXUTDialog::InitDefaultElements() +{ + SetFont( 0, L"Arial", 14, FW_NORMAL ); + + CDXUTElement Element; + RECT rcTexture; + + //------------------------------------- + // Element for the caption + //------------------------------------- + m_CapElement.SetFont( 0 ); + SetRect( &rcTexture, 17, 269, 241, 287 ); + m_CapElement.SetTexture( 0, &rcTexture ); + m_CapElement.TextureColor.States[ DXUT_STATE_NORMAL ] = D3DCOLOR_ARGB( 255, 255, 255, 255 ); + m_CapElement.FontColor.States[ DXUT_STATE_NORMAL ] = D3DCOLOR_ARGB( 255, 255, 255, 255 ); + m_CapElement.SetFont( 0, D3DCOLOR_ARGB( 255, 255, 255, 255 ), DT_LEFT | DT_VCENTER ); + // Pre-blend as we don't need to transition the state + m_CapElement.TextureColor.Blend( DXUT_STATE_NORMAL, 10.0f ); + m_CapElement.FontColor.Blend( DXUT_STATE_NORMAL, 10.0f ); + + //------------------------------------- + // CDXUTStatic + //------------------------------------- + Element.SetFont( 0 ); + Element.FontColor.States[ DXUT_STATE_DISABLED ] = D3DCOLOR_ARGB( 200, 200, 200, 200 ); + + // Assign the Element + SetDefaultElement( DXUT_CONTROL_STATIC, 0, &Element ); + + + //------------------------------------- + // CDXUTButton - Button + //------------------------------------- + SetRect( &rcTexture, 0, 0, 136, 54 ); + Element.SetTexture( 0, &rcTexture ); + Element.SetFont( 0 ); + Element.TextureColor.States[ DXUT_STATE_NORMAL ] = D3DCOLOR_ARGB( 150, 255, 255, 255 ); + Element.TextureColor.States[ DXUT_STATE_PRESSED ] = D3DCOLOR_ARGB( 200, 255, 255, 255 ); + Element.FontColor.States[ DXUT_STATE_MOUSEOVER ] = D3DCOLOR_ARGB( 255, 0, 0, 0 ); + + // Assign the Element + SetDefaultElement( DXUT_CONTROL_BUTTON, 0, &Element ); + + + //------------------------------------- + // CDXUTButton - Fill layer + //------------------------------------- + SetRect( &rcTexture, 136, 0, 252, 54 ); + Element.SetTexture( 0, &rcTexture, D3DCOLOR_ARGB( 0, 255, 255, 255 ) ); + Element.TextureColor.States[ DXUT_STATE_MOUSEOVER ] = D3DCOLOR_ARGB( 160, 255, 255, 255 ); + Element.TextureColor.States[ DXUT_STATE_PRESSED ] = D3DCOLOR_ARGB( 60, 0, 0, 0 ); + Element.TextureColor.States[ DXUT_STATE_FOCUS ] = D3DCOLOR_ARGB( 30, 255, 255, 255 ); + + + // Assign the Element + SetDefaultElement( DXUT_CONTROL_BUTTON, 1, &Element ); + + + //------------------------------------- + // CDXUTCheckBox - Box + //------------------------------------- + SetRect( &rcTexture, 0, 54, 27, 81 ); + Element.SetTexture( 0, &rcTexture ); + Element.SetFont( 0, D3DCOLOR_ARGB( 255, 255, 255, 255 ), DT_LEFT | DT_VCENTER ); + Element.FontColor.States[ DXUT_STATE_DISABLED ] = D3DCOLOR_ARGB( 200, 200, 200, 200 ); + Element.TextureColor.States[ DXUT_STATE_NORMAL ] = D3DCOLOR_ARGB( 150, 255, 255, 255 ); + Element.TextureColor.States[ DXUT_STATE_FOCUS ] = D3DCOLOR_ARGB( 200, 255, 255, 255 ); + Element.TextureColor.States[ DXUT_STATE_PRESSED ] = D3DCOLOR_ARGB( 255, 255, 255, 255 ); + + // Assign the Element + SetDefaultElement( DXUT_CONTROL_CHECKBOX, 0, &Element ); + + + //------------------------------------- + // CDXUTCheckBox - Check + //------------------------------------- + SetRect( &rcTexture, 27, 54, 54, 81 ); + Element.SetTexture( 0, &rcTexture ); + + // Assign the Element + SetDefaultElement( DXUT_CONTROL_CHECKBOX, 1, &Element ); + + + //------------------------------------- + // CDXUTRadioButton - Box + //------------------------------------- + SetRect( &rcTexture, 54, 54, 81, 81 ); + Element.SetTexture( 0, &rcTexture ); + Element.SetFont( 0, D3DCOLOR_ARGB( 255, 255, 255, 255 ), DT_LEFT | DT_VCENTER ); + Element.FontColor.States[ DXUT_STATE_DISABLED ] = D3DCOLOR_ARGB( 200, 200, 200, 200 ); + Element.TextureColor.States[ DXUT_STATE_NORMAL ] = D3DCOLOR_ARGB( 150, 255, 255, 255 ); + Element.TextureColor.States[ DXUT_STATE_FOCUS ] = D3DCOLOR_ARGB( 200, 255, 255, 255 ); + Element.TextureColor.States[ DXUT_STATE_PRESSED ] = D3DCOLOR_ARGB( 255, 255, 255, 255 ); + + // Assign the Element + SetDefaultElement( DXUT_CONTROL_RADIOBUTTON, 0, &Element ); + + + //------------------------------------- + // CDXUTRadioButton - Check + //------------------------------------- + SetRect( &rcTexture, 81, 54, 108, 81 ); + Element.SetTexture( 0, &rcTexture ); + + // Assign the Element + SetDefaultElement( DXUT_CONTROL_RADIOBUTTON, 1, &Element ); + + + //------------------------------------- + // CDXUTComboBox - Main + //------------------------------------- + SetRect( &rcTexture, 7, 81, 247, 123 ); + Element.SetTexture( 0, &rcTexture ); + Element.SetFont( 0 ); + Element.TextureColor.States[ DXUT_STATE_NORMAL ] = D3DCOLOR_ARGB( 150, 200, 200, 200 ); + Element.TextureColor.States[ DXUT_STATE_FOCUS ] = D3DCOLOR_ARGB( 170, 230, 230, 230 ); + Element.TextureColor.States[ DXUT_STATE_DISABLED ] = D3DCOLOR_ARGB( 70, 200, 200, 200 ); + Element.FontColor.States[ DXUT_STATE_MOUSEOVER ] = D3DCOLOR_ARGB( 255, 0, 0, 0 ); + Element.FontColor.States[ DXUT_STATE_PRESSED ] = D3DCOLOR_ARGB( 255, 0, 0, 0 ); + Element.FontColor.States[ DXUT_STATE_DISABLED ] = D3DCOLOR_ARGB( 200, 200, 200, 200 ); + + + // Assign the Element + SetDefaultElement( DXUT_CONTROL_COMBOBOX, 0, &Element ); + + + //------------------------------------- + // CDXUTComboBox - Button + //------------------------------------- + SetRect( &rcTexture, 98, 189, 151, 238 ); + Element.SetTexture( 0, &rcTexture ); + Element.TextureColor.States[ DXUT_STATE_NORMAL ] = D3DCOLOR_ARGB( 150, 255, 255, 255 ); + Element.TextureColor.States[ DXUT_STATE_PRESSED ] = D3DCOLOR_ARGB( 255, 150, 150, 150 ); + Element.TextureColor.States[ DXUT_STATE_FOCUS ] = D3DCOLOR_ARGB( 200, 255, 255, 255 ); + Element.TextureColor.States[ DXUT_STATE_DISABLED ] = D3DCOLOR_ARGB( 70, 255, 255, 255 ); + + // Assign the Element + SetDefaultElement( DXUT_CONTROL_COMBOBOX, 1, &Element ); + + + //------------------------------------- + // CDXUTComboBox - Dropdown + //------------------------------------- + SetRect( &rcTexture, 13, 123, 241, 160 ); + Element.SetTexture( 0, &rcTexture ); + Element.SetFont( 0, D3DCOLOR_ARGB( 255, 0, 0, 0 ), DT_LEFT | DT_TOP ); + + // Assign the Element + SetDefaultElement( DXUT_CONTROL_COMBOBOX, 2, &Element ); + + + //------------------------------------- + // CDXUTComboBox - Selection + //------------------------------------- + SetRect( &rcTexture, 12, 163, 239, 183 ); + Element.SetTexture( 0, &rcTexture ); + Element.SetFont( 0, D3DCOLOR_ARGB( 255, 255, 255, 255 ), DT_LEFT | DT_TOP ); + + // Assign the Element + SetDefaultElement( DXUT_CONTROL_COMBOBOX, 3, &Element ); + + + //------------------------------------- + // CDXUTSlider - Track + //------------------------------------- + SetRect( &rcTexture, 1, 187, 93, 228 ); + Element.SetTexture( 0, &rcTexture ); + Element.TextureColor.States[ DXUT_STATE_NORMAL ] = D3DCOLOR_ARGB( 150, 255, 255, 255 ); + Element.TextureColor.States[ DXUT_STATE_FOCUS ] = D3DCOLOR_ARGB( 200, 255, 255, 255 ); + Element.TextureColor.States[ DXUT_STATE_DISABLED ] = D3DCOLOR_ARGB( 70, 255, 255, 255 ); + + // Assign the Element + SetDefaultElement( DXUT_CONTROL_SLIDER, 0, &Element ); + + //------------------------------------- + // CDXUTSlider - Button + //------------------------------------- + SetRect( &rcTexture, 151, 193, 192, 234 ); + Element.SetTexture( 0, &rcTexture ); + + // Assign the Element + SetDefaultElement( DXUT_CONTROL_SLIDER, 1, &Element ); + + //------------------------------------- + // CDXUTScrollBar - Track + //------------------------------------- + int nScrollBarStartX = 196; + int nScrollBarStartY = 191; + SetRect( &rcTexture, nScrollBarStartX + 0, nScrollBarStartY + 21, nScrollBarStartX + 22, nScrollBarStartY + 32 ); + Element.SetTexture( 0, &rcTexture ); + Element.TextureColor.States[ DXUT_STATE_DISABLED ] = D3DCOLOR_ARGB( 255, 200, 200, 200 ); + + // Assign the Element + SetDefaultElement( DXUT_CONTROL_SCROLLBAR, 0, &Element ); + + //------------------------------------- + // CDXUTScrollBar - Up Arrow + //------------------------------------- + SetRect( &rcTexture, nScrollBarStartX + 0, nScrollBarStartY + 1, nScrollBarStartX + 22, nScrollBarStartY + 21 ); + Element.SetTexture( 0, &rcTexture ); + Element.TextureColor.States[ DXUT_STATE_DISABLED ] = D3DCOLOR_ARGB( 255, 200, 200, 200 ); + + + // Assign the Element + SetDefaultElement( DXUT_CONTROL_SCROLLBAR, 1, &Element ); + + //------------------------------------- + // CDXUTScrollBar - Down Arrow + //------------------------------------- + SetRect( &rcTexture, nScrollBarStartX + 0, nScrollBarStartY + 32, nScrollBarStartX + 22, nScrollBarStartY + 53 ); + Element.SetTexture( 0, &rcTexture ); + Element.TextureColor.States[ DXUT_STATE_DISABLED ] = D3DCOLOR_ARGB( 255, 200, 200, 200 ); + + + // Assign the Element + SetDefaultElement( DXUT_CONTROL_SCROLLBAR, 2, &Element ); + + //------------------------------------- + // CDXUTScrollBar - Button + //------------------------------------- + SetRect( &rcTexture, 220, 192, 238, 234 ); + Element.SetTexture( 0, &rcTexture ); + + // Assign the Element + SetDefaultElement( DXUT_CONTROL_SCROLLBAR, 3, &Element ); + + + //------------------------------------- + // CDXUTEditBox + //------------------------------------- + // Element assignment: + // 0 - text area + // 1 - top left border + // 2 - top border + // 3 - top right border + // 4 - left border + // 5 - right border + // 6 - lower left border + // 7 - lower border + // 8 - lower right border + + Element.SetFont( 0, D3DCOLOR_ARGB( 255, 0, 0, 0 ), DT_LEFT | DT_TOP ); + + // Assign the style + SetRect( &rcTexture, 14, 90, 241, 113 ); + Element.SetTexture( 0, &rcTexture ); + SetDefaultElement( DXUT_CONTROL_EDITBOX, 0, &Element ); + SetRect( &rcTexture, 8, 82, 14, 90 ); + Element.SetTexture( 0, &rcTexture ); + SetDefaultElement( DXUT_CONTROL_EDITBOX, 1, &Element ); + SetRect( &rcTexture, 14, 82, 241, 90 ); + Element.SetTexture( 0, &rcTexture ); + SetDefaultElement( DXUT_CONTROL_EDITBOX, 2, &Element ); + SetRect( &rcTexture, 241, 82, 246, 90 ); + Element.SetTexture( 0, &rcTexture ); + SetDefaultElement( DXUT_CONTROL_EDITBOX, 3, &Element ); + SetRect( &rcTexture, 8, 90, 14, 113 ); + Element.SetTexture( 0, &rcTexture ); + SetDefaultElement( DXUT_CONTROL_EDITBOX, 4, &Element ); + SetRect( &rcTexture, 241, 90, 246, 113 ); + Element.SetTexture( 0, &rcTexture ); + SetDefaultElement( DXUT_CONTROL_EDITBOX, 5, &Element ); + SetRect( &rcTexture, 8, 113, 14, 121 ); + Element.SetTexture( 0, &rcTexture ); + SetDefaultElement( DXUT_CONTROL_EDITBOX, 6, &Element ); + SetRect( &rcTexture, 14, 113, 241, 121 ); + Element.SetTexture( 0, &rcTexture ); + SetDefaultElement( DXUT_CONTROL_EDITBOX, 7, &Element ); + SetRect( &rcTexture, 241, 113, 246, 121 ); + Element.SetTexture( 0, &rcTexture ); + SetDefaultElement( DXUT_CONTROL_EDITBOX, 8, &Element ); + + //------------------------------------- + // CDXUTListBox - Main + //------------------------------------- + SetRect( &rcTexture, 13, 123, 241, 160 ); + Element.SetTexture( 0, &rcTexture ); + Element.SetFont( 0, D3DCOLOR_ARGB( 255, 0, 0, 0 ), DT_LEFT | DT_TOP ); + + // Assign the Element + SetDefaultElement( DXUT_CONTROL_LISTBOX, 0, &Element ); + + //------------------------------------- + // CDXUTListBox - Selection + //------------------------------------- + + SetRect( &rcTexture, 16, 166, 240, 183 ); + Element.SetTexture( 0, &rcTexture ); + Element.SetFont( 0, D3DCOLOR_ARGB( 255, 255, 255, 255 ), DT_LEFT | DT_TOP ); + + // Assign the Element + SetDefaultElement( DXUT_CONTROL_LISTBOX, 1, &Element ); +} + + + +//-------------------------------------------------------------------------------------- +// CDXUTControl class +//-------------------------------------------------------------------------------------- + +//-------------------------------------------------------------------------------------- +CDXUTControl::CDXUTControl( CDXUTDialog* pDialog ) +{ + m_Type = DXUT_CONTROL_BUTTON; + m_pDialog = pDialog; + m_ID = 0; + m_Index = 0; + m_pUserData = NULL; + + m_bEnabled = true; + m_bVisible = true; + m_bMouseOver = false; + m_bHasFocus = false; + m_bIsDefault = false; + + m_pDialog = NULL; + + m_x = 0; + m_y = 0; + m_width = 0; + m_height = 0; + + ZeroMemory( &m_rcBoundingBox, sizeof( m_rcBoundingBox ) ); +} + + +CDXUTControl::~CDXUTControl() +{ + for( int i = 0; i < m_Elements.GetSize(); ++i ) + { + delete m_Elements[i]; + } + m_Elements.RemoveAll(); +} + + +//-------------------------------------------------------------------------------------- +void CDXUTControl::SetTextColor( D3DCOLOR Color ) +{ + CDXUTElement* pElement = m_Elements.GetAt( 0 ); + + if( pElement ) + pElement->FontColor.States[DXUT_STATE_NORMAL] = Color; +} + + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTControl::SetElement( UINT iElement, CDXUTElement* pElement ) +{ + HRESULT hr = S_OK; + + if( pElement == NULL ) + return E_INVALIDARG; + + // Make certain the array is this large + for( UINT i = m_Elements.GetSize(); i <= iElement; i++ ) + { + CDXUTElement* pNewElement = new CDXUTElement(); + if( pNewElement == NULL ) + return E_OUTOFMEMORY; + + hr = m_Elements.Add( pNewElement ); + if( FAILED( hr ) ) + { + SAFE_DELETE( pNewElement ); + return hr; + } + } + + // Update the data + CDXUTElement* pCurElement = m_Elements.GetAt( iElement ); + *pCurElement = *pElement; + + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +void CDXUTControl::Refresh() +{ + m_bMouseOver = false; + m_bHasFocus = false; + + for( int i = 0; i < m_Elements.GetSize(); i++ ) + { + CDXUTElement* pElement = m_Elements.GetAt( i ); + pElement->Refresh(); + } +} + + +//-------------------------------------------------------------------------------------- +void CDXUTControl::UpdateRects() +{ + SetRect( &m_rcBoundingBox, m_x, m_y, m_x + m_width, m_y + m_height ); +} + + +//-------------------------------------------------------------------------------------- +// CDXUTStatic class +//-------------------------------------------------------------------------------------- + +//-------------------------------------------------------------------------------------- +CDXUTStatic::CDXUTStatic( CDXUTDialog* pDialog ) +{ + m_Type = DXUT_CONTROL_STATIC; + m_pDialog = pDialog; + + ZeroMemory( &m_strText, sizeof( m_strText ) ); + + for( int i = 0; i < m_Elements.GetSize(); i++ ) + { + CDXUTElement* pElement = m_Elements.GetAt( i ); + SAFE_DELETE( pElement ); + } + + m_Elements.RemoveAll(); +} + + +//-------------------------------------------------------------------------------------- +void CDXUTStatic::Render( float fElapsedTime ) +{ + if( m_bVisible == false ) + return; + + DXUT_CONTROL_STATE iState = DXUT_STATE_NORMAL; + + if( m_bEnabled == false ) + iState = DXUT_STATE_DISABLED; + + CDXUTElement* pElement = m_Elements.GetAt( 0 ); + + pElement->FontColor.Blend( iState, fElapsedTime ); + + m_pDialog->DrawText( m_strText, pElement, &m_rcBoundingBox, false, -1, false); +} + + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTStatic::GetTextCopy( __out_ecount(bufferCount) LPWSTR strDest, + UINT bufferCount ) +{ + // Validate incoming parameters + if( strDest == NULL || bufferCount == 0 ) + { + return E_INVALIDARG; + } + + // Copy the window text + wcscpy_s( strDest, bufferCount, m_strText ); + + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTStatic::SetText( LPCWSTR strText ) +{ + if( strText == NULL ) + { + m_strText[0] = 0; + return S_OK; + } + + wcscpy_s( m_strText, MAX_PATH, strText ); + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +// CDXUTButton class +//-------------------------------------------------------------------------------------- + +//-------------------------------------------------------------------------------------- +CDXUTButton::CDXUTButton( CDXUTDialog* pDialog ) +{ + m_Type = DXUT_CONTROL_BUTTON; + m_pDialog = pDialog; + + m_bPressed = false; + m_nHotkey = 0; +} + +//-------------------------------------------------------------------------------------- +bool CDXUTButton::HandleKeyboard( UINT uMsg, WPARAM wParam, LPARAM lParam ) +{ + if( !m_bEnabled || !m_bVisible ) + return false; + + switch( uMsg ) + { + case WM_KEYDOWN: + { + switch( wParam ) + { + case VK_SPACE: + m_bPressed = true; + return true; + } + } + + case WM_KEYUP: + { + switch( wParam ) + { + case VK_SPACE: + if( m_bPressed == true ) + { + m_bPressed = false; + m_pDialog->SendEvent( EVENT_BUTTON_CLICKED, true, this ); + } + return true; + } + } + } + return false; +} + + +//-------------------------------------------------------------------------------------- +bool CDXUTButton::HandleMouse( UINT uMsg, POINT pt, WPARAM wParam, LPARAM lParam ) +{ + if( !m_bEnabled || !m_bVisible ) + return false; + + switch( uMsg ) + { + case WM_LBUTTONDOWN: + case WM_LBUTTONDBLCLK: + { + if( ContainsPoint( pt ) ) + { + // Pressed while inside the control + m_bPressed = true; + SetCapture( DXUTGetHWND() ); + + if( !m_bHasFocus ) + m_pDialog->RequestFocus( this ); + + return true; + } + + break; + } + + case WM_LBUTTONUP: + { + if( m_bPressed ) + { + m_bPressed = false; + ReleaseCapture(); + + if( !m_pDialog->m_bKeyboardInput ) + m_pDialog->ClearFocus(); + + // Button click + if( ContainsPoint( pt ) ) + m_pDialog->SendEvent( EVENT_BUTTON_CLICKED, true, this ); + + return true; + } + + break; + } + }; + + return false; +} + +//-------------------------------------------------------------------------------------- +void CDXUTButton::Render( float fElapsedTime ) +{ + if( m_bVisible == false ) + return; + + int nOffsetX = 0; + int nOffsetY = 0; + + DXUT_CONTROL_STATE iState = DXUT_STATE_NORMAL; + + if( m_bVisible == false ) + { + iState = DXUT_STATE_HIDDEN; + } + else if( m_bEnabled == false ) + { + iState = DXUT_STATE_DISABLED; + } + else if( m_bPressed ) + { + iState = DXUT_STATE_PRESSED; + + nOffsetX = 1; + nOffsetY = 2; + } + else if( m_bMouseOver ) + { + iState = DXUT_STATE_MOUSEOVER; + + nOffsetX = -1; + nOffsetY = -2; + } + else if( m_bHasFocus ) + { + iState = DXUT_STATE_FOCUS; + } + + // Background fill layer + //TODO: remove magic numbers + CDXUTElement* pElement = m_Elements.GetAt( 0 ); + + float fBlendRate = ( iState == DXUT_STATE_PRESSED ) ? 0.0f : 0.8f; + + RECT rcWindow = m_rcBoundingBox; + OffsetRect( &rcWindow, nOffsetX, nOffsetY ); + + + // Blend current color + pElement->TextureColor.Blend( iState, fElapsedTime, fBlendRate ); + pElement->FontColor.Blend( iState, fElapsedTime, fBlendRate ); + + m_pDialog->DrawSprite( pElement, &rcWindow, DXUT_FAR_BUTTON_DEPTH ); + m_pDialog->DrawText( m_strText, pElement, &rcWindow, false, -1, true ); + + // Main button + pElement = m_Elements.GetAt( 1 ); + + // Blend current color + pElement->TextureColor.Blend( iState, fElapsedTime, fBlendRate ); + pElement->FontColor.Blend( iState, fElapsedTime, fBlendRate ); + + m_pDialog->DrawSprite( pElement, &rcWindow, DXUT_NEAR_BUTTON_DEPTH ); + m_pDialog->DrawText( m_strText, pElement, &rcWindow, false, -1, true ); +} + + + +//-------------------------------------------------------------------------------------- +// CDXUTCheckBox class +//-------------------------------------------------------------------------------------- + +//-------------------------------------------------------------------------------------- +CDXUTCheckBox::CDXUTCheckBox( CDXUTDialog* pDialog ) +{ + m_Type = DXUT_CONTROL_CHECKBOX; + m_pDialog = pDialog; + + m_bChecked = false; +} + + +//-------------------------------------------------------------------------------------- +bool CDXUTCheckBox::HandleKeyboard( UINT uMsg, WPARAM wParam, LPARAM lParam ) +{ + if( !m_bEnabled || !m_bVisible ) + return false; + + switch( uMsg ) + { + case WM_KEYDOWN: + { + switch( wParam ) + { + case VK_SPACE: + m_bPressed = true; + return true; + } + } + + case WM_KEYUP: + { + switch( wParam ) + { + case VK_SPACE: + if( m_bPressed == true ) + { + m_bPressed = false; + SetCheckedInternal( !m_bChecked, true ); + } + return true; + } + } + } + return false; +} + + +//-------------------------------------------------------------------------------------- +bool CDXUTCheckBox::HandleMouse( UINT uMsg, POINT pt, WPARAM wParam, LPARAM lParam ) +{ + if( !m_bEnabled || !m_bVisible ) + return false; + + switch( uMsg ) + { + case WM_LBUTTONDOWN: + case WM_LBUTTONDBLCLK: + { + if( ContainsPoint( pt ) ) + { + // Pressed while inside the control + m_bPressed = true; + SetCapture( DXUTGetHWND() ); + + if( !m_bHasFocus ) + m_pDialog->RequestFocus( this ); + + return true; + } + + break; + } + + case WM_LBUTTONUP: + { + if( m_bPressed ) + { + m_bPressed = false; + ReleaseCapture(); + + // Button click + if( ContainsPoint( pt ) ) + SetCheckedInternal( !m_bChecked, true ); + + return true; + } + + break; + } + }; + + return false; +} + + +//-------------------------------------------------------------------------------------- +void CDXUTCheckBox::SetCheckedInternal( bool bChecked, bool bFromInput ) +{ + m_bChecked = bChecked; + + m_pDialog->SendEvent( EVENT_CHECKBOX_CHANGED, bFromInput, this ); +} + + +//-------------------------------------------------------------------------------------- +BOOL CDXUTCheckBox::ContainsPoint( POINT pt ) +{ + return ( PtInRect( &m_rcBoundingBox, pt ) || + PtInRect( &m_rcButton, pt ) ); +} + + + +//-------------------------------------------------------------------------------------- +void CDXUTCheckBox::UpdateRects() +{ + CDXUTButton::UpdateRects(); + + m_rcButton = m_rcBoundingBox; + m_rcButton.right = m_rcButton.left + RectHeight( m_rcButton ); + + m_rcText = m_rcBoundingBox; + m_rcText.left += ( int )( 1.25f * RectWidth( m_rcButton ) ); +} + + + +//-------------------------------------------------------------------------------------- +void CDXUTCheckBox::Render( float fElapsedTime ) +{ + if( m_bVisible == false ) + return; + DXUT_CONTROL_STATE iState = DXUT_STATE_NORMAL; + + if( m_bVisible == false ) + iState = DXUT_STATE_HIDDEN; + else if( m_bEnabled == false ) + iState = DXUT_STATE_DISABLED; + else if( m_bPressed ) + iState = DXUT_STATE_PRESSED; + else if( m_bMouseOver ) + iState = DXUT_STATE_MOUSEOVER; + else if( m_bHasFocus ) + iState = DXUT_STATE_FOCUS; + + CDXUTElement* pElement = m_Elements.GetAt( 0 ); + + float fBlendRate = ( iState == DXUT_STATE_PRESSED ) ? 0.0f : 0.8f; + + pElement->TextureColor.Blend( iState, fElapsedTime, fBlendRate ); + pElement->FontColor.Blend( iState, fElapsedTime, fBlendRate ); + + m_pDialog->DrawSprite( pElement, &m_rcButton, DXUT_NEAR_BUTTON_DEPTH ); + m_pDialog->DrawText( m_strText, pElement, &m_rcText, false, -1, false ); + + if( !m_bChecked ) + iState = DXUT_STATE_HIDDEN; + + pElement = m_Elements.GetAt( 1 ); + + pElement->TextureColor.Blend( iState, fElapsedTime, fBlendRate ); + m_pDialog->DrawSprite( pElement, &m_rcButton, DXUT_FAR_BUTTON_DEPTH ); +} + + + + +//-------------------------------------------------------------------------------------- +// CDXUTRadioButton class +//-------------------------------------------------------------------------------------- + +//-------------------------------------------------------------------------------------- +CDXUTRadioButton::CDXUTRadioButton( CDXUTDialog* pDialog ) +{ + m_Type = DXUT_CONTROL_RADIOBUTTON; + m_pDialog = pDialog; +} + + + +//-------------------------------------------------------------------------------------- +bool CDXUTRadioButton::HandleKeyboard( UINT uMsg, WPARAM wParam, LPARAM lParam ) +{ + if( !m_bEnabled || !m_bVisible ) + return false; + + switch( uMsg ) + { + case WM_KEYDOWN: + { + switch( wParam ) + { + case VK_SPACE: + m_bPressed = true; + return true; + } + } + + case WM_KEYUP: + { + switch( wParam ) + { + case VK_SPACE: + if( m_bPressed == true ) + { + m_bPressed = false; + + m_pDialog->ClearRadioButtonGroup( m_nButtonGroup ); + m_bChecked = !m_bChecked; + + m_pDialog->SendEvent( EVENT_RADIOBUTTON_CHANGED, true, this ); + } + return true; + } + } + } + return false; +} + + +//-------------------------------------------------------------------------------------- +bool CDXUTRadioButton::HandleMouse( UINT uMsg, POINT pt, WPARAM wParam, LPARAM lParam ) +{ + if( !m_bEnabled || !m_bVisible ) + return false; + + switch( uMsg ) + { + case WM_LBUTTONDOWN: + case WM_LBUTTONDBLCLK: + { + if( ContainsPoint( pt ) ) + { + // Pressed while inside the control + m_bPressed = true; + SetCapture( DXUTGetHWND() ); + + if( !m_bHasFocus ) + m_pDialog->RequestFocus( this ); + + return true; + } + + break; + } + + case WM_LBUTTONUP: + { + if( m_bPressed ) + { + m_bPressed = false; + ReleaseCapture(); + + // Button click + if( ContainsPoint( pt ) ) + { + m_pDialog->ClearRadioButtonGroup( m_nButtonGroup ); + m_bChecked = !m_bChecked; + + m_pDialog->SendEvent( EVENT_RADIOBUTTON_CHANGED, true, this ); + } + + return true; + } + + break; + } + }; + + return false; +} + +//-------------------------------------------------------------------------------------- +void CDXUTRadioButton::SetCheckedInternal( bool bChecked, bool bClearGroup, bool bFromInput ) +{ + if( bChecked && bClearGroup ) + m_pDialog->ClearRadioButtonGroup( m_nButtonGroup ); + + m_bChecked = bChecked; + m_pDialog->SendEvent( EVENT_RADIOBUTTON_CHANGED, bFromInput, this ); +} + + + + +//-------------------------------------------------------------------------------------- +// CDXUTComboBox class +//-------------------------------------------------------------------------------------- + +//-------------------------------------------------------------------------------------- +CDXUTComboBox::CDXUTComboBox( CDXUTDialog* pDialog ) : m_ScrollBar( pDialog ) +{ + m_Type = DXUT_CONTROL_COMBOBOX; + m_pDialog = pDialog; + + m_nDropHeight = 100; + + m_nSBWidth = 16; + m_bOpened = false; + m_iSelected = -1; + m_iFocused = -1; +} + + +//-------------------------------------------------------------------------------------- +CDXUTComboBox::~CDXUTComboBox() +{ + RemoveAllItems(); +} + + +//-------------------------------------------------------------------------------------- +void CDXUTComboBox::SetTextColor( D3DCOLOR Color ) +{ + CDXUTElement* pElement = m_Elements.GetAt( 0 ); + + if( pElement ) + pElement->FontColor.States[DXUT_STATE_NORMAL] = Color; + + pElement = m_Elements.GetAt( 2 ); + + if( pElement ) + pElement->FontColor.States[DXUT_STATE_NORMAL] = Color; +} + + +//-------------------------------------------------------------------------------------- +void CDXUTComboBox::UpdateRects() +{ + + CDXUTButton::UpdateRects(); + + m_rcButton = m_rcBoundingBox; + m_rcButton.left = m_rcButton.right - RectHeight( m_rcButton ); + + m_rcText = m_rcBoundingBox; + m_rcText.right = m_rcButton.left; + + m_rcDropdown = m_rcText; + OffsetRect( &m_rcDropdown, 0, ( int )( 0.90f * RectHeight( m_rcText ) ) ); + m_rcDropdown.bottom += m_nDropHeight; + m_rcDropdown.right -= m_nSBWidth; + + m_rcDropdownText = m_rcDropdown; + m_rcDropdownText.left += ( int )( 0.1f * RectWidth( m_rcDropdown ) ); + m_rcDropdownText.right -= ( int )( 0.1f * RectWidth( m_rcDropdown ) ); + m_rcDropdownText.top += ( int )( 0.1f * RectHeight( m_rcDropdown ) ); + m_rcDropdownText.bottom -= ( int )( 0.1f * RectHeight( m_rcDropdown ) ); + + // Update the scrollbar's rects + m_ScrollBar.SetLocation( m_rcDropdown.right, m_rcDropdown.top + 2 ); + m_ScrollBar.SetSize( m_nSBWidth, RectHeight( m_rcDropdown ) - 2 ); + DXUTFontNode* pFontNode = m_pDialog->GetManager()->GetFontNode( m_Elements.GetAt( 2 )->iFont ); + if( pFontNode && pFontNode->nHeight ) + { + m_ScrollBar.SetPageSize( RectHeight( m_rcDropdownText ) / pFontNode->nHeight ); + + // The selected item may have been scrolled off the page. + // Ensure that it is in page again. + m_ScrollBar.ShowItem( m_iSelected ); + } +} + + +//-------------------------------------------------------------------------------------- +void CDXUTComboBox::OnFocusOut() +{ + CDXUTButton::OnFocusOut(); + + m_bOpened = false; +} + + +//-------------------------------------------------------------------------------------- +bool CDXUTComboBox::HandleKeyboard( UINT uMsg, WPARAM wParam, LPARAM lParam ) +{ + const DWORD REPEAT_MASK = ( 0x40000000 ); + + if( !m_bEnabled || !m_bVisible ) + return false; + + // Let the scroll bar have a chance to handle it first + if( m_ScrollBar.HandleKeyboard( uMsg, wParam, lParam ) ) + return true; + + switch( uMsg ) + { + case WM_KEYDOWN: + { + switch( wParam ) + { + case VK_RETURN: + if( m_bOpened ) + { + if( m_iSelected != m_iFocused ) + { + m_iSelected = m_iFocused; + m_pDialog->SendEvent( EVENT_COMBOBOX_SELECTION_CHANGED, true, this ); + } + m_bOpened = false; + + if( !m_pDialog->m_bKeyboardInput ) + m_pDialog->ClearFocus(); + + return true; + } + break; + + case VK_F4: + // Filter out auto-repeats + if( lParam & REPEAT_MASK ) + return true; + + m_bOpened = !m_bOpened; + + if( !m_bOpened ) + { + m_pDialog->SendEvent( EVENT_COMBOBOX_SELECTION_CHANGED, true, this ); + + if( !m_pDialog->m_bKeyboardInput ) + m_pDialog->ClearFocus(); + } + + return true; + + case VK_LEFT: + case VK_UP: + if( m_iFocused > 0 ) + { + m_iFocused--; + m_iSelected = m_iFocused; + + if( !m_bOpened ) + m_pDialog->SendEvent( EVENT_COMBOBOX_SELECTION_CHANGED, true, this ); + } + + return true; + + case VK_RIGHT: + case VK_DOWN: + if( m_iFocused + 1 < ( int )GetNumItems() ) + { + m_iFocused++; + m_iSelected = m_iFocused; + + if( !m_bOpened ) + m_pDialog->SendEvent( EVENT_COMBOBOX_SELECTION_CHANGED, true, this ); + } + + return true; + } + break; + } + } + + return false; +} + + +//-------------------------------------------------------------------------------------- +bool CDXUTComboBox::HandleMouse( UINT uMsg, POINT pt, WPARAM wParam, LPARAM lParam ) +{ + if( !m_bEnabled || !m_bVisible ) + return false; + + // Let the scroll bar handle it first. + if( m_ScrollBar.HandleMouse( uMsg, pt, wParam, lParam ) ) + return true; + + switch( uMsg ) + { + case WM_MOUSEMOVE: + { + if( m_bOpened && PtInRect( &m_rcDropdown, pt ) ) + { + // Determine which item has been selected + for( int i = 0; i < m_Items.GetSize(); i++ ) + { + DXUTComboBoxItem* pItem = m_Items.GetAt( i ); + if( pItem->bVisible && + PtInRect( &pItem->rcActive, pt ) ) + { + m_iFocused = i; + } + } + return true; + } + break; + } + + case WM_LBUTTONDOWN: + case WM_LBUTTONDBLCLK: + { + if( ContainsPoint( pt ) ) + { + // Pressed while inside the control + m_bPressed = true; + SetCapture( DXUTGetHWND() ); + + if( !m_bHasFocus ) + m_pDialog->RequestFocus( this ); + + // Toggle dropdown + if( m_bHasFocus ) + { + m_bOpened = !m_bOpened; + + if( !m_bOpened ) + { + if( !m_pDialog->m_bKeyboardInput ) + m_pDialog->ClearFocus(); + } + } + + return true; + } + + // Perhaps this click is within the dropdown + if( m_bOpened && PtInRect( &m_rcDropdown, pt ) ) + { + // Determine which item has been selected + for( int i = m_ScrollBar.GetTrackPos(); i < m_Items.GetSize(); i++ ) + { + DXUTComboBoxItem* pItem = m_Items.GetAt( i ); + if( pItem->bVisible && + PtInRect( &pItem->rcActive, pt ) ) + { + m_iFocused = m_iSelected = i; + m_pDialog->SendEvent( EVENT_COMBOBOX_SELECTION_CHANGED, true, this ); + m_bOpened = false; + + if( !m_pDialog->m_bKeyboardInput ) + m_pDialog->ClearFocus(); + + break; + } + } + + return true; + } + + // Mouse click not on main control or in dropdown, fire an event if needed + if( m_bOpened ) + { + m_iFocused = m_iSelected; + + m_pDialog->SendEvent( EVENT_COMBOBOX_SELECTION_CHANGED, true, this ); + m_bOpened = false; + } + + // Make sure the control is no longer in a pressed state + m_bPressed = false; + + // Release focus if appropriate + if( !m_pDialog->m_bKeyboardInput ) + { + m_pDialog->ClearFocus(); + } + + break; + } + + case WM_LBUTTONUP: + { + if( m_bPressed && ContainsPoint( pt ) ) + { + // Button click + m_bPressed = false; + ReleaseCapture(); + return true; + } + + break; + } + + case WM_MOUSEWHEEL: + { + int zDelta = ( short )HIWORD( wParam ) / WHEEL_DELTA; + if( m_bOpened ) + { + UINT uLines; + SystemParametersInfo( SPI_GETWHEELSCROLLLINES, 0, &uLines, 0 ); + m_ScrollBar.Scroll( -zDelta * uLines ); + } + else + { + if( zDelta > 0 ) + { + if( m_iFocused > 0 ) + { + m_iFocused--; + m_iSelected = m_iFocused; + + if( !m_bOpened ) + m_pDialog->SendEvent( EVENT_COMBOBOX_SELECTION_CHANGED, true, this ); + } + } + else + { + if( m_iFocused + 1 < ( int )GetNumItems() ) + { + m_iFocused++; + m_iSelected = m_iFocused; + + if( !m_bOpened ) + m_pDialog->SendEvent( EVENT_COMBOBOX_SELECTION_CHANGED, true, this ); + } + } + } + return true; + } + }; + + return false; +} + + +//-------------------------------------------------------------------------------------- +void CDXUTComboBox::OnHotkey() +{ + if( m_bOpened ) + return; + + if( m_iSelected == -1 ) + return; + + if( m_pDialog->IsKeyboardInputEnabled() ) + m_pDialog->RequestFocus( this ); + + m_iSelected++; + + if( m_iSelected >= ( int )m_Items.GetSize() ) + m_iSelected = 0; + + m_iFocused = m_iSelected; + m_pDialog->SendEvent( EVENT_COMBOBOX_SELECTION_CHANGED, true, this ); +} + + +//-------------------------------------------------------------------------------------- +void CDXUTComboBox::Render( float fElapsedTime ) +{ + if( m_bVisible == false ) + return; + DXUT_CONTROL_STATE iState = DXUT_STATE_NORMAL; + + if( !m_bOpened ) + iState = DXUT_STATE_HIDDEN; + + // Dropdown box + CDXUTElement* pElement = m_Elements.GetAt( 2 ); + + // If we have not initialized the scroll bar page size, + // do that now. + static bool bSBInit; + if( !bSBInit ) + { + // Update the page size of the scroll bar + if( m_pDialog->GetManager()->GetFontNode( pElement->iFont )->nHeight ) + m_ScrollBar.SetPageSize( RectHeight( m_rcDropdownText ) / + m_pDialog->GetManager()->GetFontNode( pElement->iFont )->nHeight ); + else + m_ScrollBar.SetPageSize( RectHeight( m_rcDropdownText ) ); + bSBInit = true; + } + + // Scroll bar + if( m_bOpened ) + m_ScrollBar.Render( fElapsedTime ); + + // Blend current color + pElement->TextureColor.Blend( iState, fElapsedTime ); + pElement->FontColor.Blend( iState, fElapsedTime ); + + m_pDialog->DrawSprite( pElement, &m_rcDropdown, DXUT_NEAR_BUTTON_DEPTH ); + + // Selection outline + CDXUTElement* pSelectionElement = m_Elements.GetAt( 3 ); + pSelectionElement->TextureColor.Current = pElement->TextureColor.Current; + pSelectionElement->FontColor.Current = pSelectionElement->FontColor.States[ DXUT_STATE_NORMAL ]; + + DXUTFontNode* pFont = m_pDialog->GetFont( pElement->iFont ); + if( pFont ) + { + int curY = m_rcDropdownText.top; + int nRemainingHeight = RectHeight( m_rcDropdownText ); + //WCHAR strDropdown[4096] = {0}; + + for( int i = m_ScrollBar.GetTrackPos(); i < m_Items.GetSize(); i++ ) + { + DXUTComboBoxItem* pItem = m_Items.GetAt( i ); + + // Make sure there's room left in the dropdown + nRemainingHeight -= pFont->nHeight; + if( nRemainingHeight < 0 ) + { + pItem->bVisible = false; + continue; + } + + SetRect( &pItem->rcActive, m_rcDropdownText.left, curY, m_rcDropdownText.right, curY + pFont->nHeight ); + curY += pFont->nHeight; + + //debug + //int blue = 50 * i; + //m_pDialog->DrawRect( &pItem->rcActive, 0xFFFF0000 | blue ); + + pItem->bVisible = true; + + if( m_bOpened ) + { + if( ( int )i == m_iFocused ) + { + RECT rc; + SetRect( &rc, m_rcDropdown.left, pItem->rcActive.top - 2, m_rcDropdown.right, + pItem->rcActive.bottom + 2 ); + m_pDialog->DrawSprite( pSelectionElement, &rc, DXUT_NEAR_BUTTON_DEPTH ); + m_pDialog->DrawText( pItem->strText, pSelectionElement, &pItem->rcActive ); + } + else + { + m_pDialog->DrawText( pItem->strText, pElement, &pItem->rcActive ); + } + } + } + } + + int nOffsetX = 0; + int nOffsetY = 0; + + iState = DXUT_STATE_NORMAL; + + if( m_bVisible == false ) + iState = DXUT_STATE_HIDDEN; + else if( m_bEnabled == false ) + iState = DXUT_STATE_DISABLED; + else if( m_bPressed ) + { + iState = DXUT_STATE_PRESSED; + + nOffsetX = 1; + nOffsetY = 2; + } + else if( m_bMouseOver ) + { + iState = DXUT_STATE_MOUSEOVER; + + nOffsetX = -1; + nOffsetY = -2; + } + else if( m_bHasFocus ) + iState = DXUT_STATE_FOCUS; + + float fBlendRate = ( iState == DXUT_STATE_PRESSED ) ? 0.0f : 0.8f; + + // Button + pElement = m_Elements.GetAt( 1 ); + + // Blend current color + pElement->TextureColor.Blend( iState, fElapsedTime, fBlendRate ); + + RECT rcWindow = m_rcButton; + OffsetRect( &rcWindow, nOffsetX, nOffsetY ); + m_pDialog->DrawSprite( pElement, &rcWindow, DXUT_FAR_BUTTON_DEPTH ); + + if( m_bOpened ) + iState = DXUT_STATE_PRESSED; + + // Main text box + //TODO: remove magic numbers + pElement = m_Elements.GetAt( 0 ); + + // Blend current color + pElement->TextureColor.Blend( iState, fElapsedTime, fBlendRate ); + pElement->FontColor.Blend( iState, fElapsedTime, fBlendRate ); + + m_pDialog->DrawSprite( pElement, &m_rcText, DXUT_NEAR_BUTTON_DEPTH ); + + if( m_iSelected >= 0 && m_iSelected < ( int )m_Items.GetSize() ) + { + DXUTComboBoxItem* pItem = m_Items.GetAt( m_iSelected ); + if( pItem != NULL ) + { + m_pDialog->DrawText( pItem->strText, pElement, &m_rcText, false, -1, true ); + + } + } +} + + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTComboBox::AddItem( const WCHAR* strText, void* pData ) +{ + // Validate parameters + if( strText == NULL ) + { + return E_INVALIDARG; + } + + // Create a new item and set the data + DXUTComboBoxItem* pItem = new DXUTComboBoxItem; + if( pItem == NULL ) + { + return DXTRACE_ERR_MSGBOX( L"new", E_OUTOFMEMORY ); + } + + ZeroMemory( pItem, sizeof( DXUTComboBoxItem ) ); + wcscpy_s( pItem->strText, 256, strText ); + pItem->pData = pData; + + m_Items.Add( pItem ); + + // Update the scroll bar with new range + m_ScrollBar.SetTrackRange( 0, m_Items.GetSize() ); + + // If this is the only item in the list, it's selected + if( GetNumItems() == 1 ) + { + m_iSelected = 0; + m_iFocused = 0; + m_pDialog->SendEvent( EVENT_COMBOBOX_SELECTION_CHANGED, false, this ); + } + + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +void CDXUTComboBox::RemoveItem( UINT index ) +{ + DXUTComboBoxItem* pItem = m_Items.GetAt( index ); + SAFE_DELETE( pItem ); + m_Items.Remove( index ); + m_ScrollBar.SetTrackRange( 0, m_Items.GetSize() ); + if( m_iSelected >= m_Items.GetSize() ) + m_iSelected = m_Items.GetSize() - 1; +} + + +//-------------------------------------------------------------------------------------- +void CDXUTComboBox::RemoveAllItems() +{ + for( int i = 0; i < m_Items.GetSize(); i++ ) + { + DXUTComboBoxItem* pItem = m_Items.GetAt( i ); + SAFE_DELETE( pItem ); + } + + m_Items.RemoveAll(); + m_ScrollBar.SetTrackRange( 0, 1 ); + m_iFocused = m_iSelected = -1; +} + + + +//-------------------------------------------------------------------------------------- +bool CDXUTComboBox::ContainsItem( const WCHAR* strText, UINT iStart ) +{ + return ( -1 != FindItem( strText, iStart ) ); +} + + +//-------------------------------------------------------------------------------------- +int CDXUTComboBox::FindItem( const WCHAR* strText, UINT iStart ) +{ + if( strText == NULL ) + return -1; + + for( int i = iStart; i < m_Items.GetSize(); i++ ) + { + DXUTComboBoxItem* pItem = m_Items.GetAt( i ); + + if( 0 == wcscmp( pItem->strText, strText ) ) + { + return i; + } + } + + return -1; +} + + +//-------------------------------------------------------------------------------------- +void* CDXUTComboBox::GetSelectedData() +{ + if( m_iSelected < 0 ) + return NULL; + + DXUTComboBoxItem* pItem = m_Items.GetAt( m_iSelected ); + return pItem->pData; +} + + +//-------------------------------------------------------------------------------------- +DXUTComboBoxItem* CDXUTComboBox::GetSelectedItem() +{ + if( m_iSelected < 0 ) + return NULL; + + return m_Items.GetAt( m_iSelected ); +} + + +//-------------------------------------------------------------------------------------- +void* CDXUTComboBox::GetItemData( const WCHAR* strText ) +{ + int index = FindItem( strText ); + if( index == -1 ) + { + return NULL; + } + + DXUTComboBoxItem* pItem = m_Items.GetAt( index ); + if( pItem == NULL ) + { + DXTRACE_ERR( L"CGrowableArray::GetAt", E_FAIL ); + return NULL; + } + + return pItem->pData; +} + + +//-------------------------------------------------------------------------------------- +void* CDXUTComboBox::GetItemData( int nIndex ) +{ + if( nIndex < 0 || nIndex >= m_Items.GetSize() ) + return NULL; + + return m_Items.GetAt( nIndex )->pData; +} + + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTComboBox::SetSelectedByIndex( UINT index ) +{ + if( index >= GetNumItems() ) + return E_INVALIDARG; + + m_iFocused = m_iSelected = index; + m_pDialog->SendEvent( EVENT_COMBOBOX_SELECTION_CHANGED, false, this ); + + return S_OK; +} + + + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTComboBox::SetSelectedByText( const WCHAR* strText ) +{ + if( strText == NULL ) + return E_INVALIDARG; + + int index = FindItem( strText ); + if( index == -1 ) + return E_FAIL; + + m_iFocused = m_iSelected = index; + m_pDialog->SendEvent( EVENT_COMBOBOX_SELECTION_CHANGED, false, this ); + + return S_OK; +} + + + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTComboBox::SetSelectedByData( void* pData ) +{ + for( int i = 0; i < m_Items.GetSize(); i++ ) + { + DXUTComboBoxItem* pItem = m_Items.GetAt( i ); + + if( pItem->pData == pData ) + { + m_iFocused = m_iSelected = i; + m_pDialog->SendEvent( EVENT_COMBOBOX_SELECTION_CHANGED, false, this ); + return S_OK; + } + } + + return E_FAIL; +} + + + +//-------------------------------------------------------------------------------------- +CDXUTSlider::CDXUTSlider( CDXUTDialog* pDialog ) +{ + m_Type = DXUT_CONTROL_SLIDER; + m_pDialog = pDialog; + + m_nMin = 0; + m_nMax = 100; + m_nValue = 50; + + m_bPressed = false; +} + + +//-------------------------------------------------------------------------------------- +BOOL CDXUTSlider::ContainsPoint( POINT pt ) +{ + return ( PtInRect( &m_rcBoundingBox, pt ) || + PtInRect( &m_rcButton, pt ) ); +} + + +//-------------------------------------------------------------------------------------- +void CDXUTSlider::UpdateRects() +{ + CDXUTControl::UpdateRects(); + + m_rcButton = m_rcBoundingBox; + m_rcButton.right = m_rcButton.left + RectHeight( m_rcButton ); + OffsetRect( &m_rcButton, -RectWidth( m_rcButton ) / 2, 0 ); + + m_nButtonX = ( int )( ( m_nValue - m_nMin ) * ( float )RectWidth( m_rcBoundingBox ) / ( m_nMax - m_nMin ) ); + OffsetRect( &m_rcButton, m_nButtonX, 0 ); +} + +int CDXUTSlider::ValueFromPos( int x ) +{ + float fValuePerPixel = ( float )( m_nMax - m_nMin ) / RectWidth( m_rcBoundingBox ); + return ( int )( 0.5f + m_nMin + fValuePerPixel * ( x - m_rcBoundingBox.left ) ); +} + +//-------------------------------------------------------------------------------------- +bool CDXUTSlider::HandleKeyboard( UINT uMsg, WPARAM wParam, LPARAM lParam ) +{ + if( !m_bEnabled || !m_bVisible ) + return false; + + switch( uMsg ) + { + case WM_KEYDOWN: + { + switch( wParam ) + { + case VK_HOME: + SetValueInternal( m_nMin, true ); + return true; + + case VK_END: + SetValueInternal( m_nMax, true ); + return true; + + case VK_LEFT: + case VK_DOWN: + SetValueInternal( m_nValue - 1, true ); + return true; + + case VK_RIGHT: + case VK_UP: + SetValueInternal( m_nValue + 1, true ); + return true; + + case VK_NEXT: + SetValueInternal( m_nValue - ( 10 > ( m_nMax - m_nMin ) / 10 ? 10 : ( m_nMax - m_nMin ) / 10 ), + true ); + return true; + + case VK_PRIOR: + SetValueInternal( m_nValue + ( 10 > ( m_nMax - m_nMin ) / 10 ? 10 : ( m_nMax - m_nMin ) / 10 ), + true ); + return true; + } + break; + } + } + + + return false; +} + + +//-------------------------------------------------------------------------------------- +bool CDXUTSlider::HandleMouse( UINT uMsg, POINT pt, WPARAM wParam, LPARAM lParam ) +{ + if( !m_bEnabled || !m_bVisible ) + return false; + + switch( uMsg ) + { + case WM_LBUTTONDOWN: + case WM_LBUTTONDBLCLK: + { + if( PtInRect( &m_rcButton, pt ) ) + { + // Pressed while inside the control + m_bPressed = true; + SetCapture( DXUTGetHWND() ); + + m_nDragX = pt.x; + //m_nDragY = pt.y; + m_nDragOffset = m_nButtonX - m_nDragX; + + //m_nDragValue = m_nValue; + + if( !m_bHasFocus ) + m_pDialog->RequestFocus( this ); + + return true; + } + + if( PtInRect( &m_rcBoundingBox, pt ) ) + { + m_nDragX = pt.x; + m_nDragOffset = 0; + m_bPressed = true; + + if( !m_bHasFocus ) + m_pDialog->RequestFocus( this ); + + if( pt.x > m_nButtonX + m_x ) + { + SetValueInternal( m_nValue + 1, true ); + return true; + } + + if( pt.x < m_nButtonX + m_x ) + { + SetValueInternal( m_nValue - 1, true ); + return true; + } + } + + break; + } + + case WM_LBUTTONUP: + { + if( m_bPressed ) + { + m_bPressed = false; + ReleaseCapture(); + m_pDialog->SendEvent( EVENT_SLIDER_VALUE_CHANGED_UP, true, this ); + + return true; + } + + break; + } + + case WM_MOUSEMOVE: + { + if( m_bPressed ) + { + SetValueInternal( ValueFromPos( m_x + pt.x + m_nDragOffset ), true ); + return true; + } + + break; + } + + case WM_MOUSEWHEEL: + { + int nScrollAmount = int( ( short )HIWORD( wParam ) ) / WHEEL_DELTA; + SetValueInternal( m_nValue - nScrollAmount, true ); + return true; + } + }; + + return false; +} + + +//-------------------------------------------------------------------------------------- +void CDXUTSlider::SetRange( int nMin, int nMax ) +{ + m_nMin = nMin; + m_nMax = nMax; + + SetValueInternal( m_nValue, false ); +} + + +//-------------------------------------------------------------------------------------- +void CDXUTSlider::SetValueInternal( int nValue, bool bFromInput ) +{ + // Clamp to range + nValue = __max( m_nMin, nValue ); + nValue = __min( m_nMax, nValue ); + + if( nValue == m_nValue ) + return; + + m_nValue = nValue; + UpdateRects(); + + m_pDialog->SendEvent( EVENT_SLIDER_VALUE_CHANGED, bFromInput, this ); +} + + +//-------------------------------------------------------------------------------------- +void CDXUTSlider::Render( float fElapsedTime ) +{ + if( m_bVisible == false ) + return; + + int nOffsetX = 0; + int nOffsetY = 0; + + DXUT_CONTROL_STATE iState = DXUT_STATE_NORMAL; + + if( m_bVisible == false ) + { + iState = DXUT_STATE_HIDDEN; + } + else if( m_bEnabled == false ) + { + iState = DXUT_STATE_DISABLED; + } + else if( m_bPressed ) + { + iState = DXUT_STATE_PRESSED; + + nOffsetX = 1; + nOffsetY = 2; + } + else if( m_bMouseOver ) + { + iState = DXUT_STATE_MOUSEOVER; + + nOffsetX = -1; + nOffsetY = -2; + } + else if( m_bHasFocus ) + { + iState = DXUT_STATE_FOCUS; + } + + float fBlendRate = ( iState == DXUT_STATE_PRESSED ) ? 0.0f : 0.8f; + + CDXUTElement* pElement = m_Elements.GetAt( 0 ); + + // Blend current color + pElement->TextureColor.Blend( iState, fElapsedTime, fBlendRate ); + m_pDialog->DrawSprite( pElement, &m_rcBoundingBox, DXUT_FAR_BUTTON_DEPTH ); + + //TODO: remove magic numbers + pElement = m_Elements.GetAt( 1 ); + + // Blend current color + pElement->TextureColor.Blend( iState, fElapsedTime, fBlendRate ); + m_pDialog->DrawSprite( pElement, &m_rcButton, DXUT_NEAR_BUTTON_DEPTH ); +} + + +//-------------------------------------------------------------------------------------- +// CDXUTScrollBar class +//-------------------------------------------------------------------------------------- + +//-------------------------------------------------------------------------------------- +CDXUTScrollBar::CDXUTScrollBar( CDXUTDialog* pDialog ) +{ + m_Type = DXUT_CONTROL_SCROLLBAR; + m_pDialog = pDialog; + + m_bShowThumb = true; + m_bDrag = false; + + SetRect( &m_rcUpButton, 0, 0, 0, 0 ); + SetRect( &m_rcDownButton, 0, 0, 0, 0 ); + SetRect( &m_rcTrack, 0, 0, 0, 0 ); + SetRect( &m_rcThumb, 0, 0, 0, 0 ); + m_nPosition = 0; + m_nPageSize = 1; + m_nStart = 0; + m_nEnd = 1; + m_Arrow = CLEAR; + m_dArrowTS = 0.0; +} + + +//-------------------------------------------------------------------------------------- +CDXUTScrollBar::~CDXUTScrollBar() +{ +} + + +//-------------------------------------------------------------------------------------- +void CDXUTScrollBar::UpdateRects() +{ + CDXUTControl::UpdateRects(); + + // Make the buttons square + + SetRect( &m_rcUpButton, m_rcBoundingBox.left, m_rcBoundingBox.top, + m_rcBoundingBox.right, m_rcBoundingBox.top + RectWidth( m_rcBoundingBox ) ); + SetRect( &m_rcDownButton, m_rcBoundingBox.left, m_rcBoundingBox.bottom - RectWidth( m_rcBoundingBox ), + m_rcBoundingBox.right, m_rcBoundingBox.bottom ); + SetRect( &m_rcTrack, m_rcUpButton.left, m_rcUpButton.bottom, + m_rcDownButton.right, m_rcDownButton.top ); + m_rcThumb.left = m_rcUpButton.left; + m_rcThumb.right = m_rcUpButton.right; + + UpdateThumbRect(); +} + + +//-------------------------------------------------------------------------------------- +// Compute the dimension of the scroll thumb +void CDXUTScrollBar::UpdateThumbRect() +{ + if( m_nEnd - m_nStart > m_nPageSize ) + { + int nThumbHeight = __max( RectHeight( m_rcTrack ) * m_nPageSize / ( m_nEnd - m_nStart ), + SCROLLBAR_MINTHUMBSIZE ); + int nMaxPosition = m_nEnd - m_nStart - m_nPageSize; + m_rcThumb.top = m_rcTrack.top + ( m_nPosition - m_nStart ) * ( RectHeight( m_rcTrack ) - nThumbHeight ) + / nMaxPosition; + m_rcThumb.bottom = m_rcThumb.top + nThumbHeight; + m_bShowThumb = true; + + } + else + { + // No content to scroll + m_rcThumb.bottom = m_rcThumb.top; + m_bShowThumb = false; + } +} + + +//-------------------------------------------------------------------------------------- +// Scroll() scrolls by nDelta items. A positive value scrolls down, while a negative +// value scrolls up. +void CDXUTScrollBar::Scroll( int nDelta ) +{ + // Perform scroll + m_nPosition += nDelta; + + // Cap position + Cap(); + + // Update thumb position + UpdateThumbRect(); +} + + +//-------------------------------------------------------------------------------------- +void CDXUTScrollBar::ShowItem( int nIndex ) +{ + // Cap the index + + if( nIndex < 0 ) + nIndex = 0; + + if( nIndex >= m_nEnd ) + nIndex = m_nEnd - 1; + + // Adjust position + + if( m_nPosition > nIndex ) + m_nPosition = nIndex; + else if( m_nPosition + m_nPageSize <= nIndex ) + m_nPosition = nIndex - m_nPageSize + 1; + + UpdateThumbRect(); +} + + +//-------------------------------------------------------------------------------------- +bool CDXUTScrollBar::HandleKeyboard( UINT uMsg, WPARAM wParam, LPARAM lParam ) +{ + return false; +} + + +//-------------------------------------------------------------------------------------- +bool CDXUTScrollBar::HandleMouse( UINT uMsg, POINT pt, WPARAM wParam, LPARAM lParam ) +{ + static int ThumbOffsetY; + + m_LastMouse = pt; + switch( uMsg ) + { + case WM_LBUTTONDOWN: + case WM_LBUTTONDBLCLK: + { + // Check for click on up button + + if( PtInRect( &m_rcUpButton, pt ) ) + { + SetCapture( DXUTGetHWND() ); + if( m_nPosition > m_nStart ) + --m_nPosition; + UpdateThumbRect(); + m_Arrow = CLICKED_UP; + m_dArrowTS = DXUTGetTime(); + return true; + } + + // Check for click on down button + + if( PtInRect( &m_rcDownButton, pt ) ) + { + SetCapture( DXUTGetHWND() ); + if( m_nPosition + m_nPageSize < m_nEnd ) + ++m_nPosition; + UpdateThumbRect(); + m_Arrow = CLICKED_DOWN; + m_dArrowTS = DXUTGetTime(); + return true; + } + + // Check for click on thumb + + if( PtInRect( &m_rcThumb, pt ) ) + { + SetCapture( DXUTGetHWND() ); + m_bDrag = true; + ThumbOffsetY = pt.y - m_rcThumb.top; + return true; + } + + // Check for click on track + + if( m_rcThumb.left <= pt.x && + m_rcThumb.right > pt.x ) + { + SetCapture( DXUTGetHWND() ); + if( m_rcThumb.top > pt.y && + m_rcTrack.top <= pt.y ) + { + Scroll( -( m_nPageSize - 1 ) ); + return true; + } + else if( m_rcThumb.bottom <= pt.y && + m_rcTrack.bottom > pt.y ) + { + Scroll( m_nPageSize - 1 ); + return true; + } + } + + break; + } + + case WM_LBUTTONUP: + { + m_bDrag = false; + ReleaseCapture(); + UpdateThumbRect(); + m_Arrow = CLEAR; + break; + } + + case WM_MOUSEMOVE: + { + if( m_bDrag ) + { + m_rcThumb.bottom += pt.y - ThumbOffsetY - m_rcThumb.top; + m_rcThumb.top = pt.y - ThumbOffsetY; + if( m_rcThumb.top < m_rcTrack.top ) + OffsetRect( &m_rcThumb, 0, m_rcTrack.top - m_rcThumb.top ); + else if( m_rcThumb.bottom > m_rcTrack.bottom ) + OffsetRect( &m_rcThumb, 0, m_rcTrack.bottom - m_rcThumb.bottom ); + + // Compute first item index based on thumb position + + int nMaxFirstItem = m_nEnd - m_nStart - m_nPageSize; // Largest possible index for first item + int nMaxThumb = RectHeight( m_rcTrack ) - RectHeight( m_rcThumb ); // Largest possible thumb position from the top + + m_nPosition = m_nStart + + ( m_rcThumb.top - m_rcTrack.top + + nMaxThumb / ( nMaxFirstItem * 2 ) ) * // Shift by half a row to avoid last row covered by only one pixel + nMaxFirstItem / nMaxThumb; + + return true; + } + + break; + } + } + + return false; +} + + +//-------------------------------------------------------------------------------------- +bool CDXUTScrollBar::MsgProc( UINT uMsg, WPARAM wParam, LPARAM lParam ) +{ + if( WM_CAPTURECHANGED == uMsg ) + { + // The application just lost mouse capture. We may not have gotten + // the WM_MOUSEUP message, so reset m_bDrag here. + if( ( HWND )lParam != DXUTGetHWND() ) + m_bDrag = false; + } + + return false; +} + + +//-------------------------------------------------------------------------------------- +void CDXUTScrollBar::Render( float fElapsedTime ) +{ + if( m_bVisible == false ) + return; + + // Check if the arrow button has been held for a while. + // If so, update the thumb position to simulate repeated + // scroll. + if( m_Arrow != CLEAR ) + { + double dCurrTime = DXUTGetTime(); + if( PtInRect( &m_rcUpButton, m_LastMouse ) ) + { + switch( m_Arrow ) + { + case CLICKED_UP: + if( SCROLLBAR_ARROWCLICK_DELAY < dCurrTime - m_dArrowTS ) + { + Scroll( -1 ); + m_Arrow = HELD_UP; + m_dArrowTS = dCurrTime; + } + break; + case HELD_UP: + if( SCROLLBAR_ARROWCLICK_REPEAT < dCurrTime - m_dArrowTS ) + { + Scroll( -1 ); + m_dArrowTS = dCurrTime; + } + break; + } + } + else if( PtInRect( &m_rcDownButton, m_LastMouse ) ) + { + switch( m_Arrow ) + { + case CLICKED_DOWN: + if( SCROLLBAR_ARROWCLICK_DELAY < dCurrTime - m_dArrowTS ) + { + Scroll( 1 ); + m_Arrow = HELD_DOWN; + m_dArrowTS = dCurrTime; + } + break; + case HELD_DOWN: + if( SCROLLBAR_ARROWCLICK_REPEAT < dCurrTime - m_dArrowTS ) + { + Scroll( 1 ); + m_dArrowTS = dCurrTime; + } + break; + } + } + } + + DXUT_CONTROL_STATE iState = DXUT_STATE_NORMAL; + + if( m_bVisible == false ) + iState = DXUT_STATE_HIDDEN; + else if( m_bEnabled == false || m_bShowThumb == false ) + iState = DXUT_STATE_DISABLED; + else if( m_bMouseOver ) + iState = DXUT_STATE_MOUSEOVER; + else if( m_bHasFocus ) + iState = DXUT_STATE_FOCUS; + + + float fBlendRate = ( iState == DXUT_STATE_PRESSED ) ? 0.0f : 0.8f; + + // Background track layer + CDXUTElement* pElement = m_Elements.GetAt( 0 ); + + // Blend current color + pElement->TextureColor.Blend( iState, fElapsedTime, fBlendRate ); + m_pDialog->DrawSprite( pElement, &m_rcTrack, DXUT_FAR_BUTTON_DEPTH ); + + // Up Arrow + pElement = m_Elements.GetAt( 1 ); + + // Blend current color + pElement->TextureColor.Blend( iState, fElapsedTime, fBlendRate ); + m_pDialog->DrawSprite( pElement, &m_rcUpButton, DXUT_NEAR_BUTTON_DEPTH ); + + // Down Arrow + pElement = m_Elements.GetAt( 2 ); + + // Blend current color + pElement->TextureColor.Blend( iState, fElapsedTime, fBlendRate ); + m_pDialog->DrawSprite( pElement, &m_rcDownButton, DXUT_NEAR_BUTTON_DEPTH ); + + // Thumb button + pElement = m_Elements.GetAt( 3 ); + + // Blend current color + pElement->TextureColor.Blend( iState, fElapsedTime, fBlendRate ); + m_pDialog->DrawSprite( pElement, &m_rcThumb, DXUT_NEAR_BUTTON_DEPTH ); + +} + + +//-------------------------------------------------------------------------------------- +void CDXUTScrollBar::SetTrackRange( int nStart, int nEnd ) +{ + m_nStart = nStart; m_nEnd = nEnd; + Cap(); + UpdateThumbRect(); +} + + +//-------------------------------------------------------------------------------------- +void CDXUTScrollBar::Cap() // Clips position at boundaries. Ensures it stays within legal range. +{ + if( m_nPosition < m_nStart || + m_nEnd - m_nStart <= m_nPageSize ) + { + m_nPosition = m_nStart; + } + else if( m_nPosition + m_nPageSize > m_nEnd ) + m_nPosition = m_nEnd - m_nPageSize; +} + +//-------------------------------------------------------------------------------------- +// CDXUTListBox class +//-------------------------------------------------------------------------------------- + +//-------------------------------------------------------------------------------------- +CDXUTListBox::CDXUTListBox( CDXUTDialog* pDialog ) : m_ScrollBar( pDialog ) +{ + m_Type = DXUT_CONTROL_LISTBOX; + m_pDialog = pDialog; + + m_dwStyle = 0; + m_nSBWidth = 16; + m_nSelected = -1; + m_nSelStart = 0; + m_bDrag = false; + m_nBorder = 6; + m_nMargin = 5; + m_nTextHeight = 0; +} + + +//-------------------------------------------------------------------------------------- +CDXUTListBox::~CDXUTListBox() +{ + RemoveAllItems(); +} + + +//-------------------------------------------------------------------------------------- +void CDXUTListBox::UpdateRects() +{ + CDXUTControl::UpdateRects(); + + m_rcSelection = m_rcBoundingBox; + m_rcSelection.right -= m_nSBWidth; + InflateRect( &m_rcSelection, -m_nBorder, -m_nBorder ); + m_rcText = m_rcSelection; + InflateRect( &m_rcText, -m_nMargin, 0 ); + + // Update the scrollbar's rects + m_ScrollBar.SetLocation( m_rcBoundingBox.right - m_nSBWidth, m_rcBoundingBox.top ); + m_ScrollBar.SetSize( m_nSBWidth, m_height ); + DXUTFontNode* pFontNode = m_pDialog->GetManager()->GetFontNode( m_Elements.GetAt( 0 )->iFont ); + if( pFontNode && pFontNode->nHeight ) + { + m_ScrollBar.SetPageSize( RectHeight( m_rcText ) / pFontNode->nHeight ); + + // The selected item may have been scrolled off the page. + // Ensure that it is in page again. + m_ScrollBar.ShowItem( m_nSelected ); + } +} + + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTListBox::AddItem( const WCHAR* wszText, void* pData ) +{ + DXUTListBoxItem* pNewItem = new DXUTListBoxItem; + if( !pNewItem ) + return E_OUTOFMEMORY; + + wcscpy_s( pNewItem->strText, 256, wszText ); + pNewItem->pData = pData; + SetRect( &pNewItem->rcActive, 0, 0, 0, 0 ); + pNewItem->bSelected = false; + + HRESULT hr = m_Items.Add( pNewItem ); + if( FAILED( hr ) ) + { + SAFE_DELETE( pNewItem ); + } + else + { + m_ScrollBar.SetTrackRange( 0, m_Items.GetSize() ); + } + + return hr; +} + + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTListBox::InsertItem( int nIndex, const WCHAR* wszText, void* pData ) +{ + DXUTListBoxItem* pNewItem = new DXUTListBoxItem; + if( !pNewItem ) + return E_OUTOFMEMORY; + + wcscpy_s( pNewItem->strText, 256, wszText ); + pNewItem->pData = pData; + SetRect( &pNewItem->rcActive, 0, 0, 0, 0 ); + pNewItem->bSelected = false; + + HRESULT hr = m_Items.Insert( nIndex, pNewItem ); + if( SUCCEEDED( hr ) ) + m_ScrollBar.SetTrackRange( 0, m_Items.GetSize() ); + else + SAFE_DELETE( pNewItem ); + + return hr; +} + + +//-------------------------------------------------------------------------------------- +void CDXUTListBox::RemoveItem( int nIndex ) +{ + if( nIndex < 0 || nIndex >= ( int )m_Items.GetSize() ) + return; + + DXUTListBoxItem* pItem = m_Items.GetAt( nIndex ); + + delete pItem; + m_Items.Remove( nIndex ); + m_ScrollBar.SetTrackRange( 0, m_Items.GetSize() ); + if( m_nSelected >= ( int )m_Items.GetSize() ) + m_nSelected = m_Items.GetSize() - 1; + + m_pDialog->SendEvent( EVENT_LISTBOX_SELECTION, true, this ); +} + + + + + +//-------------------------------------------------------------------------------------- +void CDXUTListBox::RemoveAllItems() +{ + for( int i = 0; i < m_Items.GetSize(); ++i ) + { + DXUTListBoxItem* pItem = m_Items.GetAt( i ); + delete pItem; + } + + m_Items.RemoveAll(); + m_ScrollBar.SetTrackRange( 0, 1 ); +} + + +//-------------------------------------------------------------------------------------- +DXUTListBoxItem* CDXUTListBox::GetItem( int nIndex ) +{ + if( nIndex < 0 || nIndex >= ( int )m_Items.GetSize() ) + return NULL; + + return m_Items[nIndex]; +} + + +//-------------------------------------------------------------------------------------- +// For single-selection listbox, returns the index of the selected item. +// For multi-selection, returns the first selected item after the nPreviousSelected position. +// To search for the first selected item, the app passes -1 for nPreviousSelected. For +// subsequent searches, the app passes the returned index back to GetSelectedIndex as. +// nPreviousSelected. +// Returns -1 on error or if no item is selected. +int CDXUTListBox::GetSelectedIndex( int nPreviousSelected ) +{ + if( nPreviousSelected < -1 ) + return -1; + + if( m_dwStyle & MULTISELECTION ) + { + // Multiple selection enabled. Search for the next item with the selected flag. + for( int i = nPreviousSelected + 1; i < ( int )m_Items.GetSize(); ++i ) + { + DXUTListBoxItem* pItem = m_Items.GetAt( i ); + + if( pItem->bSelected ) + return i; + } + + return -1; + } + else + { + // Single selection + return m_nSelected; + } +} + + +//-------------------------------------------------------------------------------------- +void CDXUTListBox::SelectItem( int nNewIndex ) +{ + // If no item exists, do nothing. + if( m_Items.GetSize() == 0 ) + return; + + int nOldSelected = m_nSelected; + + // Adjust m_nSelected + m_nSelected = nNewIndex; + + // Perform capping + if( m_nSelected < 0 ) + m_nSelected = 0; + if( m_nSelected >= ( int )m_Items.GetSize() ) + m_nSelected = m_Items.GetSize() - 1; + + if( nOldSelected != m_nSelected ) + { + if( m_dwStyle & MULTISELECTION ) + { + m_Items[m_nSelected]->bSelected = true; + } + + // Update selection start + m_nSelStart = m_nSelected; + + // Adjust scroll bar + m_ScrollBar.ShowItem( m_nSelected ); + } + + m_pDialog->SendEvent( EVENT_LISTBOX_SELECTION, true, this ); +} + + +//-------------------------------------------------------------------------------------- +bool CDXUTListBox::HandleKeyboard( UINT uMsg, WPARAM wParam, LPARAM lParam ) +{ + if( !m_bEnabled || !m_bVisible ) + return false; + + // Let the scroll bar have a chance to handle it first + if( m_ScrollBar.HandleKeyboard( uMsg, wParam, lParam ) ) + return true; + + switch( uMsg ) + { + case WM_KEYDOWN: + switch( wParam ) + { + case VK_UP: + case VK_DOWN: + case VK_NEXT: + case VK_PRIOR: + case VK_HOME: + case VK_END: + { + // If no item exists, do nothing. + if( m_Items.GetSize() == 0 ) + return true; + + int nOldSelected = m_nSelected; + + // Adjust m_nSelected + switch( wParam ) + { + case VK_UP: + --m_nSelected; break; + case VK_DOWN: + ++m_nSelected; break; + case VK_NEXT: + m_nSelected += m_ScrollBar.GetPageSize() - 1; break; + case VK_PRIOR: + m_nSelected -= m_ScrollBar.GetPageSize() - 1; break; + case VK_HOME: + m_nSelected = 0; break; + case VK_END: + m_nSelected = m_Items.GetSize() - 1; break; + } + + // Perform capping + if( m_nSelected < 0 ) + m_nSelected = 0; + if( m_nSelected >= ( int )m_Items.GetSize() ) + m_nSelected = m_Items.GetSize() - 1; + + if( nOldSelected != m_nSelected ) + { + if( m_dwStyle & MULTISELECTION ) + { + // Multiple selection + + // Clear all selection + for( int i = 0; i < ( int )m_Items.GetSize(); ++i ) + { + DXUTListBoxItem* pItem = m_Items[i]; + pItem->bSelected = false; + } + + if( GetKeyState( VK_SHIFT ) < 0 ) + { + // Select all items from m_nSelStart to + // m_nSelected + int nEnd = __max( m_nSelStart, m_nSelected ); + + for( int n = __min( m_nSelStart, m_nSelected ); n <= nEnd; ++n ) + m_Items[n]->bSelected = true; + } + else + { + m_Items[m_nSelected]->bSelected = true; + + // Update selection start + m_nSelStart = m_nSelected; + } + } + else + m_nSelStart = m_nSelected; + + // Adjust scroll bar + + m_ScrollBar.ShowItem( m_nSelected ); + + // Send notification + + m_pDialog->SendEvent( EVENT_LISTBOX_SELECTION, true, this ); + } + return true; + } + + // Space is the hotkey for double-clicking an item. + // + case VK_SPACE: + m_pDialog->SendEvent( EVENT_LISTBOX_ITEM_DBLCLK, true, this ); + return true; + } + break; + } + + return false; +} + + +//-------------------------------------------------------------------------------------- +bool CDXUTListBox::HandleMouse( UINT uMsg, POINT pt, WPARAM wParam, LPARAM lParam ) +{ + if( !m_bEnabled || !m_bVisible ) + return false; + + // First acquire focus + if( WM_LBUTTONDOWN == uMsg ) + if( !m_bHasFocus ) + m_pDialog->RequestFocus( this ); + + // Let the scroll bar handle it first. + if( m_ScrollBar.HandleMouse( uMsg, pt, wParam, lParam ) ) + return true; + + switch( uMsg ) + { + case WM_LBUTTONDOWN: + case WM_LBUTTONDBLCLK: + // Check for clicks in the text area + if( m_Items.GetSize() > 0 && PtInRect( &m_rcSelection, pt ) ) + { + // Compute the index of the clicked item + + int nClicked; + if( m_nTextHeight ) + nClicked = m_ScrollBar.GetTrackPos() + ( pt.y - m_rcText.top ) / m_nTextHeight; + else + nClicked = -1; + + // Only proceed if the click falls on top of an item. + + if( nClicked >= m_ScrollBar.GetTrackPos() && + nClicked < ( int )m_Items.GetSize() && + nClicked < m_ScrollBar.GetTrackPos() + m_ScrollBar.GetPageSize() ) + { + SetCapture( DXUTGetHWND() ); + m_bDrag = true; + + // If this is a double click, fire off an event and exit + // since the first click would have taken care of the selection + // updating. + if( uMsg == WM_LBUTTONDBLCLK ) + { + m_pDialog->SendEvent( EVENT_LISTBOX_ITEM_DBLCLK, true, this ); + return true; + } + + m_nSelected = nClicked; + if( !( wParam & MK_SHIFT ) ) + m_nSelStart = m_nSelected; + + // If this is a multi-selection listbox, update per-item + // selection data. + + if( m_dwStyle & MULTISELECTION ) + { + // Determine behavior based on the state of Shift and Ctrl + + DXUTListBoxItem* pSelItem = m_Items.GetAt( m_nSelected ); + if( ( wParam & ( MK_SHIFT | MK_CONTROL ) ) == MK_CONTROL ) + { + // Control click. Reverse the selection of this item. + + pSelItem->bSelected = !pSelItem->bSelected; + } + else if( ( wParam & ( MK_SHIFT | MK_CONTROL ) ) == MK_SHIFT ) + { + // Shift click. Set the selection for all items + // from last selected item to the current item. + // Clear everything else. + + int nBegin = __min( m_nSelStart, m_nSelected ); + int nEnd = __max( m_nSelStart, m_nSelected ); + + for( int i = 0; i < nBegin; ++i ) + { + DXUTListBoxItem* pItem = m_Items.GetAt( i ); + pItem->bSelected = false; + } + + for( int i = nEnd + 1; i < ( int )m_Items.GetSize(); ++i ) + { + DXUTListBoxItem* pItem = m_Items.GetAt( i ); + pItem->bSelected = false; + } + + for( int i = nBegin; i <= nEnd; ++i ) + { + DXUTListBoxItem* pItem = m_Items.GetAt( i ); + pItem->bSelected = true; + } + } + else if( ( wParam & ( MK_SHIFT | MK_CONTROL ) ) == ( MK_SHIFT | MK_CONTROL ) ) + { + // Control-Shift-click. + + // The behavior is: + // Set all items from m_nSelStart to m_nSelected to + // the same state as m_nSelStart, not including m_nSelected. + // Set m_nSelected to selected. + + int nBegin = __min( m_nSelStart, m_nSelected ); + int nEnd = __max( m_nSelStart, m_nSelected ); + + // The two ends do not need to be set here. + + bool bLastSelected = m_Items.GetAt( m_nSelStart )->bSelected; + for( int i = nBegin + 1; i < nEnd; ++i ) + { + DXUTListBoxItem* pItem = m_Items.GetAt( i ); + pItem->bSelected = bLastSelected; + } + + pSelItem->bSelected = true; + + // Restore m_nSelected to the previous value + // This matches the Windows behavior + + m_nSelected = m_nSelStart; + } + else + { + // Simple click. Clear all items and select the clicked + // item. + + + for( int i = 0; i < ( int )m_Items.GetSize(); ++i ) + { + DXUTListBoxItem* pItem = m_Items.GetAt( i ); + pItem->bSelected = false; + } + + pSelItem->bSelected = true; + } + } // End of multi-selection case + + m_pDialog->SendEvent( EVENT_LISTBOX_SELECTION, true, this ); + } + + return true; + } + break; + + case WM_LBUTTONUP: + { + ReleaseCapture(); + m_bDrag = false; + + if( m_nSelected != -1 ) + { + // Set all items between m_nSelStart and m_nSelected to + // the same state as m_nSelStart + int nEnd = __max( m_nSelStart, m_nSelected ); + + for( int n = __min( m_nSelStart, m_nSelected ) + 1; n < nEnd; ++n ) + m_Items[n]->bSelected = m_Items[m_nSelStart]->bSelected; + m_Items[m_nSelected]->bSelected = m_Items[m_nSelStart]->bSelected; + + // If m_nSelStart and m_nSelected are not the same, + // the user has dragged the mouse to make a selection. + // Notify the application of this. + if( m_nSelStart != m_nSelected ) + m_pDialog->SendEvent( EVENT_LISTBOX_SELECTION, true, this ); + + m_pDialog->SendEvent( EVENT_LISTBOX_SELECTION_END, true, this ); + } + return false; + } + + case WM_MOUSEMOVE: + if( m_bDrag ) + { + // Compute the index of the item below cursor + + int nItem; + if( m_nTextHeight ) + nItem = m_ScrollBar.GetTrackPos() + ( pt.y - m_rcText.top ) / m_nTextHeight; + else + nItem = -1; + + // Only proceed if the cursor is on top of an item. + + if( nItem >= ( int )m_ScrollBar.GetTrackPos() && + nItem < ( int )m_Items.GetSize() && + nItem < m_ScrollBar.GetTrackPos() + m_ScrollBar.GetPageSize() ) + { + m_nSelected = nItem; + m_pDialog->SendEvent( EVENT_LISTBOX_SELECTION, true, this ); + } + else if( nItem < ( int )m_ScrollBar.GetTrackPos() ) + { + // User drags the mouse above window top + m_ScrollBar.Scroll( -1 ); + m_nSelected = m_ScrollBar.GetTrackPos(); + m_pDialog->SendEvent( EVENT_LISTBOX_SELECTION, true, this ); + } + else if( nItem >= m_ScrollBar.GetTrackPos() + m_ScrollBar.GetPageSize() ) + { + // User drags the mouse below window bottom + m_ScrollBar.Scroll( 1 ); + m_nSelected = __min( ( int )m_Items.GetSize(), m_ScrollBar.GetTrackPos() + + m_ScrollBar.GetPageSize() ) - 1; + m_pDialog->SendEvent( EVENT_LISTBOX_SELECTION, true, this ); + } + } + break; + + case WM_MOUSEWHEEL: + { + UINT uLines; + SystemParametersInfo( SPI_GETWHEELSCROLLLINES, 0, &uLines, 0 ); + int nScrollAmount = int( ( short )HIWORD( wParam ) ) / WHEEL_DELTA * uLines; + m_ScrollBar.Scroll( -nScrollAmount ); + return true; + } + } + + return false; +} + + +//-------------------------------------------------------------------------------------- +bool CDXUTListBox::MsgProc( UINT uMsg, WPARAM wParam, LPARAM lParam ) +{ + if( WM_CAPTURECHANGED == uMsg ) + { + // The application just lost mouse capture. We may not have gotten + // the WM_MOUSEUP message, so reset m_bDrag here. + if( ( HWND )lParam != DXUTGetHWND() ) + m_bDrag = false; + } + + return false; +} + + +//-------------------------------------------------------------------------------------- +void CDXUTListBox::Render( float fElapsedTime ) +{ + if( m_bVisible == false ) + return; + + CDXUTElement* pElement = m_Elements.GetAt( 0 ); + pElement->TextureColor.Blend( DXUT_STATE_NORMAL, fElapsedTime ); + pElement->FontColor.Blend( DXUT_STATE_NORMAL, fElapsedTime ); + + CDXUTElement* pSelElement = m_Elements.GetAt( 1 ); + pSelElement->TextureColor.Blend( DXUT_STATE_NORMAL, fElapsedTime ); + pSelElement->FontColor.Blend( DXUT_STATE_NORMAL, fElapsedTime ); + + m_pDialog->DrawSprite( pElement, &m_rcBoundingBox, DXUT_FAR_BUTTON_DEPTH ); + + // Render the text + if( m_Items.GetSize() > 0 ) + { + // Find out the height of a single line of text + RECT rc = m_rcText; + RECT rcSel = m_rcSelection; + rc.bottom = rc.top + m_pDialog->GetManager()->GetFontNode( pElement->iFont )->nHeight; + + // Update the line height formation + m_nTextHeight = rc.bottom - rc.top; + + static bool bSBInit; + if( !bSBInit ) + { + // Update the page size of the scroll bar + if( m_nTextHeight ) + m_ScrollBar.SetPageSize( RectHeight( m_rcText ) / m_nTextHeight ); + else + m_ScrollBar.SetPageSize( RectHeight( m_rcText ) ); + bSBInit = true; + } + + rc.right = m_rcText.right; + for( int i = m_ScrollBar.GetTrackPos(); i < ( int )m_Items.GetSize(); ++i ) + { + if( rc.bottom > m_rcText.bottom ) + break; + + DXUTListBoxItem* pItem = m_Items.GetAt( i ); + + // Determine if we need to render this item with the + // selected element. + bool bSelectedStyle = false; + + if( !( m_dwStyle & MULTISELECTION ) && i == m_nSelected ) + bSelectedStyle = true; + else if( m_dwStyle & MULTISELECTION ) + { + if( m_bDrag && + ( ( i >= m_nSelected && i < m_nSelStart ) || + ( i <= m_nSelected && i > m_nSelStart ) ) ) + bSelectedStyle = m_Items[m_nSelStart]->bSelected; + else if( pItem->bSelected ) + bSelectedStyle = true; + } + + if( bSelectedStyle ) + { + rcSel.top = rc.top; rcSel.bottom = rc.bottom; + m_pDialog->DrawSprite( pSelElement, &rcSel, DXUT_NEAR_BUTTON_DEPTH ); + m_pDialog->DrawText( pItem->strText, pSelElement, &rc ); + } + else + m_pDialog->DrawText( pItem->strText, pElement, &rc ); + + OffsetRect( &rc, 0, m_nTextHeight ); + } + } + + // Render the scroll bar + + m_ScrollBar.Render( fElapsedTime ); +} + + +// Static member initialization +HINSTANCE CUniBuffer::s_hDll = NULL; +HRESULT ( WINAPI*CUniBuffer::_ScriptApplyDigitSubstitution )( const SCRIPT_DIGITSUBSTITUTE*, SCRIPT_CONTROL*, + SCRIPT_STATE* ) = Dummy_ScriptApplyDigitSubstitution; +HRESULT ( WINAPI*CUniBuffer::_ScriptStringAnalyse )( HDC, const void*, int, int, int, DWORD, int, SCRIPT_CONTROL*, + SCRIPT_STATE*, const int*, SCRIPT_TABDEF*, const BYTE*, + SCRIPT_STRING_ANALYSIS* ) = Dummy_ScriptStringAnalyse; +HRESULT ( WINAPI*CUniBuffer::_ScriptStringCPtoX )( SCRIPT_STRING_ANALYSIS, int, BOOL, int* ) = Dummy_ScriptStringCPtoX; +HRESULT ( WINAPI*CUniBuffer::_ScriptStringXtoCP )( SCRIPT_STRING_ANALYSIS, int, int*, int* ) = Dummy_ScriptStringXtoCP; +HRESULT ( WINAPI*CUniBuffer::_ScriptStringFree )( SCRIPT_STRING_ANALYSIS* ) = Dummy_ScriptStringFree; +const SCRIPT_LOGATTR* ( WINAPI*CUniBuffer::_ScriptString_pLogAttr )( SCRIPT_STRING_ANALYSIS ) = + Dummy_ScriptString_pLogAttr; +const int* ( WINAPI*CUniBuffer::_ScriptString_pcOutChars )( SCRIPT_STRING_ANALYSIS ) = + Dummy_ScriptString_pcOutChars; +bool CDXUTEditBox::s_bHideCaret; // If true, we don't render the caret. + + + +//-------------------------------------------------------------------------------------- +// CDXUTEditBox class +//-------------------------------------------------------------------------------------- + +// When scrolling, EDITBOX_SCROLLEXTENT is reciprocal of the amount to scroll. +// If EDITBOX_SCROLLEXTENT = 4, then we scroll 1/4 of the control each time. +#define EDITBOX_SCROLLEXTENT 4 + +//-------------------------------------------------------------------------------------- +CDXUTEditBox::CDXUTEditBox( CDXUTDialog* pDialog ) +{ + m_Type = DXUT_CONTROL_EDITBOX; + m_pDialog = pDialog; + + m_nBorder = 5; // Default border width + m_nSpacing = 4; // Default spacing + + m_bCaretOn = true; + m_dfBlink = GetCaretBlinkTime() * 0.001f; + m_dfLastBlink = DXUTGetGlobalTimer()->GetAbsoluteTime(); + s_bHideCaret = false; + m_nFirstVisible = 0; + m_TextColor = D3DCOLOR_ARGB( 255, 16, 16, 16 ); + m_SelTextColor = D3DCOLOR_ARGB( 255, 255, 255, 255 ); + m_SelBkColor = D3DCOLOR_ARGB( 255, 40, 50, 92 ); + m_CaretColor = D3DCOLOR_ARGB( 255, 0, 0, 0 ); + m_nCaret = m_nSelStart = 0; + m_bInsertMode = true; + + m_bMouseDrag = false; +} + + +//-------------------------------------------------------------------------------------- +CDXUTEditBox::~CDXUTEditBox() +{ +} + + +//-------------------------------------------------------------------------------------- +// PlaceCaret: Set the caret to a character position, and adjust the scrolling if +// necessary. +//-------------------------------------------------------------------------------------- +void CDXUTEditBox::PlaceCaret( int nCP ) +{ + assert( nCP >= 0 && nCP <= m_Buffer.GetTextSize() ); + m_nCaret = nCP; + + // Obtain the X offset of the character. + int nX1st, nX, nX2; + m_Buffer.CPtoX( m_nFirstVisible, FALSE, &nX1st ); // 1st visible char + m_Buffer.CPtoX( nCP, FALSE, &nX ); // LEAD + // If nCP is the NULL terminator, get the leading edge instead of trailing. + if( nCP == m_Buffer.GetTextSize() ) + nX2 = nX; + else + m_Buffer.CPtoX( nCP, TRUE, &nX2 ); // TRAIL + + // If the left edge of the char is smaller than the left edge of the 1st visible char, + // we need to scroll left until this char is visible. + if( nX < nX1st ) + { + // Simply make the first visible character the char at the new caret position. + m_nFirstVisible = nCP; + } + else // If the right of the character is bigger than the offset of the control's + // right edge, we need to scroll right to this character. + if( nX2 > nX1st + RectWidth( m_rcText ) ) + { + // Compute the X of the new left-most pixel + int nXNewLeft = nX2 - RectWidth( m_rcText ); + + // Compute the char position of this character + int nCPNew1st, nNewTrail; + m_Buffer.XtoCP( nXNewLeft, &nCPNew1st, &nNewTrail ); + + // If this coordinate is not on a character border, + // start from the next character so that the caret + // position does not fall outside the text rectangle. + int nXNew1st; + m_Buffer.CPtoX( nCPNew1st, FALSE, &nXNew1st ); + if( nXNew1st < nXNewLeft ) + ++nCPNew1st; + + m_nFirstVisible = nCPNew1st; + } +} + + +//-------------------------------------------------------------------------------------- +void CDXUTEditBox::ClearText() +{ + m_Buffer.Clear(); + m_nFirstVisible = 0; + PlaceCaret( 0 ); + m_nSelStart = 0; +} + + +//-------------------------------------------------------------------------------------- +void CDXUTEditBox::SetText( LPCWSTR wszText, bool bSelected ) +{ + assert( wszText != NULL ); + + m_Buffer.SetText( wszText ); + m_nFirstVisible = 0; + // Move the caret to the end of the text + PlaceCaret( m_Buffer.GetTextSize() ); + m_nSelStart = bSelected ? 0 : m_nCaret; +} + + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTEditBox::GetTextCopy( __out_ecount(bufferCount) LPWSTR strDest, + UINT bufferCount ) +{ + assert( strDest ); + + wcscpy_s( strDest, bufferCount, m_Buffer.GetBuffer() ); + + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +void CDXUTEditBox::DeleteSelectionText() +{ + int nFirst = __min( m_nCaret, m_nSelStart ); + int nLast = __max( m_nCaret, m_nSelStart ); + // Update caret and selection + PlaceCaret( nFirst ); + m_nSelStart = m_nCaret; + // Remove the characters + for( int i = nFirst; i < nLast; ++i ) + m_Buffer.RemoveChar( nFirst ); +} + + +//-------------------------------------------------------------------------------------- +void CDXUTEditBox::UpdateRects() +{ + CDXUTControl::UpdateRects(); + + // Update the text rectangle + m_rcText = m_rcBoundingBox; + // First inflate by m_nBorder to compute render rects + InflateRect( &m_rcText, -m_nBorder, -m_nBorder ); + + // Update the render rectangles + m_rcRender[0] = m_rcText; + SetRect( &m_rcRender[1], m_rcBoundingBox.left, m_rcBoundingBox.top, m_rcText.left, m_rcText.top ); + SetRect( &m_rcRender[2], m_rcText.left, m_rcBoundingBox.top, m_rcText.right, m_rcText.top ); + SetRect( &m_rcRender[3], m_rcText.right, m_rcBoundingBox.top, m_rcBoundingBox.right, m_rcText.top ); + SetRect( &m_rcRender[4], m_rcBoundingBox.left, m_rcText.top, m_rcText.left, m_rcText.bottom ); + SetRect( &m_rcRender[5], m_rcText.right, m_rcText.top, m_rcBoundingBox.right, m_rcText.bottom ); + SetRect( &m_rcRender[6], m_rcBoundingBox.left, m_rcText.bottom, m_rcText.left, m_rcBoundingBox.bottom ); + SetRect( &m_rcRender[7], m_rcText.left, m_rcText.bottom, m_rcText.right, m_rcBoundingBox.bottom ); + SetRect( &m_rcRender[8], m_rcText.right, m_rcText.bottom, m_rcBoundingBox.right, m_rcBoundingBox.bottom ); + + // Inflate further by m_nSpacing + InflateRect( &m_rcText, -m_nSpacing, -m_nSpacing ); +} + + +void CDXUTEditBox::CopyToClipboard() +{ + // Copy the selection text to the clipboard + if( m_nCaret != m_nSelStart && OpenClipboard( NULL ) ) + { + EmptyClipboard(); + + HGLOBAL hBlock = GlobalAlloc( GMEM_MOVEABLE, sizeof( WCHAR ) * ( m_Buffer.GetTextSize() + 1 ) ); + if( hBlock ) + { + WCHAR* pwszText = ( WCHAR* )GlobalLock( hBlock ); + if( pwszText ) + { + int nFirst = __min( m_nCaret, m_nSelStart ); + int nLast = __max( m_nCaret, m_nSelStart ); + if( nLast - nFirst > 0 ) + CopyMemory( pwszText, m_Buffer.GetBuffer() + nFirst, ( nLast - nFirst ) * sizeof( WCHAR ) ); + pwszText[nLast - nFirst] = L'\0'; // Terminate it + GlobalUnlock( hBlock ); + } + SetClipboardData( CF_UNICODETEXT, hBlock ); + } + CloseClipboard(); + // We must not free the object until CloseClipboard is called. + if( hBlock ) + GlobalFree( hBlock ); + } +} + + +void CDXUTEditBox::PasteFromClipboard() +{ + DeleteSelectionText(); + + if( OpenClipboard( NULL ) ) + { + HANDLE handle = GetClipboardData( CF_UNICODETEXT ); + if( handle ) + { + // Convert the ANSI string to Unicode, then + // insert to our buffer. + WCHAR* pwszText = ( WCHAR* )GlobalLock( handle ); + if( pwszText ) + { + // Copy all characters up to null. + if( m_Buffer.InsertString( m_nCaret, pwszText ) ) + PlaceCaret( m_nCaret + lstrlenW( pwszText ) ); + m_nSelStart = m_nCaret; + GlobalUnlock( handle ); + } + } + CloseClipboard(); + } +} + + +//-------------------------------------------------------------------------------------- +bool CDXUTEditBox::HandleKeyboard( UINT uMsg, WPARAM wParam, LPARAM lParam ) +{ + if( !m_bEnabled || !m_bVisible ) + return false; + + bool bHandled = false; + + switch( uMsg ) + { + case WM_KEYDOWN: + { + switch( wParam ) + { + case VK_TAB: + // We don't process Tab in case keyboard input is enabled and the user + // wishes to Tab to other controls. + break; + + case VK_HOME: + PlaceCaret( 0 ); + if( GetKeyState( VK_SHIFT ) >= 0 ) + // Shift is not down. Update selection + // start along with the caret. + m_nSelStart = m_nCaret; + ResetCaretBlink(); + bHandled = true; + break; + + case VK_END: + PlaceCaret( m_Buffer.GetTextSize() ); + if( GetKeyState( VK_SHIFT ) >= 0 ) + // Shift is not down. Update selection + // start along with the caret. + m_nSelStart = m_nCaret; + ResetCaretBlink(); + bHandled = true; + break; + + case VK_INSERT: + if( GetKeyState( VK_CONTROL ) < 0 ) + { + // Control Insert. Copy to clipboard + CopyToClipboard(); + } + else if( GetKeyState( VK_SHIFT ) < 0 ) + { + // Shift Insert. Paste from clipboard + PasteFromClipboard(); + } + else + { + // Toggle caret insert mode + m_bInsertMode = !m_bInsertMode; + } + break; + + case VK_DELETE: + // Check if there is a text selection. + if( m_nCaret != m_nSelStart ) + { + DeleteSelectionText(); + m_pDialog->SendEvent( EVENT_EDITBOX_CHANGE, true, this ); + } + else + { + // Deleting one character + if( m_Buffer.RemoveChar( m_nCaret ) ) + m_pDialog->SendEvent( EVENT_EDITBOX_CHANGE, true, this ); + } + ResetCaretBlink(); + bHandled = true; + break; + + case VK_LEFT: + if( GetKeyState( VK_CONTROL ) < 0 ) + { + // Control is down. Move the caret to a new item + // instead of a character. + m_Buffer.GetPriorItemPos( m_nCaret, &m_nCaret ); + PlaceCaret( m_nCaret ); + } + else if( m_nCaret > 0 ) + PlaceCaret( m_nCaret - 1 ); + if( GetKeyState( VK_SHIFT ) >= 0 ) + // Shift is not down. Update selection + // start along with the caret. + m_nSelStart = m_nCaret; + ResetCaretBlink(); + bHandled = true; + break; + + case VK_RIGHT: + if( GetKeyState( VK_CONTROL ) < 0 ) + { + // Control is down. Move the caret to a new item + // instead of a character. + m_Buffer.GetNextItemPos( m_nCaret, &m_nCaret ); + PlaceCaret( m_nCaret ); + } + else if( m_nCaret < m_Buffer.GetTextSize() ) + PlaceCaret( m_nCaret + 1 ); + if( GetKeyState( VK_SHIFT ) >= 0 ) + // Shift is not down. Update selection + // start along with the caret. + m_nSelStart = m_nCaret; + ResetCaretBlink(); + bHandled = true; + break; + + case VK_UP: + case VK_DOWN: + // Trap up and down arrows so that the dialog + // does not switch focus to another control. + bHandled = true; + break; + + default: + bHandled = wParam != VK_ESCAPE; // Let the application handle Esc. + } + } + } + return bHandled; +} + + +//-------------------------------------------------------------------------------------- +bool CDXUTEditBox::HandleMouse( UINT uMsg, POINT pt, WPARAM wParam, LPARAM lParam ) +{ + if( !m_bEnabled || !m_bVisible ) + return false; + + switch( uMsg ) + { + case WM_LBUTTONDOWN: + case WM_LBUTTONDBLCLK: + { + if( !m_bHasFocus ) + m_pDialog->RequestFocus( this ); + + if( !ContainsPoint( pt ) ) + return false; + + m_bMouseDrag = true; + SetCapture( DXUTGetHWND() ); + // Determine the character corresponding to the coordinates. + int nCP, nTrail, nX1st; + m_Buffer.CPtoX( m_nFirstVisible, FALSE, &nX1st ); // X offset of the 1st visible char + if( SUCCEEDED( m_Buffer.XtoCP( pt.x - m_rcText.left + nX1st, &nCP, &nTrail ) ) ) + { + // Cap at the NULL character. + if( nTrail && nCP < m_Buffer.GetTextSize() ) + PlaceCaret( nCP + 1 ); + else + PlaceCaret( nCP ); + m_nSelStart = m_nCaret; + ResetCaretBlink(); + } + return true; + } + + case WM_LBUTTONUP: + ReleaseCapture(); + m_bMouseDrag = false; + break; + + case WM_MOUSEMOVE: + if( m_bMouseDrag ) + { + // Determine the character corresponding to the coordinates. + int nCP, nTrail, nX1st; + m_Buffer.CPtoX( m_nFirstVisible, FALSE, &nX1st ); // X offset of the 1st visible char + if( SUCCEEDED( m_Buffer.XtoCP( pt.x - m_rcText.left + nX1st, &nCP, &nTrail ) ) ) + { + // Cap at the NULL character. + if( nTrail && nCP < m_Buffer.GetTextSize() ) + PlaceCaret( nCP + 1 ); + else + PlaceCaret( nCP ); + } + } + break; + } + + return false; +} + + +//-------------------------------------------------------------------------------------- +void CDXUTEditBox::OnFocusIn() +{ + CDXUTControl::OnFocusIn(); + + ResetCaretBlink(); +} + + +//-------------------------------------------------------------------------------------- +bool CDXUTEditBox::MsgProc( UINT uMsg, WPARAM wParam, LPARAM lParam ) +{ + if( !m_bEnabled || !m_bVisible ) + return false; + + switch( uMsg ) + { + // Make sure that while editing, the keyup and keydown messages associated with + // WM_CHAR messages don't go to any non-focused controls or cameras + case WM_KEYUP: + case WM_KEYDOWN: + return true; + + case WM_CHAR: + { + switch( ( WCHAR )wParam ) + { + // Backspace + case VK_BACK: + { + // If there's a selection, treat this + // like a delete key. + if( m_nCaret != m_nSelStart ) + { + DeleteSelectionText(); + m_pDialog->SendEvent( EVENT_EDITBOX_CHANGE, true, this ); + } + else if( m_nCaret > 0 ) + { + // Move the caret, then delete the char. + PlaceCaret( m_nCaret - 1 ); + m_nSelStart = m_nCaret; + m_Buffer.RemoveChar( m_nCaret ); + m_pDialog->SendEvent( EVENT_EDITBOX_CHANGE, true, this ); + } + ResetCaretBlink(); + break; + } + + case 24: // Ctrl-X Cut + case VK_CANCEL: // Ctrl-C Copy + { + CopyToClipboard(); + + // If the key is Ctrl-X, delete the selection too. + if( ( WCHAR )wParam == 24 ) + { + DeleteSelectionText(); + m_pDialog->SendEvent( EVENT_EDITBOX_CHANGE, true, this ); + } + + break; + } + + // Ctrl-V Paste + case 22: + { + PasteFromClipboard(); + m_pDialog->SendEvent( EVENT_EDITBOX_CHANGE, true, this ); + break; + } + + // Ctrl-A Select All + case 1: + if( m_nSelStart == m_nCaret ) + { + m_nSelStart = 0; + PlaceCaret( m_Buffer.GetTextSize() ); + } + break; + + case VK_RETURN: + // Invoke the callback when the user presses Enter. + m_pDialog->SendEvent( EVENT_EDITBOX_STRING, true, this ); + break; + + // Junk characters we don't want in the string + case 26: // Ctrl Z + case 2: // Ctrl B + case 14: // Ctrl N + case 19: // Ctrl S + case 4: // Ctrl D + case 6: // Ctrl F + case 7: // Ctrl G + case 10: // Ctrl J + case 11: // Ctrl K + case 12: // Ctrl L + case 17: // Ctrl Q + case 23: // Ctrl W + case 5: // Ctrl E + case 18: // Ctrl R + case 20: // Ctrl T + case 25: // Ctrl Y + case 21: // Ctrl U + case 9: // Ctrl I + case 15: // Ctrl O + case 16: // Ctrl P + case 27: // Ctrl [ + case 29: // Ctrl ] + case 28: // Ctrl \ + break; + + default: + { + // If there's a selection and the user + // starts to type, the selection should + // be deleted. + if( m_nCaret != m_nSelStart ) + DeleteSelectionText(); + + // If we are in overwrite mode and there is already + // a char at the caret's position, simply replace it. + // Otherwise, we insert the char as normal. + if( !m_bInsertMode && m_nCaret < m_Buffer.GetTextSize() ) + { + m_Buffer[m_nCaret] = ( WCHAR )wParam; + PlaceCaret( m_nCaret + 1 ); + m_nSelStart = m_nCaret; + } + else + { + // Insert the char + if( m_Buffer.InsertChar( m_nCaret, ( WCHAR )wParam ) ) + { + PlaceCaret( m_nCaret + 1 ); + m_nSelStart = m_nCaret; + } + } + ResetCaretBlink(); + m_pDialog->SendEvent( EVENT_EDITBOX_CHANGE, true, this ); + } + } + return true; + } + } + return false; +} + + +//-------------------------------------------------------------------------------------- +void CDXUTEditBox::Render( float fElapsedTime ) +{ + if( m_bVisible == false ) + return; + + HRESULT hr; + int nSelStartX = 0, nCaretX = 0; // Left and right X cordinates of the selection region + + CDXUTElement* pElement = GetElement( 0 ); + if( pElement ) + { + m_Buffer.SetFontNode( m_pDialog->GetFont( pElement->iFont ) ); + PlaceCaret( m_nCaret ); // Call PlaceCaret now that we have the font info (node), + // so that scrolling can be handled. + } + + // Render the control graphics + for( int e = 0; e < 9; ++e ) + { + pElement = m_Elements.GetAt( e ); + pElement->TextureColor.Blend( DXUT_STATE_NORMAL, fElapsedTime ); + + m_pDialog->DrawSprite( pElement, &m_rcRender[e], DXUT_FAR_BUTTON_DEPTH ); + } + + // + // Compute the X coordinates of the first visible character. + // + int nXFirst; + m_Buffer.CPtoX( m_nFirstVisible, FALSE, &nXFirst ); + + // + // Compute the X coordinates of the selection rectangle + // + hr = m_Buffer.CPtoX( m_nCaret, FALSE, &nCaretX ); + if( m_nCaret != m_nSelStart ) + hr = m_Buffer.CPtoX( m_nSelStart, FALSE, &nSelStartX ); + else + nSelStartX = nCaretX; + + // + // Render the selection rectangle + // + RECT rcSelection; // Make this available for rendering selected text + if( m_nCaret != m_nSelStart ) + { + int nSelLeftX = nCaretX, nSelRightX = nSelStartX; + // Swap if left is bigger than right + if( nSelLeftX > nSelRightX ) + { + int nTemp = nSelLeftX; nSelLeftX = nSelRightX; nSelRightX = nTemp; + } + + SetRect( &rcSelection, nSelLeftX, m_rcText.top, nSelRightX, m_rcText.bottom ); + OffsetRect( &rcSelection, m_rcText.left - nXFirst, 0 ); + IntersectRect( &rcSelection, &m_rcText, &rcSelection ); + + IDirect3DDevice9* pd3dDevice = m_pDialog->GetManager()->GetD3D9Device(); + if( pd3dDevice ) + pd3dDevice->SetRenderState( D3DRS_ZENABLE, FALSE ); + m_pDialog->DrawRect( &rcSelection, m_SelBkColor ); + if( pd3dDevice ) + pd3dDevice->SetRenderState( D3DRS_ZENABLE, TRUE ); + } + + // + // Render the text + // + // Element 0 for text + m_Elements.GetAt( 0 )->FontColor.Current = m_TextColor; + m_pDialog->DrawText( m_Buffer.GetBuffer() + m_nFirstVisible, m_Elements.GetAt( 0 ), &m_rcText ); + + // Render the selected text + if( m_nCaret != m_nSelStart ) + { + int nFirstToRender = __max( m_nFirstVisible, __min( m_nSelStart, m_nCaret ) ); + int nNumChatToRender = __max( m_nSelStart, m_nCaret ) - nFirstToRender; + m_Elements.GetAt( 0 )->FontColor.Current = m_SelTextColor; + m_pDialog->DrawText( m_Buffer.GetBuffer() + nFirstToRender, + m_Elements.GetAt( 0 ), &rcSelection, false, nNumChatToRender ); + } + + // + // Blink the caret + // + if( DXUTGetGlobalTimer()->GetAbsoluteTime() - m_dfLastBlink >= m_dfBlink ) + { + m_bCaretOn = !m_bCaretOn; + m_dfLastBlink = DXUTGetGlobalTimer()->GetAbsoluteTime(); + } + + // + // Render the caret if this control has the focus + // + if( m_bHasFocus && m_bCaretOn && !s_bHideCaret ) + { + // Start the rectangle with insert mode caret + RECT rcCaret = + { + m_rcText.left - nXFirst + nCaretX - 1, m_rcText.top, + m_rcText.left - nXFirst + nCaretX + 1, m_rcText.bottom + }; + + // If we are in overwrite mode, adjust the caret rectangle + // to fill the entire character. + if( !m_bInsertMode ) + { + // Obtain the right edge X coord of the current character + int nRightEdgeX; + m_Buffer.CPtoX( m_nCaret, TRUE, &nRightEdgeX ); + rcCaret.right = m_rcText.left - nXFirst + nRightEdgeX; + } + + m_pDialog->DrawRect( &rcCaret, m_CaretColor ); + } +} + + +#define IN_FLOAT_CHARSET( c ) \ + ( (c) == L'-' || (c) == L'.' || ( (c) >= L'0' && (c) <= L'9' ) ) + +void CDXUTEditBox::ParseFloatArray( float* pNumbers, int nCount ) +{ + int nWritten = 0; // Number of floats written + const WCHAR* pToken, *pEnd; + WCHAR wszToken[60]; + + pToken = m_Buffer.GetBuffer(); + while( nWritten < nCount && *pToken != L'\0' ) + { + // Skip leading spaces + while( *pToken == L' ' ) + ++pToken; + + if( *pToken == L'\0' ) + break; + + // Locate the end of number + pEnd = pToken; + while( IN_FLOAT_CHARSET( *pEnd ) ) + ++pEnd; + + // Copy the token to our buffer + int nTokenLen = __min( sizeof( wszToken ) / sizeof( wszToken[0] ) - 1, int( pEnd - pToken ) ); + wcscpy_s( wszToken, nTokenLen, pToken ); + *pNumbers = ( float )wcstod( wszToken, NULL ); + ++nWritten; + ++pNumbers; + pToken = pEnd; + } +} + + +void CDXUTEditBox::SetTextFloatArray( const float* pNumbers, int nCount ) +{ + WCHAR wszBuffer[512] = + { + 0 + }; + WCHAR wszTmp[64]; + + if( pNumbers == NULL ) + return; + + for( int i = 0; i < nCount; ++i ) + { + swprintf_s( wszTmp, 64, L"%.4f ", pNumbers[i] ); + wcscat_s( wszBuffer, 512, wszTmp ); + } + + // Don't want the last space + if( nCount > 0 && wcslen( wszBuffer ) > 0 ) + wszBuffer[wcslen( wszBuffer ) - 1] = 0; + + SetText( wszBuffer ); +} + + + + +//-------------------------------------------------------------------------------------- +void CUniBuffer::Initialize() +{ + if( s_hDll ) // Only need to do once + return; + + s_hDll = LoadLibrary( UNISCRIBE_DLLNAME ); + if( s_hDll ) + { + FARPROC Temp; + GETPROCADDRESS( s_hDll, ScriptApplyDigitSubstitution, Temp ); + GETPROCADDRESS( s_hDll, ScriptStringAnalyse, Temp ); + GETPROCADDRESS( s_hDll, ScriptStringCPtoX, Temp ); + GETPROCADDRESS( s_hDll, ScriptStringXtoCP, Temp ); + GETPROCADDRESS( s_hDll, ScriptStringFree, Temp ); + GETPROCADDRESS( s_hDll, ScriptString_pLogAttr, Temp ); + GETPROCADDRESS( s_hDll, ScriptString_pcOutChars, Temp ); + } +} + + +//-------------------------------------------------------------------------------------- +void CUniBuffer::Uninitialize() +{ + if( s_hDll ) + { + PLACEHOLDERPROC( ScriptApplyDigitSubstitution ); + PLACEHOLDERPROC( ScriptStringAnalyse ); + PLACEHOLDERPROC( ScriptStringCPtoX ); + PLACEHOLDERPROC( ScriptStringXtoCP ); + PLACEHOLDERPROC( ScriptStringFree ); + PLACEHOLDERPROC( ScriptString_pLogAttr ); + PLACEHOLDERPROC( ScriptString_pcOutChars ); + + FreeLibrary( s_hDll ); + s_hDll = NULL; + } +} + + +//-------------------------------------------------------------------------------------- +bool CUniBuffer::SetBufferSize( int nNewSize ) +{ + // If the current size is already the maximum allowed, + // we can't possibly allocate more. + if( m_nBufferSize == DXUT_MAX_EDITBOXLENGTH ) + return false; + + int nAllocateSize = ( nNewSize == -1 || nNewSize < m_nBufferSize * 2 ) ? ( m_nBufferSize ? m_nBufferSize * + 2 : 256 ) : nNewSize * 2; + + // Cap the buffer size at the maximum allowed. + if( nAllocateSize > DXUT_MAX_EDITBOXLENGTH ) + nAllocateSize = DXUT_MAX_EDITBOXLENGTH; + + WCHAR* pTempBuffer = new WCHAR[nAllocateSize]; + if( !pTempBuffer ) + return false; + + ZeroMemory( pTempBuffer, sizeof( WCHAR ) * nAllocateSize ); + + if( m_pwszBuffer ) + { + CopyMemory( pTempBuffer, m_pwszBuffer, m_nBufferSize * sizeof( WCHAR ) ); + delete[] m_pwszBuffer; + } + + m_pwszBuffer = pTempBuffer; + m_nBufferSize = nAllocateSize; + return true; +} + + +//-------------------------------------------------------------------------------------- +// Uniscribe -- Analyse() analyses the string in the buffer +//-------------------------------------------------------------------------------------- +HRESULT CUniBuffer::Analyse() +{ + if( m_Analysis ) + _ScriptStringFree( &m_Analysis ); + + SCRIPT_CONTROL ScriptControl; // For uniscribe + SCRIPT_STATE ScriptState; // For uniscribe + ZeroMemory( &ScriptControl, sizeof( ScriptControl ) ); + ZeroMemory( &ScriptState, sizeof( ScriptState ) ); + _ScriptApplyDigitSubstitution( NULL, &ScriptControl, &ScriptState ); + + if( !m_pFontNode ) + return E_FAIL; + + HDC hDC = + ( m_pFontNode->pFont9 ? m_pFontNode->pFont9->GetDC() : NULL ); + HRESULT hr = _ScriptStringAnalyse( hDC, + m_pwszBuffer, + lstrlenW( m_pwszBuffer ) + 1, // NULL is also analyzed. + lstrlenW( m_pwszBuffer ) * 3 / 2 + 16, + -1, + SSA_BREAK | SSA_GLYPHS | SSA_FALLBACK | SSA_LINK, + 0, + &ScriptControl, + &ScriptState, + NULL, + NULL, + NULL, + &m_Analysis ); + if( SUCCEEDED( hr ) ) + m_bAnalyseRequired = false; // Analysis is up-to-date + return hr; +} + + +//-------------------------------------------------------------------------------------- +CUniBuffer::CUniBuffer( int nInitialSize ) +{ + CUniBuffer::Initialize(); // ensure static vars are properly init'ed first + + m_nBufferSize = 0; + m_pwszBuffer = NULL; + m_bAnalyseRequired = true; + m_Analysis = NULL; + m_pFontNode = NULL; + + if( nInitialSize > 0 ) + SetBufferSize( nInitialSize ); +} + + +//-------------------------------------------------------------------------------------- +CUniBuffer::~CUniBuffer() +{ + delete[] m_pwszBuffer; + if( m_Analysis ) + _ScriptStringFree( &m_Analysis ); +} + + +//-------------------------------------------------------------------------------------- +WCHAR& CUniBuffer::operator[]( int n ) // No param checking +{ + // This version of operator[] is called only + // if we are asking for write access, so + // re-analysis is required. + m_bAnalyseRequired = true; + return m_pwszBuffer[n]; +} + + +//-------------------------------------------------------------------------------------- +void CUniBuffer::Clear() +{ + *m_pwszBuffer = L'\0'; + m_bAnalyseRequired = true; +} + + +//-------------------------------------------------------------------------------------- +// Inserts the char at specified index. +// If nIndex == -1, insert to the end. +//-------------------------------------------------------------------------------------- +bool CUniBuffer::InsertChar( int nIndex, WCHAR wChar ) +{ + assert( nIndex >= 0 ); + + if( nIndex < 0 || nIndex > lstrlenW( m_pwszBuffer ) ) + return false; // invalid index + + // Check for maximum length allowed + if( GetTextSize() + 1 >= DXUT_MAX_EDITBOXLENGTH ) + return false; + + if( lstrlenW( m_pwszBuffer ) + 1 >= m_nBufferSize ) + { + if( !SetBufferSize( -1 ) ) + return false; // out of memory + } + + assert( m_nBufferSize >= 2 ); + + // Shift the characters after the index, start by copying the null terminator + WCHAR* dest = m_pwszBuffer + lstrlenW( m_pwszBuffer ) + 1; + WCHAR* stop = m_pwszBuffer + nIndex; + WCHAR* src = dest - 1; + + while( dest > stop ) + { + *dest-- = *src--; + } + + // Set new character + m_pwszBuffer[ nIndex ] = wChar; + m_bAnalyseRequired = true; + + return true; +} + + +//-------------------------------------------------------------------------------------- +// Removes the char at specified index. +// If nIndex == -1, remove the last char. +//-------------------------------------------------------------------------------------- +bool CUniBuffer::RemoveChar( int nIndex ) +{ + if( !lstrlenW( m_pwszBuffer ) || nIndex < 0 || nIndex >= lstrlenW( m_pwszBuffer ) ) + return false; // Invalid index + + MoveMemory( m_pwszBuffer + nIndex, m_pwszBuffer + nIndex + 1, sizeof( WCHAR ) * + ( lstrlenW( m_pwszBuffer ) - nIndex ) ); + m_bAnalyseRequired = true; + return true; +} + + +//-------------------------------------------------------------------------------------- +// Inserts the first nCount characters of the string pStr at specified index. +// If nCount == -1, the entire string is inserted. +// If nIndex == -1, insert to the end. +//-------------------------------------------------------------------------------------- +bool CUniBuffer::InsertString( int nIndex, const WCHAR* pStr, int nCount ) +{ + assert( nIndex >= 0 ); + if( nIndex < 0 ) + return false; + + if( nIndex > lstrlenW( m_pwszBuffer ) ) + return false; // invalid index + + if( -1 == nCount ) + nCount = lstrlenW( pStr ); + + // Check for maximum length allowed + if( GetTextSize() + nCount >= DXUT_MAX_EDITBOXLENGTH ) + return false; + + if( lstrlenW( m_pwszBuffer ) + nCount >= m_nBufferSize ) + { + if( !SetBufferSize( lstrlenW( m_pwszBuffer ) + nCount + 1 ) ) + return false; // out of memory + } + + MoveMemory( m_pwszBuffer + nIndex + nCount, m_pwszBuffer + nIndex, sizeof( WCHAR ) * + ( lstrlenW( m_pwszBuffer ) - nIndex + 1 ) ); + CopyMemory( m_pwszBuffer + nIndex, pStr, nCount * sizeof( WCHAR ) ); + m_bAnalyseRequired = true; + + return true; +} + + +//-------------------------------------------------------------------------------------- +bool CUniBuffer::SetText( LPCWSTR wszText ) +{ + assert( wszText != NULL ); + + int nRequired = int( wcslen( wszText ) + 1 ); + + // Check for maximum length allowed + if( nRequired >= DXUT_MAX_EDITBOXLENGTH ) + return false; + + while( GetBufferSize() < nRequired ) + if( !SetBufferSize( -1 ) ) + break; + // Check again in case out of memory occurred inside while loop. + if( GetBufferSize() >= nRequired ) + { + wcscpy_s( m_pwszBuffer, GetBufferSize(), wszText ); + m_bAnalyseRequired = true; + return true; + } + else + return false; +} + + +//-------------------------------------------------------------------------------------- +HRESULT CUniBuffer::CPtoX( int nCP, BOOL bTrail, int* pX ) +{ + assert( pX ); + *pX = 0; // Default + + HRESULT hr = S_OK; + if( m_bAnalyseRequired ) + hr = Analyse(); + + if( SUCCEEDED( hr ) ) + hr = _ScriptStringCPtoX( m_Analysis, nCP, bTrail, pX ); + + return hr; +} + + +//-------------------------------------------------------------------------------------- +HRESULT CUniBuffer::XtoCP( int nX, int* pCP, int* pnTrail ) +{ + assert( pCP && pnTrail ); + *pCP = 0; *pnTrail = FALSE; // Default + + HRESULT hr = S_OK; + if( m_bAnalyseRequired ) + hr = Analyse(); + + if( SUCCEEDED( hr ) ) + hr = _ScriptStringXtoCP( m_Analysis, nX, pCP, pnTrail ); + + // If the coordinate falls outside the text region, we + // can get character positions that don't exist. We must + // filter them here and convert them to those that do exist. + if( *pCP == -1 && *pnTrail == TRUE ) + { + *pCP = 0; *pnTrail = FALSE; + } + else if( *pCP > lstrlenW( m_pwszBuffer ) && *pnTrail == FALSE ) + { + *pCP = lstrlenW( m_pwszBuffer ); *pnTrail = TRUE; + } + + return hr; +} + + +//-------------------------------------------------------------------------------------- +void CUniBuffer::GetPriorItemPos( int nCP, int* pPrior ) +{ + *pPrior = nCP; // Default is the char itself + + if( m_bAnalyseRequired ) + if( FAILED( Analyse() ) ) + return; + + const SCRIPT_LOGATTR* pLogAttr = _ScriptString_pLogAttr( m_Analysis ); + if( !pLogAttr ) + return; + + if( !_ScriptString_pcOutChars( m_Analysis ) ) + return; + int nInitial = *_ScriptString_pcOutChars( m_Analysis ); + if( nCP - 1 < nInitial ) + nInitial = nCP - 1; + for( int i = nInitial; i > 0; --i ) + if( pLogAttr[i].fWordStop || // Either the fWordStop flag is set + ( !pLogAttr[i].fWhiteSpace && // Or the previous char is whitespace but this isn't. + pLogAttr[i - 1].fWhiteSpace ) ) + { + *pPrior = i; + return; + } + // We have reached index 0. 0 is always a break point, so simply return it. + *pPrior = 0; +} + + +//-------------------------------------------------------------------------------------- +void CUniBuffer::GetNextItemPos( int nCP, int* pPrior ) +{ + *pPrior = nCP; // Default is the char itself + + HRESULT hr = S_OK; + if( m_bAnalyseRequired ) + hr = Analyse(); + if( FAILED( hr ) ) + return; + + const SCRIPT_LOGATTR* pLogAttr = _ScriptString_pLogAttr( m_Analysis ); + if( !pLogAttr ) + return; + + if( !_ScriptString_pcOutChars( m_Analysis ) ) + return; + int nInitial = *_ScriptString_pcOutChars( m_Analysis ); + if( nCP + 1 < nInitial ) + nInitial = nCP + 1; + + int i = nInitial; + int limit = *_ScriptString_pcOutChars( m_Analysis ); + while( limit > 0 && i < limit - 1 ) + { + if( pLogAttr[i].fWordStop ) // Either the fWordStop flag is set + { + *pPrior = i; + return; + } + else if( pLogAttr[i].fWhiteSpace && // Or this whitespace but the next char isn't. + !pLogAttr[i + 1].fWhiteSpace ) + { + *pPrior = i + 1; // The next char is a word stop + return; + } + + ++i; + limit = *_ScriptString_pcOutChars( m_Analysis ); + } + // We have reached the end. It's always a word stop, so simply return it. + *pPrior = *_ScriptString_pcOutChars( m_Analysis ) - 1; +} + + +//-------------------------------------------------------------------------------------- +void CDXUTEditBox::ResetCaretBlink() +{ + m_bCaretOn = true; + m_dfLastBlink = DXUTGetGlobalTimer()->GetAbsoluteTime(); +} + + +//-------------------------------------------------------------------------------------- +void DXUTBlendColor::Init( D3DCOLOR defaultColor, D3DCOLOR disabledColor, D3DCOLOR hiddenColor ) +{ + for( int i = 0; i < MAX_CONTROL_STATES; i++ ) + { + States[ i ] = defaultColor; + } + + States[ DXUT_STATE_DISABLED ] = disabledColor; + States[ DXUT_STATE_HIDDEN ] = hiddenColor; + Current = hiddenColor; +} + + +//-------------------------------------------------------------------------------------- +void DXUTBlendColor::Blend( UINT iState, float fElapsedTime, float fRate ) +{ + D3DXCOLOR destColor = States[ iState ]; + D3DXColorLerp( &Current, &Current, &destColor, 1.0f - powf( fRate, 30 * fElapsedTime ) ); +} + + + +//-------------------------------------------------------------------------------------- +void CDXUTElement::SetTexture( UINT iTexture, RECT* prcTexture, D3DCOLOR defaultTextureColor ) +{ + this->iTexture = iTexture; + + if( prcTexture ) + rcTexture = *prcTexture; + else + SetRectEmpty( &rcTexture ); + + TextureColor.Init( defaultTextureColor ); +} + + +//-------------------------------------------------------------------------------------- +void CDXUTElement::SetFont( UINT iFont, D3DCOLOR defaultFontColor, DWORD dwTextFormat ) +{ + this->iFont = iFont; + this->dwTextFormat = dwTextFormat; + + FontColor.Init( defaultFontColor ); +} + + +//-------------------------------------------------------------------------------------- +void CDXUTElement::Refresh() +{ + TextureColor.Current = TextureColor.States[ DXUT_STATE_HIDDEN ]; + FontColor.Current = FontColor.States[ DXUT_STATE_HIDDEN ]; +} + + diff --git a/Demos/DX11ClothDemo/DXUT/Optional/DXUTgui.h b/Demos/DX11ClothDemo/DXUT/Optional/DXUTgui.h new file mode 100644 index 000000000..765020b76 --- /dev/null +++ b/Demos/DX11ClothDemo/DXUT/Optional/DXUTgui.h @@ -0,0 +1,1383 @@ +//-------------------------------------------------------------------------------------- +// File: DXUTgui.h +// +// Copyright (c) Microsoft Corporation. All rights reserved. +//-------------------------------------------------------------------------------------- +#pragma once +#ifndef DXUT_GUI_H +#define DXUT_GUI_H + +#include +#include + + +//-------------------------------------------------------------------------------------- +// Defines and macros +//-------------------------------------------------------------------------------------- +#define EVENT_BUTTON_CLICKED 0x0101 +#define EVENT_COMBOBOX_SELECTION_CHANGED 0x0201 +#define EVENT_RADIOBUTTON_CHANGED 0x0301 +#define EVENT_CHECKBOX_CHANGED 0x0401 +#define EVENT_SLIDER_VALUE_CHANGED 0x0501 +#define EVENT_SLIDER_VALUE_CHANGED_UP 0x0502 + +#define EVENT_EDITBOX_STRING 0x0601 +// EVENT_EDITBOX_CHANGE is sent when the listbox content changes +// due to user input. +#define EVENT_EDITBOX_CHANGE 0x0602 +#define EVENT_LISTBOX_ITEM_DBLCLK 0x0701 +// EVENT_LISTBOX_SELECTION is fired off when the selection changes in +// a single selection list box. +#define EVENT_LISTBOX_SELECTION 0x0702 +#define EVENT_LISTBOX_SELECTION_END 0x0703 + + +//-------------------------------------------------------------------------------------- +// Forward declarations +//-------------------------------------------------------------------------------------- +class CDXUTDialogResourceManager; +class CDXUTControl; +class CDXUTButton; +class CDXUTStatic; +class CDXUTCheckBox; +class CDXUTRadioButton; +class CDXUTComboBox; +class CDXUTSlider; +class CDXUTEditBox; +class CDXUTListBox; +class CDXUTScrollBar; +class CDXUTElement; +struct DXUTElementHolder; +struct DXUTTextureNode; +struct DXUTFontNode; +typedef VOID ( CALLBACK*PCALLBACKDXUTGUIEVENT )( UINT nEvent, int nControlID, CDXUTControl* pControl, + void* pUserContext ); + + +//-------------------------------------------------------------------------------------- +// Enums for pre-defined control types +//-------------------------------------------------------------------------------------- +enum DXUT_CONTROL_TYPE +{ + DXUT_CONTROL_BUTTON, + DXUT_CONTROL_STATIC, + DXUT_CONTROL_CHECKBOX, + DXUT_CONTROL_RADIOBUTTON, + DXUT_CONTROL_COMBOBOX, + DXUT_CONTROL_SLIDER, + DXUT_CONTROL_EDITBOX, + DXUT_CONTROL_IMEEDITBOX, + DXUT_CONTROL_LISTBOX, + DXUT_CONTROL_SCROLLBAR, +}; + +enum DXUT_CONTROL_STATE +{ + DXUT_STATE_NORMAL = 0, + DXUT_STATE_DISABLED, + DXUT_STATE_HIDDEN, + DXUT_STATE_FOCUS, + DXUT_STATE_MOUSEOVER, + DXUT_STATE_PRESSED, +}; + +#define MAX_CONTROL_STATES 6 + +struct DXUTBlendColor +{ + void Init( D3DCOLOR defaultColor, D3DCOLOR disabledColor = D3DCOLOR_ARGB( 200, 128, 128, 128 ), + D3DCOLOR hiddenColor = 0 ); + void Blend( UINT iState, float fElapsedTime, float fRate = 0.7f ); + + D3DCOLOR States[ MAX_CONTROL_STATES ]; // Modulate colors for all possible control states + D3DXCOLOR Current; +}; + + +//----------------------------------------------------------------------------- +// Contains all the display tweakables for a sub-control +//----------------------------------------------------------------------------- +class CDXUTElement +{ +public: + void SetTexture( UINT iTexture, RECT* prcTexture, D3DCOLOR defaultTextureColor = D3DCOLOR_ARGB( 255, 255, 255, + 255 ) ); + void SetFont( UINT iFont, D3DCOLOR defaultFontColor = D3DCOLOR_ARGB( 255, 255, 255, + 255 ), DWORD dwTextFormat = DT_CENTER | + DT_VCENTER ); + + void Refresh(); + + UINT iTexture; // Index of the texture for this Element + UINT iFont; // Index of the font for this Element + DWORD dwTextFormat; // The format argument to DrawText + + RECT rcTexture; // Bounding rect of this element on the composite texture + + DXUTBlendColor TextureColor; + DXUTBlendColor FontColor; +}; + + +//----------------------------------------------------------------------------- +// All controls must be assigned to a dialog, which handles +// input and rendering for the controls. +//----------------------------------------------------------------------------- +class CDXUTDialog +{ + friend class CDXUTDialogResourceManager; + +public: + CDXUTDialog(); + ~CDXUTDialog(); + + // Need to call this now + void Init( CDXUTDialogResourceManager* pManager, bool bRegisterDialog = true ); + void Init( CDXUTDialogResourceManager* pManager, bool bRegisterDialog, + LPCWSTR pszControlTextureFilename ); + void Init( CDXUTDialogResourceManager* pManager, bool bRegisterDialog, + LPCWSTR szControlTextureResourceName, HMODULE hControlTextureResourceModule ); + + // Windows message handler + bool MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ); + + // Control creation + HRESULT AddStatic( int ID, LPCWSTR strText, int x, int y, int width, int height, bool bIsDefault=false, + CDXUTStatic** ppCreated=NULL ); + HRESULT AddButton( int ID, LPCWSTR strText, int x, int y, int width, int height, UINT nHotkey=0, + bool bIsDefault=false, CDXUTButton** ppCreated=NULL ); + HRESULT AddCheckBox( int ID, LPCWSTR strText, int x, int y, int width, int height, bool bChecked=false, + UINT nHotkey=0, bool bIsDefault=false, CDXUTCheckBox** ppCreated=NULL ); + HRESULT AddRadioButton( int ID, UINT nButtonGroup, LPCWSTR strText, int x, int y, int width, + int height, bool bChecked=false, UINT nHotkey=0, bool bIsDefault=false, + CDXUTRadioButton** ppCreated=NULL ); + HRESULT AddComboBox( int ID, int x, int y, int width, int height, UINT nHotKey=0, bool bIsDefault= + false, CDXUTComboBox** ppCreated=NULL ); + HRESULT AddSlider( int ID, int x, int y, int width, int height, int min=0, int max=100, int value=50, + bool bIsDefault=false, CDXUTSlider** ppCreated=NULL ); + // AddIMEEditBox has been renamed into DXUTguiIME.cpp as CDXUTIMEEditBox::CreateIMEEditBox + HRESULT AddEditBox( int ID, LPCWSTR strText, int x, int y, int width, int height, bool bIsDefault= + false, CDXUTEditBox** ppCreated=NULL ); + HRESULT AddListBox( int ID, int x, int y, int width, int height, DWORD dwStyle=0, + CDXUTListBox** ppCreated=NULL ); + HRESULT AddControl( CDXUTControl* pControl ); + HRESULT InitControl( CDXUTControl* pControl ); + + // Control retrieval + CDXUTStatic* GetStatic( int ID ) + { + return ( CDXUTStatic* )GetControl( ID, DXUT_CONTROL_STATIC ); + } + CDXUTButton* GetButton( int ID ) + { + return ( CDXUTButton* )GetControl( ID, DXUT_CONTROL_BUTTON ); + } + CDXUTCheckBox* GetCheckBox( int ID ) + { + return ( CDXUTCheckBox* )GetControl( ID, DXUT_CONTROL_CHECKBOX ); + } + CDXUTRadioButton* GetRadioButton( int ID ) + { + return ( CDXUTRadioButton* )GetControl( ID, DXUT_CONTROL_RADIOBUTTON ); + } + CDXUTComboBox* GetComboBox( int ID ) + { + return ( CDXUTComboBox* )GetControl( ID, DXUT_CONTROL_COMBOBOX ); + } + CDXUTSlider* GetSlider( int ID ) + { + return ( CDXUTSlider* )GetControl( ID, DXUT_CONTROL_SLIDER ); + } + CDXUTEditBox* GetEditBox( int ID ) + { + return ( CDXUTEditBox* )GetControl( ID, DXUT_CONTROL_EDITBOX ); + } + CDXUTListBox* GetListBox( int ID ) + { + return ( CDXUTListBox* )GetControl( ID, DXUT_CONTROL_LISTBOX ); + } + + CDXUTControl* GetControl( int ID ); + CDXUTControl* GetControl( int ID, UINT nControlType ); + CDXUTControl* GetControlAtPoint( POINT pt ); + + bool GetControlEnabled( int ID ); + void SetControlEnabled( int ID, bool bEnabled ); + + void ClearRadioButtonGroup( UINT nGroup ); + void ClearComboBox( int ID ); + + // Access the default display Elements used when adding new controls + HRESULT SetDefaultElement( UINT nControlType, UINT iElement, CDXUTElement* pElement ); + CDXUTElement* GetDefaultElement( UINT nControlType, UINT iElement ); + + // Methods called by controls + void SendEvent( UINT nEvent, bool bTriggeredByUser, CDXUTControl* pControl ); + void RequestFocus( CDXUTControl* pControl ); + + // Render helpers + HRESULT DrawRect( RECT* pRect, D3DCOLOR color ); + HRESULT DrawRect9( RECT* pRect, D3DCOLOR color ); + HRESULT DrawPolyLine( POINT* apPoints, UINT nNumPoints, D3DCOLOR color ); + HRESULT DrawSprite( CDXUTElement* pElement, RECT* prcDest, float fDepth ); + HRESULT DrawSprite9( CDXUTElement* pElement, RECT* prcDest ); + HRESULT DrawSprite11( CDXUTElement* pElement, RECT* prcDest, float fDepth ); + HRESULT CalcTextRect( LPCWSTR strText, CDXUTElement* pElement, RECT* prcDest, int nCount = -1 ); + HRESULT DrawText( LPCWSTR strText, CDXUTElement* pElement, RECT* prcDest, bool bShadow = false, + int nCount = -1, bool bCenter = false ); + HRESULT DrawText9( LPCWSTR strText, CDXUTElement* pElement, RECT* prcDest, bool bShadow = false, + int nCount = -1 ); + HRESULT DrawText11( ID3D11Device* pd3dDevice, ID3D11DeviceContext* pd3d11DeviceContext, + LPCWSTR strText, CDXUTElement* pElement, RECT* prcDest, bool bShadow = false, + int nCount = -1, bool bCenter = false ); + + // Attributes + bool GetVisible() + { + return m_bVisible; + } + void SetVisible( bool bVisible ) + { + m_bVisible = bVisible; + } + bool GetMinimized() + { + return m_bMinimized; + } + void SetMinimized( bool bMinimized ) + { + m_bMinimized = bMinimized; + } + void SetBackgroundColors( D3DCOLOR colorAllCorners ) + { + SetBackgroundColors( colorAllCorners, colorAllCorners, colorAllCorners, colorAllCorners ); + } + void SetBackgroundColors( D3DCOLOR colorTopLeft, D3DCOLOR colorTopRight, D3DCOLOR colorBottomLeft, + D3DCOLOR colorBottomRight ); + void EnableCaption( bool bEnable ) + { + m_bCaption = bEnable; + } + int GetCaptionHeight() const + { + return m_nCaptionHeight; + } + void SetCaptionHeight( int nHeight ) + { + m_nCaptionHeight = nHeight; + } + void SetCaptionText( const WCHAR* pwszText ) + { + wcscpy_s( m_wszCaption, sizeof( m_wszCaption ) / sizeof( m_wszCaption[0] ), pwszText ); + } + void GetLocation( POINT& Pt ) const + { + Pt.x = m_x; Pt.y = m_y; + } + void SetLocation( int x, int y ) + { + m_x = x; m_y = y; + } + void SetSize( int width, int height ) + { + m_width = width; m_height = height; + } + int GetWidth() + { + return m_width; + } + int GetHeight() + { + return m_height; + } + + static void WINAPI SetRefreshTime( float fTime ) + { + s_fTimeRefresh = fTime; + } + + static CDXUTControl* WINAPI GetNextControl( CDXUTControl* pControl ); + static CDXUTControl* WINAPI GetPrevControl( CDXUTControl* pControl ); + + void RemoveControl( int ID ); + void RemoveAllControls(); + + // Sets the callback used to notify the app of control events + void SetCallback( PCALLBACKDXUTGUIEVENT pCallback, void* pUserContext = NULL ); + void EnableNonUserEvents( bool bEnable ) + { + m_bNonUserEvents = bEnable; + } + void EnableKeyboardInput( bool bEnable ) + { + m_bKeyboardInput = bEnable; + } + void EnableMouseInput( bool bEnable ) + { + m_bMouseInput = bEnable; + } + bool IsKeyboardInputEnabled() const + { + return m_bKeyboardInput; + } + + // Device state notification + void Refresh(); + HRESULT OnRender( float fElapsedTime ); + + // Shared resource access. Indexed fonts and textures are shared among + // all the controls. + HRESULT SetFont( UINT index, LPCWSTR strFaceName, LONG height, LONG weight ); + DXUTFontNode* GetFont( UINT index ); + + HRESULT SetTexture( UINT index, LPCWSTR strFilename ); + HRESULT SetTexture( UINT index, LPCWSTR strResourceName, HMODULE hResourceModule ); + DXUTTextureNode* GetTexture( UINT index ); + + CDXUTDialogResourceManager* GetManager() + { + return m_pManager; + } + + static void WINAPI ClearFocus(); + void FocusDefaultControl(); + + bool m_bNonUserEvents; + bool m_bKeyboardInput; + bool m_bMouseInput; + +private: + int m_nDefaultControlID; + + HRESULT OnRender9( float fElapsedTime ); + HRESULT OnRender10( float fElapsedTime ); + HRESULT OnRender11( float fElapsedTime ); + + static double s_fTimeRefresh; + double m_fTimeLastRefresh; + + // Initialize default Elements + void InitDefaultElements(); + + // Windows message handlers + void OnMouseMove( POINT pt ); + void OnMouseUp( POINT pt ); + + void SetNextDialog( CDXUTDialog* pNextDialog ); + + // Control events + bool OnCycleFocus( bool bForward ); + + static CDXUTControl* s_pControlFocus; // The control which has focus + static CDXUTControl* s_pControlPressed; // The control currently pressed + + CDXUTControl* m_pControlMouseOver; // The control which is hovered over + + bool m_bVisible; + bool m_bCaption; + bool m_bMinimized; + bool m_bDrag; + WCHAR m_wszCaption[256]; + + int m_x; + int m_y; + int m_width; + int m_height; + int m_nCaptionHeight; + + D3DCOLOR m_colorTopLeft; + D3DCOLOR m_colorTopRight; + D3DCOLOR m_colorBottomLeft; + D3DCOLOR m_colorBottomRight; + + CDXUTDialogResourceManager* m_pManager; + PCALLBACKDXUTGUIEVENT m_pCallbackEvent; + void* m_pCallbackEventUserContext; + + CGrowableArray m_Textures; // Index into m_TextureCache; + CGrowableArray m_Fonts; // Index into m_FontCache; + + CGrowableArray m_Controls; + CGrowableArray m_DefaultElements; + + CDXUTElement m_CapElement; // Element for the caption + + CDXUTDialog* m_pNextDialog; + CDXUTDialog* m_pPrevDialog; +}; + + +//-------------------------------------------------------------------------------------- +// Structs for shared resources +//-------------------------------------------------------------------------------------- +struct DXUTTextureNode +{ + bool bFileSource; // True if this texture is loaded from a file. False if from resource. + HMODULE hResourceModule; + int nResourceID; // Resource ID. If 0, string-based ID is used and stored in strFilename. + WCHAR strFilename[MAX_PATH]; + DWORD dwWidth; + DWORD dwHeight; + IDirect3DTexture9* pTexture9; + ID3D11Texture2D* pTexture11; + ID3D11ShaderResourceView* pTexResView11; +}; + +struct DXUTFontNode +{ + WCHAR strFace[MAX_PATH]; + LONG nHeight; + LONG nWeight; + ID3DXFont* pFont9; +}; + +struct DXUTSpriteVertex +{ + D3DXVECTOR3 vPos; + D3DXCOLOR vColor; + D3DXVECTOR2 vTex; +}; + +//----------------------------------------------------------------------------- +// Manages shared resources of dialogs +//----------------------------------------------------------------------------- +class CDXUTDialogResourceManager +{ +public: + CDXUTDialogResourceManager(); + ~CDXUTDialogResourceManager(); + + bool MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ); + + // D3D9 specific + HRESULT OnD3D9CreateDevice( LPDIRECT3DDEVICE9 pd3dDevice ); + HRESULT OnD3D9ResetDevice(); + void OnD3D9LostDevice(); + void OnD3D9DestroyDevice(); + IDirect3DDevice9* GetD3D9Device() + { + return m_pd3d9Device; + } + + // D3D11 specific + HRESULT OnD3D11CreateDevice( ID3D11Device* pd3dDevice, ID3D11DeviceContext* pd3d11DeviceContext ); + HRESULT OnD3D11ResizedSwapChain( ID3D11Device* pd3dDevice, const DXGI_SURFACE_DESC* pBackBufferSurfaceDesc ); + void OnD3D11ReleasingSwapChain(); + void OnD3D11DestroyDevice(); + void StoreD3D11State( ID3D11DeviceContext* pd3dImmediateContext ); + void RestoreD3D11State( ID3D11DeviceContext* pd3dImmediateContext ); + void ApplyRenderUI11( ID3D11DeviceContext* pd3dImmediateContext ); + void ApplyRenderUIUntex11( ID3D11DeviceContext* pd3dImmediateContext ); + void BeginSprites11( ); + void EndSprites11( ID3D11Device* pd3dDevice, ID3D11DeviceContext* pd3dImmediateContext ); + ID3D11Device* GetD3D11Device() + { + return m_pd3d11Device; + } + ID3D11DeviceContext* GetD3D11DeviceContext() + { + return m_pd3d11DeviceContext; + } + + DXUTFontNode* GetFontNode( int iIndex ) + { + return m_FontCache.GetAt( iIndex ); + }; + DXUTTextureNode* GetTextureNode( int iIndex ) + { + return m_TextureCache.GetAt( iIndex ); + }; + + int AddFont( LPCWSTR strFaceName, LONG height, LONG weight ); + int AddTexture( LPCWSTR strFilename ); + int AddTexture( LPCWSTR strResourceName, HMODULE hResourceModule ); + + bool RegisterDialog( CDXUTDialog* pDialog ); + void UnregisterDialog( CDXUTDialog* pDialog ); + void EnableKeyboardInputForAllDialogs(); + + // Shared between all dialogs + + // D3D9 + IDirect3DStateBlock9* m_pStateBlock; + ID3DXSprite* m_pSprite; // Sprite used for drawing + + // D3D11 + // Shaders + ID3D11VertexShader* m_pVSRenderUI11; + ID3D11PixelShader* m_pPSRenderUI11; + ID3D11PixelShader* m_pPSRenderUIUntex11; + + // States + ID3D11DepthStencilState* m_pDepthStencilStateUI11; + ID3D11RasterizerState* m_pRasterizerStateUI11; + ID3D11BlendState* m_pBlendStateUI11; + ID3D11SamplerState* m_pSamplerStateUI11; + + // Stored states + ID3D11DepthStencilState* m_pDepthStencilStateStored11; + UINT m_StencilRefStored11; + ID3D11RasterizerState* m_pRasterizerStateStored11; + ID3D11BlendState* m_pBlendStateStored11; + float m_BlendFactorStored11[4]; + UINT m_SampleMaskStored11; + ID3D11SamplerState* m_pSamplerStateStored11; + + ID3D11InputLayout* m_pInputLayout11; + ID3D11Buffer* m_pVBScreenQuad11; + + // Sprite workaround + ID3D11Buffer* m_pSpriteBuffer11; + UINT m_SpriteBufferBytes11; + CGrowableArray m_SpriteVertices; + + UINT m_nBackBufferWidth; + UINT m_nBackBufferHeight; + + CGrowableArray m_Dialogs; // Dialogs registered + +protected: + // D3D9 specific + IDirect3DDevice9* m_pd3d9Device; + HRESULT CreateFont9( UINT index ); + HRESULT CreateTexture9( UINT index ); + + // D3D11 specific + ID3D11Device* m_pd3d11Device; + ID3D11DeviceContext* m_pd3d11DeviceContext; + HRESULT CreateFont11( UINT index ); + HRESULT CreateTexture11( UINT index ); + + CGrowableArray m_TextureCache; // Shared textures + CGrowableArray m_FontCache; // Shared fonts +}; + +void BeginText11(); +void DrawText11DXUT( ID3D11Device* pd3dDevice, ID3D11DeviceContext* pd3d11DeviceContext, + LPCWSTR strText, RECT rcScreen, D3DXCOLOR vFontColor, + float fBBWidth, float fBBHeight, bool bCenter ); +void EndText11( ID3D11Device* pd3dDevice, ID3D11DeviceContext* pd3d11DeviceContext ); + +//----------------------------------------------------------------------------- +// Base class for controls +//----------------------------------------------------------------------------- +class CDXUTControl +{ +public: + CDXUTControl( CDXUTDialog* pDialog = NULL ); + virtual ~CDXUTControl(); + + virtual HRESULT OnInit() + { + return S_OK; + } + virtual void Refresh(); + virtual void Render( float fElapsedTime ) + { + }; + + // Windows message handler + virtual bool MsgProc( UINT uMsg, WPARAM wParam, LPARAM lParam ) + { + return false; + } + + virtual bool HandleKeyboard( UINT uMsg, WPARAM wParam, LPARAM lParam ) + { + return false; + } + virtual bool HandleMouse( UINT uMsg, POINT pt, WPARAM wParam, LPARAM lParam ) + { + return false; + } + + virtual bool CanHaveFocus() + { + return false; + } + virtual void OnFocusIn() + { + m_bHasFocus = true; + } + virtual void OnFocusOut() + { + m_bHasFocus = false; + } + virtual void OnMouseEnter() + { + m_bMouseOver = true; + } + virtual void OnMouseLeave() + { + m_bMouseOver = false; + } + virtual void OnHotkey() + { + } + + virtual BOOL ContainsPoint( POINT pt ) + { + return PtInRect( &m_rcBoundingBox, pt ); + } + + virtual void SetEnabled( bool bEnabled ) + { + m_bEnabled = bEnabled; + } + virtual bool GetEnabled() + { + return m_bEnabled; + } + virtual void SetVisible( bool bVisible ) + { + m_bVisible = bVisible; + } + virtual bool GetVisible() + { + return m_bVisible; + } + + UINT GetType() const + { + return m_Type; + } + + int GetID() const + { + return m_ID; + } + void SetID( int ID ) + { + m_ID = ID; + } + + void SetLocation( int x, int y ) + { + m_x = x; m_y = y; UpdateRects(); + } + void SetSize( int width, int height ) + { + m_width = width; m_height = height; UpdateRects(); + } + + void SetHotkey( UINT nHotkey ) + { + m_nHotkey = nHotkey; + } + UINT GetHotkey() + { + return m_nHotkey; + } + + void SetUserData( void* pUserData ) + { + m_pUserData = pUserData; + } + void* GetUserData() const + { + return m_pUserData; + } + + virtual void SetTextColor( D3DCOLOR Color ); + CDXUTElement* GetElement( UINT iElement ) + { + return m_Elements.GetAt( iElement ); + } + HRESULT SetElement( UINT iElement, CDXUTElement* pElement ); + + bool m_bVisible; // Shown/hidden flag + bool m_bMouseOver; // Mouse pointer is above control + bool m_bHasFocus; // Control has input focus + bool m_bIsDefault; // Is the default control + + // Size, scale, and positioning members + int m_x, m_y; + int m_width, m_height; + + // These members are set by the container + CDXUTDialog* m_pDialog; // Parent container + UINT m_Index; // Index within the control list + + CGrowableArray m_Elements; // All display elements + +protected: + virtual void UpdateRects(); + + int m_ID; // ID number + DXUT_CONTROL_TYPE m_Type; // Control type, set once in constructor + UINT m_nHotkey; // Virtual key code for this control's hotkey + void* m_pUserData; // Data associated with this control that is set by user. + + bool m_bEnabled; // Enabled/disabled flag + + RECT m_rcBoundingBox; // Rectangle defining the active region of the control +}; + + +//----------------------------------------------------------------------------- +// Contains all the display information for a given control type +//----------------------------------------------------------------------------- +struct DXUTElementHolder +{ + UINT nControlType; + UINT iElement; + + CDXUTElement Element; +}; + + +//----------------------------------------------------------------------------- +// Static control +//----------------------------------------------------------------------------- +class CDXUTStatic : public CDXUTControl +{ +public: + CDXUTStatic( CDXUTDialog* pDialog = NULL ); + + virtual void Render( float fElapsedTime ); + virtual BOOL ContainsPoint( POINT pt ) + { + return false; + } + + HRESULT GetTextCopy( __out_ecount(bufferCount) LPWSTR strDest, + UINT bufferCount ); + LPCWSTR GetText() + { + return m_strText; + } + HRESULT SetText( LPCWSTR strText ); + + +protected: + WCHAR m_strText[MAX_PATH]; // Window text +}; + + +//----------------------------------------------------------------------------- +// Button control +//----------------------------------------------------------------------------- +class CDXUTButton : public CDXUTStatic +{ +public: + CDXUTButton( CDXUTDialog* pDialog = NULL ); + + virtual bool HandleKeyboard( UINT uMsg, WPARAM wParam, LPARAM lParam ); + virtual bool HandleMouse( UINT uMsg, POINT pt, WPARAM wParam, LPARAM lParam ); + virtual void OnHotkey() + { + if( m_pDialog->IsKeyboardInputEnabled() ) m_pDialog->RequestFocus( this ); + m_pDialog->SendEvent( EVENT_BUTTON_CLICKED, true, this ); + } + + virtual BOOL ContainsPoint( POINT pt ) + { + return PtInRect( &m_rcBoundingBox, pt ); + } + virtual bool CanHaveFocus() + { + return ( m_bVisible && m_bEnabled ); + } + + virtual void Render( float fElapsedTime ); + +protected: + bool m_bPressed; +}; + + +//----------------------------------------------------------------------------- +// CheckBox control +//----------------------------------------------------------------------------- +class CDXUTCheckBox : public CDXUTButton +{ +public: + CDXUTCheckBox( CDXUTDialog* pDialog = NULL ); + + virtual bool HandleKeyboard( UINT uMsg, WPARAM wParam, LPARAM lParam ); + virtual bool HandleMouse( UINT uMsg, POINT pt, WPARAM wParam, LPARAM lParam ); + virtual void OnHotkey() + { + if( m_pDialog->IsKeyboardInputEnabled() ) m_pDialog->RequestFocus( this ); + SetCheckedInternal( !m_bChecked, true ); + } + + virtual BOOL ContainsPoint( POINT pt ); + virtual void UpdateRects(); + + virtual void Render( float fElapsedTime ); + + bool GetChecked() + { + return m_bChecked; + } + void SetChecked( bool bChecked ) + { + SetCheckedInternal( bChecked, false ); + } + +protected: + virtual void SetCheckedInternal( bool bChecked, bool bFromInput ); + + bool m_bChecked; + RECT m_rcButton; + RECT m_rcText; +}; + + +//----------------------------------------------------------------------------- +// RadioButton control +//----------------------------------------------------------------------------- +class CDXUTRadioButton : public CDXUTCheckBox +{ +public: + CDXUTRadioButton( CDXUTDialog* pDialog = NULL ); + + virtual bool HandleKeyboard( UINT uMsg, WPARAM wParam, LPARAM lParam ); + virtual bool HandleMouse( UINT uMsg, POINT pt, WPARAM wParam, LPARAM lParam ); + virtual void OnHotkey() + { + if( m_pDialog->IsKeyboardInputEnabled() ) m_pDialog->RequestFocus( this ); + SetCheckedInternal( true, true, true ); + } + + void SetChecked( bool bChecked, bool bClearGroup=true ) + { + SetCheckedInternal( bChecked, bClearGroup, false ); + } + void SetButtonGroup( UINT nButtonGroup ) + { + m_nButtonGroup = nButtonGroup; + } + UINT GetButtonGroup() + { + return m_nButtonGroup; + } + +protected: + virtual void SetCheckedInternal( bool bChecked, bool bClearGroup, bool bFromInput ); + UINT m_nButtonGroup; +}; + + +//----------------------------------------------------------------------------- +// Scrollbar control +//----------------------------------------------------------------------------- +class CDXUTScrollBar : public CDXUTControl +{ +public: + CDXUTScrollBar( CDXUTDialog* pDialog = NULL ); + virtual ~CDXUTScrollBar(); + + virtual bool HandleKeyboard( UINT uMsg, WPARAM wParam, LPARAM lParam ); + virtual bool HandleMouse( UINT uMsg, POINT pt, WPARAM wParam, LPARAM lParam ); + virtual bool MsgProc( UINT uMsg, WPARAM wParam, LPARAM lParam ); + + virtual void Render( float fElapsedTime ); + virtual void UpdateRects(); + + void SetTrackRange( int nStart, int nEnd ); + int GetTrackPos() + { + return m_nPosition; + } + void SetTrackPos( int nPosition ) + { + m_nPosition = nPosition; Cap(); UpdateThumbRect(); + } + int GetPageSize() + { + return m_nPageSize; + } + void SetPageSize( int nPageSize ) + { + m_nPageSize = nPageSize; Cap(); UpdateThumbRect(); + } + + void Scroll( int nDelta ); // Scroll by nDelta items (plus or minus) + void ShowItem( int nIndex ); // Ensure that item nIndex is displayed, scroll if necessary + +protected: + // ARROWSTATE indicates the state of the arrow buttons. + // CLEAR No arrow is down. + // CLICKED_UP Up arrow is clicked. + // CLICKED_DOWN Down arrow is clicked. + // HELD_UP Up arrow is held down for sustained period. + // HELD_DOWN Down arrow is held down for sustained period. + enum ARROWSTATE + { + CLEAR, + CLICKED_UP, + CLICKED_DOWN, + HELD_UP, + HELD_DOWN + }; + + void UpdateThumbRect(); + void Cap(); // Clips position at boundaries. Ensures it stays within legal range. + + bool m_bShowThumb; + bool m_bDrag; + RECT m_rcUpButton; + RECT m_rcDownButton; + RECT m_rcTrack; + RECT m_rcThumb; + int m_nPosition; // Position of the first displayed item + int m_nPageSize; // How many items are displayable in one page + int m_nStart; // First item + int m_nEnd; // The index after the last item + POINT m_LastMouse;// Last mouse position + ARROWSTATE m_Arrow; // State of the arrows + double m_dArrowTS; // Timestamp of last arrow event. +}; + + +//----------------------------------------------------------------------------- +// ListBox control +//----------------------------------------------------------------------------- +struct DXUTListBoxItem +{ + WCHAR strText[256]; + void* pData; + + RECT rcActive; + bool bSelected; +}; + +class CDXUTListBox : public CDXUTControl +{ +public: + CDXUTListBox( CDXUTDialog* pDialog = NULL ); + virtual ~CDXUTListBox(); + + virtual HRESULT OnInit() + { + return m_pDialog->InitControl( &m_ScrollBar ); + } + virtual bool CanHaveFocus() + { + return ( m_bVisible && m_bEnabled ); + } + virtual bool HandleKeyboard( UINT uMsg, WPARAM wParam, LPARAM lParam ); + virtual bool HandleMouse( UINT uMsg, POINT pt, WPARAM wParam, LPARAM lParam ); + virtual bool MsgProc( UINT uMsg, WPARAM wParam, LPARAM lParam ); + + virtual void Render( float fElapsedTime ); + virtual void UpdateRects(); + + DWORD GetStyle() const + { + return m_dwStyle; + } + int GetSize() const + { + return m_Items.GetSize(); + } + void SetStyle( DWORD dwStyle ) + { + m_dwStyle = dwStyle; + } + int GetScrollBarWidth() const + { + return m_nSBWidth; + } + void SetScrollBarWidth( int nWidth ) + { + m_nSBWidth = nWidth; UpdateRects(); + } + void SetBorder( int nBorder, int nMargin ) + { + m_nBorder = nBorder; m_nMargin = nMargin; + } + HRESULT AddItem( const WCHAR* wszText, void* pData ); + HRESULT InsertItem( int nIndex, const WCHAR* wszText, void* pData ); + void RemoveItem( int nIndex ); + void RemoveAllItems(); + + DXUTListBoxItem* GetItem( int nIndex ); + int GetSelectedIndex( int nPreviousSelected = -1 ); + DXUTListBoxItem* GetSelectedItem( int nPreviousSelected = -1 ) + { + return GetItem( GetSelectedIndex( nPreviousSelected ) ); + } + void SelectItem( int nNewIndex ); + + enum STYLE + { + MULTISELECTION = 1 + }; + +protected: + RECT m_rcText; // Text rendering bound + RECT m_rcSelection; // Selection box bound + CDXUTScrollBar m_ScrollBar; + int m_nSBWidth; + int m_nBorder; + int m_nMargin; + int m_nTextHeight; // Height of a single line of text + DWORD m_dwStyle; // List box style + int m_nSelected; // Index of the selected item for single selection list box + int m_nSelStart; // Index of the item where selection starts (for handling multi-selection) + bool m_bDrag; // Whether the user is dragging the mouse to select + + CGrowableArray m_Items; +}; + + +//----------------------------------------------------------------------------- +// ComboBox control +//----------------------------------------------------------------------------- +struct DXUTComboBoxItem +{ + WCHAR strText[256]; + void* pData; + + RECT rcActive; + bool bVisible; +}; + + +class CDXUTComboBox : public CDXUTButton +{ +public: + CDXUTComboBox( CDXUTDialog* pDialog = NULL ); + virtual ~CDXUTComboBox(); + + virtual void SetTextColor( D3DCOLOR Color ); + virtual HRESULT OnInit() + { + return m_pDialog->InitControl( &m_ScrollBar ); + } + + virtual bool HandleKeyboard( UINT uMsg, WPARAM wParam, LPARAM lParam ); + virtual bool HandleMouse( UINT uMsg, POINT pt, WPARAM wParam, LPARAM lParam ); + virtual void OnHotkey(); + + virtual bool CanHaveFocus() + { + return ( m_bVisible && m_bEnabled ); + } + virtual void OnFocusOut(); + virtual void Render( float fElapsedTime ); + + virtual void UpdateRects(); + + HRESULT AddItem( const WCHAR* strText, void* pData ); + void RemoveAllItems(); + void RemoveItem( UINT index ); + bool ContainsItem( const WCHAR* strText, UINT iStart=0 ); + int FindItem( const WCHAR* strText, UINT iStart=0 ); + void* GetItemData( const WCHAR* strText ); + void* GetItemData( int nIndex ); + void SetDropHeight( UINT nHeight ) + { + m_nDropHeight = nHeight; UpdateRects(); + } + int GetScrollBarWidth() const + { + return m_nSBWidth; + } + void SetScrollBarWidth( int nWidth ) + { + m_nSBWidth = nWidth; UpdateRects(); + } + + int GetSelectedIndex() const + { + return m_iSelected; + } + void* GetSelectedData(); + DXUTComboBoxItem* GetSelectedItem(); + + UINT GetNumItems() + { + return m_Items.GetSize(); + } + DXUTComboBoxItem* GetItem( UINT index ) + { + return m_Items.GetAt( index ); + } + + HRESULT SetSelectedByIndex( UINT index ); + HRESULT SetSelectedByText( const WCHAR* strText ); + HRESULT SetSelectedByData( void* pData ); + +protected: + int m_iSelected; + int m_iFocused; + int m_nDropHeight; + CDXUTScrollBar m_ScrollBar; + int m_nSBWidth; + + bool m_bOpened; + + RECT m_rcText; + RECT m_rcButton; + RECT m_rcDropdown; + RECT m_rcDropdownText; + + + CGrowableArray m_Items; +}; + + +//----------------------------------------------------------------------------- +// Slider control +//----------------------------------------------------------------------------- +class CDXUTSlider : public CDXUTControl +{ +public: + CDXUTSlider( CDXUTDialog* pDialog = NULL ); + + virtual BOOL ContainsPoint( POINT pt ); + virtual bool CanHaveFocus() + { + return ( m_bVisible && m_bEnabled ); + } + virtual bool HandleKeyboard( UINT uMsg, WPARAM wParam, LPARAM lParam ); + virtual bool HandleMouse( UINT uMsg, POINT pt, WPARAM wParam, LPARAM lParam ); + + virtual void UpdateRects(); + + virtual void Render( float fElapsedTime ); + + void SetValue( int nValue ) + { + SetValueInternal( nValue, false ); + } + int GetValue() const + { + return m_nValue; + }; + + void GetRange( int& nMin, int& nMax ) const + { + nMin = m_nMin; nMax = m_nMax; + } + void SetRange( int nMin, int nMax ); + +protected: + void SetValueInternal( int nValue, bool bFromInput ); + int ValueFromPos( int x ); + + int m_nValue; + + int m_nMin; + int m_nMax; + + int m_nDragX; // Mouse position at start of drag + int m_nDragOffset; // Drag offset from the center of the button + int m_nButtonX; + + bool m_bPressed; + RECT m_rcButton; +}; + + +//----------------------------------------------------------------------------- +// CUniBuffer class for the edit control +//----------------------------------------------------------------------------- +class CUniBuffer +{ +public: + CUniBuffer( int nInitialSize = 1 ); + ~CUniBuffer(); + + static void WINAPI Initialize(); + static void WINAPI Uninitialize(); + + int GetBufferSize() + { + return m_nBufferSize; + } + bool SetBufferSize( int nSize ); + int GetTextSize() + { + return lstrlenW( m_pwszBuffer ); + } + const WCHAR* GetBuffer() + { + return m_pwszBuffer; + } + const WCHAR& operator[]( int n ) const + { + return m_pwszBuffer[n]; + } + WCHAR& operator[]( int n ); + DXUTFontNode* GetFontNode() + { + return m_pFontNode; + } + void SetFontNode( DXUTFontNode* pFontNode ) + { + m_pFontNode = pFontNode; + } + void Clear(); + + bool InsertChar( int nIndex, WCHAR wChar ); // Inserts the char at specified index. If nIndex == -1, insert to the end. + bool RemoveChar( int nIndex ); // Removes the char at specified index. If nIndex == -1, remove the last char. + bool InsertString( int nIndex, const WCHAR* pStr, int nCount = -1 ); // Inserts the first nCount characters of the string pStr at specified index. If nCount == -1, the entire string is inserted. If nIndex == -1, insert to the end. + bool SetText( LPCWSTR wszText ); + + // Uniscribe + HRESULT CPtoX( int nCP, BOOL bTrail, int* pX ); + HRESULT XtoCP( int nX, int* pCP, int* pnTrail ); + void GetPriorItemPos( int nCP, int* pPrior ); + void GetNextItemPos( int nCP, int* pPrior ); + +private: + HRESULT Analyse(); // Uniscribe -- Analyse() analyses the string in the buffer + + WCHAR* m_pwszBuffer; // Buffer to hold text + int m_nBufferSize; // Size of the buffer allocated, in characters + + // Uniscribe-specific + DXUTFontNode* m_pFontNode; // Font node for the font that this buffer uses + bool m_bAnalyseRequired; // True if the string has changed since last analysis. + SCRIPT_STRING_ANALYSIS m_Analysis; // Analysis for the current string + +private: + // Empty implementation of the Uniscribe API + static HRESULT WINAPI Dummy_ScriptApplyDigitSubstitution( const SCRIPT_DIGITSUBSTITUTE*, SCRIPT_CONTROL*, + SCRIPT_STATE* ) + { + return E_NOTIMPL; + } + static HRESULT WINAPI Dummy_ScriptStringAnalyse( HDC, const void*, int, int, int, DWORD, int, SCRIPT_CONTROL*, + SCRIPT_STATE*, const int*, SCRIPT_TABDEF*, const BYTE*, + SCRIPT_STRING_ANALYSIS* ) + { + return E_NOTIMPL; + } + static HRESULT WINAPI Dummy_ScriptStringCPtoX( SCRIPT_STRING_ANALYSIS, int, BOOL, int* ) + { + return E_NOTIMPL; + } + static HRESULT WINAPI Dummy_ScriptStringXtoCP( SCRIPT_STRING_ANALYSIS, int, int*, int* ) + { + return E_NOTIMPL; + } + static HRESULT WINAPI Dummy_ScriptStringFree( SCRIPT_STRING_ANALYSIS* ) + { + return E_NOTIMPL; + } + static const SCRIPT_LOGATTR* WINAPI Dummy_ScriptString_pLogAttr( SCRIPT_STRING_ANALYSIS ) + { + return NULL; + } + static const int* WINAPI Dummy_ScriptString_pcOutChars( SCRIPT_STRING_ANALYSIS ) + { + return NULL; + } + + // Function pointers + static HRESULT( WINAPI* _ScriptApplyDigitSubstitution )( const SCRIPT_DIGITSUBSTITUTE*, + SCRIPT_CONTROL*, SCRIPT_STATE* ); + static HRESULT( WINAPI* _ScriptStringAnalyse )( HDC, const void*, int, int, int, DWORD, int, + SCRIPT_CONTROL*, SCRIPT_STATE*, const int*, + SCRIPT_TABDEF*, const BYTE*, + SCRIPT_STRING_ANALYSIS* ); + static HRESULT( WINAPI* _ScriptStringCPtoX )( SCRIPT_STRING_ANALYSIS, int, BOOL, int* ); + static HRESULT( WINAPI* _ScriptStringXtoCP )( SCRIPT_STRING_ANALYSIS, int, int*, int* ); + static HRESULT( WINAPI* _ScriptStringFree )( SCRIPT_STRING_ANALYSIS* ); + static const SCRIPT_LOGATTR* ( WINAPI*_ScriptString_pLogAttr )( SCRIPT_STRING_ANALYSIS ); + static const int* ( WINAPI*_ScriptString_pcOutChars )( SCRIPT_STRING_ANALYSIS ); + + static HINSTANCE s_hDll; // Uniscribe DLL handle + +}; + +//----------------------------------------------------------------------------- +// EditBox control +//----------------------------------------------------------------------------- +class CDXUTEditBox : public CDXUTControl +{ +public: + CDXUTEditBox( CDXUTDialog* pDialog = NULL ); + virtual ~CDXUTEditBox(); + + virtual bool HandleKeyboard( UINT uMsg, WPARAM wParam, LPARAM lParam ); + virtual bool HandleMouse( UINT uMsg, POINT pt, WPARAM wParam, LPARAM lParam ); + virtual bool MsgProc( UINT uMsg, WPARAM wParam, LPARAM lParam ); + virtual void UpdateRects(); + virtual bool CanHaveFocus() + { + return ( m_bVisible && m_bEnabled ); + } + virtual void Render( float fElapsedTime ); + virtual void OnFocusIn(); + + void SetText( LPCWSTR wszText, bool bSelected = false ); + LPCWSTR GetText() + { + return m_Buffer.GetBuffer(); + } + int GetTextLength() + { + return m_Buffer.GetTextSize(); + } // Returns text length in chars excluding NULL. + HRESULT GetTextCopy( __out_ecount(bufferCount) LPWSTR strDest, + UINT bufferCount ); + void ClearText(); + virtual void SetTextColor( D3DCOLOR Color ) + { + m_TextColor = Color; + } // Text color + void SetSelectedTextColor( D3DCOLOR Color ) + { + m_SelTextColor = Color; + } // Selected text color + void SetSelectedBackColor( D3DCOLOR Color ) + { + m_SelBkColor = Color; + } // Selected background color + void SetCaretColor( D3DCOLOR Color ) + { + m_CaretColor = Color; + } // Caret color + void SetBorderWidth( int nBorder ) + { + m_nBorder = nBorder; UpdateRects(); + } // Border of the window + void SetSpacing( int nSpacing ) + { + m_nSpacing = nSpacing; UpdateRects(); + } + void ParseFloatArray( float* pNumbers, int nCount ); + void SetTextFloatArray( const float* pNumbers, int nCount ); + +protected: + void PlaceCaret( int nCP ); + void DeleteSelectionText(); + void ResetCaretBlink(); + void CopyToClipboard(); + void PasteFromClipboard(); + + CUniBuffer m_Buffer; // Buffer to hold text + int m_nBorder; // Border of the window + int m_nSpacing; // Spacing between the text and the edge of border + RECT m_rcText; // Bounding rectangle for the text + RECT m_rcRender[9]; // Convenient rectangles for rendering elements + double m_dfBlink; // Caret blink time in milliseconds + double m_dfLastBlink; // Last timestamp of caret blink + bool m_bCaretOn; // Flag to indicate whether caret is currently visible + int m_nCaret; // Caret position, in characters + bool m_bInsertMode; // If true, control is in insert mode. Else, overwrite mode. + int m_nSelStart; // Starting position of the selection. The caret marks the end. + int m_nFirstVisible;// First visible character in the edit control + D3DCOLOR m_TextColor; // Text color + D3DCOLOR m_SelTextColor; // Selected text color + D3DCOLOR m_SelBkColor; // Selected background color + D3DCOLOR m_CaretColor; // Caret color + + // Mouse-specific + bool m_bMouseDrag; // True to indicate drag in progress + + // Static + static bool s_bHideCaret; // If true, we don't render the caret. +}; + + + + +#endif // DXUT_GUI_H diff --git a/Demos/DX11ClothDemo/DXUT/Optional/DXUTguiIME.cpp b/Demos/DX11ClothDemo/DXUT/Optional/DXUTguiIME.cpp new file mode 100644 index 000000000..119617955 --- /dev/null +++ b/Demos/DX11ClothDemo/DXUT/Optional/DXUTguiIME.cpp @@ -0,0 +1,990 @@ +//-------------------------------------------------------------------------------------- +// File: DXUTguiIME.cpp +// +// Copyright (c) Microsoft Corporation. All rights reserved. +//-------------------------------------------------------------------------------------- +#include "DXUT.h" +#include "DXUTgui.h" +#include "DXUTsettingsDlg.h" +#include "DXUTres.h" +#include "DXUTgui.h" +#include "DXUTguiIME.h" + +#undef min // use __min instead +#undef max // use __max instead +#define DXUT_NEAR_BUTTON_DEPTH 0.6f + + +//-------------------------------------------------------------------------------------- +// CDXUTIMEEditBox class +//-------------------------------------------------------------------------------------- +// IME constants + +POINT CDXUTIMEEditBox::s_ptCompString; // Composition string position. Updated every frame. +int CDXUTIMEEditBox::s_nFirstTargetConv; // Index of the first target converted char in comp string. If none, -1. +CUniBuffer CDXUTIMEEditBox::s_CompString = CUniBuffer( 0 ); +DWORD CDXUTIMEEditBox::s_adwCompStringClause[MAX_COMPSTRING_SIZE]; +WCHAR CDXUTIMEEditBox::s_wszReadingString[32]; +CDXUTIMEEditBox::CCandList CDXUTIMEEditBox::s_CandList; // Data relevant to the candidate list +bool CDXUTIMEEditBox::s_bImeFlag = true; + + +#if defined(DEBUG) || defined(_DEBUG) +bool CDXUTIMEEditBox::m_bIMEStaticMsgProcCalled = false; +#endif + + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTIMEEditBox::CreateIMEEditBox( CDXUTDialog* pDialog, int ID, LPCWSTR strText, int x, int y, int width, + int height, bool bIsDefault, CDXUTIMEEditBox** ppCreated ) +{ + CDXUTIMEEditBox* pEditBox = new CDXUTIMEEditBox( pDialog ); + + if( ppCreated != NULL ) + *ppCreated = pEditBox; + + if( pEditBox == NULL ) + return E_OUTOFMEMORY; + + // Set the ID and position + pEditBox->SetID( ID ); + pEditBox->SetLocation( x, y ); + pEditBox->SetSize( width, height ); + pEditBox->m_bIsDefault = bIsDefault; + + if( strText ) + pEditBox->SetText( strText ); + + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +void CDXUTIMEEditBox::InitDefaultElements( CDXUTDialog* pDialog ) +{ + //------------------------------------- + // CDXUTIMEEditBox + //------------------------------------- + + CDXUTElement Element; + RECT rcTexture; + + Element.SetFont( 0, D3DCOLOR_ARGB( 255, 0, 0, 0 ), DT_LEFT | DT_TOP ); + + // Assign the style + SetRect( &rcTexture, 14, 90, 241, 113 ); + Element.SetTexture( 0, &rcTexture ); + pDialog->SetDefaultElement( DXUT_CONTROL_IMEEDITBOX, 0, &Element ); + SetRect( &rcTexture, 8, 82, 14, 90 ); + Element.SetTexture( 0, &rcTexture ); + pDialog->SetDefaultElement( DXUT_CONTROL_IMEEDITBOX, 1, &Element ); + SetRect( &rcTexture, 14, 82, 241, 90 ); + Element.SetTexture( 0, &rcTexture ); + pDialog->SetDefaultElement( DXUT_CONTROL_IMEEDITBOX, 2, &Element ); + SetRect( &rcTexture, 241, 82, 246, 90 ); + Element.SetTexture( 0, &rcTexture ); + pDialog->SetDefaultElement( DXUT_CONTROL_IMEEDITBOX, 3, &Element ); + SetRect( &rcTexture, 8, 90, 14, 113 ); + Element.SetTexture( 0, &rcTexture ); + pDialog->SetDefaultElement( DXUT_CONTROL_IMEEDITBOX, 4, &Element ); + SetRect( &rcTexture, 241, 90, 246, 113 ); + Element.SetTexture( 0, &rcTexture ); + pDialog->SetDefaultElement( DXUT_CONTROL_IMEEDITBOX, 5, &Element ); + SetRect( &rcTexture, 8, 113, 14, 121 ); + Element.SetTexture( 0, &rcTexture ); + pDialog->SetDefaultElement( DXUT_CONTROL_IMEEDITBOX, 6, &Element ); + SetRect( &rcTexture, 14, 113, 241, 121 ); + Element.SetTexture( 0, &rcTexture ); + pDialog->SetDefaultElement( DXUT_CONTROL_IMEEDITBOX, 7, &Element ); + SetRect( &rcTexture, 241, 113, 246, 121 ); + Element.SetTexture( 0, &rcTexture ); + pDialog->SetDefaultElement( DXUT_CONTROL_IMEEDITBOX, 8, &Element ); + // Element 9 for IME text, and indicator button + SetRect( &rcTexture, 0, 0, 136, 54 ); + Element.SetTexture( 0, &rcTexture ); + Element.SetFont( 0, D3DCOLOR_ARGB( 255, 0, 0, 0 ), DT_CENTER | DT_VCENTER ); + pDialog->SetDefaultElement( DXUT_CONTROL_IMEEDITBOX, 9, &Element ); +} + + +//-------------------------------------------------------------------------------------- +CDXUTIMEEditBox::CDXUTIMEEditBox( CDXUTDialog* pDialog ) +{ + m_Type = DXUT_CONTROL_IMEEDITBOX; + m_pDialog = pDialog; + + m_nIndicatorWidth = 0; + m_ReadingColor = D3DCOLOR_ARGB( 188, 255, 255, 255 ); + m_ReadingWinColor = D3DCOLOR_ARGB( 128, 0, 0, 0 ); + m_ReadingSelColor = D3DCOLOR_ARGB( 255, 255, 0, 0 ); + m_ReadingSelBkColor = D3DCOLOR_ARGB( 128, 80, 80, 80 ); + m_CandidateColor = D3DCOLOR_ARGB( 255, 200, 200, 200 ); + m_CandidateWinColor = D3DCOLOR_ARGB( 128, 0, 0, 0 ); + m_CandidateSelColor = D3DCOLOR_ARGB( 255, 255, 255, 255 ); + m_CandidateSelBkColor = D3DCOLOR_ARGB( 128, 158, 158, 158 ); + m_CompColor = D3DCOLOR_ARGB( 255, 200, 200, 255 ); + m_CompWinColor = D3DCOLOR_ARGB( 198, 0, 0, 0 ); + m_CompCaretColor = D3DCOLOR_ARGB( 255, 255, 255, 255 ); + m_CompTargetColor = D3DCOLOR_ARGB( 255, 255, 255, 255 ); + m_CompTargetBkColor = D3DCOLOR_ARGB( 255, 150, 150, 150 ); + m_CompTargetNonColor = D3DCOLOR_ARGB( 255, 255, 255, 0 ); + m_CompTargetNonBkColor = D3DCOLOR_ARGB( 255, 150, 150, 150 ); + m_IndicatorImeColor = D3DCOLOR_ARGB( 255, 255, 255, 255 ); + m_IndicatorEngColor = D3DCOLOR_ARGB( 255, 0, 0, 0 ); + m_IndicatorBkColor = D3DCOLOR_ARGB( 255, 128, 128, 128 ); +} + + +//-------------------------------------------------------------------------------------- +CDXUTIMEEditBox::~CDXUTIMEEditBox() +{ +} + + +//-------------------------------------------------------------------------------------- +void CDXUTIMEEditBox::SendKey( BYTE nVirtKey ) +{ + keybd_event( nVirtKey, 0, 0, 0 ); + keybd_event( nVirtKey, 0, KEYEVENTF_KEYUP, 0 ); +} + + +//-------------------------------------------------------------------------------------- +void CDXUTIMEEditBox::UpdateRects() +{ + // Temporary adjust m_width so that CDXUTEditBox can compute + // the correct rects for its rendering since we need to make space + // for the indicator button + int nWidth = m_width; + m_width -= m_nIndicatorWidth + m_nBorder * 2; // Make room for the indicator button + CDXUTEditBox::UpdateRects(); + m_width = nWidth; // Restore + + // Compute the indicator button rectangle + SetRect( &m_rcIndicator, m_rcBoundingBox.right, m_rcBoundingBox.top, m_x + m_width, m_rcBoundingBox.bottom ); + // InflateRect( &m_rcIndicator, -m_nBorder, -m_nBorder ); + m_rcBoundingBox.right = m_rcBoundingBox.left + m_width; +} + + +//-------------------------------------------------------------------------------------- +// GetImeId( UINT uIndex ) +// returns +// returned value: +// 0: In the following cases +// - Non Chinese IME input locale +// - Older Chinese IME +// - Other error cases +// +// Othewise: +// When uIndex is 0 (default) +// bit 31-24: Major version +// bit 23-16: Minor version +// bit 15-0: Language ID +// When uIndex is 1 +// pVerFixedInfo->dwFileVersionLS +// +// Use IMEID_VER and IMEID_LANG macro to extract version and language information. +// + +// We define the locale-invariant ID ourselves since it doesn't exist prior to WinXP +// For more information, see the CompareString() reference. +#define LCID_INVARIANT MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT) +//-------------------------------------------------------------------------------------- +// Enable/disable the entire IME system. When disabled, the default IME handling +// kicks in. +void CDXUTIMEEditBox::EnableImeSystem( bool bEnable ) +{ + ImeUi_EnableIme( bEnable ); +} + + +//-------------------------------------------------------------------------------------- +// Resets the composition string. +void CDXUTIMEEditBox::ResetCompositionString() +{ + s_CompString.SetText( L"" ); +} + + +//-------------------------------------------------------------------------------------- +// This function is used only briefly in CHT IME handling, +// so accelerator isn't processed. +void CDXUTIMEEditBox::PumpMessage() +{ + MSG msg; + + while( PeekMessageW( &msg, NULL, 0, 0, PM_NOREMOVE ) ) + { + if( !GetMessageW( &msg, NULL, 0, 0 ) ) + { + PostQuitMessage( ( int )msg.wParam ); + return; + } + TranslateMessage( &msg ); + DispatchMessageA( &msg ); + } +} + + +//-------------------------------------------------------------------------------------- +void CDXUTIMEEditBox::OnFocusIn() +{ + ImeUi_EnableIme( s_bImeFlag ); + CDXUTEditBox::OnFocusIn(); +} + + +//-------------------------------------------------------------------------------------- +void CDXUTIMEEditBox::OnFocusOut() +{ + ImeUi_FinalizeString(); + ImeUi_EnableIme( false ); + CDXUTEditBox::OnFocusOut(); +} + + +//-------------------------------------------------------------------------------------- +bool CDXUTIMEEditBox::StaticMsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) +{ + + if( !ImeUi_IsEnabled() ) + return false; + +#if defined(DEBUG) || defined(_DEBUG) + m_bIMEStaticMsgProcCalled = true; +#endif + + switch( uMsg ) + { + case WM_INPUTLANGCHANGE: + DXUTTRACE( L"WM_INPUTLANGCHANGE\n" ); + { + } + return true; + + case WM_IME_SETCONTEXT: + DXUTTRACE( L"WM_IME_SETCONTEXT\n" ); + // + // We don't want anything to display, so we have to clear this + // + lParam = 0; + return false; + + // Handle WM_IME_STARTCOMPOSITION here since + // we do not want the default IME handler to see + // this when our fullscreen app is running. + case WM_IME_STARTCOMPOSITION: + DXUTTRACE( L"WM_IME_STARTCOMPOSITION\n" ); + ResetCompositionString(); + // Since the composition string has its own caret, we don't render + // the edit control's own caret to avoid double carets on screen. + s_bHideCaret = true; + return true; + case WM_IME_ENDCOMPOSITION: + DXUTTRACE( L"WM_IME_ENDCOMPOSITION\n" ); + s_bHideCaret = false; + return false; + case WM_IME_COMPOSITION: + DXUTTRACE( L"WM_IME_COMPOSITION\n" ); + return false; + } + + return false; +} + + +//-------------------------------------------------------------------------------------- +bool CDXUTIMEEditBox::HandleMouse( UINT uMsg, POINT pt, WPARAM wParam, LPARAM lParam ) +{ + if( !m_bEnabled || !m_bVisible ) + return false; + + switch( uMsg ) + { + case WM_LBUTTONDOWN: + case WM_LBUTTONDBLCLK: + { + DXUTFontNode* pFont = m_pDialog->GetFont( m_Elements.GetAt( 9 )->iFont ); + + // Check if this click is on top of the composition string + int nCompStrWidth; + s_CompString.CPtoX( s_CompString.GetTextSize(), FALSE, &nCompStrWidth ); + + if( s_ptCompString.x <= pt.x && + s_ptCompString.y <= pt.y && + s_ptCompString.x + nCompStrWidth > pt.x && + s_ptCompString.y + pFont->nHeight > pt.y ) + { + int nCharBodyHit, nCharHit; + int nTrail; + + // Determine the character clicked on. + s_CompString.XtoCP( pt.x - s_ptCompString.x, &nCharBodyHit, &nTrail ); + if( nTrail && nCharBodyHit < s_CompString.GetTextSize() ) + nCharHit = nCharBodyHit + 1; + else + nCharHit = nCharBodyHit; + + + switch( GetPrimaryLanguage() ) + { + case LANG_JAPANESE: + // For Japanese, there are two cases. If s_nFirstTargetConv is + // -1, the comp string hasn't been converted yet, and we use + // s_nCompCaret. For any other value of s_nFirstTargetConv, + // the string has been converted, so we use clause information. + + if( s_nFirstTargetConv != -1 ) + { + int nClauseClicked = 0; + while( ( int )s_adwCompStringClause[nClauseClicked + 1] <= nCharBodyHit ) + ++nClauseClicked; + + int nClauseSelected = 0; + while( ( int )s_adwCompStringClause[nClauseSelected + 1] <= s_nFirstTargetConv ) + ++nClauseSelected; + + BYTE nVirtKey = nClauseClicked > nClauseSelected ? VK_RIGHT : VK_LEFT; + int nSendCount = abs( nClauseClicked - nClauseSelected ); + while( nSendCount-- > 0 ) + SendKey( nVirtKey ); + + return true; + } + + // Not converted case. Fall thru to Chinese case. + + case LANG_CHINESE: + { + // For Chinese, use s_nCompCaret. + BYTE nVirtKey = nCharHit > ( int )ImeUi_GetImeCursorChars() ? VK_RIGHT : VK_LEFT; + int nSendCount = abs( nCharHit - ( int )ImeUi_GetImeCursorChars() ); + while( nSendCount-- > 0 ) + SendKey( nVirtKey ); + break; + } + } + + return true; + } + + // Check if the click is on top of the candidate window + if( ImeUi_IsShowCandListWindow() && PtInRect( &s_CandList.rcCandidate, pt ) ) + { + if( ImeUi_IsVerticalCand() ) + { + // Vertical candidate window + + // Compute the row the click is on + int nRow = ( pt.y - s_CandList.rcCandidate.top ) / pFont->nHeight; + + if( nRow < ( int )ImeUi_GetCandidateCount() ) + { + // nRow is a valid entry. + // Now emulate keystrokes to select the candidate at this row. + switch( GetPrimaryLanguage() ) + { + case LANG_CHINESE: + case LANG_KOREAN: + // For Chinese and Korean, simply send the number keystroke. + SendKey( ( BYTE )( '0' + nRow + 1 ) ); + break; + + case LANG_JAPANESE: + // For Japanese, move the selection to the target row, + // then send Right, then send Left. + + BYTE nVirtKey; + if( nRow > ( int )ImeUi_GetCandidateSelection() ) + nVirtKey = VK_DOWN; + else + nVirtKey = VK_UP; + int nNumToHit = abs( int( nRow - ImeUi_GetCandidateSelection() ) ); + for( int nStrike = 0; nStrike < nNumToHit; ++nStrike ) + SendKey( nVirtKey ); + + // Do this to close the candidate window without ending composition. + SendKey( VK_RIGHT ); + SendKey( VK_LEFT ); + + break; + } + } + } + else + { + // Horizontal candidate window + + // Determine which the character the click has hit. + int nCharHit; + int nTrail; + s_CandList.HoriCand.XtoCP( pt.x - s_CandList.rcCandidate.left, &nCharHit, &nTrail ); + + // Determine which candidate string the character belongs to. + int nCandidate = ImeUi_GetCandidateCount() - 1; + + int nEntryStart = 0; + for( UINT i = 0; i < ImeUi_GetCandidateCount(); ++i ) + { + if( nCharHit >= nEntryStart ) + { + // Haven't found it. + nEntryStart += lstrlenW( ImeUi_GetCandidate( i ) ) + 1; // plus space separator + } + else + { + // Found it. This entry starts at the right side of the click point, + // so the char belongs to the previous entry. + nCandidate = i - 1; + break; + } + } + + // Now emulate keystrokes to select the candidate entry. + switch( GetPrimaryLanguage() ) + { + case LANG_CHINESE: + case LANG_KOREAN: + // For Chinese and Korean, simply send the number keystroke. + SendKey( ( BYTE )( '0' + nCandidate + 1 ) ); + break; + } + } + + return true; + } + } + } + + // If we didn't care for the msg, let the parent process it. + return CDXUTEditBox::HandleMouse( uMsg, pt, wParam, lParam ); +} + + +//-------------------------------------------------------------------------------------- +bool CDXUTIMEEditBox::MsgProc( UINT uMsg, WPARAM wParam, LPARAM lParam ) +{ + if( !m_bEnabled || !m_bVisible ) + return false; + +#if defined(DEBUG) || defined(_DEBUG) + // DXUT.cpp used to call CDXUTIMEEditBox::StaticMsgProc() so that, but now + // this is the application's responsiblity. To do this, call + // CDXUTDialogResourceManager::MsgProc() before calling this function. + assert( m_bIMEStaticMsgProcCalled && L"To fix, call CDXUTDialogResourceManager::MsgProc() first" ); +#endif + switch( uMsg ) + { + case WM_DESTROY: + ImeUi_Uninitialize(); + break; + } + + bool trappedData; + bool* trapped = &trappedData; + + *trapped = false; + if( !ImeUi_IsEnabled() ) + return CDXUTEditBox::MsgProc( uMsg, wParam, lParam ); + + ImeUi_ProcessMessage( DXUTGetHWND(), uMsg, wParam, lParam, trapped ); + if( *trapped == false ) + CDXUTEditBox::MsgProc( uMsg, wParam, lParam ); + + return *trapped; +} + + +//-------------------------------------------------------------------------------------- +void CDXUTIMEEditBox::RenderCandidateReadingWindow( float fElapsedTime, bool bReading ) +{ + RECT rc; + UINT nNumEntries = bReading ? 4 : MAX_CANDLIST; + D3DCOLOR TextColor, TextBkColor, SelTextColor, SelBkColor; + int nX, nXFirst, nXComp; + m_Buffer.CPtoX( m_nCaret, FALSE, &nX ); + m_Buffer.CPtoX( m_nFirstVisible, FALSE, &nXFirst ); + + if( bReading ) + { + TextColor = m_ReadingColor; + TextBkColor = m_ReadingWinColor; + SelTextColor = m_ReadingSelColor; + SelBkColor = m_ReadingSelBkColor; + } + else + { + TextColor = m_CandidateColor; + TextBkColor = m_CandidateWinColor; + SelTextColor = m_CandidateSelColor; + SelBkColor = m_CandidateSelBkColor; + } + + // For Japanese IME, align the window with the first target converted character. + // For all other IMEs, align with the caret. This is because the caret + // does not move for Japanese IME. + if( GetLanguage() == MAKELANGID( LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL ) && !GetImeId() ) + nXComp = 0; + else if( GetPrimaryLanguage() == LANG_JAPANESE ) + s_CompString.CPtoX( s_nFirstTargetConv, FALSE, &nXComp ); + else + s_CompString.CPtoX( ImeUi_GetImeCursorChars(), FALSE, &nXComp ); + + // Compute the size of the candidate window + int nWidthRequired = 0; + int nHeightRequired = 0; + int nSingleLineHeight = 0; + + if( ( ImeUi_IsVerticalCand() && !bReading ) || + ( !ImeUi_IsHorizontalReading() && bReading ) ) + { + // Vertical window + for( UINT i = 0; i < nNumEntries; ++i ) + { + if( *( ImeUi_GetCandidate( i ) ) == L'\0' ) + break; + SetRect( &rc, 0, 0, 0, 0 ); + m_pDialog->CalcTextRect( ImeUi_GetCandidate( i ), m_Elements.GetAt( 1 ), &rc ); + nWidthRequired = __max( nWidthRequired, rc.right - rc.left ); + nSingleLineHeight = __max( nSingleLineHeight, rc.bottom - rc.top ); + } + nHeightRequired = nSingleLineHeight * nNumEntries; + } + else + { + // Horizontal window + SetRect( &rc, 0, 0, 0, 0 ); + if( bReading ) + m_pDialog->CalcTextRect( s_wszReadingString, m_Elements.GetAt( 1 ), &rc ); + else + { + + WCHAR wszCand[256] = L""; + + s_CandList.nFirstSelected = 0; + s_CandList.nHoriSelectedLen = 0; + for( UINT i = 0; i < MAX_CANDLIST; ++i ) + { + if( *ImeUi_GetCandidate( i ) == L'\0' ) + break; + + WCHAR wszEntry[32]; + swprintf_s( wszEntry, 32, L"%s ", ImeUi_GetCandidate( i ) ); + // If this is the selected entry, mark its char position. + if( ImeUi_GetCandidateSelection() == i ) + { + s_CandList.nFirstSelected = lstrlen( wszCand ); + s_CandList.nHoriSelectedLen = lstrlen( wszEntry ) - 1; // Minus space + } + wcscat_s( wszCand, 256, wszEntry ); + } + wszCand[lstrlen( wszCand ) - 1] = L'\0'; // Remove the last space + s_CandList.HoriCand.SetText( wszCand ); + + m_pDialog->CalcTextRect( s_CandList.HoriCand.GetBuffer(), m_Elements.GetAt( 1 ), &rc ); + } + nWidthRequired = rc.right - rc.left; + nSingleLineHeight = nHeightRequired = rc.bottom - rc.top; + } + + // Now that we have the dimension, calculate the location for the candidate window. + // We attempt to fit the window in this order: + // bottom, top, right, left. + + bool bHasPosition = false; + + // Bottom + SetRect( &rc, s_ptCompString.x + nXComp, s_ptCompString.y + m_rcText.bottom - m_rcText.top, + s_ptCompString.x + nXComp + nWidthRequired, s_ptCompString.y + m_rcText.bottom - m_rcText.top + + nHeightRequired ); + // if the right edge is cut off, move it left. + if( rc.right > m_pDialog->GetWidth() ) + { + rc.left -= rc.right - m_pDialog->GetWidth(); + rc.right = m_pDialog->GetWidth(); + } + if( rc.bottom <= m_pDialog->GetHeight() ) + bHasPosition = true; + + // Top + if( !bHasPosition ) + { + SetRect( &rc, s_ptCompString.x + nXComp, s_ptCompString.y - nHeightRequired, + s_ptCompString.x + nXComp + nWidthRequired, s_ptCompString.y ); + // if the right edge is cut off, move it left. + if( rc.right > m_pDialog->GetWidth() ) + { + rc.left -= rc.right - m_pDialog->GetWidth(); + rc.right = m_pDialog->GetWidth(); + } + if( rc.top >= 0 ) + bHasPosition = true; + } + + // Right + if( !bHasPosition ) + { + int nXCompTrail; + s_CompString.CPtoX( ImeUi_GetImeCursorChars(), TRUE, &nXCompTrail ); + SetRect( &rc, s_ptCompString.x + nXCompTrail, 0, + s_ptCompString.x + nXCompTrail + nWidthRequired, nHeightRequired ); + if( rc.right <= m_pDialog->GetWidth() ) + bHasPosition = true; + } + + // Left + if( !bHasPosition ) + { + SetRect( &rc, s_ptCompString.x + nXComp - nWidthRequired, 0, + s_ptCompString.x + nXComp, nHeightRequired ); + if( rc.right >= 0 ) + bHasPosition = true; + } + + if( !bHasPosition ) + { + // The dialog is too small for the candidate window. + // Fall back to render at 0, 0. Some part of the window + // will be cut off. + rc.left = 0; + rc.right = nWidthRequired; + } + + // If we are rendering the candidate window, save the position + // so that mouse clicks are checked properly. + if( !bReading ) + s_CandList.rcCandidate = rc; + + // Render the elements + m_pDialog->DrawRect( &rc, TextBkColor ); + if( ( ImeUi_IsVerticalCand() && !bReading ) || + ( !ImeUi_IsHorizontalReading() && bReading ) ) + { + // Vertical candidate window + for( UINT i = 0; i < nNumEntries; ++i ) + { + // Here we are rendering one line at a time + rc.bottom = rc.top + nSingleLineHeight; + // Use a different color for the selected string + if( ImeUi_GetCandidateSelection() == i ) + { + m_pDialog->DrawRect( &rc, SelBkColor ); + m_Elements.GetAt( 1 )->FontColor.Current = SelTextColor; + } + else + m_Elements.GetAt( 1 )->FontColor.Current = TextColor; + + m_pDialog->DrawText( ImeUi_GetCandidate( i ), m_Elements.GetAt( 1 ), &rc ); + + rc.top += nSingleLineHeight; + } + } + else + { + // Horizontal candidate window + m_Elements.GetAt( 1 )->FontColor.Current = TextColor; + if( bReading ) + m_pDialog->DrawText( s_wszReadingString, m_Elements.GetAt( 1 ), &rc ); + else + m_pDialog->DrawText( s_CandList.HoriCand.GetBuffer(), m_Elements.GetAt( 1 ), &rc ); + + // Render the selected entry differently + if( !bReading ) + { + int nXLeft, nXRight; + s_CandList.HoriCand.CPtoX( s_CandList.nFirstSelected, FALSE, &nXLeft ); + s_CandList.HoriCand.CPtoX( s_CandList.nFirstSelected + s_CandList.nHoriSelectedLen, FALSE, &nXRight ); + + rc.right = rc.left + nXRight; + rc.left += nXLeft; + m_pDialog->DrawRect( &rc, SelBkColor ); + m_Elements.GetAt( 1 )->FontColor.Current = SelTextColor; + m_pDialog->DrawText( s_CandList.HoriCand.GetBuffer() + s_CandList.nFirstSelected, + m_Elements.GetAt( 1 ), &rc, false, s_CandList.nHoriSelectedLen ); + } + } +} + + +//-------------------------------------------------------------------------------------- +void CDXUTIMEEditBox::RenderComposition( float fElapsedTime ) +{ + + s_CompString.SetText( ImeUi_GetCompositionString() ); + + RECT rcCaret = + { + 0, 0, 0, 0 + }; + int nX, nXFirst; + m_Buffer.CPtoX( m_nCaret, FALSE, &nX ); + m_Buffer.CPtoX( m_nFirstVisible, FALSE, &nXFirst ); + CDXUTElement* pElement = m_Elements.GetAt( 1 ); + + // Get the required width + RECT rc = + { + m_rcText.left + nX - nXFirst, m_rcText.top, + m_rcText.left + nX - nXFirst, m_rcText.bottom + }; + m_pDialog->CalcTextRect( s_CompString.GetBuffer(), pElement, &rc ); + + // If the composition string is too long to fit within + // the text area, move it to below the current line. + // This matches the behavior of the default IME. + if( rc.right > m_rcText.right ) + OffsetRect( &rc, m_rcText.left - rc.left, rc.bottom - rc.top ); + + // Save the rectangle position for processing highlighted text. + RECT rcFirst = rc; + + // Update s_ptCompString for RenderCandidateReadingWindow(). + s_ptCompString.x = rc.left; s_ptCompString.y = rc.top; + + + D3DCOLOR TextColor = m_CompColor; + // Render the window and string. + // If the string is too long, we must wrap the line. + pElement->FontColor.Current = TextColor; + const WCHAR* pwszComp = s_CompString.GetBuffer(); + int nCharLeft = s_CompString.GetTextSize(); + for(; ; ) + { + // Find the last character that can be drawn on the same line. + int nLastInLine; + int bTrail; + s_CompString.XtoCP( m_rcText.right - rc.left, &nLastInLine, &bTrail ); + int nNumCharToDraw = __min( nCharLeft, nLastInLine ); + m_pDialog->CalcTextRect( pwszComp, pElement, &rc, nNumCharToDraw ); + + // Draw the background + // For Korean IME, blink the composition window background as if it + // is a cursor. + if( GetPrimaryLanguage() == LANG_KOREAN ) + { + if( m_bCaretOn ) + { + m_pDialog->DrawRect( &rc, m_CompWinColor ); + } + else + { + // Not drawing composition string background. We + // use the editbox's text color for composition + // string text. + TextColor = m_Elements.GetAt( 0 )->FontColor.States[DXUT_STATE_NORMAL]; + } + } + else + { + // Non-Korean IME. Always draw composition background. + m_pDialog->DrawRect( &rc, m_CompWinColor ); + } + + // Draw the text + pElement->FontColor.Current = TextColor; + m_pDialog->DrawText( pwszComp, pElement, &rc, false, nNumCharToDraw ); + + // Advance pointer and counter + nCharLeft -= nNumCharToDraw; + pwszComp += nNumCharToDraw; + if( nCharLeft <= 0 ) + break; + + // Advance rectangle coordinates to beginning of next line + OffsetRect( &rc, m_rcText.left - rc.left, rc.bottom - rc.top ); + } + + // Load the rect for the first line again. + rc = rcFirst; + + // Inspect each character in the comp string. + // For target-converted and target-non-converted characters, + // we display a different background color so they appear highlighted. + int nCharFirst = 0; + nXFirst = 0; + s_nFirstTargetConv = -1; + BYTE* pAttr; + const WCHAR* pcComp; + for( pcComp = s_CompString.GetBuffer(), pAttr = ImeUi_GetCompStringAttr(); + *pcComp != L'\0'; ++pcComp, ++pAttr ) + { + D3DCOLOR bkColor; + + // Render a different background for this character + int nXLeft, nXRight; + s_CompString.CPtoX( int( pcComp - s_CompString.GetBuffer() ), FALSE, &nXLeft ); + s_CompString.CPtoX( int( pcComp - s_CompString.GetBuffer() ), TRUE, &nXRight ); + + // Check if this character is off the right edge and should + // be wrapped to the next line. + if( nXRight - nXFirst > m_rcText.right - rc.left ) + { + // Advance rectangle coordinates to beginning of next line + OffsetRect( &rc, m_rcText.left - rc.left, rc.bottom - rc.top ); + + // Update the line's first character information + nCharFirst = int( pcComp - s_CompString.GetBuffer() ); + s_CompString.CPtoX( nCharFirst, FALSE, &nXFirst ); + } + + // If the caret is on this character, save the coordinates + // for drawing the caret later. + if( ImeUi_GetImeCursorChars() == ( DWORD )( pcComp - s_CompString.GetBuffer() ) ) + { + rcCaret = rc; + rcCaret.left += nXLeft - nXFirst - 1; + rcCaret.right = rcCaret.left + 2; + } + + // Set up color based on the character attribute + if( *pAttr == ATTR_TARGET_CONVERTED ) + { + pElement->FontColor.Current = m_CompTargetColor; + bkColor = m_CompTargetBkColor; + } + else if( *pAttr == ATTR_TARGET_NOTCONVERTED ) + { + pElement->FontColor.Current = m_CompTargetNonColor; + bkColor = m_CompTargetNonBkColor; + } + else + { + continue; + } + + RECT rcTarget = + { + rc.left + nXLeft - nXFirst, rc.top, rc.left + nXRight - nXFirst, rc.bottom + }; + m_pDialog->DrawRect( &rcTarget, bkColor ); + m_pDialog->DrawText( pcComp, pElement, &rcTarget, false, 1 ); + + // Record the first target converted character's index + if( -1 == s_nFirstTargetConv ) + s_nFirstTargetConv = int( pAttr - ImeUi_GetCompStringAttr() ); + } + + // Render the composition caret + if( m_bCaretOn ) + { + // If the caret is at the very end, its position would not have + // been computed in the above loop. We compute it here. + if( ImeUi_GetImeCursorChars() == ( DWORD )s_CompString.GetTextSize() ) + { + s_CompString.CPtoX( ImeUi_GetImeCursorChars(), FALSE, &nX ); + rcCaret = rc; + rcCaret.left += nX - nXFirst - 1; + rcCaret.right = rcCaret.left + 2; + } + + m_pDialog->DrawRect( &rcCaret, m_CompCaretColor ); + } +} + + +//-------------------------------------------------------------------------------------- +void CDXUTIMEEditBox::RenderIndicator( float fElapsedTime ) +{ + CDXUTElement* pElement = m_Elements.GetAt( 9 ); + pElement->TextureColor.Blend( DXUT_STATE_NORMAL, fElapsedTime ); + + m_pDialog->DrawSprite( pElement, &m_rcIndicator, DXUT_NEAR_BUTTON_DEPTH ); + RECT rc = m_rcIndicator; + InflateRect( &rc, -m_nSpacing, -m_nSpacing ); + + pElement->FontColor.Current = m_IndicatorImeColor; + RECT rcCalc = + { + 0, 0, 0, 0 + }; + // If IME system is off, draw English indicator. + WCHAR* pwszIndicator = ImeUi_IsEnabled() ? ImeUi_GetIndicatior() : L"En"; + + m_pDialog->CalcTextRect( pwszIndicator, pElement, &rcCalc ); + m_pDialog->DrawText( pwszIndicator, pElement, &rc ); +} + + +//-------------------------------------------------------------------------------------- +void CDXUTIMEEditBox::Render( float fElapsedTime ) +{ + if( m_bVisible == false ) + return; + + // If we have not computed the indicator symbol width, + // do it. + if( !m_nIndicatorWidth ) + { + RECT rc = + { + 0, 0, 0, 0 + }; + m_pDialog->CalcTextRect( L"En", m_Elements.GetAt( 9 ), &rc ); + m_nIndicatorWidth = rc.right - rc.left; + + // Update the rectangles now that we have the indicator's width + UpdateRects(); + } + + // Let the parent render first (edit control) + CDXUTEditBox::Render( fElapsedTime ); + + CDXUTElement* pElement = GetElement( 1 ); + if( pElement ) + { + s_CompString.SetFontNode( m_pDialog->GetFont( pElement->iFont ) ); + s_CandList.HoriCand.SetFontNode( m_pDialog->GetFont( pElement->iFont ) ); + } + + // + // Now render the IME elements + // + + ImeUi_RenderUI(); + + if( m_bHasFocus ) + { + // Render the input locale indicator + RenderIndicator( fElapsedTime ); + + // Display the composition string. + // This method should also update s_ptCompString + // for RenderCandidateReadingWindow. + RenderComposition( fElapsedTime ); + + // Display the reading/candidate window. RenderCandidateReadingWindow() + // uses s_ptCompString to position itself. s_ptCompString must have + // been filled in by RenderComposition(). + if( ImeUi_IsShowReadingWindow() ) + // Reading window + RenderCandidateReadingWindow( fElapsedTime, true ); + else if( ImeUi_IsShowCandListWindow() ) + // Candidate list window + RenderCandidateReadingWindow( fElapsedTime, false ); + } +} + + +//-------------------------------------------------------------------------------------- +void CDXUTIMEEditBox::SetImeEnableFlag( bool bFlag ) +{ + s_bImeFlag = bFlag; +} + + +//-------------------------------------------------------------------------------------- +void CDXUTIMEEditBox::Initialize( HWND hWnd ) +{ + ImeUiCallback_DrawRect = NULL; + ImeUiCallback_Malloc = malloc; + ImeUiCallback_Free = free; + ImeUiCallback_DrawFans = NULL; + + ImeUi_Initialize( hWnd ); + + s_CompString.SetBufferSize( MAX_COMPSTRING_SIZE ); + ImeUi_EnableIme( true ); +} + + diff --git a/Demos/DX11ClothDemo/DXUT/Optional/DXUTguiIME.h b/Demos/DX11ClothDemo/DXUT/Optional/DXUTguiIME.h new file mode 100644 index 000000000..6739be322 --- /dev/null +++ b/Demos/DX11ClothDemo/DXUT/Optional/DXUTguiIME.h @@ -0,0 +1,141 @@ +//-------------------------------------------------------------------------------------- +// File: DXUTguiIME.h +// +// Copyright (c) Microsoft Corporation. All rights reserved. +//-------------------------------------------------------------------------------------- +#pragma once +#ifndef DXUT_IME_H +#define DXUT_IME_H + +#include +#include +#include + + +//-------------------------------------------------------------------------------------- +// Forward declarations +//-------------------------------------------------------------------------------------- +class CDXUTIMEEditBox; + + +//----------------------------------------------------------------------------- +// IME-enabled EditBox control +//----------------------------------------------------------------------------- +#define MAX_COMPSTRING_SIZE 256 + + +class CDXUTIMEEditBox : public CDXUTEditBox +{ +public: + + static HRESULT CreateIMEEditBox( CDXUTDialog* pDialog, int ID, LPCWSTR strText, int x, int y, int width, + int height, bool bIsDefault=false, CDXUTIMEEditBox** ppCreated=NULL ); + + CDXUTIMEEditBox( CDXUTDialog* pDialog = NULL ); + virtual ~CDXUTIMEEditBox(); + + static void InitDefaultElements( CDXUTDialog* pDialog ); + + static void WINAPI Initialize( HWND hWnd ); + static void WINAPI Uninitialize(); + + static HRESULT WINAPI StaticOnCreateDevice(); + static bool WINAPI StaticMsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ); + + static void WINAPI SetImeEnableFlag( bool bFlag ); + + virtual void Render( float fElapsedTime ); + virtual bool MsgProc( UINT uMsg, WPARAM wParam, LPARAM lParam ); + virtual bool HandleMouse( UINT uMsg, POINT pt, WPARAM wParam, LPARAM lParam ); + virtual void UpdateRects(); + virtual void OnFocusIn(); + virtual void OnFocusOut(); + + void PumpMessage(); + + virtual void RenderCandidateReadingWindow( float fElapsedTime, bool bReading ); + virtual void RenderComposition( float fElapsedTime ); + virtual void RenderIndicator( float fElapsedTime ); + +protected: + static void WINAPI EnableImeSystem( bool bEnable ); + + static WORD WINAPI GetLanguage() + { + return ImeUi_GetLanguage(); + } + static WORD WINAPI GetPrimaryLanguage() + { + return ImeUi_GetPrimaryLanguage(); + } + static void WINAPI SendKey( BYTE nVirtKey ); + static DWORD WINAPI GetImeId( UINT uIndex = 0 ) + { + return ImeUi_GetImeId( uIndex ); + }; + static void WINAPI CheckInputLocale(); + static void WINAPI CheckToggleState(); + static void WINAPI SetupImeApi(); + static void WINAPI ResetCompositionString(); + + + static void SetupImeUiCallback(); + +protected: + enum + { + INDICATOR_NON_IME, + INDICATOR_CHS, + INDICATOR_CHT, + INDICATOR_KOREAN, + INDICATOR_JAPANESE + }; + + struct CCandList + { + CUniBuffer HoriCand; // Candidate list string (for horizontal candidate window) + int nFirstSelected; // First character position of the selected string in HoriCand + int nHoriSelectedLen; // Length of the selected string in HoriCand + RECT rcCandidate; // Candidate rectangle computed and filled each time before rendered + }; + + static POINT s_ptCompString; // Composition string position. Updated every frame. + static int s_nFirstTargetConv; // Index of the first target converted char in comp string. If none, -1. + static CUniBuffer s_CompString; // Buffer to hold the composition string (we fix its length) + static DWORD s_adwCompStringClause[MAX_COMPSTRING_SIZE]; + static CCandList s_CandList; // Data relevant to the candidate list + static WCHAR s_wszReadingString[32];// Used only with horizontal reading window (why?) + static bool s_bImeFlag; // Is ime enabled + + // Color of various IME elements + D3DCOLOR m_ReadingColor; // Reading string color + D3DCOLOR m_ReadingWinColor; // Reading window color + D3DCOLOR m_ReadingSelColor; // Selected character in reading string + D3DCOLOR m_ReadingSelBkColor; // Background color for selected char in reading str + D3DCOLOR m_CandidateColor; // Candidate string color + D3DCOLOR m_CandidateWinColor; // Candidate window color + D3DCOLOR m_CandidateSelColor; // Selected candidate string color + D3DCOLOR m_CandidateSelBkColor; // Selected candidate background color + D3DCOLOR m_CompColor; // Composition string color + D3DCOLOR m_CompWinColor; // Composition string window color + D3DCOLOR m_CompCaretColor; // Composition string caret color + D3DCOLOR m_CompTargetColor; // Composition string target converted color + D3DCOLOR m_CompTargetBkColor; // Composition string target converted background + D3DCOLOR m_CompTargetNonColor; // Composition string target non-converted color + D3DCOLOR m_CompTargetNonBkColor;// Composition string target non-converted background + D3DCOLOR m_IndicatorImeColor; // Indicator text color for IME + D3DCOLOR m_IndicatorEngColor; // Indicator text color for English + D3DCOLOR m_IndicatorBkColor; // Indicator text background color + + // Edit-control-specific data + int m_nIndicatorWidth; // Width of the indicator symbol + RECT m_rcIndicator; // Rectangle for drawing the indicator button + +#if defined(DEBUG) || defined(_DEBUG) + static bool m_bIMEStaticMsgProcCalled; +#endif +}; + + + +#endif // DXUT_IME_H diff --git a/Demos/DX11ClothDemo/DXUT/Optional/DXUTres.cpp b/Demos/DX11ClothDemo/DXUT/Optional/DXUTres.cpp new file mode 100644 index 000000000..c91080a33 --- /dev/null +++ b/Demos/DX11ClothDemo/DXUT/Optional/DXUTres.cpp @@ -0,0 +1,8338 @@ +//---------------------------------------------------------------------------- +// File: DXUTRes.cpp +// +// Copyright (c) Microsoft Corp. All rights reserved. +//----------------------------------------------------------------------------- +#include "DXUT.h" +#include "DXUTres.h" + +static const DWORD g_DXUTGUITextureSrcData[] = +{ + 0x20534444, 0x0000007c, 0x00001007, 0x00000100, 0x00000100, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000020, 0x00000041, 0x00000000, 0x00000020, 0x000000ff, + 0x0000ff00, 0x00ff0000, 0xff000000, 0x00001002, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000400, 0x00000400, 0x00000400, 0x00000400, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, + 0x11000400, 0x11000400, 0x11000400, 0x11000400, 0x11000000, 0x11000000, 0x11000000, 0x11000000, + 0x11000400, 0x11000400, 0x11000400, 0x11000400, 0x11000400, 0x11000400, 0x11000400, 0x11000400, + 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000400, 0x11000400, 0x11000400, 0x11000400, + 0x11000400, 0x11000400, 0x11000400, 0x11000400, 0x11000400, 0x11000400, 0x11000400, 0x11000400, + 0x11000000, 0x00000000, 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000400, 0x00000400, 0x00000400, 0x00000400, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00080408, 0x00080408, 0x00080408, 0x00080408, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000400, 0x00000400, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, + 0x00000400, 0x00000400, 0x00000400, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, + 0x22000400, 0x22000400, 0x22000400, 0x22000400, 0x22000000, 0x22000000, 0x22000000, 0x22000000, + 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, + 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, + 0x22000400, 0x22000400, 0x22000400, 0x22000400, 0x22000000, 0x22000000, 0x22000000, 0x22000000, + 0x22000400, 0x22000400, 0x22000400, 0x22000400, 0x22000400, 0x22000400, 0x22000400, 0x22000400, + 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000400, 0x22000400, 0x22000400, 0x22000400, + 0x22000400, 0x22000400, 0x22000400, 0x22000400, 0x22000400, 0x22000400, 0x22000400, 0x22000400, + 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, + 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, + 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000400, 0x00000400, 0x00000400, 0x00000400, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00080408, 0x00080408, 0x00080408, 0x00080408, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000400, 0x00000400, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, + 0x00000400, 0x00000400, 0x00000400, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x11000000, 0x11000000, 0x22000000, 0x33000000, 0x44000000, + 0x44000000, 0x55000000, 0x55000000, 0x55000000, 0x55000000, 0x55000000, 0x66000000, 0x66000000, + 0x66000400, 0x66000400, 0x66000400, 0x66000400, 0x66000000, 0x66000000, 0x661e1e1e, 0x771e1e1e, + 0x771e1c1e, 0x771e1c1e, 0x771e1c1e, 0x771e1c1e, 0x771e1e1e, 0x771e1e1e, 0x771e1e1e, 0x771e1e1e, + 0x771e1c1e, 0x881e1c1e, 0x881e1c1e, 0x881e1c1e, 0x88373937, 0x88373937, 0x881b1c1b, 0x881b1c1b, + 0x881e201e, 0x881e201e, 0x881e201e, 0x881e201e, 0x88313631, 0x88313631, 0x88313631, 0x88191b19, + 0x881b1f1b, 0x881b1f1b, 0x881b1f1b, 0x881b1f1b, 0x881b1e1b, 0x881b1e1b, 0x881b1e1b, 0x88373737, + 0x88313331, 0x88313331, 0x88313331, 0x88313331, 0x881b1f1b, 0x881b1f1b, 0x881b1f1b, 0x881b1f1b, + 0x881b1f1b, 0x881b1f1b, 0x881b1f1b, 0x881b1f1b, 0x88191e19, 0x88191e19, 0x88191e19, 0x77191e19, + 0x77191a19, 0x77191a19, 0x77191a19, 0x77191a19, 0x77191719, 0x77191719, 0x77191719, 0x66191719, + 0x66161616, 0x66161616, 0x66000000, 0x66000000, 0x66000000, 0x66000000, 0x66000000, 0x66000000, + 0x55000000, 0x55000000, 0x55000000, 0x55000000, 0x55000000, 0x55000000, 0x44000000, 0x44000000, + 0x44000000, 0x33000000, 0x22000000, 0x11000000, 0x11000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000400, 0x22000400, 0x22000400, 0x333c413c, 0x443c3d3f, 0x443c3d3f, 0x443c3d3f, 0x553c3d3f, + 0x66454145, 0x77454145, 0x77454145, 0x88817d81, 0x99797779, 0x99797779, 0x99797779, 0x99797779, + 0x99797979, 0xaa797979, 0xaa797979, 0xaa797979, 0xbb7e7c7e, 0xcc7e7c7e, 0xbb7e7c7e, 0xbb7e7c7e, + 0xbb7e7f7e, 0xbb7e7f7e, 0xcc7e7f7e, 0xcc7e7f7e, 0xcc7e7f7e, 0xcc7e7f7e, 0xcc7e7f7e, 0xcc7e7f7e, + 0xbb7e7c7e, 0xcc7c7b7d, 0xcc7a7879, 0xbb707071, 0xbb686869, 0xbb5d6060, 0xbb565858, 0xbb4d4f4c, + 0xcc454745, 0xcc3c3b3e, 0x77383838, 0x55393837, 0x55373737, 0x44373737, 0x33373737, 0x33373937, + 0x22000400, 0x22000400, 0x00000400, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x11000000, + 0x22000000, 0x33000000, 0x44000000, 0x55000000, 0x55030303, 0x66030303, 0x66050505, 0x66080808, + 0x66101010, 0x77212021, 0x77212021, 0x77313131, 0x88373637, 0x88373637, 0x99525152, 0x99525152, + 0x995a595a, 0x995a595a, 0x995a595a, 0x995a595a, 0x995a595a, 0x995a595a, 0x995a595a, 0x995a595a, + 0x995a555a, 0x995a555a, 0x995a555a, 0x995a555a, 0x995a595a, 0x995a595a, 0x995a595a, 0x995a595a, + 0x995a555a, 0x995a555a, 0x995a555a, 0x995a555a, 0x99525552, 0x99525552, 0x99525552, 0x99525552, + 0x995a595a, 0x995a595a, 0x995a595a, 0x995a595a, 0x994a514a, 0x994a514a, 0x994a514a, 0x994a514a, + 0x99525552, 0x99525552, 0x99525552, 0x99525552, 0x99525152, 0x99525152, 0x99525152, 0x99525152, + 0x994a4d4a, 0x994a4d4a, 0x994a4d4a, 0x994a4d4a, 0x99525552, 0x99525552, 0x99525552, 0x99525552, + 0x99525552, 0x99525552, 0x99525552, 0x99525552, 0x994a514a, 0x994a514a, 0x994a514a, 0x994a514a, + 0x994a4d4a, 0x994a4d4a, 0x994a4d4a, 0x994a4d4a, 0x994a454a, 0x994a454a, 0x994a454a, 0x994a454a, + 0x99424142, 0x99424142, 0x99424142, 0x99424142, 0x99424142, 0x99424142, 0x99424142, 0x992c2b2c, + 0x88293129, 0x881b201b, 0x771b201b, 0x771b201b, 0x66101010, 0x66101010, 0x660b0b0b, 0x66050505, + 0x66000400, 0x66000100, 0x55000100, 0x55000000, 0x55000000, 0x44000000, 0x33000000, 0x22000000, + 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00080708, 0x11100d10, 0x11100d10, 0x22191419, + 0x33212324, 0x55424647, 0x66424647, 0x8863696b, 0x99737473, 0xbb737473, 0xccadaead, 0xeeadaead, + 0xffb5bab5, 0xffb5bab5, 0xffb5bab5, 0xffb5bab5, 0xffb5b6bd, 0xffb5b6bd, 0xffb5b6bd, 0xffb5b6bd, + 0xffbdbabd, 0xffbdbabd, 0xffbdbabd, 0xffbdbabd, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, + 0xffb5b6b5, 0xffb5b6b5, 0xffb5b6b5, 0xffb5b6b5, 0xffbdbabd, 0xffbdbabd, 0xffbdbabd, 0xffbdbabd, + 0xffbdbebd, 0xffbdbebd, 0xffbdbebd, 0xffbdbebd, 0xffbdbebd, 0xffbdbebd, 0xffbdbebd, 0xffbdbebd, + 0xffbdbabd, 0xffbcbabd, 0xffbcb8bc, 0xffb6b2b6, 0xffb3afb3, 0xffb0aeaf, 0xffadabaa, 0xffaaa9aa, + 0xffa9a7a8, 0xffa7a7a7, 0xffa6a6a6, 0xffa6a6a5, 0xffa6a6a5, 0xffa5a6a5, 0xffa5a6a5, 0xffa5a2a5, + 0xffa5a2a5, 0xffa5a2a5, 0xeea5a2a5, 0xdd9c9a9c, 0xcc9c9a9c, 0xaa686768, 0x99686768, 0x885a5d5a, + 0x553c3e3c, 0x443c3e3c, 0x331e1f1e, 0x11101010, 0x11101010, 0x110b0b0b, 0x00050505, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x11000400, 0x33000400, 0x44000400, 0x55000400, + 0x66080808, 0x66080808, 0x663a3a3a, 0x773a3a3a, 0x885a5d5a, 0x886b6f6e, 0x996b6f6e, 0x997b8081, + 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b, 0x99737573, 0x99737573, 0x99737573, 0x99737573, + 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99797879, 0x99737173, 0x99737173, 0x99737173, + 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, + 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, + 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x996b716b, 0x99737773, 0x996b716b, 0x996b716b, + 0x99737173, 0x99797779, 0x99737173, 0x99737173, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, + 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, + 0x996b696b, 0x996b696b, 0x996b696b, 0x996b696b, 0x996b696b, 0x996b696b, 0x996b696b, 0x996b696b, + 0x996b696b, 0x996b696b, 0x996b696b, 0x996b696b, 0x99636563, 0x99636563, 0x99636563, 0x99636563, + 0x99636163, 0x99636163, 0x99636163, 0x99636163, 0x995a5d5a, 0x995a5d5a, 0x995a5d5a, 0x995a5d5a, + 0x995a5552, 0x995a5552, 0x995a5552, 0x995a5552, 0x994a4d50, 0x994a4d50, 0x994a4d50, 0x9931353a, + 0x88313331, 0x88313331, 0x77101010, 0x66101010, 0x66080408, 0x66080408, 0x66080408, 0x55080408, + 0x55000000, 0x44000000, 0x22000000, 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000400, 0x00000400, 0x00000400, 0x00000400, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x11191819, 0x22191819, 0x33191819, 0x66656465, 0x887b7d7b, 0xbba2a5a5, 0xddc8ccce, 0xffc8ccce, + 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, + 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, + 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, + 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, + 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, + 0xffd6d2d6, 0xffd9d8d9, 0xffd6d2d6, 0xffd6d2d6, 0xffd6cece, 0xffcfcccc, 0xffc8c7c8, 0xffc6c2c3, + 0xffc4c0c2, 0xffc2c0c2, 0xffc5c2c4, 0xffc4c2c5, 0xffc5c2c5, 0xffc5c2c5, 0xffc5c2c5, 0xffbdbebd, + 0xffbdbebd, 0xffbdbebd, 0xffbdbebd, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffa5a6a5, + 0xffa5a6a5, 0xffa5a6a5, 0xffa5a6a5, 0xee868a86, 0xdd868a86, 0xaa868a86, 0x885a615a, 0x55505250, + 0x33101410, 0x11101410, 0x11101410, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, + 0x00000400, 0x00000400, 0x00000400, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x11000000, 0x44000000, 0x55000400, 0x66000400, 0x77343634, 0x77686868, + 0x886b6c6b, 0x999c9e9c, 0x999c9e9c, 0x999c9e9c, 0x998c9294, 0x998c9294, 0x998c9294, 0x998c9294, + 0x998c8e8c, 0x99868786, 0x99868786, 0x99868786, 0x99848384, 0x99848384, 0x99848384, 0x99848384, + 0x99848684, 0x99848684, 0x99848684, 0x99848684, 0x99848684, 0x99848684, 0x99848684, 0x997e7f7e, + 0x99848284, 0x99848284, 0x99848284, 0x99848284, 0x99848284, 0x99848284, 0x997e7c7e, 0x99848284, + 0x9984827b, 0x9984827b, 0x9984827b, 0x9984827b, 0x99848284, 0x99848284, 0x99848284, 0x997e7c7e, + 0x99848284, 0x997e7c7e, 0x99848284, 0x99848284, 0x99848284, 0x99848284, 0x99848284, 0x997b7c7b, + 0x997e7c7e, 0x99848284, 0x99848284, 0x99848284, 0x99848284, 0x997b7b7b, 0x99848284, 0x99848284, + 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, + 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x99767776, + 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b, 0x99737373, 0x997b797b, + 0x99737473, 0x99737473, 0x99737473, 0x99737473, 0x997b797b, 0x997b797b, 0x997b797b, 0x99707070, + 0x9970706e, 0x9970706e, 0x9970706e, 0x9970706e, 0x99636565, 0x99636565, 0x99636565, 0x99636565, + 0x99525652, 0x99525652, 0x99525652, 0x99525652, 0x99504d50, 0x882c282c, 0x772c282c, 0x77080408, + 0x66000000, 0x66000000, 0x55000000, 0x55000000, 0x44000000, 0x22000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000400, 0x00000400, 0x00000400, 0x00000400, 0x00000000, 0x11000000, 0x33525452, 0x77525452, + 0xaab2afb2, 0xddfffbff, 0xfffffbff, 0xfffffbff, 0xffeff3f7, 0xffeff3f7, 0xffeff3f7, 0xffeff3f7, + 0xffefefef, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e5e6, 0xffe6e5e6, 0xffe6e5e6, 0xffe6e5e6, + 0xffe1e4e1, 0xffe1e4e1, 0xffe1e4e1, 0xffe1e4e1, 0xffe6e7e6, 0xffe6e7e6, 0xffe6e7e6, 0xffe1e1e1, + 0xffe6e1e6, 0xffe6e1e6, 0xffe6e1e6, 0xffe6e1e6, 0xffe6e3e6, 0xffe6e3e6, 0xffe6e3e6, 0xffe6e3e6, + 0xffe6e3de, 0xffe6e3de, 0xffe6e3de, 0xffe6e3de, 0xffe6e3e6, 0xffe6e3e6, 0xffe6e3e6, 0xffe1dde1, + 0xffe6e3de, 0xffe6e3de, 0xffe6e3de, 0xffe6e3de, 0xffdee3de, 0xffdee3de, 0xffdee3de, 0xffdee3de, + 0xffdee3de, 0xffdee3de, 0xffdee3de, 0xffdee3de, 0xffdee3dd, 0xffdee3dd, 0xffdee1de, 0xffdee0db, + 0xffdedbd9, 0xffe2dddc, 0xffdbd9db, 0xffd6d5d6, 0xffd6d5d6, 0xffd6d5d6, 0xffd6d5d6, 0xffd3d4d3, + 0xffd3d4d3, 0xffd3d4d3, 0xffd3d4d3, 0xffd0d0d0, 0xffd0d0d0, 0xffd0d0d0, 0xffd0d0d0, 0xffcbc9cb, + 0xffcbc9cb, 0xffcbc9cb, 0xffcbc9cb, 0xffb2b2b2, 0xffb2b2b2, 0xffb2b2b2, 0xffb2b2b2, 0xff8f908f, + 0xff8f908f, 0xbb8f908f, 0x88505250, 0x663c3d3c, 0x333c3d3c, 0x11000000, 0x00000000, 0x00000400, + 0x00000400, 0x00000400, 0x00000400, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x11000000, 0x44000000, 0x55000000, 0x77343234, 0x77686868, 0x999c9a9c, 0x999c9a9c, 0x999c9a9c, + 0x999c9e9c, 0x999c9e9c, 0x999c9e9c, 0x999c9e9c, 0x998c9294, 0x998c9294, 0x998c9294, 0x998c9294, + 0x998c8e8c, 0x998c8e8c, 0x998c8e8c, 0x998c8e8c, 0x998c8a8c, 0x998c8a8c, 0x998c8a8c, 0x998c8a8c, + 0x99848684, 0x99848684, 0x99848684, 0x99848684, 0x99848684, 0x99848684, 0x997e7f7e, 0x99848684, + 0x99848284, 0x99848284, 0x99848284, 0x99848284, 0x99848284, 0x99848284, 0x99848284, 0x99848284, + 0x9984827b, 0x9984827b, 0x9984827b, 0x9984827b, 0x99848284, 0x99848284, 0x997e7c7e, 0x997e7c7e, + 0x99848284, 0x99848284, 0x99848284, 0x99848284, 0x99848284, 0x99848284, 0x997b7c7b, 0x997b7c7b, + 0x99848284, 0x997e7c7e, 0x997e7c7e, 0x997e7c7e, 0x99848284, 0x99848284, 0x997b7b7b, 0x997b7b7b, + 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, + 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, + 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b, + 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b, + 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, + 0x99737973, 0x99737973, 0x99737973, 0x99737973, 0x99737173, 0x99737173, 0x99504d50, 0x99504d50, + 0x88424142, 0x88212021, 0x77212021, 0x66000000, 0x55000000, 0x55000000, 0x44000000, 0x11000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000400, 0x00000400, 0x00000400, 0x22000400, 0x66525452, 0xaaa5a7a5, 0xeef7fbf7, 0xfff7fbf7, + 0xfffffbff, 0xfffffbff, 0xfffffbff, 0xfffffbff, 0xffeff3f7, 0xffeff3f7, 0xffeff3f7, 0xffeff3f7, + 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefebef, 0xffefebef, 0xffefebef, 0xffefebef, + 0xffe6ebe6, 0xffe6ebe6, 0xffe1e4e1, 0xffe1e4e1, 0xffe6e7e6, 0xffe6e7e6, 0xffe6e7e6, 0xffe6e7e6, + 0xffe6e1e6, 0xffe6e1e6, 0xffe6e1e6, 0xffefe7ef, 0xffe6e3e6, 0xffe6e3e6, 0xffe6e3e6, 0xffe6e3e6, + 0xffe6e3de, 0xffe6e3de, 0xffe6e3de, 0xffe6e3de, 0xffe6e3e6, 0xffe6e3e6, 0xffe1dde1, 0xffe6e3e6, + 0xffe6e3de, 0xffe6e3de, 0xffe6e3de, 0xffe6e3de, 0xffdee3de, 0xffdee3de, 0xffdee3de, 0xffdee3de, + 0xffdee3de, 0xffdee3de, 0xffdee3de, 0xffdee3de, 0xffdee3de, 0xffdee3de, 0xffdee3de, 0xffdee3de, + 0xffe5e2df, 0xffe1e0dd, 0xffdcdbdc, 0xffdddfe0, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedfde, + 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedbde, + 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffcecece, + 0xffcecece, 0xffcecece, 0xffcecece, 0xffb5b6b5, 0xdd797979, 0xaa797979, 0x663c3d3c, 0x22000400, + 0x00000400, 0x00000400, 0x00000400, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x22000000, + 0x55000000, 0x77343234, 0x88686468, 0x999c969c, 0x999c9a9c, 0x999c9a9c, 0x999c9a9c, 0x999c9a9c, + 0x999c9e9c, 0x999c9e9c, 0x999c9e9c, 0x999c9e9c, 0x998c9294, 0x998c9294, 0x998c9294, 0x998c9294, + 0x99868786, 0x99868786, 0x99868786, 0x99868786, 0x99848384, 0x99848384, 0x99848384, 0x99848384, + 0x997e807e, 0x997e807e, 0x997e807e, 0x997e807e, 0x997e7f7e, 0x997e7f7e, 0x997e7f7e, 0x997e7f7e, + 0x997e7c7e, 0x997e7c7e, 0x997e7c7e, 0x997e7c7e, 0x997e7c7e, 0x997e7c7e, 0x997e7c7e, 0x997e7c7e, + 0x997e7c79, 0x997e7c79, 0x997e7c79, 0x99797776, 0x99797779, 0x99797779, 0x997e7c7e, 0x997e7c7e, + 0x997e7c7e, 0x997e7c7e, 0x997e7c7e, 0x997e7c7e, 0x997b7c7b, 0x997b7c7b, 0x99737773, 0x997b7c7b, + 0x99797779, 0x997e7c7e, 0x99797779, 0x997e7c7e, 0x997b7b7b, 0x997b7b7b, 0x997b7b7b, 0x997b7b7b, + 0x99767876, 0x99767876, 0x99767876, 0x99767876, 0x99767876, 0x99767876, 0x99767876, 0x99767876, + 0x99767776, 0x997b7d7b, 0x997b7d7b, 0x99767776, 0x99767776, 0x99767776, 0x99767776, 0x99767776, + 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b, + 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b, + 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, + 0x99737973, 0x99737973, 0x99737973, 0x99737973, 0x99737173, 0x99737173, 0x99737173, 0x99737173, + 0x99636163, 0x99636163, 0x99424142, 0x88212021, 0x77191419, 0x66000000, 0x55000000, 0x55000000, + 0x22000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000400, 0x11000400, 0x66797b79, 0xccb5b6b5, 0xfff7fbf7, 0xfff7fbf7, 0xfff7fbf7, 0xfff7fbf7, + 0xfffffbff, 0xfffffbff, 0xfffffbff, 0xfffffbff, 0xffeff3f7, 0xffeff3f7, 0xffeff3f7, 0xffeff3f7, + 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e5e6, 0xffe6e5e6, 0xffe6e5e6, 0xffe6e5e6, + 0xffe1e4e1, 0xffe1e4e1, 0xffe1e4e1, 0xffdbdddb, 0xffe1e1e1, 0xffe1e1e1, 0xffdbdcdb, 0xffe1e1e1, + 0xffdedcde, 0xffdedcde, 0xffdedcde, 0xffdedcde, 0xffe1dde1, 0xffe1dde1, 0xffe1dde1, 0xffe1dde1, + 0xffe1dddb, 0xffe1dddb, 0xffe1dddb, 0xffe1dddb, 0xffe1dde1, 0xffe1dde1, 0xffe1dde1, 0xffe1dde1, + 0xffe1dddb, 0xffe1dddb, 0xffe1dddb, 0xffe1dddb, 0xffdbdddb, 0xffdbdddb, 0xffdbdddb, 0xffdbdddb, + 0xffdbdddb, 0xffdbdddb, 0xffdbdddb, 0xffdbdddb, 0xffdbdcd9, 0xffdbdcd9, 0xffdcdcda, 0xffdcdbda, + 0xffdddadb, 0xffddd9dc, 0xffdad8d9, 0xffd7dadb, 0xffdbdddc, 0xffdddfdd, 0xffdedfde, 0xffdedfde, + 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedbde, + 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffcecece, + 0xffcecece, 0xffcecece, 0xffcecece, 0xffb5b6b5, 0xffb5b6b5, 0xffb5b6b5, 0xffb5b6b5, 0xbb737973, + 0x664d524d, 0x11000400, 0x00000400, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00080808, 0x00080808, 0x33080808, 0x66080808, + 0x8852555a, 0x99848686, 0x999c9e9c, 0x999c9e9c, 0x999c9e9c, 0x999c9e9c, 0x999c9e9c, 0x999c9e9c, + 0x99949294, 0x99949294, 0x99949294, 0x99898889, 0x998c8684, 0x998c8684, 0x998c8684, 0x9984807e, + 0x99848284, 0x99848284, 0x99848284, 0x997b7b7e, 0x997b7d7b, 0x997b7d7b, 0x99767876, 0x99767876, + 0x997b797b, 0x997b797b, 0x99767576, 0x99767576, 0x99737573, 0x99737573, 0x99737573, 0x99737573, + 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, + 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, + 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, + 0x99737473, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, + 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, + 0x99767570, 0x99767570, 0x997b7973, 0x99767570, 0x99737573, 0x99737573, 0x99737573, 0x99737573, + 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, + 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, + 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99767576, 0x99767576, 0x997b797b, 0x997b797b, + 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, + 0x997b7973, 0x9973706e, 0x996b6768, 0x99635d63, 0x994a4a4a, 0x77292b29, 0x66080c08, 0x66080c08, + 0x66000000, 0x33000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x333a393a, 0xbbb2b2b2, 0xeeefefef, 0xffefefef, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xfff7f7f7, 0xfff7f7f7, 0xffececec, 0xffececec, 0xffefebe6, 0xffefebe6, 0xffe6e4e1, 0xffe6e4e1, + 0xffe6e3e6, 0xffe6e3e6, 0xffe6e3e6, 0xffdedce1, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedfde, + 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, + 0xffd6dbd6, 0xffd6dbd6, 0xffd3d7d3, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd3d7d3, + 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, + 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, + 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d6d6, 0xffd8d7d6, + 0xffd8d6d7, 0xffd8d3d6, 0xffd8d3d7, 0xffd9d4d8, 0xffd9d6d9, 0xffd8d7d7, 0xffd6d7d6, 0xffd3d7d3, + 0xffd3d7d3, 0xffd3d7d3, 0xffd6dbd6, 0xffd3d7d3, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbde, + 0xffd6dbde, 0xffd6dbde, 0xffd6dbde, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedfde, + 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffd6dbd6, 0xffd0d1ce, 0xffd0d1ce, 0xffc5bebd, 0xffc5c6c5, + 0xee9a9797, 0xaa6e6868, 0x3342393a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00080808, 0x33080808, 0x66080808, 0x885a595a, + 0x99848686, 0x99848686, 0x999c9e9c, 0x999c9e9c, 0x99919291, 0x99919291, 0x99919291, 0x99919291, + 0x99898889, 0x99898889, 0x99898889, 0x997e7f7e, 0x9984807e, 0x997b7b79, 0x997b7b79, 0x997b7b79, + 0x997b7b7e, 0x997b7b7e, 0x997b7b7e, 0x99737479, 0x99767876, 0x99767876, 0x99707370, 0x99707370, + 0x99767576, 0x99767576, 0x99767576, 0x99767576, 0x99737573, 0x99737573, 0x99737573, 0x99707370, + 0x99707370, 0x99707370, 0x99707370, 0x99707370, 0x99707370, 0x99707370, 0x99707370, 0x99707370, + 0x996e706e, 0x99707370, 0x99707370, 0x996e706e, 0x99707370, 0x99707370, 0x99707370, 0x996e706e, + 0x996e706e, 0x996e706e, 0x996e706e, 0x996e706e, 0x99707370, 0x996e706e, 0x99707370, 0x99707370, + 0x99737173, 0x99737473, 0x99737373, 0x99737173, 0x99737370, 0x99737370, 0x99737370, 0x99737370, + 0x99737373, 0x99737373, 0x99737373, 0x99737373, 0x99737373, 0x99737373, 0x99737373, 0x99737373, + 0x9970716e, 0x99767570, 0x99767570, 0x99767570, 0x99737573, 0x99737370, 0x99737370, 0x99737370, + 0x99737370, 0x99737573, 0x99737370, 0x99737370, 0x99707370, 0x99707370, 0x99707370, 0x99707370, + 0x99707373, 0x99707373, 0x99707373, 0x99707373, 0x99707370, 0x99707370, 0x99707370, 0x99707370, + 0x99707370, 0x99707370, 0x99707370, 0x99707370, 0x99767576, 0x99767576, 0x99767576, 0x99767576, + 0x99767576, 0x99767576, 0x99767576, 0x99767576, 0x99767876, 0x99767876, 0x99767876, 0x99767876, + 0x997b7973, 0x997b7973, 0x997b7973, 0x9973706e, 0x996b696b, 0x994a4a4a, 0x88292b29, 0x77080c08, + 0x66000000, 0x66000000, 0x33000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x55474847, + 0xddb2b2b2, 0xffefefef, 0xffefefef, 0xffefefef, 0xfff4f3f4, 0xfff4f3f4, 0xfff4f3f4, 0xfff4f3f4, + 0xffececec, 0xffececec, 0xffe1e1e1, 0xffe1e1e1, 0xffe6e4e1, 0xffdedddb, 0xffdedddb, 0xffdedddb, + 0xffdedce1, 0xffdedce1, 0xffdedce1, 0xffd6d5db, 0xffd9d9d9, 0xffd9d9d9, 0xffd9d9d9, 0xffd3d4d3, + 0xffd9d7d9, 0xffd9d7d9, 0xffd9d7d9, 0xffd9d7d9, 0xffd3d7d3, 0xffd3d7d3, 0xffd3d7d3, 0xffd3d7d3, + 0xffd3d7d3, 0xffd3d7d3, 0xffd3d7d3, 0xffd0d2d0, 0xffd3d7d3, 0xffd0d2d0, 0xffd0d2d0, 0xffd0d2d0, + 0xffd3d4d3, 0xffd3d4d3, 0xffd3d4d3, 0xffd3d4d3, 0xffd3d4d3, 0xffd3d4d3, 0xffd3d4d3, 0xffd3d4d3, + 0xffd3d4d3, 0xffd0d1d0, 0xffd3d4d3, 0xffd0d1d0, 0xffd3d4d3, 0xffd3d4d3, 0xffd3d4d3, 0xffd3d4d3, + 0xffd0d4d0, 0xffd3d5d3, 0xffd0d4d0, 0xffd3d5d3, 0xffd6d4d3, 0xffd6d4d3, 0xffd6d4d3, 0xffd7d4d4, + 0xffd6d2d3, 0xffd5cfd3, 0xffd5d0d4, 0xffd5d3d4, 0xffd5d5d4, 0xffd2d5d3, 0xffd3d4d3, 0xffd3d7d3, + 0xffd3d7d3, 0xffd3d7d3, 0xffd3d7d3, 0xffd0d2d0, 0xffd3d7d3, 0xffd3d7d3, 0xffd0d2d0, 0xffd3d7d9, + 0xffd3d7d9, 0xffd3d7d9, 0xffd3d7d9, 0xffd3d4d3, 0xffd9d9d9, 0xffd9d9d9, 0xffd9d9d9, 0xffd9d9d9, + 0xffd9d9d9, 0xffd9d9d9, 0xffd9d9d9, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd0d1ce, 0xffc5c6c5, + 0xffc5c6c5, 0xff9a9797, 0xcc9a9797, 0x55313231, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x33080808, 0x66080808, 0x995a595a, 0x99848284, + 0x99848686, 0x99848686, 0x99848686, 0x99848686, 0x99919291, 0x99868686, 0x99868686, 0x99868686, + 0x997e7f7e, 0x997e7f7e, 0x99737573, 0x99737573, 0x997b7b79, 0x997b7b79, 0x99737573, 0x99737573, + 0x99737479, 0x99737479, 0x99737479, 0x99737479, 0x99707370, 0x99707370, 0x99707370, 0x99707370, + 0x99707170, 0x99707170, 0x99707170, 0x996b6d6b, 0x996e706e, 0x996e706e, 0x996e706e, 0x996b6d6b, + 0x996e706e, 0x996e706e, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, + 0x996b6d6b, 0x996e706e, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, + 0x996e706e, 0x996e706e, 0x996e706e, 0x996b6d6b, 0x996e706e, 0x996e706e, 0x996e706e, 0x996e706e, + 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x9973706e, 0x9973706e, 0x9973706e, 0x9973706e, + 0x99737073, 0x99737073, 0x99737073, 0x99737373, 0x99737373, 0x99737073, 0x99737073, 0x99737073, + 0x9970716e, 0x9970716e, 0x9970716e, 0x9970716e, 0x9973706e, 0x99737370, 0x9973706e, 0x9973706e, + 0x9973706e, 0x9973706e, 0x99737370, 0x99737370, 0x99707370, 0x99707370, 0x996e706e, 0x996e706e, + 0x996e7073, 0x996e7073, 0x996e7073, 0x996e7073, 0x996e706e, 0x996e706e, 0x996e706e, 0x996e706e, + 0x996e706e, 0x996e706e, 0x996e706e, 0x996e706e, 0x99707170, 0x99707170, 0x99707170, 0x99707170, + 0x99707170, 0x99707170, 0x99707170, 0x99707170, 0x99707370, 0x99707370, 0x99707370, 0x99707370, + 0x997b7973, 0x9973706e, 0x9973706e, 0x9973706e, 0x996b696b, 0x996b696b, 0x994a4a4a, 0x99292b29, + 0x66101010, 0x66000000, 0x66000000, 0x22000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x66474847, 0xeed6d7d6, + 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xfff4f3f4, 0xffe9e7e9, 0xffe9e7e9, 0xffe9e7e9, + 0xffe1e1e1, 0xffe1e1e1, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, + 0xffd6d5db, 0xffd6d5db, 0xffd6d5db, 0xffd6d5db, 0xffd3d4d3, 0xffd3d4d3, 0xffd3d4d3, 0xffd3d4d3, + 0xffd3d2d3, 0xffd3d2d3, 0xffd3d2d3, 0xffcecece, 0xffd0d2d0, 0xffd0d2d0, 0xffd0d2d0, 0xffcecece, + 0xffd0d2d0, 0xffd0d2d0, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, + 0xffd0d1d0, 0xffd0d1d0, 0xffd0d1d0, 0xffd0d1d0, 0xffd0d1d0, 0xffd0d1d0, 0xffd0d1d0, 0xffd0d1d0, + 0xffd0d1d0, 0xffd0d1d0, 0xffd0d1d0, 0xffd0d1d0, 0xffd0d1d0, 0xffd3d4d3, 0xffd0d1d0, 0xffd0d1d0, + 0xffced2ce, 0xffd0d4d0, 0xffd0d4d0, 0xffced2ce, 0xffd6d1d0, 0xffd6d1d0, 0xffd6d4d3, 0xffd6d2d2, + 0xffd6d2d3, 0xffd4d0d2, 0xffd4d0d3, 0xffd5d2d5, 0xffd6d3d6, 0xffd5d4d5, 0xffd3d4d3, 0xffd0d2d0, + 0xffd0d2d0, 0xffd0d2d0, 0xffd0d2d0, 0xffd0d2d0, 0xffd0d2d0, 0xffd0d2d0, 0xffd0d2d0, 0xffd0d2d3, + 0xffd0d2d3, 0xffd0d2d3, 0xffd0d2d3, 0xffd3d4d3, 0xffd3d4d3, 0xffd3d4d3, 0xffd3d4d3, 0xffd3d4d3, + 0xffd3d4d3, 0xffd9d9d9, 0xffd9d9d9, 0xffd6dbd6, 0xffd0d1ce, 0xffd0d1ce, 0xffd0d1ce, 0xffc5c6c5, + 0xffc5c6c5, 0xffc5c6c5, 0xff9a9797, 0xdd949694, 0x44313231, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x11000000, 0x66080808, 0x995a595a, 0x99848284, 0x99848284, + 0x99848686, 0x99848686, 0x99848686, 0x99848686, 0x99868686, 0x99868686, 0x99868686, 0x997b797b, + 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, + 0x996b6d73, 0x996b6d73, 0x996b6d73, 0x996b6d73, 0x996b6d6b, 0x996b6d6b, 0x99707370, 0x996b6d6b, + 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, + 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, + 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, + 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996e706e, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, + 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99736d6b, 0x9973706e, 0x9973706e, 0x9973706e, + 0x99737073, 0x99736d73, 0x99737073, 0x99737073, 0x99736d73, 0x99736d73, 0x99736d73, 0x99737073, + 0x996b6d6b, 0x9970716e, 0x9970716e, 0x996b6d6b, 0x99736d6b, 0x99736d6b, 0x99736d6b, 0x99736d6b, + 0x9973706e, 0x9973706e, 0x99736d6b, 0x9973706e, 0x996e706e, 0x99707370, 0x99707370, 0x996b6d6b, + 0x996e7073, 0x996b6d73, 0x996b6d73, 0x996e7073, 0x996e706e, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, + 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, + 0x99707170, 0x996b6d6b, 0x99707170, 0x996b6d6b, 0x99707370, 0x99707370, 0x996b6d6b, 0x996b6d6b, + 0x9973706e, 0x9973706e, 0x9973706e, 0x9973706e, 0x996b696b, 0x996b696b, 0x996b696b, 0x994a4a4a, + 0x88313131, 0x66101010, 0x66000000, 0x55000000, 0x22000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x44474847, 0xeed6d7d6, 0xffd6d7d6, + 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffe9e7e9, 0xffe9e7e9, 0xffe9e7e9, 0xffdedbde, + 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, + 0xffd6d5db, 0xffceced6, 0xffceced6, 0xffceced6, 0xffcecece, 0xffcecece, 0xffd3d4d3, 0xffcecece, + 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, + 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, + 0xffd0d1d0, 0xffd0d1d0, 0xffd0d1d0, 0xffd0d1d0, 0xffd0d1d0, 0xffd0d1d0, 0xffd0d1d0, 0xffd0d1d0, + 0xffd0d1d0, 0xffd0d1d0, 0xffd0d1d0, 0xffd0d1d0, 0xffd0d1d0, 0xffd0d1d0, 0xffd0d1d0, 0xffd0d1d0, + 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffd6d1d0, 0xffd6d1d0, 0xffd6d1d0, 0xffd7d2d2, + 0xffd7d3d5, 0xffd6d1d5, 0xffd6d1d4, 0xffd6d3d5, 0xffd5d4d5, 0xffd1d2d1, 0xffd0d1d0, 0xffd0d2d0, + 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, + 0xffcecece, 0xffcecece, 0xffcecece, 0xffd3d4d3, 0xffcecece, 0xffd3d4d3, 0xffcecece, 0xffd3d4d3, + 0xffd3d4d3, 0xffcecece, 0xffcecece, 0xffd0d1ce, 0xffd0d1ce, 0xffd0d1ce, 0xffd0d1ce, 0xffc5c6c5, + 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xff949694, 0xcc949694, 0x33313231, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x44000000, 0x884a4542, 0x99737173, 0x99737173, 0x99737173, + 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b797b, 0x997b797b, 0x997b797b, 0x99737373, + 0x99737173, 0x99737173, 0x99706f70, 0x99706f70, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, + 0x99706d70, 0x99737173, 0x99706d70, 0x99706d70, 0x996b6b6b, 0x996b6c6b, 0x996b6b6b, 0x996b6b6b, + 0x996b6c6b, 0x996b6c6b, 0x996b6b6b, 0x996b6b6b, 0x996b6b6b, 0x996b6b6b, 0x996b6c6b, 0x996b6d6b, + 0x996b6d6b, 0x996b6b6b, 0x996b6b6b, 0x996b6c6b, 0x996e6c6e, 0x99706f70, 0x996e6c6e, 0x99706f70, + 0x996b6f6b, 0x996b6d6b, 0x996b6f6b, 0x996b6f6b, 0x996e6d6e, 0x996e6d6e, 0x996e6d6e, 0x996e6d6e, + 0x996b7070, 0x996b6f6e, 0x996b6f6e, 0x996b6f6e, 0x996e6f6e, 0x996e6f6e, 0x996e6f6e, 0x996e6f6e, + 0x99736f6e, 0x99737070, 0x99737070, 0x99737070, 0x996e6f6e, 0x99737173, 0x99707070, 0x996e6f6e, + 0x9970706e, 0x9970706e, 0x9970706e, 0x9970706e, 0x996e6f6e, 0x996e6f6e, 0x99707070, 0x996e6f6e, + 0x996b6f70, 0x996b6f70, 0x996b6f70, 0x996b6f70, 0x996e6f6e, 0x99707070, 0x99707070, 0x996e6f6e, + 0x996e6f6e, 0x99707070, 0x996e6f6e, 0x996e6f6e, 0x996e6f6e, 0x996e6f6e, 0x99707070, 0x996e6f6e, + 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6c6b, 0x996b6c6b, 0x996b6c6b, + 0x996b6d6b, 0x996b6d6b, 0x996b6c6b, 0x996b6c6b, 0x996b6c6b, 0x996b6b6b, 0x996b6d6b, 0x996b6c6b, + 0x996b6f70, 0x996b6f70, 0x996b6c6e, 0x996b6c6e, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x99686b6b, + 0x996b696b, 0x996b696b, 0x996b696b, 0x996b696b, 0x9963656b, 0x9963656b, 0x995d6065, 0x9952555a, + 0x994a4d4a, 0x881e1f1e, 0x66080808, 0x66080808, 0x44000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x11101010, 0xccc5cac5, 0xffc5cac5, 0xffc5cac5, + 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedbd6, 0xffdedbd6, 0xffdedbd6, 0xffd6d5d3, + 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd3d0d3, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, + 0xffcecdce, 0xffced0ce, 0xffced0ce, 0xffced0ce, 0xffcecdce, 0xffcecece, 0xffcecdce, 0xffcecdce, + 0xffcecece, 0xffcecece, 0xffcecdce, 0xffcecdce, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, + 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffced0d0, 0xffcecece, 0xffced0d0, + 0xffced0ce, 0xffcecece, 0xffced0ce, 0xffced0ce, 0xffd0ced0, 0xffd0ced0, 0xffd0ced0, 0xffd0ced0, + 0xffced1d3, 0xffced0d0, 0xffced0d0, 0xffced0d0, 0xffd0d0d0, 0xffd0d0d0, 0xffd0d0d0, 0xffd0d0d0, + 0xffd6d0d0, 0xffd6d1d3, 0xffd6d1d3, 0xffd6d1d3, 0xffd0d0d0, 0xffd6d2d6, 0xffd3d1d3, 0xffd1d0d1, + 0xffd5d2d4, 0xffd7d3d6, 0xffd7d3d6, 0xffd6d3d5, 0xffd1d2d3, 0xffcecfce, 0xffcdcece, 0xffcecece, + 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, + 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, + 0xffcecece, 0xffcecece, 0xffcbcccb, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcbcacb, 0xffc5cac5, + 0xffc0c4c0, 0xffc0c4c0, 0xffb5b6b5, 0xffa5a6a5, 0xffa5a6a5, 0xaa737473, 0x11101010, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x22000000, 0x661e1e1e, 0x99656263, 0x99737173, 0x99737173, 0x99737173, + 0x99767776, 0x99767776, 0x99767776, 0x99767776, 0x99737373, 0x99737373, 0x99737373, 0x996b6c6b, + 0x996e6c6e, 0x996e6c6e, 0x99706f70, 0x99706f70, 0x996b6b6b, 0x996b6b6b, 0x996b6b6b, 0x996b6b6b, + 0x99706d70, 0x99706d70, 0x99706d70, 0x996e696e, 0x996b6b6b, 0x996b6b6b, 0x996b696b, 0x996b6b6b, + 0x996b696b, 0x996b6b6b, 0x996b696b, 0x996b6b6b, 0x996b6b6b, 0x996b6b6b, 0x996b6b6b, 0x996b6d6b, + 0x996b6c6b, 0x996b6b6b, 0x996b6c6b, 0x996b6b6b, 0x996e6c6e, 0x996e6c6e, 0x99706f70, 0x996e6c6e, + 0x996b6f6b, 0x996b6f6b, 0x996b6f6b, 0x996b6f6b, 0x996e6d6e, 0x996e6d6e, 0x996e6d6e, 0x996e6d6e, + 0x996b6f6e, 0x996b7070, 0x996b7070, 0x996b6f6e, 0x996e6f6e, 0x99707070, 0x99707070, 0x996e6f6e, + 0x99737070, 0x99737070, 0x99736f6e, 0x99736f6e, 0x996e6f6e, 0x99707070, 0x99737173, 0x996e6f6e, + 0x996e6f68, 0x996e6f68, 0x9970706e, 0x9970706e, 0x99707070, 0x996e6f6e, 0x996e6f6e, 0x996e6f6e, + 0x996b6f70, 0x996b6f70, 0x996b6f70, 0x996b706e, 0x996e6f6e, 0x99707070, 0x996e6f6e, 0x996e6f6e, + 0x996e6f6e, 0x996e6f6e, 0x996e6f6e, 0x996e6f6e, 0x996e6f6e, 0x996e6f6e, 0x996e6f6e, 0x996e6f6e, + 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6c6b, 0x996b6c6b, 0x996b6b6b, + 0x996b6d6b, 0x996b6c6b, 0x996b6b6b, 0x996b6b6b, 0x996b6c6b, 0x996b6c6b, 0x996b6c6b, 0x996b6b6b, + 0x996b6f70, 0x996b6c6e, 0x996b6c6e, 0x996b6c6e, 0x99686b6b, 0x99686b6b, 0x9965686b, 0x99686b6b, + 0x996b696b, 0x99686768, 0x99686768, 0x99686768, 0x9963656b, 0x995d6065, 0x995d6065, 0x9952555a, + 0x994a4d4a, 0x99343634, 0x77080808, 0x66080808, 0x66000000, 0x22000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x664d4e4d, 0xffc5cac5, 0xffc5cac5, 0xffc5cac5, + 0xffd9d9d9, 0xffd9d9d9, 0xffd9d9d9, 0xffd9d9d9, 0xffd6d5d3, 0xffd6d5d3, 0xffced0d0, 0xffced0d0, + 0xffd0cdd0, 0xffd0cdd0, 0xffd3d0d3, 0xffd3d0d3, 0xffcbcdcb, 0xffcbcdcb, 0xffcbcdcb, 0xffcbcdcb, + 0xffcecdce, 0xffced0ce, 0xffced0ce, 0xffcecdce, 0xffcecdce, 0xffcecdce, 0xffcecace, 0xffcecdce, + 0xffcecace, 0xffcecdce, 0xffcecace, 0xffcecdce, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, + 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffced0d0, 0xffcecece, + 0xffced0ce, 0xffced0ce, 0xffced0ce, 0xffced0ce, 0xffd0ced0, 0xffd0ced0, 0xffd0ced0, 0xffd0ced0, + 0xffced0d0, 0xffced1d3, 0xffced1d3, 0xffced0d0, 0xffd0d0d0, 0xffd3d1d3, 0xffd3d1d3, 0xffd0d0d0, + 0xffd6d1d3, 0xffd6d1d3, 0xffd6d0d0, 0xffd6d0d0, 0xffd0d0d0, 0xffd3d1d3, 0xffd3d1d3, 0xffd0d0d0, + 0xffd5d2d3, 0xffd6d3d6, 0xffd7d2d5, 0xffd6d1d5, 0xffd6d1d5, 0xffd4cfd3, 0xffd0ced0, 0xffcecece, + 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, + 0xffcecece, 0xffcecece, 0xffcecece, 0xffced2ce, 0xffcecace, 0xffcecece, 0xffcecece, 0xffcbcccb, + 0xffcbcccb, 0xffcbcccb, 0xffcbcccb, 0xffcbcacb, 0xffcbcacb, 0xffcbcacb, 0xffcbcacb, 0xffc5cac5, + 0xffc0c4c0, 0xffc0c4c0, 0xffb5b6b5, 0xffa5a6a5, 0xffa5a6a5, 0xffa5a6a5, 0x66424242, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x44000000, 0x883c3b3c, 0x99656263, 0x99656263, 0x99656263, 0x99737173, + 0x99707070, 0x99707070, 0x99707070, 0x99707070, 0x996b6c6b, 0x996b6c6b, 0x996b6c6b, 0x996b6c6b, + 0x996b696b, 0x996b696b, 0x996e6c6e, 0x996e6c6e, 0x996b6b6b, 0x996b6b6b, 0x996b686b, 0x996b6b6b, + 0x996e696e, 0x996e696e, 0x996e696e, 0x996e696e, 0x996b696b, 0x996b696b, 0x996b6b6b, 0x996b696b, + 0x996b6b6b, 0x996b6b6b, 0x996b6b6b, 0x996b6b6b, 0x996b6b6b, 0x996b6b6b, 0x996b6b6b, 0x996b6b6b, + 0x996b6b6b, 0x996b6c6b, 0x996b6c6b, 0x996b6b6b, 0x99706f70, 0x99706f70, 0x99706f70, 0x99706f70, + 0x996b6d6b, 0x996b6f6b, 0x996b6f6b, 0x996b6f6b, 0x996e6d6e, 0x996e6d6e, 0x996e6d6e, 0x996e6d6e, + 0x996b6f6e, 0x996b6f6e, 0x996b7070, 0x996b7070, 0x99707070, 0x99707070, 0x996e6f6e, 0x99707070, + 0x99736f6e, 0x99737070, 0x99736f6e, 0x99737070, 0x99707070, 0x996e6f6e, 0x99707070, 0x99707070, + 0x9970706e, 0x9970706e, 0x9970706e, 0x9970706e, 0x99707070, 0x996e6f6e, 0x99707070, 0x996e6f6e, + 0x996b706e, 0x996b706e, 0x996b6f70, 0x996b6f70, 0x996e6f6e, 0x99737173, 0x99707070, 0x99707070, + 0x99707070, 0x996e6f6e, 0x99707070, 0x996e6f6e, 0x996e6f6e, 0x996e6f6e, 0x996e6f6e, 0x996e6f6e, + 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6c6b, 0x996b6d6b, 0x996b6c6b, 0x996b6c6b, + 0x996b6c6b, 0x996b6b6b, 0x996b6d6b, 0x996b6c6b, 0x996b6b6b, 0x996b6b6b, 0x996b6b6b, 0x996b6b6b, + 0x996b6c6e, 0x996b6c6e, 0x996b6c6e, 0x996b6c6e, 0x9965686b, 0x9965686b, 0x9965686b, 0x9965686b, + 0x99686768, 0x99686768, 0x99656465, 0x99656465, 0x9963656b, 0x995d6065, 0x99585a60, 0x9952555a, + 0x994a4d4a, 0x994a4d4a, 0x881e1f1e, 0x66080808, 0x66000000, 0x44000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x11000000, 0xddc5cac5, 0xffc5cac5, 0xffc5cac5, 0xffc5cac5, + 0xffd3d4d3, 0xffd3d4d3, 0xffd3d4d3, 0xffcecece, 0xffced0d0, 0xffced0d0, 0xffced0d0, 0xffc5cace, + 0xffcecace, 0xffcecace, 0xffcecace, 0xffcecace, 0xffcbcdcb, 0xffcbcdcb, 0xffc8ccc8, 0xffcbcdcb, + 0xffcecace, 0xffcecace, 0xffcecace, 0xffcecace, 0xffcecace, 0xffcecace, 0xffcecdce, 0xffcecace, + 0xffcecdce, 0xffcecdce, 0xffcecdce, 0xffcecdce, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, + 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffced1d3, + 0xffcecece, 0xffced0ce, 0xffced0ce, 0xffced0ce, 0xffd0ced0, 0xffd0ced0, 0xffd0ced0, 0xffd0ced0, + 0xffced0d0, 0xffced0d0, 0xffced1d3, 0xffced1d3, 0xffd3d1d3, 0xffd6d2d6, 0xffd0d0d0, 0xffd3d1d3, + 0xffd6d0d0, 0xffd6d1d3, 0xffd6d0d0, 0xffd6d1d3, 0xffd3d1d3, 0xffd0d0d0, 0xffd3d1d3, 0xffd3d1d3, + 0xffd4d2d2, 0xffd6d2d6, 0xffd6d1d5, 0xffd5d1d5, 0xffd5d2d4, 0xffd2d1d2, 0xffcfcfcf, 0xffcecece, + 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, + 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcbcccb, + 0xffc8c9c8, 0xffc8c9c8, 0xffc8c9c8, 0xffcbcacb, 0xffc8c6c8, 0xffc8c6c8, 0xffc8c6c8, 0xffc0c4c0, + 0xffc0c4c0, 0xffbabdba, 0xffb5b6b5, 0xffa5a6a5, 0xffa5a6a5, 0xffa5a6a5, 0xbb737473, 0x110e0d0e, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x11000000, 0x55000000, 0x995a595a, 0x99656263, 0x99656263, 0x99656263, 0x99656263, + 0x996b696b, 0x996b696b, 0x996b696b, 0x996b696b, 0x996b6c6b, 0x996b6c6b, 0x99636563, 0x99636563, + 0x996b696b, 0x996b696b, 0x996b696b, 0x996b696b, 0x996b686b, 0x996b686b, 0x996b686b, 0x996b686b, + 0x996b656b, 0x996e696e, 0x996e696e, 0x996e696e, 0x996b696b, 0x996b696b, 0x996b696b, 0x996b696b, + 0x996b696b, 0x996b6b6b, 0x996b6b6b, 0x996b6b6b, 0x996b6b6b, 0x996b6b6b, 0x996b6b6b, 0x996b6b6b, + 0x996b6b6b, 0x996b6c6b, 0x996b6c6b, 0x996b6c6b, 0x99706f70, 0x99737173, 0x99706f70, 0x99737173, + 0x996b6f6b, 0x996b6f6b, 0x996b6f6b, 0x996b706b, 0x99706d70, 0x996e6d6e, 0x996e6d6e, 0x99706d70, + 0x996b7070, 0x996b7070, 0x996b6f6e, 0x996b6f6e, 0x99707070, 0x99707070, 0x99737173, 0x99707070, + 0x99737070, 0x99737070, 0x99737173, 0x99737173, 0x99707070, 0x99737173, 0x99707070, 0x99707070, + 0x9970706e, 0x9970706e, 0x9970706e, 0x9970706e, 0x99707070, 0x99707070, 0x99707070, 0x99707070, + 0x996b706e, 0x996b706e, 0x996b706e, 0x996b706e, 0x99707070, 0x99707070, 0x99737173, 0x99737173, + 0x99737173, 0x99707070, 0x99707070, 0x996e6f6e, 0x99707070, 0x996e6f6e, 0x996e6f6e, 0x996e6f6e, + 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6c6b, 0x996b6c6b, 0x996b6c6b, 0x996b6d6b, + 0x996b6c6b, 0x996b6d6b, 0x996b6c6b, 0x996b6c6b, 0x996b6b6b, 0x996b6b6b, 0x996b6b6b, 0x996b6b6b, + 0x996b6c6e, 0x996b696b, 0x996b696b, 0x996b696b, 0x9965686b, 0x9965686b, 0x9963656b, 0x9963656b, + 0x99656465, 0x99656465, 0x99656465, 0x99636163, 0x995d6065, 0x995d6065, 0x99585a60, 0x9952555a, + 0x994a4d4a, 0x994a4d4a, 0x99343634, 0x66080808, 0x66000000, 0x55000000, 0x11000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x44313131, 0xffc5cac5, 0xffc5cac5, 0xffc5cac5, 0xffc5cac5, + 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffc5cace, 0xffc5cace, 0xffc5cace, 0xffc5cace, + 0xffcecace, 0xffcecace, 0xffcecace, 0xffcecace, 0xffc5cac5, 0xffc5cac5, 0xffc5cac5, 0xffc5cac5, + 0xffcecace, 0xffcecace, 0xffcecace, 0xffcecace, 0xffcecace, 0xffcecace, 0xffcecace, 0xffcecace, + 0xffcecace, 0xffcecdce, 0xffcecdce, 0xffcecdce, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, + 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffced1d3, 0xffced0d0, 0xffced1d3, + 0xffced0ce, 0xffced0ce, 0xffced0ce, 0xffced2ce, 0xffd3ced3, 0xffd0ced0, 0xffd0ced0, 0xffd3ced3, + 0xffced1d3, 0xffced1d3, 0xffced0d0, 0xffced0d0, 0xffd3d1d3, 0xffd6d2d6, 0xffd6d2d6, 0xffd3d1d3, + 0xffd6d1d3, 0xffd6d1d3, 0xffd6d2d6, 0xffd6d2d6, 0xffd3d1d3, 0xffd6d2d6, 0xffd3d1d3, 0xffd6d2d6, + 0xffd6d2d6, 0xffd7d2d6, 0xffd5d3d5, 0xffd5d1d5, 0xffd3d1d2, 0xffd0d0d0, 0xffcecece, 0xffcecece, + 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, + 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecace, 0xffcecace, 0xffcecace, 0xffc8c9c8, + 0xffc8c9c8, 0xffc8c9c8, 0xffc8c9c8, 0xffc8c6c8, 0xffc8c6c8, 0xffc8c6c8, 0xffc5c2c5, 0xffc0c4c0, + 0xffbabdba, 0xffbabdba, 0xffb5b6b5, 0xffa5a6a5, 0xffa5a6a5, 0xffa5a6a5, 0xeea5a6a5, 0x44292829, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000400, 0x22000400, 0x771e201e, 0x995a595a, 0x99525452, 0x995a5a5a, 0x99636163, 0x99636163, + 0x996b696b, 0x99656568, 0x99656568, 0x99656568, 0x99636563, 0x99636563, 0x99636563, 0x99636563, + 0x99686568, 0x99656565, 0x99656565, 0x99656565, 0x996b6765, 0x996b6765, 0x996b6868, 0x996b6765, + 0x996b676b, 0x996b686b, 0x996b676b, 0x996b686b, 0x996b696b, 0x996b696b, 0x996b6b6b, 0x996b696b, + 0x996b696b, 0x996b696b, 0x996b6b6b, 0x996b6b6b, 0x996b6b6b, 0x996b6b6b, 0x996b6b6b, 0x996b6c6b, + 0x996e6f6e, 0x996b6d6b, 0x996b6d6b, 0x996e6f6e, 0x996e6f6e, 0x996e6f6e, 0x996e6f6e, 0x996e6f6e, + 0x99737173, 0x99737173, 0x99737173, 0x996e746e, 0x99737173, 0x99737373, 0x99737173, 0x99737173, + 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, + 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, + 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, + 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99707173, 0x996e7173, 0x99707173, 0x99707173, + 0x99707070, 0x99707070, 0x996e6f6e, 0x99707070, 0x99736f6e, 0x99737070, 0x99736f6e, 0x99737070, + 0x99707070, 0x996e6f6e, 0x996e6f6e, 0x996e6f6e, 0x996e6f6e, 0x996e6f6e, 0x996b6d6b, 0x996b6d6b, + 0x996b6f6e, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6b6b, 0x996b6b6b, 0x996b6b6b, 0x996b6c6b, + 0x996b696b, 0x996b696b, 0x996b696b, 0x996b696b, 0x99686868, 0x99656765, 0x99656765, 0x99636563, + 0x99636463, 0x99636463, 0x99636263, 0x99636163, 0x99636163, 0x995d5c5d, 0x995d5c5d, 0x995a595a, + 0x99525552, 0x993f423f, 0x993f423f, 0x77191c19, 0x77000000, 0x66000000, 0x11000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x88737173, 0xffbdbabd, 0xffbdbabd, 0xffc5c2c5, 0xffc5c2c5, + 0xffc5cac5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, + 0xffc5c9c5, 0xffc5c8c5, 0xffc5c9c5, 0xffc5c8c5, 0xffc5c9c5, 0xffc5c9c5, 0xffc5cac5, 0xffc5c9c5, + 0xffcecace, 0xffcecace, 0xffcecace, 0xffcecace, 0xffcecace, 0xffcecace, 0xffcecdce, 0xffcecace, + 0xffcecace, 0xffcecace, 0xffcecdce, 0xffcecdce, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, + 0xffd0d0d0, 0xffcecece, 0xffd0d0d0, 0xffd0d0d0, 0xffd0d0d0, 0xffd0d0d0, 0xffd0d0d0, 0xffd0d0d0, + 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d5d0, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, + 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d4d6, 0xffd6d2d6, 0xffd6d4d6, 0xffd6d2d6, + 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d4d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d4d6, 0xffd6d4d6, + 0xffd6d4d6, 0xffd6d3d6, 0xffd7d1d5, 0xffd5d1d4, 0xffd2d0d2, 0xffd0d0d0, 0xffd0d0d0, 0xffd0d0d0, + 0xffd0d0d0, 0xffcecece, 0xffcecece, 0xffced0d0, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, + 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecdce, 0xffcecdce, 0xffcecace, 0xffcecace, 0xffc5cac5, + 0xffc5c8c5, 0xffc5c8c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c4c5, 0xffc5c4c5, 0xffc5c2bd, + 0xffc0bdbd, 0xffc0bdbd, 0xffbdbabd, 0xffb5b6b5, 0xffadadad, 0xffa5a3a5, 0xff9c9a9c, 0x77585a58, + 0x00000400, 0x00000300, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000400, 0x33000400, 0x883c3d3c, 0x995a595a, 0x99525452, 0x99525452, 0x995a5a5a, 0x99636163, + 0x99656568, 0x99656568, 0x99656568, 0x99656568, 0x99636563, 0x99636463, 0x99636463, 0x99636463, + 0x99656565, 0x99656565, 0x99656565, 0x99656565, 0x996b6765, 0x996b6765, 0x996b6765, 0x996b6765, + 0x996b676b, 0x996b686b, 0x996b686b, 0x996b696b, 0x996b696b, 0x996b696b, 0x996b696b, 0x996b6b6b, + 0x996b6b6b, 0x996b6b6b, 0x996b6b6b, 0x996b6c6b, 0x996b6d6b, 0x996b6b6b, 0x996b6d6b, 0x996b6c6b, + 0x996e6f6e, 0x996b6d6b, 0x99707070, 0x99737173, 0x996e6f6e, 0x996e6f6e, 0x99707070, 0x99707070, + 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737373, 0x99737473, 0x99737373, 0x99737373, + 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737373, 0x99737173, 0x99737173, + 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, + 0x99737373, 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, + 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99707173, 0x99737173, 0x99737173, 0x99707173, + 0x99707070, 0x99707070, 0x99707070, 0x99707070, 0x99737070, 0x99737070, 0x99737070, 0x99737070, + 0x996e6f6e, 0x99707070, 0x99707070, 0x996e6f6e, 0x996e6f6e, 0x996e6f6e, 0x996e6f6e, 0x996b6d6b, + 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6c6b, 0x996b6b6b, 0x996b6b6b, 0x996b6c6b, + 0x996b696b, 0x996b696b, 0x996b696b, 0x996b696b, 0x99686868, 0x99656765, 0x99656765, 0x99656765, + 0x99636263, 0x99636263, 0x99636263, 0x99636163, 0x99605e60, 0x99605e60, 0x995d5c5d, 0x995a595a, + 0x99525552, 0x993f423f, 0x993f423f, 0x88191c19, 0x77030303, 0x66000000, 0x22000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0xddadaaad, 0xffb5b2b5, 0xffbdbabd, 0xffbdbabd, 0xffc5c2c5, + 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, + 0xffc5c6c5, 0xffc5c6c5, 0xffc5c8c5, 0xffc5c8c5, 0xffc5c9c5, 0xffc5c8c5, 0xffc5c9c5, 0xffc5c9c5, + 0xffcecace, 0xffcecace, 0xffcecace, 0xffcbccc8, 0xffcecace, 0xffcecace, 0xffcecace, 0xffcecdce, + 0xffcecdce, 0xffcecdce, 0xffcecdce, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, + 0xffd0d0d0, 0xffd0d0d0, 0xffd3d1d3, 0xffd3d1d3, 0xffd0d0d0, 0xffd0d0d0, 0xffd3d1d3, 0xffd3d1d3, + 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d4d6, 0xffd6d5d6, 0xffd6d4d6, 0xffd6d4d6, + 0xffd6d2d6, 0xffd6d4d6, 0xffd6d4d6, 0xffd6d4d6, 0xffd6d4d6, 0xffd6d5d6, 0xffd6d4d6, 0xffd6d4d6, + 0xffd6d4d6, 0xffd6d4d6, 0xffd6d4d6, 0xffd6d4d6, 0xffd6d4d6, 0xffd6d4d6, 0xffd6d4d6, 0xffd6d2d6, + 0xffd6d5d6, 0xffd6d4d6, 0xffd6d1d3, 0xffd1d1d1, 0xffd3d1d3, 0xffd3d1d3, 0xffd0d0d0, 0xffd0d0d0, + 0xffd0d0d0, 0xffd0d0d0, 0xffcecece, 0xffcecece, 0xffcecece, 0xffced0d0, 0xffcecece, 0xffcecece, + 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecdce, 0xffcecace, 0xffcecace, 0xffcecace, 0xffc5cac5, + 0xffc5c8c5, 0xffc5c8c5, 0xffc5c8c5, 0xffc5c5c5, 0xffc5c5c5, 0xffc5c5c5, 0xffc5c4c5, 0xffc5c2bd, + 0xffc3c0bd, 0xffc0bdbd, 0xffbdbabd, 0xffb5b6b5, 0xffadadad, 0xffa5a3a5, 0xffa5a3a5, 0xaa585a58, + 0x11000400, 0x00000300, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000400, 0x44000400, 0x993c3d3c, 0x995a595a, 0x994a4d4a, 0x99525452, 0x995a5a5a, 0x99636163, + 0x99606165, 0x99606165, 0x99656568, 0x99656568, 0x99636563, 0x99636263, 0x99636263, 0x99636263, + 0x99686568, 0x99656565, 0x99656565, 0x99656565, 0x996b6765, 0x996b6563, 0x996b6765, 0x996b6868, + 0x996b686b, 0x996b686b, 0x996b686b, 0x996b696b, 0x996b696b, 0x996b6b6b, 0x996b6b6b, 0x996b6c6b, + 0x996b6b6b, 0x996b6b6b, 0x996b6b6b, 0x996b6b6b, 0x996b6c6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, + 0x996e6f6e, 0x996e6f6e, 0x99707070, 0x99737173, 0x99707070, 0x99707070, 0x99707070, 0x99707070, + 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737573, 0x99737373, 0x99737573, + 0x99737373, 0x99737473, 0x99737373, 0x99737373, 0x99737373, 0x99737473, 0x99737173, 0x99737473, + 0x99737173, 0x99737473, 0x99737373, 0x99737373, 0x99737473, 0x99737373, 0x99737173, 0x99737173, + 0x99737373, 0x99737373, 0x99737473, 0x99737473, 0x99737173, 0x99737373, 0x99737373, 0x99737373, + 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99707173, 0x99707173, + 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, + 0x99707070, 0x99707070, 0x99707070, 0x996e6f6e, 0x99707070, 0x99707070, 0x996e6f6e, 0x996e6f6e, + 0x996b7070, 0x996b6f6e, 0x996b6f6e, 0x996b6d6b, 0x996b6d6b, 0x996b6b6b, 0x996b6b6b, 0x996b6c6b, + 0x996b696b, 0x996b696b, 0x996b696b, 0x996b696b, 0x99656765, 0x99686868, 0x99656765, 0x99656765, + 0x99636463, 0x99636263, 0x99636263, 0x99636163, 0x99605e60, 0x995d5c5d, 0x995d5c5d, 0x995a595a, + 0x99525552, 0x99525552, 0x993f423f, 0x882c2f2c, 0x77050505, 0x66000000, 0x33000000, 0x00000000, + 0x00000000, 0x00000000, 0x11000000, 0xffadaaad, 0xffb5b2b5, 0xffb5b2b5, 0xffbdbabd, 0xffc5c2c5, + 0xffc5c2c5, 0xffc5c2c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c5c5, 0xffc5c5c5, 0xffc5c5c5, + 0xffc5c8c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c8c5, 0xffc5c8c5, 0xffc5c6c5, 0xffc5c9c5, 0xffc5cac5, + 0xffcecace, 0xffcecace, 0xffcecace, 0xffcbccc8, 0xffcecace, 0xffcecdce, 0xffcecdce, 0xffcecece, + 0xffcecdce, 0xffcecdce, 0xffcecdce, 0xffcecdce, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, + 0xffd0d0d0, 0xffd0d0d0, 0xffd3d1d3, 0xffd6d2d6, 0xffd3d1d3, 0xffd6d2d6, 0xffd6d2d6, 0xffd3d1d3, + 0xffd6d4d3, 0xffd6d2d6, 0xffd6d4d3, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d7d6, 0xffd6d4d6, 0xffd6d7d6, + 0xffd6d4d6, 0xffd6d5d6, 0xffd6d5d6, 0xffd6d5d6, 0xffd6d5d6, 0xffd6d7d6, 0xffd6d4d6, 0xffd6d7d6, + 0xffd6d4d6, 0xffd6d7d6, 0xffd6d5d6, 0xffd6d5d6, 0xffd6d7d6, 0xffd6d5d6, 0xffd6d4d6, 0xffd6d4d6, + 0xffd6d5d6, 0xffd6d5d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd3d1d3, 0xffd3d1d3, 0xffd0d0d0, 0xffd3d1d3, + 0xffd3d1d3, 0xffd0d0d0, 0xffd0d0d0, 0xffced1d3, 0xffced0d0, 0xffced0d0, 0xffcecece, 0xffcecece, + 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecdce, 0xffcecace, 0xffcecace, 0xffcecace, 0xffc5c9c5, + 0xffc5cac5, 0xffc5c8c5, 0xffc5c8c5, 0xffc5c6c5, 0xffc5c5c5, 0xffc5c4c5, 0xffc5c2c5, 0xffc5c2bd, + 0xffc0bdbd, 0xffc0bdbd, 0xffbdbabd, 0xffb5b6b5, 0xffadadad, 0xffa5a3a5, 0xffa5a3a5, 0xcc848684, + 0x22000400, 0x00000300, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000400, 0x55000400, 0x993c3d3c, 0x993c3d3c, 0x994a4d4a, 0x99525452, 0x995a5a5a, 0x995a5a5a, + 0x995a5d63, 0x99606165, 0x99606165, 0x99606165, 0x99636163, 0x99636263, 0x99636463, 0x99636263, + 0x99686568, 0x99656565, 0x99656565, 0x99656565, 0x996b6563, 0x996b6868, 0x996b6765, 0x996b6868, + 0x996b696b, 0x996b696b, 0x996b696b, 0x996b696b, 0x996b696b, 0x996b6b6b, 0x996b6c6b, 0x996b6c6b, + 0x996b6c6b, 0x996b6b6b, 0x996b6c6b, 0x996b6d6b, 0x996b6c6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, + 0x996e6f6e, 0x99707070, 0x99737173, 0x99707070, 0x99737173, 0x99737173, 0x99737173, 0x99737173, + 0x99707370, 0x99707370, 0x99737173, 0x99707370, 0x99737373, 0x99737473, 0x99737173, 0x99737473, + 0x99737573, 0x99737573, 0x99737373, 0x99737373, 0x99737373, 0x99737473, 0x99737373, 0x99737473, + 0x99737573, 0x99737473, 0x99737473, 0x99737473, 0x99737473, 0x99737473, 0x99737473, 0x99737373, + 0x99737573, 0x99737373, 0x99737473, 0x99737473, 0x99737373, 0x99737573, 0x99737473, 0x99737473, + 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, + 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, + 0x99737173, 0x99737173, 0x99707070, 0x99707070, 0x99737173, 0x99737173, 0x99737173, 0x99707070, + 0x996b7070, 0x996b6f6e, 0x996b6f6e, 0x996b6f6e, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6b6b, + 0x996b696b, 0x996b696b, 0x996b696b, 0x996b696b, 0x996b696b, 0x99656765, 0x99686868, 0x99656765, + 0x99636463, 0x99636463, 0x99636263, 0x99636163, 0x99605e60, 0x99605e60, 0x995d5c5d, 0x995d5c5d, + 0x99525552, 0x99525552, 0x993f423f, 0x992c2f2c, 0x77080808, 0x77000000, 0x44000000, 0x00000000, + 0x00000000, 0x00000000, 0x443a393a, 0xffadaaad, 0xffadaaad, 0xffb5b2b5, 0xffbdbabd, 0xffbdbabd, + 0xffc5c2c5, 0xffc5c2c5, 0xffc5c2c5, 0xffc5c2c5, 0xffc5c4c5, 0xffc5c4c5, 0xffc5c6c5, 0xffc5c4c5, + 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c8c5, 0xffc5c6c5, 0xffc5cac5, 0xffc5c9c5, 0xffc5cac5, + 0xffcecace, 0xffcecace, 0xffcecace, 0xffcecace, 0xffcecace, 0xffcecdce, 0xffcecece, 0xffcecece, + 0xffcecece, 0xffcecdce, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, + 0xffd0d0d0, 0xffd3d1d3, 0xffd6d2d6, 0xffd3d1d3, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, + 0xffd6d4d3, 0xffd6d4d3, 0xffd6d2d6, 0xffd6d4d3, 0xffd6d5d6, 0xffd6d7d6, 0xffd6d4d6, 0xffd6d7d6, + 0xffd6d7d6, 0xffd6d7d6, 0xffd6d5d6, 0xffd6d5d6, 0xffd6d5d6, 0xffd6d7d6, 0xffd6d5d6, 0xffd6d7d6, + 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d4d5, + 0xffd6d7d6, 0xffd6d5d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd3d1d3, 0xffd6d2d6, 0xffd6d2d6, + 0xffd6d2d6, 0xffd6d2d6, 0xffd3d1d3, 0xffced1d3, 0xffced0d0, 0xffced0d0, 0xffced0d0, 0xffcecece, + 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecdce, 0xffcecdce, 0xffcecdce, 0xffceccce, 0xffc5cac5, + 0xffc5c9c5, 0xffc5cac5, 0xffc5c9c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c4c5, 0xffc5c4c5, 0xffc5c2bd, + 0xffc3c0bd, 0xffc0bdbd, 0xffc0bdbd, 0xffb5b6b5, 0xffadadad, 0xffa5a3a5, 0xffa5a3a5, 0xdd848684, + 0x222c2f2c, 0x00000300, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x55161716, 0x99424542, 0x99424542, 0x994a4c4a, 0x99525252, 0x995a595a, 0x995a595a, + 0x995d5e5d, 0x995d5e5d, 0x99606060, 0x99606060, 0x99636263, 0x99636263, 0x99636263, 0x99636463, + 0x99636563, 0x99636563, 0x99656765, 0x99636563, 0x996b686b, 0x996b676b, 0x996b686b, 0x996b696b, + 0x996b696b, 0x996b6b6b, 0x996b696b, 0x996b696b, 0x996e6c6e, 0x996e6c6e, 0x996e6c6e, 0x99706f70, + 0x996b6d6b, 0x996e6f6e, 0x996e6f6e, 0x996e6f6e, 0x996e6f6e, 0x99707070, 0x996e6f6e, 0x99707070, + 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737373, 0x99737373, 0x99737173, + 0x99737373, 0x99737373, 0x99737373, 0x99737373, 0x99737373, 0x99737373, 0x99737373, 0x99737573, + 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, + 0x99737573, 0x99767776, 0x99767776, 0x99767776, 0x99737573, 0x99737573, 0x99737573, 0x99737573, + 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, + 0x99737473, 0x99737473, 0x99737473, 0x99737373, 0x99737573, 0x99737473, 0x99737473, 0x99737373, + 0x99737373, 0x99737373, 0x99737473, 0x99737373, 0x99737373, 0x99737173, 0x99737173, 0x99737373, + 0x99737373, 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, + 0x99707070, 0x996e6f6e, 0x99707070, 0x996e6f6e, 0x99707070, 0x996e6f6e, 0x996e6f6e, 0x996b6d6b, + 0x996b6b6b, 0x996b6b6b, 0x996b6b6b, 0x996b6b6b, 0x996b696b, 0x996b6868, 0x996b6765, 0x996b6765, + 0x99656465, 0x99656465, 0x99656465, 0x99636163, 0x99636163, 0x99605e60, 0x995d5c5d, 0x995a595a, + 0x995a555a, 0x99524e52, 0x994a484a, 0x99424142, 0x770b0b0b, 0x77000000, 0x55000000, 0x00000000, + 0x00000000, 0x00000000, 0x44373737, 0xffa5a6a5, 0xffadaaad, 0xffb2b5b8, 0xffb5babd, 0xffb5babd, + 0xffbdc0c0, 0xffbdc0c0, 0xffbdc0c0, 0xffbdc2c5, 0xffc5c4c5, 0xffc5c4c5, 0xffc5c4c5, 0xffc5c6c5, + 0xffc5c6c5, 0xffc5c6c5, 0xffc5c8c5, 0xffc5c6c5, 0xffcecace, 0xffcecace, 0xffcecace, 0xffcecccb, + 0xffcecace, 0xffcecdce, 0xffcecace, 0xffcecace, 0xffcecece, 0xffcecece, 0xffcecece, 0xffced0d0, + 0xffd0d0d0, 0xffd0d0d0, 0xffd0d0d0, 0xffd0d0d0, 0xffd0d0d0, 0xffd3d1d3, 0xffd0d0d0, 0xffd3d1d3, + 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d4d6, 0xffd6d4d6, 0xffd6d5d6, 0xffd6d5d6, 0xffd6d4d6, + 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, + 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, + 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d8d9, 0xffd7d7d7, 0xffd8d7d8, 0xffd6d6d6, 0xffd7d6d6, + 0xffd5d8d9, 0xffd6d8d6, 0xffd6d5d6, 0xffd6d5d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d4d6, + 0xffd6d4d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d1d6, 0xffd6d1d6, 0xffd6d1d6, 0xffd6d1d6, 0xffd3d1d3, + 0xffd0d0d0, 0xffd0d0d0, 0xffcecece, 0xffcecdce, 0xffcecdce, 0xffcecdce, 0xffceccce, 0xffcecccb, + 0xffcec9c8, 0xffcec9c8, 0xffcec9c8, 0xffcbc8cb, 0xffcbc8cb, 0xffc8c5c8, 0xffc8c5c8, 0xffc5c2c5, + 0xffc3c0c3, 0xffc0bdc0, 0xffbdbabd, 0xffb5bab5, 0xffafb2af, 0xffaaaaaa, 0xffa5a2a5, 0xff9c9e9c, + 0x44343534, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x55161716, 0x99424542, 0x99424542, 0x99424542, 0x994a4c4a, 0x99525252, 0x995a595a, + 0x995a5d5a, 0x995d5e5d, 0x99636163, 0x99606060, 0x99636263, 0x99636263, 0x99636263, 0x99636463, + 0x99636563, 0x99636563, 0x99636563, 0x99656765, 0x996b676b, 0x996b686b, 0x996b686b, 0x996b696b, + 0x996b6b6b, 0x996b6b6b, 0x996b6b6b, 0x996b6b6b, 0x996e6c6e, 0x996e6c6e, 0x99706f70, 0x99706f70, + 0x996e6f6e, 0x996e6f6e, 0x996e6f6e, 0x99707070, 0x99707070, 0x99707070, 0x99707070, 0x99737173, + 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737373, + 0x99737373, 0x99737373, 0x99737573, 0x99737473, 0x99737473, 0x99737573, 0x99737473, 0x99737473, + 0x99737573, 0x99737573, 0x99767776, 0x99737573, 0x99737573, 0x99767776, 0x99767776, 0x99767776, + 0x99767776, 0x997b797b, 0x99797879, 0x99767776, 0x99737776, 0x99737776, 0x99737776, 0x99737776, + 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, + 0x99737573, 0x99737473, 0x99737473, 0x99737573, 0x99737573, 0x99737473, 0x99737473, 0x99737473, + 0x99737573, 0x99737573, 0x99737473, 0x99737573, 0x99737473, 0x99737473, 0x99737373, 0x99737473, + 0x99737373, 0x99737473, 0x99737473, 0x99737173, 0x99737373, 0x99737373, 0x99737173, 0x99737173, + 0x99737173, 0x99707070, 0x99707070, 0x996e6f6e, 0x996e6f6e, 0x996e6f6e, 0x996e6f6e, 0x996b6d6b, + 0x996b6c6b, 0x996b6b6b, 0x996b6b6b, 0x996b6b6b, 0x996b696b, 0x996b696b, 0x996b696b, 0x996b6765, + 0x99686768, 0x99656465, 0x99656465, 0x99656465, 0x99636163, 0x99605e60, 0x995d5c5d, 0x995a595a, + 0x995a555a, 0x99524e52, 0x994a484a, 0x99424142, 0x77101010, 0x77000000, 0x55000000, 0x11000000, + 0x00000000, 0x00000000, 0x55373737, 0xffa5a6a5, 0xffadaaad, 0xffafafb2, 0xffb2b5b8, 0xffb5babd, + 0xffbdbebd, 0xffbdc0c0, 0xffbdc2c5, 0xffbdc1c3, 0xffc5c4c5, 0xffc5c4c5, 0xffc5c5c5, 0xffc5c6c5, + 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c9c5, 0xffcecace, 0xffcecace, 0xffcecace, 0xffcecccb, + 0xffcecdce, 0xffcecdce, 0xffcecdce, 0xffcecdce, 0xffcecece, 0xffcecece, 0xffced0d0, 0xffced0d0, + 0xffd0d0d0, 0xffd0d0d0, 0xffd0d0d0, 0xffd3d1d3, 0xffd3d1d3, 0xffd6d2d6, 0xffd3d1d3, 0xffd6d2d6, + 0xffd6d4d6, 0xffd6d4d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d4d6, 0xffd6d4d6, 0xffd6d4d6, 0xffd6d5d6, + 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, + 0xffd6d7d6, 0xffd6d7d6, 0xffd9d8d9, 0xffd6d7d6, 0xffd6d7d6, 0xffd9d8d6, 0xffdbd9d6, 0xffd9d8d6, + 0xffd6d7d6, 0xffd6dbde, 0xffd6d9db, 0xffd7d9dc, 0xffd9d9d9, 0xffdbd8dc, 0xffdcd8dd, 0xffd9d7da, + 0xffd5d7da, 0xffd5d7d6, 0xffd5d5d6, 0xffd6d5d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d4d6, 0xffd6d5d6, + 0xffd6d4d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d4d6, 0xffd6d4d6, 0xffd6d4d6, 0xffd6d1d6, 0xffd0d0d0, + 0xffd0d0d0, 0xffd0d0d0, 0xffd0d0d0, 0xffcecece, 0xffcecdce, 0xffcecdce, 0xffcecdce, 0xffcecccb, + 0xffcecccb, 0xffcecccb, 0xffcec9c8, 0xffcbc8cb, 0xffc8c5c8, 0xffc8c5c8, 0xffc8c5c8, 0xffc5c2c5, + 0xffc3c0c3, 0xffc0bdc0, 0xffbdbabd, 0xffb5bab5, 0xffafb2af, 0xffaaaaaa, 0xffa5a2a5, 0xff9c9e9c, + 0x55343534, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x66161716, 0x99424542, 0x99424542, 0x99424542, 0x994a4c4a, 0x99525252, 0x995a595a, + 0x995a5d5a, 0x995d5e5d, 0x995d5e5d, 0x99636163, 0x99636163, 0x99636263, 0x99636463, 0x99636463, + 0x99636563, 0x99656765, 0x99656765, 0x99656765, 0x996b686b, 0x996b676b, 0x996b686b, 0x996b696b, + 0x996b6b6b, 0x996b6b6b, 0x996b6b6b, 0x996b6b6b, 0x996e6c6e, 0x99706f70, 0x99737173, 0x99706f70, + 0x996e6f6e, 0x99707070, 0x99707070, 0x99707070, 0x99707070, 0x99707070, 0x99737173, 0x99737173, + 0x99737473, 0x99737573, 0x99737373, 0x99737473, 0x99737373, 0x99737373, 0x99737473, 0x99737573, + 0x99737473, 0x99737473, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, + 0x99767776, 0x997b797b, 0x99767776, 0x99767776, 0x99767776, 0x99767776, 0x99767776, 0x997b797b, + 0x99797879, 0x99767776, 0x99767776, 0x99767776, 0x99737776, 0x99737776, 0x99737776, 0x99737776, + 0x99737773, 0x99737573, 0x99737773, 0x99737773, 0x99767773, 0x99767773, 0x99767773, 0x99767773, + 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, + 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, + 0x99737373, 0x99737573, 0x99737373, 0x99737573, 0x99737373, 0x99737473, 0x99737373, 0x99737173, + 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99707070, 0x996e6f6e, 0x996e6f6e, 0x996e6f6e, + 0x996b6d6b, 0x996b6d6b, 0x996b6b6b, 0x996b6b6b, 0x996b696b, 0x996b696b, 0x996b696b, 0x996b6868, + 0x99686768, 0x99686768, 0x99656465, 0x99656465, 0x99636163, 0x99605e60, 0x995d5c5d, 0x995d5c5d, + 0x995a555a, 0x99524e52, 0x994a484a, 0x99424142, 0x77101010, 0x77000000, 0x55000000, 0x11000000, + 0x00000000, 0x00000000, 0x66373737, 0xffa5a6a5, 0xffadaaad, 0xffafafb2, 0xffb5babd, 0xffb5babd, + 0xffbdbebd, 0xffbdc0c0, 0xffbdc0c0, 0xffbdc2c5, 0xffc5c4c5, 0xffc5c4c5, 0xffc5c6c5, 0xffc5c6c5, + 0xffc5c6c5, 0xffc5c8c5, 0xffc5c9c5, 0xffc5c9c5, 0xffcecace, 0xffcecace, 0xffcecace, 0xffcecccb, + 0xffcecdce, 0xffcecdce, 0xffcecdce, 0xffcecdce, 0xffcecece, 0xffcecece, 0xffced1d3, 0xffced0d0, + 0xffd0d0d0, 0xffd3d1d3, 0xffd3d1d3, 0xffd6d2d6, 0xffd3d1d3, 0xffd3d1d3, 0xffd6d2d6, 0xffd6d2d6, + 0xffd6d5d6, 0xffd6d7d6, 0xffd6d5d6, 0xffd6d7d6, 0xffd6d5d6, 0xffd6d5d6, 0xffd6d7d6, 0xffd6d7d6, + 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d8d6, 0xffd6d7d6, 0xffd6d8d6, 0xffd6d9d6, + 0xffd9d8d9, 0xffdbd9db, 0xffd9d8d9, 0xffdbd9db, 0xffdbd9d6, 0xffdbd9d6, 0xffdbd9d6, 0xffdedbd6, + 0xffd6d9db, 0xffd6d8d9, 0xffd6d9db, 0xffd7d8dc, 0xffd9dadb, 0xffdbdadc, 0xffdcd8dc, 0xffdcd8dc, + 0xffdcd7dc, 0xffdad7da, 0xffd8d8d7, 0xffd6d5d6, 0xffd6d7d6, 0xffd6d5d6, 0xffd6d7d6, 0xffd6d5d6, + 0xffd6d5d6, 0xffd6d5d6, 0xffd6d4d6, 0xffd6d4d6, 0xffd6d4d6, 0xffd6d4d6, 0xffd6d4d6, 0xffd3d1d3, + 0xffd0d0d0, 0xffd0d0d0, 0xffd0d0d0, 0xffcecece, 0xffcecece, 0xffcecdce, 0xffcecdce, 0xffcecccb, + 0xffcecccb, 0xffcecccb, 0xffcec9c8, 0xffcecace, 0xffcbc8cb, 0xffcbc8cb, 0xffc8c5c8, 0xffc5c2c5, + 0xffc5c2c5, 0xffc0bdc0, 0xffc0bdc0, 0xffb5bab5, 0xffafb2af, 0xffaaaaaa, 0xffa5a2a5, 0xff9c9e9c, + 0x55343534, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x66161716, 0x99424542, 0x99424542, 0x99424542, 0x994a4c4a, 0x99525252, 0x995a595a, + 0x995a5d5a, 0x995d5e5d, 0x995d5e5d, 0x99606060, 0x99636163, 0x99636263, 0x99636263, 0x99636463, + 0x99636563, 0x99656765, 0x99686868, 0x99686868, 0x996b686b, 0x996b686b, 0x996b696b, 0x996b696b, + 0x996b6b6b, 0x996b6c6b, 0x996b6c6b, 0x996b6c6b, 0x99706f70, 0x99706f70, 0x99706f70, 0x99706f70, + 0x99707070, 0x99707070, 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, + 0x99737473, 0x99737573, 0x99737473, 0x99737373, 0x99737573, 0x99737573, 0x99737573, 0x99737573, + 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, + 0x99797879, 0x997b797b, 0x99767776, 0x99767776, 0x99767776, 0x99767776, 0x99797879, 0x99767776, + 0x99767776, 0x99767776, 0x99767776, 0x997b797b, 0x99737776, 0x99737879, 0x99737776, 0x99737776, + 0x99737973, 0x99737773, 0x99737973, 0x99737973, 0x997b7973, 0x99767773, 0x99767773, 0x997b7973, + 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, + 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, + 0x99737573, 0x99737473, 0x99737573, 0x99737473, 0x99737573, 0x99737573, 0x99737373, 0x99737373, + 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99707070, 0x99707070, 0x996e6f6e, + 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6c6b, 0x996b696b, 0x996b696b, 0x996b696b, 0x996b696b, + 0x99686768, 0x99686768, 0x99656465, 0x99656465, 0x99636163, 0x99636163, 0x995d5c5d, 0x995d5c5d, + 0x995a555a, 0x99524e52, 0x994a484a, 0x99424142, 0x77101010, 0x77000000, 0x66000000, 0x11000000, + 0x00000000, 0x00000000, 0x776e6f6e, 0xffa5a6a5, 0xffadaaad, 0xffafafb2, 0xffb2b5b8, 0xffb5babd, + 0xffbdbebd, 0xffbdc0c0, 0xffbdc0c0, 0xffbdc1c3, 0xffc5c4c5, 0xffc5c4c5, 0xffc5c5c5, 0xffc5c6c5, + 0xffc5c6c5, 0xffc5c8c5, 0xffc5cac5, 0xffc5cac5, 0xffcecace, 0xffcecace, 0xffcecccb, 0xffcecccb, + 0xffcecdce, 0xffcecece, 0xffcecece, 0xffcecece, 0xffced0d0, 0xffced0d0, 0xffced1d3, 0xffced1d3, + 0xffd3d1d3, 0xffd3d1d3, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, + 0xffd6d5d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d5d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, + 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d8d6, 0xffd6d9d6, 0xffd6d9d6, 0xffd6d8d6, + 0xffdbd9db, 0xffdedbde, 0xffdbd9db, 0xffdbd9db, 0xffdbd9d6, 0xffdbd9d6, 0xffdedbd6, 0xffdbd9d6, + 0xffd6d9db, 0xffd6d9db, 0xffd6dadb, 0xffd7dade, 0xffdadbdb, 0xffdbdadc, 0xffdbd8dc, 0xffdcd8dc, + 0xffdcdadc, 0xffd9dad9, 0xffd7d8d7, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, + 0xffd6d7d6, 0xffd6d5d6, 0xffd6d5d6, 0xffd6d4d6, 0xffd6d4d6, 0xffd6d4d6, 0xffd6d4d6, 0xffd6d2d6, + 0xffd3d1d3, 0xffd3d1d3, 0xffd0d0d0, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecccb, + 0xffcecccb, 0xffcecccb, 0xffcecccb, 0xffcecace, 0xffcbc8cb, 0xffcbc8cb, 0xffc8c5c8, 0xffc5c2c5, + 0xffc5c2c5, 0xffc0bdc0, 0xffc0bdc0, 0xffb5bab5, 0xffafb2af, 0xffaaaaaa, 0xffa5a2a5, 0xff9c9e9c, + 0x66343534, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x11000000, 0x66161616, 0x99424142, 0x99424142, 0x994a454a, 0x99504c50, 0x995a595a, 0x995a595a, + 0x995d5c5d, 0x99605e60, 0x99605e60, 0x99605e60, 0x99636163, 0x99636263, 0x99636463, 0x99636563, + 0x996b656b, 0x996b676b, 0x996b686b, 0x996b686b, 0x996b696b, 0x996b696b, 0x996b696b, 0x996b6b6b, + 0x996e6c6b, 0x996e6c6b, 0x99706f6b, 0x996e6c6b, 0x996e7070, 0x996e7070, 0x99686f6e, 0x99737173, + 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737373, 0x99737473, 0x99737473, 0x99737473, + 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99767776, 0x99767776, 0x99767776, 0x99767776, + 0x99767776, 0x99767776, 0x99767776, 0x99767776, 0x99767876, 0x99767876, 0x99767876, 0x99767876, + 0x997b7979, 0x997b7d7b, 0x997b7576, 0x997b7979, 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b, + 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b, + 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b, 0x99767876, 0x99797b79, 0x99767876, 0x99767876, + 0x997b787b, 0x997b787b, 0x997b787b, 0x997b787b, 0x99767876, 0x99767876, 0x99767876, 0x99767876, + 0x99767876, 0x99767876, 0x99767876, 0x99767876, 0x99767776, 0x99767776, 0x99767776, 0x99767776, + 0x99767776, 0x99767776, 0x99767776, 0x99737573, 0x99737776, 0x99737573, 0x99737573, 0x99737573, + 0x99737473, 0x99737373, 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737173, + 0x996e6f6e, 0x996e6f6e, 0x996e6f6e, 0x996b6d6b, 0x996b6c6b, 0x996b6c6b, 0x996b6b6b, 0x996b696b, + 0x99656865, 0x99656865, 0x99636563, 0x99636563, 0x99606160, 0x99606160, 0x995d5d5d, 0x995d5d5d, + 0x995a555a, 0x99524e52, 0x994a484a, 0x99424142, 0x77101410, 0x77000000, 0x66000000, 0x11000000, + 0x00000000, 0x00000000, 0x77686968, 0xff9c9e9c, 0xffa5aaa5, 0xffadb1ad, 0xffb5b7b5, 0xffb5b7b5, + 0xffbdbebd, 0xffc0c0c0, 0xffc3c1c3, 0xffc3c1c3, 0xffc5c2c5, 0xffc8c5c5, 0xffc8c5c5, 0xffcbc8c5, + 0xffc5c6c5, 0xffc8c9c8, 0xffc8c9c8, 0xffc8c9c8, 0xffcecace, 0xffcecace, 0xffcecace, 0xffcecdce, + 0xffcecece, 0xffcecece, 0xffd0d0d0, 0xffcecece, 0xffd0d1d0, 0xffd0d1d0, 0xffd0d1d0, 0xffd3d4d3, + 0xffd6d4d6, 0xffd6d2d6, 0xffd6d4d6, 0xffd6d4d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, + 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d8d6, 0xffd6d8d6, 0xffd6d9d6, 0xffd6d8d6, + 0xffd9d9d9, 0xffd9d9d9, 0xffd9d9d9, 0xffd9d9d9, 0xffd6dbd6, 0xffd6dbd6, 0xffd9dcd9, 0xffd6dbd6, + 0xffdedbde, 0xffdeddde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedcde, 0xffdedbde, 0xffdedbde, + 0xffdedbde, 0xffdedbde, 0xffdedade, 0xffdcdcdd, 0xffdbdbdc, 0xffdbdbdc, 0xffdbdbdc, 0xffdcdadc, + 0xffdcdadd, 0xffdcdadc, 0xffd9d9d9, 0xffd8d9db, 0xffd9d8d9, 0xffdbd9db, 0xffd9d8d9, 0xffd6d9d6, + 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d5d6, 0xffd6d5d6, 0xffd6d5d6, 0xffd6d5d6, 0xffd6d4d6, + 0xffd6d4d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd0d0d0, 0xffd0d0d0, 0xffd0d0d0, 0xffcecece, 0xffcecece, + 0xffcecece, 0xffcecdd0, 0xffceccd3, 0xffcbcccb, 0xffc8c9c8, 0xffc8c9c8, 0xffc5c6c5, 0xffc5c6c5, + 0xffc3c2c3, 0xffc0bec0, 0xffc0bec0, 0xffbdbab5, 0xffb5b2af, 0xffadaaaa, 0xffa5a2a5, 0xff9c9e9c, + 0x66343734, 0x00000300, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x11000000, 0x66161616, 0x99424142, 0x99424142, 0x994a454a, 0x99504c50, 0x99555255, 0x995a595a, + 0x995d5c5d, 0x99605e60, 0x99605e60, 0x99636163, 0x99636263, 0x99636263, 0x99636563, 0x99636563, + 0x996b676b, 0x996b686b, 0x996b676b, 0x996b696b, 0x996b6b6b, 0x996b6b6b, 0x996b6b6b, 0x996b6b6b, + 0x99706f6b, 0x996e6c6b, 0x99706f6b, 0x99706f6b, 0x996e7070, 0x996e7070, 0x996e7070, 0x996e7070, + 0x99737173, 0x99737373, 0x99737173, 0x99737473, 0x99737373, 0x99737373, 0x99737573, 0x99737573, + 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99767776, 0x99767776, 0x99767776, 0x99767776, + 0x99767776, 0x99767776, 0x99767776, 0x99767776, 0x99767876, 0x99767876, 0x99767876, 0x99797b79, + 0x997b7979, 0x997b7979, 0x997b7979, 0x997b7979, 0x997b797b, 0x997b797b, 0x997b797b, 0x997b7b7b, + 0x997b797b, 0x997b797b, 0x997b7b7b, 0x997b7c7b, 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b, + 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b, 0x99797b79, 0x99797b79, 0x99797b79, 0x99797b79, + 0x997b787b, 0x997b787b, 0x997b787b, 0x997b787b, 0x99797b79, 0x99767876, 0x99767876, 0x99797b79, + 0x99797b79, 0x99767876, 0x99767876, 0x99767876, 0x997b797b, 0x99797879, 0x997b797b, 0x99797879, + 0x99767776, 0x99767776, 0x99767776, 0x99767776, 0x99737776, 0x99737776, 0x99737776, 0x99737573, + 0x99737573, 0x99737573, 0x99737473, 0x99737373, 0x99737173, 0x99737373, 0x99737173, 0x99737173, + 0x99707070, 0x99737173, 0x99707070, 0x996e6f6e, 0x996b6c6b, 0x996b6d6b, 0x996b6c6b, 0x996b6b6b, + 0x99686b68, 0x99656865, 0x99656865, 0x99636563, 0x99636563, 0x99606160, 0x99606160, 0x995a595a, + 0x995a555a, 0x99524e52, 0x994a484a, 0x99424142, 0x77101410, 0x77000000, 0x66000000, 0x11000000, + 0x00000000, 0x00000000, 0x88686968, 0xff9c9e9c, 0xffa5aaa5, 0xffadb1ad, 0xffb5b7b5, 0xffb5b7b5, + 0xffbdbebd, 0xffc0c0c0, 0xffc0c0c0, 0xffc5c2c5, 0xffc8c5c5, 0xffc8c5c5, 0xffcbc8c5, 0xffcbc8c5, + 0xffc8c9c8, 0xffc8c9c8, 0xffc8c9c8, 0xffcbcccb, 0xffcecdce, 0xffcecdce, 0xffcecdce, 0xffcecdce, + 0xffd0d0d0, 0xffcecece, 0xffd0d0d0, 0xffd0d0d0, 0xffd0d1d0, 0xffd0d1d0, 0xffd0d1d0, 0xffd0d1d0, + 0xffd6d2d6, 0xffd6d5d6, 0xffd6d4d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, + 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d8d6, 0xffd6d8d6, 0xffd6d9d6, 0xffd6d9d6, 0xffd6d9d6, + 0xffd9d9d9, 0xffd9d9d9, 0xffd9d9d9, 0xffd9d9d9, 0xffd6dbd6, 0xffd9dcd9, 0xffd9dcd9, 0xffd9dcd9, + 0xffdedbde, 0xffdedcde, 0xffdedcde, 0xffdedcde, 0xffdedcde, 0xffdedcde, 0xffdedbde, 0xffdeddde, + 0xffdedcde, 0xffdedcde, 0xffdddddd, 0xffdbdddd, 0xffdbdddc, 0xffdbdddc, 0xffdddbdd, 0xffdedbde, + 0xffdfdbdf, 0xffe0dbdf, 0xffdcdadc, 0xffd7dadc, 0xffd8d9d9, 0xffdad9da, 0xffdbd9db, 0xffd6d9d6, + 0xffd6d9d6, 0xffd6d8d6, 0xffd6d7d6, 0xffd6d8d6, 0xffd6d8d6, 0xffd6d5d6, 0xffd6d5d6, 0xffd6d4d6, + 0xffd6d5d6, 0xffd6d4d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd3d1d3, 0xffd0d0d0, 0xffcecece, + 0xffcecece, 0xffcecece, 0xffcecdd0, 0xffcbcccb, 0xffcbcccb, 0xffc8c9c8, 0xffc5c6c5, 0xffc5c6c5, + 0xffc3c2c3, 0xffc3c2c3, 0xffbdbabd, 0xffbdbab5, 0xffb5b2af, 0xffadaaaa, 0xffa5a2a5, 0xff9c9e9c, + 0x66343734, 0x00000300, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x11000000, 0x77161616, 0x99424142, 0x99424142, 0x994a454a, 0x99504c50, 0x99555255, 0x995a595a, + 0x995d5c5d, 0x99605e60, 0x99636163, 0x99636163, 0x99636463, 0x99636563, 0x99636563, 0x99636563, + 0x996b676b, 0x996b676b, 0x996b696b, 0x996b696b, 0x996b6b6b, 0x996b6b6b, 0x996b6c6b, 0x996b6d6b, + 0x99706f6b, 0x99706f6b, 0x99706f6b, 0x99706f6b, 0x996e7070, 0x996e7070, 0x99737173, 0x99737173, + 0x99737373, 0x99737373, 0x99737373, 0x99737373, 0x99737473, 0x99737473, 0x99737573, 0x99737573, + 0x99737573, 0x99737573, 0x99737773, 0x99737773, 0x99767776, 0x99767776, 0x99767776, 0x99767776, + 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b, 0x99767876, 0x99797b79, 0x99797b79, 0x99797b79, + 0x997b7979, 0x997b7979, 0x997b7979, 0x997b7979, 0x997b797b, 0x997b7c7b, 0x997b7c7b, 0x997b7b7b, + 0x997b7b7b, 0x997b7b7b, 0x997b7b7b, 0x997b7c7b, 0x997b7b7b, 0x997b7d7b, 0x997b7c7b, 0x997b7c7b, + 0x997e7c7b, 0x997e7c7b, 0x99817f7b, 0x997e7c7b, 0x99797b79, 0x99797b79, 0x997b7d7b, 0x997b7d7b, + 0x997b7b7b, 0x997b7b7b, 0x997b7b7b, 0x997b7b7b, 0x99797b79, 0x99797b79, 0x99797b79, 0x99797b79, + 0x99797b79, 0x99767876, 0x99797b79, 0x99797b79, 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b, + 0x997b797b, 0x997b797b, 0x997b797b, 0x99767776, 0x99737776, 0x99737776, 0x99737776, 0x99737776, + 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737373, 0x99737473, 0x99737173, 0x99737173, + 0x99737173, 0x99737173, 0x99707070, 0x99707070, 0x996b6d6b, 0x996b6c6b, 0x996b6c6b, 0x996b6b6b, + 0x99686b68, 0x99656865, 0x99656865, 0x99656865, 0x99636563, 0x99606160, 0x995d5d5d, 0x995d5d5d, + 0x995a555a, 0x99524e52, 0x994a484a, 0x99424142, 0x77101410, 0x77000000, 0x66000000, 0x11000000, + 0x00000000, 0x00000000, 0x99686968, 0xff9c9e9c, 0xffa5aaa5, 0xffadb1ad, 0xffb5b7b5, 0xffbdbebd, + 0xffbdbebd, 0xffc0c0c0, 0xffc5c2c5, 0xffc5c2c5, 0xffc8c5c5, 0xffcbc8c5, 0xffcbc8c5, 0xffcbc8c5, + 0xffc8c9c8, 0xffc8c9c8, 0xffcbcccb, 0xffcbcccb, 0xffcecdce, 0xffcecdce, 0xffcecece, 0xffcecece, + 0xffd0d0d0, 0xffd0d0d0, 0xffd3d1d3, 0xffd3d1d3, 0xffd0d1d0, 0xffd0d1d0, 0xffd3d4d3, 0xffd3d4d3, + 0xffd6d5d6, 0xffd6d5d6, 0xffd6d5d6, 0xffd6d5d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, + 0xffd6d7d6, 0xffd6d8d6, 0xffd6d9d6, 0xffd6d9d6, 0xffd6d9d6, 0xffd6d9d6, 0xffd6d9d6, 0xffd6d9d6, + 0xffdbdcdb, 0xffdbdcdb, 0xffdbdcdb, 0xffdbdcdb, 0xffd9dcd9, 0xffd9dcd9, 0xffd9dcd9, 0xffdbdddb, + 0xffdedcde, 0xffdeddde, 0xffdedcde, 0xffdedcde, 0xffdedcde, 0xffdedfde, 0xffdedfde, 0xffdeddde, + 0xffdeddde, 0xffdeddde, 0xffe1dee1, 0xffdfdedf, 0xffdddfdd, 0xffdddddc, 0xffdddcdd, 0xffdddfe0, + 0xffdfdedf, 0xffdfdcdf, 0xffdfdcdf, 0xffdfdbdf, 0xffdfdbde, 0xffdfdbdf, 0xffdcd9dc, 0xffd6d9d6, + 0xffd6d9d6, 0xffd6d9d6, 0xffd6d8d6, 0xffd6d8d6, 0xffd6d8d6, 0xffd6d8d6, 0xffd6d8d6, 0xffd6d5d6, + 0xffd6d7d6, 0xffd6d4d6, 0xffd6d4d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd3d1d3, 0xffd3d1d3, 0xffcecece, + 0xffcecece, 0xffcecece, 0xffcecdd0, 0xffcbcccb, 0xffc8c9c8, 0xffc8c9c8, 0xffc8c9c8, 0xffc5c6c5, + 0xffc3c2c3, 0xffc3c2c3, 0xffc0bec0, 0xffbdbab5, 0xffb5b2af, 0xffadaaaa, 0xffa5a2a5, 0xff9c9e9c, + 0x66343734, 0x00000300, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x11000000, 0x77161616, 0x99424142, 0x99424142, 0x994a454a, 0x99504c50, 0x995a595a, 0x995a595a, + 0x99605e60, 0x99605e60, 0x99636163, 0x99636163, 0x99636563, 0x99636563, 0x99636563, 0x99636563, + 0x996b676b, 0x996b686b, 0x996b696b, 0x996b696b, 0x996b6c6b, 0x996b6b6b, 0x996b6c6b, 0x996b6d6b, + 0x99706f6b, 0x99706f6b, 0x99706f6b, 0x9973716b, 0x99737173, 0x99737173, 0x99737173, 0x99737173, + 0x99737173, 0x99737473, 0x99737473, 0x99737473, 0x99737473, 0x99737573, 0x99737573, 0x99737573, + 0x99737773, 0x99737773, 0x99737773, 0x99737973, 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b, + 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b, 0x99797b79, 0x99797b79, 0x99797b79, 0x997b7d7b, + 0x997b7979, 0x997b7d7b, 0x997b7979, 0x997b7d7b, 0x997b7c7b, 0x997b7c7b, 0x997b7c7b, 0x997b7d7b, + 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7c7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, + 0x997e7c7b, 0x99817f7b, 0x99817f7b, 0x997e7c7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x99797b79, + 0x997b7d7b, 0x997b7b7b, 0x997b7d7b, 0x997b7b7b, 0x99797b79, 0x99797b79, 0x99797b79, 0x99797b79, + 0x997b7d7b, 0x99797b79, 0x997b7d7b, 0x99797b79, 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b, + 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b, 0x9973797b, 0x99737776, 0x99737776, 0x99737776, + 0x99737573, 0x99737573, 0x99737573, 0x99737473, 0x99737573, 0x99737473, 0x99737373, 0x99737173, + 0x99737173, 0x99737173, 0x99737173, 0x99707070, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6b6b, + 0x996b6d6b, 0x99686b68, 0x99656865, 0x99656865, 0x99636563, 0x99606160, 0x99606160, 0x995d5d5d, + 0x995a555a, 0x99524e52, 0x994a484a, 0x99424142, 0x77101410, 0x77000000, 0x66000000, 0x11000000, + 0x00000000, 0x00000000, 0x88686968, 0xff9c9e9c, 0xffa5aaa5, 0xffadb1ad, 0xffb5b7b5, 0xffbdbebd, + 0xffc0c0c0, 0xffc0c0c0, 0xffc3c1c3, 0xffc5c2c5, 0xffc8c5c5, 0xffcbc8c5, 0xffcbc8c5, 0xffcbc8c5, + 0xffc8c9c8, 0xffc8c9c8, 0xffcbcccb, 0xffcbcccb, 0xffcecece, 0xffcecdce, 0xffcecece, 0xffcecece, + 0xffd0d0d0, 0xffd3d1d3, 0xffd0d0d0, 0xffd3d1d3, 0xffd3d4d3, 0xffd3d4d3, 0xffd3d4d3, 0xffd3d4d3, + 0xffd6d4d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d8d6, 0xffd6d8d6, 0xffd6d9d6, + 0xffd6d9d6, 0xffd6d9d6, 0xffd6d9d6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, + 0xffdbdcdb, 0xffdbdcdb, 0xffdbdcdb, 0xffdbdcdb, 0xffd9dcd9, 0xffd9dcd9, 0xffdbdddb, 0xffdedfde, + 0xffdeddde, 0xffdedfde, 0xffdeddde, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedfde, + 0xffdedfde, 0xffdfdee0, 0xffe1dfe1, 0xffe2dfe2, 0xffe2dfe2, 0xffe4dfe4, 0xffe2dee1, 0xffdddee2, + 0xffdedddf, 0xffdedcdf, 0xffdedcdf, 0xffdfdedf, 0xffdfdede, 0xffdedede, 0xffdedbde, 0xffd5dbd5, + 0xffd6d9d6, 0xffd6d9d6, 0xffd6d8d6, 0xffd6d8d6, 0xffd6d8d6, 0xffd6d8d6, 0xffd6d5d6, 0xffd6d7d6, + 0xffd6d7d6, 0xffd6d5d6, 0xffd6d4d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, 0xffcecece, + 0xffcecece, 0xffcecece, 0xffcecdd0, 0xffcecece, 0xffcbcccb, 0xffcbcccb, 0xffc8c9c8, 0xffc5c6c5, + 0xffc3c2c3, 0xffc3c2c3, 0xffc0bec0, 0xffbdbab5, 0xffb5b2af, 0xffadaaaa, 0xffa5a2a5, 0xff9c9e9c, + 0x66343734, 0x00000300, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x11000000, 0x66161616, 0x99424142, 0x99424142, 0x994a454a, 0x99504c50, 0x99555255, 0x995a595a, + 0x995a5d5a, 0x995d605d, 0x99606260, 0x99606260, 0x99656465, 0x99686768, 0x99686768, 0x99686768, + 0x996b696b, 0x996b6b6b, 0x996b6b6b, 0x996b6c6b, 0x996b6d6b, 0x996e6f6e, 0x996b6d6b, 0x996e6f6e, + 0x99737173, 0x996e6f73, 0x99707073, 0x99707073, 0x99737373, 0x99737173, 0x99737473, 0x99737473, + 0x99737573, 0x99737573, 0x99737776, 0x99737776, 0x99767776, 0x99767776, 0x99767776, 0x99767776, + 0x997b7876, 0x997b7876, 0x997b7876, 0x997b7876, 0x997b797b, 0x997b797b, 0x997b7b7b, 0x997b797b, + 0x997b7d7b, 0x997b797b, 0x997b797b, 0x997b797b, 0x997e7c7e, 0x997e7c7e, 0x997e7c7e, 0x997e7c7e, + 0x997e807e, 0x99818381, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997e7f7e, 0x997b7d7b, 0x997b7d7b, + 0x997b7d7b, 0x997e7f7e, 0x997e7f7e, 0x997e7f7e, 0x997e807e, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, + 0x997b7d7b, 0x997b7d7b, 0x997e7f7e, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, + 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, + 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, + 0x997b7c7b, 0x997b797b, 0x997b797b, 0x997b797b, 0x99797b79, 0x99767876, 0x99767876, 0x99767876, + 0x99767776, 0x99767776, 0x99767776, 0x99767776, 0x99737573, 0x99737573, 0x99737573, 0x99737373, + 0x99737373, 0x99737173, 0x99737173, 0x99737173, 0x99707070, 0x99707070, 0x996e6f6e, 0x996e6f6e, + 0x996b6c6b, 0x996b6b6b, 0x996b696b, 0x996b696b, 0x99636563, 0x99606160, 0x995d5d5d, 0x995d5d5d, + 0x995a5552, 0x99524e4d, 0x99424142, 0x99424142, 0x77101010, 0x77000000, 0x66000000, 0x11000000, + 0x00000400, 0x00000400, 0x886e6d6e, 0xffa5a2a5, 0xffa5aaa5, 0xffadb1ad, 0xffb5b7b5, 0xffbdbebd, + 0xffc0c1c0, 0xffc0c1c0, 0xffc3c4c3, 0xffc3c4c3, 0xffc5c6c5, 0xffc8c9c8, 0xffc8c9c8, 0xffc8c9c8, + 0xffcecace, 0xffcecdce, 0xffcecdce, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffced0d0, + 0xffd0d1d6, 0xffd0d1d6, 0xffd0d1d6, 0xffd0d1d6, 0xffd6d5d6, 0xffd6d5d6, 0xffd6d5d6, 0xffd6d5d6, + 0xffd6d7d6, 0xffd6d7d6, 0xffd6d8d6, 0xffd6d8d6, 0xffd9d9d9, 0xffd9d9d9, 0xffd9d9d9, 0xffd9d9d9, + 0xffdedbd6, 0xffdedbd6, 0xffdedcd9, 0xffdedcd9, 0xffdedcde, 0xffdedbde, 0xffdeddde, 0xffdedcde, + 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedfde, + 0xffe1e0e1, 0xffe6e3e6, 0xffe1e0e1, 0xffdedfde, 0xffdedfde, 0xffe1e1e1, 0xffe1e1e1, 0xffdddfdd, + 0xffe1dfe1, 0xffe3e0e3, 0xffe4e1e4, 0xffe3e0e3, 0xffe4e1e4, 0xffe4dfe4, 0xffe5dfe4, 0xffe5dee5, + 0xffe6dfe5, 0xffe6dfe5, 0xffe4dfe3, 0xffe0dee0, 0xffdfdedf, 0xffdfdede, 0xffdededf, 0xffdedcdb, + 0xffdedcdb, 0xffdedcdb, 0xffdedbde, 0xffd9d8d9, 0xffdbd9db, 0xffd9d8d9, 0xffd9d8d9, 0xffd6d7d6, + 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d5d6, 0xffd6d4d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd0d1d0, + 0xffd0d1d0, 0xffd0d1d0, 0xffd0d1d0, 0xffcecece, 0xffcecdce, 0xffcecace, 0xffcecace, 0xffc5c6c5, + 0xffc5c6c5, 0xffc0c1c0, 0xffbdbebd, 0xffb5b6b5, 0xffafafaf, 0xffaaa9aa, 0xffa5a2a5, 0xff9c9a9c, + 0x55343334, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x66161616, 0x99424142, 0x99424142, 0x994a454a, 0x99504c50, 0x99555255, 0x995a595a, + 0x995a5d5a, 0x995d605d, 0x99606260, 0x99636563, 0x99656465, 0x99656465, 0x99686768, 0x996b696b, + 0x996b6b6b, 0x996b6c6b, 0x996b6c6b, 0x996b6c6b, 0x99737173, 0x99707070, 0x99707070, 0x99737173, + 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737373, 0x99737373, 0x99737473, 0x99737473, + 0x99737573, 0x99737573, 0x99737776, 0x99737879, 0x99797879, 0x99767776, 0x99767776, 0x99767776, + 0x997b7b79, 0x997b7876, 0x997b7876, 0x997b7876, 0x997b797b, 0x997b797b, 0x997b7c7b, 0x997b7c7b, + 0x997b797b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x99817f81, 0x997e7c7e, 0x997e7c7e, 0x997e7c7e, + 0x997e807e, 0x997e807e, 0x997b7d7b, 0x997b7d7b, 0x997e7f7e, 0x997e7f7e, 0x99818081, 0x997e7f7e, + 0x99818081, 0x99818081, 0x99848284, 0x99848284, 0x997e807e, 0x997e807e, 0x997e807e, 0x997e807e, + 0x99818081, 0x997e7f7e, 0x997e7f7e, 0x99818081, 0x997e7f7e, 0x997e7f7e, 0x997e7f7e, 0x997e7f7e, + 0x997e7f7e, 0x997e7f7e, 0x997e7f7e, 0x997e7f7e, 0x997b7d7b, 0x997e807e, 0x997e807e, 0x997e807e, + 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, + 0x997b7c7b, 0x997b7b7b, 0x997b797b, 0x997b7b7b, 0x99797b79, 0x99797b79, 0x99767876, 0x99767876, + 0x99797879, 0x99767776, 0x99767776, 0x99767776, 0x99737573, 0x99737573, 0x99737573, 0x99737573, + 0x99737473, 0x99737173, 0x99737173, 0x99737173, 0x99707070, 0x99707070, 0x996e6f6e, 0x996e6f6e, + 0x996b6c6b, 0x996b6c6b, 0x996b6b6b, 0x996b696b, 0x99636563, 0x99636563, 0x99606160, 0x995d5d5d, + 0x995a5552, 0x99524e4d, 0x994a4847, 0x99424142, 0x77101010, 0x77000000, 0x66000000, 0x11000000, + 0x00000400, 0x00000400, 0x776e6d6e, 0xffa5a2a5, 0xffa5aaa5, 0xffadb1ad, 0xffb5b7b5, 0xffbdbebd, + 0xffc0c1c0, 0xffc0c1c0, 0xffc3c4c3, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc8c9c8, 0xffcbcccb, + 0xffceccce, 0xffcecdce, 0xffcecece, 0xffcecece, 0xffced1d3, 0xffced1d3, 0xffced1d3, 0xffced2d6, + 0xffd3d4d6, 0xffd3d4d6, 0xffd3d4d6, 0xffd3d4d6, 0xffd6d5d6, 0xffd6d5d6, 0xffd6d5d6, 0xffd6d5d6, + 0xffd6d7d6, 0xffd6d7d6, 0xffd6d8d6, 0xffd6dbd6, 0xffd9d9d9, 0xffd9d9d9, 0xffd9d9d9, 0xffd9d9d9, + 0xffdedcd9, 0xffdedcd9, 0xffdedcd9, 0xffdedcd9, 0xffdedcde, 0xffdedcde, 0xffdedfde, 0xffdedfde, + 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdee0de, 0xffdedfde, 0xffdedfde, 0xffdedfde, + 0xffe4e1e4, 0xffe4e1e4, 0xffe1e0e1, 0xffe1e0e1, 0xffe1e1e1, 0xffe1e1e1, 0xffe4e4e4, 0xffe0e0e0, + 0xffe3e0e3, 0xffe3e0e3, 0xffe4e1e4, 0xffe5e2e5, 0xffe4e1e4, 0xffe4dfe4, 0xffe5e0e5, 0xffe5e2e5, + 0xffe6e2e5, 0xffe6e2e5, 0xffe6dfe6, 0xffe0dedf, 0xffdfdedf, 0xffdfdedf, 0xffdfdede, 0xffdfdcdd, + 0xffdedcdb, 0xffdedcdb, 0xffdedbde, 0xffdedbde, 0xffdbd9db, 0xffd9d8d9, 0xffd9d8d9, 0xffd6d7d6, + 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d4d6, 0xffd6d4d6, 0xffd6d2d6, 0xffd0d1d0, + 0xffd0d1d0, 0xffd0d1d0, 0xffd0d1d0, 0xffcecece, 0xffcecece, 0xffcecdce, 0xffcecace, 0xffc5c6c5, + 0xffc5c6c5, 0xffc0c1c0, 0xffbdbebd, 0xffb5b6b5, 0xffafafaf, 0xffaaa9aa, 0xffa5a2a5, 0xff9c9a9c, + 0x55343334, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x66161616, 0x99424142, 0x99424142, 0x994a454a, 0x99504c50, 0x995a595a, 0x995a595a, + 0x995d605d, 0x99606260, 0x99606260, 0x99606260, 0x99656465, 0x99686768, 0x99686768, 0x996b696b, + 0x996b6d6b, 0x996b6d6b, 0x996b6b6b, 0x996b6c6b, 0x996e6f6e, 0x996e6f6e, 0x99707070, 0x99707070, + 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737373, 0x99737573, 0x99737573, 0x99737573, + 0x99737776, 0x99737776, 0x99737776, 0x9973797b, 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b, + 0x997b7b79, 0x997b7b79, 0x997b7b79, 0x997b7d7b, 0x997b7b7b, 0x997b7b7b, 0x997b7c7b, 0x997b7c7b, + 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x99817f81, 0x99817f81, 0x99817f81, 0x99817f81, + 0x997b7d7b, 0x997e807e, 0x997e807e, 0x997e807e, 0x99818081, 0x99818081, 0x99818081, 0x997e7f7e, + 0x99848284, 0x99848284, 0x99848284, 0x99848284, 0x99818381, 0x997e807e, 0x99818381, 0x997e807e, + 0x99848284, 0x99818081, 0x99818081, 0x99818081, 0x99848284, 0x997e7f7e, 0x99818081, 0x99818081, + 0x99818081, 0x997e7f7e, 0x99818081, 0x99818081, 0x997e807e, 0x997e807e, 0x997e807e, 0x997e807e, + 0x997e807e, 0x997e807e, 0x997e807e, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, + 0x997b7d7b, 0x997b7c7b, 0x997b7c7b, 0x997b7c7b, 0x99797b79, 0x99797b79, 0x99797b79, 0x99797b79, + 0x99797879, 0x99767776, 0x99797879, 0x99767776, 0x99737573, 0x99737573, 0x99737573, 0x99737573, + 0x99737473, 0x99737473, 0x99737373, 0x99737173, 0x99737173, 0x99707070, 0x99707070, 0x996e6f6e, + 0x996b6d6b, 0x996b6d6b, 0x996b6b6b, 0x996b696b, 0x99636563, 0x99636563, 0x995d5d5d, 0x995d5d5d, + 0x995a5552, 0x99524e4d, 0x99424142, 0x99424142, 0x77101010, 0x77000000, 0x66000000, 0x11000000, + 0x00000400, 0x00000400, 0x66373937, 0xffa5a2a5, 0xffa5aaa5, 0xffadb1ad, 0xffb5b7b5, 0xffbdbebd, + 0xffc0c1c0, 0xffc3c4c3, 0xffc3c4c3, 0xffc5c6c5, 0xffc5c6c5, 0xffc8c9c8, 0xffc8c9c8, 0xffcbcccb, + 0xffcecece, 0xffcecece, 0xffcecdce, 0xffcecece, 0xffced0d0, 0xffced0d0, 0xffced1d3, 0xffced1d3, + 0xffd3d4d6, 0xffd3d4d6, 0xffd3d4d6, 0xffd3d4d6, 0xffd6d5d6, 0xffd6d8d6, 0xffd6d8d6, 0xffd6d8d6, + 0xffd6d8d6, 0xffd6d9d6, 0xffd6d9d6, 0xffd6dbd6, 0xffd9d9d9, 0xffdbdcdb, 0xffdbdcdb, 0xffdbdcdb, + 0xffdedcd9, 0xffdedddb, 0xffdedcd9, 0xffdedfde, 0xffdeddde, 0xffdeddde, 0xffdedfde, 0xffdedfde, + 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdee1de, 0xffdee1de, 0xffdee0de, 0xffdee1de, + 0xffe1e0e1, 0xffe6e3e6, 0xffe6e3e6, 0xffe4e1e4, 0xffe4e4e4, 0xffe3e3e4, 0xffe3e3e3, 0xffe2e3e2, + 0xffe3e3e3, 0xffe4e2e4, 0xffe4e2e4, 0xffe4e2e4, 0xffe5e2e5, 0xffe5e3e5, 0xffe5e2e5, 0xffe5e2e5, + 0xffe5e2e5, 0xffe6e2e5, 0xffe6e3e5, 0xffe3e0e3, 0xffe0dfe0, 0xffe0dfdf, 0xffe0dfdf, 0xffe0dede, + 0xffdfdddd, 0xffdedcdb, 0xffdedcdb, 0xffdedbde, 0xffdbd9db, 0xffdedbde, 0xffdbd9db, 0xffd6d9d6, + 0xffd6d8d6, 0xffd6d8d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d5d6, 0xffd6d4d6, 0xffd3d4d3, + 0xffd0d1d0, 0xffd0d1d0, 0xffd0d1d0, 0xffcecece, 0xffcecece, 0xffcecdce, 0xffcecace, 0xffc5c6c5, + 0xffc5c6c5, 0xffc0c1c0, 0xffbdbebd, 0xffb5b6b5, 0xffafafaf, 0xffa5a2a5, 0xffa5a2a5, 0xff9c9a9c, + 0x55343334, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x66161616, 0x99424142, 0x99424142, 0x994a454a, 0x99504c50, 0x99555255, 0x995a595a, + 0x995a5d5a, 0x995d605d, 0x99606260, 0x99606260, 0x99686768, 0x99656465, 0x99686768, 0x996b696b, + 0x996b6b6b, 0x996b6c6b, 0x996b6c6b, 0x996b6d6b, 0x996e6f6e, 0x99707070, 0x99737173, 0x99707070, + 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99737573, 0x99737573, 0x99737573, 0x99737573, + 0x99737776, 0x99737776, 0x99737776, 0x99737776, 0x99797879, 0x997b797b, 0x997b797b, 0x997b797b, + 0x997b7b79, 0x997b7b79, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, + 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b827b, 0x99817f81, 0x99817f81, 0x99817f81, 0x99848284, + 0x99818381, 0x99818381, 0x997e807e, 0x99818381, 0x99848284, 0x99848284, 0x99848284, 0x99848284, + 0x99848284, 0x99848284, 0x99848284, 0x99848284, 0x99818381, 0x99818381, 0x99818381, 0x99818381, + 0x99848284, 0x99848284, 0x99848284, 0x99848284, 0x99848284, 0x99848284, 0x99848284, 0x99848284, + 0x99848284, 0x99848284, 0x99848284, 0x99848284, 0x99848684, 0x99818381, 0x99848684, 0x99818381, + 0x99848684, 0x997e807e, 0x997e807e, 0x997e807e, 0x997b7f7b, 0x997b827b, 0x997b7f7b, 0x997b7d7b, + 0x997b7d7b, 0x997b7d7b, 0x997b7c7b, 0x997b7c7b, 0x99797b79, 0x997b7d7b, 0x99797b79, 0x99767876, + 0x997b797b, 0x997b797b, 0x99797879, 0x99767776, 0x99737573, 0x99737573, 0x99737573, 0x99737573, + 0x99737473, 0x99737473, 0x99737473, 0x99737373, 0x99737173, 0x99737173, 0x99707070, 0x99707070, + 0x996b6d6b, 0x996b6c6b, 0x996b6b6b, 0x996b696b, 0x99636563, 0x99606160, 0x995d5d5d, 0x995a595a, + 0x995a5552, 0x99524e4d, 0x99424142, 0x99424142, 0x77101010, 0x77000000, 0x55000000, 0x11000000, + 0x00000400, 0x00000400, 0x66373937, 0xffa5a2a5, 0xffa5aaa5, 0xffadb1ad, 0xffb5b7b5, 0xffbdbebd, + 0xffc0c1c0, 0xffc0c1c0, 0xffc3c4c3, 0xffc5c6c5, 0xffc8c9c8, 0xffc5c6c5, 0xffc8c9c8, 0xffcbcccb, + 0xffcecdce, 0xffcecece, 0xffcecece, 0xffcecece, 0xffced0d0, 0xffced1d3, 0xffced2d6, 0xffced2d6, + 0xffd3d4d6, 0xffd3d4d6, 0xffd3d4d6, 0xffd3d4d6, 0xffd6d8d6, 0xffd6d8d6, 0xffd6d8d6, 0xffd6d8d6, + 0xffd6d8d6, 0xffd6d9d6, 0xffd6d9d6, 0xffd6d9d6, 0xffdbdcdb, 0xffdbdcdb, 0xffdbdcdb, 0xffdbdcdb, + 0xffdedddb, 0xffdedddb, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedfde, + 0xffdee0de, 0xffdee1de, 0xffdee0de, 0xffdee3de, 0xffdee1de, 0xffdee1de, 0xffdee1de, 0xffdee3de, + 0xffe6e3e6, 0xffe6e3e6, 0xffe6e3e6, 0xffe6e3e6, 0xffe3e4e3, 0xffe3e4e3, 0xffe2e4e2, 0xffe3e4e3, + 0xffe4e4e3, 0xffe4e3e4, 0xffe4e3e4, 0xffe4e4e5, 0xffe5e5e4, 0xffe5e3e5, 0xffe5e3e5, 0xffe5e2e5, + 0xffe6e2e5, 0xffe6e3e5, 0xffe6e3e5, 0xffe6e1e5, 0xffe3e0e3, 0xffe2dfe2, 0xffe0dfdf, 0xffe0dedf, + 0xffe0dfdc, 0xffdedcdc, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdbd9db, 0xffd6d9d6, + 0xffd6d9d6, 0xffd6d8d6, 0xffd6d8d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d5d6, 0xffd3d4d3, + 0xffd3d4d3, 0xffd0d1d0, 0xffd0d1d0, 0xffcecece, 0xffcecece, 0xffcecdce, 0xffcecace, 0xffc5c6c5, + 0xffc5c6c5, 0xffc0c1c0, 0xffbdbebd, 0xffb5b6b5, 0xffafafaf, 0xffaaa9aa, 0xffa5a2a5, 0xff9c9a9c, + 0x55343334, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x66161616, 0x99424142, 0x99424142, 0x99424542, 0x994a4c4a, 0x99525252, 0x995a595a, + 0x995d5d5d, 0x99606160, 0x99606160, 0x99636563, 0x99656765, 0x99656765, 0x996b696b, 0x996b696b, + 0x996b6b6b, 0x996b6b6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d73, 0x996e7073, 0x99707373, 0x996e7073, + 0x99737373, 0x99737373, 0x99737473, 0x99737573, 0x99767776, 0x99767776, 0x99767776, 0x99767776, + 0x99767776, 0x99767776, 0x997b797b, 0x99797879, 0x997b797b, 0x997b797b, 0x997b7b7b, 0x997b7b7b, + 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997e807e, 0x997b7d7b, 0x997e807e, + 0x997e8084, 0x997e8084, 0x997e8084, 0x997e8084, 0x99848284, 0x99848284, 0x99848284, 0x99848384, + 0x99848284, 0x99848284, 0x99848284, 0x99848284, 0x99848284, 0x99848384, 0x99848484, 0x99848484, + 0x99898484, 0x99898484, 0x99898484, 0x99898484, 0x99848684, 0x99848684, 0x99848684, 0x99848684, + 0x99898789, 0x99868486, 0x99868486, 0x99868486, 0x99868486, 0x99868486, 0x99848284, 0x99868486, + 0x99848484, 0x99848384, 0x99848384, 0x99848684, 0x99848684, 0x99848684, 0x99848684, 0x99848384, + 0x99848384, 0x99848384, 0x99848284, 0x99848284, 0x99818081, 0x997e7f7e, 0x997e7f7e, 0x99818081, + 0x997e7f7e, 0x997e7f7e, 0x997b7d7b, 0x997b7d7b, 0x997b7c7b, 0x997b7c7b, 0x997b7b7b, 0x997b7c7b, + 0x997b7b7b, 0x997b797b, 0x997b797b, 0x997b797b, 0x99767876, 0x99767876, 0x99767876, 0x99737573, + 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737373, 0x99737373, 0x99737073, 0x99736d73, + 0x99737173, 0x99706d6e, 0x996e6968, 0x996e6968, 0x99636563, 0x99606060, 0x99606060, 0x995d5a5d, + 0x99525152, 0x99525152, 0x99454345, 0x99454345, 0x77080c08, 0x77000000, 0x55000000, 0x11000000, + 0x00000000, 0x00000000, 0x66373637, 0xffa5a2a5, 0xffadaaad, 0xffadaaad, 0xffb5b2b5, 0xffbdbabd, + 0xffc0bec0, 0xffc3c2c3, 0xffc3c2c3, 0xffc5c6c5, 0xffc8c9c8, 0xffc8c9c8, 0xffcbcccb, 0xffcbcccb, + 0xffcecece, 0xffcecece, 0xffcecece, 0xffd0ced0, 0xffd0ced0, 0xffd3d2d3, 0xffd3d2d3, 0xffd3d2d3, + 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d8d6, 0xffd6d8d6, 0xffd6d8d6, 0xffd6d9d6, + 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedcde, 0xffdedcde, 0xffdeddde, 0xffdeddde, + 0xffdedfde, 0xffdedfde, 0xffdee0e1, 0xffdedfde, 0xffdedfde, 0xffe1e1e1, 0xffe1e1e1, 0xffe1e1e1, + 0xffe6e3e6, 0xffe6e3e6, 0xffe6e3e6, 0xffe6e3e6, 0xffe6e3e6, 0xffe6e3e6, 0xffe6e3e6, 0xffe6e5e6, + 0xffe6e3e6, 0xffe6e3e6, 0xffe6e5e6, 0xffe6e5e6, 0xffe5e3e5, 0xffe4e5e4, 0xffe3e5e3, 0xffe4e5e3, + 0xffe4e6e4, 0xffe5e5e4, 0xffe5e6e5, 0xffe5e7e5, 0xffe5e6e4, 0xffe6e6e5, 0xffe6e6e6, 0xffe6e4e6, + 0xffe6e4e6, 0xffe6e4e6, 0xffe6e4e6, 0xffe6e3e5, 0xffe6e3e5, 0xffe6e1e5, 0xffe5e2e4, 0xffdfdfde, + 0xffdfe1df, 0xffdfdede, 0xffdedfde, 0xffdeddde, 0xffdedcde, 0xffdedcde, 0xffdedbde, 0xffd9d9d9, + 0xffdbdcdb, 0xffd9d9d9, 0xffd9d9d9, 0xffd6d7d6, 0xffd6d8d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d4d6, + 0xffd6d4d6, 0xffd6d1d6, 0xffd6d1d6, 0xffced2d6, 0xffceced0, 0xffceced0, 0xffcecacb, 0xffc5c6c5, + 0xffc3c2c3, 0xffc3c2c3, 0xffc0bec0, 0xffb5b2b5, 0xffadabad, 0xffa5a5a5, 0xff9c9e9c, 0xff8c8e8c, + 0x442f322f, 0x00000300, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x55000000, 0x99424142, 0x99424142, 0x99424542, 0x994a4c4a, 0x99525252, 0x995a595a, + 0x995d5d5d, 0x995d5d5d, 0x99606160, 0x99636563, 0x99636563, 0x99656765, 0x99686868, 0x996b696b, + 0x996b6b6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996e7073, 0x996e7073, 0x996e7073, 0x99707373, + 0x99737473, 0x99737473, 0x99737573, 0x99737573, 0x99767776, 0x99767776, 0x99767776, 0x99767776, + 0x997b797b, 0x99767776, 0x997b797b, 0x997b797b, 0x997b7b7b, 0x997b7b7b, 0x997b7c7b, 0x997b7c7b, + 0x997e7f7e, 0x997b7d7b, 0x997e7f7e, 0x997e7f7e, 0x997b7d7b, 0x997e807e, 0x997e807e, 0x99818381, + 0x997e8084, 0x997e8084, 0x99818384, 0x99818384, 0x99848384, 0x99848384, 0x99848384, 0x99848484, + 0x99868686, 0x99898a89, 0x99848284, 0x99868686, 0x99848684, 0x99848684, 0x99848684, 0x99848484, + 0x99898484, 0x99898484, 0x99898484, 0x99868784, 0x99848684, 0x99848684, 0x99848684, 0x99848684, + 0x99898789, 0x99898789, 0x99868486, 0x99898789, 0x99898789, 0x99868486, 0x99868486, 0x99868486, + 0x99848684, 0x99848684, 0x99848484, 0x99848484, 0x99848484, 0x99848384, 0x99848484, 0x99848384, + 0x99848284, 0x99848284, 0x99848284, 0x99848284, 0x99848284, 0x99818081, 0x99818081, 0x99818081, + 0x99818081, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7c7b, 0x997b7c7b, + 0x997b7b7b, 0x997b7b7b, 0x997b7b7b, 0x997b797b, 0x99767876, 0x99767876, 0x99767876, 0x99767876, + 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737373, 0x99737373, 0x99737373, 0x99737073, + 0x99706d6e, 0x99706d6e, 0x996e6968, 0x996e6968, 0x99636563, 0x99606060, 0x99606060, 0x995d5a5d, + 0x99525152, 0x99525152, 0x99454345, 0x99373637, 0x77050805, 0x77000000, 0x55000000, 0x00000000, + 0x00000000, 0x00000000, 0x33373637, 0xffa5a2a5, 0xffa5a2a5, 0xffadaaad, 0xffb5b2b5, 0xffbdbabd, + 0xffc0bec0, 0xffc3c2c3, 0xffc3c2c3, 0xffc5c6c5, 0xffc5c6c5, 0xffc8c9c8, 0xffcbcccb, 0xffcbcccb, + 0xffcecece, 0xffcecece, 0xffd0ced0, 0xffd3ced3, 0xffd3d2d3, 0xffd3d2d3, 0xffd3d2d3, 0xffd6d7d6, + 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d8d6, 0xffd6d9d6, 0xffd6d9d6, 0xffd6d9d6, 0xffd6d9d6, + 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedcde, 0xffdeddde, 0xffdeddde, 0xffdedfde, 0xffdedfde, + 0xffdee0e1, 0xffdedfde, 0xffdee0e1, 0xffdee0e1, 0xffe1e1e1, 0xffe4e4e4, 0xffe4e4e4, 0xffe4e4e4, + 0xffe6e3e6, 0xffe6e3e6, 0xffe6e4e6, 0xffe6e4e6, 0xffe6e5e6, 0xffe6e5e6, 0xffe6e5e6, 0xffe6e5e6, + 0xffe6e5e6, 0xffe6e8e6, 0xffe6e5e6, 0xffe6e8e6, 0xffe5e8e5, 0xffe4e7e4, 0xffe3e7e4, 0xffe4e5e4, + 0xffe5e6e5, 0xffe5e6e5, 0xffe5e7e5, 0xffe5e8e6, 0xffe6e7e5, 0xffe6e7e6, 0xffe6e6e6, 0xffe6e7e6, + 0xffe6e7e6, 0xffe6e4e6, 0xffe6e4e6, 0xffe6e3e6, 0xffe6e4e5, 0xffe6e3e5, 0xffe6e1e5, 0xffe4e2e3, + 0xffe1e1e1, 0xffdfdfde, 0xffdedfde, 0xffdeddde, 0xffdeddde, 0xffdeddde, 0xffdedbde, 0xffdbdcdb, + 0xffd9d9d9, 0xffd9d9d9, 0xffd9d9d9, 0xffd6d8d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d4d6, + 0xffd6d4d6, 0xffd6d4d6, 0xffd6d1d6, 0xffceced0, 0xffceced0, 0xffceced0, 0xffcecacb, 0xffc5c6c5, + 0xffc3c2c3, 0xffc3c2c3, 0xffbdbabd, 0xffb5b2b5, 0xffadabad, 0xffa5a5a5, 0xff9c9e9c, 0xee8c8e8c, + 0x332f322f, 0x00000300, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x44000000, 0x99424142, 0x99424142, 0x99424542, 0x994a4c4a, 0x99525252, 0x995a595a, + 0x995d5d5d, 0x995d5d5d, 0x99606160, 0x99606160, 0x99636563, 0x99656765, 0x99686868, 0x996b696b, + 0x996b6b6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996e7073, 0x996e7073, 0x996e7073, 0x99707373, + 0x99737473, 0x99737573, 0x99737573, 0x99737573, 0x99767776, 0x99767776, 0x99797879, 0x99797879, + 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b, 0x997b7c7b, 0x997b7c7b, 0x997b7c7b, 0x997b7d7b, + 0x997e7f7e, 0x997e7f7e, 0x997e7f7e, 0x997e7f7e, 0x997e807e, 0x99818381, 0x99818381, 0x99818381, + 0x99818384, 0x99818384, 0x99818384, 0x99818384, 0x99848384, 0x99848684, 0x99848684, 0x99848484, + 0x99868686, 0x99868686, 0x99868686, 0x99868686, 0x99848684, 0x99848684, 0x99848684, 0x99848684, + 0x99868784, 0x99868784, 0x99868784, 0x99868784, 0x99848684, 0x99848684, 0x99848684, 0x99848684, + 0x99898789, 0x99898789, 0x99898789, 0x99898789, 0x998c8a8c, 0x99898789, 0x99898789, 0x99898789, + 0x99848684, 0x99848684, 0x99848684, 0x99848484, 0x99848684, 0x99848484, 0x99848484, 0x99848384, + 0x99848484, 0x99848384, 0x99848384, 0x99848484, 0x99848284, 0x99848284, 0x99818081, 0x99848284, + 0x99818081, 0x99818081, 0x997e7f7e, 0x997e7f7e, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7c7b, + 0x997b7d7b, 0x997b7b7b, 0x997b7b7b, 0x997b797b, 0x99797b79, 0x99797b79, 0x99767876, 0x99767876, + 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737373, 0x99737373, 0x99737373, 0x99737073, + 0x99706d6e, 0x99706d6e, 0x996e6968, 0x996b6563, 0x99636563, 0x99606060, 0x995d5a5d, 0x995a555a, + 0x99525152, 0x99454345, 0x99454345, 0x88292829, 0x77030403, 0x77000000, 0x44000000, 0x00000000, + 0x00000000, 0x00000000, 0x11000000, 0xffa5a2a5, 0xffa5a2a5, 0xffadaaad, 0xffb5b2b5, 0xffbdbabd, + 0xffc0bec0, 0xffc3c2c3, 0xffc3c2c3, 0xffc3c2c3, 0xffc5c6c5, 0xffc8c9c8, 0xffc8c9c8, 0xffcbcccb, + 0xffcecece, 0xffcecece, 0xffd0ced0, 0xffd3ced3, 0xffd3d2d3, 0xffd3d2d3, 0xffd3d2d3, 0xffd6d7d6, + 0xffd6d7d6, 0xffd6d7d6, 0xffd6d8d6, 0xffd6d9d6, 0xffd6d9d6, 0xffd6d9d6, 0xffd6dbd6, 0xffd6dbd6, + 0xffdedbde, 0xffdedcde, 0xffdeddde, 0xffdeddde, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedfde, + 0xffdee0e1, 0xffdee0e1, 0xffdee1e4, 0xffdee1e4, 0xffe4e4e4, 0xffe4e4e4, 0xffe4e4e4, 0xffe4e4e4, + 0xffe6e5e6, 0xffe6e5e6, 0xffe6e5e6, 0xffe6e5e6, 0xffe6e5e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e5e6, + 0xffe6e5e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe8e9e7, 0xffebeae9, 0xffeeeaed, + 0xffe9e7e8, 0xffe9e8ea, 0xffe6e8e8, 0xffe6e8e6, 0xffe6e9e6, 0xffe6e8e6, 0xffe7e9e7, 0xffe7e7e5, + 0xffe6e6e5, 0xffe7e7e6, 0xffe6e7e6, 0xffe6e4e6, 0xffe6e6e6, 0xffe6e3e5, 0xffe5e3e5, 0xffe5e1e4, + 0xffe1e1e1, 0xffdfe1df, 0xffdee0de, 0xffdedfde, 0xffdeddde, 0xffdeddde, 0xffdedcde, 0xffdbdcdb, + 0xffdbdcdb, 0xffdbdcdb, 0xffd9d9d9, 0xffd6d9d6, 0xffd6d8d6, 0xffd6d9d6, 0xffd6d7d6, 0xffd6d4d6, + 0xffd6d4d6, 0xffd6d4d6, 0xffd6d4d6, 0xffceced0, 0xffceced0, 0xffceced0, 0xffcecacb, 0xffc5c6c5, + 0xffc3c2c3, 0xffc0bec0, 0xffbdbabd, 0xffb5b2b5, 0xffadabad, 0xffa5a5a5, 0xff9c9e9c, 0xdd8c8e8c, + 0x22000400, 0x00000300, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x44000000, 0x882c2b2c, 0x99424142, 0x99424542, 0x99424542, 0x994a4c4a, 0x995a595a, + 0x995a595a, 0x995d5d5d, 0x995d5d5d, 0x99606160, 0x99636563, 0x99656765, 0x996b696b, 0x996b696b, + 0x996b6b6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996e7073, 0x996e7073, 0x99707373, 0x99707373, + 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99767776, 0x99767776, 0x997b797b, 0x997b797b, + 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, + 0x997e7f7e, 0x997e7f7e, 0x99818081, 0x99848284, 0x99818381, 0x99818381, 0x99818381, 0x99818381, + 0x99818384, 0x99818384, 0x99818384, 0x99818384, 0x99848684, 0x99848684, 0x99848684, 0x99848684, + 0x99868686, 0x99868686, 0x99868686, 0x99868686, 0x99848684, 0x99848684, 0x99848684, 0x99848684, + 0x99848a84, 0x99868784, 0x99868784, 0x99848a84, 0x99848684, 0x99848684, 0x99848684, 0x99848684, + 0x998c8a8c, 0x99898789, 0x99898789, 0x998c8a8c, 0x998c8a8c, 0x99898789, 0x99898789, 0x99898789, + 0x99848684, 0x99848684, 0x99848684, 0x99848684, 0x99848684, 0x99848684, 0x99848684, 0x99848684, + 0x99848684, 0x99848684, 0x99848484, 0x99848484, 0x99848284, 0x99848284, 0x99848284, 0x99848284, + 0x997e7f7e, 0x99818081, 0x997e7f7e, 0x997e7f7e, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, + 0x997b7d7b, 0x997b7d7b, 0x997b7c7b, 0x997b7b7b, 0x99797b79, 0x99797b79, 0x99797b79, 0x99767876, + 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737373, 0x99737373, 0x99737073, + 0x99706d6e, 0x996e6968, 0x996e6968, 0x996b6563, 0x99606060, 0x99606060, 0x995d5a5d, 0x995a555a, + 0x99525152, 0x99454345, 0x99454345, 0x88292829, 0x77030403, 0x77000000, 0x33000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0xdda5a2a5, 0xffa5a2a5, 0xffadaaad, 0xffb5b2b5, 0xffbdbabd, + 0xffbdbabd, 0xffc0bec0, 0xffc3c2c3, 0xffc3c2c3, 0xffc5c6c5, 0xffc8c9c8, 0xffcbcccb, 0xffcbcccb, + 0xffcecece, 0xffd0ced0, 0xffd0ced0, 0xffd0ced0, 0xffd3d2d3, 0xffd3d2d3, 0xffd6d7d6, 0xffd6d7d6, + 0xffd6d7d6, 0xffd6d7d6, 0xffd6d8d6, 0xffd6d8d6, 0xffd6d9d6, 0xffd6d9d6, 0xffd6dbd6, 0xffd6dbd6, + 0xffdedcde, 0xffdeddde, 0xffdeddde, 0xffdeddde, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedfde, + 0xffdee0e1, 0xffdee1e4, 0xffdee3e6, 0xffdee3e6, 0xffe4e4e4, 0xffe4e4e4, 0xffe4e4e4, 0xffe6e7e6, + 0xffe6e5e6, 0xffe6e5e6, 0xffe6e5e6, 0xffe6e5e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, + 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe7e9e7, 0xffe8e8e8, + 0xffeaece9, 0xffe7e9e6, 0xffe6e9e6, 0xffe6ebe6, 0xffe6e9e6, 0xffe7e9e7, 0xffe9e9e9, 0xffe7e7e6, + 0xffe6e6e6, 0xffe6e7e7, 0xffe7e4e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e4e5, 0xffe5e3e5, 0xffe4e1e4, + 0xffe2e1e2, 0xffdfe0df, 0xffdee0de, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdeddde, 0xffdedfde, + 0xffdbdcdb, 0xffdbdcdb, 0xffdbdcdb, 0xffd6d9d6, 0xffd6d9d6, 0xffd6d9d6, 0xffd6d7d6, 0xffd6d7d6, + 0xffd6d7d6, 0xffd6d4d6, 0xffd6d1d6, 0xffceced0, 0xffceced0, 0xffcecacb, 0xffcec6c5, 0xffc3c2c3, + 0xffc3c2c3, 0xffc0bec0, 0xffbdbabd, 0xffb5b2b5, 0xffadabad, 0xff9c9e9c, 0xff9c9e9c, 0xbb5d605d, + 0x22000400, 0x00000300, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x22000000, 0x77262826, 0x993a3d3a, 0x99424142, 0x99424142, 0x994d4c4d, 0x99525152, + 0x99525452, 0x995a5a5a, 0x99636163, 0x99636163, 0x99656565, 0x99656565, 0x996b696b, 0x996b696b, + 0x996b6c6e, 0x996b6c6e, 0x996b6f70, 0x996b6f70, 0x99737173, 0x99737173, 0x99737173, 0x99737473, + 0x99737576, 0x99737576, 0x99737576, 0x99737576, 0x99767876, 0x99797b79, 0x99797b79, 0x99797b79, + 0x997e7c7e, 0x997e7c7e, 0x997e7c7e, 0x997e7c7e, 0x997b7d7b, 0x997b7d7b, 0x997e807e, 0x997e807e, + 0x99848084, 0x99848084, 0x99848384, 0x99848384, 0x99868486, 0x99868486, 0x99868486, 0x99868486, + 0x99848684, 0x99848684, 0x99848684, 0x99848684, 0x99868786, 0x99868786, 0x99868786, 0x99848684, + 0x99868886, 0x99868886, 0x99868886, 0x99868886, 0x99868886, 0x99868886, 0x99868886, 0x99868886, + 0x998c888c, 0x998c888c, 0x998c888c, 0x998c888c, 0x99898a89, 0x99868686, 0x99898a89, 0x99898a89, + 0x998c888c, 0x998c888c, 0x998c888c, 0x998c8b8c, 0x99898b89, 0x99868886, 0x99868886, 0x99868886, + 0x99868786, 0x99868786, 0x99868786, 0x99868786, 0x99868786, 0x99848684, 0x99848684, 0x99868786, + 0x99848684, 0x99848684, 0x99848684, 0x99848684, 0x99848284, 0x99868686, 0x99848284, 0x99848284, + 0x99848384, 0x99848384, 0x99848284, 0x99848284, 0x997e807e, 0x997e807e, 0x997e807e, 0x997b7d7b, + 0x997e7f7e, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7b7b, 0x997b7b7b, 0x997b797b, 0x997b797b, + 0x99767776, 0x99767776, 0x99767776, 0x99767776, 0x99737573, 0x99707370, 0x99707370, 0x996e706e, + 0x996b6d6b, 0x99686968, 0x99656565, 0x99656565, 0x99636163, 0x99636163, 0x995d5c5d, 0x99585658, + 0x994a494a, 0x994a494a, 0x994a494a, 0x77191b19, 0x77000000, 0x77000000, 0x22000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0xaa736d73, 0xff9fa29f, 0xff9fa29f, 0xffb5b6b5, 0xffb5b6b5, + 0xffbdbabd, 0xffbdbabd, 0xffc5c2c5, 0xffc5c2c5, 0xffc8c6c8, 0xffc8c6c8, 0xffcecace, 0xffcecace, + 0xffd0cdd0, 0xffd0cdd0, 0xffd3d0d3, 0xffd3d0d3, 0xffd6d2d6, 0xffd6d4d6, 0xffd6d4d6, 0xffd6d7d6, + 0xffd6d7d6, 0xffd6d8d6, 0xffd6d8d6, 0xffd6d9d6, 0xffdedbde, 0xffdedcde, 0xffdedcde, 0xffdedcde, + 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffe1e1e1, 0xffe1e1e1, 0xffe1e1e1, + 0xffe6e3e6, 0xffe6e3e6, 0xffe6e4e6, 0xffe6e4e6, 0xffe6e7e6, 0xffe6e7e6, 0xffe6e7e6, 0xffe6e7e6, + 0xffe6e7e6, 0xffe6e8e9, 0xffe6e8e9, 0xffe6e7e6, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe6e7e6, + 0xffefebe6, 0xffefebe6, 0xffefebe6, 0xffefebe6, 0xffefebef, 0xffefebef, 0xffefebef, 0xffefebef, + 0xffefebef, 0xffefebef, 0xffefebef, 0xffefebef, 0xffefebef, 0xffefebef, 0xffedeaed, 0xffede9ed, + 0xffeae8e9, 0xffe5e7e9, 0xffe8e7e9, 0xffe7e7e6, 0xffe6e6e6, 0xffe6e6e5, 0xffe5e6e5, 0xffe3e4e3, + 0xffe3e3e3, 0xffe1e1e1, 0xffe1e1e1, 0xffe1e0e1, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedddb, + 0xffdedddb, 0xffdedcd9, 0xffdedcd9, 0xffd9d9d9, 0xffd9d9d9, 0xffd9d9d9, 0xffd9d9d9, 0xffd6d7d6, + 0xffd6d7d6, 0xffd3d4d3, 0xffd0d1d0, 0xffcecece, 0xffcecece, 0xffc8cacb, 0xffc3c6c8, 0xffc5c2c5, + 0xffc5c2c5, 0xffbdbcbd, 0xffb5b5b5, 0xffadaead, 0xffadaead, 0xffadaead, 0xff8f908f, 0x774a4d4a, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x11000000, 0x66131413, 0x993a3d3a, 0x99424142, 0x99424142, 0x99474647, 0x994d4c4d, + 0x99525452, 0x995a5a5a, 0x995a5a5a, 0x99636163, 0x99656565, 0x99656565, 0x99656565, 0x996b696b, + 0x996b6c6e, 0x996b6c6e, 0x996b6f70, 0x996b6f70, 0x99737173, 0x99737173, 0x99737173, 0x99737373, + 0x99737573, 0x99737576, 0x99737576, 0x99737576, 0x99767876, 0x99767876, 0x99767876, 0x99797b79, + 0x997e7c7e, 0x997e7c7e, 0x99817f81, 0x99817f81, 0x997b7d7b, 0x997e807e, 0x997e807e, 0x997e807e, + 0x99848384, 0x99848384, 0x99848384, 0x99848384, 0x99868486, 0x99868486, 0x99868486, 0x99868486, + 0x99868786, 0x99868786, 0x99868786, 0x99868786, 0x99868786, 0x99898889, 0x99868786, 0x99868786, + 0x99868886, 0x99868886, 0x99898b89, 0x99898b89, 0x99868886, 0x99898b89, 0x99898b89, 0x99898b89, + 0x998c8b8c, 0x998c8b8c, 0x998c8b8c, 0x998c8b8c, 0x99898a89, 0x99898a89, 0x99898a89, 0x99898a89, + 0x998c8b8c, 0x998c8b8c, 0x998c8b8c, 0x998c8b8c, 0x99868886, 0x99898b89, 0x99868886, 0x99868886, + 0x99898889, 0x99898889, 0x99898889, 0x99868786, 0x99868786, 0x99868786, 0x99848684, 0x99868786, + 0x99848684, 0x99868786, 0x99898889, 0x99848684, 0x99868686, 0x99848284, 0x99868686, 0x99868686, + 0x99848384, 0x99848484, 0x99848284, 0x99848384, 0x99818381, 0x997e807e, 0x997e807e, 0x997e807e, + 0x997e7f7e, 0x997e7f7e, 0x997e7f7e, 0x997b7d7b, 0x997b7d7b, 0x997b7c7b, 0x997b7b7b, 0x997b7b7b, + 0x997b797b, 0x99797879, 0x99767776, 0x99767776, 0x99737573, 0x99707370, 0x99707370, 0x996b6d6b, + 0x99686968, 0x99686968, 0x99656565, 0x99636163, 0x99636163, 0x995d5c5d, 0x99585658, 0x99585658, + 0x994a494a, 0x994a494a, 0x99313231, 0x77000400, 0x77000000, 0x66000000, 0x11000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x554d494d, 0xff9fa29f, 0xff9fa29f, 0xff9fa29f, 0xffb5b6b5, + 0xffb5b2b5, 0xffbdbabd, 0xffbdbabd, 0xffc5c2c5, 0xffc8c6c8, 0xffc8c6c8, 0xffc8c6c8, 0xffcecace, + 0xffd0cdd0, 0xffd0cdd0, 0xffd3d0d3, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d4d6, 0xffd6d5d6, + 0xffd6d7d6, 0xffd6d9d6, 0xffd6d9d6, 0xffd6d9d6, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedcde, + 0xffdedfde, 0xffdedfde, 0xffdee0de, 0xffdee0de, 0xffe1e1e1, 0xffe1e1e1, 0xffe1e1e1, 0xffe1e1e1, + 0xffe6e5e6, 0xffe6e4e6, 0xffe6e5e6, 0xffe6e5e6, 0xffe6e7e6, 0xffe6e7e6, 0xffe6e7e6, 0xffe6e7e6, + 0xffe6e9ec, 0xffe6e8e9, 0xffe6e9ec, 0xffe6e9ec, 0xffe9e9e9, 0xffececec, 0xffe9e9e9, 0xffe9e9e9, + 0xffefece9, 0xffefebe6, 0xffefece9, 0xffefece9, 0xffefebef, 0xffefecef, 0xffefecef, 0xffefecef, + 0xffefecef, 0xffefecef, 0xffefecef, 0xffefecef, 0xffefebef, 0xffeeecef, 0xffeeeced, 0xffede9ed, + 0xffede9ed, 0xffede7ec, 0xffece7ec, 0xffeae7ea, 0xffe7e7e7, 0xffe6e6e6, 0xffe5e6e5, 0xffe3e5e3, + 0xffe3e4e3, 0xffe4e4e4, 0xffe1e1e1, 0xffe1e0e1, 0xffe1e0e1, 0xffe1e0e1, 0xffdedfde, 0xffdedfde, + 0xffdedfde, 0xffdedddb, 0xffdedddb, 0xffdbdcdb, 0xffdbdcdb, 0xffd9d9d9, 0xffd9d9d9, 0xffd6d7d6, + 0xffd3d4d3, 0xffd3d4d3, 0xffd0d1d0, 0xffcecece, 0xffcecece, 0xffc8cacb, 0xffc3c6c8, 0xffc5c2c5, + 0xffbdbcbd, 0xffbdbcbd, 0xffb5b5b5, 0xffadaead, 0xffadaead, 0xffadaead, 0xff8f908f, 0x44313331, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x55000000, 0x993a3d3a, 0x99424142, 0x99424142, 0x99424142, 0x994d4c4d, + 0x99525452, 0x995a5a5a, 0x995a5a5a, 0x995a5a5a, 0x99606160, 0x99606160, 0x99656565, 0x996b696b, + 0x996b696b, 0x996b6c6e, 0x996b6f70, 0x996b6f70, 0x99737173, 0x99737173, 0x99737373, 0x99737373, + 0x99737573, 0x99737576, 0x99737576, 0x99737579, 0x99767876, 0x99767876, 0x99797b79, 0x997b7d7b, + 0x99817f81, 0x997e7c7e, 0x997e7c7e, 0x99817f81, 0x997e807e, 0x997e807e, 0x99818381, 0x99818381, + 0x99848384, 0x99848384, 0x99848384, 0x99848384, 0x99868486, 0x99898789, 0x99868486, 0x99898789, + 0x99868786, 0x99868786, 0x99868786, 0x99868786, 0x99898889, 0x99898889, 0x998c8a8c, 0x99898889, + 0x99898b89, 0x99898b89, 0x99898b89, 0x99898b89, 0x99898b89, 0x99898b89, 0x99898b89, 0x99898b89, + 0x998c8b8c, 0x998c8b8c, 0x998c8b8c, 0x998c8e8c, 0x998c8e8c, 0x99898a89, 0x998c8e8c, 0x99898a89, + 0x998c8b8c, 0x998c8b8c, 0x998c8b8c, 0x998c8b8c, 0x99898b89, 0x99898b89, 0x99898b89, 0x99868886, + 0x998c8a8c, 0x998c8a8c, 0x99898889, 0x99868786, 0x998c8a8c, 0x99898889, 0x99868786, 0x99868786, + 0x99868786, 0x99898889, 0x998c8a8c, 0x99868786, 0x99868686, 0x99868686, 0x99868686, 0x99868686, + 0x99848484, 0x99848484, 0x99848484, 0x99848384, 0x99818381, 0x997e807e, 0x997e807e, 0x997e807e, + 0x997e7f7e, 0x997e7f7e, 0x997e7f7e, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7b7b, 0x997b797b, + 0x997b797b, 0x997b797b, 0x99767776, 0x99767776, 0x99737573, 0x99707370, 0x996e706e, 0x996b6d6b, + 0x99686968, 0x99686968, 0x99656565, 0x99636163, 0x99636163, 0x995d5c5d, 0x99585658, 0x99525152, + 0x994a494a, 0x994a494a, 0x88313231, 0x77000400, 0x77000000, 0x55000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x22262426, 0xee9fa29f, 0xff9fa29f, 0xff9fa29f, 0xff9fa29f, + 0xffb5b2b5, 0xffbdbabd, 0xffbdbabd, 0xffbdbabd, 0xffc3c2c3, 0xffc3c2c3, 0xffc8c6c8, 0xffcecace, + 0xffcecace, 0xffd0cdd0, 0xffd3d0d3, 0xffd3d0d3, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d5d6, 0xffd6d5d6, + 0xffd6d8d6, 0xffd6d7d6, 0xffd6d9d6, 0xffd6d9d6, 0xffdedbde, 0xffdedbde, 0xffdedcde, 0xffdedfde, + 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdee0de, 0xffe1e1e1, 0xffe4e4e4, 0xffe4e4e4, 0xffe4e4e4, + 0xffe6e4e6, 0xffe6e5e6, 0xffe6e5e6, 0xffe6e5e6, 0xffe6e7e6, 0xffe9e8e9, 0xffe6e7e6, 0xffe9e8e9, + 0xffe6e9ec, 0xffe6e9ec, 0xffe6e9ec, 0xffe6e9ec, 0xffececec, 0xffececec, 0xffececec, 0xffececec, + 0xffefedec, 0xffefece9, 0xffefece9, 0xffefece9, 0xffefecef, 0xffefecef, 0xffefedef, 0xffefecef, + 0xffefedef, 0xffefedef, 0xffefedef, 0xffefefef, 0xffefedef, 0xffefedef, 0xffeeecee, 0xffeee9ee, + 0xffede9ed, 0xffedeaec, 0xffeceaec, 0xffe9eae9, 0xffe8e7e8, 0xffe7e7e7, 0xffe7e5e7, 0xffe4e4e4, + 0xffe4e4e4, 0xffe4e4e4, 0xffe4e4e4, 0xffe4e1e4, 0xffe4e1e4, 0xffe1e0e1, 0xffe1e0e1, 0xffdedfde, + 0xffdedfde, 0xffdedddb, 0xffdedcd9, 0xffdbdcdb, 0xffdbdcdb, 0xffd9d9d9, 0xffd9d9d9, 0xffd6d7d6, + 0xffd3d4d3, 0xffd0d1d0, 0xffd0d1d0, 0xffcecece, 0xffc8cacb, 0xffc3c6c8, 0xffbdc2c5, 0xffc5c2c5, + 0xffbdbcbd, 0xffb5b5b5, 0xffb5b5b5, 0xffadaead, 0xffadaead, 0xff8f908f, 0xbb707370, 0x11191a19, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x33000000, 0x77131413, 0x99424142, 0x99424142, 0x99424142, 0x99424142, + 0x994a4d4a, 0x99525452, 0x99525452, 0x995a5a5a, 0x995a5d5a, 0x99606160, 0x99656565, 0x99656565, + 0x996b696b, 0x996b6c6e, 0x996b6c6e, 0x996b6f70, 0x99737173, 0x99737173, 0x99737373, 0x99737573, + 0x99737576, 0x99737576, 0x99737576, 0x99737579, 0x99767876, 0x99797b79, 0x997b7d7b, 0x997b7d7b, + 0x99817f81, 0x997e7c7e, 0x99817f81, 0x99848284, 0x997e807e, 0x99818381, 0x99818381, 0x99818381, + 0x99848384, 0x99848684, 0x99848684, 0x99848684, 0x99898789, 0x99898789, 0x99898789, 0x998c8a8c, + 0x99898889, 0x99868786, 0x99898889, 0x998c8a8c, 0x998c8a8c, 0x998c8a8c, 0x998c8a8c, 0x998c8a8c, + 0x99898b89, 0x99898b89, 0x99898b89, 0x998c8e8c, 0x99898b89, 0x998c8e8c, 0x99898b89, 0x998c8e8c, + 0x998c8b8c, 0x998c8e8c, 0x998c8b8c, 0x998c8b8c, 0x998c8e8c, 0x998c8e8c, 0x998c8e8c, 0x998c8e8c, + 0x998c8b8c, 0x998c8b8c, 0x998c8b8c, 0x998c8b8c, 0x99898b89, 0x998c8e8c, 0x99898b89, 0x99898b89, + 0x998c8a8c, 0x998c8a8c, 0x998c8a8c, 0x998c8a8c, 0x998c8a8c, 0x998c8a8c, 0x99898889, 0x99898889, + 0x99898889, 0x99868786, 0x99868786, 0x99868786, 0x99898a89, 0x99868686, 0x99868686, 0x99868686, + 0x99848684, 0x99848684, 0x99848684, 0x99848684, 0x99818381, 0x99818381, 0x99818381, 0x997e807e, + 0x99848284, 0x997e7f7e, 0x99818081, 0x997e7f7e, 0x997b7d7b, 0x997b7d7b, 0x997b7c7b, 0x997b7c7b, + 0x997b797b, 0x99797879, 0x99767776, 0x99767776, 0x99737573, 0x996e706e, 0x996b6d6b, 0x996b6d6b, + 0x99686968, 0x99656565, 0x99636163, 0x99636163, 0x995d5c5d, 0x99585658, 0x99585658, 0x99525152, + 0x994a494a, 0x994a494a, 0x77191b19, 0x77000400, 0x77000000, 0x33000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x99737973, 0xff9fa29f, 0xff9fa29f, 0xff9fa29f, + 0xffadaaad, 0xffb5b2b5, 0xffbdbabd, 0xffbdbabd, 0xffbdbebd, 0xffc3c2c3, 0xffc8c6c8, 0xffc8c6c8, + 0xffcecace, 0xffd0cdd0, 0xffd0cdd0, 0xffd3d0d3, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d5d6, 0xffd6d7d6, + 0xffd6d7d6, 0xffd6d8d6, 0xffd6d9d6, 0xffd6d9d6, 0xffdedbde, 0xffdeddde, 0xffdedfde, 0xffdedfde, + 0xffdee1de, 0xffdedfde, 0xffdee0de, 0xffdee3de, 0xffe4e4e4, 0xffe4e4e4, 0xffe4e4e4, 0xffe6e7e6, + 0xffe6e5e6, 0xffe6e7e6, 0xffe6e7e6, 0xffe6e7e6, 0xffe9e8e9, 0xffe9e8e9, 0xffe9e8e9, 0xffefebef, + 0xffe6ebef, 0xffe6e9ec, 0xffe6ebef, 0xffe6ebef, 0xffececec, 0xffececec, 0xffececec, 0xffececec, + 0xffefedec, 0xffefedec, 0xffefefef, 0xffefefef, 0xffefedef, 0xffefefef, 0xffefedef, 0xffefefef, + 0xffefedef, 0xffefefef, 0xffefedef, 0xffefedef, 0xffefedef, 0xffefedef, 0xffeeedef, 0xffeeeded, + 0xffeeebed, 0xffece9eb, 0xffeaeaea, 0xffe8e9e8, 0xffe8e9e8, 0xffe8e9e8, 0xffe6e7e7, 0xffe6e7e6, + 0xffe6e7e6, 0xffe4e4e4, 0xffe4e4e4, 0xffe6e3e6, 0xffe4e1e4, 0xffe6e3e6, 0xffe1e0e1, 0xffdedfde, + 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdbdcdb, 0xffd9d9d9, 0xffd9d9d9, 0xffd9d9d9, 0xffd6d7d6, + 0xffd3d4d3, 0xffd0d1d0, 0xffcecece, 0xffc8cacb, 0xffc3c6c8, 0xffc3c6c8, 0xffbdc2c5, 0xffbdbcbd, + 0xffbdbcbd, 0xffb5b5b5, 0xffadaead, 0xffadaead, 0xffadaead, 0xff8f908f, 0x66525552, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x11000000, 0x55080408, 0x882c2b2c, 0x99424142, 0x99424142, 0x99424142, + 0x99424142, 0x994d4e4d, 0x99525552, 0x99525552, 0x995a5a5d, 0x99636163, 0x99636163, 0x99636163, + 0x9968686e, 0x9968686e, 0x996b6d73, 0x996b6d73, 0x99736d6b, 0x9973706e, 0x99737370, 0x99737573, + 0x99737573, 0x99767776, 0x99767776, 0x997b797b, 0x997b797b, 0x997b797b, 0x997e7c7e, 0x997e7c7e, + 0x997b7d7b, 0x997b7d7b, 0x997e807e, 0x99818381, 0x99848284, 0x99848284, 0x99848284, 0x99848284, + 0x99848684, 0x99848684, 0x99848684, 0x99868786, 0x998c8886, 0x998c8886, 0x998c8886, 0x998c8b89, + 0x998c8a8c, 0x998c8a8c, 0x998c8a8c, 0x998c8a8c, 0x998f8c8f, 0x998f8c8f, 0x998c8a8c, 0x998c8a8c, + 0x998c8e8c, 0x998c8e8c, 0x998c8e8c, 0x998c8e8c, 0x998c8e8c, 0x998c8e8c, 0x998c8e8c, 0x998c8e8c, + 0x998f908f, 0x998c8e8c, 0x998c8e8c, 0x998c8e8c, 0x998c8e8c, 0x998c8e8c, 0x998c8e8c, 0x998c8e8c, + 0x998c8e8c, 0x998c8e8c, 0x998c8e8c, 0x998c8e8c, 0x998c8e8c, 0x998c8e8c, 0x998c8e8c, 0x998c8e8c, + 0x998f8c8f, 0x998c8a8c, 0x998f8c8f, 0x998c8a8c, 0x998c8e8c, 0x998c8a8c, 0x998c8a8c, 0x998c8a8c, + 0x9986888c, 0x9986888c, 0x9986888c, 0x9986888c, 0x998c8886, 0x998c8886, 0x998c8886, 0x998c8886, + 0x99868786, 0x99868786, 0x99848684, 0x99848684, 0x99848684, 0x99848484, 0x99848484, 0x99848384, + 0x99818381, 0x997e807e, 0x997e807e, 0x997e807e, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x99797b79, + 0x9973797b, 0x9973797b, 0x99737779, 0x99737476, 0x99737173, 0x99737173, 0x996e6d6e, 0x99686968, + 0x9963656b, 0x9963656b, 0x99606065, 0x99606065, 0x995a5d5a, 0x995a5d5a, 0x994a4c4a, 0x994a4c4a, + 0x994a494a, 0x88343234, 0x77080408, 0x77080408, 0x66000000, 0x11000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x22000400, 0xdda5a2a5, 0xffa5a2a5, 0xffa5a2a5, + 0xffaaa9aa, 0xffafafaf, 0xffb5b6b5, 0xffb5b6b5, 0xffbdbcbd, 0xffc5c2c5, 0xffc5c2c5, 0xffc5c2c5, + 0xffc8cacb, 0xffcbced0, 0xffcbced0, 0xffcbced0, 0xffd6d1d0, 0xffd6d4d3, 0xffd6d4d3, 0xffd6d7d6, + 0xffd6d7d6, 0xffd9d9d9, 0xffd9d9d9, 0xffdbdcdb, 0xffdeddde, 0xffdeddde, 0xffdeddde, 0xffdeddde, + 0xffdedfde, 0xffe1e1e1, 0xffe1e1e1, 0xffe4e4e4, 0xffe6e3e6, 0xffe6e3e6, 0xffe6e5e6, 0xffe6e5e6, + 0xffe6e7e6, 0xffe6e7e6, 0xffe6e7e6, 0xffe9e9e9, 0xffefebe6, 0xffefebe6, 0xffefebe6, 0xffefece9, + 0xffefebef, 0xffefebef, 0xffefebef, 0xffefedf1, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, + 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, + 0xfff1f2f1, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xfff0efef, 0xfff3f2f2, 0xfff1efef, + 0xfff1eeef, 0xffeeebec, 0xffeeebee, 0xffebe9ea, 0xffe9e9e9, 0xffe6e7e7, 0xffe6e7e6, 0xffe6e8e6, + 0xffe6e7e6, 0xffe6e7e6, 0xffe6e7e6, 0xffe4e4e4, 0xffe4e4e4, 0xffe1e1e1, 0xffe1e1e1, 0xffdedfde, + 0xffdedfde, 0xffdedfde, 0xffdbdddb, 0xffd6dbde, 0xffd6dbde, 0xffd6d8db, 0xffd6d5d9, 0xffd6d7de, + 0xffd0d1d6, 0xffd0d1d6, 0xffcbccce, 0xffc5c6c5, 0xffc5c6c5, 0xffc0c2c0, 0xffc0c2c0, 0xffbdbebd, + 0xffb5b5b5, 0xffb5b5b5, 0xffadabad, 0xffa5a6a5, 0xffa5a6a5, 0xcc707170, 0x11080808, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x33000000, 0x66161616, 0x99424142, 0x99424142, 0x99424142, + 0x99424142, 0x99474847, 0x994d4e4d, 0x99525552, 0x995a5a5d, 0x995a5a5d, 0x99636163, 0x99636163, + 0x9968686e, 0x9968686e, 0x9968686e, 0x996b6d73, 0x99736d6b, 0x99737370, 0x99737573, 0x99737573, + 0x99767776, 0x99767776, 0x99767776, 0x997b797b, 0x997e7c7e, 0x99817f81, 0x997e7c7e, 0x99817f81, + 0x997e807e, 0x997e807e, 0x997e807e, 0x997e807e, 0x99848284, 0x99848686, 0x99848686, 0x99848686, + 0x99848684, 0x99868786, 0x99868786, 0x99868786, 0x998c8886, 0x998c8886, 0x998c8b89, 0x998c8b89, + 0x998c8c8f, 0x998c8c8f, 0x998c8a8c, 0x998c8c8f, 0x998f8c8f, 0x99918f91, 0x998f8c8f, 0x99918f91, + 0x998f8f8f, 0x998f8f8f, 0x998f8f8f, 0x998f8f8f, 0x998f908f, 0x998f908f, 0x998f908f, 0x998f908f, + 0x998f908f, 0x998f908f, 0x998f908f, 0x998f908f, 0x998f908f, 0x998f908f, 0x998f908f, 0x998f908f, + 0x998f908f, 0x998f908f, 0x998c8e8c, 0x998f908f, 0x998c8e8c, 0x998f908f, 0x998f908f, 0x998c8e8c, + 0x99918f91, 0x998f8c8f, 0x998f8c8f, 0x998f8c8f, 0x998c8e8c, 0x998c8e8c, 0x998c8e8c, 0x998c8a8c, + 0x99898b8c, 0x99898b8c, 0x99898b8c, 0x99898b8c, 0x998c8b89, 0x998c8886, 0x998c8b89, 0x998c8886, + 0x99898889, 0x99868786, 0x99868786, 0x99868786, 0x99848684, 0x99848684, 0x99848684, 0x99848684, + 0x99818381, 0x99818381, 0x99818381, 0x997e807e, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x99797b79, + 0x9973797b, 0x99737779, 0x99737779, 0x99737476, 0x99737173, 0x996e6d6e, 0x99686968, 0x99686968, + 0x9963656b, 0x9963656b, 0x99606065, 0x995d5a60, 0x995a5d5a, 0x995a5d5a, 0x994a4c4a, 0x994a4c4a, + 0x99343234, 0x771e1b1e, 0x77080408, 0x77080408, 0x33000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0x55373937, 0xeea5a2a5, 0xffa5a2a5, + 0xffa5a2a5, 0xffaaa9aa, 0xffafafaf, 0xffb5b6b5, 0xffbdbcbd, 0xffbdbcbd, 0xffc5c2c5, 0xffc5c2c5, + 0xffc8cacb, 0xffc8cacb, 0xffc8cacb, 0xffced2d6, 0xffd6d1d0, 0xffd6d4d3, 0xffd6d7d6, 0xffd6d7d6, + 0xffd9d9d9, 0xffd9d9d9, 0xffd9d9d9, 0xffdbdcdb, 0xffdeddde, 0xffdee0de, 0xffdeddde, 0xffdee0de, + 0xffe1e1e1, 0xffe1e1e1, 0xffe4e4e4, 0xffe4e4e4, 0xffe6e5e6, 0xffe6e5e6, 0xffe6e8e6, 0xffe6e8e6, + 0xffe6e7e6, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffefebe6, 0xffefebe6, 0xffefece9, 0xffefece9, + 0xffefedf1, 0xffefedf1, 0xffefedf1, 0xffefedf1, 0xffefefef, 0xfff1f0f1, 0xffefefef, 0xfff1f0f1, + 0xfff1f2f1, 0xfff1f2f1, 0xfff1f2f1, 0xfff1f2f1, 0xfff1f2f1, 0xfff1f2f1, 0xfff1f2f1, 0xfff1f2f1, + 0xfff4f4f4, 0xfff1f2f1, 0xfff1f2f1, 0xfff1f2f1, 0xfff4f4f4, 0xfff1f2f1, 0xfff2f2f1, 0xfff1f0f0, + 0xfff1efef, 0xffefeded, 0xffede9ed, 0xffece9ec, 0xffeae9ea, 0xffe9e9e9, 0xffe9e9e9, 0xffe6e7e6, + 0xffe6e7e6, 0xffe6e7e6, 0xffe6e7e6, 0xffe4e4e4, 0xffe4e4e4, 0xffe4e4e4, 0xffe4e4e4, 0xffdedfde, + 0xffdedfde, 0xffdedfde, 0xffdbdddb, 0xffd6dbde, 0xffd6d8db, 0xffd6d8db, 0xffd6d5d9, 0xffd0d1d6, + 0xffd0d1d6, 0xffcbccce, 0xffcbccce, 0xffc5c6c5, 0xffc5c6c5, 0xffc0c2c0, 0xffbabeba, 0xffbdbebd, + 0xffb5b5b5, 0xffb5b5b5, 0xffadabad, 0xffa5a6a5, 0xdda5a6a5, 0x443c3d3c, 0x00080808, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x55000000, 0x77161616, 0x99424142, 0x99424142, + 0x99424142, 0x99424142, 0x99474847, 0x994d4e4d, 0x99525458, 0x995a5a5d, 0x99636163, 0x99636163, + 0x99656268, 0x9968686e, 0x9968686e, 0x996b6d73, 0x9973706e, 0x99737370, 0x99737573, 0x99737573, + 0x99767776, 0x99767776, 0x997b797b, 0x997b797b, 0x99817f81, 0x99817f81, 0x99817f81, 0x99817f81, + 0x997e807e, 0x997e807e, 0x99818381, 0x99818381, 0x99848686, 0x99848686, 0x99848686, 0x99848686, + 0x99868786, 0x99868786, 0x998c8a8c, 0x998c8a8c, 0x998c8b89, 0x998c8b89, 0x998c8b89, 0x998c8b89, + 0x998c8c8f, 0x998c8c8f, 0x998c8c8f, 0x998c8f91, 0x99918f91, 0x99918f91, 0x99949294, 0x99949294, + 0x99919091, 0x99919091, 0x998f8f8f, 0x99919091, 0x998f908f, 0x99919391, 0x998f908f, 0x99919391, + 0x998f908f, 0x998f908f, 0x99919391, 0x998f908f, 0x998f908f, 0x998f908f, 0x99919391, 0x998f908f, + 0x998f908f, 0x998f908f, 0x99919391, 0x998f908f, 0x998f908f, 0x998f908f, 0x998f908f, 0x998f908f, + 0x99918f91, 0x99918f91, 0x99918f91, 0x99918f91, 0x998c8e8c, 0x998c8e8c, 0x998c8e8c, 0x998c8e8c, + 0x99898b8c, 0x99898b8c, 0x99898b8c, 0x99898b8c, 0x998c8b89, 0x998c8b89, 0x998c8b89, 0x998c8886, + 0x998c8a8c, 0x99868786, 0x99868786, 0x99868786, 0x99848684, 0x99848684, 0x99848684, 0x99848484, + 0x99818381, 0x99818381, 0x99818381, 0x99818381, 0x997b7d7b, 0x997b7d7b, 0x99797b79, 0x99797b79, + 0x99737779, 0x99737779, 0x99737476, 0x99737173, 0x99737173, 0x996e6d6e, 0x99686968, 0x99636563, + 0x9963656b, 0x99606065, 0x99606065, 0x995d5a60, 0x995a5d5a, 0x994a4c4a, 0x994a4c4a, 0x994a4c4a, + 0x771e1b1e, 0x77080408, 0x77080408, 0x55080408, 0x11000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0x00000400, 0x886e6d6e, 0xffa5a2a5, + 0xffa5a2a5, 0xffa5a2a5, 0xffaaa9aa, 0xffafafaf, 0xffb5b5b5, 0xffbdbcbd, 0xffc5c2c5, 0xffc5c2c5, + 0xffc5c6c5, 0xffc8cacb, 0xffc8cacb, 0xffcbced0, 0xffd6d1d0, 0xffd6d4d3, 0xffd6d7d6, 0xffd6d7d6, + 0xffd9d9d9, 0xffd9d9d9, 0xffdbdcdb, 0xffdbdcdb, 0xffdee0de, 0xffdee0de, 0xffdee0de, 0xffdee0de, + 0xffe1e1e1, 0xffe4e4e4, 0xffe4e4e4, 0xffe4e4e4, 0xffe6e5e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, + 0xffe9e9e9, 0xffe9e9e9, 0xffececec, 0xffececec, 0xffefedec, 0xffefece9, 0xffefedec, 0xffefedec, + 0xffefedf1, 0xffefedf1, 0xffefedf1, 0xffeff0f4, 0xfff1f0f1, 0xfff1f0f1, 0xfff4f2f4, 0xfff4f2f4, + 0xfff1f2f1, 0xfff4f4f4, 0xfff1f2f1, 0xfff4f4f4, 0xfff4f4f4, 0xfff4f4f4, 0xfff4f4f4, 0xfff4f4f4, + 0xfff4f4f4, 0xfff4f4f4, 0xfff4f4f4, 0xfff4f4f4, 0xfff4f4f4, 0xfff4f4f4, 0xfff4f4f4, 0xfff2f1f1, + 0xfff0edee, 0xffeceae9, 0xffeae8e7, 0xffeae7ea, 0xffe8e6e8, 0xffeae9ea, 0xffe9e9e9, 0xffe6e8e6, + 0xffe6e8e6, 0xffe6e7e6, 0xffe6e7e6, 0xffe6e7e6, 0xffe4e4e4, 0xffe4e4e4, 0xffe4e4e4, 0xffdedfde, + 0xffdedfde, 0xffdbdddb, 0xffdbdddb, 0xffd6d8db, 0xffd6d8db, 0xffd6d5d9, 0xffd6d2d6, 0xffd0d1d6, + 0xffcbccce, 0xffcbccce, 0xffc5c6c5, 0xffc5c6c5, 0xffc0c2c0, 0xffbabeba, 0xffbabeba, 0xffb5b5b5, + 0xffb5b5b5, 0xffadabad, 0xffadabad, 0xeea5a6a5, 0x773c3d3c, 0x00080808, 0x00080808, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x11000000, 0x55000000, 0x77161616, 0x99424142, + 0x99424142, 0x99424142, 0x99424142, 0x99474847, 0x994a4d52, 0x99525458, 0x995a5a5d, 0x99636163, + 0x99656268, 0x99656268, 0x9968686e, 0x9968686e, 0x99736d6b, 0x9973706e, 0x99737370, 0x99737573, + 0x99737573, 0x99767776, 0x99797879, 0x997b797b, 0x997e7c7e, 0x997e7c7e, 0x99817f81, 0x99848284, + 0x99818381, 0x99818381, 0x99818381, 0x99848684, 0x99848686, 0x99848686, 0x99848686, 0x99848a89, + 0x99898889, 0x998c8a8c, 0x998c8a8c, 0x998c8a8c, 0x998c8b89, 0x998c8e8c, 0x998c8e8c, 0x998c8e8c, + 0x998c8f91, 0x998c8f91, 0x998c8f91, 0x998c9294, 0x99949294, 0x99949294, 0x99949294, 0x99949294, + 0x99949294, 0x99949294, 0x99949294, 0x99949294, 0x99919391, 0x99919391, 0x99919391, 0x99919391, + 0x99919391, 0x99919391, 0x99919391, 0x99919391, 0x99919391, 0x99919391, 0x99919391, 0x99919391, + 0x99919391, 0x99919391, 0x99919391, 0x99919391, 0x99919391, 0x99919391, 0x99919391, 0x998f908f, + 0x99949294, 0x99949294, 0x99949294, 0x99949294, 0x998c928c, 0x998c8e8c, 0x998c8e8c, 0x998c8e8c, + 0x998c8e8c, 0x998c8e8c, 0x998c8e8c, 0x998c8e8c, 0x998c8b89, 0x998c8b89, 0x998c8b89, 0x998c8b89, + 0x998c8a8c, 0x998c8a8c, 0x99868786, 0x99868786, 0x99848684, 0x99848684, 0x99848684, 0x99848684, + 0x99818381, 0x99818381, 0x997e807e, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x99797b79, 0x99767876, + 0x99737476, 0x99737476, 0x99737173, 0x99737173, 0x996e6d6e, 0x99686968, 0x99686968, 0x99636563, + 0x99606065, 0x99606065, 0x995d5a60, 0x995a555a, 0x994a4c4a, 0x994a4c4a, 0x994a4c4a, 0x77292829, + 0x77080408, 0x77080408, 0x66080408, 0x11080408, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0x00000400, 0x00000400, 0x996e6d6e, + 0xeea5a2a5, 0xffa5a2a5, 0xffa5a2a5, 0xffaaa9aa, 0xffadaead, 0xffb5b5b5, 0xffbdbcbd, 0xffc5c2c5, + 0xffc5c6c5, 0xffc5c6c5, 0xffc8cacb, 0xffcbced0, 0xffd6d1d0, 0xffd6d1d0, 0xffd6d4d3, 0xffd6d7d6, + 0xffd6d7d6, 0xffd9d9d9, 0xffdbdcdb, 0xffdbdcdb, 0xffdeddde, 0xffdeddde, 0xffdee0de, 0xffdee3de, + 0xffe4e4e4, 0xffe6e7e6, 0xffe4e4e4, 0xffe6e7e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6ebe6, + 0xffececec, 0xffececec, 0xffececec, 0xffececec, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, + 0xffeff0f4, 0xffeff0f4, 0xffeff0f4, 0xffeff3f7, 0xfff7f3f7, 0xfff7f3f7, 0xfff7f3f7, 0xfff7f3f7, + 0xfff4f4f4, 0xfff4f4f4, 0xfff4f4f4, 0xfff4f4f4, 0xfff7f7f7, 0xfff4f4f4, 0xfff4f4f4, 0xfff7f7f7, + 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff4f4f4, 0xfff4f4f4, 0xfff4f4f4, 0xfff5f5f4, + 0xffefeeeb, 0xffebe8e8, 0xffe8e5e8, 0xffe7e4e8, 0xffe8e5e8, 0xffeae8ea, 0xffe9e9e9, 0xffe6e9e6, + 0xffe6e9e6, 0xffe6e7e6, 0xffe6e8e6, 0xffe6e7e6, 0xffe4e4e4, 0xffe4e4e4, 0xffe1e1e1, 0xffdedfde, + 0xffdedfde, 0xffdbdddb, 0xffd6dbd6, 0xffd6d8db, 0xffd6d5d9, 0xffd6d2d6, 0xffd6d2d6, 0xffcbccce, + 0xffcbccce, 0xffcbccce, 0xffc5c6c5, 0xffc0c2c0, 0xffc0c2c0, 0xffbabeba, 0xffb5bab5, 0xffb5b5b5, + 0xffb5b5b5, 0xffadabad, 0xeea5a2a5, 0x773c3d3c, 0x11080808, 0x00080808, 0x00080808, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x22000000, 0x55000000, 0x77191419, + 0x882f2d2f, 0x99424142, 0x99424142, 0x99424142, 0x993c3b3c, 0x99525152, 0x99525152, 0x99525152, + 0x99636163, 0x99636163, 0x99636163, 0x99636163, 0x99636565, 0x996b7173, 0x996b7173, 0x996b7173, + 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, + 0x99848684, 0x99848684, 0x99848684, 0x99848684, 0x998c8a8c, 0x998c8a8c, 0x998c8a8c, 0x998c8a8c, + 0x99868886, 0x998c8e8c, 0x998c8e8c, 0x998c8e8c, 0x998f8f8f, 0x998f8f8f, 0x998f8f8f, 0x998f8f8f, + 0x99949094, 0x99949094, 0x99949094, 0x999c969c, 0x99949694, 0x99949694, 0x99949694, 0x99949694, + 0x99949694, 0x99949694, 0x99949694, 0x99949694, 0x99949694, 0x99949694, 0x99949694, 0x99949694, + 0x99949694, 0x99949694, 0x99949694, 0x99949694, 0x99949694, 0x99949694, 0x99949694, 0x99949694, + 0x99949694, 0x99949694, 0x99949694, 0x99949694, 0x99949694, 0x99949694, 0x99949694, 0x998f9091, + 0x99949294, 0x99949294, 0x99949294, 0x99949294, 0x998f8c8f, 0x99949294, 0x99949294, 0x99949294, + 0x998c8e8c, 0x998c8e8c, 0x998c8e8c, 0x998c8e8c, 0x998c8e8c, 0x998c8e8c, 0x998c8e8c, 0x998c8e8c, + 0x998c8a8c, 0x998c8a8c, 0x998c8a8c, 0x998c8a8c, 0x99848684, 0x99848684, 0x99848684, 0x99848684, + 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7973, 0x997b7973, 0x997b7973, 0x997b7973, + 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x99636563, 0x99636563, 0x99636563, 0x99636563, + 0x99525552, 0x99525552, 0x99525552, 0x99525552, 0x99525152, 0x88373637, 0x771b1b1b, 0x77000000, + 0x77000305, 0x66000000, 0x22000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x77686968, 0xdd9c9e9c, 0xff9c9e9c, 0xff9c9e9c, 0xffadaaad, 0xffadaaad, 0xffadaaad, 0xffadaaad, + 0xffb8b9b8, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, + 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd9dbde, 0xffdee3e6, 0xffdee3e6, 0xffdee3e6, + 0xffe6e7e6, 0xffe6e7e6, 0xffe6e7e6, 0xffe6e7e6, 0xffefebef, 0xffefebef, 0xffefebef, 0xffefebef, + 0xffe9e9e9, 0xffefefef, 0xffefefef, 0xffefefef, 0xfff1f0ef, 0xfff1f0ef, 0xfff1f0ef, 0xfff1f0ef, + 0xfff1f3f1, 0xfff1f3f1, 0xfff1f3f1, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, + 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, + 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff6f6f6, + 0xffefefef, 0xffeaeae9, 0xffe6e7e7, 0xffe5e4e5, 0xffe5e3e6, 0xffece9ed, 0xffefebef, 0xffe6e7e6, + 0xffe6e7e6, 0xffe6e7e6, 0xffe6e7e6, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffd6dbd6, + 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffc8c9c8, 0xffc5c6c5, + 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xff9c9e9c, + 0xff9c9e9c, 0xcc9c9e9c, 0x55343534, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x22000000, 0x55000000, + 0x66080408, 0x771b181b, 0x99424142, 0x99424142, 0x993c3b3c, 0x993c3b3c, 0x99525152, 0x99525152, + 0x99555555, 0x99555555, 0x99636163, 0x99636163, 0x99636565, 0x99636565, 0x996b7173, 0x996b7173, + 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, + 0x99848684, 0x99848684, 0x99848684, 0x99848684, 0x99848384, 0x998c8a8c, 0x998c8a8c, 0x998c8a8c, + 0x998c8e8c, 0x99868886, 0x998c8e8c, 0x998c8e8c, 0x998f8f8f, 0x99949694, 0x998f8f8f, 0x998f8f8f, + 0x99949094, 0x99949094, 0x99949094, 0x99949094, 0x99949694, 0x99949694, 0x99949694, 0x99949694, + 0x99949694, 0x99949694, 0x99949694, 0x99949694, 0x99949694, 0x99949694, 0x99949694, 0x99949694, + 0x99949694, 0x99949694, 0x99949694, 0x99949694, 0x99949694, 0x99949694, 0x99949694, 0x99949694, + 0x99949694, 0x99949694, 0x99949694, 0x99949694, 0x99949694, 0x99949694, 0x99949694, 0x998f9091, + 0x99949294, 0x99949294, 0x99949294, 0x99949294, 0x99949294, 0x99949294, 0x998f8c8f, 0x99949294, + 0x998c8e8c, 0x998c8e8c, 0x998c8e8c, 0x998c8e8c, 0x998c8e8c, 0x998c8e8c, 0x998c8e8c, 0x99868886, + 0x998c8a8c, 0x998c8a8c, 0x998c8a8c, 0x99848384, 0x99848684, 0x99848684, 0x997e7f7e, 0x997e7f7e, + 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x99767576, 0x997b7973, 0x997b7973, 0x9973706e, 0x9973706e, + 0x99737173, 0x99737173, 0x99656465, 0x99656465, 0x99636563, 0x99636563, 0x99636563, 0x99505150, + 0x99525552, 0x99525552, 0x99525552, 0x993a3b3a, 0x771b1b1b, 0x66000000, 0x77000000, 0x77000000, + 0x66000000, 0x22000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x33343534, 0x99686968, 0xee9c9e9c, 0xffadaaad, 0xffadaaad, 0xffadaaad, 0xffadaaad, + 0xffb8b9b8, 0xffb8b9b8, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c8c3, 0xffc5c8c3, 0xffced2ce, 0xffced2ce, + 0xffd0d1d0, 0xffd0d1d0, 0xffd6dbd6, 0xffd6dbd6, 0xffd9dbde, 0xffd9dbde, 0xffdee3e6, 0xffdee3e6, + 0xffe6e7e6, 0xffe6e7e6, 0xffe6e7e6, 0xffe6e7e6, 0xffe6e5e6, 0xffefebef, 0xffefebef, 0xffefebef, + 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xfff1f0ef, 0xfff7f7f7, 0xfff1f0ef, 0xfff1f0ef, + 0xfff1f3f1, 0xfff1f3f1, 0xfff1f3f1, 0xfff1f3f1, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, + 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, + 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff6f7f6, + 0xfff2f1f1, 0xffebeaea, 0xffe4e5e5, 0xffe3e1e4, 0xffe6e4e7, 0xffedeaed, 0xffefebef, 0xffe6e7e6, + 0xffe6e7e6, 0xffe6e7e6, 0xffe6e7e6, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffd6dbd6, + 0xffd6dbd6, 0xffd6dbd6, 0xffced0ce, 0xffd6d7d6, 0xffc8c9c8, 0xffc8c9c8, 0xffc8c9c8, 0xffc5c6c5, + 0xffc5c6c5, 0xffc5c6c5, 0xffb8b7b8, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xdd9c9e9c, + 0x88686968, 0x33343534, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x11000000, + 0x44080408, 0x66080408, 0x66080408, 0x771b181b, 0x993c3b3c, 0x993c3b3c, 0x993c3b3c, 0x993c3b3c, + 0x99474947, 0x99555555, 0x99555555, 0x99555555, 0x995a5958, 0x99636565, 0x99636565, 0x99636565, + 0x99686868, 0x996e6f6e, 0x996e6f6e, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, + 0x997e7f7e, 0x997e7f7e, 0x997e7f7e, 0x997e7f7e, 0x99848384, 0x99848384, 0x99848384, 0x99848384, + 0x99868886, 0x99868886, 0x99868886, 0x99868886, 0x998f8f8f, 0x99898889, 0x998f8f8f, 0x998f8f8f, + 0x99949094, 0x998c8b8c, 0x99949094, 0x99949094, 0x998f908f, 0x99949694, 0x998f908f, 0x99949694, + 0x998f908f, 0x99949694, 0x99949694, 0x99949694, 0x99949694, 0x99919291, 0x99919291, 0x99919291, + 0x99949694, 0x99949694, 0x99949694, 0x99949694, 0x99919291, 0x99919291, 0x99919291, 0x99919291, + 0x99949694, 0x9991908f, 0x9991908f, 0x9991908f, 0x998f9091, 0x998f9091, 0x998f9091, 0x998f9091, + 0x998f8e8f, 0x998f8e8f, 0x998f8e8f, 0x99949294, 0x99949294, 0x998f8c8f, 0x998f8c8f, 0x998f8c8f, + 0x998c8e8c, 0x998c8e8c, 0x998c8e8c, 0x99868886, 0x99868886, 0x99868886, 0x99868886, 0x99818381, + 0x99848384, 0x99848384, 0x99848384, 0x99848384, 0x997e7f7e, 0x997e7f7e, 0x99797879, 0x99797879, + 0x99767576, 0x99767576, 0x99767576, 0x99767576, 0x9973706e, 0x9973706e, 0x996b6768, 0x996b6768, + 0x99656465, 0x99656465, 0x99656465, 0x99585658, 0x99505150, 0x99505150, 0x99505150, 0x99505150, + 0x993a3b3a, 0x993a3b3a, 0x77212221, 0x66080808, 0x77000000, 0x77000000, 0x77000000, 0x44000000, + 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x11000000, 0x44343534, 0xaa7b797b, 0xeeadaaad, 0xffadaaad, 0xffadaaad, + 0xffaaabaa, 0xffaaabaa, 0xffb8b9b8, 0xffb8b9b8, 0xffbdbdb8, 0xffc5c8c3, 0xffc5c8c3, 0xffc5c8c3, + 0xffd0d1d0, 0xffd0d1d0, 0xffd0d1d0, 0xffd0d1d0, 0xffd3d2d6, 0xffd9dbde, 0xffd9dbde, 0xffd9dbde, + 0xffe1e0e1, 0xffe1e0e1, 0xffe1e0e1, 0xffe6e7e6, 0xffe6e5e6, 0xffe6e5e6, 0xffe6e5e6, 0xffe6e5e6, + 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xfff1f0ef, 0xfff1f0ef, 0xfff1f0ef, 0xfff1f0ef, + 0xfff1f3f1, 0xffecefec, 0xfff1f3f1, 0xfff1f3f1, 0xfff1f3f1, 0xfff7f7f7, 0xfff1f3f1, 0xfff7f7f7, + 0xfff4f3f4, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, + 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff4f3f4, 0xfff7f7f7, 0xfff4f3f4, + 0xfff5f5f4, 0xffeeedec, 0xffe4e4e5, 0xffe1e1e2, 0xffe3e1e3, 0xffe5e4e6, 0xffe6e4e6, 0xffe1dfde, + 0xffe1dfde, 0xffe1dfde, 0xffe1dfde, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffced0ce, + 0xffced0ce, 0xffced0ce, 0xffc5c5c5, 0xffc8c9c8, 0xffc8c9c8, 0xffbabcba, 0xffbabcba, 0xffb8b7b8, + 0xffb8b7b8, 0xffb8b7b8, 0xffaaa9aa, 0xffb5b2b5, 0xeeb5b2b5, 0xdd7b7b7e, 0x997b7b7e, 0x33343534, + 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00080408, 0x22080408, 0x55080408, 0x66080408, 0x66101010, 0x77101010, 0x88262626, 0x883c3b3c, + 0x993a3d3a, 0x993a3d3a, 0x99474947, 0x99474947, 0x99524d4a, 0x99524d4a, 0x995a5958, 0x995a5958, + 0x99636163, 0x99636163, 0x99636163, 0x99686868, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, 0x996b6d6b, + 0x99737173, 0x99737173, 0x99797879, 0x99797879, 0x99737573, 0x997b7c7b, 0x997b7c7b, 0x997b7c7b, + 0x997b7d7b, 0x997b7d7b, 0x99818381, 0x99818381, 0x99848284, 0x99848284, 0x99848284, 0x99848284, + 0x99848684, 0x99848684, 0x99848684, 0x99848684, 0x99848684, 0x99848684, 0x99848684, 0x99848684, + 0x99898b89, 0x99848684, 0x99898b89, 0x99898b89, 0x998c8a8c, 0x998c8a8c, 0x998c8a8c, 0x998c8a8c, + 0x998c8a8c, 0x998c8a8c, 0x998c8a8c, 0x998c8a8c, 0x998c8a8c, 0x998c8a8c, 0x998c8a8c, 0x998c8a8c, + 0x998c8684, 0x998c8684, 0x998c8684, 0x998c8684, 0x9984868c, 0x9984868c, 0x9984868c, 0x9984868c, + 0x99848684, 0x99848684, 0x99848684, 0x99848684, 0x99898789, 0x99848284, 0x99848284, 0x99848284, + 0x99818381, 0x997b7d7b, 0x99818381, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, 0x997b7d7b, + 0x997b7c7b, 0x997b7c7b, 0x99737573, 0x99737573, 0x99737173, 0x99737173, 0x99737173, 0x99737173, + 0x99706d70, 0x99706d70, 0x996b656b, 0x996b656b, 0x99635d63, 0x99635d63, 0x99635d63, 0x99635d63, + 0x99585658, 0x99585658, 0x994a494a, 0x994a494a, 0x993c3d3c, 0x993c3d3c, 0x993c3d3c, 0x88292829, + 0x77080808, 0x66080808, 0x77080808, 0x77080808, 0x77000000, 0x55000000, 0x22000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x11191819, 0x33191819, 0x664a494a, 0xbb7b797b, + 0xdd9c9e9c, 0xee9c9e9c, 0xffaaabaa, 0xffaaabaa, 0xffb5b2ad, 0xffb5b2ad, 0xffb5b2ad, 0xffbdbdb8, + 0xffc5bec5, 0xffc5bec5, 0xffcbc8cb, 0xffcbc8cb, 0xffcecace, 0xffcecace, 0xffcecace, 0xffd3d2d6, + 0xffd6d2d6, 0xffd6d2d6, 0xffdbd9db, 0xffdbd9db, 0xffd6dbd6, 0xffd6dbd6, 0xffdee0de, 0xffdee0de, + 0xffdedfde, 0xffdedfde, 0xffe4e4e4, 0xffe4e4e4, 0xffe6e3de, 0xffe6e3de, 0xffece9e6, 0xffece9e6, + 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, + 0xffefebef, 0xffefebef, 0xffefebef, 0xffefebef, 0xffefebef, 0xffefebef, 0xffefebef, 0xffefebef, + 0xffefebef, 0xffefebef, 0xffefebef, 0xffefebef, 0xffefebef, 0xffefebef, 0xffefebef, 0xffefebef, + 0xffefebe6, 0xffeeeae5, 0xffdedfde, 0xffddddde, 0xffdeddde, 0xffd6d7d6, 0xffd6d7d6, 0xffdbd7d6, + 0xffdbd7d6, 0xffdbd7d6, 0xffd6cece, 0xffcecece, 0xffcecece, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c5c5, + 0xffc5c5c5, 0xffc5c5c5, 0xffbdbabd, 0xffbabcba, 0xffadaead, 0xffadaead, 0xffadaead, 0xffaaa9aa, + 0xffaaa9aa, 0xee9c9a9c, 0xdd9c9a9c, 0xaa7b7b7e, 0x55424347, 0x22080c10, 0x11080c10, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x11000000, 0x22000000, 0x44000000, 0x55030103, 0x66050305, 0x66080408, + 0x66131213, 0x77131213, 0x88262326, 0x883a353a, 0x88313131, 0x99313131, 0x994a494a, 0x994a494a, + 0x994a4d4a, 0x994a4d4a, 0x994a4d4a, 0x994a4d4a, 0x995a595a, 0x995a595a, 0x995a595a, 0x995a595a, + 0x99636563, 0x99636563, 0x99636563, 0x99636563, 0x996b6d73, 0x996b6d73, 0x996b6d73, 0x996b6d73, + 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x997b757b, 0x997b757b, 0x997b757b, 0x997b757b, + 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b, + 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b, + 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b, + 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b, 0x997b797b, + 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, 0x99737573, + 0x996b716b, 0x996b716b, 0x996b716b, 0x996b716b, 0x996b696b, 0x996b696b, 0x996b696b, 0x996b696b, + 0x99636563, 0x99636563, 0x99636563, 0x99636563, 0x995a595a, 0x995a595a, 0x995a595a, 0x995a595a, + 0x99525152, 0x99525152, 0x99525152, 0x99525152, 0x994a494a, 0x994a494a, 0x994a494a, 0x994a494a, + 0x99313531, 0x99313531, 0x88313531, 0x88212321, 0x77191419, 0x77100d10, 0x66080708, 0x66000000, + 0x77000000, 0x77000000, 0x66000000, 0x55000000, 0x22000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00030403, 0x11080c08, + 0x22000400, 0x442f312f, 0x885d5d5d, 0xbb8c8a8c, 0xdd9c9a9c, 0xdd9c9a9c, 0xee9c9a9c, 0xff9c9a9c, + 0xffb5b6b5, 0xffb5b6b5, 0xffb5b6b5, 0xffb5b6b5, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, + 0xffb5b6b5, 0xffb5b6b5, 0xffb5b6b5, 0xffb5b6b5, 0xffbdbebd, 0xffbdbebd, 0xffbdbebd, 0xffbdbebd, + 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffcecace, 0xffcecace, 0xffcecace, 0xffcecace, + 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, + 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, + 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcececd, 0xffcccdce, 0xffcccdcc, + 0xffcbc9cc, 0xffc9c8c9, 0xffc7c4c7, 0xffc2c1c3, 0xffbebdbf, 0xffb6babd, 0xffb5babd, 0xffadaead, + 0xffadaead, 0xffadaead, 0xffadaead, 0xffa5a6a5, 0xffa5a6a5, 0xffa5a6a5, 0xffa5a6a5, 0xffa5a2a5, + 0xffa5a2a5, 0xffa5a2a5, 0xffa5a2a5, 0xee9c9a9c, 0xee9c9a9c, 0xdd9c9a9c, 0xdd9c9a9c, 0xbb7b797b, + 0x77525252, 0x44292b29, 0x22000400, 0x11080c08, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x11000000, 0x33000000, 0x44000000, + 0x55000000, 0x66000000, 0x66000000, 0x66000000, 0x66000000, 0x66191819, 0x77191819, 0x77191819, + 0x88313331, 0x88313331, 0x88313331, 0x88313331, 0x993f3d3f, 0x993f3d3f, 0x993f3d3f, 0x993f3d3f, + 0x99424342, 0x99424342, 0x99424342, 0x99424342, 0x99474a4d, 0x99474a4d, 0x99474a4d, 0x99474a4d, + 0x99504d50, 0x99504d50, 0x99504d50, 0x99504d50, 0x99555155, 0x99555155, 0x99555155, 0x99555155, + 0x99555455, 0x99555455, 0x99555455, 0x99555455, 0x99555455, 0x99555455, 0x99555455, 0x99555455, + 0x99555455, 0x99555455, 0x99555455, 0x99555455, 0x99555455, 0x99555455, 0x99555455, 0x99555455, + 0x99555455, 0x99555455, 0x99555455, 0x99555455, 0x99555455, 0x99555455, 0x99555455, 0x99555455, + 0x99555455, 0x99555455, 0x99555455, 0x99555455, 0x99555455, 0x99555455, 0x99555455, 0x99555455, + 0x99505150, 0x99505150, 0x99505150, 0x99505150, 0x99505150, 0x99505150, 0x99505150, 0x99505150, + 0x994a4d4a, 0x994a4d4a, 0x994a4d4a, 0x994a4d4a, 0x99474847, 0x99474847, 0x99474847, 0x99474847, + 0x99424342, 0x99424342, 0x99424342, 0x99424342, 0x993c3b3c, 0x993c3b3c, 0x993c3b3c, 0x993c3b3c, + 0x99373737, 0x99373737, 0x88373737, 0x88373737, 0x88313131, 0x88313131, 0x77191819, 0x77191819, + 0x77101210, 0x66000000, 0x66000000, 0x66000000, 0x77000000, 0x77000000, 0x66000000, 0x55000000, + 0x44000000, 0x33000000, 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000400, 0x00000400, 0x00000400, 0x11000400, 0x11000400, 0x22000400, 0x44343634, 0x77686868, + 0x99797b79, 0xbb797b79, 0xcc797b79, 0xcc797b79, 0xddadaead, 0xeeadaead, 0xeeadaead, 0xeeadaead, + 0xffb5b6b5, 0xffb5b6b5, 0xffb5b6b5, 0xffb5b6b5, 0xffbdbebd, 0xffbdbebd, 0xffbdbebd, 0xffbdbebd, + 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffcecace, 0xffcecace, 0xffcecace, 0xffcecace, + 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, + 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, + 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcccbcb, 0xffc8c8c9, 0xffc6c5c6, + 0xffb3b2b4, 0xffadadaf, 0xffb0b0b3, 0xffafb1b4, 0xffb1b5b9, 0xffb4b9bc, 0xffb5babd, 0xffadaead, + 0xffadaead, 0xffadaead, 0xeeadaead, 0xeea5a6a5, 0xeea5a6a5, 0xdda5a6a5, 0xdda5a6a5, 0xcca5a2a5, + 0xcca5a2a5, 0xbb6e6d6e, 0x886e6d6e, 0x66343334, 0x55343334, 0x22343334, 0x11000000, 0x11000400, + 0x00000400, 0x00000400, 0x00000400, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x11000000, 0x22000000, 0x33000000, 0x44000000, 0x55000000, 0x55000000, 0x55000000, 0x66000000, + 0x66000000, 0x66000000, 0x66000000, 0x66000000, 0x66080408, 0x66080408, 0x77080408, 0x77242024, + 0x77212221, 0x77212221, 0x77212221, 0x88212221, 0x88242726, 0x88242726, 0x88242726, 0x88242726, + 0x882c282c, 0x882c282c, 0x882c282c, 0x882c282c, 0x882f2d2f, 0x882f2d2f, 0x882f2d2f, 0x992f2d2f, + 0x882f2e2f, 0x882f2e2f, 0x992f2e2f, 0x992f2e2f, 0x992f2e2f, 0x992f2e2f, 0x992f2e2f, 0x992f2e2f, + 0x992f2e2f, 0x992f2e2f, 0x992f2e2f, 0x992f2e2f, 0x992f2e2f, 0x992f2e2f, 0x992f2e2f, 0x992f2e2f, + 0x992f2e2f, 0x992f2e2f, 0x992f2e2f, 0x992f2e2f, 0x992f2e2f, 0x992f2e2f, 0x992f2e2f, 0x992f2e2f, + 0x992f2e2f, 0x992f2e2f, 0x992f2e2f, 0x992f2e2f, 0x992f2e2f, 0x992f2e2f, 0x992f2e2f, 0x992f2e2f, + 0x992c2d2c, 0x992c2d2c, 0x992c2d2c, 0x992c2d2c, 0x992c2d2c, 0x882c2d2c, 0x882c2d2c, 0x882c2d2c, + 0x88292829, 0x88292829, 0x88292829, 0x88292829, 0x88242624, 0x88242624, 0x88242624, 0x88242624, + 0x88212221, 0x88212221, 0x88212221, 0x88212221, 0x771e1e1e, 0x771e1e1e, 0x771e1e1e, 0x771e1e1e, + 0x77000400, 0x66000400, 0x66000400, 0x66000400, 0x66000000, 0x66000000, 0x77000000, 0x77000000, + 0x77000000, 0x66000000, 0x66000000, 0x55000000, 0x44000000, 0x33000000, 0x11000000, 0x11000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000400, 0x00000400, 0x00000400, 0x00000400, 0x00000400, 0x00000400, 0x00000400, 0x00000400, + 0x00000400, 0x00000400, 0x00000400, 0x00000400, 0x22000400, 0x443a3d3a, 0x443a3d3a, 0x663a3d3a, + 0x663c3f3c, 0x773c3f3c, 0x88797b79, 0xaa797b79, 0xbb7e7f7e, 0xbb7e7f7e, 0xbb7e7f7e, 0xbb7e7f7e, + 0xcc848684, 0xcc848684, 0xcc848684, 0xcc848684, 0xcc898889, 0xdd898889, 0xdd898889, 0xdd898889, + 0xdd8c8b8c, 0xdd8c8b8c, 0xdd8c8b8c, 0xdd8c8b8c, 0xdd8c8b8c, 0xdd8c8b8c, 0xee8c8b8c, 0xee8c8b8c, + 0xee8c8b8c, 0xee8c8b8c, 0xee8c8b8c, 0xee8c8b8c, 0xee8c8b8c, 0xee8c8b8c, 0xee8c8b8c, 0xee8c8b8c, + 0xee8c8b8c, 0xee8c8b8c, 0xee8c8b8c, 0xee8c8b8c, 0xee8c8b8c, 0xee8c8b8c, 0xee8b8b8b, 0xee898989, + 0xee878588, 0xee848285, 0xcc7e7d80, 0xbb7b7c7f, 0xbb797c7e, 0xbb797c7e, 0xaa797c7e, 0xaa737473, + 0x88737473, 0x77737473, 0x663a3a3a, 0x55373a37, 0x44373a37, 0x33373a37, 0x22000400, 0x00000400, + 0x00000400, 0x00000400, 0x00000400, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, + 0x00000400, 0x00000400, 0x00000400, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x11000000, 0x11000000, 0x22000000, + 0x33000000, 0x44000000, 0x44000000, 0x55000000, 0x55080408, 0x55080408, 0x66080408, 0x66080408, + 0x66000000, 0x66000000, 0x66000000, 0x66000000, 0x66000400, 0x66000400, 0x66000400, 0x66000400, + 0x66080408, 0x66080408, 0x66080408, 0x66080408, 0x66080808, 0x66080808, 0x66080808, 0x66080808, + 0x66080808, 0x66080808, 0x66080808, 0x66080808, 0x66080808, 0x66080808, 0x66080808, 0x66080808, + 0x66080808, 0x66080808, 0x66080808, 0x66080808, 0x66080808, 0x66080808, 0x66080808, 0x66080808, + 0x66080808, 0x66080808, 0x66080808, 0x66080808, 0x66080808, 0x66080808, 0x66080808, 0x66080808, + 0x66080808, 0x66080808, 0x66080808, 0x66080808, 0x66080808, 0x66080808, 0x66080808, 0x66080808, + 0x66080808, 0x66080808, 0x66080808, 0x66080808, 0x66080808, 0x66080808, 0x66080808, 0x66080808, + 0x66080408, 0x66080408, 0x66080408, 0x66080408, 0x66000400, 0x66000400, 0x66000400, 0x66000400, + 0x66000000, 0x66000000, 0x66000000, 0x66000000, 0x77000000, 0x77000000, 0x77000000, 0x77000000, + 0x66000400, 0x66000400, 0x66000400, 0x55000400, 0x55000000, 0x44000000, 0x44000000, 0x33000000, + 0x22000000, 0x11000000, 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000400, 0x00000400, 0x00000400, 0x00000400, 0x00000400, 0x00000400, 0x00000400, 0x00000400, + 0x00000400, 0x00000400, 0x00000400, 0x00000400, 0x00000400, 0x00000400, 0x00000400, 0x00000400, + 0x00000400, 0x00000400, 0x00000400, 0x00000400, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000400, 0x00000400, 0x00000400, 0x00000400, 0x00000400, 0x00000400, 0x00000400, 0x00000400, + 0x00080408, 0x00080408, 0x00080408, 0x00080408, 0x00080408, 0x00080408, 0x00080408, 0x00080408, + 0x00080408, 0x00080408, 0x00080408, 0x00080408, 0x00080408, 0x00080408, 0x00080408, 0x00080408, + 0x00080408, 0x00080408, 0x00080408, 0x00080408, 0x00080408, 0x00080408, 0x00080408, 0x00080407, + 0x00080408, 0x00060308, 0x00000400, 0x00010100, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0x00000400, 0x00000400, 0x00000400, 0x00000400, + 0x00000400, 0x00000400, 0x00000400, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, + 0x00000400, 0x00000400, 0x00000400, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, + 0x22000000, 0x22000000, 0x22000000, 0x33000000, 0x33000000, 0x33000000, 0x33000000, 0x44000000, + 0x44000000, 0x44000000, 0x44000000, 0x44000000, 0x44000000, 0x55000000, 0x55000000, 0x55000000, + 0x55000000, 0x55000000, 0x55000000, 0x55000000, 0x55000000, 0x55000000, 0x55000000, 0x55000000, + 0x55000000, 0x66000000, 0x66000000, 0x66000000, 0x66000000, 0x66000000, 0x66000000, 0x66000000, + 0x66000000, 0x66000000, 0x66000000, 0x66000000, 0x66000000, 0x55000000, 0x55000000, 0x55000000, + 0x55000000, 0x55000000, 0x55000000, 0x66000000, 0x66000000, 0x66000000, 0x66000000, 0x66000000, + 0x55000000, 0x55000000, 0x55000000, 0x55000000, 0x55000000, 0x55000000, 0x55000000, 0x55000000, + 0x55000000, 0x55000000, 0x44000000, 0x44000000, 0x44000000, 0x44000000, 0x44000000, 0x44000000, + 0x44000000, 0x33000000, 0x33000000, 0x33000000, 0x33000000, 0x33000000, 0x22000000, 0x22000000, + 0x11000000, 0x11000000, 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00030403, 0x00030403, + 0x00050505, 0x00050505, 0x00050505, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00030403, 0x00030403, 0x00030403, + 0x00030303, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x11000000, 0x22000000, 0x22000000, 0x22000000, 0x33000000, 0x33000000, + 0x33000000, 0x33000000, 0x33000000, 0x33000000, 0x33000000, 0x33000000, 0x33000000, 0x33000000, + 0x33000000, 0x33000000, 0x33000000, 0x33000000, 0x33000000, 0x33000000, 0x22000000, 0x22000000, + 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00030403, 0x00050805, 0x11080c08, + 0x22101010, 0x22101010, 0x11101010, 0x11050505, 0x00000400, 0x00000100, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00050805, 0x11050805, 0x11080c08, 0x11080c08, + 0x11080808, 0x00030303, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x11000000, + 0x22000000, 0x22000000, 0x22000000, 0x33000000, 0x22000000, 0x22000000, 0x22000000, 0x11000000, + 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x11000000, 0x55050705, 0xaa101410, 0xcc191819, 0xcc191819, 0xcc191819, 0xcc191819, + 0xcc191c19, 0xcc191c19, 0xcc191c19, 0xcc191c19, 0xcc191c19, 0xcc191c19, 0xcc191c19, 0xcc191c19, + 0xcc191c19, 0xcc191c19, 0xcc191c19, 0xcc191c19, 0xcc191819, 0xcc191819, 0xcc191819, 0xbb191819, + 0x66080808, 0x22000000, 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x11000000, 0x44050405, 0x66100c10, + 0x99101010, 0xbb191819, 0xcc191819, 0xdd191819, 0xcc191819, 0xbb191819, 0x99101010, 0x77101010, + 0x44080408, 0x22030103, 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x11080808, 0x55080808, 0xbb4a494a, 0xdd8c8a8c, 0xeea5a6a5, 0xeea5a6a5, 0xeea5a6a5, 0xeea5a6a5, + 0xeeadaaad, 0xeeadaaad, 0xeeadaaad, 0xeeadaaad, 0xeeadaaad, 0xeeadaaad, 0xeeadaaad, 0xeeadaaad, + 0xeeadaaad, 0xeeadaaad, 0xeeadaaad, 0xeeadaaad, 0xeea5a6a5, 0xeea5a6a5, 0xeea5a6a5, 0xee8c8e8c, + 0xbb3c3b3c, 0x77080808, 0x22080808, 0x00080808, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00080408, 0x00080408, 0x00080408, 0x11080408, 0x33080408, 0x88080408, 0xcc4a464a, 0xee4a464a, + 0xee8c8a8c, 0xffa7a6a7, 0xffa7a6a7, 0xffa7a6a7, 0xffafb3af, 0xff898c89, 0xee898c89, 0xee636563, + 0xcc4a494a, 0x88080408, 0x44080408, 0x22080408, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x22080808, 0xaa080808, 0xdd8c8a8c, 0xffcecace, 0xffcbcccb, 0xffcbcccb, 0xffcbcccb, 0xffcbcccb, + 0xffd3d0d3, 0xffd3d0d3, 0xffd3d0d3, 0xffd3d0d3, 0xffd3d0d3, 0xffd3d0d3, 0xffd3d0d3, 0xffd3d0d3, + 0xffd3d0d3, 0xffd3d0d3, 0xffd3d0d3, 0xffd3d0d3, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffbdbebd, + 0xeea5a2a5, 0xbb080808, 0x33080808, 0x00080808, 0x00000000, 0x110e0d0e, 0x110e0d0e, 0x331b1b1b, + 0x44212021, 0x55212021, 0x44212021, 0x22101010, 0x11100f10, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x110b0b0b, 0x110e0f0e, 0x330e0f0e, 0x441b1e1b, 0x330e0f0e, + 0x220b0b0b, 0x110b0b0b, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00080408, 0x00080408, 0x11080408, 0x55080408, 0xaa4a464a, 0xee8c888c, 0xff8c888c, 0xffcecace, + 0xffc3c2c3, 0xffc3c2c3, 0xffc3c2c3, 0xffdedfde, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffafb3af, + 0xff8c8e8c, 0xee8c8e8c, 0xbb4a494a, 0x66080408, 0x22000000, 0x11000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x22080808, 0xcc080808, 0xee8c8a8c, 0xffcecace, 0xffcbcccb, 0xffcbcccb, 0xffdedfde, 0xffdedfde, + 0xffe6e3e6, 0xffe6e3e6, 0xffe6e3e6, 0xffe6e3e6, 0xffe6e3e6, 0xffe6e3e6, 0xffe6e3e6, 0xffe6e3e6, + 0xffe6e3e6, 0xffe6e3e6, 0xffe6e3e6, 0xffe6e3e6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, + 0xffa5a2a5, 0xdd080808, 0x44080808, 0x00080808, 0x00000000, 0x110e0d0e, 0x331b1b1b, 0x551b1b1b, + 0x77212021, 0x88212021, 0x88212021, 0x55212021, 0x33211e21, 0x11100f10, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x110b0b0b, 0x22161616, 0x441b1e1b, 0x661b1e1b, 0x661b1e1b, 0x551b1e1b, + 0x44161616, 0x220b0b0b, 0x000b0b0b, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00080408, 0x11080408, 0x66080408, 0xcc3c3b3c, 0xee8c888c, 0xffcecace, 0xffcecace, 0xffcecace, + 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, + 0xffced2ce, 0xffced2ce, 0xee8c8e8c, 0xcc4a494a, 0x771b1a1b, 0x22000000, 0x11000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x22080808, 0xcc080808, 0xee8c8a8c, 0xffcecace, 0xffcbcccb, 0xffdedfde, 0xffdedfde, 0xffdedfde, + 0xffe6e3e6, 0xffe6e3e6, 0xffe6e3e6, 0xffe6e3e6, 0xffe6e3e6, 0xffe6e3e6, 0xffe6e3e6, 0xffe6e3e6, + 0xffe6e3e6, 0xffe6e3e6, 0xffe6e3e6, 0xffe6e3e6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, + 0xffa5a2a5, 0xdd080808, 0x55080808, 0x00080808, 0x00000000, 0x220e0d0e, 0x551b1b1b, 0x77292829, + 0x99313131, 0xaa313131, 0xbb313131, 0xaa313131, 0x77312d31, 0x33211e21, 0x11100f10, 0x11000000, + 0x00000000, 0x110b0b0b, 0x22161616, 0x44212021, 0x88292d29, 0x99292d29, 0x99292d29, 0x77292d29, + 0x66212021, 0x33161616, 0x110b0b0b, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x11080408, 0x55080408, 0xcc3c3b3c, 0xffa5aaa5, 0xffcecace, 0xffcecace, 0xffcecace, 0xffcecace, + 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, + 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xff8c8e8c, 0xcc524d52, 0x771b1a1b, 0x22000000, 0x11000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x33101010, 0xcc101010, 0xee9a9a9a, 0xffdedfde, 0xffd6d7d6, 0xffdedfde, 0xffdedfde, 0xffe6e7e6, + 0xffe6e7e6, 0xffe6e7e6, 0xffecedec, 0xffecedec, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, + 0xffefebef, 0xffefebef, 0xffefebef, 0xffefebef, 0xffe4e5e4, 0xffe4e5e4, 0xffdedfde, 0xffdedfde, + 0xffb5b2b5, 0xdd080808, 0x55080808, 0x00080808, 0x00000000, 0x220e0d0e, 0x551b1b1b, 0x88292829, + 0xaa292d29, 0xbb292d29, 0xcc292d29, 0xcc212321, 0xbb2c2e2c, 0x882c2e2c, 0x442c2e2c, 0x22101010, + 0x11191419, 0x22191419, 0x44292629, 0x99292629, 0xbb292729, 0xbb313131, 0xaa313131, 0x99313131, + 0x77212421, 0x44161816, 0x110b0c0b, 0x00000000, 0x11000000, 0x00000000, 0x00000000, 0x00000000, + 0x33080808, 0xbb4a4a4a, 0xee8c8c8c, 0xffcecece, 0xffd6d7d6, 0xffd6d7d6, 0xffdeddde, 0xffdeddde, + 0xffdee3de, 0xffe6e9e6, 0xffe6e9e6, 0xffe6e9e6, 0xffe6e7e6, 0xffe6e7e6, 0xffe6e7e6, 0xffe6e7e6, + 0xffe6e7e6, 0xffdedbde, 0xffdedbde, 0xffd6ced6, 0xee8c8e8c, 0xbb4a494a, 0x55080408, 0x11080408, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00080808, 0x00080808, 0x00080808, 0x00080808, + 0x00000400, 0x00000400, 0x00000400, 0x00000400, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x33101010, 0xcc101010, 0xee9a9a9a, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffe6e7e6, 0xffe6e7e6, + 0xffecedec, 0xffecedec, 0xfff1f4f1, 0xfff1f4f1, 0xfff1f3f1, 0xfff1f3f1, 0xfff1f3f1, 0xfff1f3f1, + 0xfff1f0f1, 0xfff1f0f1, 0xfff1f0f1, 0xfff1f0f1, 0xffe9ece9, 0xffe9ece9, 0xffe4e5e4, 0xffdedfde, + 0xffb5b2b5, 0xdd080808, 0x55080808, 0x00080808, 0x00000000, 0x110e0d0e, 0x441b1b1b, 0x88292829, + 0xbb292d29, 0xcc212321, 0xcc212321, 0xdd191a19, 0xdd1e1f1e, 0xcc1e1f1e, 0x992c2e2c, 0x552c2e2c, + 0x33292629, 0x553a373a, 0x993a373a, 0xcc292629, 0xcc211e21, 0xcc292729, 0xbb292729, 0xbb292729, + 0x88212421, 0x33161816, 0x110b0c0b, 0x11000000, 0x11000000, 0x00000000, 0x00000000, 0x11000000, + 0x88080808, 0xee8c8c8c, 0xffcecece, 0xffcecece, 0xffd6d7d6, 0xffdeddde, 0xffe6e4e6, 0xffe6e4e6, + 0xffe6e9e6, 0xffe6e9e6, 0xffeff0ef, 0xffeff0ef, 0xfff1f2f1, 0xffececec, 0xffececec, 0xffececec, + 0xffe6e7e6, 0xffe6e7e6, 0xffe6e7e6, 0xffdedbde, 0xffced2ce, 0xee8c8e8c, 0x99080408, 0x33080408, + 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x110e0c0e, 0x11131413, 0x22131413, 0x22131413, 0x22131413, + 0x110e120e, 0x110e120e, 0x00000400, 0x00000400, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x33101010, 0xcc101010, 0xee9a9a9a, 0xffdedfde, 0xffdedfde, 0xffe6e7e6, 0xffe6e7e6, 0xffefefef, + 0xfff1f4f1, 0xfff1f4f1, 0xfff1f4f1, 0xfff1f4f1, 0xfff4f7f4, 0xfff4f7f4, 0xfff4f7f4, 0xfff4f7f4, + 0xfff4f6f4, 0xfff4f6f4, 0xfff4f6f4, 0xfff4f6f4, 0xffeff3ef, 0xffe9ece9, 0xffe9ece9, 0xffe4e5e4, + 0xffb5b2b5, 0xdd080808, 0x55080808, 0x00080808, 0x00000000, 0x000e0d0e, 0x221b1b1b, 0x55292829, + 0xaa292d29, 0xcc212321, 0xdd191a19, 0xdd191a19, 0xee101010, 0xdd101010, 0xdd1e1f1e, 0xaa3a3d3a, + 0x774a494a, 0x993a373a, 0xcc292629, 0xdd191419, 0xdd211e21, 0xdd211e21, 0xcc292729, 0xaa292729, + 0x66212421, 0x33161816, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x00000000, 0x44050405, + 0xcc4a4a4a, 0xff8c8c8c, 0xffcecece, 0xffcecece, 0xffdeddde, 0xffe6e4e6, 0xffe6e4e6, 0xffefebef, + 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xfff1f2f1, 0xfff1f2f1, 0xfff1f2f1, 0xfff1f2f1, + 0xffeff3ef, 0xffe6e7e6, 0xffe6e7e6, 0xffe6e7e6, 0xffced2ce, 0xff8c8e8c, 0xcc4a494a, 0x55080408, + 0x22000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x110e0c0e, 0x221b181b, 0x441e201e, 0x661e201e, 0x66292d29, 0x66292d29, + 0x551b1f1b, 0x331b1f1b, 0x110e120e, 0x11000400, 0x00030303, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x33101010, 0xcc101010, 0xee9a9a9a, 0xffdedfde, 0xffdedfde, 0xffe6e7e6, 0xffefefef, 0xffefefef, + 0xfff1f4f1, 0xfff1f4f1, 0xfff7fbf7, 0xfff7fbf7, 0xfff7fbf7, 0xfff7fbf7, 0xfff7fbf7, 0xfff7fbf7, + 0xfff7fbf7, 0xfff7fbf7, 0xfff4f6f4, 0xfff4f6f4, 0xffeff3ef, 0xffeff3ef, 0xffe9ece9, 0xffe4e5e4, + 0xffb5b2b5, 0xdd080808, 0x55080808, 0x00080808, 0x00000000, 0x00000000, 0x110e0d0e, 0x221b1b1b, + 0x66292d29, 0xbb292d29, 0xdd191a19, 0xee101010, 0xee101010, 0xee101010, 0xee101010, 0xdd1e1f1e, + 0xbb292629, 0xdd292629, 0xee191419, 0xee191419, 0xdd191419, 0xdd191419, 0xcc292729, 0x88313131, + 0x44212421, 0x330b0c0b, 0x22000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x66100c10, + 0xee4a4a4a, 0xffcecece, 0xffcecece, 0xffcecece, 0xffe6e4e6, 0xffe6e4e6, 0xffefebef, 0xffefebef, + 0xffeff0ef, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, + 0xffeff3ef, 0xffeff3ef, 0xffe6e7e6, 0xffe6e7e6, 0xffced2ce, 0xffced2ce, 0xee4a494a, 0x88080408, + 0x22000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x110e0c0e, 0x331b181b, 0x66292429, 0x88292d29, 0xaa292d29, 0xaa292d29, 0xaa292d29, + 0x99292d29, 0x77292d29, 0x551b1f1b, 0x220e120e, 0x11080808, 0x00030303, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x33101010, 0xcc101010, 0xee9f9f9f, 0xffe6e7e6, 0xffe6e3e6, 0xffece9ec, 0xfff1f0f1, 0xfff1f0f1, + 0xfff7f7f7, 0xfffafafa, 0xfffcfcfc, 0xfffcfcfc, 0xfffffcff, 0xfffffcff, 0xfffffcff, 0xfffffcff, + 0xfffffcff, 0xfffffcff, 0xfffffbff, 0xfffffbff, 0xfff1f4f1, 0xfff1f4f1, 0xffecedec, 0xffe6e7e6, + 0xffbdbabd, 0xdd080808, 0x55080808, 0x00080808, 0x00000000, 0x00000000, 0x00050405, 0x11100c10, + 0x33212321, 0x77313531, 0xbb313531, 0xee101210, 0xee080808, 0xee080808, 0xee080808, 0xee080808, + 0xee100c10, 0xee100c10, 0xee100c10, 0xee100c10, 0xee101010, 0xdd212021, 0xaa313131, 0x55313131, + 0x33101010, 0x33050505, 0x22000000, 0x11000000, 0x11000000, 0x00000000, 0x11000000, 0x99101310, + 0xee8c8e8c, 0xffc3c4c3, 0xffdedfde, 0xffdedfde, 0xffe6e7e6, 0xffecedec, 0xffecedec, 0xfff1f4f1, + 0xfff7f7f7, 0xfff7f7f7, 0xfffafafa, 0xfffafafa, 0xfffafafa, 0xfffafafa, 0xfffafafa, 0xfff7f7f7, + 0xfffaf6fa, 0xfff4f0f4, 0xfff4f0f4, 0xffefebef, 0xffe6e7e6, 0xffe6e7e6, 0xeea2a3a2, 0xaa191c19, + 0x33000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00030303, + 0x11080808, 0x221e201e, 0x66292d29, 0xaa292d29, 0xbb292d29, 0xcc262726, 0xcc262726, 0xcc262726, + 0xcc262726, 0xbb292d29, 0x88262726, 0x55242224, 0x220b0c0b, 0x11000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x33101010, 0xcc101010, 0xee9f9f9f, 0xffe6e7e6, 0xffe6e3e6, 0xffece9ec, 0xfff1f0f1, 0xfff7f7f7, + 0xfff7f7f7, 0xfffcfcfc, 0xfffcfcfc, 0xffffffff, 0xfffffeff, 0xfffffeff, 0xfffffeff, 0xfffffeff, + 0xfffffeff, 0xfffffeff, 0xfffffeff, 0xfffffbff, 0xfff7fbf7, 0xfff1f4f1, 0xfff1f4f1, 0xffe6e7e6, + 0xffbdbabd, 0xdd080808, 0x55080808, 0x00080808, 0x00000000, 0x00000000, 0x00000000, 0x11050405, + 0x11101210, 0x33212321, 0x77313531, 0xcc313531, 0xee080808, 0xee080808, 0xff080808, 0xff080808, + 0xff050705, 0xee050705, 0xee0b090b, 0xee100c10, 0xee101010, 0xbb313131, 0x77313131, 0x44212021, + 0x33050505, 0x33000000, 0x22000000, 0x11000000, 0x11000000, 0x00000000, 0x22000000, 0xbb191c19, + 0xffa7a9a7, 0xffc3c4c3, 0xffdedfde, 0xffdedfde, 0xffe6e7e6, 0xffecedec, 0xfff1f4f1, 0xfff1f4f1, + 0xfffafafa, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, + 0xfffffbff, 0xfffaf6fa, 0xfff4f0f4, 0xfff4f0f4, 0xffe6e7e6, 0xffe6e7e6, 0xffa2a3a2, 0xcc191c19, + 0x44000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00050505, + 0x11131413, 0x551e201e, 0x99292d29, 0xbb292d29, 0xcc242224, 0xcc242224, 0xdd242224, 0xdd242224, + 0xdd242224, 0xcc262726, 0xbb292d29, 0x88262726, 0x33161816, 0x110b0c0b, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x33101010, 0xcc101010, 0xee9f9f9f, 0xffe6e7e6, 0xffe6e3e6, 0xffece9ec, 0xfff1f0f1, 0xfff7f7f7, + 0xfffafafa, 0xfffcfcfc, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xfffffeff, 0xfffffcff, 0xfff7fbf7, 0xfff1f4f1, 0xfff1f4f1, 0xffe6e7e6, + 0xffbdbabd, 0xdd080808, 0x55080808, 0x00080808, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x11000000, 0x22101210, 0x44212321, 0x88313531, 0xcc2f332f, 0xee080808, 0xff080808, 0xff080808, + 0xff050705, 0xff050705, 0xee0b090b, 0xee100c10, 0xcc212021, 0x99424142, 0x66212021, 0x44101010, + 0x33000000, 0x33000000, 0x22000000, 0x11000000, 0x11000000, 0x00000000, 0x22000000, 0xcc191c19, + 0xffa7a9a7, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffecedec, 0xfff1f4f1, 0xfff1f4f1, 0xfff7fbf7, + 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xffffffff, 0xffffffff, 0xffffffff, 0xfffcfcfc, 0xfffcfcfc, + 0xfffffbff, 0xfffaf6fa, 0xfffaf6fa, 0xfff4f0f4, 0xffe6e7e6, 0xffe6e7e6, 0xffa2a3a2, 0xdd191c19, + 0x44000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00080808, + 0x22131413, 0x66292d29, 0xaa292d29, 0xcc1e201e, 0xdd242224, 0xdd242224, 0xdd242224, 0xdd211c21, + 0xdd211c21, 0xcc242224, 0xbb292d29, 0x99292d29, 0x55212421, 0x220b0c0b, 0x11000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x33101010, 0xcc101010, 0xee9f9f9f, 0xffe6e7e6, 0xffece9ec, 0xfff1f0f1, 0xfff1f0f1, 0xfff7f7f7, + 0xfffafafa, 0xfffcfcfc, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xfffffeff, 0xfffffcff, 0xfff7fbf7, 0xfff1f4f1, 0xfff1f4f1, 0xffecedec, + 0xffbdbabd, 0xdd080808, 0x55080808, 0x00080808, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x11000000, 0x22101210, 0x55313531, 0x99424942, 0xdd1b1e1b, 0xff080808, 0xff080808, + 0xff000400, 0xff050705, 0xff050705, 0xee100c10, 0xcc313131, 0x99424142, 0x66212021, 0x44101010, + 0x33050505, 0x33000000, 0x22000000, 0x11000000, 0x00000000, 0x00000000, 0x33000000, 0xdd191c19, + 0xffa7a9a7, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffecedec, 0xfff1f4f1, 0xfff1f4f1, 0xfff7fbf7, + 0xfffcfcfc, 0xfffcfcfc, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xfffcfcfc, + 0xfffffbff, 0xfffffbff, 0xfffaf6fa, 0xfff4f0f4, 0xffe6e7e6, 0xffe6e7e6, 0xffa2a3a2, 0xdd191c19, + 0x55000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00080808, + 0x33131413, 0x77292d29, 0xbb292d29, 0xcc1e201e, 0xdd211c21, 0xdd242224, 0xdd242224, 0xdd242224, + 0xdd211c21, 0xdd242224, 0xcc292d29, 0xaa292d29, 0x66212421, 0x330b0c0b, 0x11000000, 0x11000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x33101010, 0xcc101010, 0xeea5a2a5, 0xffefebef, 0xffe6e7e6, 0xffececec, 0xfff1f2f1, 0xfff7f7f7, + 0xfff7fbf7, 0xfffafcfa, 0xfffcfefc, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xfffffeff, 0xfffffcff, 0xfff7fbf7, 0xfff4f6f4, 0xfff1f0f1, 0xffefebef, + 0xffbdbabd, 0xdd080808, 0x55080808, 0x00080808, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00080408, 0x11080408, 0x22191619, 0x553a393a, 0xaa424542, 0xee1b1c1b, 0xff080808, 0xff080808, + 0xff000400, 0xff000400, 0xff000400, 0xee0e100e, 0xee1e1e1e, 0xbb3a393a, 0x882c2b2c, 0x551e1e1e, + 0x440e0d0e, 0x33000000, 0x22000000, 0x11000000, 0x00000000, 0x00000000, 0x22000000, 0xcc191c19, + 0xffb8bab8, 0xffdee3de, 0xffdee3de, 0xffdee3de, 0xffefefef, 0xfff1f3f1, 0xfff4f7f4, 0xfff7fbf7, + 0xfffffcff, 0xfffffeff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xfffcfbfc, 0xfffcfbfc, 0xfffaf7fa, 0xfff7f3f7, 0xffe6e7e6, 0xffe6e7e6, 0xffa2a2a2, 0xdd191819, + 0x55000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00080808, + 0x22131713, 0x77292d29, 0xbb292d29, 0xcc1e221e, 0xdd242224, 0xdd242224, 0xdd211c21, 0xdd211c21, + 0xdd191c19, 0xdd1e221e, 0xcc292d29, 0xaa292d29, 0x66292429, 0x330e0c0e, 0x11000000, 0x11000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x33101010, 0xcc101010, 0xeea5a2a5, 0xffefebef, 0xffe6e7e6, 0xffececec, 0xfff1f2f1, 0xfff7f7f7, + 0xfff7fbf7, 0xfffafcfa, 0xfffcfefc, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xfffffeff, 0xfffffcff, 0xfff7fbf7, 0xfff4f6f4, 0xfff1f0f1, 0xffefebef, + 0xffbdbabd, 0xdd080808, 0x55080808, 0x00080808, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00080408, 0x11080408, 0x33292729, 0x773a393a, 0xdd1b1c1b, 0xee080808, 0xff080808, 0xff080808, + 0xff000400, 0xff000400, 0xff000400, 0xee0e100e, 0xee101010, 0xdd1e1e1e, 0xbb3a393a, 0x772c2b2c, + 0x441b1b1b, 0x330e0d0e, 0x22000000, 0x11000000, 0x00000000, 0x00000000, 0x22000000, 0xbb191c19, + 0xff919291, 0xffdee3de, 0xffdee3de, 0xffdee3de, 0xffefefef, 0xfff1f3f1, 0xfff4f7f4, 0xfff7fbf7, + 0xfffffeff, 0xfffffeff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xfffcfbfc, 0xfffcfbfc, 0xfffaf7fa, 0xfff7f3f7, 0xffe6e7e6, 0xffe6e7e6, 0xffa2a2a2, 0xcc191819, + 0x44000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00050505, + 0x22131713, 0x661e221e, 0xaa292d29, 0xcc292d29, 0xdd242224, 0xdd242224, 0xdd211c21, 0xdd211c21, + 0xdd1e221e, 0xdd242724, 0xcc292d29, 0x99242724, 0x551b181b, 0x330e0c0e, 0x11000000, 0x11000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x33101010, 0xcc101010, 0xeea5a2a5, 0xffefebef, 0xffe6e7e6, 0xffececec, 0xfff1f2f1, 0xfff7f7f7, + 0xfff7fbf7, 0xfffafcfa, 0xfffcfefc, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xfffffeff, 0xfffffcff, 0xfff7fbf7, 0xfff4f6f4, 0xfff1f0f1, 0xffefebef, + 0xffbdbabd, 0xdd080808, 0x55080808, 0x00080808, 0x00000000, 0x00000000, 0x00000000, 0x00030103, + 0x11080408, 0x22191619, 0x663a393a, 0xcc292729, 0xee080808, 0xff080808, 0xff080808, 0xff080808, + 0xee0e100e, 0xee0e100e, 0xee0e100e, 0xee0e100e, 0xee101010, 0xee101010, 0xdd1e1e1e, 0xaa2c2b2c, + 0x66292829, 0x330e0d0e, 0x220e0d0e, 0x11000000, 0x11000000, 0x00000000, 0x22000000, 0x99101310, + 0xee919291, 0xffdee3de, 0xffdee3de, 0xffdee3de, 0xffefefef, 0xfff1f3f1, 0xfff4f7f4, 0xfff7fbf7, + 0xfffffcff, 0xfffffeff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xfffcfbfc, 0xfffcfbfc, 0xfffaf7fa, 0xfff7f3f7, 0xffe6e7e6, 0xffe6e7e6, 0xeea2a2a2, 0xaa191819, + 0x44000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00030303, + 0x11080c08, 0x441e221e, 0x88292d29, 0xbb292d29, 0xcc262726, 0xdd242224, 0xdd242224, 0xdd242224, + 0xdd1e221e, 0xcc292d29, 0xbb292d29, 0x88242724, 0x441b181b, 0x330e0c0e, 0x11000000, 0x11000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x33101010, 0xcc101010, 0xeea5a2a5, 0xffefebef, 0xffe6e7e6, 0xffececec, 0xfff1f2f1, 0xfff7f7f7, + 0xfff7fbf7, 0xfffafcfa, 0xfffcfefc, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xfffffeff, 0xfffffcff, 0xfff7fbf7, 0xfff4f6f4, 0xfff1f0f1, 0xffefebef, + 0xffbdbabd, 0xdd080808, 0x55080808, 0x00080808, 0x00000000, 0x00000000, 0x00030103, 0x00080408, + 0x11191619, 0x44292729, 0xaa3a393a, 0xdd191619, 0xee080808, 0xee080808, 0xee080808, 0xee080808, + 0xdd1b1c1b, 0xdd292829, 0xee0e100e, 0xee0e100e, 0xee101010, 0xee1e1e1e, 0xdd1e1e1e, 0xcc2c2b2c, + 0x99292829, 0x55292829, 0x220e0d0e, 0x11000000, 0x11080908, 0x11000000, 0x11000000, 0x77080908, + 0xee6b696b, 0xffb8bab8, 0xffdee3de, 0xffdee3de, 0xffefefef, 0xfff1f3f1, 0xfff4f7f4, 0xfff7fbf7, + 0xfffffcff, 0xfffffeff, 0xfffffeff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xfffcfbfc, 0xfffaf7fa, 0xfffaf7fa, 0xfff7f3f7, 0xffe6e7e6, 0xffe6e7e6, 0xee5d5d5d, 0x88191819, + 0x33000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x11080c08, 0x22131713, 0x661e221e, 0x99292d29, 0xbb292d29, 0xcc292d29, 0xcc262726, 0xcc292d29, + 0xcc292d29, 0xbb292d29, 0x99242724, 0x66191c19, 0x330e0c0e, 0x22000000, 0x11000000, 0x11000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x33101010, 0xcc101010, 0xee9f9f9f, 0xffe6e7e6, 0xffe6e9e6, 0xffe6e9e6, 0xffeff0ef, 0xfff7f7f7, + 0xfffaf7fa, 0xfffcfbfc, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xfffcfcfc, 0xfff7fbf7, 0xfff1f4f1, 0xfff1f4f1, 0xffe6e7e6, + 0xffbdbabd, 0xdd080808, 0x55080808, 0x00080808, 0x00000000, 0x00000000, 0x00000000, 0x110b0c0b, + 0x33262826, 0x88313531, 0xdd1b1c1b, 0xee101010, 0xee101010, 0xee101010, 0xee101010, 0xdd1e1e1e, + 0xaa4a454a, 0x994a454a, 0xcc312f31, 0xdd191a19, 0xee191c19, 0xdd191c19, 0xdd212321, 0xcc292a29, + 0xbb262426, 0x88262426, 0x441b181b, 0x22100c10, 0x22080c08, 0x11030403, 0x11000000, 0x44050805, + 0xcc504c50, 0xff979397, 0xffdedbde, 0xffdedbde, 0xffececec, 0xffececec, 0xfff7f7f7, 0xfff7f7f7, + 0xfffafbfa, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xfffcfcfc, 0xfffcfcfc, + 0xfff7f3f7, 0xfff7f3f7, 0xfff7f3f7, 0xfff7f3f7, 0xffdee3de, 0xff979897, 0xcc504e50, 0x66080408, + 0x22000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x110b0b0b, 0x33161616, 0x66212021, 0x88292d29, 0xaa292d29, 0xbb292d29, 0xbb292d29, + 0xaa292829, 0x88292829, 0x661b1b1b, 0x440e0d0e, 0x33080408, 0x22030103, 0x11000000, 0x11000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x33101010, 0xcc101010, 0xee9f9f9f, 0xffe6e7e6, 0xffdee3de, 0xffe6e9e6, 0xffeff0ef, 0xfff7f7f7, + 0xfffaf7fa, 0xfffcfbfc, 0xfffcfbfc, 0xffffffff, 0xfffcfefc, 0xfffcfefc, 0xfffcfefc, 0xfffcfefc, + 0xffffffff, 0xffffffff, 0xfffcfcfc, 0xfffcfcfc, 0xfff7fbf7, 0xfff1f4f1, 0xfff1f4f1, 0xffe6e7e6, + 0xffbdbabd, 0xdd080808, 0x55080808, 0x00080808, 0x00000000, 0x00000000, 0x110b0c0b, 0x22161816, + 0x66262826, 0xbb262826, 0xdd1b1c1b, 0xee101010, 0xee101010, 0xee101010, 0xdd1e1e1e, 0xaa3a393a, + 0x77312f31, 0x77312f31, 0x88312f31, 0xbb312f31, 0xdd212321, 0xdd212321, 0xdd292a29, 0xcc313131, + 0xbb313131, 0x99262426, 0x661b181b, 0x33100c10, 0x33080c08, 0x11030403, 0x00000000, 0x22000000, + 0x88080408, 0xee979397, 0xffdedbde, 0xffdedbde, 0xffececec, 0xffececec, 0xfff7f7f7, 0xfff7f7f7, + 0xfffafbfa, 0xfffafbfa, 0xfffafbfa, 0xfffafbfa, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, + 0xfff7f3f7, 0xfff7f3f7, 0xfff7f3f7, 0xfff7f3f7, 0xffdee3de, 0xee979897, 0x99080408, 0x44080408, + 0x22000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x11000000, 0x110b0b0b, 0x33161616, 0x441e1f1e, 0x661e1f1e, 0x77292d29, 0x771e1f1e, + 0x661b1b1b, 0x551b1b1b, 0x440e0d0e, 0x33000000, 0x22030103, 0x22000000, 0x11000000, 0x11000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x33101010, 0xcc101010, 0xee9f9f9f, 0xffe6e7e6, 0xffdee3de, 0xffe6e9e6, 0xffeff0ef, 0xffeff0ef, + 0xfffaf7fa, 0xfffaf7fa, 0xfffcfbfc, 0xfffcfbfc, 0xfffafcfa, 0xfffafcfa, 0xfffafcfa, 0xfffafcfa, + 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffafafa, 0xfff1f4f1, 0xfff1f4f1, 0xffecedec, 0xffe6e7e6, + 0xffbdbabd, 0xdd080808, 0x55080808, 0x00080808, 0x00000000, 0x00000000, 0x110b0c0b, 0x44212421, + 0x99262826, 0xcc262826, 0xdd1b1c1b, 0xdd1b1c1b, 0xdd101010, 0xdd1e1e1e, 0xbb3a393a, 0x772c2b2c, + 0x66191a19, 0x66191a19, 0x66191a19, 0x88312f31, 0xaa292a29, 0xcc292a29, 0xcc292a29, 0xbb313131, + 0xaa313131, 0x99262426, 0x77262426, 0x441b181b, 0x33050805, 0x22030403, 0x00000000, 0x11000000, + 0x44080408, 0xbb504c50, 0xee979397, 0xffdedbde, 0xffe1e1e1, 0xffececec, 0xffececec, 0xfff7f7f7, + 0xfff4f7f4, 0xfff4f7f4, 0xfffafbfa, 0xfffafbfa, 0xfffafafa, 0xfffafafa, 0xfffafafa, 0xfff7f7f7, + 0xfff7f3f7, 0xfff7f3f7, 0xfff7f3f7, 0xffe1dfe1, 0xee979897, 0xcc504e50, 0x66080408, 0x33080408, + 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x11000000, 0x110b0b0b, 0x22131213, 0x33131213, 0x44131213, 0x44131213, + 0x440e0d0e, 0x330e0d0e, 0x33000000, 0x22000000, 0x22000000, 0x11000000, 0x11000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x33101010, 0xcc101010, 0xee9f9f9f, 0xffe6e7e6, 0xffdee3de, 0xffe6e9e6, 0xffeff0ef, 0xffeff0ef, + 0xfff7f3f7, 0xfffaf7fa, 0xfffaf7fa, 0xfffaf7fa, 0xfff7fbf7, 0xfff7fbf7, 0xfff7fbf7, 0xfff7fbf7, + 0xfffafafa, 0xfffafafa, 0xfff7f7f7, 0xfff7f7f7, 0xfff1f4f1, 0xfff1f4f1, 0xffecedec, 0xffe6e7e6, + 0xffbdbabd, 0xdd080808, 0x55080808, 0x00080808, 0x00000000, 0x000b0c0b, 0x22161816, 0x66212421, + 0x99262826, 0xbb262826, 0xcc262826, 0xdd1b1c1b, 0xdd1e1e1e, 0xbb2c2b2c, 0x772c2b2c, 0x551e1e1e, + 0x55000400, 0x55000400, 0x55000400, 0x55191a19, 0x66212321, 0x99292a29, 0xaa292a29, 0xaa292a29, + 0x99313131, 0x88262426, 0x661b181b, 0x441b181b, 0x22050805, 0x22030403, 0x00000000, 0x00000000, + 0x22080408, 0x66080408, 0xcc504c50, 0xff979397, 0xffd6d7d6, 0xffe1e1e1, 0xffececec, 0xffececec, + 0xffeff3ef, 0xfff4f7f4, 0xfff4f7f4, 0xfff4f7f4, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, + 0xfff7f3f7, 0xfff7f3f7, 0xffe1dfe1, 0xffb5b6b5, 0xdd504e50, 0x88080408, 0x44080408, 0x22080408, + 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x11000000, 0x11080408, 0x22080408, 0x22080408, 0x22080408, + 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x11000000, 0x11000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x33080808, 0xcc080808, 0xee919491, 0xffd6dbd6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, + 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, + 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xffefebef, 0xffefebef, 0xffefebef, 0xffefebef, + 0xffa5a6a5, 0xdd080408, 0x55080408, 0x00080408, 0x00000000, 0x110b0b0b, 0x33161616, 0x66212021, + 0x88292829, 0xaa292829, 0xbb292829, 0xcc292829, 0xbb292829, 0x77292829, 0x551b1b1b, 0x550e0d0e, + 0x44030303, 0x44000000, 0x44030303, 0x44080808, 0x440b0b0b, 0x55212021, 0x77212021, 0x88212021, + 0x88212021, 0x77212021, 0x55191819, 0x44101010, 0x22080408, 0x11030103, 0x00000000, 0x00000000, + 0x00000000, 0x22000000, 0x771b1b1b, 0xcc525152, 0xee979397, 0xffdedbde, 0xffdedbde, 0xffdedbde, + 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, + 0xffdee3de, 0xffdee3de, 0xff979897, 0xdd504e50, 0x88101410, 0x44000000, 0x22000000, 0x11000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, + 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x22080808, 0xbb080808, 0xee919491, 0xffd6dbd6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, + 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, + 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xffefebef, 0xffefebef, 0xffefebef, 0xffefebef, + 0xeea5a6a5, 0xcc080408, 0x44080408, 0x00080408, 0x00000000, 0x110b0b0b, 0x220b0b0b, 0x44161616, + 0x661e1e1e, 0x77292829, 0x88292829, 0x99292829, 0x77292829, 0x551b1b1b, 0x440e0d0e, 0x44000000, + 0x44000000, 0x33000000, 0x33000000, 0x33000000, 0x33000000, 0x330b0b0b, 0x44161616, 0x66161616, + 0x66191819, 0x66191819, 0x55101010, 0x33101010, 0x22030103, 0x11030103, 0x00000000, 0x00000000, + 0x00000000, 0x11000000, 0x22000000, 0x771b1b1b, 0xbb504c50, 0xee979397, 0xff979397, 0xffdedbde, + 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, + 0xff979897, 0xee979897, 0xcc504e50, 0x88080408, 0x44000000, 0x22000000, 0x11000000, 0x11000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x11000000, 0x11000000, 0x11000000, + 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x11080808, 0x66080808, 0xbb4d4e4d, 0xee919491, 0xeea5a7a5, 0xffa5a7a5, 0xffa5a7a5, 0xffa5a7a5, + 0xffb2b1b2, 0xffb2b1b2, 0xffb2b1b2, 0xffb2b1b2, 0xffb2b1b2, 0xffb2b1b2, 0xffb2b1b2, 0xffb2b1b2, + 0xffb2b1b2, 0xffb2b1b2, 0xffb2b1b2, 0xffb2b1b2, 0xffaaa7aa, 0xffaaa7aa, 0xeeaaa7aa, 0xeeaaa7aa, + 0xcc707070, 0x99080408, 0x33080408, 0x00080408, 0x00000000, 0x00000000, 0x110b0b0b, 0x220b0b0b, + 0x33131313, 0x441e1e1e, 0x441e1e1e, 0x441e1e1e, 0x440e0d0e, 0x440e0d0e, 0x44000000, 0x44000000, + 0x33000000, 0x33000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x220b0b0b, 0x330b0b0b, + 0x44101010, 0x44101010, 0x44080808, 0x33080808, 0x11030103, 0x11000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x11000000, 0x22000000, 0x55080408, 0x99080408, 0xcc504c50, 0xee504c50, + 0xeeaaa9aa, 0xffaaa9aa, 0xffaaa9aa, 0xffaaa9aa, 0xffa7a9a7, 0xffa7a9a7, 0xeea7a9a7, 0xee606260, + 0xcc504e50, 0x99080408, 0x66080408, 0x44080408, 0x22000000, 0x11000000, 0x11000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00080808, 0x22080808, 0x77080808, 0xbb080808, 0xdd212021, 0xdd212021, 0xdd212021, 0xdd212021, + 0xdd292429, 0xdd292429, 0xdd292429, 0xdd292429, 0xdd292429, 0xdd292429, 0xdd292429, 0xdd292429, + 0xdd292429, 0xdd292429, 0xdd292429, 0xdd292429, 0xdd212021, 0xdd212021, 0xdd212021, 0xcc212021, + 0x99080408, 0x44080408, 0x22080408, 0x00080408, 0x00000000, 0x00000000, 0x00000000, 0x110b0b0b, + 0x11080808, 0x11080808, 0x22080808, 0x22080808, 0x33000000, 0x33000000, 0x33000000, 0x33000000, + 0x33000000, 0x22000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x22000000, + 0x22080808, 0x33080808, 0x33080808, 0x22080808, 0x11000000, 0x11000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x11000000, 0x11080408, 0x33080408, 0x55080408, 0x88080408, + 0xaa211c21, 0xcc211c21, 0xdd211c21, 0xdd211c21, 0xdd191c19, 0xcc191c19, 0xaa191c19, 0x88191c19, + 0x66080408, 0x44080408, 0x33080408, 0x22080408, 0x11000000, 0x11000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x11000000, 0x22000000, 0x33000000, 0x44000000, 0x55000000, 0x55000000, 0x55000000, + 0x55000000, 0x55000000, 0x55000000, 0x55000000, 0x55000000, 0x55000000, 0x55000000, 0x55000000, + 0x55000000, 0x55000000, 0x55000000, 0x55000000, 0x55000000, 0x55000000, 0x55000000, 0x44000000, + 0x33000000, 0x22000000, 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x11000000, 0x11000000, 0x11000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, + 0x22000000, 0x11000000, 0x11000000, 0x11000000, 0x00000000, 0x00000000, 0x11000000, 0x11000000, + 0x11000000, 0x11000000, 0x22000000, 0x22000000, 0x11000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x11000000, 0x22000000, 0x22000000, + 0x33000000, 0x44000000, 0x44000000, 0x55000000, 0x55000000, 0x44000000, 0x44000000, 0x33000000, + 0x22000000, 0x22000000, 0x11000000, 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x11000000, 0x11000000, + 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, + 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, + 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, + 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, + 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, + 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, + 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, + 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, + 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x00000000, 0x00000000, 0x11000000, 0x11000000, + 0x00000000, 0x00000000, 0x00000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, + 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, + 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, + 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, + 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, + 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, + 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, + 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, + 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, + 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x22000000, 0x22000000, 0x22000000, + 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, + 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, + 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, + 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, + 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, + 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, + 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, + 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, + 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, + 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, + 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, + 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, + 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, + 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, + 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, + 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, + 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, + 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x33000000, 0x22000000, 0x22000000, + 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, + 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, + 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, + 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, + 0x22000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, + 0x11000000, 0x11000000, 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x11000000, 0x22000000, 0x22000000, 0x33000300, 0x33000300, 0x44000400, 0x44000400, + 0x55080808, 0x55101010, 0x66101010, 0x66191819, 0x661b1e1b, 0x661b1e1b, 0x66292d29, 0x66292d29, + 0x77313531, 0x77313531, 0x77313531, 0x77313531, 0x773a3d3a, 0x773a3d3a, 0x773a3d3a, 0x773a3d3a, + 0x77424142, 0x77424142, 0x77424142, 0x77424142, 0x77424542, 0x77424542, 0x77424542, 0x77424542, + 0x77424542, 0x77424542, 0x77424542, 0x77424542, 0x88424542, 0x88424542, 0x88424542, 0x88424542, + 0x88424542, 0x88424542, 0x88424542, 0x88424542, 0x88424542, 0x88424542, 0x88424542, 0x88424542, + 0x88424142, 0x88424142, 0x88424142, 0x88424142, 0x88424142, 0x88424142, 0x88424142, 0x88424142, + 0x88424142, 0x88424142, 0x88424142, 0x88424142, 0x883a3d3a, 0x883a3d3a, 0x883a3d3a, 0x883a3d3a, + 0x883a3d3a, 0x883a3d3a, 0x883a3d3a, 0x883a3d3a, 0x883a393a, 0x883a393a, 0x883a393a, 0x883a393a, + 0x883a393a, 0x883a393a, 0x883a393a, 0x883a393a, 0x883a393a, 0x883a393a, 0x883a393a, 0x883a393a, + 0x88313531, 0x88313531, 0x88313531, 0x88313531, 0x88313131, 0x88313131, 0x88313131, 0x88313131, + 0x88313131, 0x88313131, 0x88313131, 0x88313131, 0x88312d31, 0x88312d31, 0x88312d31, 0x88312d31, + 0x88312d31, 0x88312d31, 0x88312d31, 0x88312d31, 0x88292d29, 0x88292d29, 0x88292d29, 0x88292d29, + 0x88292d29, 0x88292d29, 0x88292d29, 0x88292d29, 0x88292d29, 0x88292d29, 0x88292d29, 0x88292d29, + 0x88292d29, 0x88292d29, 0x88292d29, 0x88292d29, 0x88292d29, 0x88292d29, 0x88292d29, 0x88292d29, + 0x88292d29, 0x88292d29, 0x88292d29, 0x88292d29, 0x88292d29, 0x88292d29, 0x88292d29, 0x88292d29, + 0x88312d31, 0x88312d31, 0x88312d31, 0x88312d31, 0x88312d31, 0x88312d31, 0x88312d31, 0x88312d31, + 0x88313131, 0x88313131, 0x88313131, 0x88313131, 0x88313131, 0x88313131, 0x88313131, 0x88313131, + 0x88313131, 0x88313131, 0x88313131, 0x88313131, 0x88313531, 0x88313531, 0x88313531, 0x88313531, + 0x88313531, 0x88313531, 0x88313531, 0x88313531, 0x88313531, 0x88313531, 0x88313531, 0x88313531, + 0x883a393a, 0x883a393a, 0x883a393a, 0x883a393a, 0x883a393a, 0x883a393a, 0x883a393a, 0x883a393a, + 0x883a393a, 0x883a393a, 0x883a393a, 0x883a393a, 0x883a393a, 0x883a393a, 0x883a393a, 0x883a393a, + 0x883a393a, 0x883a393a, 0x883a393a, 0x883a393a, 0x88313531, 0x88313531, 0x88313531, 0x88313531, + 0x88313531, 0x77313531, 0x77313531, 0x88313531, 0x88313131, 0x77313131, 0x77313131, 0x77313131, + 0x77292d29, 0x77292d29, 0x77292d29, 0x77292d29, 0x77292829, 0x77292829, 0x77292829, 0x77292829, + 0x77212021, 0x77212021, 0x77212021, 0x77212021, 0x77191819, 0x77191819, 0x77191819, 0x66101010, + 0x66101010, 0x660b0b0b, 0x660b0b0b, 0x660b0b0b, 0x55080808, 0x55080808, 0x55050505, 0x44050505, + 0x33000400, 0x33000400, 0x22000400, 0x22000300, 0x11000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00080408, 0x22080408, 0x44080408, 0x55080408, + 0x66191419, 0x66191419, 0x77423f42, 0x77423f42, 0x77424542, 0x77424542, 0x77606260, 0x77606260, + 0x77636163, 0x77636163, 0x88636163, 0x88636163, 0x886b696b, 0x886b696b, 0x886b696b, 0x886b696b, + 0x99737173, 0x99737173, 0x99737173, 0x99737173, 0x9973797b, 0x9973797b, 0x9973797b, 0x9973797b, + 0xaa7b797b, 0xaa7b797b, 0xaa7b797b, 0xaa7b797b, 0xaa7b797b, 0xaa7b797b, 0xaa7b797b, 0xaa7b797b, + 0xaa7b797b, 0xaa7b797b, 0xaa7b797b, 0xaa7b797b, 0xaa7b797b, 0xaa7b797b, 0xaa7b797b, 0xaa7b797b, + 0xaa7b797b, 0xaa7b797b, 0xaa7b797b, 0xaa7b797b, 0xaa7b797b, 0xaa7b797b, 0xaa7b797b, 0xaa7b797b, + 0xaa7b797b, 0xaa7b797b, 0xaa7b797b, 0xaa7b797b, 0xaa7b7573, 0xaa7b7573, 0xaa7b7573, 0xaa7b7573, + 0xaa737573, 0xaa737573, 0xaa737573, 0xaa737573, 0xaa737573, 0xaa737573, 0xaa737573, 0xaa737573, + 0xaa737573, 0xaa737573, 0xaa737573, 0xaa737573, 0xaa737173, 0xaa737173, 0xaa737173, 0xaa737173, + 0xaa737173, 0xaa737173, 0xaa737173, 0xaa737173, 0xaa737173, 0xaa737173, 0xaa737173, 0xaa737173, + 0xaa737173, 0xaa737173, 0xaa737173, 0xaa737173, 0xaa737173, 0xaa737173, 0xaa737173, 0xaa737173, + 0xaa6b6d6b, 0xaa6b6d6b, 0xaa6b6d6b, 0xaa6b6d6b, 0xaa6b6d6b, 0xaa6b6d6b, 0xaa6b6d6b, 0xaa6b6d6b, + 0xaa6b6d6b, 0xaa6b6d6b, 0xaa6b6d6b, 0xaa6b6d6b, 0xaa6b6d6b, 0xaa6b6d6b, 0xaa6b6d6b, 0xaa6b6d6b, + 0xaa6b6d6b, 0xaa6b6d6b, 0xaa6b6d6b, 0xaa6b6d6b, 0xaa6b696b, 0xaa6b696b, 0xaa6b696b, 0xaa6b696b, + 0xaa6b696b, 0xaa6b696b, 0xaa6b696b, 0xaa6b696b, 0xaa6b6d6b, 0xaa6b6d6b, 0xaa6b6d6b, 0xaa6b6d6b, + 0xaa6b6d6b, 0xaa6b6d6b, 0xaa6b6d6b, 0xaa6b6d6b, 0xaa6b6d6b, 0xaa6b6d6b, 0xaa6b6d6b, 0xaa6b6d6b, + 0xaa6b6d6b, 0xaa6b6d6b, 0xaa6b6d6b, 0xaa6b6d6b, 0xaa6b6d6b, 0xaa6b6d6b, 0xaa6b6d6b, 0xaa6b6d6b, + 0xaa6b6d6b, 0xaa6b6d6b, 0xaa6b6d6b, 0xaa6b6d6b, 0xaa6b6d6b, 0xaa6b6d6b, 0xaa6b6d6b, 0xaa6b6d6b, + 0xaa736d73, 0xaa736d73, 0xaa736d73, 0xaa736d73, 0xaa737173, 0xaa737173, 0xaa737173, 0xaa737173, + 0xaa737173, 0xaa737173, 0xaa737173, 0xaa737173, 0xaa737173, 0xaa737173, 0xaa737173, 0xaa737173, + 0xaa737573, 0xaa737573, 0xbb737573, 0xbb737573, 0xaa737173, 0xaa737173, 0xaa737173, 0xaa737173, + 0xaa737173, 0xaa737173, 0xaa737173, 0xaa737173, 0xaa737173, 0xaa737173, 0xaa737173, 0xaa737173, + 0xaa737173, 0xaa737173, 0xaa737173, 0xaa737173, 0xaa737173, 0xaa737173, 0xaa737173, 0xaa737173, + 0xaa6b6d6b, 0xaa6b6d6b, 0xaa6b6d6b, 0xaa6b6d6b, 0xaa6b696b, 0xaa6b696b, 0xaa6b696b, 0xaa6b696b, + 0xaa6b696b, 0xaa6b696b, 0xaa6b696b, 0xaa6b696b, 0xaa636563, 0xaa636563, 0xaa636563, 0xaa636563, + 0x995a5d5a, 0x995a5d5a, 0x995a5d5a, 0x995a5d5a, 0x99525552, 0x99525552, 0x99525552, 0x88525552, + 0x88424542, 0x88424542, 0x88424542, 0x88424542, 0x88312d31, 0x88312d31, 0x88312d31, 0x88312d31, + 0x88191c19, 0x77191c19, 0x77191c19, 0x77191c19, 0x66080c08, 0x44080c08, 0x33080c08, 0x22080c08, + 0x11080408, 0x00080408, 0x00080408, 0x00080408, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x11000000, 0x55080408, 0x77343134, 0x88605d60, 0x88605d60, + 0x886b6b6b, 0x886b6b6b, 0x886b6b6b, 0x996b6b6b, 0x997e807e, 0x997e807e, 0xaa7e807e, 0xaa7e807e, + 0xaa898a89, 0xaa898a89, 0xaa898a89, 0xaa898a89, 0xbb8c8f8c, 0xbb8c8f8c, 0xbb8c8f8c, 0xbb8c8f8c, + 0xbb949494, 0xbb949494, 0xbb949494, 0xcc949494, 0xcc949797, 0xcc949797, 0xcc949797, 0xcc949797, + 0xcc979a97, 0xcc979a97, 0xcc979a97, 0xcc979a97, 0xcc9c9a9c, 0xcc9c9a9c, 0xcc9c9a9c, 0xcc9c9a9c, + 0xcc9c9a9c, 0xcc9c9a9c, 0xcc9c9a9c, 0xcc9c9a9c, 0xcc9c9a9c, 0xcc9c9a9c, 0xcc9c9a9c, 0xcc9c9a9c, + 0xcc9c9a9c, 0xcc9c9a9c, 0xcc9c9a9c, 0xcc9c9a9c, 0xcc9c9a9c, 0xcc9c9a9c, 0xcc9c9a9c, 0xcc9c9a9c, + 0xcc9c9d9c, 0xcc9c9d9c, 0xcc9c9d9c, 0xcc9c9d9c, 0xcc9c9b9a, 0xcc9c9b9a, 0xcc9c9b9a, 0xcc9c9b9a, + 0xcc9a9b9a, 0xcc9a9b9a, 0xcc9a9b9a, 0xcc9a9b9a, 0xcc9a9b9a, 0xcc9a9b9a, 0xcc9a9b9a, 0xcc9a9b9a, + 0xcc9a9b9a, 0xcc9a9b9a, 0xcc9a9b9a, 0xcc9a9b9a, 0xcc9f9d9f, 0xcc9f9d9f, 0xcc9f9d9f, 0xcc9f9d9f, + 0xcc9f9d9f, 0xcc9f9d9f, 0xcc9f9d9f, 0xcc9f9d9f, 0xcc9f9d9f, 0xcc9f9d9f, 0xcc9f9d9f, 0xcc9f9d9f, + 0xcc9f9d9f, 0xcc9f9d9f, 0xcc9f9d9f, 0xcc9f9d9f, 0xcc9f9d9f, 0xcc9f9d9f, 0xcc9f9d9f, 0xcc9f9d9f, + 0xcc9c9e9c, 0xcc9c9e9c, 0xcc9c9e9c, 0xcc9c9e9c, 0xcc9c9e9c, 0xcc9c9e9c, 0xcc9c9e9c, 0xcc9c9e9c, + 0xcc9c9e9c, 0xcc9c9e9c, 0xcc9c9e9c, 0xcc9c9e9c, 0xcc9c9e9c, 0xcc9c9e9c, 0xcc9c9e9c, 0xcc9c9e9c, + 0xcc9c9e9c, 0xcc9c9e9c, 0xcc9c9e9c, 0xcc9c9e9c, 0xcc9c9d9c, 0xcc9c9d9c, 0xcc9c9d9c, 0xcc9c9d9c, + 0xcc9c9d9c, 0xcc9c9d9c, 0xcc9c9d9c, 0xcc9c9d9c, 0xcc9c9e9c, 0xcc9c9e9c, 0xcc9c9e9c, 0xcc9c9e9c, + 0xcc9c9e9c, 0xcc9c9e9c, 0xcc9c9e9c, 0xcc9c9e9c, 0xcc9c9e9c, 0xcc9c9e9c, 0xcc9c9e9c, 0xcc9c9e9c, + 0xcc9c9e9c, 0xcc9c9e9c, 0xcc9c9e9c, 0xcc9c9e9c, 0xcc9c9e9c, 0xcc9c9e9c, 0xcc9c9e9c, 0xcc9c9e9c, + 0xcc9c9b9c, 0xcc9c9b9c, 0xcc9c9b9c, 0xcc9c9b9c, 0xcc9c9b9c, 0xcc9c9b9c, 0xcc9c9b9c, 0xcc9c9b9c, + 0xcc9f9b9f, 0xcc9f9b9f, 0xcc9f9b9f, 0xcc9f9b9f, 0xcc9f9d9f, 0xcc9f9d9f, 0xcc9f9d9f, 0xcc9f9d9f, + 0xcc9a9d9f, 0xcc9a9d9f, 0xcc9a9d9f, 0xcc9a9d9f, 0xcc9a9a9a, 0xcc9a9a9a, 0xcc9a9a9a, 0xcc9a9a9a, + 0xcc9a9b9a, 0xcc9a9b9a, 0xcc9a9b9a, 0xcc9a9b9a, 0xcc9a9a9a, 0xcc9a9a9a, 0xcc9a9a9a, 0xcc9a9a9a, + 0xcc9a979a, 0xcc9a979a, 0xcc9a979a, 0xcc9a979a, 0xcc9a979a, 0xcc9a979a, 0xcc9a979a, 0xcc9a979a, + 0xcc9a979a, 0xcc9a979a, 0xcc9a979a, 0xcc9a979a, 0xcc94979a, 0xcc94979a, 0xcc94979a, 0xcc94979a, + 0xcc979697, 0xcc979697, 0xcc979697, 0xcc979697, 0xcc919291, 0xcc919291, 0xcc919291, 0xcc919291, + 0xcc919291, 0xcc919291, 0xcc919291, 0xcc919291, 0xcc8f908f, 0xcc8f908f, 0xcc8f908f, 0xcc8f908f, + 0xcc8c8b8c, 0xcc8c8b8c, 0xcc8c8b8c, 0xcc8c8b8c, 0xbb848884, 0xbb848884, 0xbb848884, 0xbb848884, + 0xbb7e7d7e, 0xbb7e7d7e, 0xbb7e7d7e, 0xbb7e7d7e, 0xaa737073, 0xaa737073, 0xaa737073, 0xaa737073, + 0xaa6b6b6b, 0x996b6b6b, 0x99424342, 0x99424342, 0x99373937, 0x88373937, 0x77373937, 0x66080c08, + 0x66080408, 0x22080408, 0x00080408, 0x00080408, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x33000000, 0x77262626, 0x88605d60, 0x88605d60, 0x998c8a8c, 0xaa8c8a8c, + 0xaa949694, 0xaa949694, 0xbb949694, 0xbb949694, 0xbb9c9e9c, 0xcc9c9e9c, 0xcc9c9e9c, 0xcc9c9e9c, + 0xcc9c9e9c, 0xcc9c9e9c, 0xcc9c9e9c, 0xcc9c9e9c, 0xcc9ca29c, 0xcc9ca29c, 0xdd9ca29c, 0xdd9ca29c, + 0xdda5a6a5, 0xdda5a6a5, 0xdda5a6a5, 0xdda5a6a5, 0xdda5a6a5, 0xdda5a6a5, 0xdda5a6a5, 0xdda5a6a5, + 0xdda5aaa5, 0xdda5aaa5, 0xdda5aaa5, 0xdda5aaa5, 0xddadaaad, 0xddadaaad, 0xddadaaad, 0xddadaaad, + 0xddadaaad, 0xddadaaad, 0xddadaaad, 0xddadaaad, 0xddadaaad, 0xddadaaad, 0xddadaaad, 0xddadaaad, + 0xddadaaad, 0xddadaaad, 0xddadaaad, 0xddadaaad, 0xddadaaad, 0xddadaaad, 0xddadaaad, 0xddadaaad, + 0xddadaead, 0xddadaead, 0xddadaead, 0xddadaead, 0xddadaead, 0xddadaead, 0xddadaead, 0xddadaead, + 0xddadaead, 0xddadaead, 0xddadaead, 0xddadaead, 0xddadaead, 0xddadaead, 0xddadaead, 0xddadaead, + 0xddadaead, 0xddadaead, 0xddadaead, 0xddadaead, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, + 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, + 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, + 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, + 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, + 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, + 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, + 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, + 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, + 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, + 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, + 0xddadb2b5, 0xddadb2b5, 0xddadb2b5, 0xddadb2b5, 0xddadaead, 0xddadaead, 0xddadaead, 0xddadaead, + 0xddadaead, 0xddadaead, 0xddadaead, 0xddadaead, 0xddadaead, 0xddadaead, 0xddadaead, 0xddadaead, + 0xddadaaad, 0xddadaaad, 0xddadaaad, 0xddadaaad, 0xddadaaad, 0xddadaaad, 0xddadaaad, 0xddadaaad, + 0xddadaaad, 0xddadaaad, 0xddadaaad, 0xddadaaad, 0xdda5aaad, 0xdda5aaad, 0xdda5aaad, 0xdda5aaad, + 0xddadaaad, 0xddadaaad, 0xddadaaad, 0xddadaaad, 0xdda5a6a5, 0xdda5a6a5, 0xdda5a6a5, 0xdda5a6a5, + 0xdda5a6a5, 0xdda5a6a5, 0xdda5a6a5, 0xdda5a6a5, 0xdda5a6a5, 0xdda5a6a5, 0xdda5a6a5, 0xdda5a6a5, + 0xdda5a2a5, 0xdda5a2a5, 0xdda5a2a5, 0xdda5a2a5, 0xdd9ca29c, 0xdd9ca29c, 0xdd9ca29c, 0xdd9ca29c, + 0xdd9c9a9c, 0xdd9c9a9c, 0xcc9c9a9c, 0xcc9c9a9c, 0xcc949294, 0xcc949294, 0xcc949294, 0xcc949294, + 0xcc949294, 0xcc949294, 0xcc949294, 0xbb6b6b6b, 0xbb656565, 0xbb656565, 0xaa656565, 0xaa656565, + 0xbb656265, 0x77373337, 0x44080408, 0x11080408, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x33000000, 0x884d4c4d, 0x99737173, 0xaa8c8a8c, 0xaa8c8a8c, 0xcc8c8a8c, 0xcc8c8a8c, + 0xcc949694, 0xcc949694, 0xdd949694, 0xdd949694, 0xdd9c9e9c, 0xdd9c9e9c, 0xdd9c9e9c, 0xdd9c9e9c, + 0xdd9c9e9c, 0xdd9c9e9c, 0xdd9c9e9c, 0xdd9c9e9c, 0xdd9ca29c, 0xdd9ca29c, 0xdd9ca29c, 0xdd9ca29c, + 0xdda5a6a5, 0xdda5a6a5, 0xdda5a6a5, 0xdda5a6a5, 0xdda5a6a5, 0xdda5a6a5, 0xdda5a6a5, 0xdda5a6a5, + 0xdda5aaa5, 0xdda5aaa5, 0xdda5aaa5, 0xdda5aaa5, 0xddadaaad, 0xddadaaad, 0xddadaaad, 0xddadaaad, + 0xddadaaad, 0xddadaaad, 0xddadaaad, 0xddadaaad, 0xddadaaad, 0xddadaaad, 0xddadaaad, 0xddadaaad, + 0xddadaaad, 0xddadaaad, 0xddadaaad, 0xddadaaad, 0xddadaaad, 0xddadaaad, 0xddadaaad, 0xddadaaad, + 0xddadaead, 0xddadaead, 0xddadaead, 0xddadaead, 0xddadaead, 0xddadaead, 0xddadaead, 0xddadaead, + 0xddadaead, 0xddadaead, 0xddadaead, 0xddadaead, 0xddadaead, 0xddadaead, 0xddadaead, 0xddadaead, + 0xddadaead, 0xddadaead, 0xddadaead, 0xddadaead, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, + 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, + 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, + 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, + 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, + 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, + 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, + 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, + 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, + 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, + 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, + 0xddadb2b5, 0xddadb2b5, 0xddadb2b5, 0xddadb2b5, 0xddadaead, 0xddadaead, 0xddadaead, 0xddadaead, + 0xddadaead, 0xddadaead, 0xddadaead, 0xddadaead, 0xddadaead, 0xddadaead, 0xddadaead, 0xddadaead, + 0xddadaaad, 0xddadaaad, 0xddadaaad, 0xddadaaad, 0xddadaaad, 0xddadaaad, 0xddadaaad, 0xddadaaad, + 0xddadaaad, 0xddadaaad, 0xddadaaad, 0xddadaaad, 0xdda5aaad, 0xdda5aaad, 0xdda5aaad, 0xdda5aaad, + 0xddadaaad, 0xddadaaad, 0xddadaaad, 0xddadaaad, 0xdda5a6a5, 0xdda5a6a5, 0xdda5a6a5, 0xdda5a6a5, + 0xdda5a6a5, 0xdda5a6a5, 0xdda5a6a5, 0xdda5a6a5, 0xdda5a6a5, 0xdda5a6a5, 0xdda5a6a5, 0xdda5a6a5, + 0xdda5a2a5, 0xdda5a2a5, 0xdda5a2a5, 0xdda5a2a5, 0xdd9ca29c, 0xdd9ca29c, 0xdd9ca29c, 0xdd9ca29c, + 0xdd9c9a9c, 0xdd9c9a9c, 0xdd9c9a9c, 0xdd9c9a9c, 0xdd949294, 0xdd949294, 0xdd949294, 0xdd949294, + 0xdd949294, 0xdd949294, 0xdd949294, 0xdd949294, 0xdd949294, 0xcc949294, 0xcc949294, 0xcc949294, + 0xee949294, 0xbb656265, 0x99373337, 0x55080408, 0x11080808, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x11100c10, 0x773c393a, 0x9994928c, 0xbb94928c, 0xcc8f908f, 0xcc8f908f, 0xdd9ca29c, 0xdd9ca29c, + 0xdda5a1a2, 0xdda5a1a2, 0xdda5a1a2, 0xdda5a1a2, 0xdda7a6a7, 0xdda7a6a7, 0xdda7a6a7, 0xdda7a6a7, + 0xdda7a6a7, 0xdda7a6a7, 0xdda7a6a7, 0xdda7a6a7, 0xdda7a6a7, 0xdda7a6a7, 0xdda7a6a7, 0xdda7a6a7, + 0xdda7a9a7, 0xdda7a9a7, 0xdda7a9a7, 0xdda7a9a7, 0xdda7a9a7, 0xdda7a9a7, 0xdda7a9a7, 0xdda7a9a7, + 0xdda7a6a7, 0xdda7a6a7, 0xdda7a6a7, 0xdda7a6a7, 0xdda7a6a7, 0xdda7a6a7, 0xdda7a6a7, 0xdda7a6a7, + 0xdda7a6a7, 0xddb5b2b5, 0xddb5b2b5, 0xdda7a6a7, 0xddadaead, 0xddadaead, 0xddadaead, 0xddadaead, + 0xddb5aead, 0xddb5aead, 0xddb5aead, 0xddb5aead, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, + 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, + 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, + 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, + 0xddb5bab5, 0xddb5bab5, 0xddb5bab5, 0xddb5bab5, 0xddb5bab5, 0xddb5bab5, 0xddb5bab5, 0xddb5bab5, + 0xddbdbabd, 0xddbdbabd, 0xddbdbabd, 0xddbdbabd, 0xddbdbabd, 0xddbdbabd, 0xddbdbabd, 0xddbdbabd, + 0xddbdbabd, 0xddbdbabd, 0xddbdbabd, 0xddbdbabd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, + 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, + 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, + 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, + 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, + 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, + 0xddbdbabd, 0xddbdbabd, 0xddbdbabd, 0xddbdbabd, 0xddb5bab5, 0xddb5bab5, 0xddb5bab5, 0xddb5bab5, + 0xddb5bab5, 0xddb5bab5, 0xddb5bab5, 0xddb5bab5, 0xddb2b3b2, 0xddb2b3b2, 0xddb2b3b2, 0xddb2b3b2, + 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, + 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, + 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, + 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xdda7a6a7, + 0xdda7a6a7, 0xdda7a6a7, 0xdda7a6a7, 0xdda7a6a7, 0xdda7a6a7, 0xdda7a6a7, 0xdda7a6a7, 0xdda7a6a7, + 0xdda7a6a7, 0xdda7a6a7, 0xdda7a6a7, 0xdda7a6a7, 0xdda7a9a7, 0xdda7a9a7, 0xdda7a9a7, 0xdda7a9a7, + 0xdda7a9a7, 0xdda7a9a7, 0xdda7a9a7, 0xdda7a9a7, 0xdda7a6a7, 0xdda7a6a7, 0xdda7a6a7, 0xdda7a6a7, + 0xdda7a6a7, 0xdda7a6a7, 0xdda7a6a7, 0xdda7a6a7, 0xdda7a6a7, 0xdd9a9a9a, 0xdd9a9a9a, 0xdd9a9a9a, + 0xdd9a9a9a, 0xdd9a9a9a, 0xdd9a9a9a, 0xdd9a9a9a, 0xdd9a979a, 0xdd9a979a, 0xdd9a979a, 0xdd9a979a, + 0xeea5a2a5, 0xdd8c8b8c, 0xbb8c8b8c, 0xaa5a5d5a, 0x662c2d2c, 0x11000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x44100c10, 0x99686563, 0xbb94928c, 0xcc94928c, 0xdd9ca29c, 0xcc8f908f, 0xdd9ca29c, 0xdd9ca29c, + 0xdda5a1a2, 0xdda5a1a2, 0xdda5a1a2, 0xdda5a1a2, 0xdda7a6a7, 0xdda7a6a7, 0xdda7a6a7, 0xdda7a6a7, + 0xdda7a6a7, 0xdda7a6a7, 0xdda7a6a7, 0xdda7a6a7, 0xdda7a6a7, 0xdda7a6a7, 0xdda7a6a7, 0xdda7a6a7, + 0xdda7a9a7, 0xdda7a9a7, 0xdda7a9a7, 0xdda7a9a7, 0xdda7a9a7, 0xdda7a9a7, 0xdda7a9a7, 0xdda7a9a7, + 0xddb5b2b5, 0xddb5b2b5, 0xdda7a6a7, 0xdda7a6a7, 0xddb5b2b5, 0xdda7a6a7, 0xddb5b2b5, 0xddb5b2b5, + 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddadaead, 0xddadaead, 0xddadaead, 0xddadaead, + 0xddb5aead, 0xddb5aead, 0xddb5aead, 0xddb5aead, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, + 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, + 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, + 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, + 0xddb5bab5, 0xddb5bab5, 0xddb5bab5, 0xddb5bab5, 0xddb5bab5, 0xddb5bab5, 0xddb5bab5, 0xddb5bab5, + 0xddbdbabd, 0xddbdbabd, 0xddbdbabd, 0xddbdbabd, 0xddbdbabd, 0xddbdbabd, 0xddbdbabd, 0xddbdbabd, + 0xddbdbabd, 0xddbdbabd, 0xddbdbabd, 0xddbdbabd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, + 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, + 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, + 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, + 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, + 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, + 0xddbdbabd, 0xddbdbabd, 0xddbdbabd, 0xddbdbabd, 0xddb5bab5, 0xddb5bab5, 0xddb5bab5, 0xddb5bab5, + 0xddb5bab5, 0xddb5bab5, 0xddb5bab5, 0xddb5bab5, 0xddb2b3b2, 0xddb2b3b2, 0xddb2b3b2, 0xddb2b3b2, + 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, + 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, + 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, + 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, + 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xdda7a6a7, 0xddb5b2b5, + 0xddb5b2b5, 0xddb5b2b5, 0xdda7a6a7, 0xdda7a6a7, 0xdda7a9a7, 0xdda7a9a7, 0xdda7a9a7, 0xdda7a9a7, + 0xdda7a9a7, 0xdda7a9a7, 0xdda7a9a7, 0xdda7a9a7, 0xdda7a6a7, 0xdda7a6a7, 0xdda7a6a7, 0xdda7a6a7, + 0xdda7a6a7, 0xdda7a6a7, 0xdda7a6a7, 0xdda7a6a7, 0xdda7a6a7, 0xdda7a6a7, 0xdda7a6a7, 0xdd9a9a9a, + 0xdd9a9a9a, 0xdd9a9a9a, 0xdd9a9a9a, 0xdd9a9a9a, 0xdd9a979a, 0xdd9a979a, 0xdd9a979a, 0xdd9a979a, + 0xeea5a2a5, 0xeea5a2a5, 0xdd8c8b8c, 0xcc8c8b8c, 0xbb585958, 0x332c2d2c, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00050405, + 0x773c393a, 0xbb94928c, 0xcc94928c, 0xdd94928c, 0xdd9ca29c, 0xdd817f81, 0xff736d73, 0xff817f81, + 0xff847d7b, 0xff948f8f, 0xff948f8f, 0xff948f8f, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, + 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, + 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, + 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, + 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, + 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, + 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, + 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, + 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, + 0xff8c928c, 0xff8c928c, 0xff8c928c, 0xff8c928c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, + 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, + 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, + 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, + 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, + 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, + 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, + 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, + 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, + 0xff8c928c, 0xff8c928c, 0xff8c928c, 0xff8c928c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, + 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, + 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, + 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, + 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, + 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, + 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, + 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, + 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, + 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8a8c, 0xff8c8a8c, 0xff8c8a8c, 0xff8c8a8c, + 0xffa5a2a5, 0xeea5a2a5, 0xdda5a2a5, 0xdda5a2a5, 0xdd848684, 0x77585958, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x11100c10, + 0x88686563, 0xcc94928c, 0xdd94928c, 0xdd94928c, 0xdd9ca29c, 0xdd817f81, 0xff817f81, 0xff8f908f, + 0xffa5a1a2, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, + 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, + 0xffb5b6b5, 0xffb5b6b5, 0xffb5b6b5, 0xffb5b6b5, 0xffb5b6b5, 0xffb5b6b5, 0xffb5b6b5, 0xffb5b6b5, + 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, + 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, + 0xffb5aead, 0xffb5aead, 0xffb5aead, 0xffb5aead, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, + 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, + 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, + 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, + 0xffb5bab5, 0xffb5bab5, 0xffb5bab5, 0xffb5bab5, 0xffb5bab5, 0xffb5bab5, 0xffb5bab5, 0xffb5bab5, + 0xffbdbabd, 0xffbdbabd, 0xffbdbabd, 0xffbdbabd, 0xffbdbabd, 0xffbdbabd, 0xffbdbabd, 0xffbdbabd, + 0xffbdbabd, 0xffbdbabd, 0xffbdbabd, 0xffbdbabd, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, + 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, + 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, + 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, + 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, + 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, + 0xffbdbabd, 0xffbdbabd, 0xffbdbabd, 0xffbdbabd, 0xffb5bab5, 0xffb5bab5, 0xffb5bab5, 0xffb5bab5, + 0xffb5bab5, 0xffb5bab5, 0xffb5bab5, 0xffb5bab5, 0xffb2b3b2, 0xffb2b3b2, 0xffb2b3b2, 0xffb2b3b2, + 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, + 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, + 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, + 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, + 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, + 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b6b5, 0xffb5b6b5, 0xffb5b6b5, 0xffb5b6b5, + 0xffb5b6b5, 0xffb5b6b5, 0xffb5b6b5, 0xffb5b6b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, + 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, + 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffb5b2b5, 0xffa7a5a7, + 0xffa5a2a5, 0xeea5a2a5, 0xdda5a2a5, 0xdda5a2a5, 0xdd848684, 0xaa585958, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x22191419, + 0x99636163, 0xcc898a89, 0xdd9c9e9c, 0xdd9c9e9c, 0xdda7a6a7, 0xdd949294, 0xff949294, 0xffa7a6a7, + 0xffbdbebd, 0xffd0d2d0, 0xffd0d2d0, 0xffd0d2d0, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, + 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, + 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, + 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, + 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, + 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, + 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, + 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, + 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, + 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, + 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, + 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, + 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, + 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, + 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, + 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, + 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, + 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, + 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, + 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, + 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, + 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, + 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, + 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, + 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, + 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, + 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, + 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffd0d2d0, 0xffd0d2d0, 0xffd0d2d0, 0xffbdbebd, + 0xffb2b2b2, 0xee9c9a9c, 0xdd9c9a9c, 0xdd9c9a9c, 0xdd9c9e9c, 0xbb686968, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x33191419, + 0xaa636163, 0xdd898a89, 0xdd9c9e9c, 0xdd9c9e9c, 0xdda7a6a7, 0xdd949294, 0xffa7a6a7, 0xffbababa, + 0xffd0d2d0, 0xffe4e7e4, 0xffe4e7e4, 0xffe4e7e4, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, + 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, + 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, + 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, + 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, + 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, + 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, + 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, + 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, + 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, + 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, + 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, + 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, + 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, + 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, + 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, + 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, + 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, + 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, + 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, + 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, + 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, + 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, + 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, + 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, + 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, + 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, + 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffeff0ef, 0xffe4e7e4, 0xffe4e7e4, 0xffe4e7e4, 0xffd0d2d0, + 0xffb2b2b2, 0xeea7a6a7, 0xdd9c9a9c, 0xdd9c9a9c, 0xdd9c9e9c, 0xcc686968, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x33100d10, + 0xaa636163, 0xdd898a89, 0xdd9c9e9c, 0xdd9c9e9c, 0xdda7a6a7, 0xdd949294, 0xffa7a6a7, 0xffcecece, + 0xffe4e7e4, 0xfff7fbf7, 0xfff7fbf7, 0xfff7fbf7, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xfff7fbf7, 0xfff7fbf7, 0xfff7fbf7, 0xffe4e7e4, + 0xffbdbebd, 0xeea7a6a7, 0xdd9c9a9c, 0xdd9c9a9c, 0xdd9c9e9c, 0xcc686968, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x33100d10, + 0xaa636163, 0xdd898a89, 0xdd9c9e9c, 0xdd9c9e9c, 0xdda7a6a7, 0xdd949294, 0xffbababa, 0xffcecece, + 0xffe4e7e4, 0xfff7fbf7, 0xfff7fbf7, 0xfff7fbf7, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xfff7fbf7, 0xfff7fbf7, 0xfff7fbf7, 0xffe4e7e4, + 0xffbdbebd, 0xeea7a6a7, 0xdd9c9a9c, 0xdd9c9a9c, 0xdd9c9e9c, 0xcc9c9e9c, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x33101010, + 0xaa4a5152, 0xdd868a89, 0xdda5a6a5, 0xdda5a6a5, 0xddadadad, 0xdd9c9a9c, 0xffadadad, 0xffced2ce, + 0xffe6ebe6, 0xfff7f8f7, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xfff7f8f7, 0xffe6ebe6, + 0xffbdbebd, 0xeea7a9a7, 0xdd9c9e9c, 0xdd9c9e9c, 0xdda5aaa5, 0xcc6e736e, 0x00000400, 0x00000300, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x22191819, + 0x994a5152, 0xdd868a89, 0xdda5a6a5, 0xdda5a6a5, 0xddadadad, 0xdd9c9a9c, 0xffadadad, 0xffced2ce, + 0xffe6ebe6, 0xfff7f8f7, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xfff7f8f7, 0xffe6ebe6, + 0xffbdbebd, 0xeea7a9a7, 0xdd9c9e9c, 0xdd9c9e9c, 0xdda5aaa5, 0xbb6e736e, 0x00000400, 0x00000400, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x22101010, + 0x994a5152, 0xcc868a89, 0xdda5a6a5, 0xdda5a6a5, 0xddadadad, 0xdd9c9a9c, 0xffadadad, 0xffced2ce, + 0xffe6ebe6, 0xfff7f8f7, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xfff7f8f7, 0xffe6ebe6, + 0xffbdbebd, 0xeea7a9a7, 0xdd9c9e9c, 0xdd9c9e9c, 0xdda5aaa5, 0xbb6e736e, 0x00000400, 0x00000400, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x22101010, + 0x994a5152, 0xcc868a89, 0xdda5a6a5, 0xdda5a6a5, 0xddadadad, 0xdd9c9a9c, 0xffadadad, 0xffced2ce, + 0xffe6ebe6, 0xfff7f8f7, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xfff7f8f7, 0xffe6ebe6, + 0xffbdbebd, 0xeea7a9a7, 0xdd9c9e9c, 0xdd9c9e9c, 0xdda5aaa5, 0xbb6e736e, 0x00000400, 0x00000400, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x22101010, + 0x884a494a, 0xcc868486, 0xdda5a2a5, 0xdda5a2a5, 0xddadaead, 0xdd9c9a9c, 0xffadaead, 0xffced7ce, + 0xffe6ebe6, 0xfff7f8f7, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xfff7f8f7, 0xffe6ebe6, + 0xffc5c2c5, 0xeeaaaaaa, 0xdd9c9e9c, 0xdd9c9e9c, 0xdda5aaa5, 0xaa6e716e, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x11101010, + 0x884a494a, 0xcc868486, 0xdda5a2a5, 0xdda5a2a5, 0xddadaead, 0xdd9c9a9c, 0xffadaead, 0xffced7ce, + 0xffe6ebe6, 0xfff7f8f7, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xfff7f8f7, 0xffe6ebe6, + 0xffc5c2c5, 0xeeaaaaaa, 0xdd9c9e9c, 0xdd9c9e9c, 0xdda5aaa5, 0xaa6e716e, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x22101010, + 0x884a494a, 0xcca5a2a5, 0xdda5a2a5, 0xdda5a2a5, 0xddadaead, 0xdd9c9a9c, 0xffadaead, 0xffced7ce, + 0xffe6ebe6, 0xfff7f8f7, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xfff7f8f7, 0xffe6ebe6, + 0xffc5c2c5, 0xeeaaaaaa, 0xdd9c9e9c, 0xdd9c9e9c, 0xdda5aaa5, 0xaa6e716e, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x22101010, + 0x994a494a, 0xcca5a2a5, 0xdda5a2a5, 0xdda5a2a5, 0xddadaead, 0xdd9c9a9c, 0xffadaead, 0xffced7ce, + 0xffe6ebe6, 0xfff7f8f7, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xfff7f8f7, 0xffe6ebe6, + 0xffc5c2c5, 0xeeaaaaaa, 0xdd9c9e9c, 0xddaaaaaa, 0xdda5aaa5, 0xaa6e716e, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x22101310, + 0x995a595a, 0xdda5a6a5, 0xdda5a6a5, 0xdda5a6a5, 0xddafaeaf, 0xdd9c9a9c, 0xffafaeaf, 0xffd6d7d6, + 0xffe6ebe6, 0xfff7f8f7, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xfff7f8f7, 0xffe6ebe6, + 0xffc5c2c5, 0xeeafadaf, 0xdda5a2a5, 0xdda5a2a5, 0xddb5b6b5, 0xbb797b79, 0x00000400, 0x00000400, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x22101310, + 0x995a595a, 0xdda5a6a5, 0xdda5a6a5, 0xdda5a6a5, 0xddafaeaf, 0xdd9c9a9c, 0xffafaeaf, 0xffd6d7d6, + 0xffe6ebe6, 0xfff7f8f7, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xfff7f8f7, 0xffe6ebe6, + 0xffc5c2c5, 0xeeafadaf, 0xdda5a2a5, 0xdda5a2a5, 0xddb5b6b5, 0xbb797b79, 0x00000400, 0x00000400, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x22101310, + 0xaa5a595a, 0xdda5a6a5, 0xdda5a6a5, 0xdda5a6a5, 0xddafaeaf, 0xdd9c9a9c, 0xffafaeaf, 0xffd6d7d6, + 0xffe6ebe6, 0xfff7f8f7, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xfff7f8f7, 0xffe6ebe6, + 0xffc5c2c5, 0xeeafadaf, 0xdda5a2a5, 0xddafadaf, 0xddb5b6b5, 0xcc797b79, 0x00000400, 0x00000400, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x33101310, + 0xaa737373, 0xdda5a6a5, 0xdda5a6a5, 0xdda5a6a5, 0xddafaeaf, 0xdd9c9a9c, 0xffafaeaf, 0xffd6d7d6, + 0xffe6ebe6, 0xfff7f8f7, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xfff7f8f7, 0xffe6ebe6, + 0xffc5c2c5, 0xeeafadaf, 0xdda5a2a5, 0xddafadaf, 0xddb5b6b5, 0xcc797b79, 0x00000400, 0x00000400, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x33101010, + 0xaa606060, 0xddada6ad, 0xddada6ad, 0xddada6ad, 0xddbab7ba, 0xdd949294, 0xffbab7ba, 0xffcecace, + 0xffeff0ef, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffeff0ef, + 0xffc5c2c5, 0xeea5aaa5, 0xdda5aaa5, 0xdda5aaa5, 0xddadaeb5, 0xcc737479, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x33080808, + 0xaa606060, 0xddada6ad, 0xddada6ad, 0xddada6ad, 0xddbab7ba, 0xdd949294, 0xffbab7ba, 0xffcecace, + 0xffeff0ef, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffeff0ef, + 0xffc5c2c5, 0xeea5aaa5, 0xdda5aaa5, 0xdda5aaa5, 0xddadaeb5, 0xbb737479, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x33191819, + 0x99606060, 0xccada6ad, 0xddada6ad, 0xddada6ad, 0xddbab7ba, 0xdd949294, 0xffa7a5a7, 0xffcecace, + 0xffdee1de, 0xffeff0ef, 0xffffffff, 0xffffffff, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, + 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, + 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, + 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, + 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, + 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, + 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, + 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, + 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, + 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, + 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, + 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, + 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, + 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, + 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, + 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, + 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, + 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, + 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, + 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, + 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, + 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, + 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, + 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, + 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, + 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, + 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, + 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xfff7f8f7, 0xffffffff, 0xffffffff, 0xffeff0ef, 0xffdee1de, + 0xffc5c2c5, 0xeea5aaa5, 0xdda5aaa5, 0xdda5aaa5, 0xddadaeb5, 0xbb737479, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x22101010, + 0x883a3d3a, 0xbb868386, 0xddada6ad, 0xddada6ad, 0xddbab7ba, 0xdd949294, 0xffa7a5a7, 0xffbab7ba, + 0xffced2ce, 0xffdee1de, 0xffeff0ef, 0xffeff0ef, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, + 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, + 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, + 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, + 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, + 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, + 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, + 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, + 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, + 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, + 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, + 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, + 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, + 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, + 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, + 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, + 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, + 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, + 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, + 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, + 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, + 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, + 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, + 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, + 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, + 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, + 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, + 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffeff0ef, 0xffeff0ef, 0xffdee1de, 0xffced2ce, + 0xffbababa, 0xeea5aaa5, 0xdda5aaa5, 0xdda5aaa5, 0xddadaeb5, 0x99737479, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x11080808, + 0x773a3a3a, 0xaa6b6c6b, 0xcc9c9e9c, 0xdd9c9e9c, 0xddadaaad, 0xdd949294, 0xff949294, 0xffadaaad, + 0xffbdbebd, 0xffcecece, 0xffcecece, 0xffcecece, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, + 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, + 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, + 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, + 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, + 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, + 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, + 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced0ce, 0xffced0ce, 0xffced0ce, 0xffced0ce, + 0xffced0ce, 0xffced0ce, 0xffced0ce, 0xffced0ce, 0xffced1d3, 0xffced1d3, 0xffced1d3, 0xffced1d3, + 0xffd0d1d0, 0xffd0d1d0, 0xffd0d1d0, 0xffd0d1d0, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, + 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, + 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, + 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, + 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, + 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, + 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, + 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, + 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, + 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffd0d1d0, 0xffd0d1d0, 0xffd0d1d0, 0xffd0d1d0, + 0xffced1ce, 0xffced1ce, 0xffced1ce, 0xffced1ce, 0xffced0ce, 0xffced0ce, 0xffced0ce, 0xffced0ce, + 0xffced0ce, 0xffced0ce, 0xffced0ce, 0xffced0ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, + 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, + 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, + 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, + 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, + 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, + 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, + 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffced2ce, 0xffb8bcb8, + 0xffadaead, 0xeeadaead, 0xddadaead, 0xddadaead, 0xcc848a84, 0x772c2e2c, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x66080808, 0x883a3a3a, 0xaa6b6c6b, 0xcc9c9e9c, 0xddadaaad, 0xccadaaad, 0xddadaaad, 0xddadaaad, + 0xddadaead, 0xddadaead, 0xddadaead, 0xddadaead, 0xddb2b2b2, 0xddb2b2b2, 0xddb2b2b2, 0xddb2b2b2, + 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, + 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5bab5, 0xddb5bab5, 0xddb5bab5, 0xddb5bab5, + 0xddbdbabd, 0xddbdbabd, 0xddbdbabd, 0xddbdbabd, 0xddbdbabd, 0xddbdbabd, 0xddbdbabd, 0xddbdbabd, + 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, + 0xddc3c2c3, 0xddc3c2c3, 0xddc3c2c3, 0xddc3c2c3, 0xddc5c2c5, 0xddc5c2c5, 0xddc5c2c5, 0xddc5c2c5, + 0xddc5c2c5, 0xddc5c2c5, 0xddc8c8c8, 0xddc8c8c8, 0xddc5c6c5, 0xddc5c6c5, 0xddc5c6c5, 0xddc5c6c5, + 0xddc5c6c5, 0xddc5c6c5, 0xddc8cac8, 0xddc8cac8, 0xddcecace, 0xddcecace, 0xddcecace, 0xddcecace, + 0xddcecdce, 0xddcecdce, 0xddcecdce, 0xddcecdce, 0xddcecece, 0xddcecece, 0xddcecece, 0xddcecece, + 0xddd0d1d0, 0xddd3d0d3, 0xddd0d1d0, 0xddd0d1d0, 0xddd6d2d6, 0xddd6d2d6, 0xddd6d2d6, 0xddd6d2d6, + 0xddd0d4d0, 0xddd0d4d0, 0xddd0d4d0, 0xddd0d4d0, 0xddd0d4d0, 0xddd0d4d0, 0xddd6d7d6, 0xddd6d7d6, + 0xddd3d8d3, 0xddd3d8d3, 0xddd3d8d3, 0xddd3d8d3, 0xddd9d8d9, 0xddd9d8d9, 0xddd9d8d9, 0xddd9d8d9, + 0xddd9d8d9, 0xddd9d8d9, 0xddd9d8d9, 0xddd9d8d9, 0xddd3d7d3, 0xddd9dbd9, 0xddd9dbd9, 0xddd9dbd9, + 0xddd9d8d9, 0xdddedbde, 0xddd9d8d9, 0xddd9d8d9, 0xddd9dbd9, 0xddd9dbd9, 0xddd9dbd9, 0xddd9dbd9, + 0xdddedbde, 0xdddedbde, 0xdddedbde, 0xdddedbde, 0xddd9dbd9, 0xddd9dbd9, 0xddd9dbd9, 0xddd9dbd9, + 0xdddedbde, 0xdddedbde, 0xddd9d8d9, 0xddd9d8d9, 0xddd9d8d9, 0xddd9d8d9, 0xddd9d8d9, 0xddd9d8d9, + 0xddd9d8d9, 0xddd9d8d9, 0xddd9d8d9, 0xddd9d8d9, 0xddd3d8d3, 0xddd3d8d3, 0xddd3d8d3, 0xddd3d8d3, + 0xddd6d7d6, 0xddd6d7d6, 0xddd6d7d6, 0xddd3d5d3, 0xddd3d5d3, 0xddd0d4d0, 0xddd0d4d0, 0xddd0d4d0, + 0xddd3d5d3, 0xddd3d5d3, 0xddced2ce, 0xddced2ce, 0xddd0d1d0, 0xddd0d1d0, 0xddd0d1d0, 0xddd0d1d0, + 0xddcecece, 0xddced0ce, 0xddcecece, 0xddcecece, 0xddcecdce, 0xddcecdce, 0xddcecdce, 0xddcecdce, + 0xddcecdce, 0xddcecdce, 0xddcecace, 0xddcecace, 0xddcecace, 0xddcecace, 0xddcecace, 0xddcecace, + 0xddc5c6c5, 0xddc5c6c5, 0xddc5c6c5, 0xddc5c6c5, 0xddc5c6c5, 0xddc5c6c5, 0xddc5c6c5, 0xddc5c6c5, + 0xddc5c2c5, 0xddc5c2c5, 0xddc5c2c5, 0xddc5c2c5, 0xddc5c2c5, 0xddc5c2c5, 0xddc5c2c5, 0xddc5c2c5, + 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, + 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, + 0xddbdbabd, 0xddbdbabd, 0xddbdbabd, 0xddbdbabd, 0xddb5bab5, 0xddb5bab5, 0xddb5bab5, 0xddb5bab5, + 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddadb2b5, 0xddadb2b5, 0xddadb2b5, 0xddadb2b5, + 0xddadadad, 0xddadadad, 0xddadadad, 0xddadadad, 0xdda2a5a2, 0xdda2a5a2, 0xdda2a5a2, 0xdda2a5a2, + 0xeeadaead, 0xeeadaead, 0xcc818381, 0xbb818381, 0xaa585c58, 0x442c2e2c, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x33080808, 0x883a3a3a, 0x883a3a3a, 0xaa6b6c6b, 0xcc949294, 0xbb949294, 0xccadaaad, 0xddadaaad, + 0xddadaead, 0xddadaead, 0xddadaead, 0xddadaead, 0xddb2b2b2, 0xddb2b2b2, 0xddb2b2b2, 0xddb2b2b2, + 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, + 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5bab5, 0xddb5bab5, 0xddb5bab5, 0xddb5bab5, + 0xddbdbabd, 0xddbdbabd, 0xddbdbabd, 0xddbdbabd, 0xddbdbabd, 0xddbdbabd, 0xddbdbabd, 0xddc3c2c3, + 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, + 0xddc3c2c3, 0xddc3c2c3, 0xddc3c2c3, 0xddc3c2c3, 0xddc5c2c5, 0xddc5c2c5, 0xddc5c2c5, 0xddc8c8c8, + 0xddc8c8c8, 0xddc8c8c8, 0xddc8c8c8, 0xddc8c8c8, 0xddc5c6c5, 0xddc5c6c5, 0xddc5c6c5, 0xddc8cac8, + 0xddc8cac8, 0xddc8cac8, 0xddc8cac8, 0xddcbcecb, 0xddcecdce, 0xddcecdce, 0xddcecdce, 0xddcecdce, + 0xddcecdce, 0xddcecdce, 0xddcecdce, 0xddcecdce, 0xddced0d0, 0xddced0d0, 0xddced0d0, 0xddced2d6, + 0xddced2ce, 0xddd0d1d0, 0xddd0d1d0, 0xddd0d1d0, 0xddd6d2d6, 0xddd6d2d6, 0xddd6d2d6, 0xddd3d4d3, + 0xddd3d5d3, 0xddd3d5d3, 0xddd3d5d3, 0xddd6d7d6, 0xddd6d7d6, 0xddd6d7d6, 0xddd6d7d6, 0xddd6d7d6, + 0xddd3d8d3, 0xddd3d8d3, 0xddd3d8d3, 0xddd6dbd6, 0xddd9d8d9, 0xddd9d8d9, 0xddd9d8d9, 0xddd9d8d9, + 0xddd9d8d9, 0xddd9d8d9, 0xdddedbde, 0xdddedbde, 0xddd9dbd9, 0xddd9dbd9, 0xddd9dbd9, 0xddd9dbd9, + 0xdddedbde, 0xdddedbde, 0xdddedbde, 0xdddedbde, 0xddd9dbd9, 0xddd9dbd9, 0xddd9dbd9, 0xddd9dbd9, + 0xdddedbde, 0xdddedbde, 0xdddedbde, 0xdddedbde, 0xddd9dbd9, 0xddd9dbd9, 0xddd9dbd9, 0xddd9dbd9, + 0xdddedbde, 0xdddedbde, 0xdddedbde, 0xdddedbde, 0xdddedbde, 0xdddedbde, 0xddd9d8d9, 0xddd9d8d9, + 0xddd9d8d9, 0xddd9d8d9, 0xddd9d8d9, 0xddd9d8d9, 0xddd3d8d3, 0xddd6dbd6, 0xddd3d8d3, 0xddd6dbd6, + 0xddd6d7d6, 0xddd6d7d6, 0xddd6d7d6, 0xddd6d7d6, 0xddd6d7d6, 0xddd3d5d3, 0xddd3d5d3, 0xddd3d5d3, + 0xddd3d5d3, 0xddd6d7d6, 0xddd3d5d3, 0xddd0d4d0, 0xddd0d1d0, 0xddd0d1d0, 0xddd0d1d0, 0xddd0d1d0, + 0xddced0ce, 0xddced0ce, 0xddced0ce, 0xddced0ce, 0xddcecdce, 0xddcecdce, 0xddcecdce, 0xddcecdce, + 0xddcecdce, 0xddcecdce, 0xddcecdce, 0xddcecace, 0xddcecace, 0xddcecace, 0xddcecace, 0xddcec6ce, + 0xddc8cac8, 0xddc5c6c5, 0xddc5c6c5, 0xddc5c6c5, 0xddc5c6c5, 0xddc5c6c5, 0xddc5c6c5, 0xddc5c6c5, + 0xddc8c8c8, 0xddc5c2c5, 0xddc5c2c5, 0xddc5c2c5, 0xddc5c2c5, 0xddc5c2c5, 0xddc5c2c5, 0xddc5c2c5, + 0xddc3c5c3, 0xddbfc0bf, 0xddc2c4c2, 0xddbebfbe, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, + 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, + 0xddbdbabd, 0xddbdbabd, 0xddbdbabd, 0xddbdbabd, 0xddb5bab5, 0xddb5bab5, 0xddb5bab5, 0xddb5bab5, + 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddadb2b5, 0xddadb2b5, 0xddadb2b5, 0xddadb2b5, + 0xddadadad, 0xddadadad, 0xddadadad, 0xddadadad, 0xdda2a5a2, 0xdda2a5a2, 0xdda2a5a2, 0xdda2a5a2, + 0xeeadaead, 0xdd818381, 0xbb818381, 0x99555855, 0x772c2e2c, 0x11000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x11080808, 0x66080808, 0x773a3a3a, 0x773a3a3a, 0x99636163, 0x997b797b, 0xbb949294, 0xbb949294, + 0xcc9c9e9c, 0xcc9c9e9c, 0xcc9c9e9c, 0xcc9c9e9c, 0xcca5a2a5, 0xddb2b2b2, 0xddb2b2b2, 0xddb2b2b2, + 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, + 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5bab5, 0xddb5bab5, 0xddb5bab5, 0xddb5bab5, + 0xddbdbabd, 0xddbdbabd, 0xddbdbabd, 0xddbdbabd, 0xddbdbabd, 0xddbdbabd, 0xddc3c2c3, 0xddc3c2c3, + 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddc3c5c3, 0xddc3c5c3, + 0xddc3c2c3, 0xddc3c2c3, 0xddc3c2c3, 0xddc3c2c3, 0xddc5c2c5, 0xddc8c8c8, 0xddc5c2c5, 0xddc8c8c8, + 0xddc8c8c8, 0xddc8c8c8, 0xddc8c8c8, 0xddc8c8c8, 0xddc8cac8, 0xddc5c6c5, 0xddc8cac8, 0xddcbcecb, + 0xddcbcecb, 0xddc8cac8, 0xddc8cac8, 0xddcbcecb, 0xddcecdce, 0xddcecdce, 0xddcecdce, 0xddcecdce, + 0xddcecdce, 0xddcecdce, 0xddcecdce, 0xddcecdce, 0xddced0d0, 0xddced1d3, 0xddced1d3, 0xddced2d6, + 0xddced2ce, 0xddced2ce, 0xddced2ce, 0xddced2ce, 0xddd3d4d3, 0xddd3d4d3, 0xddd3d4d3, 0xddd0d5d0, + 0xddd6d7d6, 0xddd3d5d3, 0xddd6d7d6, 0xddd6d7d6, 0xddd6d7d6, 0xddd6d7d6, 0xddd6d7d6, 0xddd6d7d6, + 0xddd6dbd6, 0xddd3d8d3, 0xddd6dbd6, 0xddd6dbd6, 0xddd9d8d9, 0xdddedbde, 0xdddedbde, 0xdddedbde, + 0xdddedbde, 0xdddedbde, 0xdddedbde, 0xdddedbde, 0xddd9dbd9, 0xdddedfde, 0xdddedfde, 0xddd9dbd9, + 0xdddedbde, 0xdddedbde, 0xdddedbde, 0xdddedbde, 0xddd9dbd9, 0xddd9dbd9, 0xdddedfde, 0xdddedfde, + 0xdddedbde, 0xdddedbde, 0xdddedbde, 0xdddedbde, 0xddd9dbd9, 0xddd9dbd9, 0xddd9dbd9, 0xdddedfde, + 0xdddedbde, 0xdddedbde, 0xdddedbde, 0xdddedbde, 0xdddedbde, 0xdddedbde, 0xdddedbde, 0xdddedbde, + 0xdddedbde, 0xdddedbde, 0xdddedbde, 0xdddedbde, 0xddd6dbd6, 0xddd6dbd6, 0xddd3d8d3, 0xddd6dbd6, + 0xddd6d7d6, 0xddd6d7d6, 0xddd6d7d6, 0xddd6d7d6, 0xddd6d7d6, 0xddd6d7d6, 0xddd3d5d3, 0xddd6d7d6, + 0xddd3d5d3, 0xddd6d7d6, 0xddd3d5d3, 0xddd0d4d0, 0xddd6d2d6, 0xddd6d2d6, 0xddd0d1d0, 0xddd0d1d0, + 0xddced2ce, 0xddced1ce, 0xddced0ce, 0xddced0ce, 0xddcecdce, 0xddcecdce, 0xddcecdce, 0xddcecdce, + 0xddcecdce, 0xddcecdce, 0xddcecdce, 0xddcecdce, 0xddcecace, 0xddcecace, 0xddcecace, 0xddcecace, + 0xddc8cac8, 0xddc5c6c5, 0xddc8cac8, 0xddc5c6c5, 0xddc5c6c5, 0xddc5c6c5, 0xddc5c6c5, 0xddc5c6c5, + 0xddc8c8c8, 0xddc8c8c8, 0xddc8c8c8, 0xddc5c3c6, 0xddc5c2c5, 0xddc5c2c5, 0xddc5c2c5, 0xddc5c2c5, + 0xddc4c4c3, 0xddc4c4c3, 0xddc4c4c2, 0xddc1c0c1, 0xddbfc1bf, 0xddbdbebe, 0xddbdbebe, 0xddbdbebd, + 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, + 0xddbdbabd, 0xddbdbabd, 0xddbdbabd, 0xddbdbabd, 0xddb5bab5, 0xddb5bab5, 0xddb5bab5, 0xddb5bab5, + 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddb5b2b5, 0xddadb2b5, 0xddadb2b5, 0xddadb2b5, 0xddadb2b5, + 0xddadadad, 0xddadadad, 0xdd9c9a9c, 0xcc9c9a9c, 0xcca2a5a2, 0xcc8c8e8c, 0xcc8c8e8c, 0xcc8c8e8c, + 0xdd818381, 0xaa555855, 0x77292d29, 0x55292d29, 0x22000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x22000000, 0x77101010, 0x77313131, 0x773f3f3f, 0x773f3f3f, 0x885a5d5a, 0x995a5d5a, + 0x99737173, 0xaa737173, 0xaa737173, 0xaa737173, 0xaa8c8a8c, 0xbb8c8a8c, 0xbb8c8a8c, 0xbb8c8a8c, + 0xcc9c9a9c, 0xcc9c9a9c, 0xcc9c9a9c, 0xcc9c9a9c, 0xcca5a6a5, 0xcca5a6a5, 0xcca5a6a5, 0xcca5a6a5, + 0xccadaead, 0xccadaead, 0xccadaead, 0xccadaead, 0xccb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, + 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddc5c2c5, 0xddc5c2c5, 0xddc5c2c5, 0xddc5c2c5, + 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, 0xddb5b6b5, + 0xddbdbabd, 0xddbdbabd, 0xddbdbabd, 0xddbdbabd, 0xddbdbebd, 0xddbdbebd, 0xddbec0bf, 0xddc0c2c1, + 0xddc7cacc, 0xddc8cccd, 0xddc0c3c5, 0xddc2c6c9, 0xddc3c5c7, 0xddc3c3c4, 0xddc0c3c2, 0xddbfc2c0, + 0xddc3c2c3, 0xddc5c2c5, 0xddc5c2c5, 0xddc5c2c5, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, + 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddc5c6c5, 0xddc5c6c5, 0xddc5c6c5, 0xddc5c6c5, + 0xddc5cac5, 0xddc5cac5, 0xddc5cac5, 0xddc5cac5, 0xddcecace, 0xddcecace, 0xddcecace, 0xddcecace, + 0xddcecace, 0xddcecace, 0xddcecace, 0xddcecace, 0xddcecace, 0xddcecace, 0xddcecace, 0xddcecace, + 0xddcecece, 0xddcecece, 0xddcecece, 0xddcecece, 0xddcecece, 0xddcecece, 0xddcecece, 0xddcecece, + 0xddcecece, 0xddcecece, 0xddcecece, 0xddcecece, 0xddcecece, 0xddcecece, 0xddcecece, 0xddcecece, + 0xddced2ce, 0xddced2ce, 0xddced2ce, 0xddced2ce, 0xddced2ce, 0xddced2ce, 0xddced2ce, 0xddced2ce, + 0xddcecfce, 0xddcfd0cf, 0xddd2d0d0, 0xddd1d3d2, 0xddd7d9d7, 0xddd9dad8, 0xdddbdddb, 0xdddde0de, + 0xdde0e3e2, 0xdde2e2e3, 0xdde2e3e1, 0xdde3e3e4, 0xdde5e3e5, 0xdde4e3e4, 0xdde3e0e2, 0xdddfdcdf, + 0xddd3d1d0, 0xddcecece, 0xddcfd0cf, 0xddd1d0d0, 0xddd5d6d4, 0xddd5d4d5, 0xddd5d4d4, 0xddd2d1d2, + 0xddd0cdd0, 0xddcfccd0, 0xddcecace, 0xddcecace, 0xddcecace, 0xddcecace, 0xddcecace, 0xddcecace, + 0xddc5cace, 0xddc5cace, 0xddc5cace, 0xddc5cace, 0xddc5c6c5, 0xddc5c6c5, 0xddc5c6c5, 0xddc5c6c5, + 0xddc5c6c5, 0xddc5c6c5, 0xddc5c6c5, 0xddc5c6c5, 0xddc5c2c5, 0xddc5c2c5, 0xddc5c2c5, 0xddc5c2c5, + 0xddc5c2c5, 0xddc5c2c5, 0xddc5c2c5, 0xddc5c2c5, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, + 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, 0xddbdbebd, + 0xddc5c6c5, 0xddc5c6c5, 0xddc5c6c5, 0xddc5c6c5, 0xddc8c8c9, 0xddc9c8ca, 0xddc9cbcb, 0xddcacdcc, + 0xddc9c7c8, 0xddc8c8c9, 0xddcac8ca, 0xddc8c7c9, 0xddc6c7c6, 0xddc2c6c3, 0xddc2c3c1, 0xddc4c7c3, + 0xddb9bab9, 0xddb8b6b8, 0xddb7b7b7, 0xddbababa, 0xddbcbfbc, 0xddbcc0bc, 0xddbdc2bd, 0xddbdc2bd, + 0xddb5b6b5, 0xddb5b6b5, 0xccb5b6b5, 0xccb5b6b5, 0xccadb2ad, 0xccadb2ad, 0xccadb2ad, 0xccadb2ad, + 0xcca5a6a5, 0xcca5a6a5, 0xcca5a6a5, 0xcca5a6a5, 0xcc9c9a94, 0xcc9c9a94, 0xcc9c9a94, 0xcc9c9a94, + 0xbb84827b, 0xbb84827b, 0xbb84827b, 0xaa84827b, 0xaa6b6d6b, 0xaa6b6d6b, 0x996b6d6b, 0x99474947, + 0xbb524d52, 0x661b1a1b, 0x44000000, 0x22000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x22000000, 0x66101010, 0x77242224, 0x663f3f3f, 0x663f3f3f, 0x663f3f3f, + 0x77504e50, 0x77504e50, 0x77504e50, 0x77504e50, 0x88656565, 0x88656565, 0x88656565, 0x99656565, + 0x99767476, 0x99767476, 0x99767476, 0xaa767476, 0xaa7e7f7e, 0xaa7e7f7e, 0xaa7e7f7e, 0xaa7e7f7e, + 0xaa868786, 0xaa868786, 0xbb868786, 0xbb868786, 0xbb8c8e8c, 0xbb8c8e8c, 0xbb8c8e8c, 0xbb8c8e8c, + 0xbb949494, 0xbb949494, 0xbb949494, 0xbb949494, 0xcc9c989c, 0xcc9c989c, 0xcc9c989c, 0xcc9c989c, + 0xccb5b6b5, 0xccb5b6b5, 0xccb5b6b5, 0xccb5b6b5, 0xccb5b6b5, 0xccb5b6b5, 0xccb5b6b5, 0xccb5b6b5, + 0xccbdbabd, 0xccbdbabd, 0xccbdbabd, 0xccbdbabd, 0xccbdbebd, 0xccbdbebd, 0xccbcbdbc, 0xccb9baba, + 0xccb1b3b4, 0xccb2b4b4, 0xccb2b5b5, 0xccb3b5b6, 0xccb1b4b6, 0xccb3b5b6, 0xccb4b8b8, 0xccb7b9b9, + 0xccc0c0c2, 0xccc5c2c5, 0xccc5c2c5, 0xccc5c2c5, 0xccbdbebd, 0xccbdbebd, 0xccbdbebd, 0xccbdbebd, + 0xccbdbebd, 0xccbdbebd, 0xccbdbebd, 0xccbdbebd, 0xccc5c6c5, 0xccc5c6c5, 0xccc5c6c5, 0xccc5c6c5, + 0xccc5cac5, 0xccc5cac5, 0xccc5cac5, 0xccc5cac5, 0xcccecace, 0xcccecace, 0xcccecace, 0xcccecace, + 0xcccecace, 0xcccecace, 0xcccecace, 0xcccecace, 0xcccecace, 0xcccecace, 0xcccecace, 0xcccecace, + 0xcccecece, 0xcccecece, 0xcccecece, 0xcccecece, 0xcccecece, 0xcccecece, 0xcccecece, 0xcccecece, + 0xcccecece, 0xcccecece, 0xcccecece, 0xcccecece, 0xcccecece, 0xcccecece, 0xcccecece, 0xcccecece, + 0xccced2ce, 0xccced2ce, 0xccced2ce, 0xccced2ce, 0xccced2ce, 0xccced2ce, 0xccced2ce, 0xccced2ce, + 0xcccecfce, 0xcccdcecd, 0xcccdcdcd, 0xcccbcbca, 0xccc7c8c7, 0xccc3c5c5, 0xccc3c4c4, 0xccc2c3c2, + 0xccbec1bf, 0xccbbbdbc, 0xccb7b8b6, 0xccb0b2b0, 0xccaeb1af, 0xccb0b1b0, 0xccb5b4b4, 0xccbcbabb, + 0xcca3a6a3, 0xccb8bab7, 0xccc9c9c7, 0xccc9c7c8, 0xccacacac, 0xccb5b3b7, 0xccb8b5b7, 0xccb7b5b5, + 0xccb0aeb1, 0xccb7b6b5, 0xcccecace, 0xcccecace, 0xcccecace, 0xcccecace, 0xcccecace, 0xcccecace, + 0xccc5cace, 0xccc5cace, 0xccc5cace, 0xccc5cace, 0xccc5c6c5, 0xccc5c6c5, 0xccc5c6c5, 0xccc5c6c5, + 0xccc5c6c5, 0xccc5c6c5, 0xccc5c6c5, 0xccc5c6c5, 0xccc5c2c5, 0xccc5c2c5, 0xccc5c2c5, 0xccc5c2c5, + 0xccc5c2c5, 0xccc5c2c5, 0xccc5c2c5, 0xccc5c2c5, 0xccbdbebd, 0xccbdbebd, 0xccbdbebd, 0xccbdbebd, + 0xccbdbebd, 0xccbdbebd, 0xccbdbebd, 0xccbdbebd, 0xccbdbebd, 0xccbdbebd, 0xccbdbebd, 0xccbdbebd, + 0xccc5c6c5, 0xccc5c6c5, 0xccabaeac, 0xcca5a6a5, 0xcca8a9a8, 0xccaeadac, 0xccaeacab, 0xccb5b5b4, + 0xccbcbdbd, 0xccb0b1b2, 0xcca9a9a9, 0xcca5a4a6, 0xcc9f9fa1, 0xcc9da09f, 0xcc9ca09e, 0xccafb3b1, + 0xccacadab, 0xcca8a9a7, 0xcca0a09f, 0xcc999a99, 0xbb939492, 0xbb8d918e, 0xbb8c908c, 0xbb8c908c, + 0xbb868686, 0xbb868686, 0xbb868686, 0xbb868686, 0xbb7b7f7b, 0xbb7b7f7b, 0xaa7b7f7b, 0xaa7b7f7b, + 0xaa737370, 0xaa737370, 0xaa737370, 0xaa737370, 0x99686763, 0x99686763, 0x99686763, 0x99686763, + 0x995a5955, 0x885a5955, 0x885a5955, 0x8831312f, 0x77242424, 0x77242424, 0x77242424, 0x66242424, + 0x661b1a1b, 0x33000000, 0x22000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x11000000, 0x44080408, 0x66080408, 0x66242224, 0x66242224, + 0x662c2b2c, 0x662c2b2c, 0x662c2b2c, 0x662c2b2c, 0x663f413f, 0x663f413f, 0x663f413f, 0x663f413f, + 0x77504e50, 0x77504e50, 0x77504e50, 0x77504e50, 0x77585858, 0x77585858, 0x77585858, 0x77585858, + 0x88606060, 0x88606060, 0x88606060, 0x88606060, 0x88636563, 0x88636563, 0x88636563, 0x88636563, + 0x886b6b6b, 0x886b6b6b, 0x996b6b6b, 0x996b6b6b, 0x99736f73, 0x99736f73, 0x99736f73, 0x99736f73, + 0x996e6d6e, 0x996e6d6e, 0x996e6d6e, 0x996e6d6e, 0x996e706e, 0x996e706e, 0x996e706e, 0x996e706e, + 0x99707170, 0x99707170, 0x99707170, 0x99707170, 0xaa767576, 0x99767576, 0xaa767576, 0xaa767576, + 0xaa7b7c7e, 0xaa7b7c7e, 0xaa7b7c7f, 0xaa7d7e80, 0xaa7a7a7c, 0xaa7b7a7c, 0xaa787979, 0xaa777677, + 0xaa797979, 0xaa797979, 0xaa797979, 0xaa797979, 0xaa979694, 0xaa979694, 0xaa979694, 0xaa979694, + 0xaa949694, 0xaa949694, 0xaa949694, 0xaa949694, 0xaa797b79, 0xaa797b79, 0xaa797b79, 0xaa797b79, + 0xaa797979, 0xaa797979, 0xaa797979, 0xaa797979, 0xaa7b7976, 0xaa7b7976, 0xaa7b7976, 0xaa7b7976, + 0xaa767776, 0xaa767776, 0xaa767776, 0xaa767776, 0xaa767776, 0xaa767776, 0xaa767776, 0xaa767776, + 0xaa767576, 0x99767576, 0x99767576, 0x99767576, 0x99767876, 0x99767876, 0x99767876, 0x99767876, + 0x99767576, 0x99767576, 0x99767576, 0x99767576, 0x99767576, 0x99767576, 0x99767576, 0x99767576, + 0x99767776, 0x99767776, 0x99767776, 0x99767776, 0x99707770, 0x99707770, 0x99707770, 0x99707770, + 0x99707370, 0x99707370, 0x99707370, 0x99717571, 0x99787c79, 0x99787d79, 0x99787d79, 0x99797d79, + 0x99787d79, 0x99797d79, 0x99797d78, 0x99797d79, 0x99797c79, 0x99797c79, 0x99797c79, 0x99797c78, + 0x99747672, 0x99727672, 0x99727371, 0x99707371, 0x99797879, 0x99797878, 0x99797879, 0x99787879, + 0x99777577, 0xaa777676, 0xaa767476, 0xaa767476, 0xaa767476, 0xaa767476, 0xaa767476, 0xaa767476, + 0xaa6e7170, 0xaa6e7170, 0xaa6e7170, 0xaa6e7170, 0xaa737373, 0xaa737373, 0xaa737373, 0xaa737373, + 0xaa737373, 0xaa737373, 0xaa737373, 0xaa737373, 0xaa737173, 0xaa737173, 0xaa737173, 0xaa737173, + 0xaa737173, 0xaa737173, 0xaa737173, 0xaa737173, 0xaa707070, 0xaa707070, 0xaa707070, 0xaa707070, + 0xaa6b6d6b, 0xaa6b6d6b, 0xaa6b6d6b, 0xaa6b6d6b, 0xaa6b6d6b, 0xaa6b6d6b, 0xaa6b6d6b, 0xaa6b6d6b, + 0x996e706e, 0xaa6f716f, 0x99747673, 0x99757774, 0x99767676, 0x99777876, 0x99737373, 0x99737272, + 0x99757577, 0x996e6e72, 0x996b6c70, 0x996b6c70, 0x99686c68, 0x99686c68, 0x99686c68, 0x996b6f6b, + 0x99636563, 0x995d5e5d, 0x995d5e5d, 0x995d5e5d, 0x995a5e5a, 0x885a5e5a, 0x885a5e5a, 0x885a5e5a, + 0x88585558, 0x88585558, 0x88585558, 0x88585558, 0x884a4c4a, 0x884a4c4a, 0x884a4c4a, 0x884a4c4a, + 0x77423f3c, 0x77423f3c, 0x77423f3c, 0x77423f3c, 0x77343331, 0x77343331, 0x77343331, 0x77343331, + 0x6631312f, 0x66080808, 0x66080808, 0x66080808, 0x66000000, 0x66000000, 0x55000000, 0x33000000, + 0x44000000, 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00080408, 0x11080408, 0x22080408, 0x33080408, + 0x44080808, 0x55080808, 0x55080808, 0x66080808, 0x66191c19, 0x66191c19, 0x66191c19, 0x66191c19, + 0x66292829, 0x66292829, 0x66292829, 0x66292829, 0x66313131, 0x66313131, 0x66313131, 0x66313131, + 0x663a393a, 0x663a393a, 0x663a393a, 0x663a393a, 0x663a3d3a, 0x663a3d3a, 0x663a3d3a, 0x663a3d3a, + 0x66424142, 0x66424142, 0x66424142, 0x66424142, 0x664a454a, 0x664a454a, 0x664a454a, 0x664a454a, + 0x774a494a, 0x774a494a, 0x774a494a, 0x774a494a, 0x774a4d4a, 0x774a4d4a, 0x774a4d4a, 0x774a4d4a, + 0x774a4d4a, 0x774a4d4a, 0x774a4d4a, 0x774a4d4a, 0x77525152, 0x77525152, 0x77525152, 0x77525152, + 0x77525152, 0x77525152, 0x77525152, 0x77525152, 0x77525152, 0x77525152, 0x77525152, 0x77525152, + 0x77525552, 0x77525552, 0x77525552, 0x77525552, 0x774a4542, 0x774a4542, 0x774a4542, 0x774a4542, + 0x77424542, 0x77424542, 0x77424542, 0x77424542, 0x77525552, 0x77525552, 0x77525552, 0x77525552, + 0x77525152, 0x77525152, 0x77525152, 0x77525152, 0x7752514a, 0x7752514a, 0x7752514a, 0x7752514a, + 0x774a4d4a, 0x774a4d4a, 0x774a4d4a, 0x774a4d4a, 0x774a4d4a, 0x774a4d4a, 0x774a4d4a, 0x774a4d4a, + 0x774a494a, 0x774a494a, 0x774a494a, 0x774a494a, 0x774a4d4a, 0x774a4d4a, 0x774a4d4a, 0x774a4d4a, + 0x774a494a, 0x774a494a, 0x774a494a, 0x774a494a, 0x774a494a, 0x774a494a, 0x774a494a, 0x774a494a, + 0x774a494a, 0x774a494a, 0x774a494a, 0x774a494a, 0x77424942, 0x77424942, 0x77424942, 0x77424942, + 0x77424542, 0x77424542, 0x77424542, 0x77424542, 0x77424942, 0x77424942, 0x77424942, 0x77424942, + 0x77424942, 0x77424942, 0x77424942, 0x77424942, 0x77424942, 0x77424942, 0x77424942, 0x77424942, + 0x77424542, 0x77424542, 0x77424542, 0x77424542, 0x774a494a, 0x774a494a, 0x774a494a, 0x774a494a, + 0x774a494a, 0x774a494a, 0x774a494a, 0x774a494a, 0x774a494a, 0x774a494a, 0x774a494a, 0x774a494a, + 0x77424542, 0x77424542, 0x77424542, 0x77424542, 0x774a494a, 0x774a494a, 0x774a494a, 0x774a494a, + 0x774a494a, 0x774a494a, 0x774a494a, 0x774a494a, 0x774a494a, 0x774a494a, 0x774a494a, 0x774a494a, + 0x774a494a, 0x774a494a, 0x774a494a, 0x774a494a, 0x774a494a, 0x774a494a, 0x774a494a, 0x774a494a, + 0x77424542, 0x77424542, 0x77424542, 0x77424542, 0x77424542, 0x77424542, 0x77424542, 0x77424542, + 0x77424542, 0x77424542, 0x77424542, 0x77424542, 0x77424142, 0x77424142, 0x77424142, 0x77424142, + 0x773a3d42, 0x773a3d42, 0x773a3d42, 0x773a3d42, 0x773a3d3a, 0x773a3d3a, 0x773a3d3a, 0x773a3d3a, + 0x66313531, 0x66313531, 0x66313531, 0x66313531, 0x66292d29, 0x66292d29, 0x66292d29, 0x66292d29, + 0x66292429, 0x66292429, 0x66292429, 0x66292429, 0x66191819, 0x66191819, 0x66191819, 0x66191819, + 0x66100c08, 0x66100c08, 0x66100c08, 0x66100c08, 0x66000000, 0x66000000, 0x66000000, 0x66000000, + 0x66080808, 0x66080808, 0x66080808, 0x55080808, 0x44000000, 0x22000000, 0x11000000, 0x11000000, + 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x11000000, 0x11000000, 0x22000000, 0x22000000, 0x33000000, 0x44000000, + 0x44000000, 0x44000000, 0x55000000, 0x55000000, 0x55000400, 0x55000400, 0x55000400, 0x55000400, + 0x55080808, 0x66080808, 0x66080808, 0x66080808, 0x662f2f2f, 0x662f2f2f, 0x662f2f2f, 0x662f2f2f, + 0x66312f31, 0x66312f31, 0x66312f31, 0x66312f31, 0x66312f31, 0x66312f31, 0x66312f31, 0x66312f31, + 0x66312f31, 0x66312f31, 0x66312f31, 0x66312f31, 0x66312f31, 0x66312f31, 0x66312f31, 0x66312f31, + 0x66312f31, 0x66312f31, 0x66312f31, 0x66312f31, 0x66312f31, 0x66312f31, 0x66312f31, 0x66312f31, + 0x66312f31, 0x66312f31, 0x66312f31, 0x66312f31, 0x66312f31, 0x66312f31, 0x66312f31, 0x66312f31, + 0x66312f31, 0x66312f31, 0x66312f31, 0x66312f31, 0x66312f31, 0x66312f31, 0x66312f31, 0x66312f31, + 0x66312f31, 0x66312f31, 0x66312f31, 0x66312f31, 0x66312f31, 0x66312f31, 0x66312f31, 0x66312f31, + 0x662f2f2f, 0x662f2f2f, 0x662f2f2f, 0x662f2f2f, 0x66080808, 0x66080808, 0x66080808, 0x66080808, + 0x66080808, 0x66080808, 0x66080808, 0x66080808, 0x66080808, 0x66080808, 0x66080808, 0x66080808, + 0x66080808, 0x66080808, 0x66080808, 0x66080808, 0x66080808, 0x66080808, 0x66080808, 0x66080808, + 0x66080408, 0x66080408, 0x66080408, 0x66080408, 0x66080408, 0x66080408, 0x66080408, 0x66080408, + 0x66080408, 0x66080408, 0x66080408, 0x66080408, 0x66080408, 0x66080408, 0x66080408, 0x66080408, + 0x66080408, 0x66080408, 0x66080408, 0x66080408, 0x66080408, 0x66080408, 0x66080408, 0x66080408, + 0x66080408, 0x66080408, 0x66080408, 0x66080408, 0x66080408, 0x66080408, 0x66080408, 0x66080408, + 0x66080408, 0x66080408, 0x66080408, 0x66080408, 0x66080408, 0x66080408, 0x66080408, 0x66080408, + 0x66080408, 0x66080408, 0x66080408, 0x66080408, 0x66080408, 0x66080408, 0x66080408, 0x66080408, + 0x66080408, 0x66080408, 0x66080408, 0x66080408, 0x66080408, 0x66080408, 0x66080408, 0x66080408, + 0x66080408, 0x66080408, 0x66080408, 0x66080408, 0x66080408, 0x66080408, 0x66080408, 0x66080408, + 0x66080408, 0x66080408, 0x66080408, 0x66080408, 0x66080408, 0x66080408, 0x66080408, 0x66080408, + 0x66080408, 0x66080408, 0x66080408, 0x66080408, 0x66080408, 0x66080408, 0x66080408, 0x66080408, + 0x66080408, 0x66080408, 0x66080408, 0x66080408, 0x66080400, 0x66080400, 0x66080400, 0x66080400, + 0x66000400, 0x66000400, 0x66000400, 0x66000400, 0x66000400, 0x66000400, 0x66000400, 0x66000400, + 0x66000000, 0x66000000, 0x66000000, 0x66000000, 0x66000000, 0x66000000, 0x66000000, 0x66000000, + 0x66000000, 0x66000000, 0x66000000, 0x66000000, 0x55000000, 0x55000000, 0x55000000, 0x55000000, + 0x55000000, 0x55000000, 0x55000000, 0x55000000, 0x44000000, 0x44000000, 0x33000000, 0x33000000, + 0x22000000, 0x22000000, 0x11000000, 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x11000000, 0x11000400, 0x11000400, 0x11000400, 0x22000400, + 0x22080808, 0x22080808, 0x22080808, 0x22080808, 0x33000000, 0x33000000, 0x33000000, 0x33000000, + 0x33000000, 0x33000000, 0x33000000, 0x44000000, 0x44000000, 0x44000000, 0x44000000, 0x44000000, + 0x44000000, 0x44000000, 0x44000000, 0x44000000, 0x44000000, 0x44000000, 0x44000000, 0x44000000, + 0x44000000, 0x44000000, 0x44000000, 0x44000000, 0x55000000, 0x44000000, 0x44000000, 0x44000000, + 0x44000000, 0x44000000, 0x55000000, 0x55000000, 0x55000000, 0x55000000, 0x55000000, 0x55000000, + 0x55000000, 0x55000000, 0x55000000, 0x55000000, 0x55000000, 0x55000000, 0x55000000, 0x55000000, + 0x55000000, 0x55000000, 0x55000000, 0x55000000, 0x55000000, 0x55000000, 0x55000000, 0x55000000, + 0x55000000, 0x55000000, 0x55000000, 0x55000000, 0x55080808, 0x44080808, 0x44080808, 0x44080808, + 0x55080808, 0x44080808, 0x44080808, 0x55080808, 0x55080808, 0x44080808, 0x44080808, 0x44080808, + 0x44080808, 0x44080808, 0x44080808, 0x44080808, 0x44080808, 0x44080808, 0x44080808, 0x44080808, + 0x44080408, 0x44080408, 0x44080408, 0x44080408, 0x44080408, 0x44080408, 0x44080408, 0x44080408, + 0x44080408, 0x44080408, 0x44080408, 0x44080408, 0x44080408, 0x44080408, 0x44080408, 0x44080408, + 0x44080408, 0x44080408, 0x44080408, 0x44080408, 0x44080408, 0x44080408, 0x44080408, 0x44080408, + 0x44080408, 0x44080408, 0x44080408, 0x44080408, 0x44080408, 0x44080408, 0x44080408, 0x44080408, + 0x44080408, 0x44080408, 0x44080408, 0x44080408, 0x44080408, 0x44080408, 0x44080408, 0x44080408, + 0x44080408, 0x44080408, 0x44080408, 0x44080408, 0x44080408, 0x44080408, 0x44080408, 0x44080408, + 0x44080408, 0x55080408, 0x55080408, 0x55080408, 0x55080408, 0x55080408, 0x55080408, 0x55080408, + 0x55080408, 0x55080408, 0x55080408, 0x55080408, 0x55080408, 0x55080408, 0x55080408, 0x55080408, + 0x55080408, 0x55080408, 0x55080408, 0x55080408, 0x55080408, 0x55080408, 0x55080408, 0x55080408, + 0x55080408, 0x55080408, 0x55080408, 0x55080408, 0x44080408, 0x44080408, 0x44080408, 0x44080408, + 0x44080408, 0x44080408, 0x44080408, 0x44080408, 0x44080400, 0x44080400, 0x44080400, 0x44080400, + 0x44000400, 0x44000400, 0x44000400, 0x44000400, 0x44000400, 0x44000400, 0x44000400, 0x44000400, + 0x44000000, 0x44000000, 0x44000000, 0x33000000, 0x33000000, 0x33000000, 0x33000000, 0x33000000, + 0x33000000, 0x33000000, 0x22000000, 0x22000000, 0x22000000, 0x22000000, 0x11000000, 0x11000000, + 0x11000000, 0x11000000, 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0x00000400, 0x00000400, 0x00000400, + 0x00080808, 0x00080808, 0x00080808, 0x00080808, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, + 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, + 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, + 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, + 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, + 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11080808, 0x11080808, 0x11080808, 0x11080808, + 0x11080808, 0x11080808, 0x11080808, 0x11080808, 0x11080808, 0x11080808, 0x11080808, 0x11080808, + 0x11080808, 0x11080808, 0x11080808, 0x11080808, 0x11080808, 0x11080808, 0x11080808, 0x11080808, + 0x11080408, 0x11080408, 0x11080408, 0x11080408, 0x11080408, 0x11080408, 0x11080408, 0x11080408, + 0x11080408, 0x11080408, 0x11080408, 0x11080408, 0x11080408, 0x11080408, 0x11080408, 0x11080408, + 0x11080408, 0x11080408, 0x11080408, 0x11080408, 0x11080408, 0x11080408, 0x11080408, 0x11080408, + 0x11080408, 0x11080408, 0x11080408, 0x11080408, 0x11080408, 0x11080408, 0x11080408, 0x11080408, + 0x11080408, 0x11080408, 0x11080408, 0x11080408, 0x11080408, 0x11080408, 0x11080408, 0x11080408, + 0x11080408, 0x11080408, 0x11080408, 0x11080408, 0x11080408, 0x11080408, 0x11080408, 0x11080408, + 0x11080408, 0x11080408, 0x11080408, 0x11080408, 0x11080408, 0x11080408, 0x11080408, 0x11080408, + 0x11080408, 0x11080408, 0x11080408, 0x11080408, 0x11080408, 0x11080408, 0x11080408, 0x11080408, + 0x11080408, 0x11080408, 0x11080408, 0x11080408, 0x11080408, 0x11080408, 0x11080408, 0x11080408, + 0x11080408, 0x11080408, 0x11080408, 0x11080408, 0x11080408, 0x11080408, 0x11080408, 0x11080408, + 0x11080408, 0x11080408, 0x11080408, 0x11080408, 0x11080400, 0x11080400, 0x11080400, 0x11080400, + 0x11000400, 0x11000400, 0x11000400, 0x00000400, 0x00000400, 0x00000400, 0x00000400, 0x00000400, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xbb4d4e4d, 0xbb737573, 0xbb737573, + 0xbb8c8e8c, 0xbb8c8e8c, 0xbb8c8e8c, 0xbb8c8e8c, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, + 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, + 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb8c8e8c, 0xbb8c8e8c, 0xbb8c8e8c, 0xbb8c8e8c, + 0xbb948e94, 0xbb948e94, 0xbb948e94, 0xbb948e94, 0xbb948e94, 0xbb948e94, 0xbb948e94, 0xbb948e94, + 0xbb948e94, 0xbb948e94, 0xbb948e94, 0xbb948e94, 0xbb948e94, 0xbb948e94, 0xbb948e94, 0xbb948e94, + 0xbb948e94, 0xbb948e94, 0xbb948e94, 0xbb948e94, 0xbb948e94, 0xbb948e94, 0xbb948e94, 0xbb948e94, + 0xbb948e94, 0xbb948e94, 0xbb948e94, 0xbb948e94, 0xbb948e94, 0xbb948e94, 0xbb948e94, 0xbb948e94, + 0xbb948e94, 0xbb948e94, 0xbb948e94, 0xbb948e94, 0xbb948e94, 0xbb948e94, 0xbb948e94, 0xbb948e94, + 0xbb948e94, 0xbb948e94, 0xbb948e94, 0xbb948e94, 0xbb948e94, 0xbb948e94, 0xbb948e94, 0xbb948e94, + 0xbb8c8e8c, 0xbb8c8e8c, 0xbb8c8e8c, 0xbb8c8e8c, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, + 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, + 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, + 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, + 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, + 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, + 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, + 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, + 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, + 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, + 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, + 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, + 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, + 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, + 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, + 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, + 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, + 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, + 0xbb949294, 0xbb949294, 0xbb949294, 0xbb949294, 0xbb8c8e8c, 0xbb8c8e8c, 0xbb8c8e8c, 0xbb8c8e8c, + 0xbb737573, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xcc737573, 0xcc737573, 0xcc737573, + 0xcca5a6a5, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, + 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, + 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, + 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, + 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, + 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, + 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, + 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, + 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, + 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, + 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, + 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, + 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, + 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, + 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, + 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, + 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, + 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, + 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, + 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, + 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, + 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, + 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, + 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, + 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, + 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, + 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, + 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xccffffff, 0xcca5a6a5, 0xcca5a6a5, + 0xcc737173, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xdd737573, 0xdd737573, 0xddadaead, + 0xdda5a6a5, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, + 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, + 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, + 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, + 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, + 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, + 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, + 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, + 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, + 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, + 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, + 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, + 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, + 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, + 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, + 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, + 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, + 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, + 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, + 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, + 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, + 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, + 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, + 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, + 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, + 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, + 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, + 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddffffff, 0xddbabcba, 0xdda5a6a5, + 0xddadaaad, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xee737573, 0xeeadaead, 0xeeadaead, + 0xeebabcba, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, + 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, + 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, + 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, + 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, + 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, + 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, + 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, + 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, + 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, + 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, + 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, + 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, + 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, + 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, + 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, + 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, + 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, + 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, + 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, + 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, + 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, + 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, + 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, + 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, + 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, + 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, + 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeeffffff, 0xeed0d1d0, 0xeebabcba, + 0xeeadaaad, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xee737573, 0xeeadaead, 0xeeadaead, + 0xeed0d1d0, 0xeefffffe, 0xeeffffff, 0xeeffffff, 0xeefefffe, 0xfffefeff, 0xeefffeff, 0xeefefeff, + 0xeefeffff, 0xeefeffff, 0xeeffffff, 0xeefeffff, 0xeeffffff, 0xeefffefe, 0xeefffefe, 0xeefeffff, + 0xfffefefe, 0xeefefffe, 0xeefffffe, 0xeeffffff, 0xfffefffe, 0xeefffefe, 0xeeffffff, 0xeefffffe, + 0xfffefffe, 0xeefffeff, 0xeefeffff, 0xeefffeff, 0xffffffff, 0xeefffffe, 0xfffffefe, 0xfffffeff, + 0xeefeffff, 0xffffffff, 0xfffffffe, 0xeefffeff, 0xeefefffe, 0xffffffff, 0xeefffeff, 0xeefefffe, + 0xeefffffe, 0xeefffeff, 0xeefeffff, 0xeefeffff, 0xeefffffe, 0xeeffffff, 0xeeffffff, 0xeeffffff, + 0xeeffffff, 0xeefffeff, 0xfffeffff, 0xeefffffe, 0xeefffeff, 0xfffefffe, 0xeefffffe, 0xeeffffff, + 0xeefffefe, 0xffffffff, 0xeeffffff, 0xeefefefe, 0xeefefefe, 0xeeffffff, 0xeefffefe, 0xeefeffff, + 0xfffffffe, 0xeefffffe, 0xeefffefe, 0xeeffffff, 0xeefefeff, 0xeefefeff, 0xfffffeff, 0xfffffeff, + 0xffffffff, 0xeefeffff, 0xeefefeff, 0xeefffeff, 0xfffeffff, 0xeefffefe, 0xffffffff, 0xeefffffe, + 0xeeffffff, 0xfffffeff, 0xeefffffe, 0xeeffffff, 0xeefeffff, 0xfffefefe, 0xeefffeff, 0xeefffffe, + 0xeefffefe, 0xeefffeff, 0xfffefefe, 0xfffffffe, 0xeefffeff, 0xeefefeff, 0xeefffefe, 0xeeffffff, + 0xeefffeff, 0xeefefeff, 0xfffefeff, 0xeefefefe, 0xfffffffe, 0xfffefeff, 0xeefefeff, 0xeeffffff, + 0xeefefefe, 0xeefffffe, 0xeefefefe, 0xeefffeff, 0xfffefffe, 0xfffefefe, 0xeefefffe, 0xeefefffe, + 0xfffffffe, 0xffffffff, 0xeefeffff, 0xfffffefe, 0xeefefefe, 0xeefffefe, 0xfffefefe, 0xeefefeff, + 0xfffeffff, 0xeeffffff, 0xfffefefe, 0xfffefefe, 0xeefeffff, 0xeefeffff, 0xfffffefe, 0xeeffffff, + 0xeefffefe, 0xeefefffe, 0xeefefffe, 0xeefffeff, 0xfffffefe, 0xeeffffff, 0xfffefeff, 0xfffffefe, + 0xeefeffff, 0xeefefeff, 0xeefefeff, 0xeefffffe, 0xfffffefe, 0xeefffeff, 0xeefefffe, 0xeefefefe, + 0xeefeffff, 0xeefefefe, 0xeefeffff, 0xeefffeff, 0xeefeffff, 0xeeffffff, 0xfffffeff, 0xeeffffff, + 0xeefefffe, 0xfffefffe, 0xfffefffe, 0xeefffeff, 0xfffffeff, 0xeefefefe, 0xeefefffe, 0xeefefffe, + 0xeefefffe, 0xeefffeff, 0xeefffeff, 0xfffeffff, 0xeefffffe, 0xeeffffff, 0xeefffefe, 0xeefefefe, + 0xeefefeff, 0xeefefefe, 0xeefefeff, 0xeeffffff, 0xeeffffff, 0xfffefffe, 0xfffeffff, 0xeefffefe, + 0xeefffffe, 0xeefefefe, 0xeefffefe, 0xeefeffff, 0xeefffffe, 0xeefefefe, 0xeefefffe, 0xeefeffff, + 0xeefffeff, 0xfffffffe, 0xeefeffff, 0xeefeffff, 0xeefffffe, 0xeefffffe, 0xeefefffe, 0xeefffeff, + 0xeefefeff, 0xfffffffe, 0xeefefeff, 0xeefefffe, 0xeeffffff, 0xeefffefe, 0xeefefeff, 0xeefffffe, + 0xeefefffe, 0xeefffeff, 0xeefefeff, 0xfffeffff, 0xeefefeff, 0xeefffeff, 0xeefffffe, 0xeefffeff, + 0xeefffefe, 0xeefefeff, 0xeefefffe, 0xeefefeff, 0xeefffeff, 0xeefffffe, 0xeefffffe, 0xeefefeff, + 0xeefefefe, 0xfffffeff, 0xeefffefe, 0xeefefeff, 0xeefefefe, 0xfffeffff, 0xeee6e7e6, 0xeed0d1d0, + 0xeeadaaad, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xff848384, 0xffc5c2c5, 0xffc5c2c5, + 0xffdedfde, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, + 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, + 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, + 0xfffefeff, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, + 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, + 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, + 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, + 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, + 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, + 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, + 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, + 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, + 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefffe, 0xfffefefe, + 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, + 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, + 0xfffefeff, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, + 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, + 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, + 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, + 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, + 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, + 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, + 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, + 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, + 0xfffefffe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, + 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, + 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, + 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xfffefefe, 0xffe9e9e9, 0xffdedfde, + 0xffdedfde, 0x00060306, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xff848384, 0xffc5c2c5, 0xffc5c2c5, + 0xffdedfde, 0xfffefdfd, 0xfffdfdfd, 0xfffdfefd, 0xfffdfdfd, 0xfffdfdfe, 0xfffdfdfd, 0xfffefefd, + 0xfffdfefe, 0xfffdfefd, 0xfffefefd, 0xfffefefd, 0xfffefefd, 0xfffdfefd, 0xfffdfdfd, 0xfffdfdfd, + 0xfffefefe, 0xfffdfdfd, 0xfffdfdfd, 0xfffdfdfe, 0xfffefdfd, 0xfffefefd, 0xfffdfefd, 0xfffdfdfd, + 0xfffdfdfd, 0xfffdfefe, 0xfffdfdfd, 0xfffdfefd, 0xfffdfefe, 0xfffefdfd, 0xfffefdfd, 0xfffdfdfe, + 0xfffdfdfd, 0xfffdfefd, 0xfffdfdfe, 0xfffdfdfd, 0xfffdfdfe, 0xfffdfefd, 0xfffefdfe, 0xfffefdfd, + 0xfffdfefd, 0xfffefdfe, 0xfffefdfd, 0xfffefefd, 0xfffefefe, 0xfffefdfe, 0xfffefefe, 0xfffdfdfd, + 0xfffdfefd, 0xfffdfefd, 0xfffdfdfd, 0xfffdfdfd, 0xfffefdfe, 0xfffdfefe, 0xfffefdfd, 0xfffdfefd, + 0xfffdfdfd, 0xfffdfefe, 0xfffdfefd, 0xfffefdfd, 0xfffdfefe, 0xfffdfdfe, 0xfffdfefd, 0xfffefdfe, + 0xfffdfefd, 0xfffefefd, 0xfffdfefd, 0xfffdfefd, 0xfffdfefd, 0xfffdfefe, 0xfffefdfe, 0xfffdfefd, + 0xfffefefe, 0xfffdfdfe, 0xfffefefd, 0xfffdfdfd, 0xfffefefd, 0xfffefdfe, 0xfffefdfd, 0xfffefefd, + 0xfffdfefd, 0xfffdfefd, 0xfffdfdfe, 0xfffdfdfd, 0xfffefdfe, 0xfffdfefe, 0xfffdfdfd, 0xfffdfefd, + 0xfffdfdfe, 0xfffefdfe, 0xfffdfdfe, 0xfffdfefe, 0xfffefefe, 0xfffefefd, 0xfffefdfe, 0xfffdfdfe, + 0xfffdfdfd, 0xfffdfefd, 0xfffefdfd, 0xfffdfdfd, 0xfffdfdfe, 0xfffdfdfd, 0xfffefefe, 0xfffefdfd, + 0xfffefdfd, 0xfffdfefe, 0xfffdfdfe, 0xfffefdfd, 0xfffefdfd, 0xfffefdfe, 0xfffdfdfd, 0xfffdfdfd, + 0xfffefefe, 0xfffdfefe, 0xfffefdfd, 0xfffefefe, 0xfffdfdfd, 0xfffefdfd, 0xfffdfdfd, 0xfffefdfd, + 0xfffefdfe, 0xfffdfefd, 0xfffdfdfd, 0xfffdfefe, 0xfffdfdfd, 0xfffdfefe, 0xfffdfdfe, 0xfffdfdfd, + 0xfffefefe, 0xfffdfefd, 0xfffdfefe, 0xfffdfdfe, 0xfffdfdfe, 0xfffefefd, 0xfffefdfe, 0xfffdfdfd, + 0xfffdfdfd, 0xfffefefe, 0xfffdfdfe, 0xfffefdfe, 0xfffdfdfd, 0xfffdfefd, 0xfffefefe, 0xfffefdfd, + 0xfffdfefe, 0xfffdfefe, 0xfffefefe, 0xfffdfdfe, 0xfffdfdfd, 0xfffefdfd, 0xfffdfdfd, 0xfffdfdfd, + 0xfffdfdfd, 0xfffdfefd, 0xfffdfdfd, 0xfffefdfd, 0xfffefefe, 0xfffdfefd, 0xfffefdfd, 0xfffdfefe, + 0xfffefdfd, 0xfffefdfd, 0xfffdfdfd, 0xfffdfdfd, 0xfffefdfe, 0xfffefdfd, 0xfffefdfd, 0xfffdfefe, + 0xfffdfefd, 0xfffdfefd, 0xfffdfdfd, 0xfffefefe, 0xfffdfefd, 0xfffefdfd, 0xfffdfdfd, 0xfffefefd, + 0xfffefefd, 0xfffdfdfd, 0xfffdfdfd, 0xfffdfdfd, 0xfffdfefd, 0xfffdfdfe, 0xfffefdfe, 0xfffefdfd, + 0xfffdfdfd, 0xfffefefd, 0xfffefefd, 0xfffdfefd, 0xfffefefd, 0xfffefdfd, 0xfffdfefe, 0xfffdfefd, + 0xfffdfdfd, 0xfffdfdfe, 0xfffdfdfe, 0xfffdfdfd, 0xfffdfdfe, 0xfffefdfe, 0xfffefdfd, 0xfffdfefe, + 0xfffdfdfd, 0xfffefefd, 0xfffdfdfd, 0xfffefdfe, 0xfffdfefe, 0xfffdfdfd, 0xfffdfdfd, 0xfffdfdfe, + 0xfffefdfe, 0xfffdfdfd, 0xfffdfdfd, 0xfffdfdfd, 0xfffefdfe, 0xfffefdfe, 0xfffdfdfd, 0xfffdfdfe, + 0xfffefefd, 0xfffdfdfd, 0xfffefefe, 0xfffdfefd, 0xfffdfdfe, 0xfffdfdfe, 0xfff4f4f4, 0xffdedfde, + 0xffdedfde, 0x00060306, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xff848384, 0xffc5c2c5, 0xffc5c2c5, + 0xffe9e9e9, 0xfffdfcfd, 0xfffdfdfd, 0xfffdfdfd, 0xfffdfdfc, 0xfffcfcfd, 0xfffdfdfd, 0xfffdfdfd, + 0xfffcfdfd, 0xfffdfdfc, 0xfffcfdfd, 0xfffcfdfd, 0xfffdfdfd, 0xfffdfdfd, 0xfffdfcfd, 0xfffdfdfc, + 0xfffdfcfd, 0xfffdfcfd, 0xfffdfcfc, 0xfffcfcfc, 0xfffdfcfd, 0xfffdfdfd, 0xfffdfcfd, 0xfffdfdfd, + 0xfffdfdfd, 0xfffdfcfc, 0xfffdfcfd, 0xfffcfcfd, 0xfffdfdfc, 0xfffdfcfd, 0xfffdfdfc, 0xfffdfdfd, + 0xfffdfdfc, 0xfffcfdfd, 0xfffdfdfc, 0xfffdfcfd, 0xfffcfcfd, 0xfffdfdfd, 0xfffdfdfc, 0xfffdfdfd, + 0xfffdfdfd, 0xfffdfdfd, 0xfffcfcfc, 0xfffdfdfd, 0xfffcfdfd, 0xfffdfdfc, 0xfffdfdfc, 0xfffdfcfd, + 0xfffdfdfd, 0xfffdfdfd, 0xfffdfdfd, 0xfffdfdfd, 0xfffdfdfd, 0xfffdfdfd, 0xfffdfdfd, 0xfffcfdfd, + 0xfffdfcfd, 0xfffdfdfd, 0xfffdfdfd, 0xfffcfdfd, 0xfffcfcfc, 0xfffcfdfd, 0xfffdfdfc, 0xfffdfcfd, + 0xfffdfcfd, 0xfffdfcfd, 0xfffdfdfd, 0xfffdfdfd, 0xfffdfdfd, 0xfffcfdfd, 0xfffdfcfd, 0xfffdfdfd, + 0xfffdfdfd, 0xfffdfdfc, 0xfffdfdfd, 0xfffdfcfd, 0xfffcfdfd, 0xfffdfcfc, 0xfffdfcfd, 0xfffdfdfd, + 0xfffcfdfc, 0xfffdfdfd, 0xfffdfcfc, 0xfffdfcfc, 0xfffcfdfc, 0xfffcfdfd, 0xfffdfdfd, 0xfffcfcfd, + 0xfffdfcfd, 0xfffcfcfc, 0xfffdfdfc, 0xfffcfcfd, 0xfffcfdfd, 0xfffdfdfd, 0xfffcfcfd, 0xfffdfdfd, + 0xfffdfcfd, 0xfffcfdfd, 0xfffdfdfd, 0xfffdfdfc, 0xfffcfcfc, 0xfffdfcfd, 0xfffcfdfd, 0xfffdfcfc, + 0xfffcfdfc, 0xfffdfdfd, 0xfffdfdfd, 0xfffdfdfc, 0xfffdfdfd, 0xfffdfdfd, 0xfffcfcfd, 0xfffdfdfd, + 0xfffdfdfc, 0xfffdfdfd, 0xfffdfdfd, 0xfffcfdfd, 0xfffdfdfd, 0xfffdfdfd, 0xfffdfdfc, 0xfffdfcfd, + 0xfffdfdfd, 0xfffcfcfc, 0xfffdfcfd, 0xfffdfdfd, 0xfffdfdfd, 0xfffdfdfd, 0xfffdfdfd, 0xfffdfdfd, + 0xfffdfcfd, 0xfffdfdfd, 0xfffdfdfd, 0xfffdfdfd, 0xfffdfdfd, 0xfffdfdfd, 0xfffdfcfd, 0xfffdfdfd, + 0xfffdfdfd, 0xfffcfdfd, 0xfffdfcfc, 0xfffcfdfc, 0xfffdfdfd, 0xfffdfdfd, 0xfffdfdfd, 0xfffdfdfd, + 0xfffdfdfd, 0xfffdfcfc, 0xfffdfdfd, 0xfffdfdfd, 0xfffdfdfd, 0xfffcfdfd, 0xfffdfcfd, 0xfffdfdfd, + 0xfffdfdfc, 0xfffdfdfc, 0xfffcfdfd, 0xfffcfdfd, 0xfffdfdfc, 0xfffdfdfd, 0xfffdfdfd, 0xfffdfdfd, + 0xfffdfcfd, 0xfffdfdfd, 0xfffdfdfc, 0xfffdfdfc, 0xfffdfdfc, 0xfffdfdfd, 0xfffcfdfc, 0xfffdfdfd, + 0xfffdfdfd, 0xfffcfcfd, 0xfffdfcfd, 0xfffcfdfc, 0xfffdfcfd, 0xfffcfdfc, 0xfffdfdfd, 0xfffdfdfd, + 0xfffdfcfc, 0xfffdfdfd, 0xfffcfcfd, 0xfffdfdfc, 0xfffdfdfc, 0xfffdfdfc, 0xfffdfcfd, 0xfffdfdfd, + 0xfffcfdfd, 0xfffdfcfd, 0xfffdfcfd, 0xfffdfdfc, 0xfffdfdfd, 0xfffcfdfd, 0xfffdfdfd, 0xfffcfdfd, + 0xfffdfcfd, 0xfffcfdfd, 0xfffdfdfd, 0xfffdfdfd, 0xfffdfcfd, 0xfffdfdfd, 0xfffcfdfd, 0xfffdfcfc, + 0xfffcfcfd, 0xfffdfcfd, 0xfffdfdfc, 0xfffcfdfd, 0xfffdfdfd, 0xfffdfdfd, 0xfffdfcfd, 0xfffdfdfc, + 0xfffdfdfd, 0xfffdfdfd, 0xfffdfcfc, 0xfffdfdfd, 0xfffdfcfd, 0xfffcfdfd, 0xfffcfdfc, 0xfffdfdfd, + 0xfffdfdfc, 0xfffdfdfd, 0xfffdfdfd, 0xfffcfdfd, 0xfffcfdfd, 0xfffdfcfd, 0xfff4f4f4, 0xffe9e9e9, + 0xffdedfde, 0x00060306, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xff848384, 0xffc5c2c5, 0xffc5c2c5, + 0xffe9e9e9, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, + 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, + 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, + 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, + 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfbfc, + 0xfffbfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffbfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, + 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, + 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfbfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, + 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, + 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, + 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, + 0xfffcfcfc, 0xfffcfcfc, 0xfffcfbfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, + 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, + 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, + 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfb, 0xfffcfcfc, 0xfffcfcfc, + 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, + 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, + 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, + 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfb, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, + 0xfffcfcfb, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, + 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, + 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, + 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, + 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, + 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfb, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, + 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, + 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, + 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfffcfcfc, 0xfff4f4f4, 0xffe9e9e9, + 0xffdedfde, 0x00060306, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xff848684, 0xffc5c6c5, 0xffc5c6c5, + 0xffe6ebe6, 0xfffbfbfb, 0xfffbfbfc, 0xfffbfbfb, 0xfffbfbfc, 0xfffbfcfb, 0xfffbfbfb, 0xfffbfbfb, + 0xfffbfcfb, 0xfffbfbfb, 0xfffbfbfc, 0xfffbfbfb, 0xfffbfbfb, 0xfffbfbfb, 0xfffcfbfb, 0xfffcfbfb, + 0xfffbfbfb, 0xfffbfbfb, 0xfffcfbfb, 0xfffbfbfb, 0xfffbfbfb, 0xfffbfbfb, 0xfffbfbfc, 0xfffbfbfb, + 0xfffbfcfc, 0xfffcfbfb, 0xfffcfbfb, 0xfffbfbfb, 0xfffbfbfb, 0xfffbfbfb, 0xfffbfbfc, 0xfffbfbfc, + 0xfffbfbfb, 0xfffbfbfb, 0xfffbfbfb, 0xfffcfcfc, 0xfffbfbfb, 0xfffcfbfb, 0xfffbfcfb, 0xfffbfbfb, + 0xfffbfbfb, 0xfffbfcfb, 0xfffbfbfb, 0xfffbfbfb, 0xfffbfcfb, 0xfffbfbfb, 0xfffbfbfb, 0xfffbfbfb, + 0xfffcfbfb, 0xfffbfbfb, 0xfffcfbfb, 0xfffbfcfb, 0xfffbfbfb, 0xfffbfcfb, 0xfffbfbfb, 0xfffcfbfb, + 0xfffbfbfb, 0xfffbfbfb, 0xfffbfbfb, 0xfffbfbfb, 0xfffbfbfb, 0xfffbfcfc, 0xfffbfcfb, 0xfffbfcfb, + 0xfffbfcfc, 0xfffbfbfb, 0xfffcfbfb, 0xfffbfcfb, 0xfffbfbfc, 0xfffbfbfb, 0xfffbfbfb, 0xfffbfbfb, + 0xfffcfbfb, 0xfffcfbfb, 0xfffcfbfb, 0xfffbfbfb, 0xfffbfbfb, 0xfffbfcfc, 0xfffbfbfb, 0xfffbfbfb, + 0xfffbfbfc, 0xfffbfbfb, 0xfffbfcfc, 0xfffcfbfb, 0xfffbfbfb, 0xfffbfbfb, 0xfffbfbfb, 0xfffbfcfb, + 0xfffbfbfb, 0xfffbfbfb, 0xfffbfcfb, 0xfffbfbfb, 0xfffcfbfb, 0xfffbfbfb, 0xfffbfbfb, 0xfffcfbfb, + 0xfffbfcfb, 0xfffbfcfb, 0xfffcfbfb, 0xfffbfcfb, 0xfffbfbfb, 0xfffbfbfc, 0xfffcfbfb, 0xfffbfbfc, + 0xfffbfbfb, 0xfffcfbfb, 0xfffbfbfc, 0xfffbfbfb, 0xfffbfbfb, 0xfffbfbfb, 0xfffbfbfb, 0xfffbfbfb, + 0xfffbfbfb, 0xfffbfcfb, 0xfffbfbfb, 0xfffbfbfb, 0xfffbfbfb, 0xfffbfbfb, 0xfffbfcfc, 0xfffcfbfb, + 0xfffbfcfb, 0xfffbfbfb, 0xfffbfbfb, 0xfffcfbfb, 0xfffbfcfb, 0xfffbfbfb, 0xfffbfbfc, 0xfffbfbfb, + 0xfffbfbfc, 0xfffbfbfc, 0xfffbfbfb, 0xfffbfbfb, 0xfffbfbfb, 0xfffcfbfc, 0xfffcfbfb, 0xfffbfcfb, + 0xfffbfbfb, 0xfffcfbfb, 0xfffcfbfb, 0xfffbfbfb, 0xfffcfbfb, 0xfffbfcfb, 0xfffbfbfb, 0xfffbfbfb, + 0xfffbfbfc, 0xfffbfcfc, 0xfffcfcfb, 0xfffbfbfb, 0xfffbfbfb, 0xfffbfcfb, 0xfffbfbfc, 0xfffbfbfb, + 0xfffcfbfb, 0xfffbfbfb, 0xfffbfbfb, 0xfffbfbfb, 0xfffbfbfb, 0xfffbfbfb, 0xfffbfcfb, 0xfffbfbfb, + 0xfffbfcfb, 0xfffbfbfb, 0xfffcfbfb, 0xfffbfbfc, 0xfffbfcfc, 0xfffbfbfc, 0xfffbfbfb, 0xfffbfcfc, + 0xfffbfbfb, 0xfffbfbfb, 0xfffbfbfc, 0xfffbfcfb, 0xfffbfbfb, 0xfffbfbfb, 0xfffbfbfb, 0xfffbfbfc, + 0xfffbfcfb, 0xfffbfbfb, 0xfffcfbfb, 0xfffbfbfb, 0xfffcfbfb, 0xfffcfbfb, 0xfffbfbfc, 0xfffbfcfc, + 0xfffbfbfb, 0xfffbfbfb, 0xfffcfbfc, 0xfffcfbfb, 0xfffbfbfb, 0xfffbfbfc, 0xfffbfcfb, 0xfffbfbfb, + 0xfffbfbfb, 0xfffbfcfb, 0xfffcfbfb, 0xfffbfbfc, 0xfffbfbfb, 0xfffcfbfb, 0xfffcfbfb, 0xfffbfbfb, + 0xfffbfbfb, 0xfffbfcfb, 0xfffbfbfb, 0xfffbfbfb, 0xfffcfbfb, 0xfffbfbfb, 0xfffbfcfb, 0xfffbfbfb, + 0xfffbfbfb, 0xfffbfbfb, 0xfffcfbfb, 0xfffbfbfb, 0xfffbfbfb, 0xfffbfbfb, 0xfffbfbfb, 0xfffcfbfb, + 0xfffbfbfc, 0xfffbfcfb, 0xfffbfcfb, 0xfffbfbfb, 0xfffbfbfb, 0xfffbfbfc, 0xfff7f8f7, 0xffe6ebe6, + 0xffdedfde, 0x00000300, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xff848684, 0xffc5c6c5, 0xffc5c6c5, + 0xffe6ebe6, 0xfffafafb, 0xfffafafb, 0xfffafafa, 0xfffafbfa, 0xfffbfafb, 0xfffafafa, 0xfffafafa, + 0xfffafbfa, 0xfffbfafa, 0xfffbfafa, 0xfffafbfa, 0xfffbfafa, 0xfffbfafb, 0xfffafafa, 0xfffbfafa, + 0xfffafafa, 0xfffafafb, 0xfffbfafb, 0xfffafafa, 0xfffbfbfa, 0xfffafafa, 0xfffafbfb, 0xfffafbfb, + 0xfffafbfa, 0xfffafafb, 0xfffafbfa, 0xfffbfafa, 0xfffbfbfa, 0xfffafbfa, 0xfffbfafa, 0xfffafbfa, + 0xfffafafa, 0xfffbfafa, 0xfffafbfa, 0xfffbfafb, 0xfffafafb, 0xfffafafa, 0xfffafbfa, 0xfffbfbfb, + 0xfffafbfa, 0xfffbfafb, 0xfffafafa, 0xfffafbfb, 0xfffafbfa, 0xfffafafa, 0xfffafafb, 0xfffafbfb, + 0xfffbfafa, 0xfffafbfa, 0xfffafafb, 0xfffafafb, 0xfffafafb, 0xfffafafb, 0xfffbfbfb, 0xfffafafa, + 0xfffafafa, 0xfffafafb, 0xfffbfafa, 0xfffafbfa, 0xfffafbfa, 0xfffafbfa, 0xfffafafa, 0xfffbfbfa, + 0xfffafafa, 0xfffbfbfa, 0xfffbfafa, 0xfffbfafb, 0xfffafafa, 0xfffafbfa, 0xfffafafa, 0xfffafbfa, + 0xfffafafa, 0xfffafafa, 0xfffbfafb, 0xfffafafa, 0xfffafbfa, 0xfffafafa, 0xfffafafa, 0xfffafafa, + 0xfffbfbfa, 0xfffafafa, 0xfffbfafa, 0xfffafafb, 0xfffbfbfa, 0xfffafbfa, 0xfffafbfa, 0xfffafafa, + 0xfffafbfb, 0xfffbfbfa, 0xfffafafa, 0xfffafafa, 0xfffbfafb, 0xfffafafb, 0xfffafbfa, 0xfffafbfa, + 0xfffbfbfa, 0xfffbfbfb, 0xfffafbfa, 0xfffafafa, 0xfffbfbfa, 0xfffbfafa, 0xfffafbfa, 0xfffafafa, + 0xfffbfafb, 0xfffafafa, 0xfffbfafb, 0xfffbfbfb, 0xfffbfafb, 0xfffafafa, 0xfffafafa, 0xfffafbfa, + 0xfffafafa, 0xfffafafb, 0xfffafafb, 0xfffafafb, 0xfffbfafb, 0xfffbfafb, 0xfffafbfa, 0xfffbfafa, + 0xfffafafa, 0xfffafbfb, 0xfffbfafa, 0xfffafafb, 0xfffafbfb, 0xfffafbfa, 0xfffafafa, 0xfffbfbfa, + 0xfffafbfa, 0xfffafafa, 0xfffafafb, 0xfffbfafa, 0xfffafafa, 0xfffbfafa, 0xfffbfafb, 0xfffbfafb, + 0xfffafafa, 0xfffafbfa, 0xfffbfbfa, 0xfffafbfa, 0xfffbfbfa, 0xfffafbfa, 0xfffafbfb, 0xfffafbfa, + 0xfffbfbfb, 0xfffafbfb, 0xfffbfafb, 0xfffafafa, 0xfffafafa, 0xfffbfafa, 0xfffbfafa, 0xfffbfafb, + 0xfffbfbfa, 0xfffafbfa, 0xfffafafa, 0xfffafbfa, 0xfffbfafa, 0xfffafafb, 0xfffafbfa, 0xfffafafb, + 0xfffbfbfa, 0xfffbfafa, 0xfffbfbfa, 0xfffbfafb, 0xfffbfafa, 0xfffafafa, 0xfffafafa, 0xfffbfafb, + 0xfffafafa, 0xfffbfbfb, 0xfffbfafb, 0xfffafafb, 0xfffafafa, 0xfffbfafa, 0xfffbfafb, 0xfffbfafb, + 0xfffbfafa, 0xfffafafb, 0xfffbfafa, 0xfffafafb, 0xfffafafa, 0xfffafbfb, 0xfffbfbfa, 0xfffbfafa, + 0xfffafbfa, 0xfffafafa, 0xfffafbfa, 0xfffbfbfa, 0xfffafbfb, 0xfffafbfb, 0xfffbfafb, 0xfffafafa, + 0xfffafbfb, 0xfffafafb, 0xfffbfbfa, 0xfffafafa, 0xfffafafb, 0xfffafafa, 0xfffafafb, 0xfffafbfa, + 0xfffbfafa, 0xfffbfbfb, 0xfffafafb, 0xfffafbfb, 0xfffafbfb, 0xfffbfafa, 0xfffafbfb, 0xfffafafa, + 0xfffafafa, 0xfffafbfa, 0xfffbfafa, 0xfffafbfa, 0xfffbfafa, 0xfffbfafa, 0xfffafbfa, 0xfffbfafb, + 0xfffafbfa, 0xfffafafb, 0xfffbfafa, 0xfffbfafb, 0xfffafbfb, 0xfffbfbfa, 0xfff7f8f7, 0xffe6ebe6, + 0xffdedfde, 0x00000300, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xff848684, 0xffc5c6c5, 0xffc5c6c5, + 0xffe6ebe6, 0xfffafafa, 0xfff9f9fa, 0xfffaf9fa, 0xfff9faf9, 0xfff9faf9, 0xfffafafa, 0xfff9f9f9, + 0xfffaf9f9, 0xfff9f9f9, 0xfff9f9f9, 0xfffaf9f9, 0xfff9fafa, 0xfff9fafa, 0xfff9f9fa, 0xfffafaf9, + 0xfff9faf9, 0xfffafafa, 0xfff9f9fa, 0xfff9f9f9, 0xfff9f9f9, 0xfffaf9fa, 0xfffaf9fa, 0xfff9f9f9, + 0xfffafaf9, 0xfff9f9f9, 0xfff9faf9, 0xfffaf9f9, 0xfffafaf9, 0xfffaf9f9, 0xfff9f9fa, 0xfff9f9f9, + 0xfffafafa, 0xfff9faf9, 0xfff9f9f9, 0xfff9fafa, 0xfffafaf9, 0xfff9f9fa, 0xfffaf9f9, 0xfff9f9fa, + 0xfff9faf9, 0xfffafafa, 0xfffafafa, 0xfffafaf9, 0xfff9faf9, 0xfff9f9f9, 0xfff9fafa, 0xfffafaf9, + 0xfffafaf9, 0xfffafafa, 0xfff9f9fa, 0xfffaf9fa, 0xfffafaf9, 0xfff9f9f9, 0xfffaf9f9, 0xfff9fafa, + 0xfff9fafa, 0xfff9faf9, 0xfffaf9f9, 0xfffaf9fa, 0xfffaf9f9, 0xfff9f9fa, 0xfffaf9f9, 0xfff9f9f9, + 0xfff9faf9, 0xfffaf9fa, 0xfffaf9f9, 0xfffaf9f9, 0xfff9faf9, 0xfffafafa, 0xfff9f9f9, 0xfff9f9fa, + 0xfffafafa, 0xfff9f9f9, 0xfffafaf9, 0xfffaf9f9, 0xfff9faf9, 0xfff9f9f9, 0xfffafaf9, 0xfff9f9fa, + 0xfff9faf9, 0xfff9fafa, 0xfffaf9fa, 0xfffafaf9, 0xfffafaf9, 0xfffaf9fa, 0xfff9f9fa, 0xfffaf9f9, + 0xfffaf9fa, 0xfff9fafa, 0xfffaf9f9, 0xfff9f9f9, 0xfffaf9f9, 0xfff9f9fa, 0xfffafafa, 0xfff9fafa, + 0xfff9f9fa, 0xfffaf9f9, 0xfffafaf9, 0xfffafaf9, 0xfff9faf9, 0xfff9f9fa, 0xfff9fafa, 0xfffaf9fa, + 0xfff9f9fa, 0xfffaf9f9, 0xfffafafa, 0xfff9faf9, 0xfffafaf9, 0xfffaf9f9, 0xfff9faf9, 0xfffaf9fa, + 0xfffafafa, 0xfffafaf9, 0xfff9faf9, 0xfffafaf9, 0xfffafafa, 0xfffafafa, 0xfff9f9f9, 0xfff9f9fa, + 0xfffaf9fa, 0xfff9f9f9, 0xfffafaf9, 0xfffafaf9, 0xfffafaf9, 0xfffaf9f9, 0xfffafafa, 0xfff9f9fa, + 0xfff9fafa, 0xfff9faf9, 0xfffaf9f9, 0xfffaf9fa, 0xfff9f9f9, 0xfff9fafa, 0xfff9f9fa, 0xfff9f9fa, + 0xfff9f9f9, 0xfffafaf9, 0xfff9f9f9, 0xfff9faf9, 0xfff9f9fa, 0xfffaf9fa, 0xfff9faf9, 0xfffafafa, + 0xfff9f9fa, 0xfffaf9fa, 0xfffafaf9, 0xfffaf9f9, 0xfffafafa, 0xfff9f9fa, 0xfffafaf9, 0xfffaf9f9, + 0xfff9faf9, 0xfffafaf9, 0xfff9faf9, 0xfff9f9f9, 0xfff9f9f9, 0xfff9f9f9, 0xfffafaf9, 0xfffaf9fa, + 0xfff9faf9, 0xfffaf9f9, 0xfffafaf9, 0xfffafaf9, 0xfff9fafa, 0xfffafafa, 0xfffaf9f9, 0xfff9fafa, + 0xfff9f9f9, 0xfffafaf9, 0xfffaf9fa, 0xfff9f9f9, 0xfff9faf9, 0xfffafaf9, 0xfff9f9fa, 0xfff9f9fa, + 0xfffafaf9, 0xfffaf9fa, 0xfff9fafa, 0xfff9f9f9, 0xfff9faf9, 0xfff9f9f9, 0xfff9f9fa, 0xfff9fafa, + 0xfff9f9fa, 0xfffafafa, 0xfff9f9fa, 0xfffaf9fa, 0xfff9f9fa, 0xfffafaf9, 0xfff9fafa, 0xfff9f9fa, + 0xfff9faf9, 0xfff9f9fa, 0xfff9fafa, 0xfffaf9f9, 0xfff9f9f9, 0xfffafafa, 0xfff9f9f9, 0xfff9faf9, + 0xfffafaf9, 0xfff9faf9, 0xfff9f9fa, 0xfffaf9f9, 0xfffaf9fa, 0xfff9f9fa, 0xfff9f9f9, 0xfff9fafa, + 0xfffafafa, 0xfffafafa, 0xfff9f9f9, 0xfffafafa, 0xfff9f9f9, 0xfffaf9fa, 0xfff9f9f9, 0xfff9fafa, + 0xfff9f9f9, 0xfff9f9f9, 0xfffaf9fa, 0xfffaf9f9, 0xfffaf9f9, 0xfffaf9f9, 0xfff7f8f7, 0xffe6ebe6, + 0xffdedfde, 0x00000300, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xff848684, 0xffc5c6c5, 0xffc5c6c5, + 0xffe6ebe6, 0xfff8f9f9, 0xfff9f8f8, 0xfff8f9f9, 0xfff9f8f9, 0xfff8f9f9, 0xfff9f8f9, 0xfff9f8f8, + 0xfff8f8f9, 0xfff9f9f9, 0xfff8f9f9, 0xfff8f8f9, 0xfff8f8f8, 0xfff9f8f8, 0xfff9f9f9, 0xfff9f9f8, + 0xfff9f9f9, 0xfff9f8f9, 0xfff8f9f9, 0xfff8f9f9, 0xfff9f9f8, 0xfff9f8f8, 0xfff8f9f8, 0xfff8f8f9, + 0xfff9f8f9, 0xfff8f9f8, 0xfff9f8f8, 0xfff9f9f8, 0xfff9f8f8, 0xfff9f8f8, 0xfff8f9f9, 0xfff9f9f9, + 0xfff9f8f8, 0xfff8f9f9, 0xfff8f8f9, 0xfff9f8f9, 0xfff9f9f8, 0xfff9f8f8, 0xfff8f9f8, 0xfff8f8f9, + 0xfff9f9f9, 0xfff9f9f9, 0xfff8f9f9, 0xfff8f9f8, 0xfff9f8f9, 0xfff9f9f9, 0xfff8f9f9, 0xfff8f9f8, + 0xfff9f8f9, 0xfff8f8f8, 0xfff8f9f9, 0xfff9f9f9, 0xfff8f8f8, 0xfff9f8f9, 0xfff8f8f8, 0xfff9f9f9, + 0xfff8f9f9, 0xfff8f9f9, 0xfff8f9f9, 0xfff8f9f9, 0xfff8f8f9, 0xfff8f8f9, 0xfff8f9f8, 0xfff8f8f8, + 0xfff9f8f8, 0xfff8f9f9, 0xfff8f9f9, 0xfff8f9f9, 0xfff8f9f9, 0xfff9f9f9, 0xfff9f9f8, 0xfff8f8f8, + 0xfff8f8f8, 0xfff9f9f9, 0xfff9f8f8, 0xfff9f8f8, 0xfff8f8f9, 0xfff9f8f9, 0xfff9f9f9, 0xfff9f9f8, + 0xfff9f8f8, 0xfff8f8f8, 0xfff8f9f9, 0xfff9f9f9, 0xfff8f9f8, 0xfff9f9f8, 0xfff8f9f9, 0xfff8f9f9, + 0xfff9f8f8, 0xfff9f9f9, 0xfff8f8f8, 0xfff8f8f8, 0xfff9f9f8, 0xfff9f9f8, 0xfff9f9f9, 0xfff9f9f8, + 0xfff8f9f9, 0xfff9f8f8, 0xfff8f8f8, 0xfff9f9f8, 0xfff8f8f8, 0xfff8f8f9, 0xfff8f8f9, 0xfff8f9f9, + 0xfff9f9f9, 0xfff9f9f9, 0xfff8f8f9, 0xfff9f8f9, 0xfff8f8f9, 0xfff8f8f9, 0xfff9f8f8, 0xfff9f9f9, + 0xfff9f9f9, 0xfff8f9f9, 0xfff9f9f8, 0xfff9f9f9, 0xfff9f8f8, 0xfff8f8f8, 0xfff9f8f9, 0xfff8f8f8, + 0xfff9f8f9, 0xfff9f8f9, 0xfff9f9f8, 0xfff8f8f8, 0xfff8f8f9, 0xfff9f8f9, 0xfff9f8f9, 0xfff8f8f8, + 0xfff8f8f9, 0xfff9f9f9, 0xfff8f8f8, 0xfff8f9f8, 0xfff9f9f8, 0xfff9f8f8, 0xfff9f8f9, 0xfff9f9f9, + 0xfff9f9f9, 0xfff9f9f8, 0xfff9f8f8, 0xfff9f9f9, 0xfff9f9f9, 0xfff9f8f8, 0xfff8f8f9, 0xfff8f9f8, + 0xfff8f9f8, 0xfff9f8f9, 0xfff9f9f8, 0xfff9f9f8, 0xfff9f8f8, 0xfff8f9f9, 0xfff8f8f9, 0xfff8f8f9, + 0xfff9f8f8, 0xfff9f8f9, 0xfff8f8f9, 0xfff9f9f9, 0xfff9f8f9, 0xfff8f8f8, 0xfff8f9f8, 0xfff9f8f9, + 0xfff9f8f8, 0xfff9f9f9, 0xfff8f8f8, 0xfff9f8f8, 0xfff9f9f9, 0xfff8f9f9, 0xfff8f9f9, 0xfff9f8f8, + 0xfff8f9f9, 0xfff8f9f8, 0xfff8f8f9, 0xfff9f8f8, 0xfff8f8f8, 0xfff9f9f9, 0xfff8f9f8, 0xfff8f9f8, + 0xfff9f8f8, 0xfff8f9f9, 0xfff8f8f8, 0xfff9f9f8, 0xfff9f9f8, 0xfff8f9f8, 0xfff9f8f8, 0xfff8f8f8, + 0xfff9f8f8, 0xfff9f9f9, 0xfff9f9f9, 0xfff9f8f8, 0xfff9f8f8, 0xfff9f9f8, 0xfff8f9f9, 0xfff9f8f9, + 0xfff8f8f9, 0xfff9f9f9, 0xfff9f9f8, 0xfff8f9f9, 0xfff8f9f9, 0xfff9f9f8, 0xfff9f8f9, 0xfff9f9f8, + 0xfff9f9f9, 0xfff9f8f9, 0xfff9f9f9, 0xfff8f8f9, 0xfff9f9f8, 0xfff8f9f9, 0xfff9f8f9, 0xfff9f9f9, + 0xfff9f9f8, 0xfff9f8f9, 0xfff8f8f8, 0xfff9f8f8, 0xfff8f8f9, 0xfff8f9f8, 0xfff8f8f8, 0xfff8f8f9, + 0xfff8f9f9, 0xfff9f9f9, 0xfff9f9f9, 0xfff8f9f8, 0xfff9f9f9, 0xfff9f8f8, 0xfff7f8f7, 0xffe6ebe6, + 0xffdedfde, 0x00000300, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xff797d79, 0xffb5bab5, 0xffb5bab5, + 0xffdedbde, 0xfff7f8f7, 0xfff7f7f8, 0xfff8f8f8, 0xfff7f7f7, 0xfff8f7f8, 0xfff7f7f8, 0xfff8f8f8, + 0xfff8f8f8, 0xfff7f8f8, 0xfff7f7f8, 0xfff8f7f8, 0xfff7f8f8, 0xfff8f8f8, 0xfff8f7f7, 0xfff8f8f7, + 0xfff7f8f8, 0xfff7f7f7, 0xfff7f7f8, 0xfff8f7f8, 0xfff8f8f7, 0xfff8f7f7, 0xfff7f8f7, 0xfff8f8f8, + 0xfff8f7f7, 0xfff8f7f8, 0xfff8f7f8, 0xfff8f8f7, 0xfff8f7f7, 0xfff8f8f8, 0xfff7f8f7, 0xfff8f8f7, + 0xfff8f8f7, 0xfff7f8f8, 0xfff7f7f7, 0xfff8f7f8, 0xfff8f7f7, 0xfff7f8f8, 0xfff8f8f8, 0xfff7f7f7, + 0xfff7f8f8, 0xfff7f7f8, 0xfff7f8f8, 0xfff7f8f8, 0xfff7f8f8, 0xfff7f7f8, 0xfff8f8f8, 0xfff7f8f8, + 0xfff7f8f8, 0xfff8f8f8, 0xfff7f8f7, 0xfff8f8f7, 0xfff7f7f7, 0xfff8f8f8, 0xfff7f7f8, 0xfff8f7f7, + 0xfff7f8f7, 0xfff8f8f7, 0xfff7f8f7, 0xfff8f8f8, 0xfff7f7f7, 0xfff8f7f7, 0xfff8f8f7, 0xfff7f8f8, + 0xfff7f8f7, 0xfff8f7f8, 0xfff7f8f8, 0xfff8f8f7, 0xfff7f8f7, 0xfff8f8f7, 0xfff7f7f8, 0xfff8f7f8, + 0xfff8f8f8, 0xfff8f7f8, 0xfff7f8f8, 0xfff7f7f7, 0xfff7f8f7, 0xfff8f8f8, 0xfff7f7f8, 0xfff8f7f8, + 0xfff7f8f8, 0xfff8f8f7, 0xfff8f7f8, 0xfff8f8f8, 0xfff7f8f7, 0xfff8f7f8, 0xfff8f8f7, 0xfff7f8f8, + 0xfff7f7f8, 0xfff8f8f7, 0xfff8f8f7, 0xfff8f7f7, 0xfff7f7f7, 0xfff7f7f8, 0xfff7f8f8, 0xfff8f8f7, + 0xfff7f8f8, 0xfff8f7f8, 0xfff7f8f8, 0xfff8f8f8, 0xfff7f7f7, 0xfff7f8f7, 0xfff8f7f7, 0xfff8f7f8, + 0xfff8f8f7, 0xfff8f7f8, 0xfff8f7f7, 0xfff7f8f8, 0xfff7f7f8, 0xfff7f7f8, 0xfff8f7f8, 0xfff8f7f7, + 0xfff7f7f8, 0xfff8f8f8, 0xfff7f7f8, 0xfff7f7f7, 0xfff8f8f7, 0xfff7f8f8, 0xfff8f7f8, 0xfff7f8f8, + 0xfff8f7f7, 0xfff8f7f8, 0xfff8f8f7, 0xfff7f8f8, 0xfff8f8f7, 0xfff8f8f7, 0xfff7f8f8, 0xfff8f8f7, + 0xfff8f8f8, 0xfff7f7f8, 0xfff7f7f8, 0xfff8f8f8, 0xfff7f7f7, 0xfff8f8f7, 0xfff7f7f8, 0xfff7f8f8, + 0xfff7f7f7, 0xfff7f7f7, 0xfff7f8f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff8f8f8, 0xfff7f7f8, 0xfff8f8f8, + 0xfff7f8f8, 0xfff8f8f8, 0xfff7f8f8, 0xfff7f8f7, 0xfff8f7f8, 0xfff7f8f8, 0xfff8f7f8, 0xfff7f8f7, + 0xfff7f8f7, 0xfff8f8f7, 0xfff8f7f7, 0xfff8f7f8, 0xfff8f7f8, 0xfff7f8f8, 0xfff8f7f7, 0xfff8f8f8, + 0xfff8f7f8, 0xfff8f8f7, 0xfff8f7f8, 0xfff8f7f7, 0xfff7f8f8, 0xfff8f8f7, 0xfff8f7f7, 0xfff8f8f7, + 0xfff7f8f7, 0xfff7f8f8, 0xfff7f8f8, 0xfff8f8f8, 0xfff8f8f7, 0xfff7f8f8, 0xfff7f8f8, 0xfff7f8f7, + 0xfff8f8f8, 0xfff8f8f7, 0xfff8f8f8, 0xfff7f7f7, 0xfff7f7f8, 0xfff8f7f8, 0xfff8f8f8, 0xfff8f7f8, + 0xfff8f8f8, 0xfff7f8f7, 0xfff7f8f7, 0xfff8f7f7, 0xfff8f7f7, 0xfff8f8f8, 0xfff7f7f8, 0xfff8f7f7, + 0xfff8f8f8, 0xfff8f8f7, 0xfff8f7f7, 0xfff7f7f8, 0xfff7f8f8, 0xfff8f7f7, 0xfff8f7f7, 0xfff8f8f7, + 0xfff8f7f7, 0xfff8f8f8, 0xfff8f8f8, 0xfff8f7f7, 0xfff8f8f8, 0xfff7f8f8, 0xfff7f8f8, 0xfff7f7f8, + 0xfff7f8f7, 0xfff7f8f7, 0xfff8f8f7, 0xfff8f8f8, 0xfff8f8f8, 0xfff7f7f8, 0xfff7f8f8, 0xfff8f7f7, + 0xfff7f7f8, 0xfff8f7f7, 0xfff8f8f8, 0xfff7f8f7, 0xfff7f8f7, 0xfff8f8f8, 0xffe9e8e9, 0xffdedbde, + 0xffc5c2c5, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xff797d79, 0xffb5bab5, 0xffb5bab5, + 0xffdedbde, 0xfff6f7f7, 0xfff7f6f7, 0xfff7f6f7, 0xfff6f7f6, 0xfff7f6f7, 0xfff6f6f7, 0xfff6f7f7, + 0xfff6f6f7, 0xfff7f6f7, 0xfff7f7f7, 0xfff6f7f6, 0xfff7f7f7, 0xfff6f7f7, 0xfff7f6f6, 0xfff7f7f6, + 0xfff6f6f6, 0xfff7f7f7, 0xfff6f6f6, 0xfff6f7f6, 0xfff7f7f6, 0xfff7f7f7, 0xfff6f6f7, 0xfff7f7f6, + 0xfff7f7f7, 0xfff7f7f6, 0xfff6f6f6, 0xfff6f7f6, 0xfff7f7f6, 0xfff7f7f6, 0xfff7f6f7, 0xfff7f6f7, + 0xfff6f7f6, 0xfff6f6f7, 0xfff7f7f7, 0xfff6f6f6, 0xfff6f7f7, 0xfff6f6f6, 0xfff6f7f6, 0xfff6f7f7, + 0xfff7f6f7, 0xfff6f6f6, 0xfff7f7f6, 0xfff6f7f6, 0xfff6f7f7, 0xfff7f7f7, 0xfff7f7f6, 0xfff7f7f7, + 0xfff6f6f6, 0xfff6f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f6f7, 0xfff7f6f7, 0xfff7f7f7, 0xfff6f7f7, + 0xfff6f7f6, 0xfff6f6f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f6f6, 0xfff7f7f6, 0xfff7f7f7, + 0xfff7f7f6, 0xfff6f6f7, 0xfff6f6f7, 0xfff7f7f6, 0xfff7f6f7, 0xfff7f6f6, 0xfff7f7f6, 0xfff6f7f7, + 0xfff7f6f7, 0xfff7f6f7, 0xfff7f6f7, 0xfff6f6f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f6, 0xfff6f6f6, + 0xfff6f7f6, 0xfff6f6f7, 0xfff7f6f7, 0xfff7f7f6, 0xfff6f6f7, 0xfff7f7f7, 0xfff7f6f6, 0xfff7f6f7, + 0xfff6f6f6, 0xfff6f7f7, 0xfff7f6f7, 0xfff7f7f6, 0xfff7f6f7, 0xfff7f6f6, 0xfff7f6f7, 0xfff7f7f6, + 0xfff6f7f7, 0xfff7f6f6, 0xfff7f6f6, 0xfff7f6f6, 0xfff7f6f6, 0xfff6f7f7, 0xfff6f6f7, 0xfff7f6f7, + 0xfff6f7f7, 0xfff6f7f7, 0xfff6f7f6, 0xfff7f6f7, 0xfff7f7f6, 0xfff7f7f6, 0xfff6f7f7, 0xfff7f6f7, + 0xfff7f7f7, 0xfff7f7f6, 0xfff6f6f6, 0xfff7f7f7, 0xfff6f6f7, 0xfff7f7f7, 0xfff6f6f7, 0xfff6f6f6, + 0xfff6f6f7, 0xfff6f6f7, 0xfff7f6f7, 0xfff7f6f6, 0xfff7f6f6, 0xfff7f6f7, 0xfff7f7f6, 0xfff6f6f7, + 0xfff7f7f7, 0xfff6f7f6, 0xfff6f7f6, 0xfff7f7f7, 0xfff7f6f7, 0xfff6f6f6, 0xfff7f7f7, 0xfff7f6f7, + 0xfff7f7f6, 0xfff6f6f7, 0xfff7f6f7, 0xfff6f6f7, 0xfff6f7f6, 0xfff6f7f6, 0xfff6f6f7, 0xfff7f6f7, + 0xfff7f6f6, 0xfff7f6f6, 0xfff6f7f6, 0xfff7f7f7, 0xfff6f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f6f6, + 0xfff6f7f6, 0xfff7f6f6, 0xfff6f7f7, 0xfff6f6f6, 0xfff7f6f7, 0xfff6f7f7, 0xfff7f6f7, 0xfff7f7f7, + 0xfff6f6f6, 0xfff6f6f6, 0xfff6f7f6, 0xfff7f7f6, 0xfff7f6f7, 0xfff6f7f7, 0xfff6f6f6, 0xfff6f6f7, + 0xfff6f6f7, 0xfff6f7f7, 0xfff6f7f7, 0xfff6f7f7, 0xfff6f6f6, 0xfff6f7f7, 0xfff7f6f7, 0xfff7f7f7, + 0xfff6f7f7, 0xfff7f6f7, 0xfff6f6f6, 0xfff7f6f7, 0xfff6f7f6, 0xfff7f6f6, 0xfff6f7f7, 0xfff6f7f7, + 0xfff6f7f7, 0xfff6f7f6, 0xfff6f7f7, 0xfff6f7f7, 0xfff7f7f7, 0xfff7f6f6, 0xfff7f6f6, 0xfff7f6f7, + 0xfff7f7f6, 0xfff7f7f6, 0xfff7f6f7, 0xfff6f6f7, 0xfff7f6f7, 0xfff7f6f6, 0xfff7f7f7, 0xfff7f6f7, + 0xfff6f6f7, 0xfff7f7f6, 0xfff6f7f6, 0xfff6f7f6, 0xfff7f7f7, 0xfff7f6f7, 0xfff6f7f6, 0xfff7f6f6, + 0xfff6f6f7, 0xfff6f7f7, 0xfff7f6f7, 0xfff7f6f6, 0xfff6f6f7, 0xfff7f7f6, 0xfff6f6f7, 0xfff7f6f6, + 0xfff6f6f7, 0xfff6f6f7, 0xfff7f7f6, 0xfff6f7f7, 0xfff7f6f6, 0xfff7f7f7, 0xffe9e8e9, 0xffdedbde, + 0xffc5c2c5, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xff797d79, 0xffb5bab5, 0xffb5bab5, + 0xffdedbde, 0xfff6f6f6, 0xfff6f6f5, 0xfff6f5f6, 0xfff5f5f6, 0xfff6f5f6, 0xfff6f6f6, 0xfff5f6f5, + 0xfff6f6f5, 0xfff5f6f6, 0xfff6f6f5, 0xfff6f5f6, 0xfff6f5f5, 0xfff6f5f6, 0xfff5f6f6, 0xfff6f5f6, + 0xfff6f5f6, 0xfff5f5f6, 0xfff6f6f6, 0xfff6f5f6, 0xfff5f6f6, 0xfff6f5f5, 0xfff6f6f6, 0xfff6f5f6, + 0xfff6f5f6, 0xfff5f5f6, 0xfff6f6f5, 0xfff5f6f5, 0xfff6f6f6, 0xfff6f5f6, 0xfff6f6f6, 0xfff6f6f5, + 0xfff6f5f5, 0xfff5f5f6, 0xfff5f6f5, 0xfff5f6f5, 0xfff6f6f5, 0xfff5f5f6, 0xfff6f5f6, 0xfff6f6f6, + 0xfff5f6f6, 0xfff6f5f6, 0xfff5f5f6, 0xfff5f6f6, 0xfff5f6f5, 0xfff5f6f5, 0xfff6f6f6, 0xfff6f6f6, + 0xfff5f5f5, 0xfff5f6f6, 0xfff6f6f5, 0xfff5f5f6, 0xfff5f6f5, 0xfff6f6f6, 0xfff6f6f6, 0xfff5f6f6, + 0xfff5f5f6, 0xfff5f6f6, 0xfff5f5f6, 0xfff5f5f5, 0xfff6f5f5, 0xfff6f6f6, 0xfff5f5f5, 0xfff5f6f6, + 0xfff6f5f6, 0xfff6f6f5, 0xfff5f6f5, 0xfff5f6f5, 0xfff6f6f6, 0xfff5f6f6, 0xfff6f5f6, 0xfff5f5f5, + 0xfff6f5f6, 0xfff6f6f6, 0xfff6f6f6, 0xfff5f5f6, 0xfff6f5f6, 0xfff5f6f5, 0xfff6f5f6, 0xfff6f6f5, + 0xfff6f6f6, 0xfff6f5f6, 0xfff6f6f5, 0xfff5f6f6, 0xfff5f6f6, 0xfff5f6f5, 0xfff5f5f5, 0xfff6f6f5, + 0xfff6f6f6, 0xfff6f6f6, 0xfff5f6f5, 0xfff5f6f5, 0xfff5f5f6, 0xfff6f6f5, 0xfff6f5f5, 0xfff6f6f6, + 0xfff5f5f6, 0xfff6f5f6, 0xfff6f5f6, 0xfff6f5f6, 0xfff5f5f6, 0xfff6f6f5, 0xfff6f5f5, 0xfff6f6f5, + 0xfff6f6f6, 0xfff6f5f6, 0xfff5f6f6, 0xfff5f6f5, 0xfff6f6f6, 0xfff6f6f6, 0xfff6f5f6, 0xfff5f5f5, + 0xfff5f6f5, 0xfff5f5f6, 0xfff5f6f5, 0xfff6f6f6, 0xfff5f6f5, 0xfff6f5f5, 0xfff6f6f5, 0xfff6f6f5, + 0xfff5f6f6, 0xfff6f5f5, 0xfff6f6f6, 0xfff6f5f5, 0xfff5f5f6, 0xfff6f6f5, 0xfff5f6f6, 0xfff6f6f6, + 0xfff5f6f5, 0xfff5f5f5, 0xfff5f6f6, 0xfff6f6f6, 0xfff5f6f6, 0xfff6f6f5, 0xfff5f6f6, 0xfff5f6f5, + 0xfff6f5f6, 0xfff6f5f5, 0xfff5f6f6, 0xfff6f6f5, 0xfff5f6f5, 0xfff6f5f5, 0xfff5f5f5, 0xfff6f6f6, + 0xfff5f6f6, 0xfff5f6f5, 0xfff6f6f6, 0xfff5f6f6, 0xfff5f6f6, 0xfff6f5f6, 0xfff5f6f6, 0xfff6f6f6, + 0xfff6f5f5, 0xfff6f6f6, 0xfff6f6f6, 0xfff5f6f5, 0xfff6f6f6, 0xfff6f5f5, 0xfff6f6f5, 0xfff6f5f6, + 0xfff6f6f5, 0xfff5f6f5, 0xfff6f5f6, 0xfff5f6f5, 0xfff6f5f6, 0xfff5f6f5, 0xfff6f6f6, 0xfff6f6f5, + 0xfff6f5f6, 0xfff6f6f6, 0xfff5f6f6, 0xfff5f6f6, 0xfff6f6f5, 0xfff5f5f6, 0xfff5f6f5, 0xfff6f6f6, + 0xfff6f6f6, 0xfff6f6f5, 0xfff6f6f6, 0xfff6f5f6, 0xfff5f6f6, 0xfff5f5f6, 0xfff6f5f5, 0xfff5f6f6, + 0xfff5f6f6, 0xfff6f5f6, 0xfff5f5f5, 0xfff5f5f6, 0xfff5f6f6, 0xfff6f6f5, 0xfff6f6f6, 0xfff5f6f5, + 0xfff5f6f5, 0xfff6f5f6, 0xfff6f5f6, 0xfff6f6f6, 0xfff6f5f6, 0xfff6f6f5, 0xfff6f6f6, 0xfff6f5f6, + 0xfff6f6f5, 0xfff5f5f5, 0xfff5f6f5, 0xfff6f6f6, 0xfff6f5f6, 0xfff6f5f6, 0xfff6f6f5, 0xfff6f6f5, + 0xfff6f6f6, 0xfff5f6f5, 0xfff6f6f5, 0xfff6f6f5, 0xfff6f5f6, 0xfff6f6f6, 0xfff6f6f5, 0xfff5f6f6, + 0xfff6f6f6, 0xfff6f6f5, 0xfff6f5f5, 0xfff6f5f5, 0xfff6f6f6, 0xfff6f6f6, 0xffe9e8e9, 0xffdedbde, + 0xffc5c2c5, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xff797d79, 0xffb5bab5, 0xffb5bab5, + 0xffdedbde, 0xfff4f4f4, 0xfff5f5f5, 0xfff5f5f4, 0xfff5f4f5, 0xfff5f4f4, 0xfff5f4f4, 0xfff5f4f5, + 0xfff4f5f4, 0xfff4f4f5, 0xfff5f4f4, 0xfff5f4f4, 0xfff4f5f5, 0xfff5f5f4, 0xfff4f5f4, 0xfff4f4f5, + 0xfff5f4f5, 0xfff4f5f5, 0xfff5f4f4, 0xfff5f5f5, 0xfff4f5f5, 0xfff4f5f5, 0xfff4f4f5, 0xfff4f5f4, + 0xfff4f5f4, 0xfff5f5f4, 0xfff5f5f4, 0xfff4f5f4, 0xfff5f4f5, 0xfff5f5f5, 0xfff4f5f5, 0xfff4f5f5, + 0xfff5f5f4, 0xfff4f4f4, 0xfff4f5f4, 0xfff5f5f5, 0xfff5f5f5, 0xfff5f5f5, 0xfff4f5f4, 0xfff5f5f5, + 0xfff4f4f5, 0xfff5f5f5, 0xfff5f5f5, 0xfff4f4f5, 0xfff4f5f4, 0xfff5f5f4, 0xfff5f5f5, 0xfff5f4f4, + 0xfff5f4f5, 0xfff5f4f5, 0xfff4f5f4, 0xfff5f4f5, 0xfff5f5f4, 0xfff5f5f5, 0xfff4f4f5, 0xfff4f5f4, + 0xfff4f4f4, 0xfff4f5f4, 0xfff5f5f4, 0xfff5f5f4, 0xfff4f4f5, 0xfff4f5f5, 0xfff4f5f5, 0xfff4f5f4, + 0xfff5f5f5, 0xfff4f5f5, 0xfff4f5f5, 0xfff5f4f5, 0xfff4f4f5, 0xfff5f4f5, 0xfff4f5f5, 0xfff4f5f4, + 0xfff5f5f5, 0xfff5f5f5, 0xfff5f5f5, 0xfff4f5f5, 0xfff4f4f5, 0xfff4f4f4, 0xfff5f5f5, 0xfff5f5f5, + 0xfff4f5f5, 0xfff5f4f5, 0xfff4f5f5, 0xfff4f5f5, 0xfff5f4f5, 0xfff5f5f5, 0xfff5f4f5, 0xfff4f5f5, + 0xfff5f5f4, 0xfff4f4f4, 0xfff4f5f5, 0xfff4f4f4, 0xfff4f5f5, 0xfff5f5f4, 0xfff5f5f4, 0xfff4f5f5, + 0xfff4f4f4, 0xfff4f5f4, 0xfff4f5f5, 0xfff5f5f4, 0xfff4f5f5, 0xfff4f4f5, 0xfff5f5f4, 0xfff4f4f5, + 0xfff5f5f4, 0xfff4f4f5, 0xfff4f5f5, 0xfff4f5f4, 0xfff5f4f5, 0xfff5f5f5, 0xfff4f4f5, 0xfff5f4f5, + 0xfff5f5f5, 0xfff4f5f4, 0xfff5f5f5, 0xfff5f5f5, 0xfff4f5f5, 0xfff4f5f4, 0xfff4f4f5, 0xfff4f4f5, + 0xfff4f4f5, 0xfff5f4f5, 0xfff4f4f4, 0xfff5f5f5, 0xfff4f4f5, 0xfff5f5f5, 0xfff4f4f5, 0xfff5f4f4, + 0xfff4f4f4, 0xfff5f4f4, 0xfff5f5f5, 0xfff5f5f4, 0xfff5f5f5, 0xfff4f5f4, 0xfff5f5f5, 0xfff4f5f5, + 0xfff4f5f4, 0xfff5f4f4, 0xfff4f4f4, 0xfff5f5f4, 0xfff4f4f5, 0xfff5f4f5, 0xfff5f4f5, 0xfff5f4f5, + 0xfff5f5f5, 0xfff5f4f4, 0xfff4f5f4, 0xfff4f4f5, 0xfff5f5f5, 0xfff5f4f4, 0xfff5f5f5, 0xfff5f4f5, + 0xfff4f5f5, 0xfff4f5f5, 0xfff5f4f4, 0xfff5f5f5, 0xfff5f5f4, 0xfff5f4f4, 0xfff4f5f4, 0xfff5f4f4, + 0xfff5f5f4, 0xfff4f4f5, 0xfff5f4f4, 0xfff5f4f5, 0xfff4f5f5, 0xfff4f5f5, 0xfff5f5f5, 0xfff4f5f5, + 0xfff4f5f4, 0xfff4f5f5, 0xfff5f5f5, 0xfff4f4f5, 0xfff4f5f5, 0xfff4f5f5, 0xfff4f4f5, 0xfff4f5f5, + 0xfff5f4f4, 0xfff5f5f5, 0xfff4f5f4, 0xfff5f5f4, 0xfff5f4f4, 0xfff4f5f5, 0xfff4f5f5, 0xfff5f5f5, + 0xfff4f4f4, 0xfff5f5f5, 0xfff5f5f5, 0xfff4f5f5, 0xfff5f5f5, 0xfff4f4f5, 0xfff5f5f5, 0xfff4f5f5, + 0xfff4f5f4, 0xfff5f5f4, 0xfff5f5f5, 0xfff5f4f5, 0xfff5f4f4, 0xfff4f4f4, 0xfff5f5f4, 0xfff5f5f4, + 0xfff5f4f5, 0xfff5f5f4, 0xfff4f5f4, 0xfff4f5f4, 0xfff5f5f5, 0xfff4f4f5, 0xfff5f4f5, 0xfff4f5f5, + 0xfff5f5f4, 0xfff5f4f5, 0xfff5f5f5, 0xfff4f5f5, 0xfff4f4f5, 0xfff5f4f5, 0xfff4f4f5, 0xfff5f5f4, + 0xfff5f5f5, 0xfff4f5f5, 0xfff4f4f5, 0xfff5f5f5, 0xfff4f5f4, 0xfff4f5f5, 0xffe9e8e9, 0xffdedbde, + 0xffc5c2c5, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff797c79, 0xffb5bab5, 0xffb5bab5, + 0xffdedbde, 0xfff3f4f4, 0xfff4f3f3, 0xfff3f4f4, 0xfff4f4f4, 0xfff3f4f4, 0xfff3f3f4, 0xfff4f3f3, + 0xfff3f3f4, 0xfff3f3f3, 0xfff4f4f4, 0xfff4f4f3, 0xfff3f4f4, 0xfff4f3f4, 0xfff3f4f4, 0xfff3f3f4, + 0xfff3f3f3, 0xfff3f4f3, 0xfff4f4f3, 0xfff4f4f3, 0xfff4f4f4, 0xfff4f4f3, 0xfff4f4f4, 0xfff3f3f4, + 0xfff4f4f4, 0xfff3f3f3, 0xfff3f4f3, 0xfff3f4f3, 0xfff4f4f3, 0xfff3f4f4, 0xfff4f4f4, 0xfff4f4f3, + 0xfff4f4f3, 0xfff3f3f3, 0xfff3f3f4, 0xfff4f3f3, 0xfff4f4f4, 0xfff4f3f4, 0xfff3f3f3, 0xfff4f4f3, + 0xfff4f3f4, 0xfff3f4f3, 0xfff3f4f3, 0xfff4f3f4, 0xfff3f4f3, 0xfff4f4f4, 0xfff4f4f4, 0xfff4f3f4, + 0xfff4f4f4, 0xfff4f4f3, 0xfff4f3f3, 0xfff3f4f3, 0xfff3f4f3, 0xfff4f3f4, 0xfff3f4f4, 0xfff3f4f3, + 0xfff4f3f3, 0xfff4f3f4, 0xfff3f3f4, 0xfff4f4f4, 0xfff3f3f3, 0xfff4f3f3, 0xfff3f3f4, 0xfff3f3f3, + 0xfff4f3f3, 0xfff3f3f4, 0xfff4f3f3, 0xfff3f3f4, 0xfff3f4f4, 0xfff4f3f3, 0xfff3f3f3, 0xfff4f3f4, + 0xfff4f4f4, 0xfff3f4f4, 0xfff4f3f3, 0xfff3f3f4, 0xfff3f3f3, 0xfff4f4f3, 0xfff4f4f4, 0xfff4f3f3, + 0xfff3f4f4, 0xfff3f3f4, 0xfff3f3f4, 0xfff3f4f3, 0xfff3f4f3, 0xfff3f4f4, 0xfff4f3f4, 0xfff4f3f3, + 0xfff4f4f4, 0xfff4f4f4, 0xfff4f4f4, 0xfff3f4f4, 0xfff4f4f4, 0xfff3f4f3, 0xfff4f4f4, 0xfff4f3f4, + 0xfff3f3f3, 0xfff4f3f3, 0xfff4f3f3, 0xfff3f3f3, 0xfff3f4f3, 0xfff4f4f3, 0xfff3f3f3, 0xfff3f3f3, + 0xfff4f4f3, 0xfff3f3f3, 0xfff4f3f3, 0xfff4f4f4, 0xfff4f4f4, 0xfff3f3f4, 0xfff3f4f3, 0xfff4f3f4, + 0xfff4f3f4, 0xfff4f4f4, 0xfff3f3f3, 0xfff4f4f3, 0xfff4f3f3, 0xfff3f3f3, 0xfff4f4f4, 0xfff3f4f4, + 0xfff3f3f4, 0xfff3f3f4, 0xfff4f4f4, 0xfff3f4f4, 0xfff3f3f3, 0xfff4f3f4, 0xfff3f4f4, 0xfff4f4f4, + 0xfff4f4f4, 0xfff3f4f3, 0xfff3f4f4, 0xfff3f4f4, 0xfff3f4f3, 0xfff4f4f4, 0xfff4f4f3, 0xfff3f3f4, + 0xfff4f3f4, 0xfff3f3f3, 0xfff3f3f4, 0xfff4f4f4, 0xfff4f3f4, 0xfff3f3f3, 0xfff3f4f4, 0xfff3f3f3, + 0xfff4f3f4, 0xfff3f4f4, 0xfff4f3f4, 0xfff4f3f4, 0xfff4f4f4, 0xfff3f3f4, 0xfff4f3f3, 0xfff4f4f4, + 0xfff4f3f3, 0xfff3f4f4, 0xfff4f4f4, 0xfff3f4f3, 0xfff4f3f4, 0xfff4f4f4, 0xfff4f3f3, 0xfff3f3f4, + 0xfff4f3f3, 0xfff4f4f3, 0xfff3f4f3, 0xfff3f4f3, 0xfff4f4f3, 0xfff3f4f3, 0xfff4f4f4, 0xfff4f4f3, + 0xfff4f4f4, 0xfff4f4f3, 0xfff4f3f3, 0xfff4f3f4, 0xfff3f3f4, 0xfff3f4f3, 0xfff3f3f3, 0xfff4f4f4, + 0xfff3f3f4, 0xfff4f4f4, 0xfff4f3f3, 0xfff4f4f4, 0xfff4f4f3, 0xfff3f3f3, 0xfff4f4f4, 0xfff3f3f4, + 0xfff4f3f3, 0xfff4f3f3, 0xfff3f4f4, 0xfff3f4f3, 0xfff3f4f3, 0xfff4f4f4, 0xfff3f3f4, 0xfff4f4f3, + 0xfff3f3f4, 0xfff4f3f4, 0xfff3f4f4, 0xfff3f3f3, 0xfff3f3f4, 0xfff3f3f3, 0xfff4f4f4, 0xfff4f4f4, + 0xfff3f3f4, 0xfff3f4f3, 0xfff4f4f3, 0xfff3f4f3, 0xfff3f3f4, 0xfff4f4f4, 0xfff4f4f3, 0xfff3f4f4, + 0xfff3f3f3, 0xfff4f3f4, 0xfff4f3f3, 0xfff3f3f4, 0xfff4f4f3, 0xfff3f4f3, 0xfff3f3f4, 0xfff3f4f3, + 0xfff4f3f4, 0xfff4f3f4, 0xfff4f4f3, 0xfff4f3f3, 0xfff3f4f4, 0xfff3f4f3, 0xffe9e8e9, 0xffdedbde, + 0xffc5c2c5, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff797c79, 0xffb5bab5, 0xffb5bab5, + 0xffdedbde, 0xfff3f3f3, 0xfff2f3f2, 0xfff3f2f3, 0xfff2f3f2, 0xfff2f3f3, 0xfff3f2f2, 0xfff2f3f2, + 0xfff2f3f3, 0xfff3f3f2, 0xfff3f3f2, 0xfff3f2f3, 0xfff2f3f3, 0xfff3f2f3, 0xfff2f2f2, 0xfff2f3f3, + 0xfff2f3f3, 0xfff2f2f2, 0xfff2f3f2, 0xfff2f3f2, 0xfff2f2f3, 0xfff2f3f3, 0xfff2f3f2, 0xfff2f2f3, + 0xfff3f2f3, 0xfff3f2f3, 0xfff3f3f3, 0xfff2f2f2, 0xfff3f3f2, 0xfff3f2f3, 0xfff3f2f3, 0xfff2f2f3, + 0xfff2f3f3, 0xfff3f3f3, 0xfff3f2f3, 0xfff3f3f3, 0xfff2f3f2, 0xfff3f3f3, 0xfff3f2f3, 0xfff3f2f2, + 0xfff2f3f3, 0xfff2f2f3, 0xfff3f3f3, 0xfff2f2f3, 0xfff2f3f2, 0xfff2f2f3, 0xfff2f2f2, 0xfff3f2f3, + 0xfff2f2f3, 0xfff3f2f2, 0xfff2f3f2, 0xfff2f2f2, 0xfff2f3f3, 0xfff2f3f2, 0xfff2f2f3, 0xfff3f2f3, + 0xfff3f2f3, 0xfff2f3f2, 0xfff3f2f2, 0xfff3f2f3, 0xfff2f2f2, 0xfff3f2f2, 0xfff3f3f3, 0xfff3f3f2, + 0xfff2f3f3, 0xfff2f3f2, 0xfff3f3f2, 0xfff3f3f2, 0xfff2f2f2, 0xfff2f3f2, 0xfff2f3f3, 0xfff2f3f3, + 0xfff3f2f2, 0xfff3f2f2, 0xfff3f2f3, 0xfff3f3f3, 0xfff3f2f3, 0xfff2f3f2, 0xfff2f2f3, 0xfff2f2f2, + 0xfff3f3f2, 0xfff2f3f3, 0xfff2f3f3, 0xfff2f3f3, 0xfff3f2f3, 0xfff2f2f3, 0xfff2f2f3, 0xfff2f3f2, + 0xfff2f3f3, 0xfff2f3f2, 0xfff2f3f3, 0xfff3f2f2, 0xfff3f3f3, 0xfff2f2f2, 0xfff2f2f3, 0xfff2f2f3, + 0xfff3f2f2, 0xfff3f3f2, 0xfff3f3f3, 0xfff3f3f3, 0xfff3f3f2, 0xfff2f2f2, 0xfff3f3f3, 0xfff3f2f2, + 0xfff3f2f2, 0xfff2f3f3, 0xfff3f2f3, 0xfff2f3f2, 0xfff2f2f2, 0xfff2f2f2, 0xfff3f3f3, 0xfff3f2f3, + 0xfff3f2f3, 0xfff2f2f3, 0xfff3f2f2, 0xfff3f3f3, 0xfff2f3f3, 0xfff3f2f2, 0xfff3f2f3, 0xfff3f3f3, + 0xfff2f3f3, 0xfff2f2f3, 0xfff2f2f3, 0xfff2f2f2, 0xfff3f3f2, 0xfff3f2f2, 0xfff3f2f2, 0xfff2f2f3, + 0xfff2f3f2, 0xfff2f3f2, 0xfff3f2f3, 0xfff2f2f2, 0xfff3f2f3, 0xfff2f2f3, 0xfff2f3f2, 0xfff3f3f2, + 0xfff2f3f3, 0xfff3f2f3, 0xfff2f2f3, 0xfff3f3f3, 0xfff3f2f2, 0xfff2f2f3, 0xfff3f3f2, 0xfff3f2f2, + 0xfff3f2f3, 0xfff2f2f3, 0xfff3f3f2, 0xfff3f3f2, 0xfff3f2f3, 0xfff2f3f2, 0xfff2f2f2, 0xfff3f2f2, + 0xfff2f3f3, 0xfff3f2f2, 0xfff2f2f3, 0xfff3f3f2, 0xfff3f2f2, 0xfff3f2f2, 0xfff3f3f3, 0xfff2f3f2, + 0xfff2f3f3, 0xfff2f3f3, 0xfff2f3f2, 0xfff3f2f3, 0xfff2f2f2, 0xfff2f3f2, 0xfff2f2f3, 0xfff3f3f3, + 0xfff3f2f3, 0xfff2f3f2, 0xfff3f2f2, 0xfff3f2f2, 0xfff3f2f2, 0xfff3f3f3, 0xfff3f3f3, 0xfff3f3f2, + 0xfff3f3f3, 0xfff3f2f2, 0xfff2f3f2, 0xfff3f2f3, 0xfff3f2f2, 0xfff2f2f3, 0xfff3f2f2, 0xfff3f2f3, + 0xfff2f2f3, 0xfff2f3f3, 0xfff2f2f2, 0xfff2f3f3, 0xfff2f2f3, 0xfff3f3f3, 0xfff2f3f2, 0xfff3f2f2, + 0xfff2f2f2, 0xfff3f2f3, 0xfff3f2f2, 0xfff2f2f3, 0xfff2f2f3, 0xfff3f2f3, 0xfff2f2f3, 0xfff2f3f2, + 0xfff3f3f3, 0xfff3f3f3, 0xfff3f2f2, 0xfff2f2f2, 0xfff2f3f3, 0xfff3f2f3, 0xfff2f3f2, 0xfff3f3f2, + 0xfff2f2f2, 0xfff3f3f2, 0xfff2f2f2, 0xfff2f3f3, 0xfff2f2f3, 0xfff3f2f3, 0xfff3f2f3, 0xfff3f2f3, + 0xfff3f3f2, 0xfff3f3f2, 0xfff3f3f2, 0xfff3f2f3, 0xfff3f2f3, 0xfff2f3f3, 0xffe9e8e9, 0xffdedbde, + 0xffc5c2c5, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff797c79, 0xffb5bab5, 0xffb5bab5, + 0xffdedbde, 0xfff2f1f2, 0xfff1f1f1, 0xfff2f2f1, 0xfff1f2f2, 0xfff2f2f2, 0xfff1f2f1, 0xfff1f1f2, + 0xfff2f2f2, 0xfff1f2f1, 0xfff1f2f2, 0xfff1f2f2, 0xfff1f2f2, 0xfff2f1f1, 0xfff2f1f2, 0xfff1f2f1, + 0xfff2f2f1, 0xfff1f1f1, 0xfff2f2f1, 0xfff1f1f1, 0xfff2f1f1, 0xfff2f1f1, 0xfff1f1f1, 0xfff2f1f2, + 0xfff1f2f2, 0xfff2f1f1, 0xfff1f2f2, 0xfff1f1f2, 0xfff1f1f1, 0xfff1f1f2, 0xfff1f2f1, 0xfff2f1f1, + 0xfff2f2f1, 0xfff1f1f1, 0xfff1f2f2, 0xfff1f2f2, 0xfff1f1f2, 0xfff1f2f2, 0xfff1f2f1, 0xfff1f1f1, + 0xfff1f2f2, 0xfff2f1f1, 0xfff2f2f2, 0xfff1f2f2, 0xfff2f2f1, 0xfff2f1f2, 0xfff2f1f2, 0xfff1f2f1, + 0xfff1f2f2, 0xfff1f1f2, 0xfff2f2f2, 0xfff1f1f2, 0xfff2f2f1, 0xfff1f2f1, 0xfff2f2f1, 0xfff1f2f2, + 0xfff1f2f1, 0xfff2f2f2, 0xfff1f1f1, 0xfff1f1f2, 0xfff1f1f2, 0xfff2f1f2, 0xfff1f1f2, 0xfff2f1f1, + 0xfff1f2f1, 0xfff2f1f1, 0xfff1f2f1, 0xfff1f2f2, 0xfff2f1f2, 0xfff1f1f1, 0xfff2f1f1, 0xfff2f1f2, + 0xfff1f2f1, 0xfff2f2f1, 0xfff2f1f1, 0xfff1f2f2, 0xfff1f1f1, 0xfff1f1f1, 0xfff2f1f2, 0xfff2f1f2, + 0xfff1f2f2, 0xfff1f1f2, 0xfff2f2f2, 0xfff2f1f1, 0xfff2f2f1, 0xfff2f2f1, 0xfff2f1f1, 0xfff1f2f1, + 0xfff2f1f1, 0xfff1f2f1, 0xfff2f1f1, 0xfff2f2f1, 0xfff1f1f2, 0xfff2f1f1, 0xfff2f1f2, 0xfff1f1f1, + 0xfff1f2f1, 0xfff2f1f1, 0xfff1f2f2, 0xfff2f2f2, 0xfff1f1f1, 0xfff1f1f1, 0xfff1f2f1, 0xfff1f1f1, + 0xfff1f1f2, 0xfff1f2f2, 0xfff1f2f1, 0xfff2f1f1, 0xfff1f1f1, 0xfff1f2f1, 0xfff1f1f2, 0xfff1f1f2, + 0xfff2f1f1, 0xfff1f1f1, 0xfff1f2f2, 0xfff1f1f2, 0xfff2f1f1, 0xfff2f2f1, 0xfff2f2f2, 0xfff2f1f1, + 0xfff1f1f1, 0xfff1f1f2, 0xfff1f1f1, 0xfff2f1f2, 0xfff1f1f1, 0xfff1f1f2, 0xfff1f2f1, 0xfff2f1f1, + 0xfff1f2f2, 0xfff1f1f2, 0xfff2f1f2, 0xfff1f1f2, 0xfff2f1f1, 0xfff2f1f1, 0xfff2f2f1, 0xfff1f1f1, + 0xfff2f2f1, 0xfff1f1f1, 0xfff1f2f2, 0xfff2f1f2, 0xfff2f1f1, 0xfff1f1f1, 0xfff1f2f1, 0xfff1f2f1, + 0xfff2f2f1, 0xfff1f1f1, 0xfff2f1f1, 0xfff1f2f2, 0xfff1f1f1, 0xfff1f2f2, 0xfff2f2f2, 0xfff2f1f2, + 0xfff2f1f1, 0xfff2f2f1, 0xfff1f1f2, 0xfff1f2f2, 0xfff2f2f1, 0xfff2f1f2, 0xfff2f1f1, 0xfff1f2f1, + 0xfff1f2f2, 0xfff2f2f1, 0xfff2f2f1, 0xfff2f1f2, 0xfff1f1f2, 0xfff2f2f2, 0xfff1f2f2, 0xfff2f1f2, + 0xfff1f2f1, 0xfff1f2f2, 0xfff1f2f2, 0xfff1f2f1, 0xfff1f2f1, 0xfff1f2f2, 0xfff1f1f1, 0xfff2f2f2, + 0xfff1f1f2, 0xfff2f1f2, 0xfff1f1f1, 0xfff1f2f1, 0xfff1f1f1, 0xfff1f2f1, 0xfff1f2f2, 0xfff2f1f1, + 0xfff2f1f1, 0xfff1f2f2, 0xfff1f2f2, 0xfff2f1f1, 0xfff2f1f2, 0xfff1f2f2, 0xfff2f1f1, 0xfff1f1f1, + 0xfff2f1f1, 0xfff2f1f2, 0xfff2f1f1, 0xfff1f1f2, 0xfff2f2f1, 0xfff1f1f1, 0xfff1f1f2, 0xfff2f1f1, + 0xfff2f1f2, 0xfff2f2f2, 0xfff1f2f2, 0xfff2f2f2, 0xfff1f2f1, 0xfff1f1f2, 0xfff2f2f2, 0xfff1f1f1, + 0xfff1f2f2, 0xfff2f1f1, 0xfff2f1f1, 0xfff2f1f2, 0xfff1f1f2, 0xfff2f1f2, 0xfff1f1f2, 0xfff1f1f1, + 0xfff2f1f2, 0xfff1f2f2, 0xfff1f1f2, 0xfff2f1f1, 0xfff2f1f1, 0xfff2f1f2, 0xffe9e8e9, 0xffdedbde, + 0xffc5c2c5, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff797c79, 0xffb5bab5, 0xffb5bab5, + 0xffdedbde, 0xfff1f0f0, 0xfff1f1f1, 0xfff1f0f0, 0xfff0f1f0, 0xfff0f0f1, 0xfff1f0f1, 0xfff0f0f1, + 0xfff0f1f1, 0xfff0f1f0, 0xfff1f1f1, 0xfff0f1f1, 0xfff1f1f1, 0xfff1f0f0, 0xfff1f0f0, 0xfff0f1f1, + 0xfff0f0f0, 0xfff0f1f0, 0xfff0f1f0, 0xfff1f1f0, 0xfff0f0f0, 0xfff1f0f0, 0xfff0f1f1, 0xfff1f1f0, + 0xfff0f1f0, 0xfff1f0f1, 0xfff0f1f1, 0xfff1f0f0, 0xfff1f1f1, 0xfff1f0f0, 0xfff1f0f0, 0xfff1f0f1, + 0xfff0f1f1, 0xfff1f1f1, 0xfff1f1f0, 0xfff1f0f1, 0xfff0f0f0, 0xfff1f1f1, 0xfff0f0f1, 0xfff0f1f0, + 0xfff1f1f0, 0xfff0f0f0, 0xfff0f1f1, 0xfff0f1f1, 0xfff1f1f0, 0xfff0f1f1, 0xfff1f1f1, 0xfff1f0f0, + 0xfff1f0f1, 0xfff1f0f1, 0xfff0f0f1, 0xfff1f1f0, 0xfff0f0f0, 0xfff0f1f0, 0xfff1f1f0, 0xfff0f0f1, + 0xfff1f0f0, 0xfff1f1f1, 0xfff1f1f1, 0xfff0f0f0, 0xfff0f0f0, 0xfff1f1f1, 0xfff1f0f0, 0xfff0f1f1, + 0xfff1f1f0, 0xfff1f0f0, 0xfff1f0f0, 0xfff1f0f1, 0xfff0f0f1, 0xfff0f0f1, 0xfff1f0f1, 0xfff1f0f1, + 0xfff1f1f1, 0xfff0f1f1, 0xfff0f0f1, 0xfff1f0f1, 0xfff0f1f1, 0xfff0f0f0, 0xfff1f1f1, 0xfff1f1f0, + 0xfff1f1f1, 0xfff1f0f0, 0xfff0f0f0, 0xfff1f0f1, 0xfff0f0f1, 0xfff0f0f0, 0xfff1f0f1, 0xfff1f1f0, + 0xfff1f0f0, 0xfff1f0f0, 0xfff0f0f0, 0xfff1f1f0, 0xfff0f0f1, 0xfff0f0f1, 0xfff1f0f0, 0xfff1f1f1, + 0xfff1f0f1, 0xfff0f0f1, 0xfff0f0f1, 0xfff0f0f0, 0xfff1f0f0, 0xfff0f0f0, 0xfff0f0f1, 0xfff1f1f1, + 0xfff0f0f0, 0xfff0f1f0, 0xfff0f0f0, 0xfff1f0f1, 0xfff0f0f0, 0xfff0f0f0, 0xfff0f1f0, 0xfff0f1f0, + 0xfff1f1f0, 0xfff1f1f1, 0xfff0f1f1, 0xfff1f0f0, 0xfff0f0f0, 0xfff1f0f0, 0xfff0f0f0, 0xfff0f0f1, + 0xfff0f0f1, 0xfff1f1f1, 0xfff0f0f0, 0xfff0f0f0, 0xfff0f1f0, 0xfff0f1f1, 0xfff1f0f0, 0xfff1f1f1, + 0xfff0f0f0, 0xfff0f1f0, 0xfff0f1f0, 0xfff1f0f0, 0xfff1f0f0, 0xfff0f1f1, 0xfff0f0f1, 0xfff1f0f0, + 0xfff0f0f1, 0xfff0f0f1, 0xfff0f0f1, 0xfff1f1f0, 0xfff1f0f0, 0xfff1f0f0, 0xfff0f1f0, 0xfff0f0f0, + 0xfff0f1f1, 0xfff0f0f0, 0xfff0f1f1, 0xfff0f0f1, 0xfff0f1f1, 0xfff1f1f0, 0xfff1f0f0, 0xfff1f1f0, + 0xfff0f0f0, 0xfff0f0f0, 0xfff0f0f0, 0xfff0f0f1, 0xfff1f0f0, 0xfff0f0f0, 0xfff0f0f0, 0xfff0f1f0, + 0xfff0f1f0, 0xfff0f0f1, 0xfff1f0f1, 0xfff0f1f1, 0xfff1f1f0, 0xfff1f1f1, 0xfff1f0f0, 0xfff0f0f0, + 0xfff0f0f1, 0xfff0f0f0, 0xfff0f0f0, 0xfff0f1f0, 0xfff1f0f1, 0xfff0f1f0, 0xfff0f1f1, 0xfff0f0f0, + 0xfff0f0f0, 0xfff0f0f0, 0xfff1f0f0, 0xfff0f1f1, 0xfff1f1f0, 0xfff0f0f0, 0xfff0f0f0, 0xfff0f0f1, + 0xfff0f0f1, 0xfff1f0f0, 0xfff0f1f1, 0xfff0f1f1, 0xfff1f1f0, 0xfff1f1f0, 0xfff0f1f0, 0xfff1f0f1, + 0xfff0f0f1, 0xfff1f1f0, 0xfff0f0f1, 0xfff0f1f0, 0xfff0f1f1, 0xfff1f0f0, 0xfff0f0f1, 0xfff1f1f0, + 0xfff0f1f0, 0xfff0f0f0, 0xfff0f0f1, 0xfff0f1f1, 0xfff0f0f1, 0xfff1f0f1, 0xfff1f1f0, 0xfff1f0f1, + 0xfff1f0f0, 0xfff0f0f1, 0xfff0f1f0, 0xfff0f0f1, 0xfff1f0f1, 0xfff1f0f0, 0xfff1f0f0, 0xfff0f0f1, + 0xfff0f0f0, 0xfff0f0f1, 0xfff1f0f0, 0xfff0f0f0, 0xfff0f0f0, 0xfff0f1f1, 0xffe9e8e9, 0xffdedbde, + 0xffc5c2c5, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xff797b79, 0xffb5b6b5, 0xffb5b6b5, + 0xffd6dbd6, 0xfff0eff0, 0xffefeff0, 0xfff0f0ef, 0xfff0eff0, 0xfff0eff0, 0xffefefef, 0xffeff0f0, + 0xfff0efef, 0xffefefef, 0xffefefef, 0xfff0efef, 0xffefeff0, 0xfff0efef, 0xffeff0f0, 0xfff0efef, + 0xffefefef, 0xffefefef, 0xffeff0f0, 0xfff0efef, 0xffefefef, 0xffeff0f0, 0xffefeff0, 0xffefefef, + 0xfff0f0f0, 0xfff0eff0, 0xfff0efef, 0xfff0eff0, 0xfff0efef, 0xfff0f0ef, 0xfff0eff0, 0xfff0efef, + 0xffeff0f0, 0xffefeff0, 0xfff0efef, 0xfff0f0ef, 0xffefeff0, 0xffeff0f0, 0xfff0f0f0, 0xfff0efef, + 0xfff0f0ef, 0xffefefef, 0xffeff0f0, 0xfff0f0ef, 0xffefefef, 0xffefefef, 0xffefefef, 0xfff0eff0, + 0xffefefef, 0xffefefef, 0xfff0eff0, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xfff0efef, + 0xfff0efef, 0xfff0f0f0, 0xffeff0ef, 0xffeff0f0, 0xfff0f0f0, 0xffefefef, 0xffefefef, 0xfff0f0f0, + 0xffefefef, 0xffefefef, 0xffefefef, 0xfff0efef, 0xfff0f0f0, 0xfff0f0f0, 0xfff0efef, 0xffeff0f0, + 0xfff0efef, 0xffefeff0, 0xfff0eff0, 0xffeff0ef, 0xfff0eff0, 0xfff0eff0, 0xfff0eff0, 0xffeff0f0, + 0xffeff0ef, 0xfff0eff0, 0xffeff0f0, 0xfff0eff0, 0xffefefef, 0xfff0efef, 0xfff0f0ef, 0xffefefef, + 0xffeff0f0, 0xffeff0ef, 0xffefeff0, 0xffeff0ef, 0xffeff0ef, 0xffefeff0, 0xfff0f0f0, 0xffefefef, + 0xffefeff0, 0xfff0f0ef, 0xfff0efef, 0xfff0efef, 0xffefeff0, 0xfff0f0ef, 0xffeff0ef, 0xffefefef, + 0xfff0efef, 0xffefefef, 0xffefefef, 0xfff0f0f0, 0xfff0f0ef, 0xfff0f0ef, 0xffeff0f0, 0xfff0f0ef, + 0xffefefef, 0xfff0eff0, 0xfff0efef, 0xfff0efef, 0xffefeff0, 0xfff0efef, 0xffeff0f0, 0xfff0f0ef, + 0xffeff0f0, 0xffefefef, 0xffefeff0, 0xfff0eff0, 0xfff0efef, 0xfff0f0f0, 0xfff0efef, 0xfff0f0ef, + 0xffefefef, 0xffefefef, 0xffefefef, 0xffeff0f0, 0xfff0eff0, 0xffefeff0, 0xffeff0ef, 0xffefefef, + 0xffeff0f0, 0xffefeff0, 0xffefeff0, 0xffefeff0, 0xffeff0ef, 0xffefeff0, 0xffeff0ef, 0xfff0eff0, + 0xffeff0ef, 0xfff0eff0, 0xfff0efef, 0xfff0f0ef, 0xffeff0f0, 0xfff0efef, 0xffeff0f0, 0xfff0f0ef, + 0xfff0efef, 0xfff0efef, 0xffefefef, 0xffefeff0, 0xffefefef, 0xfff0efef, 0xffefefef, 0xfff0efef, + 0xfff0f0f0, 0xfff0f0ef, 0xfff0efef, 0xfff0eff0, 0xffefeff0, 0xffefefef, 0xffeff0ef, 0xffeff0ef, + 0xffefeff0, 0xffeff0ef, 0xfff0f0ef, 0xfff0efef, 0xffeff0ef, 0xfff0f0f0, 0xfff0f0ef, 0xffefefef, + 0xffefefef, 0xffefefef, 0xffeff0ef, 0xfff0f0ef, 0xffefeff0, 0xffefeff0, 0xffefefef, 0xffefefef, + 0xffefeff0, 0xfff0eff0, 0xffeff0f0, 0xffeff0ef, 0xffefefef, 0xffeff0ef, 0xffeff0ef, 0xfff0f0f0, + 0xfff0f0f0, 0xfff0eff0, 0xfff0efef, 0xffefefef, 0xfff0eff0, 0xffeff0f0, 0xffefeff0, 0xffefeff0, + 0xfff0f0ef, 0xfff0f0ef, 0xffefefef, 0xffefeff0, 0xfff0efef, 0xfff0f0f0, 0xfff0efef, 0xffefefef, + 0xfff0eff0, 0xffefefef, 0xffefeff0, 0xffeff0ef, 0xfff0efef, 0xffefefef, 0xffefeff0, 0xffeff0f0, + 0xffeff0ef, 0xfff0f0ef, 0xffeff0ef, 0xffefefef, 0xffefeff0, 0xffefefef, 0xffe6e8e6, 0xffd6dbd6, + 0xffc5c2c5, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xff797b79, 0xffb5b6b5, 0xffb5b6b5, + 0xffd6dbd6, 0xffefeeee, 0xffeeeeee, 0xffeeefee, 0xffeeeeee, 0xffeeeeef, 0xffeeeeee, 0xffefefee, + 0xffeeefef, 0xffeeefee, 0xffefefee, 0xffefefee, 0xffefefee, 0xffeeefee, 0xffeeeeee, 0xffeeeeee, + 0xffefefef, 0xffeeeeee, 0xffeeeeee, 0xffeeeeef, 0xffefeeee, 0xffefefee, 0xffeeefee, 0xffeeeeee, + 0xffeeeeee, 0xffeeefef, 0xffeeeeee, 0xffeeefee, 0xffeeefef, 0xffefeeee, 0xffefeeee, 0xffeeeeef, + 0xffeeeeee, 0xffeeefee, 0xffeeeeef, 0xffeeeeee, 0xffeeeeef, 0xffeeefee, 0xffefeeef, 0xffefeeee, + 0xffeeefee, 0xffefeeef, 0xffefeeee, 0xffefefee, 0xffefefef, 0xffefeeef, 0xffefefef, 0xffeeeeee, + 0xffeeefee, 0xffeeefee, 0xffeeeeee, 0xffeeeeee, 0xffefeeef, 0xffeeefef, 0xffefeeee, 0xffeeefee, + 0xffeeeeee, 0xffeeefef, 0xffeeefee, 0xffefeeee, 0xffeeefef, 0xffeeeeef, 0xffeeefee, 0xffefeeef, + 0xffeeefee, 0xffefefee, 0xffeeefee, 0xffeeefee, 0xffeeefee, 0xffeeefef, 0xffefeeef, 0xffeeefee, + 0xffefefef, 0xffeeeeef, 0xffefefee, 0xffeeeeee, 0xffefefee, 0xffefeeef, 0xffefeeee, 0xffefefee, + 0xffeeefee, 0xffeeefee, 0xffeeeeef, 0xffeeeeee, 0xffefeeef, 0xffeeeeef, 0xffeeeeee, 0xffeeefee, + 0xffeeeeef, 0xffefeeef, 0xffeeeeef, 0xffeeefef, 0xffefefef, 0xffefefee, 0xffefeeef, 0xffeeeeef, + 0xffeeeeee, 0xffeeefee, 0xffefeeee, 0xffeeeeee, 0xffeeeeef, 0xffeeeeee, 0xffefefef, 0xffefeeee, + 0xffefeeee, 0xffeeefef, 0xffeeeeef, 0xffefeeee, 0xffefeeee, 0xffefeeef, 0xffeeeeee, 0xffeeeeee, + 0xffefefef, 0xffeeefef, 0xffefeeee, 0xffefefef, 0xffeeeeee, 0xffefeeee, 0xffeeeeee, 0xffeeeeee, + 0xffefeeef, 0xffeeefee, 0xffeeeeee, 0xffeeefef, 0xffeeeeee, 0xffeeefef, 0xffeeeeef, 0xffeeeeee, + 0xffefefef, 0xffeeefee, 0xffeeefef, 0xffeeeeef, 0xffeeeeef, 0xffefefee, 0xffefeeef, 0xffeeeeee, + 0xffeeeeee, 0xffefefef, 0xffeeeeef, 0xffefeeef, 0xffeeeeee, 0xffeeefee, 0xffefefef, 0xffefeeee, + 0xffeeefef, 0xffeeefef, 0xffefefef, 0xffeeeeef, 0xffeeeeee, 0xffefeeee, 0xffeeeeee, 0xffeeeeee, + 0xffeeeeee, 0xffeeefee, 0xffeeeeee, 0xffefeeee, 0xffefefef, 0xffeeefee, 0xffefeeee, 0xffeeefef, + 0xffefeeee, 0xffefeeee, 0xffeeeeee, 0xffeeeeee, 0xffefeeef, 0xffefeeee, 0xffefeeee, 0xffeeefef, + 0xffeeefee, 0xffeeefee, 0xffeeeeee, 0xffefefef, 0xffeeefee, 0xffefeeee, 0xffeeeeee, 0xffefefee, + 0xffefefee, 0xffeeeeee, 0xffeeeeee, 0xffeeeeee, 0xffeeefee, 0xffeeeeef, 0xffefeeef, 0xffefeeee, + 0xffeeeeee, 0xffefefee, 0xffefefee, 0xffeeefee, 0xffefefee, 0xffefeeee, 0xffeeefef, 0xffeeefee, + 0xffeeeeee, 0xffeeeeef, 0xffeeeeef, 0xffeeeeee, 0xffeeeeef, 0xffefeeef, 0xffefeeee, 0xffeeefef, + 0xffeeeeee, 0xffefefee, 0xffeeeeee, 0xffefeeef, 0xffeeefef, 0xffeeeeee, 0xffeeeeee, 0xffeeeeef, + 0xffefeeef, 0xffeeeeee, 0xffeeeeee, 0xffeeeeee, 0xffefeeef, 0xffefeeef, 0xffeeeeee, 0xffeeeeef, + 0xffefefee, 0xffeeeeee, 0xffefefef, 0xffeeefee, 0xffeeeeef, 0xffeeeeef, 0xffe6e8e6, 0xffd6dbd6, + 0xffc5c2c5, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xff797b79, 0xffb5b6b5, 0xffb5b6b5, + 0xffd6dbd6, 0xffeeeded, 0xffeeedee, 0xffeeeded, 0xffeeeded, 0xffededed, 0xffedeeed, 0xffedeeed, + 0xffedeeee, 0xffeeeded, 0xffedeeee, 0xffedeeed, 0xffeeedee, 0xffeeeeed, 0xffededed, 0xffeeeded, + 0xffeeeded, 0xffededee, 0xffeeeded, 0xffededed, 0xffededed, 0xffedeeed, 0xffeeedee, 0xffeeeded, + 0xffededee, 0xffeeeded, 0xffededed, 0xffededee, 0xffeeeeed, 0xffededed, 0xffededed, 0xffeeedee, + 0xffeeeded, 0xffedeeed, 0xffedeeed, 0xffededed, 0xffededed, 0xffeeeded, 0xffededed, 0xffededed, + 0xffeeeeed, 0xffedeeed, 0xffededed, 0xffedeeed, 0xffededed, 0xffeeeeed, 0xffeeeded, 0xffeeeded, + 0xffeeeeed, 0xffeeedee, 0xffeeeded, 0xffeeeeee, 0xffedeeed, 0xffeeeded, 0xffedeeee, 0xffededee, + 0xffeeeded, 0xffeeedee, 0xffedeeee, 0xffededee, 0xffededed, 0xffedeeee, 0xffeeeded, 0xffeeedee, + 0xffededed, 0xffeeedee, 0xffedeeee, 0xffeeedee, 0xffeeeeee, 0xffededee, 0xffededee, 0xffeeedee, + 0xffedeeed, 0xffededed, 0xffeeeded, 0xffeeedee, 0xffededee, 0xffeeeded, 0xffededee, 0xffededed, + 0xffedeeed, 0xffedeeed, 0xffededed, 0xffededed, 0xffededed, 0xffededed, 0xffedeeee, 0xffededee, + 0xffeeeded, 0xffededed, 0xffeeeded, 0xffededed, 0xffedeeed, 0xffeeedee, 0xffededed, 0xffedeeed, + 0xffeeedee, 0xffededed, 0xffeeedee, 0xffededed, 0xffededed, 0xffeeedee, 0xffedeeed, 0xffeeeded, + 0xffedeeed, 0xffededee, 0xffeeedee, 0xffeeeeed, 0xffedeeed, 0xffeeeeed, 0xffededee, 0xffededee, + 0xffedeeed, 0xffeeeded, 0xffededed, 0xffedeeed, 0xffeeeeee, 0xffeeeded, 0xffeeeeed, 0xffeeeded, + 0xffeeedee, 0xffededed, 0xffeeeded, 0xffeeeeed, 0xffededee, 0xffeeeeee, 0xffededed, 0xffeeeeed, + 0xffeeeded, 0xffeeedee, 0xffededed, 0xffeeedee, 0xffeeeeed, 0xffedeeee, 0xffeeedee, 0xffededed, + 0xffeeeeed, 0xffededed, 0xffeeeded, 0xffededed, 0xffededee, 0xffedeeed, 0xffeeeeed, 0xffeeeeee, + 0xffedeeee, 0xffededed, 0xffeeeded, 0xffeeeeee, 0xffeeedee, 0xffededed, 0xffeeedee, 0xffedeeed, + 0xffeeeeed, 0xffededed, 0xffededed, 0xffedeeee, 0xffedeeed, 0xffedeeed, 0xffededee, 0xffeeeeee, + 0xffededed, 0xffeeeeee, 0xffedeeed, 0xffeeeded, 0xffeeeeed, 0xffeeeeee, 0xffedeeed, 0xffeeedee, + 0xffedeeee, 0xffededee, 0xffeeeded, 0xffedeeed, 0xffeeeded, 0xffedeeed, 0xffededee, 0xffededee, + 0xffeeeded, 0xffededee, 0xffededed, 0xffeeeded, 0xffedeeed, 0xffeeeeed, 0xffededee, 0xffeeedee, + 0xffededed, 0xffeeedee, 0xffeeedee, 0xffededed, 0xffedeeed, 0xffedeeee, 0xffeeeeee, 0xffededee, + 0xffededee, 0xffedeeed, 0xffeeeeed, 0xffedeeee, 0xffededed, 0xffeeeeed, 0xffedeeed, 0xffededed, + 0xffededee, 0xffeeedee, 0xffeeeeed, 0xffedeeee, 0xffeeedee, 0xffedeeee, 0xffededed, 0xffedeeed, + 0xffedeeed, 0xffededed, 0xffeeeded, 0xffedeeed, 0xffeeeded, 0xffedeeed, 0xffededed, 0xffeeeeed, + 0xffedeeed, 0xffeeeeee, 0xffedeeee, 0xffedeeed, 0xffedeeed, 0xffeeeded, 0xffe6e8e6, 0xffd6dbd6, + 0xffc5c2c5, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xff797b79, 0xffb5b6b5, 0xffb5b6b5, + 0xffd6dbd6, 0xffecedec, 0xffedeced, 0xffededec, 0xffececec, 0xffedeced, 0xffeceded, 0xffedeced, + 0xffeceded, 0xffededed, 0xffedecec, 0xffecedec, 0xffececec, 0xffeceded, 0xffececec, 0xffededed, + 0xffeceded, 0xffeceded, 0xffededec, 0xffedeced, 0xffedeced, 0xffededec, 0xffedeced, 0xffedeced, + 0xffecedec, 0xffecedec, 0xffececec, 0xffecedec, 0xffededec, 0xffecedec, 0xffececec, 0xffecedec, + 0xffececed, 0xffececec, 0xffededec, 0xffececed, 0xffecedec, 0xffededec, 0xffececed, 0xffedecec, + 0xffececec, 0xffecedec, 0xffededec, 0xffecedec, 0xffeceded, 0xffedecec, 0xffedeced, 0xffececed, + 0xffecedec, 0xffedecec, 0xffeceded, 0xffececec, 0xffededed, 0xffececed, 0xffedecec, 0xffededec, + 0xffeceded, 0xffededed, 0xffededec, 0xffedecec, 0xffececec, 0xffececed, 0xffececed, 0xffeceded, + 0xffededec, 0xffececed, 0xffececec, 0xffecedec, 0xffededec, 0xffecedec, 0xffececed, 0xffededed, + 0xffececec, 0xffececed, 0xffedeced, 0xffececed, 0xffecedec, 0xffedeced, 0xffececed, 0xffecedec, + 0xffececec, 0xffececec, 0xffedecec, 0xffededed, 0xffededec, 0xffececed, 0xffececec, 0xffececed, + 0xffececec, 0xffedeced, 0xffececed, 0xffececed, 0xffececec, 0xffededed, 0xffededed, 0xffedecec, + 0xffedeced, 0xffedecec, 0xffececec, 0xffedecec, 0xffeceded, 0xffedecec, 0xffececed, 0xffeceded, + 0xffececec, 0xffececed, 0xffededec, 0xffeceded, 0xffececed, 0xffececed, 0xffeceded, 0xffededec, + 0xffececed, 0xffeceded, 0xffedecec, 0xffececed, 0xffededec, 0xffecedec, 0xffececec, 0xffedecec, + 0xffedeced, 0xffececec, 0xffedecec, 0xffececed, 0xffededec, 0xffeceded, 0xffededec, 0xffececec, + 0xffedecec, 0xffededec, 0xffededec, 0xffececec, 0xffececed, 0xffecedec, 0xffececec, 0xffecedec, + 0xffececec, 0xffededec, 0xffedeced, 0xffedecec, 0xffececec, 0xffededed, 0xffecedec, 0xffededec, + 0xffedeced, 0xffedeced, 0xffecedec, 0xffecedec, 0xffececec, 0xffececed, 0xffedecec, 0xffececec, + 0xffececec, 0xffedeced, 0xffeceded, 0xffececec, 0xffececec, 0xffececec, 0xffececec, 0xffececec, + 0xffedeced, 0xffececed, 0xffededed, 0xffedeced, 0xffededed, 0xffedecec, 0xffececed, 0xffededed, + 0xffedeced, 0xffececed, 0xffedecec, 0xffececed, 0xffededec, 0xffededed, 0xffededec, 0xffecedec, + 0xffececec, 0xffececed, 0xffececec, 0xffedeced, 0xffededec, 0xffedeced, 0xffedecec, 0xffedeced, + 0xffececed, 0xffededed, 0xffececec, 0xffedeced, 0xffececed, 0xffedeced, 0xffececec, 0xffececed, + 0xffececed, 0xffececec, 0xffededed, 0xffedecec, 0xffecedec, 0xffecedec, 0xffededec, 0xffededed, + 0xffececec, 0xffececec, 0xffedeced, 0xffededec, 0xffececed, 0xffeceded, 0xffeceded, 0xffecedec, + 0xffeceded, 0xffececec, 0xffececec, 0xffedecec, 0xffecedec, 0xffeceded, 0xffececec, 0xffedeced, + 0xffedeced, 0xffecedec, 0xffededed, 0xffededec, 0xffededed, 0xffededed, 0xffe6e8e6, 0xffd6dbd6, + 0xffc5c2c5, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xff797b79, 0xffb5b6b5, 0xffb5b6b5, + 0xffd6dbd6, 0xffebebeb, 0xffebebec, 0xffecebeb, 0xffebecec, 0xffebecec, 0xffececeb, 0xffebebec, + 0xffebecec, 0xffebebeb, 0xffebecec, 0xffecebec, 0xffecebeb, 0xffebebeb, 0xffecebec, 0xffecebeb, + 0xffebeceb, 0xffebebec, 0xffecebeb, 0xffececeb, 0xffecebeb, 0xffebeceb, 0xffebebec, 0xffebecec, + 0xffebecec, 0xffecebec, 0xffecebec, 0xffecebec, 0xffecebec, 0xffecebeb, 0xffecebec, 0xffecebec, + 0xffecebeb, 0xffebebeb, 0xffebeceb, 0xffececec, 0xffecebeb, 0xffecebec, 0xffebecec, 0xffebeceb, + 0xffebebec, 0xffececec, 0xffecebeb, 0xffecebec, 0xffececeb, 0xffececeb, 0xffebeceb, 0xffebebec, + 0xffececeb, 0xffebebec, 0xffecebec, 0xffececec, 0xffececeb, 0xffebeceb, 0xffebecec, 0xffecebeb, + 0xffebecec, 0xffebecec, 0xffececec, 0xffecebeb, 0xffecebec, 0xffececec, 0xffebecec, 0xffebecec, + 0xffececec, 0xffebebeb, 0xffececeb, 0xffececeb, 0xffecebec, 0xffecebeb, 0xffececeb, 0xffebebec, + 0xffecebec, 0xffececeb, 0xffececec, 0xffebebec, 0xffebebeb, 0xffececec, 0xffebecec, 0xffebebec, + 0xffececec, 0xffebebec, 0xffebecec, 0xffecebec, 0xffebebeb, 0xffecebec, 0xffebebec, 0xffececeb, + 0xffecebeb, 0xffececec, 0xffececeb, 0xffebebeb, 0xffecebeb, 0xffebebec, 0xffebebec, 0xffececeb, + 0xffececeb, 0xffebeceb, 0xffececeb, 0xffececeb, 0xffebebeb, 0xffebebec, 0xffececeb, 0xffebebec, + 0xffececeb, 0xffecebeb, 0xffebebec, 0xffecebec, 0xffecebec, 0xffececec, 0xffebeceb, 0xffececec, + 0xffebebec, 0xffebecec, 0xffebebeb, 0xffecebeb, 0xffebebeb, 0xffececec, 0xffebecec, 0xffececeb, + 0xffececeb, 0xffebecec, 0xffecebec, 0xffececeb, 0xffebeceb, 0xffececeb, 0xffebecec, 0xffecebec, + 0xffebebec, 0xffebecec, 0xffebeceb, 0xffebebeb, 0xffebecec, 0xffecebec, 0xffecebeb, 0xffebeceb, + 0xffebeceb, 0xffecebec, 0xffececec, 0xffecebeb, 0xffececeb, 0xffececeb, 0xffecebec, 0xffecebec, + 0xffebebec, 0xffebecec, 0xffececec, 0xffebebeb, 0xffecebeb, 0xffececeb, 0xffebebec, 0xffebebec, + 0xffecebeb, 0xffebebec, 0xffebebeb, 0xffebebeb, 0xffebecec, 0xffebecec, 0xffebeceb, 0xffececec, + 0xffebeceb, 0xffecebeb, 0xffecebeb, 0xffececec, 0xffebecec, 0xffebecec, 0xffebeceb, 0xffebecec, + 0xffebecec, 0xffebecec, 0xffebebec, 0xffebeceb, 0xffebebeb, 0xffecebeb, 0xffebebec, 0xffebecec, + 0xffececeb, 0xffebebec, 0xffecebec, 0xffebebeb, 0xffececec, 0xffecebeb, 0xffebebec, 0xffebecec, + 0xffebebec, 0xffebebeb, 0xffecebec, 0xffecebeb, 0xffebebeb, 0xffecebec, 0xffebecec, 0xffebebeb, + 0xffebeceb, 0xffececec, 0xffececec, 0xffecebec, 0xffebebec, 0xffececec, 0xffecebeb, 0xffebeceb, + 0xffebebec, 0xffececeb, 0xffebebec, 0xffebecec, 0xffecebec, 0xffebeceb, 0xffebecec, 0xffecebeb, + 0xffecebec, 0xffebeceb, 0xffecebec, 0xffebecec, 0xffebeceb, 0xffebeceb, 0xffecebeb, 0xffececeb, + 0xffebebec, 0xffececec, 0xffececeb, 0xffecebec, 0xffebebeb, 0xffebebec, 0xffe6e8e6, 0xffd6dbd6, + 0xffc5c2c5, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xff797b79, 0xffb5b6b5, 0xffb5b6b5, + 0xffd6dbd6, 0xffebebeb, 0xffeaebeb, 0xffeaeaea, 0xffebebeb, 0xffebeaeb, 0xffeaeaea, 0xffebeaeb, + 0xffeaebea, 0xffebebea, 0xffebeaea, 0xffeaebea, 0xffebebea, 0xffebeaeb, 0xffeaebea, 0xffebeaea, + 0xffeaebea, 0xffeaeaeb, 0xffebeaeb, 0xffeaeaea, 0xffebebea, 0xffeaebeb, 0xffebebeb, 0xffeaebeb, + 0xffebebeb, 0xffebebeb, 0xffeaebeb, 0xffebeaea, 0xffebebeb, 0xffebebeb, 0xffebebeb, 0xffeaebea, + 0xffeaeaeb, 0xffebebeb, 0xffebebea, 0xffebebeb, 0xffebeaeb, 0xffebebeb, 0xffebebea, 0xffebebeb, + 0xffebebeb, 0xffebebeb, 0xffebeaea, 0xffeaebeb, 0xffeaebea, 0xffeaeaeb, 0xffeaeaeb, 0xffebebeb, + 0xffebeaeb, 0xffebebea, 0xffeaeaeb, 0xffebebeb, 0xffebeaeb, 0xffeaebeb, 0xffebebeb, 0xffebebea, + 0xffeaeaea, 0xffeaeaeb, 0xffebeaeb, 0xffebebeb, 0xffebebea, 0xffebebea, 0xffebeaea, 0xffebebeb, + 0xffeaebeb, 0xffebebea, 0xffebebea, 0xffebeaeb, 0xffeaebea, 0xffebebea, 0xffeaeaea, 0xffeaebea, + 0xffeaebea, 0xffebebea, 0xffebeaeb, 0xffebebeb, 0xffeaebea, 0xffebebea, 0xffeaeaeb, 0xffeaebeb, + 0xffebebeb, 0xffebeaeb, 0xffebeaeb, 0xffeaebeb, 0xffebebea, 0xffeaebea, 0xffebebea, 0xffeaeaeb, + 0xffebebeb, 0xffebebeb, 0xffeaeaea, 0xffeaebeb, 0xffebeaeb, 0xffeaebeb, 0xffeaebeb, 0xffebebeb, + 0xffebebea, 0xffebebeb, 0xffeaebeb, 0xffeaebea, 0xffebebea, 0xffebebeb, 0xffebebeb, 0xffeaebeb, + 0xffebebeb, 0xffebeaeb, 0xffebeaeb, 0xffebebeb, 0xffebeaeb, 0xffeaebea, 0xffeaeaea, 0xffebebea, + 0xffeaeaea, 0xffebebeb, 0xffeaeaeb, 0xffebeaeb, 0xffebeaeb, 0xffebeaeb, 0xffeaebea, 0xffebeaea, + 0xffeaeaea, 0xffebebeb, 0xffebeaea, 0xffeaeaeb, 0xffeaebeb, 0xffeaebea, 0xffeaeaea, 0xffebebea, + 0xffeaebea, 0xffeaebea, 0xffebebeb, 0xffebeaeb, 0xffeaebeb, 0xffebebeb, 0xffebeaeb, 0xffebeaeb, + 0xffeaebeb, 0xffebebea, 0xffebebea, 0xffebebea, 0xffebebea, 0xffebebeb, 0xffeaebeb, 0xffeaebea, + 0xffebebeb, 0xffebebeb, 0xffebeaeb, 0xffeaebea, 0xffebeaeb, 0xffebebea, 0xffebebea, 0xffebebeb, + 0xffebebea, 0xffeaebeb, 0xffebeaeb, 0xffeaebeb, 0xffebeaea, 0xffeaebeb, 0xffeaebea, 0xffeaeaeb, + 0xffebebeb, 0xffebeaea, 0xffebebea, 0xffebeaeb, 0xffebebeb, 0xffebeaea, 0xffeaeaeb, 0xffebeaeb, + 0xffebebea, 0xffebebeb, 0xffebeaeb, 0xffebeaeb, 0xffebeaea, 0xffebeaea, 0xffebeaeb, 0xffebeaeb, + 0xffebeaeb, 0xffeaeaeb, 0xffebeaea, 0xffebeaeb, 0xffeaebeb, 0xffeaebeb, 0xffebebeb, 0xffebebea, + 0xffeaebea, 0xffebeaea, 0xffeaebea, 0xffebebeb, 0xffebebeb, 0xffeaebeb, 0xffebebeb, 0xffeaeaeb, + 0xffeaebeb, 0xffebebeb, 0xffebebeb, 0xffeaebea, 0xffeaebeb, 0xffeaebeb, 0xffebebeb, 0xffeaebeb, + 0xffebebea, 0xffebebeb, 0xffeaeaeb, 0xffebebeb, 0xffebebeb, 0xffebebea, 0xffeaebeb, 0xffeaebea, + 0xffeaeaeb, 0xffebebea, 0xffebeaea, 0xffebebea, 0xffebeaea, 0xffebebea, 0xffebebea, 0xffebebeb, + 0xffebebea, 0xffebebeb, 0xffebebea, 0xffebebeb, 0xffeaebeb, 0xffebebeb, 0xffe6e8e6, 0xffd6dbd6, + 0xffc5c2c5, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xff797b79, 0xffb5b6b5, 0xffb5b6b5, + 0xffd6dbd6, 0xffeaeaea, 0xffeaeaea, 0xffeaeaea, 0xffeaeaea, 0xffe9eae9, 0xffeaeaea, 0xffe9eaea, + 0xffeae9ea, 0xffeaeae9, 0xffeaeae9, 0xffeae9e9, 0xffeaeaea, 0xffeaeaea, 0xffeae9ea, 0xffeaeaea, + 0xffe9eae9, 0xffeaeaea, 0xffe9e9ea, 0xffeaeaea, 0xffeaeaea, 0xffeaeaea, 0xffeaeaea, 0xffeaeae9, + 0xffeaeae9, 0xffe9e9e9, 0xffe9eaea, 0xffeae9ea, 0xffeaeaea, 0xffeae9e9, 0xffeae9ea, 0xffe9e9e9, + 0xffeaeaea, 0xffeaeaea, 0xffe9e9ea, 0xffe9eaea, 0xffeaeae9, 0xffeaeaea, 0xffeae9ea, 0xffe9eaea, + 0xffe9eaea, 0xffeaeaea, 0xffeaeaea, 0xffeaeaea, 0xffe9eae9, 0xffeaeaea, 0xffeaeaea, 0xffeaeaea, + 0xffeaeaea, 0xffeaeaea, 0xffeaeaea, 0xffeae9ea, 0xffeaeaea, 0xffeae9ea, 0xffeae9ea, 0xffe9eaea, + 0xffeaeaea, 0xffeaeaea, 0xffeae9e9, 0xffeaeaea, 0xffeaeaea, 0xffeae9ea, 0xffeae9e9, 0xffe9eaea, + 0xffeaeaea, 0xffeaeaea, 0xffeaeae9, 0xffeae9e9, 0xffeaeaea, 0xffeaeaea, 0xffeaeaea, 0xffe9e9ea, + 0xffeaeaea, 0xffeaeae9, 0xffeaeaea, 0xffeae9ea, 0xffe9eaea, 0xffeaeae9, 0xffeaeae9, 0xffeaeaea, + 0xffeaeaea, 0xffe9eaea, 0xffeaeaea, 0xffeaeaea, 0xffeaeae9, 0xffeaeaea, 0xffe9eaea, 0xffeae9ea, + 0xffeaeaea, 0xffeaeaea, 0xffeaeae9, 0xffe9eae9, 0xffeaeaea, 0xffe9eaea, 0xffeaeaea, 0xffeaeaea, + 0xffeaeaea, 0xffeaeaea, 0xffeaeaea, 0xffeaeae9, 0xffeaeae9, 0xffe9eaea, 0xffe9eaea, 0xffeaeaea, + 0xffeaeaea, 0xffeae9e9, 0xffeaeaea, 0xffeaeae9, 0xffeaeae9, 0xffeaeaea, 0xffeaeae9, 0xffeaeaea, + 0xffeaeaea, 0xffeaeae9, 0xffeaeaea, 0xffeaeaea, 0xffeaeaea, 0xffeaeaea, 0xffeaeaea, 0xffeaeaea, + 0xffeaeaea, 0xffeaeaea, 0xffeaeae9, 0xffeaeaea, 0xffeaeae9, 0xffeaeaea, 0xffeaeaea, 0xffe9eaea, + 0xffeaeaea, 0xffe9eae9, 0xffeaeae9, 0xffeae9ea, 0xffeaeaea, 0xffe9eaea, 0xffe9eaea, 0xffeae9ea, + 0xffeaeae9, 0xffeaeaea, 0xffeae9e9, 0xffeaeaea, 0xffe9eaea, 0xffeae9ea, 0xffeaeaea, 0xffeaeaea, + 0xffe9eaea, 0xffeae9ea, 0xffeaeae9, 0xffeae9e9, 0xffeaeaea, 0xffeaeaea, 0xffeaeaea, 0xffeaeae9, + 0xffeaeaea, 0xffeaeaea, 0xffe9eaea, 0xffe9e9ea, 0xffe9eae9, 0xffeaeaea, 0xffeaeae9, 0xffeaeaea, + 0xffeaeae9, 0xffeae9ea, 0xffeaeae9, 0xffeaeae9, 0xffe9eaea, 0xffeaeaea, 0xffeaeae9, 0xffe9eaea, + 0xffeaeaea, 0xffeaeae9, 0xffeae9ea, 0xffeaeaea, 0xffeaeaea, 0xffeaeaea, 0xffe9eaea, 0xffeae9ea, + 0xffeaeae9, 0xffeae9ea, 0xffe9eaea, 0xffeaeae9, 0xffeaeae9, 0xffeae9ea, 0xffeaeaea, 0xffe9eaea, + 0xffeaeaea, 0xffeaeaea, 0xffeae9ea, 0xffeaeaea, 0xffeaeaea, 0xffeaeae9, 0xffe9eaea, 0xffe9e9ea, + 0xffeaeaea, 0xffe9e9ea, 0xffe9eaea, 0xffeae9ea, 0xffe9e9e9, 0xffeaeaea, 0xffeaeaea, 0xffeaeae9, + 0xffeaeaea, 0xffeaeaea, 0xffeaeaea, 0xffeae9ea, 0xffeaeaea, 0xffeaeaea, 0xffe9e9ea, 0xffeaeaea, + 0xffeaeaea, 0xffeaeaea, 0xffeaeaea, 0xffeaeaea, 0xffeaeaea, 0xffeaeaea, 0xffeaeaea, 0xffe9eaea, + 0xffeaeaea, 0xffe9eae9, 0xffeaeaea, 0xffeae9ea, 0xffeaeae9, 0xffeaeaea, 0xffe6e8e6, 0xffd6dbd6, + 0xffc5c2c5, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xff797b79, 0xffb5b6b5, 0xffb5b6b5, + 0xffd6dbd6, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, + 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, + 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, + 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffeae9e9, 0xffe9e9e9, 0xffe9e9e9, + 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, + 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, + 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, + 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, + 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, + 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, + 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, + 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, + 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, + 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, + 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, + 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, + 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, + 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, + 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, + 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, + 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, + 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, + 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, + 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, + 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, + 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, + 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, + 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe9e9e9, 0xffe6e8e6, 0xffd6dbd6, + 0xffc5c2c5, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xff797b79, 0xffb5b6b5, 0xffb5b6b5, + 0xffd6dbd6, 0xffe8e8e8, 0xffe8e8e9, 0xffe9e9e9, 0xffe8e8e8, 0xffe9e8e9, 0xffe8e8e9, 0xffe8e8e9, + 0xffe8e8e9, 0xffe8e8e8, 0xffe8e8e9, 0xffe8e8e9, 0xffe8e9e9, 0xffe9e8e8, 0xffe9e8e8, 0xffe8e9e8, + 0xffe8e9e9, 0xffe8e8e8, 0xffe8e8e9, 0xffe9e8e8, 0xffe8e9e8, 0xffe8e8e8, 0xffe8e8e8, 0xffe8e9e9, + 0xffe9e8e8, 0xffe8e8e9, 0xffe9e8e9, 0xffe9e9e8, 0xffe9e8e8, 0xffe8e9e8, 0xffe8e9e8, 0xffe8e8e8, + 0xffe8e9e8, 0xffe8e8e9, 0xffe8e8e8, 0xffe9e8e8, 0xffe8e8e8, 0xffe8e8e9, 0xffe8e9e8, 0xffe8e8e8, + 0xffe8e9e8, 0xffe8e8e8, 0xffe8e9e8, 0xffe8e9e8, 0xffe8e9e9, 0xffe8e8e8, 0xffe9e8e9, 0xffe8e8e8, + 0xffe8e9e8, 0xffe9e8e8, 0xffe8e8e8, 0xffe9e9e8, 0xffe8e8e8, 0xffe8e9e9, 0xffe8e8e9, 0xffe8e8e8, + 0xffe8e9e8, 0xffe9e9e8, 0xffe8e8e8, 0xffe9e9e9, 0xffe8e8e8, 0xffe9e8e8, 0xffe8e8e8, 0xffe8e8e9, + 0xffe8e9e8, 0xffe8e8e9, 0xffe8e9e9, 0xffe9e8e8, 0xffe8e8e8, 0xffe9e8e8, 0xffe8e8e8, 0xffe9e8e9, + 0xffe8e8e8, 0xffe9e8e8, 0xffe8e8e8, 0xffe8e8e8, 0xffe8e9e8, 0xffe9e8e9, 0xffe8e8e8, 0xffe8e8e9, + 0xffe8e8e8, 0xffe9e9e8, 0xffe9e8e9, 0xffe8e8e9, 0xffe8e9e8, 0xffe9e8e9, 0xffe8e9e8, 0xffe8e9e9, + 0xffe8e8e8, 0xffe9e9e8, 0xffe8e9e8, 0xffe9e8e8, 0xffe8e8e8, 0xffe8e8e9, 0xffe8e9e9, 0xffe8e8e8, + 0xffe8e8e8, 0xffe8e8e9, 0xffe8e9e8, 0xffe8e9e8, 0xffe8e8e8, 0xffe8e8e8, 0xffe9e8e8, 0xffe8e8e9, + 0xffe8e9e8, 0xffe9e8e8, 0xffe8e8e8, 0xffe8e8e8, 0xffe8e8e8, 0xffe8e8e8, 0xffe8e8e8, 0xffe8e8e8, + 0xffe8e8e9, 0xffe8e8e9, 0xffe8e8e8, 0xffe8e8e8, 0xffe9e9e8, 0xffe8e9e9, 0xffe8e8e8, 0xffe8e8e8, + 0xffe8e8e8, 0xffe8e8e8, 0xffe8e8e8, 0xffe8e8e8, 0xffe9e9e8, 0xffe9e8e8, 0xffe8e8e8, 0xffe8e9e8, + 0xffe8e8e9, 0xffe8e8e8, 0xffe8e8e8, 0xffe8e9e9, 0xffe8e8e8, 0xffe8e8e8, 0xffe8e8e8, 0xffe8e9e8, + 0xffe8e8e8, 0xffe8e8e8, 0xffe8e8e8, 0xffe8e8e8, 0xffe8e8e8, 0xffe9e8e8, 0xffe8e8e9, 0xffe9e9e8, + 0xffe8e8e8, 0xffe9e9e8, 0xffe8e9e9, 0xffe8e9e8, 0xffe9e8e9, 0xffe8e9e8, 0xffe8e8e8, 0xffe8e8e8, + 0xffe8e8e8, 0xffe9e8e8, 0xffe9e8e8, 0xffe9e8e9, 0xffe8e8e9, 0xffe8e9e8, 0xffe9e8e8, 0xffe8e9e9, + 0xffe9e8e9, 0xffe9e8e8, 0xffe8e8e9, 0xffe9e8e8, 0xffe8e9e8, 0xffe8e9e8, 0xffe8e8e8, 0xffe9e9e8, + 0xffe8e8e8, 0xffe8e8e9, 0xffe8e9e9, 0xffe8e9e8, 0xffe9e8e8, 0xffe8e8e8, 0xffe8e8e8, 0xffe8e8e8, + 0xffe8e8e8, 0xffe8e9e8, 0xffe8e9e9, 0xffe8e8e8, 0xffe8e8e9, 0xffe8e8e8, 0xffe8e8e8, 0xffe8e8e9, + 0xffe8e9e8, 0xffe8e9e8, 0xffe8e8e8, 0xffe9e8e8, 0xffe8e8e8, 0xffe8e9e8, 0xffe8e8e8, 0xffe8e8e8, + 0xffe9e8e9, 0xffe8e8e8, 0xffe8e8e8, 0xffe8e8e8, 0xffe8e9e9, 0xffe9e8e8, 0xffe8e8e8, 0xffe9e8e8, + 0xffe9e8e8, 0xffe8e9e8, 0xffe9e8e8, 0xffe8e8e8, 0xffe8e9e8, 0xffe8e9e8, 0xffe8e8e8, 0xffe8e8e8, + 0xffe8e8e8, 0xffe8e9e8, 0xffe8e8e8, 0xffe9e8e9, 0xffe9e9e9, 0xffe8e8e8, 0xffe8e9e9, 0xffe9e8e8, + 0xffe8e8e8, 0xffe8e8e8, 0xffe8e8e8, 0xffe8e9e8, 0xffe8e8e8, 0xffe8e8e8, 0xffe6e8e6, 0xffd6dbd6, + 0xffc5c2c5, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xff797b79, 0xffb5b6b5, 0xffb5b6b5, + 0xffd6dbd6, 0xffe7e8e8, 0xffe8e7e8, 0xffe8e7e8, 0xffe7e8e7, 0xffe8e7e8, 0xffe7e7e8, 0xffe7e8e8, + 0xffe7e7e8, 0xffe8e7e8, 0xffe8e8e8, 0xffe7e8e7, 0xffe8e8e8, 0xffe7e8e8, 0xffe8e7e7, 0xffe8e8e7, + 0xffe7e7e7, 0xffe8e8e8, 0xffe7e7e7, 0xffe7e8e7, 0xffe8e8e7, 0xffe8e8e8, 0xffe7e7e8, 0xffe8e8e7, + 0xffe8e8e8, 0xffe8e8e7, 0xffe7e7e7, 0xffe7e8e7, 0xffe8e8e7, 0xffe8e8e7, 0xffe8e7e8, 0xffe8e7e8, + 0xffe7e8e7, 0xffe7e7e8, 0xffe8e8e8, 0xffe7e7e7, 0xffe7e8e8, 0xffe7e7e7, 0xffe7e8e7, 0xffe7e8e8, + 0xffe8e7e8, 0xffe7e7e7, 0xffe8e8e7, 0xffe7e8e7, 0xffe7e8e8, 0xffe8e8e8, 0xffe8e8e7, 0xffe8e8e8, + 0xffe7e7e7, 0xffe7e8e8, 0xffe8e8e8, 0xffe8e8e8, 0xffe8e7e8, 0xffe8e7e8, 0xffe8e8e8, 0xffe7e8e8, + 0xffe7e8e7, 0xffe7e7e8, 0xffe8e8e8, 0xffe8e8e8, 0xffe8e8e8, 0xffe8e7e7, 0xffe8e8e7, 0xffe8e8e8, + 0xffe8e8e7, 0xffe7e7e8, 0xffe7e7e8, 0xffe8e8e7, 0xffe8e7e8, 0xffe8e7e7, 0xffe8e8e7, 0xffe7e8e8, + 0xffe8e7e8, 0xffe8e7e8, 0xffe8e7e8, 0xffe7e7e8, 0xffe8e8e8, 0xffe8e8e8, 0xffe8e8e7, 0xffe7e7e7, + 0xffe7e8e7, 0xffe7e7e8, 0xffe8e7e8, 0xffe8e8e7, 0xffe7e7e8, 0xffe8e8e8, 0xffe8e7e7, 0xffe8e7e8, + 0xffe7e7e7, 0xffe7e8e8, 0xffe8e7e8, 0xffe8e8e7, 0xffe8e7e8, 0xffe8e7e7, 0xffe8e7e8, 0xffe8e8e7, + 0xffe7e8e8, 0xffe8e7e7, 0xffe8e7e7, 0xffe8e7e7, 0xffe8e7e7, 0xffe7e8e8, 0xffe7e7e8, 0xffe8e7e8, + 0xffe7e8e8, 0xffe7e8e8, 0xffe7e8e7, 0xffe8e7e8, 0xffe8e8e7, 0xffe8e8e7, 0xffe7e8e8, 0xffe8e7e8, + 0xffe8e8e8, 0xffe8e8e7, 0xffe7e7e7, 0xffe8e8e8, 0xffe7e7e8, 0xffe8e8e8, 0xffe7e7e8, 0xffe7e7e7, + 0xffe7e7e8, 0xffe7e7e8, 0xffe8e7e8, 0xffe8e7e7, 0xffe8e7e7, 0xffe8e7e8, 0xffe8e8e7, 0xffe7e7e8, + 0xffe8e8e8, 0xffe7e8e7, 0xffe7e8e7, 0xffe8e8e8, 0xffe8e7e8, 0xffe7e7e7, 0xffe8e8e8, 0xffe8e7e8, + 0xffe8e8e7, 0xffe7e7e8, 0xffe8e7e8, 0xffe7e7e8, 0xffe7e8e7, 0xffe7e8e7, 0xffe7e7e8, 0xffe8e7e7, + 0xffe8e7e7, 0xffe8e7e7, 0xffe7e8e7, 0xffe8e8e8, 0xffe7e8e8, 0xffe8e8e8, 0xffe8e8e8, 0xffe8e7e7, + 0xffe7e8e7, 0xffe8e7e7, 0xffe7e8e8, 0xffe7e7e7, 0xffe8e7e8, 0xffe7e8e8, 0xffe8e7e8, 0xffe8e8e8, + 0xffe7e7e7, 0xffe7e7e7, 0xffe7e8e7, 0xffe8e8e7, 0xffe8e7e8, 0xffe7e8e8, 0xffe7e7e7, 0xffe7e7e8, + 0xffe7e7e8, 0xffe7e8e8, 0xffe7e8e8, 0xffe7e8e8, 0xffe7e7e7, 0xffe7e8e8, 0xffe8e7e8, 0xffe8e8e8, + 0xffe7e8e8, 0xffe8e7e8, 0xffe7e7e7, 0xffe8e7e8, 0xffe7e8e7, 0xffe8e7e7, 0xffe7e8e8, 0xffe7e8e8, + 0xffe7e8e8, 0xffe7e8e7, 0xffe7e8e8, 0xffe7e8e8, 0xffe8e8e8, 0xffe8e7e7, 0xffe8e7e7, 0xffe8e7e8, + 0xffe8e8e7, 0xffe8e8e7, 0xffe8e7e8, 0xffe7e7e8, 0xffe8e7e8, 0xffe8e7e7, 0xffe8e8e8, 0xffe8e7e8, + 0xffe7e7e8, 0xffe8e8e7, 0xffe7e8e7, 0xffe7e8e7, 0xffe8e8e8, 0xffe8e7e8, 0xffe7e8e7, 0xffe8e7e7, + 0xffe7e7e8, 0xffe7e8e8, 0xffe8e7e8, 0xffe8e7e7, 0xffe7e7e8, 0xffe8e8e7, 0xffe7e7e8, 0xffe8e7e7, + 0xffe7e7e8, 0xffe7e7e8, 0xffe8e8e7, 0xffe7e8e8, 0xffe8e7e7, 0xffe8e8e8, 0xffe6e8e6, 0xffd6dbd6, + 0xffc5c2c5, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xff797b79, 0xffb5b6b5, 0xffb5b6b5, + 0xffd6dbd6, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, + 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e6, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, + 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, + 0xffe7e7e7, 0xffe7e6e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, + 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, + 0xffe7e7e7, 0xffe7e7e7, 0xffe7e6e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, + 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, + 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e6e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, + 0xffe7e7e7, 0xffe7e7e6, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, + 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, + 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e6, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, + 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, + 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, + 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, + 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, + 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, + 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, + 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, + 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, + 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, + 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, + 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, + 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e6, 0xffe7e7e7, + 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe6e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, + 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, + 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, + 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, + 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe6e8e6, 0xffd6dbd6, + 0xffc5c2c5, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xff797b79, 0xffb5b6b5, 0xffb5b6b5, + 0xffd6dbd6, 0xffe6e6e6, 0xffe6e7e7, 0xffe6e7e6, 0xffe7e6e7, 0xffe7e6e6, 0xffe7e6e6, 0xffe6e6e7, + 0xffe6e6e6, 0xffe6e6e6, 0xffe7e6e6, 0xffe7e6e6, 0xffe6e7e7, 0xffe7e6e6, 0xffe6e7e6, 0xffe6e6e7, + 0xffe7e6e6, 0xffe6e7e7, 0xffe7e6e6, 0xffe7e7e7, 0xffe6e7e7, 0xffe6e7e7, 0xffe6e6e7, 0xffe6e7e6, + 0xffe6e7e6, 0xffe7e7e6, 0xffe6e7e6, 0xffe6e7e6, 0xffe6e6e6, 0xffe6e7e7, 0xffe6e7e7, 0xffe6e7e6, + 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe7e7e7, 0xffe7e7e7, 0xffe6e7e6, 0xffe6e6e6, 0xffe7e7e7, + 0xffe6e6e7, 0xffe7e7e7, 0xffe7e6e7, 0xffe6e6e7, 0xffe6e7e6, 0xffe6e6e6, 0xffe7e7e7, 0xffe7e6e6, + 0xffe7e6e7, 0xffe7e6e7, 0xffe6e7e6, 0xffe6e6e7, 0xffe7e7e6, 0xffe7e7e6, 0xffe6e6e7, 0xffe6e7e6, + 0xffe6e6e6, 0xffe6e7e6, 0xffe6e7e6, 0xffe7e6e6, 0xffe6e6e7, 0xffe6e7e7, 0xffe6e7e7, 0xffe6e7e6, + 0xffe6e6e7, 0xffe6e6e7, 0xffe6e6e7, 0xffe6e6e7, 0xffe6e6e7, 0xffe7e6e6, 0xffe6e7e6, 0xffe6e7e6, + 0xffe7e7e7, 0xffe7e7e7, 0xffe7e7e7, 0xffe6e7e7, 0xffe6e6e7, 0xffe6e6e6, 0xffe6e7e7, 0xffe7e7e7, + 0xffe6e7e7, 0xffe7e6e6, 0xffe6e6e7, 0xffe6e7e7, 0xffe7e6e7, 0xffe7e7e7, 0xffe6e6e7, 0xffe6e6e6, + 0xffe7e7e6, 0xffe6e6e6, 0xffe6e7e7, 0xffe6e6e6, 0xffe6e7e6, 0xffe7e7e6, 0xffe7e7e6, 0xffe6e7e7, + 0xffe6e6e6, 0xffe6e7e6, 0xffe6e7e7, 0xffe7e7e6, 0xffe6e7e6, 0xffe6e6e7, 0xffe7e7e6, 0xffe6e6e6, + 0xffe7e7e6, 0xffe6e6e7, 0xffe6e7e7, 0xffe6e7e6, 0xffe7e6e7, 0xffe6e7e7, 0xffe6e6e7, 0xffe7e6e7, + 0xffe6e7e7, 0xffe6e7e6, 0xffe7e7e7, 0xffe7e7e7, 0xffe6e7e6, 0xffe6e7e6, 0xffe6e6e7, 0xffe6e6e7, + 0xffe6e6e6, 0xffe7e6e7, 0xffe6e6e6, 0xffe7e6e7, 0xffe6e6e7, 0xffe7e7e7, 0xffe6e6e7, 0xffe6e6e6, + 0xffe6e6e6, 0xffe6e6e6, 0xffe7e6e6, 0xffe7e7e6, 0xffe7e7e7, 0xffe6e6e6, 0xffe7e7e7, 0xffe6e7e7, + 0xffe6e7e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe7e7e6, 0xffe6e6e7, 0xffe7e6e6, 0xffe7e6e7, 0xffe6e6e7, + 0xffe6e7e7, 0xffe7e6e6, 0xffe6e7e6, 0xffe6e6e7, 0xffe7e7e7, 0xffe7e6e6, 0xffe6e7e6, 0xffe7e6e6, + 0xffe6e7e7, 0xffe6e7e7, 0xffe6e6e6, 0xffe7e7e6, 0xffe7e6e6, 0xffe7e6e6, 0xffe6e7e6, 0xffe7e6e6, + 0xffe7e7e6, 0xffe6e6e7, 0xffe6e6e6, 0xffe6e6e7, 0xffe6e7e7, 0xffe6e7e7, 0xffe6e6e7, 0xffe6e7e6, + 0xffe6e7e6, 0xffe6e7e7, 0xffe7e7e7, 0xffe6e6e7, 0xffe6e7e7, 0xffe6e6e7, 0xffe6e6e7, 0xffe6e7e7, + 0xffe7e6e6, 0xffe7e6e7, 0xffe6e6e6, 0xffe7e7e6, 0xffe7e6e6, 0xffe6e7e7, 0xffe6e7e7, 0xffe7e7e7, + 0xffe6e6e6, 0xffe7e7e7, 0xffe7e7e7, 0xffe6e7e6, 0xffe7e7e7, 0xffe6e6e7, 0xffe7e7e7, 0xffe6e6e7, + 0xffe6e7e6, 0xffe7e7e6, 0xffe7e6e7, 0xffe7e6e7, 0xffe7e6e6, 0xffe6e6e6, 0xffe7e7e6, 0xffe6e7e6, + 0xffe7e6e6, 0xffe7e7e6, 0xffe6e7e6, 0xffe6e7e6, 0xffe6e7e6, 0xffe6e6e7, 0xffe7e6e7, 0xffe6e7e7, + 0xffe7e7e6, 0xffe7e6e7, 0xffe7e7e7, 0xffe6e6e6, 0xffe6e6e7, 0xffe7e6e6, 0xffe6e6e7, 0xffe7e7e6, + 0xffe7e7e7, 0xffe6e7e6, 0xffe6e6e7, 0xffe7e6e6, 0xffe6e7e6, 0xffe6e7e7, 0xffe6e8e6, 0xffd6dbd6, + 0xffc5c2c5, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xff797879, 0xffb5b2b5, 0xffb5b2b5, + 0xffd9dbd9, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, + 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, + 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, + 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, + 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, + 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, + 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, + 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, + 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, + 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, + 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, + 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, + 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, + 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, + 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, + 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, + 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, + 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, + 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, + 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, + 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, + 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, + 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, + 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, + 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, + 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, + 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, + 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6e6e6, 0xffe6ebe6, 0xffd9dbd9, + 0xffbdbebd, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xff797879, 0xffb5b2b5, 0xffb5b2b5, + 0xffd9dbd9, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, + 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, + 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, + 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, + 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, + 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, + 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, + 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, + 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, + 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, + 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, + 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, + 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, + 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, + 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, + 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, + 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, + 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, + 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, + 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, + 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, + 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, + 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, + 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, + 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, + 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, + 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, + 0xffefefef, 0xffefefef, 0xffefefef, 0xffefefef, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffd9dbd9, + 0xffbdbebd, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xff797879, 0xffb5b2b5, 0xffb5b2b5, + 0xffcbcacb, 0xffd9dbd9, 0xffe6ebe6, 0xffe6ebe6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, + 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, + 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, + 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, + 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, + 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, + 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, + 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, + 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, + 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, + 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, + 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, + 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, + 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, + 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, + 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, + 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, + 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, + 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, + 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, + 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, + 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, + 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, + 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, + 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, + 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, + 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, + 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6e8e6, 0xffe6ebe6, 0xffe6ebe6, 0xffd9dbd9, 0xffcbcacb, + 0xffbdbebd, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0x00000400, 0xff797879, 0xffb5b2b5, + 0xffbdbabd, 0xffcbcacb, 0xffd9dbd9, 0xffd9dbd9, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, + 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, + 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, + 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, + 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, + 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, + 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, + 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, + 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, + 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, + 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, + 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, + 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, + 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, + 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, + 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, + 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, + 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, + 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, + 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, + 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, + 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, + 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, + 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, + 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, + 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, + 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, + 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd9dbd9, 0xffd9dbd9, 0xffcbcacb, 0xffbdbabd, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff848284, + 0xff9c9f9c, 0xff9c9f9c, 0xff9c9f9c, 0xff9c9f9c, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, + 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, + 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, + 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, + 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, + 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, + 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, + 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, + 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, + 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, + 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, + 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, + 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, + 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, + 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, + 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, + 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, + 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, + 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, + 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, + 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, + 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, + 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, + 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, + 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, + 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, + 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, + 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xffa2a5a2, 0xff9c9e9c, 0xff9c9e9c, 0xff9c9e9c, 0x00080408, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff848284, 0xffc5c2c5, 0xffc5c2c5, 0xffe6ebe6, + 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, + 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, + 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, + 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, + 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, + 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, + 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, + 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, + 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, + 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, + 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, + 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, + 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, + 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, + 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, + 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, + 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, + 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, + 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, + 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, + 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, + 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, + 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, + 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, + 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, + 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, + 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, + 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffbdbebd, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff848284, 0xff848284, 0xffc5c2c5, 0xffe6ebe6, + 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, + 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, + 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, + 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, + 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, + 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, + 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, + 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, + 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, + 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, + 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, + 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, + 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, + 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, + 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, + 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, + 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, + 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, + 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, + 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, + 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, + 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, + 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, + 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, + 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, + 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, + 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, + 0xffeff3ef, 0xffeff3ef, 0xffeff3ef, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffe6ebe6, 0xffbdbebd, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff6e3e3c, 0xffa55d5a, 0xffa55d5a, 0xffc5716b, + 0xffd07770, 0xffd67973, 0xffd67973, 0xffd67970, 0xffd67970, 0xffd67970, 0xffd67970, 0xffd6796b, + 0xffd6796b, 0xffd6796b, 0xffd6796b, 0xffd6786b, 0xffd6786b, 0xffd6776b, 0xffd6776b, 0xffd6756b, + 0xffd6756b, 0xffd6756b, 0xffd6746b, 0xffd6746b, 0xffd6736b, 0xffd6736b, 0xffd6736b, 0xffce7163, + 0xffce7163, 0xffce7063, 0xffce6f63, 0xffce6d63, 0xffce6d63, 0xffce6d63, 0xffce6d63, 0xffce6c63, + 0xffce6c63, 0xffce6b63, 0xffce6963, 0xffce695a, 0xffce685a, 0xffce675a, 0xffce675a, 0xffc5655a, + 0xffc5655a, 0xffc5655a, 0xffc5645a, 0xffc5645d, 0xffc56258, 0xffc56258, 0xffc56258, 0xffc56052, + 0xffc56052, 0xffc55e52, 0xffc55e52, 0xffc55d52, 0xffc55c52, 0xffc55c52, 0xffc55a52, 0xffbd594a, + 0xffbd594a, 0xffbd584a, 0xffbd564a, 0xffbd554a, 0xffbd554a, 0xffbd554a, 0xffbd554a, 0xffbd544a, + 0xffbd544a, 0xffbd544a, 0xffbd544a, 0xffbd5142, 0xffbd5142, 0xffba5042, 0xffba5042, 0xffba4d42, + 0xffb84d42, 0xffb84d42, 0xffb84d42, 0xffb54c3f, 0xffb54a3c, 0xffb54a3c, 0xffb5493a, 0xffb5483a, + 0xffb5483a, 0xffb5463a, 0xffb5463a, 0xffb5453a, 0xffb5433a, 0xffb5433a, 0xffb5433a, 0xffb54237, + 0xffb54237, 0xffb54131, 0xffb54131, 0xffad4131, 0xffad4131, 0xffad3f31, 0xffad3f31, 0xffad3f31, + 0xffad3e31, 0xffad3e31, 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3b2f, + 0xffad3b2f, 0xffad3b2f, 0xffad3a2c, 0xffad392f, 0xffad392c, 0xffad392c, 0xffad392c, 0xffad392f, + 0xffad392c, 0xffad392f, 0xffad392f, 0xffad3a2c, 0xffad3a2c, 0xffad3b2f, 0xffad3b2f, 0xffad3d31, + 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3e31, 0xffad3e31, 0xffad3f31, 0xffad3f31, + 0xffad3f31, 0xffad3f31, 0xffad4131, 0xffb54237, 0xffb54237, 0xffb54237, 0xffb54237, 0xffb5453a, + 0xffb5453a, 0xffb5453a, 0xffb5453a, 0xffb5463a, 0xffb5483a, 0xffb5483a, 0xffb5483a, 0xffb54a3c, + 0xffb54a3c, 0xffb54c3f, 0xffb54c3f, 0xffb54d42, 0xffb54d42, 0xffb84e42, 0xffba5042, 0xffbd5045, + 0xffbd5142, 0xffbd5142, 0xffbd5142, 0xffbd544a, 0xffbd544a, 0xffbd544a, 0xffbd554a, 0xffbd554a, + 0xffbd564a, 0xffbd564a, 0xffbd564a, 0xffc0594d, 0xffc35950, 0xffc35950, 0xffc35950, 0xffc55a52, + 0xffc55d52, 0xffc55d52, 0xffc55d52, 0xffc55e52, 0xffc56052, 0xffc56052, 0xffc56152, 0xffc56258, + 0xffc56258, 0xffc56455, 0xffc56455, 0xffcb655a, 0xffcb655a, 0xffcb655a, 0xffcb655a, 0xffce675d, + 0xffce6860, 0xffce6860, 0xffce6963, 0xffce6b63, 0xffce6b63, 0xffce6c63, 0xffce6d63, 0xffce6d63, + 0xffce6f63, 0xffce6f63, 0xffce7063, 0xffd07165, 0xffd07165, 0xffd37168, 0xffd37168, 0xffd6736b, + 0xffd6736b, 0xffd6746b, 0xffd6746b, 0xffd6756b, 0xffd6756b, 0xffd6756b, 0xffd6756b, 0xffd6776b, + 0xffd6786b, 0xffd6796b, 0xffd6786b, 0xffd6796e, 0xffd6796e, 0xffd6796e, 0xffd67970, 0xffd67973, + 0xffd67973, 0xffd67973, 0xffd67973, 0xffd67973, 0xffd67973, 0xffd07770, 0xffc5716b, 0xffb5655a, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff6e3e3c, 0xffa55d5a, 0xffa55d5a, 0xffc5716b, + 0xffd07770, 0xffd67973, 0xffd67973, 0xffd67970, 0xffd67970, 0xffd67970, 0xffd67970, 0xffd6796b, + 0xffd6796b, 0xffd6796b, 0xffd6786b, 0xffd6776b, 0xffd6776b, 0xffd6756b, 0xffd6756b, 0xffd6756b, + 0xffd6746b, 0xffd6746b, 0xffd6746b, 0xffd6736b, 0xffd6716b, 0xffd6716b, 0xffd6716b, 0xffce7063, + 0xffce7063, 0xffce7063, 0xffce7063, 0xffce6d63, 0xffce6d63, 0xffce6d63, 0xffce6d63, 0xffce6c63, + 0xffce6c63, 0xffce6b63, 0xffce6b63, 0xffce695a, 0xffce685a, 0xffce685a, 0xffce675a, 0xffc5655a, + 0xffc5655a, 0xffc5645a, 0xffc5645a, 0xffc56258, 0xffc56258, 0xffc56152, 0xffc56152, 0xffc56052, + 0xffc55e52, 0xffc55e52, 0xffc55e52, 0xffc55d52, 0xffc55d52, 0xffc55a52, 0xffc55a52, 0xffbd594a, + 0xffbd594a, 0xffbd594a, 0xffbd564a, 0xffbd554a, 0xffbd554a, 0xffbd554a, 0xffbd554a, 0xffbd544a, + 0xffbd524a, 0xffbd524a, 0xffbd514a, 0xffba5042, 0xffba5042, 0xffba5042, 0xffb54d42, 0xffb84d42, + 0xffb84d42, 0xffb84d42, 0xffb84d42, 0xffb54c3f, 0xffb54a3c, 0xffb5493a, 0xffb5493a, 0xffb5483a, + 0xffb5483a, 0xffb5483a, 0xffb5463a, 0xffb5453a, 0xffb5433a, 0xffb5433a, 0xffb5423a, 0xffb54237, + 0xffb54237, 0xffb54131, 0xffb54131, 0xffad3f31, 0xffad3f31, 0xffad3f31, 0xffad3e31, 0xffad3d31, + 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3a2c, + 0xffad3b2f, 0xffad3a2c, 0xffad3929, 0xffad392c, 0xffad392c, 0xffad392c, 0xffad392c, 0xffad392c, + 0xffad392c, 0xffad392c, 0xffad392c, 0xffad3929, 0xffad3a2c, 0xffad3a2c, 0xffad3b2f, 0xffad3d31, + 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3e31, 0xffad3f31, + 0xffad3f31, 0xffad3f31, 0xffad3f31, 0xffb5413a, 0xffb5413a, 0xffb54237, 0xffb54237, 0xffb5453a, + 0xffb5453a, 0xffb5453a, 0xffb5453a, 0xffb5463a, 0xffb5483a, 0xffb5483a, 0xffb5483a, 0xffb5493a, + 0xffb54a3c, 0xffb54c3f, 0xffb54c3f, 0xffb54d42, 0xffb54d42, 0xffb54d42, 0xffb84e42, 0xffbd4e47, + 0xffbd5045, 0xffbd5045, 0xffbd5142, 0xffbd524a, 0xffbd544a, 0xffbd544a, 0xffbd554a, 0xffbd554a, + 0xffbd564a, 0xffbd564a, 0xffbd564a, 0xffc0594d, 0xffc0594d, 0xffc0594d, 0xffc35950, 0xffc55a52, + 0xffc55d52, 0xffc55d52, 0xffc55d52, 0xffc55e52, 0xffc55e52, 0xffc55e52, 0xffc56052, 0xffc5615a, + 0xffc56258, 0xffc56258, 0xffc56455, 0xffc8655a, 0xffc8655a, 0xffcb655a, 0xffcb655a, 0xffce675d, + 0xffce6860, 0xffce6860, 0xffce6963, 0xffce6b63, 0xffce6b63, 0xffce6c63, 0xffce6c63, 0xffce6d63, + 0xffce6f63, 0xffce6f63, 0xffce6f63, 0xffd07165, 0xffd07165, 0xffd07165, 0xffd37168, 0xffd6716b, + 0xffd6716b, 0xffd6736b, 0xffd6736b, 0xffd6756b, 0xffd6756b, 0xffd6756b, 0xffd6756b, 0xffd6776b, + 0xffd6776b, 0xffd6786b, 0xffd6786b, 0xffd6796e, 0xffd6796e, 0xffd6796e, 0xffd6796e, 0xffd67973, + 0xffd67973, 0xffd67973, 0xffd67973, 0xffd67973, 0xffd67973, 0xffd07770, 0xffc5716b, 0xffb5655a, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff6e3e3c, 0xffa55d5a, 0xffa55d5a, 0xffc5716b, + 0xffd07770, 0xffd67973, 0xffd67973, 0xffd67970, 0xffd67970, 0xffd67970, 0xffd67970, 0xffd6796b, + 0xffd6796b, 0xffd6786b, 0xffd6786b, 0xffd6776b, 0xffd6776b, 0xffd6756b, 0xffd6756b, 0xffd6756b, + 0xffd6756b, 0xffd6746b, 0xffd6746b, 0xffd6736b, 0xffd6716b, 0xffd6716b, 0xffd6716b, 0xffce7063, + 0xffce7063, 0xffce7063, 0xffce7063, 0xffce6d63, 0xffce6d63, 0xffce6d63, 0xffce6d63, 0xffce6c63, + 0xffce6b63, 0xffce6b63, 0xffce6b63, 0xffce695a, 0xffce685a, 0xffce685a, 0xffce675a, 0xffc5655a, + 0xffc5655a, 0xffc5645a, 0xffc5645a, 0xffc56258, 0xffc56258, 0xffc56258, 0xffc56152, 0xffc55e52, + 0xffc55e52, 0xffc55e52, 0xffc55e52, 0xffc55d52, 0xffc55d52, 0xffc55c52, 0xffc55a52, 0xffbd594a, + 0xffbd594a, 0xffbd594a, 0xffbd564a, 0xffbd554a, 0xffbd554a, 0xffbd554a, 0xffbd554a, 0xffbd544a, + 0xffbd524a, 0xffbd514a, 0xffbd514a, 0xffba5042, 0xffba5042, 0xffba5042, 0xffb84e42, 0xffb84d42, + 0xffb84d42, 0xffb84d42, 0xffb84d42, 0xffb54a3c, 0xffb54a3c, 0xffb5493a, 0xffb5493a, 0xffb5483a, + 0xffb5483a, 0xffb5463a, 0xffb5453a, 0xffb5433a, 0xffb5453a, 0xffb5433a, 0xffb5433a, 0xffb54237, + 0xffb54237, 0xffb54131, 0xffb54131, 0xffad3f31, 0xffad3f31, 0xffad3f31, 0xffad3e31, 0xffad3d31, + 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3a2c, + 0xffad3a2c, 0xffad3a2c, 0xffad3a2c, 0xffad392c, 0xffad392c, 0xffad392c, 0xffad392c, 0xffad392c, + 0xffad392c, 0xffad392c, 0xffad392c, 0xffad3a2c, 0xffad3a2c, 0xffad3a2c, 0xffad3a2c, 0xffad3d31, + 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3e31, 0xffad3e31, + 0xffad3f31, 0xffad3f31, 0xffad3f31, 0xffb54237, 0xffb54237, 0xffb54237, 0xffb54237, 0xffb5453a, + 0xffb5453a, 0xffb5453a, 0xffb5453a, 0xffb5463a, 0xffb5483a, 0xffb5483a, 0xffb5493a, 0xffb54a3c, + 0xffb54a3c, 0xffb54c3f, 0xffb54c3f, 0xffb54d42, 0xffb54d42, 0xffb54d42, 0xffb54d42, 0xffbd4e47, + 0xffbd5045, 0xffbd5045, 0xffbd5142, 0xffbd524a, 0xffbd544a, 0xffbd544a, 0xffbd544a, 0xffbd554a, + 0xffbd564a, 0xffbd564a, 0xffbd564a, 0xffc0594d, 0xffc0594d, 0xffc0594d, 0xffc35950, 0xffc55c52, + 0xffc55c52, 0xffc55d52, 0xffc55d52, 0xffc55e52, 0xffc55e52, 0xffc56052, 0xffc56052, 0xffc5615a, + 0xffc56258, 0xffc56258, 0xffc56258, 0xffc8655a, 0xffcb655a, 0xffc8655a, 0xffcb655a, 0xffce675d, + 0xffce6860, 0xffce6963, 0xffce6963, 0xffce6b63, 0xffce6b63, 0xffce6c63, 0xffce6d63, 0xffce6d63, + 0xffce6f63, 0xffce6f63, 0xffce7063, 0xffd07165, 0xffd07165, 0xffd07165, 0xffd07165, 0xffd6716b, + 0xffd6736b, 0xffd6736b, 0xffd6746b, 0xffd6756b, 0xffd6756b, 0xffd6756b, 0xffd6756b, 0xffd6756b, + 0xffd6776b, 0xffd6776b, 0xffd6786b, 0xffd6796e, 0xffd6796e, 0xffd6796e, 0xffd67970, 0xffd67973, + 0xffd67973, 0xffd67973, 0xffd67973, 0xffd67973, 0xffd67973, 0xffd07770, 0xffc5716b, 0xffb5655a, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff6e3e3c, 0xffa55d5a, 0xffa55d5a, 0xffc5716b, + 0xffd07770, 0xffd67973, 0xffd67973, 0xffd67970, 0xffd67970, 0xffd67970, 0xffd6796e, 0xffd6796b, + 0xffd6796b, 0xffd6786b, 0xffd6776b, 0xffd6776b, 0xffd6776b, 0xffd6756b, 0xffd6756b, 0xffd6756b, + 0xffd6756b, 0xffd6746b, 0xffd6736b, 0xffd6716b, 0xffd6736b, 0xffd6716b, 0xffd6716b, 0xffce7063, + 0xffce7063, 0xffce7063, 0xffce6f63, 0xffce6d63, 0xffce6d63, 0xffce6d63, 0xffce6d63, 0xffce6c63, + 0xffce6b63, 0xffce6b63, 0xffce6b63, 0xffce695a, 0xffce695a, 0xffce675a, 0xffce675a, 0xffc5655a, + 0xffc5655a, 0xffc5645a, 0xffc5625a, 0xffc56258, 0xffc56258, 0xffc56152, 0xffc56152, 0xffc55e52, + 0xffc55e52, 0xffc55e52, 0xffc55e52, 0xffc55d52, 0xffc55d52, 0xffc55a52, 0xffc55a52, 0xffbd594a, + 0xffbd594a, 0xffbd584a, 0xffbd564a, 0xffbd554a, 0xffbd554a, 0xffbd554a, 0xffbd554a, 0xffbd544a, + 0xffbd524a, 0xffbd524a, 0xffbd514a, 0xffba5042, 0xffba5042, 0xffba5042, 0xffb54d42, 0xffb84d42, + 0xffb84d42, 0xffb84d42, 0xffb84d42, 0xffb54c3f, 0xffb5493a, 0xffb5493a, 0xffb5493a, 0xffb5483a, + 0xffb5483a, 0xffb5463a, 0xffb5463a, 0xffb5453a, 0xffb5433a, 0xffb5433a, 0xffb5433a, 0xffb54237, + 0xffb54237, 0xffb54131, 0xffb54131, 0xffad3f31, 0xffad3f31, 0xffad3e31, 0xffad3e31, 0xffad3d31, + 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3a2c, + 0xffad3a2c, 0xffad3a2c, 0xffad3929, 0xffad392c, 0xffad392c, 0xffad392c, 0xffad392c, 0xffad392c, + 0xffad392c, 0xffad392c, 0xffad392c, 0xffad3929, 0xffad3a2c, 0xffad3a2c, 0xffad3b2f, 0xffad3d31, + 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3e31, 0xffad3e31, + 0xffad3f31, 0xffad3f31, 0xffad3f31, 0xffb54237, 0xffb54237, 0xffb54237, 0xffb54237, 0xffb5453a, + 0xffb5453a, 0xffb5453a, 0xffb5453a, 0xffb5463a, 0xffb5463a, 0xffb5483a, 0xffb5483a, 0xffb5493a, + 0xffb54a3c, 0xffb54c3f, 0xffb54c3f, 0xffb54d42, 0xffb54d42, 0xffb54d42, 0xffb84e42, 0xffbd4e47, + 0xffbd5045, 0xffbd5045, 0xffbd5142, 0xffbd514a, 0xffbd544a, 0xffbd544a, 0xffbd544a, 0xffbd554a, + 0xffbd564a, 0xffbd564a, 0xffbd584a, 0xffc0594d, 0xffc0594d, 0xffc0594d, 0xffc0594d, 0xffc55c52, + 0xffc55d52, 0xffc55d52, 0xffc55d52, 0xffc55e52, 0xffc55e52, 0xffc56052, 0xffc56152, 0xffc5615a, + 0xffc5615a, 0xffc56258, 0xffc56258, 0xffc8655a, 0xffc8655a, 0xffcb655a, 0xffcb655a, 0xffce675d, + 0xffce6860, 0xffce6860, 0xffce6963, 0xffce6b63, 0xffce6b63, 0xffce6c63, 0xffce6d63, 0xffce6f63, + 0xffce6f63, 0xffce6f63, 0xffce7063, 0xffd07165, 0xffd07165, 0xffd07165, 0xffd37168, 0xffd6716b, + 0xffd6736b, 0xffd6736b, 0xffd6736b, 0xffd6756b, 0xffd6756b, 0xffd6756b, 0xffd6756b, 0xffd6756b, + 0xffd6776b, 0xffd6776b, 0xffd6786b, 0xffd6796e, 0xffd6796e, 0xffd6796e, 0xffd6796e, 0xffd67973, + 0xffd67973, 0xffd67973, 0xffd67973, 0xffd67973, 0xffd67973, 0xffd07770, 0xffc5716b, 0xffb5655a, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff6e3e3c, 0xffa55d5a, 0xffa55d5a, 0xffce716b, + 0xffd37770, 0xffd67973, 0xffd67973, 0xffd67970, 0xffd67970, 0xffd67970, 0xffd67970, 0xffd6796b, + 0xffd6786b, 0xffd6786b, 0xffd6786b, 0xffd6776b, 0xffd6776b, 0xffd6756b, 0xffd6756b, 0xffd6756b, + 0xffd6756b, 0xffd6746b, 0xffd6746b, 0xffd67168, 0xffd67168, 0xffd67168, 0xffd67168, 0xffce7063, + 0xffce7063, 0xffce7063, 0xffce7063, 0xffce6d63, 0xffce6d63, 0xffce6d63, 0xffce6d63, 0xffce6c63, + 0xffce6b63, 0xffce6b63, 0xffce6b63, 0xffce695a, 0xffce685a, 0xffce675a, 0xffce675a, 0xffc5655a, + 0xffc5655a, 0xffc5645a, 0xffc5645a, 0xffc56158, 0xffc56158, 0xffc56155, 0xffc56155, 0xffc55e52, + 0xffc55e52, 0xffc55e52, 0xffc55e52, 0xffc55d52, 0xffc55c52, 0xffc55c52, 0xffc55a52, 0xffbd594a, + 0xffbd594a, 0xffbd584a, 0xffbd584a, 0xffbd554a, 0xffbd554a, 0xffbd554a, 0xffbd554a, 0xffbd544a, + 0xffbd524a, 0xffbd514a, 0xffbd514a, 0xffba5042, 0xffba5042, 0xffb84e42, 0xffb84e42, 0xffb54d42, + 0xffb54d42, 0xffb54d42, 0xffb54d42, 0xffb54a3f, 0xffb54a3f, 0xffb5493a, 0xffb5493a, 0xffb5483a, + 0xffb5483a, 0xffb5463a, 0xffb5453a, 0xffb5453a, 0xffb5433a, 0xffb5433a, 0xffb5423a, 0xffb24137, + 0xffaf4134, 0xffaf4134, 0xffaf4134, 0xffad3f31, 0xffad3f31, 0xffad3e31, 0xffad3e31, 0xffad3d31, + 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3b2f, 0xffad3b2f, 0xffad3b2f, 0xffad3a2c, 0xffad3929, + 0xffad3929, 0xffad3929, 0xffad3929, 0xffad3929, 0xffad3929, 0xffad3929, 0xffad3929, 0xffad3929, + 0xffad3929, 0xffad3929, 0xffad3929, 0xffad3929, 0xffad3a2c, 0xffad3a2c, 0xffad3a2c, 0xffad3a2c, + 0xffad3b2f, 0xffad3b2f, 0xffad3b2f, 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3e31, + 0xffad3f31, 0xffad3f31, 0xffad3f31, 0xffb54131, 0xffb54131, 0xffb54234, 0xffb54337, 0xffb5453a, + 0xffb5453a, 0xffb5453a, 0xffb5453a, 0xffb5463a, 0xffb5483a, 0xffb5483a, 0xffb5483a, 0xffb5493a, + 0xffb54a3c, 0xffb54c3f, 0xffb54c3f, 0xffb54d42, 0xffb54d42, 0xffb54d42, 0xffb54d42, 0xffbd4e47, + 0xffbd5045, 0xffbd5045, 0xffbd5142, 0xffbd524a, 0xffbd524a, 0xffbd544a, 0xffbd544a, 0xffbd554a, + 0xffbd564a, 0xffbd564a, 0xffbd564a, 0xffc0594d, 0xffc0594d, 0xffc0594d, 0xffc35950, 0xffc55c52, + 0xffc55d52, 0xffc55d52, 0xffc55d52, 0xffc55e52, 0xffc55e52, 0xffc55e52, 0xffc56152, 0xffc5615a, + 0xffc56258, 0xffc56258, 0xffc56258, 0xffc8655a, 0xffc8655a, 0xffcb655a, 0xffcb655a, 0xffce685d, + 0xffce685d, 0xffce695a, 0xffce695a, 0xffce6b63, 0xffce6c63, 0xffce6c63, 0xffce6c63, 0xffce6d63, + 0xffce6d63, 0xffce6d63, 0xffce6d63, 0xffd07165, 0xffd07165, 0xffd07165, 0xffd07165, 0xffd6716b, + 0xffd6716b, 0xffd6736b, 0xffd6736b, 0xffd6756b, 0xffd6756b, 0xffd6756b, 0xffd6756b, 0xffd6756b, + 0xffd6776b, 0xffd6776b, 0xffd6786b, 0xffd6796e, 0xffd6796e, 0xffd67970, 0xffd6796e, 0xffd67970, + 0xffd67970, 0xffd67970, 0xffd67970, 0xffd67973, 0xffd67973, 0xffd37770, 0xffce716b, 0xffb5655a, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff6e3e3c, 0xffa55d5a, 0xffa55d5a, 0xffce716b, + 0xffd37770, 0xffd67973, 0xffd67973, 0xffd67970, 0xffd67970, 0xffd67970, 0xffd67970, 0xffd6796b, + 0xffd6796b, 0xffd6786b, 0xffd6776b, 0xffd6776b, 0xffd6776b, 0xffd6756b, 0xffd6756b, 0xffd6756b, + 0xffd6756b, 0xffd6746b, 0xffd6746b, 0xffd67168, 0xffd67168, 0xffd67168, 0xffd67165, 0xffce7063, + 0xffce7063, 0xffce7063, 0xffce6f63, 0xffce6d63, 0xffce6d63, 0xffce6d63, 0xffce6d63, 0xffce6c63, + 0xffce6c63, 0xffce6b63, 0xffce6963, 0xffce695a, 0xffce695a, 0xffce675a, 0xffce675a, 0xffc5655a, + 0xffc5655a, 0xffc5645a, 0xffc5625a, 0xffc56158, 0xffc56158, 0xffc56158, 0xffc56155, 0xffc55e52, + 0xffc55e52, 0xffc55e52, 0xffc55e52, 0xffc55d52, 0xffc55c52, 0xffc55c52, 0xffc55a52, 0xffbd594a, + 0xffbd594a, 0xffbd584a, 0xffbd564a, 0xffbd554a, 0xffbd554a, 0xffbd554a, 0xffbd554a, 0xffbd544a, + 0xffbd544a, 0xffbd524a, 0xffbd514a, 0xffba5042, 0xffba5042, 0xffb84e42, 0xffb54d42, 0xffb54d42, + 0xffb54d42, 0xffb54d42, 0xffb54d42, 0xffb54a3f, 0xffb5493a, 0xffb5493a, 0xffb5493a, 0xffb5483a, + 0xffb5463a, 0xffb5463a, 0xffb5453a, 0xffb5453a, 0xffb5433a, 0xffb5433a, 0xffb5433a, 0xffb24137, + 0xffb24137, 0xffaf4134, 0xffaf4134, 0xffad3f31, 0xffad3f31, 0xffad3e31, 0xffad3d31, 0xffad3d31, + 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3b2f, 0xffad3b2f, 0xffad3b2f, 0xffad3a2c, 0xffad3929, + 0xffad3929, 0xffad3929, 0xffad3929, 0xffad3929, 0xffad3929, 0xffad3929, 0xffad3929, 0xffad3929, + 0xffad3929, 0xffad3929, 0xffad3929, 0xffad3929, 0xffad3929, 0xffad3a2c, 0xffad3a2c, 0xffad3b2f, + 0xffad3b2f, 0xffad3b2f, 0xffad3b2f, 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3e31, + 0xffad3e31, 0xffad3f31, 0xffad3f31, 0xffb54131, 0xffb54234, 0xffb54234, 0xffb54337, 0xffb5453a, + 0xffb5453a, 0xffb5453a, 0xffb5453a, 0xffb5463a, 0xffb5463a, 0xffb5483a, 0xffb5483a, 0xffb5493a, + 0xffb54a3c, 0xffb54c3f, 0xffb54c3f, 0xffb54d42, 0xffb54d42, 0xffb54d42, 0xffb54d42, 0xffbd4e47, + 0xffbd5045, 0xffbd5045, 0xffbd5045, 0xffbd514a, 0xffbd524a, 0xffbd544a, 0xffbd544a, 0xffbd554a, + 0xffbd554a, 0xffbd564a, 0xffbd564a, 0xffc0594d, 0xffc0594d, 0xffc0594d, 0xffc35950, 0xffc55c52, + 0xffc55c52, 0xffc55d52, 0xffc55d52, 0xffc55e52, 0xffc55e52, 0xffc55e52, 0xffc56052, 0xffc5615a, + 0xffc5615a, 0xffc56258, 0xffc56258, 0xffc8655a, 0xffc8655a, 0xffcb655a, 0xffcb655a, 0xffce685d, + 0xffce685d, 0xffce695a, 0xffce685d, 0xffce6b63, 0xffce6c63, 0xffce6c63, 0xffce6d63, 0xffce6d63, + 0xffce6d63, 0xffce6d63, 0xffce6d63, 0xffd07165, 0xffd07165, 0xffd07165, 0xffd37168, 0xffd6716b, + 0xffd6736b, 0xffd6736b, 0xffd6746b, 0xffd6756b, 0xffd6756b, 0xffd6756b, 0xffd6756b, 0xffd6756b, + 0xffd6776b, 0xffd6786b, 0xffd6786b, 0xffd6796e, 0xffd6796e, 0xffd6796e, 0xffd67970, 0xffd6796e, + 0xffd67970, 0xffd67970, 0xffd67970, 0xffd67973, 0xffd67973, 0xffd37770, 0xffce716b, 0xffb5655a, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff6e3e3c, 0xffa55d5a, 0xffa55d5a, 0xffce716b, + 0xffd37770, 0xffd67973, 0xffd67973, 0xffd67970, 0xffd67970, 0xffd6796e, 0xffd6796e, 0xffd6796b, + 0xffd6796b, 0xffd6786b, 0xffd6776b, 0xffd6776b, 0xffd6776b, 0xffd6756b, 0xffd6756b, 0xffd6756b, + 0xffd6756b, 0xffd6756b, 0xffd6746b, 0xffd67168, 0xffd67168, 0xffd67168, 0xffd67168, 0xffce7163, + 0xffce7063, 0xffce7063, 0xffce6f63, 0xffce6d63, 0xffce6d63, 0xffce6d63, 0xffce6d63, 0xffce6c63, + 0xffce6b63, 0xffce6b63, 0xffce6b63, 0xffce695a, 0xffce695a, 0xffce675a, 0xffce675a, 0xffc5655a, + 0xffc5655a, 0xffc5645a, 0xffc5645a, 0xffc56158, 0xffc56158, 0xffc56158, 0xffc56155, 0xffc55e52, + 0xffc55e52, 0xffc55e52, 0xffc55e52, 0xffc55d52, 0xffc55c52, 0xffc55a52, 0xffc55a52, 0xffbd594a, + 0xffbd594a, 0xffbd584a, 0xffbd564a, 0xffbd554a, 0xffbd554a, 0xffbd554a, 0xffbd554a, 0xffbd544a, + 0xffbd524a, 0xffbd524a, 0xffbd514a, 0xffba5042, 0xffba5042, 0xffba5042, 0xffb84e42, 0xffb54d42, + 0xffb54d42, 0xffb54d42, 0xffb54d42, 0xffb54a3f, 0xffb54a3f, 0xffb5493a, 0xffb5493a, 0xffb5483a, + 0xffb5483a, 0xffb5463a, 0xffb5453a, 0xffb5453a, 0xffb5433a, 0xffb5433a, 0xffb5433a, 0xffb24137, + 0xffaf4134, 0xffaf4134, 0xffaf4134, 0xffad3f31, 0xffad3f31, 0xffad3e31, 0xffad3e31, 0xffad3d31, + 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3b2f, 0xffad3b2f, 0xffad3b2f, 0xffad3a2c, 0xffad3929, + 0xffad3929, 0xffad3929, 0xffad3929, 0xffad3929, 0xffad3929, 0xffad3929, 0xffad3929, 0xffad3929, + 0xffad3929, 0xffad3929, 0xffad3929, 0xffad3929, 0xffad3929, 0xffad3a2c, 0xffad3a2c, 0xffad3b2f, + 0xffad3b2f, 0xffad3b2f, 0xffad3b2f, 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3e31, + 0xffad3f31, 0xffad3f31, 0xffad3f31, 0xffb54131, 0xffb54234, 0xffb54234, 0xffb54337, 0xffb5453a, + 0xffb5453a, 0xffb5453a, 0xffb5453a, 0xffb5463a, 0xffb5483a, 0xffb5483a, 0xffb5483a, 0xffb5493a, + 0xffb54a3c, 0xffb54a3c, 0xffb54c3f, 0xffb54d42, 0xffb54d42, 0xffb54d42, 0xffb54d42, 0xffbd5045, + 0xffbd5045, 0xffbd5045, 0xffbd5142, 0xffbd514a, 0xffbd524a, 0xffbd544a, 0xffbd544a, 0xffbd554a, + 0xffbd564a, 0xffbd564a, 0xffbd564a, 0xffc0594d, 0xffc0594d, 0xffc0594d, 0xffc35950, 0xffc55a52, + 0xffc55d52, 0xffc55d52, 0xffc55d52, 0xffc55e52, 0xffc55e52, 0xffc55e52, 0xffc56152, 0xffc5615a, + 0xffc56258, 0xffc56258, 0xffc56455, 0xffc8655a, 0xffc8655a, 0xffcb655a, 0xffcb655a, 0xffce685d, + 0xffce685d, 0xffce695a, 0xffce695a, 0xffce6b63, 0xffce6b63, 0xffce6c63, 0xffce6d63, 0xffce6d63, + 0xffce6d63, 0xffce6d63, 0xffce6d63, 0xffd07165, 0xffd07165, 0xffd07165, 0xffd37168, 0xffd6716b, + 0xffd6716b, 0xffd6736b, 0xffd6736b, 0xffd6756b, 0xffd6756b, 0xffd6756b, 0xffd6756b, 0xffd6776b, + 0xffd6756b, 0xffd6786b, 0xffd6786b, 0xffd6796e, 0xffd6796e, 0xffd6796e, 0xffd67970, 0xffd6796e, + 0xffd67970, 0xffd67970, 0xffd67970, 0xffd67973, 0xffd67973, 0xffd37770, 0xffce716b, 0xffb5655a, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff6e3e3c, 0xffa55d5a, 0xffa55d5a, 0xffce716b, + 0xffd37770, 0xffd67973, 0xffd67973, 0xffd67970, 0xffd67970, 0xffd67970, 0xffd67970, 0xffd6796b, + 0xffd6786b, 0xffd6786b, 0xffd6776b, 0xffd6786b, 0xffd6756b, 0xffd6776b, 0xffd6756b, 0xffd6756b, + 0xffd6746b, 0xffd6746b, 0xffd6736b, 0xffd67168, 0xffd67168, 0xffd67168, 0xffd67168, 0xffce7063, + 0xffce7063, 0xffce7063, 0xffce7063, 0xffce6d63, 0xffce6d63, 0xffce6d63, 0xffce6d63, 0xffce6c63, + 0xffce6b63, 0xffce6b63, 0xffce6963, 0xffce695a, 0xffce685a, 0xffce675a, 0xffce675a, 0xffc5655a, + 0xffc5655a, 0xffc5655a, 0xffc5645a, 0xffc56158, 0xffc56158, 0xffc56158, 0xffc56155, 0xffc56052, + 0xffc55e52, 0xffc55e52, 0xffc55e52, 0xffc55d52, 0xffc55c52, 0xffc55c52, 0xffc55a52, 0xffbd594a, + 0xffbd594a, 0xffbd584a, 0xffbd584a, 0xffbd554a, 0xffbd554a, 0xffbd554a, 0xffbd554a, 0xffbd544a, + 0xffbd524a, 0xffbd524a, 0xffbd514a, 0xffba5042, 0xffba5042, 0xffba5042, 0xffb54d42, 0xffb54d42, + 0xffb54d42, 0xffb54d42, 0xffb54d42, 0xffb54a3f, 0xffb54a3f, 0xffb5493a, 0xffb5493a, 0xffb5483a, + 0xffb5463a, 0xffb5463a, 0xffb5453a, 0xffb5453a, 0xffb5433a, 0xffb5433a, 0xffb5423a, 0xffb24137, + 0xffaf4134, 0xffaf4134, 0xffaf4134, 0xffad3f31, 0xffad3f31, 0xffad3e31, 0xffad3e31, 0xffad3d31, + 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3b2f, 0xffad3b2f, 0xffad3a2c, 0xffad3a2c, 0xffad3929, + 0xffad3929, 0xffad3929, 0xffad3929, 0xffad3929, 0xffad3929, 0xffad3929, 0xffad3929, 0xffad3929, + 0xffad3929, 0xffad3929, 0xffad3929, 0xffad3929, 0xffad3a2c, 0xffad3a2c, 0xffad3b2f, 0xffad3b2f, + 0xffad3b2f, 0xffad3b2f, 0xffad3b2f, 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3e31, + 0xffad3f31, 0xffad3f31, 0xffad3f31, 0xffb54131, 0xffb54131, 0xffb54234, 0xffb54234, 0xffb5453a, + 0xffb5453a, 0xffb5453a, 0xffb5453a, 0xffb5463a, 0xffb5483a, 0xffb5483a, 0xffb5483a, 0xffb5493a, + 0xffb54a3c, 0xffb54a3c, 0xffb54c3f, 0xffb54d42, 0xffb54d42, 0xffb54d42, 0xffb54d42, 0xffbd4e47, + 0xffbd5045, 0xffbd5045, 0xffbd5142, 0xffbd524a, 0xffbd524a, 0xffbd544a, 0xffbd544a, 0xffbd554a, + 0xffbd564a, 0xffbd564a, 0xffbd584a, 0xffc0594d, 0xffc0594d, 0xffc0594d, 0xffc0594d, 0xffc55a52, + 0xffc55c52, 0xffc55d52, 0xffc55d52, 0xffc55e52, 0xffc55e52, 0xffc55e52, 0xffc56152, 0xffc56258, + 0xffc56258, 0xffc56258, 0xffc56455, 0xffc8655a, 0xffc8655a, 0xffcb655a, 0xffcb655a, 0xffce685d, + 0xffce685d, 0xffce695a, 0xffce695a, 0xffce6b63, 0xffce6b63, 0xffce6c63, 0xffce6d63, 0xffce6d63, + 0xffce6d63, 0xffce6d63, 0xffce6d63, 0xffd07165, 0xffd07165, 0xffd07165, 0xffd07165, 0xffd6716b, + 0xffd6716b, 0xffd6736b, 0xffd6746b, 0xffd6756b, 0xffd6756b, 0xffd6756b, 0xffd6756b, 0xffd6756b, + 0xffd6776b, 0xffd6786b, 0xffd6776b, 0xffd6796e, 0xffd6796e, 0xffd6796e, 0xffd67970, 0xffd67970, + 0xffd67970, 0xffd67970, 0xffd67970, 0xffd67973, 0xffd67973, 0xffd37770, 0xffce716b, 0xffb5655a, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff6e3e37, 0xffa55d52, 0xffa55d52, 0xffc57163, + 0xffd0776e, 0xffd67973, 0xffd67973, 0xffd67970, 0xffd6796e, 0xffd6796e, 0xffd6796e, 0xffd6786b, + 0xffd6786b, 0xffd6786b, 0xffd6776b, 0xffd6756b, 0xffd6756b, 0xffd6756b, 0xffd6756b, 0xffd6756b, + 0xffd6756b, 0xffd6746b, 0xffd6746b, 0xffd37168, 0xffd37168, 0xffd37168, 0xffd07165, 0xffce7063, + 0xffce7063, 0xffce6f63, 0xffce6f63, 0xffce6d63, 0xffce6d63, 0xffce6d63, 0xffce6c63, 0xffce6960, + 0xffce6960, 0xffce6960, 0xffce695d, 0xffcb685a, 0xffcb685a, 0xffc8675a, 0xffc8675a, 0xffc5655a, + 0xffc5655a, 0xffc5645a, 0xffc5625a, 0xffc56158, 0xffc56158, 0xffc56155, 0xffc56155, 0xffc56052, + 0xffc55e52, 0xffc55e52, 0xffc55d52, 0xffc55c52, 0xffc55c52, 0xffc55a52, 0xffc55952, 0xffbd594a, + 0xffbd584a, 0xffbd584a, 0xffbd564a, 0xffbd554a, 0xffbd554a, 0xffbd554a, 0xffbd554a, 0xffbd544a, + 0xffbd524a, 0xffbd514a, 0xffbd514a, 0xffb55042, 0xffb55042, 0xffb55042, 0xffb54e42, 0xffb54d42, + 0xffb54c42, 0xffb54c42, 0xffb54a42, 0xffb5493f, 0xffb5493c, 0xffb5493c, 0xffb5493c, 0xffb5483a, + 0xffb5483a, 0xffb5463a, 0xffb5453a, 0xffb5453a, 0xffb5453a, 0xffb5453a, 0xffb5453a, 0xffb24137, + 0xffaf4134, 0xffaf4134, 0xffaf4134, 0xffad3f31, 0xffad3f31, 0xffad3e31, 0xffad3d31, 0xffad3d31, + 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3b31, 0xffad3a31, 0xffad3a31, 0xffad3931, 0xffad392c, + 0xffad392c, 0xffad392c, 0xffad392c, 0xffaa3929, 0xffaa3929, 0xffa73929, 0xffaa3929, 0xffa73929, + 0xffaa3929, 0xffaa3929, 0xffaa3929, 0xffad392c, 0xffad392c, 0xffad392c, 0xffad392c, 0xffad3a31, + 0xffad3a31, 0xffad3b31, 0xffad3b31, 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3e31, + 0xffad3f31, 0xffad3f31, 0xffad3f31, 0xffad4131, 0xffaf4234, 0xffaf4234, 0xffb24337, 0xffb5453a, + 0xffb5453a, 0xffb5453a, 0xffb5453a, 0xffb5483a, 0xffb5483a, 0xffb5483a, 0xffb5483a, 0xffb54942, + 0xffb54a3c, 0xffb54a3c, 0xffb54a3c, 0xffb54d42, 0xffb54d42, 0xffb54d42, 0xffb54d42, 0xffba5045, + 0xffba5045, 0xffba5045, 0xffbd5142, 0xffbd514a, 0xffbd524a, 0xffbd544a, 0xffbd544a, 0xffbd554a, + 0xffbd554a, 0xffbd564a, 0xffbd584a, 0xffbd594d, 0xffbd594d, 0xffbd594d, 0xffbd5950, 0xffc55a52, + 0xffc55a52, 0xffc55c52, 0xffc55d52, 0xffc55e52, 0xffc55e52, 0xffc56052, 0xffc56052, 0xffc5615a, + 0xffc56258, 0xffc56258, 0xffc56258, 0xffc5655a, 0xffc5655a, 0xffc5655a, 0xffc5655a, 0xffcb685a, + 0xffcb685a, 0xffcb685a, 0xffce695a, 0xffce6b63, 0xffce6b63, 0xffce6b63, 0xffce6c63, 0xffce6d63, + 0xffce6d63, 0xffce6d63, 0xffce6d63, 0xffce6f65, 0xffce6f65, 0xffce7068, 0xffce7068, 0xffd6716b, + 0xffd6716b, 0xffd6736b, 0xffd6746b, 0xffd6756b, 0xffd6756b, 0xffd6756b, 0xffd6756b, 0xffd6756b, + 0xffd6776b, 0xffd6786b, 0xffd6786b, 0xffd6796b, 0xffd6796b, 0xffd6796b, 0xffd6796b, 0xffd6796e, + 0xffd6796e, 0xffd6796e, 0xffd67970, 0xffd67973, 0xffd67973, 0xffd0776e, 0xffc57163, 0xffb5655a, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff6e3e37, 0xffa55d52, 0xffa55d52, 0xffc57163, + 0xffd0776e, 0xffd67973, 0xffd67973, 0xffd67970, 0xffd6796e, 0xffd6796e, 0xffd6796e, 0xffd6786b, + 0xffd6786b, 0xffd6786b, 0xffd6786b, 0xffd6756b, 0xffd6756b, 0xffd6756b, 0xffd6756b, 0xffd6756b, + 0xffd6756b, 0xffd6746b, 0xffd6736b, 0xffd37168, 0xffd37168, 0xffd37168, 0xffd37168, 0xffce7063, + 0xffce7063, 0xffce6f63, 0xffce6f63, 0xffce6d63, 0xffce6d63, 0xffce6c63, 0xffce6b63, 0xffce6960, + 0xffce6960, 0xffce6960, 0xffce695d, 0xffcb685a, 0xffcb685a, 0xffcb685a, 0xffc8675a, 0xffc5655a, + 0xffc5655a, 0xffc5645a, 0xffc5645a, 0xffc56158, 0xffc56158, 0xffc56155, 0xffc56155, 0xffc56052, + 0xffc55e52, 0xffc55e52, 0xffc55d52, 0xffc55c52, 0xffc55a52, 0xffc55a52, 0xffc55a52, 0xffbd594a, + 0xffbd584a, 0xffbd584a, 0xffbd584a, 0xffbd554a, 0xffbd554a, 0xffbd554a, 0xffbd554a, 0xffbd544a, + 0xffbd524a, 0xffbd524a, 0xffbd514a, 0xffb55042, 0xffb55042, 0xffb54e42, 0xffb54d42, 0xffb54d42, + 0xffb54c42, 0xffb54c42, 0xffb54c42, 0xffb5493f, 0xffb5493c, 0xffb5493c, 0xffb5493c, 0xffb5483a, + 0xffb5463a, 0xffb5463a, 0xffb5463a, 0xffb5453a, 0xffb5453a, 0xffb5453a, 0xffb5453a, 0xffb24137, + 0xffb24137, 0xffaf4134, 0xffaf4134, 0xffad3f31, 0xffad3e31, 0xffad3f31, 0xffad3e31, 0xffad3d31, + 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3b31, 0xffad3a31, 0xffad3a31, 0xffad3931, 0xffad392c, + 0xffad392c, 0xffad392c, 0xffad392c, 0xffaa3929, 0xffaa3929, 0xffaa3929, 0xffaa3929, 0xffa73929, + 0xffaa3929, 0xffaa3929, 0xffaa3929, 0xffad392c, 0xffad392c, 0xffad392f, 0xffad392c, 0xffad3a31, + 0xffad3b31, 0xffad3b31, 0xffad3b31, 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3e31, + 0xffad3f31, 0xffad3f31, 0xffad3f31, 0xffaf4234, 0xffaf4234, 0xffaf4234, 0xffb24337, 0xffb5453a, + 0xffb5453a, 0xffb5453a, 0xffb5453a, 0xffb5463a, 0xffb5483a, 0xffb5483a, 0xffb5483a, 0xffb54942, + 0xffb54a3c, 0xffb54a3c, 0xffb54a3c, 0xffb54d42, 0xffb54d42, 0xffb54d42, 0xffb54d42, 0xffb84e47, + 0xffba5045, 0xffba5045, 0xffbd5142, 0xffbd514a, 0xffbd524a, 0xffbd544a, 0xffbd544a, 0xffbd554a, + 0xffbd564a, 0xffbd564a, 0xffbd564a, 0xffbd594d, 0xffbd594d, 0xffbd594d, 0xffbd5950, 0xffc55a52, + 0xffc55a52, 0xffc55c52, 0xffc55d52, 0xffc55e52, 0xffc55e52, 0xffc56052, 0xffc56152, 0xffc5615a, + 0xffc56258, 0xffc56258, 0xffc56455, 0xffc5655a, 0xffc5655a, 0xffc5655a, 0xffc5655a, 0xffcb685a, + 0xffcb685a, 0xffcb685a, 0xffce695a, 0xffce6963, 0xffce6b63, 0xffce6b63, 0xffce6b63, 0xffce6d63, + 0xffce6d63, 0xffce6d63, 0xffce6d63, 0xffce6f65, 0xffce6f65, 0xffce7068, 0xffce7068, 0xffd6716b, + 0xffd6736b, 0xffd6736b, 0xffd6736b, 0xffd6756b, 0xffd6756b, 0xffd6756b, 0xffd6756b, 0xffd6776b, + 0xffd6776b, 0xffd6786b, 0xffd6786b, 0xffd6796b, 0xffd6796b, 0xffd6796b, 0xffd6796b, 0xffd6796e, + 0xffd6796e, 0xffd67970, 0xffd67970, 0xffd67973, 0xffd67973, 0xffd0776e, 0xffc57163, 0xffb5655a, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff6e3e37, 0xffa55d52, 0xffa55d52, 0xffc57163, + 0xffd0776e, 0xffd67973, 0xffd67973, 0xffd67970, 0xffd67970, 0xffd6796e, 0xffd6796e, 0xffd6786b, + 0xffd6786b, 0xffd6786b, 0xffd6786b, 0xffd6756b, 0xffd6756b, 0xffd6756b, 0xffd6756b, 0xffd6756b, + 0xffd6756b, 0xffd6746b, 0xffd6746b, 0xffd37168, 0xffd37168, 0xffd37168, 0xffd37168, 0xffce7063, + 0xffce7063, 0xffce6f63, 0xffce6f63, 0xffce6d63, 0xffce6d63, 0xffce6c63, 0xffce6c63, 0xffce6960, + 0xffce6960, 0xffce6960, 0xffce695d, 0xffcb685a, 0xffcb685a, 0xffcb685a, 0xffc8675a, 0xffc5655a, + 0xffc5655a, 0xffc5645a, 0xffc5625a, 0xffc56158, 0xffc56158, 0xffc56155, 0xffc56155, 0xffc56052, + 0xffc55e52, 0xffc55e52, 0xffc55e52, 0xffc55c52, 0xffc55c52, 0xffc55a52, 0xffc55a52, 0xffbd594a, + 0xffbd584a, 0xffbd584a, 0xffbd564a, 0xffbd554a, 0xffbd554a, 0xffbd554a, 0xffbd554a, 0xffbd544a, + 0xffbd544a, 0xffbd524a, 0xffbd514a, 0xffb55042, 0xffb55042, 0xffb54e42, 0xffb54e42, 0xffb54d42, + 0xffb54d42, 0xffb54c42, 0xffb54a42, 0xffb5493f, 0xffb5493c, 0xffb5493c, 0xffb5493c, 0xffb5483a, + 0xffb5483a, 0xffb5463a, 0xffb5453a, 0xffb5453a, 0xffb5453a, 0xffb5453a, 0xffb5453a, 0xffb24137, + 0xffaf4134, 0xffaf4134, 0xffaf4134, 0xffad3f31, 0xffad3f31, 0xffad3e31, 0xffad3e31, 0xffad3d31, + 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3b31, 0xffad3b31, 0xffad3a31, 0xffad3a31, 0xffad392c, + 0xffad392c, 0xffad392c, 0xffad392c, 0xffaa3929, 0xffaa3929, 0xffaa3929, 0xffaa3929, 0xffaa3929, + 0xffaa3929, 0xffaa3929, 0xffaa3929, 0xffad392c, 0xffad392c, 0xffad392f, 0xffad392c, 0xffad3a31, + 0xffad3b31, 0xffad3b31, 0xffad3b31, 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3f31, + 0xffad3f31, 0xffad3f31, 0xffad3f31, 0xffad4131, 0xffaf4234, 0xffaf4234, 0xffb24337, 0xffb5453a, + 0xffb5453a, 0xffb5453a, 0xffb5453a, 0xffb5483a, 0xffb5483a, 0xffb5483a, 0xffb5483a, 0xffb54942, + 0xffb54942, 0xffb54a3c, 0xffb54a3c, 0xffb54d42, 0xffb54d42, 0xffb54d42, 0xffb54d42, 0xffb84e47, + 0xffba5045, 0xffba5045, 0xffbd5142, 0xffbd524a, 0xffbd544a, 0xffbd544a, 0xffbd544a, 0xffbd554a, + 0xffbd564a, 0xffbd564a, 0xffbd584a, 0xffbd594d, 0xffbd594d, 0xffbd594d, 0xffbd5950, 0xffc55a52, + 0xffc55c52, 0xffc55c52, 0xffc55d52, 0xffc55e52, 0xffc55e52, 0xffc56052, 0xffc56052, 0xffc5615a, + 0xffc56258, 0xffc56258, 0xffc56455, 0xffc5655a, 0xffc5655a, 0xffc5655a, 0xffc5655a, 0xffc8675a, + 0xffcb685a, 0xffcb685a, 0xffce695a, 0xffce6b63, 0xffce6b63, 0xffce6b63, 0xffce6c63, 0xffce6d63, + 0xffce6d63, 0xffce6d63, 0xffce6d63, 0xffce6f65, 0xffce7068, 0xffce7068, 0xffce7068, 0xffd6716b, + 0xffd6716b, 0xffd6736b, 0xffd6746b, 0xffd6756b, 0xffd6756b, 0xffd6756b, 0xffd6756b, 0xffd6776b, + 0xffd6756b, 0xffd6786b, 0xffd6786b, 0xffd6796b, 0xffd6796b, 0xffd6796b, 0xffd6796b, 0xffd6796e, + 0xffd67970, 0xffd6796e, 0xffd67970, 0xffd67973, 0xffd67973, 0xffd0776e, 0xffc57163, 0xffb5655a, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff6e3e37, 0xffa55d52, 0xffa55d52, 0xffc57163, + 0xffd0776e, 0xffd67973, 0xffd67973, 0xffd67970, 0xffd6796e, 0xffd6796e, 0xffd6796e, 0xffd6786b, + 0xffd6786b, 0xffd6786b, 0xffd6786b, 0xffd6756b, 0xffd6756b, 0xffd6756b, 0xffd6756b, 0xffd6756b, + 0xffd6756b, 0xffd6746b, 0xffd6746b, 0xffd37168, 0xffd37168, 0xffd37168, 0xffd37168, 0xffce7063, + 0xffce7063, 0xffce6f63, 0xffce6f63, 0xffce6d63, 0xffce6d63, 0xffce6c63, 0xffce6c63, 0xffce6960, + 0xffce6960, 0xffce6960, 0xffce695d, 0xffcb685a, 0xffcb685a, 0xffc8675a, 0xffc8675a, 0xffc5655a, + 0xffc5655a, 0xffc5655a, 0xffc5645a, 0xffc56158, 0xffc56158, 0xffc56155, 0xffc56155, 0xffc56052, + 0xffc55e52, 0xffc55e52, 0xffc55e52, 0xffc55d52, 0xffc55a52, 0xffc55a52, 0xffc55952, 0xffbd594a, + 0xffbd584a, 0xffbd584a, 0xffbd584a, 0xffbd554a, 0xffbd554a, 0xffbd554a, 0xffbd554a, 0xffbd544a, + 0xffbd524a, 0xffbd524a, 0xffbd514a, 0xffb55042, 0xffb55042, 0xffb54e42, 0xffb54e42, 0xffb54d42, + 0xffb54c42, 0xffb54c42, 0xffb54c42, 0xffb5493f, 0xffb5493f, 0xffb5493c, 0xffb5493c, 0xffb5483a, + 0xffb5483a, 0xffb5483a, 0xffb5463a, 0xffb5453a, 0xffb5453a, 0xffb5453a, 0xffb5453a, 0xffb24137, + 0xffb24137, 0xffb24137, 0xffaf4134, 0xffad3f31, 0xffad3f31, 0xffad3e31, 0xffad3e31, 0xffad3d31, + 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3b31, 0xffad3b31, 0xffad3a31, 0xffad3a31, 0xffad392f, + 0xffad392c, 0xffad392c, 0xffad392c, 0xffaa3929, 0xffaa3929, 0xffaa3929, 0xffaa3929, 0xffaa3929, + 0xffaa3929, 0xffaa3929, 0xffaa3929, 0xffad392c, 0xffad392c, 0xffad392c, 0xffad392f, 0xffad3a31, + 0xffad3b31, 0xffad3b31, 0xffad3b31, 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3e31, + 0xffad3f31, 0xffad3f31, 0xffad4131, 0xffaf4234, 0xffaf4234, 0xffaf4234, 0xffaf4234, 0xffb5453a, + 0xffb5453a, 0xffb5453a, 0xffb5453a, 0xffb5483a, 0xffb5483a, 0xffb5483a, 0xffb5483a, 0xffb54942, + 0xffb54942, 0xffb54a3c, 0xffb54a3c, 0xffb54d42, 0xffb54d42, 0xffb54d42, 0xffb54d42, 0xffba5045, + 0xffba5045, 0xffba5045, 0xffbd5142, 0xffbd524a, 0xffbd544a, 0xffbd544a, 0xffbd554a, 0xffbd554a, + 0xffbd564a, 0xffbd564a, 0xffbd584a, 0xffbd594d, 0xffbd594d, 0xffbd594d, 0xffbd5950, 0xffc55a52, + 0xffc55c52, 0xffc55c52, 0xffc55d52, 0xffc55e52, 0xffc55e52, 0xffc55e52, 0xffc56152, 0xffc5615a, + 0xffc56258, 0xffc56258, 0xffc56258, 0xffc5655a, 0xffc5655a, 0xffc5655a, 0xffc5655a, 0xffcb685a, + 0xffcb685a, 0xffcb685a, 0xffce695a, 0xffce6963, 0xffce6b63, 0xffce6b63, 0xffce6c63, 0xffce6d63, + 0xffce6d63, 0xffce6d63, 0xffce6d63, 0xffce6f65, 0xffce7068, 0xffce7068, 0xffce7068, 0xffd6716b, + 0xffd6716b, 0xffd6736b, 0xffd6746b, 0xffd6756b, 0xffd6756b, 0xffd6756b, 0xffd6756b, 0xffd6756b, + 0xffd6776b, 0xffd6776b, 0xffd6776b, 0xffd6796b, 0xffd6796b, 0xffd6796b, 0xffd6796b, 0xffd6796e, + 0xffd6796e, 0xffd67970, 0xffd67970, 0xffd67973, 0xffd67973, 0xffd0776e, 0xffc57163, 0xffb5655a, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff6e3e37, 0xffa55d52, 0xffa55d52, 0xffc57163, + 0xffd0776e, 0xffd67973, 0xffd67973, 0xffd67970, 0xffd6796e, 0xffd6796e, 0xffd6796e, 0xffd6786b, + 0xffd6786b, 0xffd6786b, 0xffd6786b, 0xffd6776b, 0xffd6776b, 0xffd6756b, 0xffd6756b, 0xffd6756b, + 0xffd6756b, 0xffd6746b, 0xffd6736b, 0xffd6736b, 0xffd6736b, 0xffd6716b, 0xffd6716b, 0xffce7063, + 0xffce7063, 0xffce6f63, 0xffce6f63, 0xffce6d63, 0xffce6d63, 0xffce6d63, 0xffce6d63, 0xffce6c5d, + 0xffce6b60, 0xffce6963, 0xffce6963, 0xffcb685a, 0xffcb685a, 0xffc8675a, 0xffc8675a, 0xffc5655a, + 0xffc5655a, 0xffc5655a, 0xffc5655a, 0xffc56158, 0xffc56158, 0xffc56158, 0xffc56155, 0xffc56052, + 0xffc55e52, 0xffc55e52, 0xffc55d52, 0xffc55d52, 0xffc55a52, 0xffc55a52, 0xffc55a52, 0xffbd594a, + 0xffbd594a, 0xffbd584d, 0xffbd584d, 0xffbd554a, 0xffbd554a, 0xffbd554a, 0xffbd554a, 0xffbd544a, + 0xffbd544a, 0xffbd524a, 0xffbd514a, 0xffb55042, 0xffb55042, 0xffb55042, 0xffb54e42, 0xffb54d42, + 0xffb54d42, 0xffb54d42, 0xffb54d42, 0xffb54a3f, 0xffb54a3f, 0xffb5493a, 0xffb5493a, 0xffb5483a, + 0xffb5483a, 0xffb5483a, 0xffb5463a, 0xffb5453a, 0xffb5453a, 0xffb5453a, 0xffb5453a, 0xffaf4234, + 0xffaf4234, 0xffaf4234, 0xffad4131, 0xffad3f31, 0xffad3f31, 0xffad3f31, 0xffad3e31, 0xffad3d31, + 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3b31, 0xffad3b31, 0xffad3b31, 0xffad3a31, 0xffad3a2c, + 0xffad3a2c, 0xffad3a2c, 0xffad3a2c, 0xffad392c, 0xffad392c, 0xffad392c, 0xffad392c, 0xffad392c, + 0xffad392c, 0xffad392c, 0xffad392c, 0xffad3931, 0xffad3931, 0xffad3a31, 0xffad3b31, 0xffad3a31, + 0xffad3b31, 0xffad3b31, 0xffad3b31, 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3e31, 0xffad3e37, + 0xffad3f34, 0xffad3f34, 0xffad3f34, 0xffad413a, 0xffad413a, 0xffaf423a, 0xffb2433a, 0xffb5453a, + 0xffb5453a, 0xffb5453a, 0xffb5463a, 0xffb5463a, 0xffb5483a, 0xffb5483a, 0xffb5483a, 0xffb54a3f, + 0xffb54942, 0xffb54a3f, 0xffb54a3f, 0xffb54d42, 0xffb54d42, 0xffb54d42, 0xffb54d42, 0xffba5047, + 0xffba5047, 0xffbd5142, 0xffbd5142, 0xffbd524a, 0xffbd544a, 0xffbd544a, 0xffbd544a, 0xffbd554a, + 0xffbd564a, 0xffbd564a, 0xffbd564a, 0xffc0594d, 0xffc0594d, 0xffc0594d, 0xffc35950, 0xffc55a52, + 0xffc55c52, 0xffc55c52, 0xffc55d52, 0xffc55e52, 0xffc55e52, 0xffc55e52, 0xffc56052, 0xffc5615a, + 0xffc5625a, 0xffc5625a, 0xffc5625a, 0xffc8655a, 0xffc8655a, 0xffc8655a, 0xffc8655a, 0xffce685d, + 0xffce685d, 0xffce685d, 0xffce685d, 0xffce6963, 0xffce6b63, 0xffce6b63, 0xffce6b63, 0xffce6d63, + 0xffce6d63, 0xffce6d63, 0xffce6d63, 0xffce7068, 0xffce7068, 0xffce7068, 0xffce7163, 0xffd6716b, + 0xffd6736b, 0xffd6736b, 0xffd6736b, 0xffd6756b, 0xffd6756b, 0xffd6756b, 0xffd6756b, 0xffd6756b, + 0xffd6776b, 0xffd6776b, 0xffd6786b, 0xffd6796b, 0xffd6796b, 0xffd6796b, 0xffd6796b, 0xffd6796e, + 0xffd67970, 0xffd6796e, 0xffd67970, 0xffd67973, 0xffd67973, 0xffd0776e, 0xffc57163, 0xffb5655a, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff6e3e37, 0xffa55d52, 0xffa55d52, 0xffc57163, + 0xffd0776e, 0xffd67973, 0xffd67973, 0xffd67970, 0xffd67970, 0xffd6796e, 0xffd6796e, 0xffd6796b, + 0xffd6786b, 0xffd6786b, 0xffd6786b, 0xffd6786b, 0xffd6776b, 0xffd6776b, 0xffd6756b, 0xffd6756b, + 0xffd6756b, 0xffd6746b, 0xffd6746b, 0xffd6736b, 0xffd6716b, 0xffd6716b, 0xffd6716b, 0xffce7163, + 0xffce7063, 0xffce6f63, 0xffce6f63, 0xffce6d63, 0xffce6d63, 0xffce6d63, 0xffce6d63, 0xffce6b60, + 0xffce6b60, 0xffce6b60, 0xffce6963, 0xffcb685a, 0xffcb685a, 0xffcb685a, 0xffc8675a, 0xffc5655a, + 0xffc5655a, 0xffc5655a, 0xffc5655a, 0xffc56158, 0xffc56158, 0xffc56155, 0xffc56155, 0xffc56052, + 0xffc55e52, 0xffc55e52, 0xffc55d52, 0xffc55c52, 0xffc55a52, 0xffc55a52, 0xffc55a52, 0xffbd594a, + 0xffbd584d, 0xffbd584d, 0xffbd584d, 0xffbd554a, 0xffbd554a, 0xffbd554a, 0xffbd554a, 0xffbd544a, + 0xffbd544a, 0xffbd524a, 0xffbd514a, 0xffb55042, 0xffb55042, 0xffb55042, 0xffb54e42, 0xffb54d42, + 0xffb54d42, 0xffb54d42, 0xffb54d42, 0xffb54a3f, 0xffb54a3f, 0xffb54a3f, 0xffb5493a, 0xffb5483a, + 0xffb5483a, 0xffb5463a, 0xffb5463a, 0xffb5453a, 0xffb5453a, 0xffb5453a, 0xffb5453a, 0xffb24337, + 0xffaf4234, 0xffaf4234, 0xffad4131, 0xffad3f31, 0xffad3f31, 0xffad3f31, 0xffad3e31, 0xffad3d31, + 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3b31, 0xffad3b31, 0xffad3b31, 0xffad3b31, 0xffad3a2c, + 0xffad3a2c, 0xffad3a2c, 0xffad3a2c, 0xffad392c, 0xffad392c, 0xffad392c, 0xffad392c, 0xffad392c, + 0xffad392c, 0xffad392c, 0xffad392c, 0xffad3a31, 0xffad3a31, 0xffad3a31, 0xffad3b31, 0xffad3b31, + 0xffad3b31, 0xffad3b31, 0xffad3b31, 0xffad3d31, 0xffad3e31, 0xffad3e31, 0xffad3e31, 0xffad3f34, + 0xffad3f34, 0xffad3f34, 0xffad4131, 0xffaf423a, 0xffaf423a, 0xffaf423a, 0xffb2433a, 0xffb5453a, + 0xffb5453a, 0xffb5453a, 0xffb5463a, 0xffb5463a, 0xffb5483a, 0xffb5483a, 0xffb5483a, 0xffb54942, + 0xffb54a3f, 0xffb54a3f, 0xffb54a3f, 0xffb54d42, 0xffb54d42, 0xffb54d42, 0xffb54d42, 0xffba5047, + 0xffba5047, 0xffba5047, 0xffbd5142, 0xffbd524a, 0xffbd544a, 0xffbd544a, 0xffbd544a, 0xffbd554a, + 0xffbd564a, 0xffbd564a, 0xffbd584a, 0xffc0594d, 0xffc0594d, 0xffc0594d, 0xffc35950, 0xffc55a52, + 0xffc55c52, 0xffc55c52, 0xffc55d52, 0xffc55e52, 0xffc55e52, 0xffc55e52, 0xffc56052, 0xffc5615a, + 0xffc5625a, 0xffc5625a, 0xffc5645a, 0xffc8655a, 0xffc8655a, 0xffc8655a, 0xffc8655a, 0xffce685d, + 0xffce685d, 0xffce685d, 0xffce695a, 0xffce6963, 0xffce6b63, 0xffce6b63, 0xffce6c63, 0xffce6d63, + 0xffce6d63, 0xffce6d63, 0xffce6d63, 0xffce7068, 0xffce7068, 0xffce7068, 0xffce7163, 0xffd6716b, + 0xffd6736b, 0xffd6736b, 0xffd6746b, 0xffd6756b, 0xffd6756b, 0xffd6756b, 0xffd6756b, 0xffd6756b, + 0xffd6776b, 0xffd6776b, 0xffd6786b, 0xffd6796b, 0xffd6796b, 0xffd6796b, 0xffd6796b, 0xffd6796e, + 0xffd6796e, 0xffd67970, 0xffd67970, 0xffd67973, 0xffd67973, 0xffd0776e, 0xffc57163, 0xffb5655a, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff6e3e37, 0xffa55d52, 0xffa55d52, 0xffc57163, + 0xffd0776e, 0xffd67973, 0xffd67973, 0xffd67970, 0xffd6796e, 0xffd6796e, 0xffd6796e, 0xffd6786b, + 0xffd6786b, 0xffd6786b, 0xffd6776b, 0xffd6786b, 0xffd6776b, 0xffd6756b, 0xffd6756b, 0xffd6756b, + 0xffd6756b, 0xffd6746b, 0xffd6736b, 0xffd6746b, 0xffd6716b, 0xffd6716b, 0xffd6716b, 0xffce7163, + 0xffce7063, 0xffce6f63, 0xffce6f63, 0xffce6d63, 0xffce6d63, 0xffce6d63, 0xffce6d63, 0xffce6b60, + 0xffce6b60, 0xffce6b60, 0xffce6963, 0xffce695a, 0xffcb685a, 0xffcb685a, 0xffc8675a, 0xffc5655a, + 0xffc5655a, 0xffc5655a, 0xffc5655a, 0xffc56158, 0xffc56158, 0xffc56158, 0xffc56155, 0xffc56052, + 0xffc55e52, 0xffc55e52, 0xffc55d52, 0xffc55d52, 0xffc55c52, 0xffc55a52, 0xffc55a52, 0xffbd594a, + 0xffbd584d, 0xffbd584d, 0xffbd584d, 0xffbd554a, 0xffbd554a, 0xffbd554a, 0xffbd554a, 0xffbd544a, + 0xffbd524a, 0xffbd524a, 0xffbd524a, 0xffb55042, 0xffb55042, 0xffb54e42, 0xffb54e42, 0xffb54d42, + 0xffb54d42, 0xffb54d42, 0xffb54d42, 0xffb54a3f, 0xffb54a3f, 0xffb5493a, 0xffb5493a, 0xffb5483a, + 0xffb5483a, 0xffb5483a, 0xffb5463a, 0xffb5453a, 0xffb5453a, 0xffb5453a, 0xffb5453a, 0xffb24337, + 0xffaf4234, 0xffaf4234, 0xffad4131, 0xffad3f31, 0xffad3f31, 0xffad3f31, 0xffad3f31, 0xffad3d31, + 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3b31, 0xffad3b31, 0xffad3b31, 0xffad3b31, 0xffad3b2f, + 0xffad3b2f, 0xffad3a2c, 0xffad3a2c, 0xffad392c, 0xffad392f, 0xffad392c, 0xffad392c, 0xffad392f, + 0xffad392c, 0xffad392f, 0xffad392f, 0xffad3a31, 0xffad3a31, 0xffad3b31, 0xffad3b31, 0xffad3b31, + 0xffad3b31, 0xffad3b31, 0xffad3b31, 0xffad3d31, 0xffad3e31, 0xffad3e31, 0xffad3e31, 0xffad3f34, + 0xffad3f34, 0xffad3f34, 0xffad4131, 0xffad413a, 0xffaf423a, 0xffaf423a, 0xffb2433a, 0xffb5453a, + 0xffb5453a, 0xffb5463a, 0xffb5463a, 0xffb5483a, 0xffb5483a, 0xffb5483a, 0xffb5483a, 0xffb54942, + 0xffb54942, 0xffb54c3c, 0xffb54a3f, 0xffb54d42, 0xffb54d42, 0xffb54d42, 0xffb54d42, 0xffba5047, + 0xffba5047, 0xffba5047, 0xffba5047, 0xffbd524a, 0xffbd544a, 0xffbd544a, 0xffbd544a, 0xffbd564a, + 0xffbd564a, 0xffbd564a, 0xffbd584a, 0xffc0594d, 0xffc0594d, 0xffc0594d, 0xffc35950, 0xffc55a52, + 0xffc55a52, 0xffc55d52, 0xffc55d52, 0xffc55e52, 0xffc55e52, 0xffc56052, 0xffc56152, 0xffc5625a, + 0xffc5625a, 0xffc5645a, 0xffc5645a, 0xffc8655a, 0xffc8655a, 0xffc8655a, 0xffcb655a, 0xffce685d, + 0xffce685d, 0xffce695a, 0xffce695a, 0xffce6b63, 0xffce6b63, 0xffce6b63, 0xffce6c63, 0xffce6d63, + 0xffce6d63, 0xffce6d63, 0xffce6d63, 0xffce7068, 0xffce7068, 0xffce7068, 0xffce7068, 0xffd6716b, + 0xffd6736b, 0xffd6736b, 0xffd6746b, 0xffd6756b, 0xffd6756b, 0xffd6756b, 0xffd6756b, 0xffd6756b, + 0xffd6776b, 0xffd6776b, 0xffd6786b, 0xffd6796b, 0xffd6796b, 0xffd6796b, 0xffd6796b, 0xffd6796e, + 0xffd6796e, 0xffd6796e, 0xffd67970, 0xffd67973, 0xffd67973, 0xffd0776e, 0xffc57163, 0xffb5655a, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff6e3e37, 0xffa55d52, 0xffa55d52, 0xffc57163, + 0xffd0776e, 0xffd67973, 0xffd67973, 0xffd67970, 0xffd67970, 0xffd6796e, 0xffd6796e, 0xffd6796b, + 0xffd6786b, 0xffd6786b, 0xffd6786b, 0xffd6776b, 0xffd6776b, 0xffd6756b, 0xffd6756b, 0xffd6756b, + 0xffd6756b, 0xffd6746b, 0xffd6746b, 0xffd6736b, 0xffd6736b, 0xffd6716b, 0xffd6716b, 0xffce7163, + 0xffce7063, 0xffce7063, 0xffce6f63, 0xffce6d63, 0xffce6d63, 0xffce6d63, 0xffce6d63, 0xffce6c5d, + 0xffce6b60, 0xffce6b60, 0xffce6963, 0xffcb685a, 0xffcb685a, 0xffcb685a, 0xffc8675a, 0xffc5655a, + 0xffc5655a, 0xffc5655a, 0xffc5655a, 0xffc56158, 0xffc56158, 0xffc56158, 0xffc56155, 0xffc56052, + 0xffc55e52, 0xffc55e52, 0xffc55e52, 0xffc55c52, 0xffc55c52, 0xffc55a52, 0xffc55a52, 0xffbd594a, + 0xffbd594a, 0xffbd584d, 0xffbd584d, 0xffbd554a, 0xffbd554a, 0xffbd554a, 0xffbd554a, 0xffbd544a, + 0xffbd544a, 0xffbd524a, 0xffbd514a, 0xffb55142, 0xffb55042, 0xffb55042, 0xffb54e42, 0xffb54d42, + 0xffb54d42, 0xffb54d42, 0xffb54d42, 0xffb54a3f, 0xffb54a3f, 0xffb54a3f, 0xffb5493a, 0xffb5483a, + 0xffb5483a, 0xffb5483a, 0xffb5463a, 0xffb5453a, 0xffb5453a, 0xffb5453a, 0xffb5453a, 0xffb24337, + 0xffaf4234, 0xffaf4234, 0xffaf4234, 0xffad4131, 0xffad3f31, 0xffad3f31, 0xffad3f31, 0xffad3d31, + 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3b31, 0xffad3b31, 0xffad3b31, 0xffad3b31, 0xffad3a2c, + 0xffad3b2f, 0xffad3b2f, 0xffad3b2f, 0xffad392f, 0xffad392f, 0xffad392f, 0xffad392f, 0xffad392f, + 0xffad392f, 0xffad392f, 0xffad392f, 0xffad3a31, 0xffad3a31, 0xffad3b31, 0xffad3b31, 0xffad3b31, + 0xffad3b31, 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3d31, 0xffad3e31, 0xffad3f31, 0xffad3f34, + 0xffad3f34, 0xffad3f34, 0xffad4131, 0xffaf423a, 0xffb2433a, 0xffb2433a, 0xffb2433a, 0xffb5453a, + 0xffb5453a, 0xffb5463a, 0xffb5483a, 0xffb5483a, 0xffb5483a, 0xffb5483a, 0xffb5483a, 0xffb54942, + 0xffb54942, 0xffb54a3f, 0xffb54a3f, 0xffb54d42, 0xffb54d42, 0xffb54d42, 0xffb54d42, 0xffba5047, + 0xffba5047, 0xffbd5142, 0xffbd5142, 0xffbd524a, 0xffbd544a, 0xffbd544a, 0xffbd554a, 0xffbd564a, + 0xffbd564a, 0xffbd564a, 0xffbd584a, 0xffc0594d, 0xffc0594d, 0xffc35950, 0xffc35950, 0xffc55a52, + 0xffc55c52, 0xffc55c52, 0xffc55d52, 0xffc55e52, 0xffc55e52, 0xffc56052, 0xffc56152, 0xffc5625a, + 0xffc5625a, 0xffc5625a, 0xffc5645a, 0xffc8655a, 0xffc8655a, 0xffc8655a, 0xffc8655a, 0xffce685d, + 0xffce685d, 0xffce685d, 0xffce695a, 0xffce6b63, 0xffce6b63, 0xffce6c63, 0xffce6c63, 0xffce6d63, + 0xffce6d63, 0xffce6d63, 0xffce6d63, 0xffce7068, 0xffce7068, 0xffce7068, 0xffce7068, 0xffd6716b, + 0xffd6716b, 0xffd6746b, 0xffd6746b, 0xffd6756b, 0xffd6756b, 0xffd6756b, 0xffd6756b, 0xffd6776b, + 0xffd6776b, 0xffd6776b, 0xffd6786b, 0xffd6796b, 0xffd6796b, 0xffd6796b, 0xffd6796b, 0xffd6796e, + 0xffd67970, 0xffd6796e, 0xffd67970, 0xffd67973, 0xffd67973, 0xffd0776e, 0xffc57163, 0xffb5655a, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00100400, 0xff473531, 0xff7e6563, 0xff7e6563, 0xffad655a, + 0xffad7b73, 0xffad7b73, 0xffad7b73, 0xffb57573, 0xffb57573, 0xffb57573, 0xffb57573, 0xffb5756b, + 0xffb5756b, 0xffb5756b, 0xffb5756b, 0xffb5756b, 0xffb5756b, 0xffb5756b, 0xffb5756b, 0xffb5716b, + 0xffb5716b, 0xffb5716b, 0xffb5716b, 0xffb5716b, 0xffb5716b, 0xffb5716b, 0xffb5716b, 0xffad716b, + 0xffad716b, 0xffad716b, 0xffad716b, 0xffad6d6b, 0xffad6d6b, 0xffad6d6b, 0xffad6d6b, 0xffad6d6b, + 0xffad6d6b, 0xffad6d6b, 0xffad6d6b, 0xffb5655a, 0xffb5655a, 0xffb5655a, 0xffb5655a, 0xffb5615a, + 0xffb5615a, 0xffb5615a, 0xffb5615a, 0xffb55d52, 0xffb55d52, 0xffb55d52, 0xffb55d52, 0xffb55d52, + 0xffb55d52, 0xffb55d52, 0xffb55d52, 0xffad5952, 0xffad5952, 0xffad5952, 0xffad5952, 0xffad594a, + 0xffad594a, 0xffad594a, 0xffad594a, 0xffad554a, 0xffad554a, 0xffad554a, 0xffad554a, 0xffad514a, + 0xffad514a, 0xffad514a, 0xffad514a, 0xffa55142, 0xffa55142, 0xffa55142, 0xffa55142, 0xffa54d42, + 0xffa54d42, 0xffa54d42, 0xffa54d42, 0xffa54d42, 0xffa54d42, 0xffa54d42, 0xffa54d42, 0xffa54942, + 0xffa54942, 0xffa54942, 0xffa54942, 0xffa54942, 0xffa54942, 0xffa54942, 0xffa54942, 0xff9c453a, + 0xff9c453a, 0xff9c453a, 0xff9c453a, 0xff9c453a, 0xff9c453a, 0xff9c453a, 0xff9c453a, 0xff9c413a, + 0xff9c413a, 0xff9c413a, 0xff9c413a, 0xff9c413a, 0xff9c413a, 0xff9c413a, 0xff9c413a, 0xff9c413a, + 0xff9c413a, 0xff9c413a, 0xff9c413a, 0xff9c413a, 0xff9c413a, 0xff9c413a, 0xff9c413a, 0xff9c3d3a, + 0xff9c3d3a, 0xff9c3d3a, 0xff9c3d3a, 0xff9c413a, 0xff9c413a, 0xff9c413a, 0xff9c413a, 0xff9c413a, + 0xff9c413a, 0xff9c413a, 0xff9c413a, 0xff9c413a, 0xff9c413a, 0xff9c413a, 0xff9c413a, 0xff9c453a, + 0xff9c453a, 0xff9c453a, 0xff9c453a, 0xff9c453a, 0xff9c453a, 0xff9c453a, 0xff9c453a, 0xffa54942, + 0xffa54942, 0xffa54942, 0xffa54942, 0xffa54942, 0xffa54942, 0xffa54942, 0xffa54942, 0xffa54d42, + 0xffa54d42, 0xffa54d42, 0xffa54d42, 0xffa54d42, 0xffa54d42, 0xffa54d42, 0xffa54d42, 0xffad514a, + 0xffad514a, 0xffad514a, 0xffad514a, 0xffad554a, 0xffad554a, 0xffad554a, 0xffad554a, 0xffad554a, + 0xffad554a, 0xffad554a, 0xffad554a, 0xffad5952, 0xffad5952, 0xffad5952, 0xffad5952, 0xffb55952, + 0xffb55952, 0xffb55952, 0xffb55952, 0xffb55d52, 0xffb55d52, 0xffb55d52, 0xffb55d52, 0xffb55d5a, + 0xffb55d5a, 0xffb55d5a, 0xffb55d5a, 0xffb5615a, 0xffb5615a, 0xffb5615a, 0xffb5615a, 0xffbd655a, + 0xffbd655a, 0xffbd655a, 0xffbd655a, 0xffad6d6b, 0xffad6d6b, 0xffad6d6b, 0xffad6d6b, 0xffad6d6b, + 0xffad6d6b, 0xffad6d6b, 0xffad6d6b, 0xffad716b, 0xffad716b, 0xffad716b, 0xffad716b, 0xffb5716b, + 0xffb5716b, 0xffb5716b, 0xffb5716b, 0xffb5716b, 0xffb5716b, 0xffb5716b, 0xffb5716b, 0xffb5756b, + 0xffb5756b, 0xffb5756b, 0xffb5756b, 0xffb5756b, 0xffb5756b, 0xffb5756b, 0xffb5756b, 0xffb57573, + 0xffb57573, 0xffb57573, 0xffb57573, 0xffad7b73, 0xffad7b73, 0xffad7b73, 0xffad655a, 0xff7e6463, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00100400, 0xff473531, 0xff7e6563, 0xff7e6563, 0xffad655a, + 0xffad7b73, 0xffad7b73, 0xffad7b73, 0xffb57573, 0xffb57573, 0xffb57573, 0xffb57573, 0xffb5756b, + 0xffb5756b, 0xffb5756b, 0xffb5756b, 0xffb5756b, 0xffb5756b, 0xffb5756b, 0xffb5756b, 0xffb5716b, + 0xffb5716b, 0xffb5716b, 0xffb5716b, 0xffb5716b, 0xffb5716b, 0xffb5716b, 0xffb5716b, 0xffad716b, + 0xffad716b, 0xffad716b, 0xffad716b, 0xffad6d6b, 0xffad6d6b, 0xffad6d6b, 0xffad6d6b, 0xffad6d6b, + 0xffad6d6b, 0xffad6d6b, 0xffad6d6b, 0xffb5655a, 0xffb5655a, 0xffb5655a, 0xffb5655a, 0xffb5615a, + 0xffb5615a, 0xffb5615a, 0xffb5615a, 0xffb55d52, 0xffb55d52, 0xffb55d52, 0xffb55d52, 0xffb55d52, + 0xffb55d52, 0xffb55d52, 0xffb55d52, 0xffad5952, 0xffad5952, 0xffad5952, 0xffad5952, 0xffad594a, + 0xffad594a, 0xffad594a, 0xffad594a, 0xffad554a, 0xffad554a, 0xffad554a, 0xffad554a, 0xffad514a, + 0xffad514a, 0xffad514a, 0xffad514a, 0xffa55142, 0xffa55142, 0xffa55142, 0xffa55142, 0xffa54d42, + 0xffa54d42, 0xffa54d42, 0xffa54d42, 0xffa54d42, 0xffa54d42, 0xffa54d42, 0xffa54d42, 0xffa54942, + 0xffa54942, 0xffa54942, 0xffa54942, 0xffa54942, 0xffa54942, 0xffa54942, 0xffa54942, 0xff9c453a, + 0xff9c453a, 0xff9c453a, 0xff9c453a, 0xff9c453a, 0xff9c453a, 0xff9c453a, 0xff9c453a, 0xff9c413a, + 0xff9c413a, 0xff9c413a, 0xff9c413a, 0xff9c413a, 0xff9c413a, 0xff9c413a, 0xff9c413a, 0xff9c413a, + 0xff9c413a, 0xff9c413a, 0xff9c413a, 0xff9c413a, 0xff9c413a, 0xff9c413a, 0xff9c413a, 0xff9c3d3a, + 0xff9c3d3a, 0xff9c3d3a, 0xff9c3d3a, 0xff9c413a, 0xff9c413a, 0xff9c413a, 0xff9c413a, 0xff9c413a, + 0xff9c413a, 0xff9c413a, 0xff9c413a, 0xff9c413a, 0xff9c413a, 0xff9c413a, 0xff9c413a, 0xff9c453a, + 0xff9c453a, 0xff9c453a, 0xff9c453a, 0xff9c453a, 0xff9c453a, 0xff9c453a, 0xff9c453a, 0xffa54942, + 0xffa54942, 0xffa54942, 0xffa54942, 0xffa54942, 0xffa54942, 0xffa54942, 0xffa54942, 0xffa54d42, + 0xffa54d42, 0xffa54d42, 0xffa54d42, 0xffa54d42, 0xffa54d42, 0xffa54d42, 0xffa54d42, 0xffad514a, + 0xffad514a, 0xffad514a, 0xffad514a, 0xffad554a, 0xffad554a, 0xffad554a, 0xffad554a, 0xffad554a, + 0xffad554a, 0xffad554a, 0xffad554a, 0xffad5952, 0xffad5952, 0xffad5952, 0xffad5952, 0xffb55952, + 0xffb55952, 0xffb55952, 0xffb55952, 0xffb55d52, 0xffb55d52, 0xffb55d52, 0xffb55d52, 0xffb55d5a, + 0xffb55d5a, 0xffb55d5a, 0xffb55d5a, 0xffb5615a, 0xffb5615a, 0xffb5615a, 0xffb5615a, 0xffbd655a, + 0xffbd655a, 0xffbd655a, 0xffbd655a, 0xffad6d6b, 0xffad6d6b, 0xffad6d6b, 0xffad6d6b, 0xffad6d6b, + 0xffad6d6b, 0xffad6d6b, 0xffad6d6b, 0xffad716b, 0xffad716b, 0xffad716b, 0xffad716b, 0xffb5716b, + 0xffb5716b, 0xffb5716b, 0xffb5716b, 0xffb5716b, 0xffb5716b, 0xffb5716b, 0xffb5716b, 0xffb5756b, + 0xffb5756b, 0xffb5756b, 0xffb5756b, 0xffb5756b, 0xffb5756b, 0xffb5756b, 0xffb5756b, 0xffb57573, + 0xffb57573, 0xffb57573, 0xffb57573, 0xffad7b73, 0xffad7b73, 0xffad7b73, 0xffad655a, 0xff7e6463, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00100400, 0xff7e6563, 0xff7e6563, 0xff7e6563, 0xffad655a, + 0xffad655a, 0xffad7b73, 0xffad7b73, 0xffb57573, 0xffb57573, 0xffb57573, 0xffb57573, 0xffb5756b, + 0xffb5756b, 0xffb5756b, 0xffb5756b, 0xffb5756b, 0xffb5756b, 0xffb5756b, 0xffb5756b, 0xffb5716b, + 0xffb5716b, 0xffb5716b, 0xffb5716b, 0xffb5716b, 0xffb5716b, 0xffb5716b, 0xffb5716b, 0xffad716b, + 0xffad716b, 0xffad716b, 0xffad716b, 0xffad6d6b, 0xffad6d6b, 0xffad6d6b, 0xffad6d6b, 0xffad6d6b, + 0xffad6d6b, 0xffad6d6b, 0xffad6d6b, 0xffad7c76, 0xffad7c76, 0xffad7c76, 0xffad7c76, 0xffad7976, + 0xffad7976, 0xffad7976, 0xffad7976, 0xffad7770, 0xffad7770, 0xffad7770, 0xffad7770, 0xffad7870, + 0xffad7870, 0xffad7870, 0xffad7870, 0xffa77570, 0xffa77570, 0xffa77570, 0xffa77570, 0xffa7756b, + 0xffa7756b, 0xffa7756b, 0xffa7756b, 0xffa7736b, 0xffa7736b, 0xffa7736b, 0xffa7736b, 0xffa7706b, + 0xffa7706b, 0xffa7706b, 0xffa7706b, 0xffa27065, 0xffa27065, 0xffa27065, 0xffa27065, 0xffa26d65, + 0xffa26d65, 0xffa26d65, 0xffa26d65, 0xffa26d65, 0xffa26d65, 0xffa26d65, 0xffa26d65, 0xffa26b68, + 0xffa26b68, 0xffa26b68, 0xffa26b68, 0xffa26c68, 0xffa26c68, 0xffa26c68, 0xffa26c68, 0xff9c6963, + 0xff9c6963, 0xff9c6963, 0xff9c6963, 0xff9c6963, 0xff9c6963, 0xff9c6963, 0xff9c6963, 0xff9c6763, + 0xff9c6763, 0xff9c6763, 0xff9c6763, 0xff9c6763, 0xff9c6763, 0xff9c6763, 0xff9c6763, 0xff9c6763, + 0xff9c6763, 0xff9c6763, 0xff9c6763, 0xff9c6763, 0xff9c6763, 0xff9c6763, 0xff9c6763, 0xff9c6463, + 0xff9c6463, 0xff9c6463, 0xff9c6463, 0xff9c6763, 0xff9c6763, 0xff9c6763, 0xff9c6763, 0xff9c6763, + 0xff9c6763, 0xff9c6763, 0xff9c6763, 0xff9c6763, 0xff9c6763, 0xff9c6763, 0xff9c6763, 0xff9c6963, + 0xff9c6963, 0xff9c6963, 0xff9c6963, 0xff9c6963, 0xff9c6963, 0xff9c6963, 0xff9c6963, 0xffa26c68, + 0xffa26c68, 0xffa26c68, 0xffa26c68, 0xffa26b68, 0xffa26b68, 0xffa26b68, 0xffa26b68, 0xffa26d65, + 0xffa26d65, 0xffa26d65, 0xffa26d65, 0xffa26d65, 0xffa26d65, 0xffa26d65, 0xffa26d65, 0xffa7706b, + 0xffa7706b, 0xffa7706b, 0xffa7706b, 0xffa7736b, 0xffa7736b, 0xffa7736b, 0xffa7736b, 0xffa7736b, + 0xffa7736b, 0xffa7736b, 0xffa7736b, 0xffa77570, 0xffa77570, 0xffa77570, 0xffa77570, 0xffad7570, + 0xffad7570, 0xffad7570, 0xffad7570, 0xffad7870, 0xffad7870, 0xffad7870, 0xffad7870, 0xffad7776, + 0xffad7776, 0xffad7776, 0xffad7776, 0xffad7976, 0xffad7976, 0xffad7976, 0xffad7976, 0xffaf7c76, + 0xffaf7c76, 0xffaf7c76, 0xffaf7c76, 0xffad6d6b, 0xffad6d6b, 0xffad6d6b, 0xffad6d6b, 0xffad6d6b, + 0xffad6d6b, 0xffad6d6b, 0xffad6d6b, 0xffad716b, 0xffad716b, 0xffad716b, 0xffad716b, 0xffb5716b, + 0xffb5716b, 0xffb5716b, 0xffb5716b, 0xffb5716b, 0xffb5716b, 0xffb5716b, 0xffb5716b, 0xffb5756b, + 0xffb5756b, 0xffb5756b, 0xffb5756b, 0xffb5756b, 0xffb5756b, 0xffb5756b, 0xffb5756b, 0xffb57573, + 0xffb57573, 0xffb57573, 0xffb57573, 0xffad7b73, 0xffad7b73, 0xffad655a, 0xffad655a, 0xff7e6463, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00100400, 0xff7e6563, 0xffb59694, 0xffb59694, 0xffada6a5, + 0xffada6a5, 0xffada6a5, 0xffada6a5, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, + 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, + 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, + 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, + 0xffadaead, 0xffadaead, 0xffadaead, 0xff9caaad, 0xff9caaad, 0xff9caaad, 0xff9caaad, 0xff9caaad, + 0xff9caaad, 0xff9caaad, 0xff9caaad, 0xff9caaad, 0xff9caaad, 0xff9caaad, 0xff9caaad, 0xff9caead, + 0xff9caead, 0xff9caead, 0xff9caead, 0xff9caead, 0xff9caead, 0xff9caead, 0xff9caead, 0xff9caead, + 0xff9caead, 0xff9caead, 0xff9caead, 0xff9caead, 0xff9caead, 0xff9caead, 0xff9caead, 0xff9caead, + 0xff9caead, 0xff9caead, 0xff9caead, 0xff9caead, 0xff9caead, 0xff9caead, 0xff9caead, 0xff9caead, + 0xff9caead, 0xff9caead, 0xff9caead, 0xff9caead, 0xff9caead, 0xff9caead, 0xff9caead, 0xff9caeb5, + 0xff9caeb5, 0xff9caeb5, 0xff9caeb5, 0xff9cb2b5, 0xff9cb2b5, 0xff9cb2b5, 0xff9cb2b5, 0xff9cb2b5, + 0xff9cb2b5, 0xff9cb2b5, 0xff9cb2b5, 0xff9cb2b5, 0xff9cb2b5, 0xff9cb2b5, 0xff9cb2b5, 0xff9cb2b5, + 0xff9cb2b5, 0xff9cb2b5, 0xff9cb2b5, 0xff9cb2b5, 0xff9cb2b5, 0xff9cb2b5, 0xff9cb2b5, 0xff9cb2b5, + 0xff9cb2b5, 0xff9cb2b5, 0xff9cb2b5, 0xff9cb2b5, 0xff9cb2b5, 0xff9cb2b5, 0xff9cb2b5, 0xff9cb2b5, + 0xff9cb2b5, 0xff9cb2b5, 0xff9cb2b5, 0xff9cb2b5, 0xff9cb2b5, 0xff9cb2b5, 0xff9cb2b5, 0xff9cb2b5, + 0xff9cb2b5, 0xff9cb2b5, 0xff9cb2b5, 0xff9cb2b5, 0xff9cb2b5, 0xff9cb2b5, 0xff9cb2b5, 0xff9cb2b5, + 0xff9cb2b5, 0xff9cb2b5, 0xff9cb2b5, 0xff9cb2b5, 0xff9cb2b5, 0xff9cb2b5, 0xff9cb2b5, 0xff9cb2b5, + 0xff9cb2b5, 0xff9cb2b5, 0xff9cb2b5, 0xff9caeb5, 0xff9caeb5, 0xff9caeb5, 0xff9caeb5, 0xff9caead, + 0xff9caead, 0xff9caead, 0xff9caead, 0xff9caead, 0xff9caead, 0xff9caead, 0xff9caead, 0xff9caead, + 0xff9caead, 0xff9caead, 0xff9caead, 0xff9caead, 0xff9caead, 0xff9caead, 0xff9caead, 0xff9caead, + 0xff9caead, 0xff9caead, 0xff9caead, 0xff9caead, 0xff9caead, 0xff9caead, 0xff9caead, 0xff9caead, + 0xff9caead, 0xff9caead, 0xff9caead, 0xff9caead, 0xff9caead, 0xff9caead, 0xff9caead, 0xff9caaad, + 0xff9caaad, 0xff9caaad, 0xff9caaad, 0xff9caaad, 0xff9caaad, 0xff9caaad, 0xff9caaad, 0xff94aaad, + 0xff94aaad, 0xff94aaad, 0xff94aaad, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, + 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, + 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, + 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, 0xffadaead, + 0xffadaead, 0xffadaead, 0xffadaead, 0xffada6a5, 0xffada6a5, 0xffada6a5, 0xffada6a5, 0xffbd9694, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff737473, 0xffadaead, 0xffadaead, 0xffd6d2d6, + 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, + 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, + 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, + 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, + 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, + 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, + 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, + 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, + 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, + 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, + 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, + 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, + 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, + 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, + 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, + 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, + 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, + 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, + 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, + 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, + 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, + 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, + 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, + 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, + 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, + 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, + 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, + 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, 0xffb5b6b5, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x11000000, + 0x11000000, 0x22000000, 0x22000000, 0x33000000, 0x44000000, 0x55000000, 0x44000000, 0x33000000, + 0x33000000, 0x22000000, 0x11000000, 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x11000000, 0x22000000, 0x55000000, 0x88000000, 0xbb000000, + 0xdd0e0403, 0xdd0e0403, 0xee100503, 0xee100503, 0xff100503, 0xff100503, 0xff100503, 0xee100503, + 0xee100503, 0xee100503, 0xdd0e0403, 0xaa000000, 0x77000000, 0x44000000, 0x22000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff737573, 0xffa5a6a5, 0xffa5a6a5, 0xffa5a6a5, + 0xffa5a6a5, 0xffadaaad, 0xffadaaad, 0xffadaaad, 0xffadaaad, 0xffadaaad, 0xffadaaad, 0xffadaaad, + 0xffadaaad, 0xffadaaad, 0xffadaaad, 0xffadaaad, 0xffadaaad, 0xffa5a6a5, 0xffa5a6a5, 0xffa5a6a5, + 0xffa5a6a5, 0xff737173, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, + 0x11000000, 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x11000000, 0x33000000, 0x880e0403, 0xcc0e0403, 0xee0e0403, 0xff1b0805, 0xff1b0805, 0xff1b0805, + 0xff1b0805, 0xff1b0805, 0xff210b05, 0xff210b05, 0xff210b05, 0xff210b05, 0xff210b05, 0xff210b05, + 0xff210b05, 0xff210b05, 0xff1b0805, 0xff1b0805, 0xff1b0805, 0xee1b0805, 0xdd0b0403, 0x880b0403, + 0x44000000, 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffadaaad, 0xffdbbeb8, 0xffe9dfdb, 0xffe9dfdb, + 0xffe9dfdb, 0xffe6e3e6, 0xffe6e3e6, 0xffe6e3e6, 0xffe6e3e6, 0xffe6e3e6, 0xffe6e3e6, 0xffe6e3e6, + 0xffe6e3e6, 0xffe6e3e6, 0xffe6e3e6, 0xffe6e3e6, 0xffe6e3e6, 0xffe6dbd6, 0xffe6dbd6, 0xffe6dbd6, + 0xffe6dbd6, 0xffa5a6a5, 0x00000000, 0x00000000, 0x00000000, 0x00080000, 0x00080000, 0x11080000, + 0x11080000, 0x22210400, 0x22210400, 0x33210400, 0x33210400, 0x33210400, 0x33210400, 0x33210400, + 0x22210400, 0x11100400, 0x11100400, 0x00100400, 0x00100400, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x22000000, 0x66080303, + 0xaa100505, 0xee190808, 0xff1b0805, 0xff1b0805, 0xff290c08, 0xff290c08, 0xff290c08, 0xff290c08, + 0xff290c08, 0xff290c08, 0xff311008, 0xff311008, 0xff311008, 0xff311008, 0xff311008, 0xff311008, + 0xff210b05, 0xff311008, 0xff290c08, 0xff290c08, 0xff290c08, 0xff290c08, 0xff210c08, 0xff210c08, + 0xee160805, 0xaa0b0403, 0x55000000, 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x11030303, 0x22030303, 0x22080808, 0x330b0b0b, 0x44101010, 0x33101010, 0x330b0b0b, 0x33080808, + 0x22050505, 0x11030303, 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffadaaad, 0xffe9dfdb, 0xfff7ffff, 0xffce9e94, + 0xffce9e94, 0xffd6a294, 0xffd6a294, 0xffd6a294, 0xffd6a294, 0xffce9e94, 0xffce9e94, 0xffce9e94, + 0xffce9e94, 0xffce968c, 0xffce968c, 0xffce968c, 0xffce968c, 0xffc59284, 0xffc59284, 0xfff7ffff, + 0xffe6dbd6, 0xffa5a6a5, 0x00000000, 0x00000000, 0x00000000, 0x00080000, 0x11080000, 0x22080000, + 0x33080000, 0x66210400, 0x99210400, 0xaa210400, 0xbb210400, 0xbb210400, 0xbb210400, 0xaa210400, + 0x66210400, 0x33100400, 0x22100400, 0x11100400, 0x00100400, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x11000000, 0x66190705, 0xcc210808, 0xff340f0e, + 0xff340f0e, 0xff340f0e, 0xff3a1010, 0xff3a1010, 0xff3a1010, 0xff3a1010, 0xff3a1010, 0xff4a1613, + 0xff4a1613, 0xff3a1010, 0xff421410, 0xff421410, 0xff421410, 0xff421410, 0xff3a1010, 0xff471613, + 0xff3a1010, 0xff3a1010, 0xff311010, 0xff311010, 0xff311010, 0xff311010, 0xff37100b, 0xff37100b, + 0xff290c08, 0xff290c08, 0xee160705, 0xaa160705, 0x33000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00080808, 0x00080808, 0x11080808, 0x55503a37, 0x886b494a, + 0xbb8c6160, 0xddad7976, 0xeead7976, 0xffa57479, 0xffa57479, 0xeea57479, 0xdd9c6163, 0xcc794542, + 0x99794542, 0x663c2421, 0x22000400, 0x11080400, 0x11080400, 0x00080400, 0x00080400, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffadaaad, 0xffe9dfdb, 0xffce9e94, 0xffce9e94, + 0xffce9e94, 0xffd6a294, 0xffd6a294, 0xffd6a294, 0xffd6a294, 0xffce9e94, 0xffce9e94, 0xffce9e94, + 0xffce9e94, 0xffce968c, 0xffce968c, 0xffce968c, 0xffce968c, 0xffc59284, 0xffc59284, 0xffc59284, + 0xffe6dbd6, 0xffa5a6a5, 0x00000000, 0x00000000, 0x00000000, 0x11080000, 0x22080000, 0x44080000, + 0xaa080000, 0xdd55241b, 0xee894537, 0xee894537, 0xee894537, 0xee9f584d, 0xee9f584d, 0xee9f584d, + 0xdd9f584d, 0xbb100400, 0x55100400, 0x22100400, 0x11100400, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x22000000, 0x99190705, 0xee310d0b, 0xff340f0e, 0xff340f0e, + 0xff340f0e, 0xff471613, 0xff471613, 0xff471613, 0xff471613, 0xff471613, 0xff4a1613, 0xff5a1b16, + 0xff4a1613, 0xff5a1b16, 0xff501813, 0xff501813, 0xff501813, 0xff501813, 0xff551b16, 0xff471613, + 0xff471613, 0xff471613, 0xff421613, 0xff421613, 0xff421613, 0xff421613, 0xff37100b, 0xff37100b, + 0xff37100b, 0xff37100b, 0xff2c0d0b, 0xff2c0d0b, 0xcc160705, 0x44000000, 0x11000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x33080808, 0x88503a37, 0xcc976c65, 0xffde9e94, 0xffce928c, + 0xffce928c, 0xffce928c, 0xffad7976, 0xffad878f, 0xffad878f, 0xffad878f, 0xffa57479, 0xffb56563, + 0xffb56563, 0xffb56563, 0xdd794542, 0x994a2019, 0x44080400, 0x11080400, 0x11080400, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffadaaad, 0xffe9dfdb, 0xffce9e94, 0xffce9e94, + 0xffce9e94, 0xffd6a294, 0xffd6a294, 0xffd6a294, 0xffd6a294, 0xffce9e94, 0xffce9e94, 0xffce9e94, + 0xffce9e94, 0xffce968c, 0xffce968c, 0xffce968c, 0xffce968c, 0xffc59284, 0xffc59284, 0xffc59284, + 0xffe6dbd6, 0xffa5a6a5, 0x00000000, 0x00000000, 0x00000000, 0x11080000, 0x33080000, 0xaa080000, + 0xee9c3d31, 0xee894537, 0xeebd6552, 0xeebd6552, 0xeebd6552, 0xee9f584d, 0xee9f584d, 0xee9f584d, + 0xeede8273, 0xeed6c2bd, 0xbb100400, 0x33100400, 0x11100400, 0x11000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x66190705, 0xdd310d0b, 0xff4a1410, 0xff4a1410, 0xff471613, 0xff471613, + 0xff471613, 0xff471613, 0xff551b16, 0xff551b16, 0xff551b16, 0xff551b16, 0xff5a1b16, 0xff5a1b16, + 0xff6b2019, 0xff5a1b16, 0xff5d1c16, 0xff5d1c16, 0xff5d1c16, 0xff5d1c16, 0xff551b16, 0xff551b16, + 0xff551b16, 0xff551b16, 0xff521b16, 0xff421613, 0xff421613, 0xff421613, 0xff45140e, 0xff45140e, + 0xff45140e, 0xff45140e, 0xff421410, 0xff421410, 0xff2c0d0b, 0xdd160705, 0x77000000, 0x11000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x22000000, 0x884d3634, 0xdd976c65, 0xffde9e94, 0xffde9e94, 0xffde9e94, 0xffce928c, + 0xffce928c, 0xffad7976, 0xffad7976, 0xffad878f, 0xffb59aa5, 0xffad878f, 0xffad878f, 0xffb56563, + 0xffb56563, 0xffb56563, 0xffb56563, 0xffce594a, 0xdd8c3d31, 0x994a2019, 0x44080400, 0x11000000, + 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00080408, 0xff979697, 0xffe6e3e6, 0xffce9a8c, 0xffce9a8c, + 0xffce9a8c, 0xffce9e94, 0xffce9e94, 0xffce9a8f, 0xffce9a8f, 0xffce9a94, 0xffce9a94, 0xffce9a94, + 0xffce9a94, 0xffce968c, 0xffc88f84, 0xffc88f84, 0xffc88f84, 0xffbd8273, 0xffbd8273, 0xffbd8273, + 0xffe6e3e6, 0xffadaaad, 0x00000000, 0x00000000, 0x11000000, 0x22210400, 0x66210400, 0xdd210400, + 0xee945a52, 0xeea5615a, 0xeeaa6d68, 0xeeaa6d68, 0xeeaa6d68, 0xeead6563, 0xeead6563, 0xeeaf6c68, + 0xeeb57973, 0xeea7938f, 0xeeefdbd6, 0x77190400, 0x22190400, 0x11000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x77190808, 0xee4a1410, 0xff4a1410, 0xff4a1410, 0xff4a1410, 0xff5a1c19, 0xff5a1c19, + 0xff5a1c19, 0xff5a1c19, 0xff632019, 0xff632019, 0xff632019, 0xff632019, 0xff6b2019, 0xff6b2019, + 0xff6b2019, 0xff6b2019, 0xff6b2019, 0xff6b2019, 0xff6b2019, 0xff6b2019, 0xff632019, 0xff632019, + 0xff632019, 0xff632019, 0xff632019, 0xff521b16, 0xff521b16, 0xff521b16, 0xff521810, 0xff521810, + 0xff521810, 0xff45140e, 0xff421410, 0xff421410, 0xff421410, 0xff421410, 0xee290c08, 0x66000000, + 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x554d3634, 0xbb9a6c68, 0xffe6a29c, 0xffde9e94, 0xffde9e94, 0xffde9e94, 0xffde9e94, 0xffce928c, + 0xffce928c, 0xffad7976, 0xffad7976, 0xffad878f, 0xffb59aa5, 0xffb59aa5, 0xffad878f, 0xffb56563, + 0xffb56563, 0xffb56563, 0xffb56563, 0xffce594a, 0xffce594a, 0xffce594a, 0xcc8c3d31, 0x77311010, + 0x22000000, 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00080408, 0xff979697, 0xffe6e3e6, 0xffce9a8c, 0xffce9a8c, + 0xffce9a8c, 0xffce9a8f, 0xffce9a8f, 0xffce9a8f, 0xffce9689, 0xffce9a94, 0xffdebab8, 0xffdebab8, + 0xffce9a94, 0xffc88f84, 0xffc88f84, 0xffc88f84, 0xffc3887b, 0xffbd8273, 0xffbd8273, 0xffbd8273, + 0xffe6e3e6, 0xffadaaad, 0x00000000, 0x00000000, 0x11000000, 0x33210400, 0x99210400, 0xee945a52, + 0xee945a52, 0xeeaa6d68, 0xeeaf7976, 0xeeaf7976, 0xeeaf7976, 0xeeaf6c68, 0xeeaf6c68, 0xeeaf6c68, + 0xeeb2736e, 0xeea7938f, 0xeeefdbd6, 0xaa190400, 0x33190400, 0x11000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00080000, 0x00080000, + 0x662c0c08, 0xee501810, 0xff521819, 0xff521819, 0xff521819, 0xff631e1b, 0xff631c19, 0xff631c19, + 0xff6e221b, 0xff6e221b, 0xff6b2019, 0xff76241b, 0xff76241b, 0xff76241b, 0xff732421, 0xff732421, + 0xff732421, 0xff732421, 0xff732421, 0xff732421, 0xff732421, 0xff732421, 0xff76241b, 0xff6b2019, + 0xff6b2019, 0xff6b2019, 0xff65201b, 0xff65201b, 0xff65201b, 0xff5a1c19, 0xff581c16, 0xff581c16, + 0xff581c16, 0xff4a1810, 0xff4d1813, 0xff4d1813, 0xff4d1813, 0xff421410, 0xff34120b, 0xdd1e0b05, + 0x55080400, 0x11080400, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x775a413a, + 0xddb27f76, 0xffde9e94, 0xffde9e94, 0xffde9e94, 0xffde9e94, 0xffde9e94, 0xffdb9a91, 0xffd68e8c, + 0xffc07f7e, 0xffaa7070, 0xffaa7070, 0xffaa8e97, 0xffb8a2aa, 0xffb8a2aa, 0xffaa8e97, 0xff94696b, + 0xff9c5e5d, 0xff9c5e5d, 0xffa55450, 0xffbd5142, 0xffbd5142, 0xffbd493c, 0xffbd493c, 0xeeb53929, + 0x9942160e, 0x33080400, 0x11080400, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00080408, 0xff979697, 0xffe6e3e6, 0xffce9a8c, 0xffce9a8c, + 0xffce9a8c, 0xffce9689, 0xffce9689, 0xffce9689, 0xffce9284, 0xffce9a94, 0xfffffbff, 0xfffffbff, + 0xffce9a94, 0xffc88f84, 0xffc3887b, 0xffc3887b, 0xffc3887b, 0xffbd8273, 0xffbd8273, 0xffbd8273, + 0xffe6e3e6, 0xffadaaad, 0x00000000, 0x00000000, 0x11000000, 0x44210400, 0xbb210400, 0xee945a52, + 0xeece867b, 0xeeaf7976, 0xeeaf7976, 0xeeaf7976, 0xeeaf7976, 0xeeb2736e, 0xeeb2736e, 0xeeaf6c68, + 0xeeb2736e, 0xeea7938f, 0xeeefdbd6, 0xcc604c47, 0x44190400, 0x22000000, 0x11000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00080000, 0x55080000, + 0xee501810, 0xff501810, 0xff631e1b, 0xff631e1b, 0xff631e1b, 0xff73231e, 0xff6e221b, 0xff6e221b, + 0xff79271e, 0xff6e221b, 0xff76241b, 0xff76241b, 0xff76241b, 0xff81281e, 0xff792721, 0xff792721, + 0xff792721, 0xff792721, 0xff7b2721, 0xff7b2721, 0xff7b2721, 0xff7b2721, 0xff76241b, 0xff76241b, + 0xff76241b, 0xff76241b, 0xff70241e, 0xff70241e, 0xff70241e, 0xff65201b, 0xff65201b, 0xff65201b, + 0xff581c16, 0xff581c16, 0xff4d1813, 0xff4d1813, 0xff4d1813, 0xff4d1813, 0xff4a1810, 0xff34120b, + 0xcc1e0b05, 0x44080400, 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x7745312f, 0xeede9e94, + 0xffde9e94, 0xffde9e94, 0xffde9e94, 0xffde9e94, 0xffde9e94, 0xffdb9a91, 0xffd9968f, 0xffd68e8c, + 0xffc07f7e, 0xffaa7070, 0xffaa7070, 0xffaa8e97, 0xffb8a2aa, 0xffb8a2aa, 0xffaa8e97, 0xff9c5e5d, + 0xffa55450, 0xffa55450, 0xffa55450, 0xffbd5142, 0xffbd493c, 0xffbd493c, 0xffbd4137, 0xffb53929, + 0xeeb53929, 0x9942160e, 0x33080400, 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00080408, 0xff979697, 0xffe6e3e6, 0xffce9a8c, 0xffce9a8c, + 0xffce9a8c, 0xffce9689, 0xffce9284, 0xffce9284, 0xffce9284, 0xffdebab8, 0xfffffbff, 0xfffffbff, + 0xffefdbdb, 0xffc3887b, 0xffc3887b, 0xffc3887b, 0xffbd8273, 0xffbd8273, 0xffbd8273, 0xffbd8273, + 0xffe6e3e6, 0xffadaaad, 0x00000000, 0x11000000, 0x22000000, 0x55210400, 0xcc210400, 0xeece867b, + 0xeece867b, 0xeeb58684, 0xeeb58684, 0xeeb58684, 0xeeaf7976, 0xeeb57973, 0xeeb57973, 0xeeb2736e, + 0xeeb57973, 0xeea7938f, 0xeea7938f, 0xdda7938f, 0x66190400, 0x22000000, 0x11000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x33080000, 0xdd501810, + 0xff732419, 0xff732419, 0xff73231e, 0xff73231e, 0xff73231e, 0xff73231e, 0xff79271e, 0xff79271e, + 0xff79271e, 0xff79271e, 0xff81281e, 0xff81281e, 0xff81281e, 0xff81281e, 0xff7e2a21, 0xff7e2a21, + 0xff7e2a21, 0xff7e2a21, 0xff842a21, 0xff842a21, 0xff842a21, 0xff842a21, 0xff8c2d21, 0xff81281e, + 0xff81281e, 0xff81281e, 0xff7b2821, 0xff70241e, 0xff70241e, 0xff70241e, 0xff732421, 0xff65201b, + 0xff65201b, 0xff581c16, 0xff581c16, 0xff581c16, 0xff4d1813, 0xff4d1813, 0xff4a1810, 0xff4a1810, + 0xff34120b, 0x99080400, 0x22000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x7745312f, 0xeece928c, 0xffde9e94, + 0xffde9e94, 0xffde9e94, 0xffde9e94, 0xffde9e94, 0xffdb9a91, 0xffdb9a91, 0xffd9968f, 0xffd68e8c, + 0xffc07f7e, 0xffaa7070, 0xff946163, 0xff9c7984, 0xffc5b6bd, 0xffc5b6bd, 0xff9c7984, 0xffa55450, + 0xffa55450, 0xffa55450, 0xffad4942, 0xffbd493c, 0xffbd493c, 0xffbd4137, 0xffbd3931, 0xffb53929, + 0xffb53929, 0xeeb53929, 0x9942160e, 0x33000000, 0x11000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xff949694, 0xffe6e3e6, 0xffce9684, 0xffce9684, + 0xffce9684, 0xffce9284, 0xffce9284, 0xffce9284, 0xffce9284, 0xfffffbf7, 0xffffffff, 0xffffffff, + 0xfffffbf7, 0xffd3aaa2, 0xffbd8273, 0xffbd8273, 0xffbd8273, 0xffad796b, 0xffad796b, 0xffad796b, + 0xffe6e3e6, 0xffadaaad, 0x00000000, 0x11000000, 0x22000000, 0x66190000, 0xdd523331, 0xeec59a94, + 0xeec59a94, 0xeeb88e84, 0xeeb88e84, 0xeeb5867b, 0xeeb5867b, 0xeeaf7c73, 0xeead756b, 0xeead756b, + 0xeead756b, 0xee947168, 0xeecea69c, 0xeecea69c, 0x77210800, 0x22000000, 0x11000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x11000000, 0xaa2c0c08, 0xff732419, + 0xff732419, 0xff732419, 0xff73231e, 0xff73231e, 0xff842821, 0xff842821, 0xff79271e, 0xff842d21, + 0xff842d21, 0xff842d21, 0xff8c2d21, 0xff8c2d21, 0xff8c2d21, 0xff8c2d21, 0xff842d21, 0xff842d21, + 0xff842d21, 0xff842d21, 0xff8c2d21, 0xff8c2d21, 0xff8c2d21, 0xff8c2d21, 0xff8c2d21, 0xff8c2d21, + 0xff8c2d21, 0xff81281e, 0xff7b2821, 0xff7b2821, 0xff7b2821, 0xff7b2821, 0xff732421, 0xff732421, + 0xff732421, 0xff65201b, 0xff632019, 0xff581c16, 0xff581c16, 0xff581c16, 0xff4a1810, 0xff4a1810, + 0xff34120b, 0xee1e0b05, 0x66000000, 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x5545312f, 0xddce928c, 0xffce928c, 0xffde9e94, + 0xffde9e94, 0xffde9e94, 0xffde9e94, 0xffdb9a91, 0xffdb9a91, 0xffd9968f, 0xffd6928c, 0xffd68e8c, + 0xffc07f7e, 0xffaa7070, 0xff946163, 0xff9c7984, 0xffc5b6bd, 0xffc5b6bd, 0xff9c7984, 0xffa55450, + 0xffad4942, 0xffad4942, 0xffad4942, 0xffbd493c, 0xffbd4137, 0xffbd3931, 0xffbd3931, 0xffb53929, + 0xffb53929, 0xffb53929, 0xee7b271b, 0x88290c08, 0x33000000, 0x11000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xff949694, 0xffe6e3e6, 0xffce9684, 0xffce9684, + 0xffce9684, 0xffce9284, 0xffce9284, 0xffce9284, 0xffefdbd6, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffe9d2d0, 0xffbd8273, 0xffbd8273, 0xffbd8273, 0xffad796b, 0xffad796b, 0xffad796b, + 0xffe6e3e6, 0xffadaaad, 0x00000000, 0x11000000, 0x22000000, 0x77190000, 0xdd523331, 0xeec59a94, + 0xeec59a94, 0xeeba968c, 0xeeb88e84, 0xeeb88e84, 0xeeb5867b, 0xeeb2837b, 0xeeaf7c73, 0xeead756b, + 0xeead756b, 0xee947168, 0xeecea69c, 0xeecea69c, 0x77210800, 0x22000000, 0x11000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x44000000, 0xee6b2021, 0xff762421, + 0xff762421, 0xff762421, 0xff7b2421, 0xff862824, 0xff862824, 0xff912d26, 0xff943121, 0xff943121, + 0xff943121, 0xff943121, 0xff8c3129, 0xff8c3129, 0xff8c3129, 0xff8c3129, 0xff8c3529, 0xff8c3529, + 0xff8c3529, 0xff8c3529, 0xff8c3529, 0xff8c3529, 0xff8c3529, 0xff8c3529, 0xff8c3129, 0xff8c3129, + 0xff8c3129, 0xff8c3129, 0xff7b2d21, 0xff7b2d21, 0xff7b2d21, 0xff7b2d21, 0xff7b2d29, 0xff7b2d29, + 0xff7b2d29, 0xff7b2d29, 0xff6b2019, 0xff6b2019, 0xff6b2019, 0xff6b2019, 0xff581c16, 0xff4d1813, + 0xff4d1813, 0xff421410, 0xaa000000, 0x33000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x22191419, 0xbb976865, 0xffd6928c, 0xffd6928c, 0xffde9694, + 0xffde9694, 0xffde9694, 0xffde9694, 0xffde9694, 0xffde9694, 0xffdb908c, 0xffdb908c, 0xffd68a7b, + 0xffbd776b, 0xffa5645a, 0xff8c514a, 0xff9a7484, 0xffd6cad6, 0xffd6cad6, 0xff9a7484, 0xffad4942, + 0xffa2423a, 0xffad4942, 0xffad4942, 0xffc54131, 0xffbd3d2f, 0xffb5392c, 0xffb5392c, 0xffaa352c, + 0xffaa352c, 0xffaa352c, 0xff9f3126, 0xdd652216, 0x55080400, 0x22080400, 0x11080400, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xff949694, 0xffe6e3e6, 0xffce9684, 0xffce9684, + 0xffce9684, 0xffce9284, 0xffce9284, 0xffdeb6ad, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xfffffbff, 0xffd3aaa2, 0xffbd8273, 0xffbd8273, 0xffad796b, 0xffad796b, 0xffad796b, + 0xffe6e3e6, 0xffadaaad, 0x00000000, 0x11000000, 0x22000000, 0x77190000, 0xee8c6763, 0xeec59a94, + 0xeec59a94, 0xeebd9e94, 0xeeba968c, 0xeeb88e84, 0xeeb88e84, 0xeeb2837b, 0xeeb2837b, 0xeeaf7c73, + 0xeead756b, 0xee947168, 0xeecea69c, 0xeecea69c, 0x88210800, 0x33000000, 0x11000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x11000000, 0xaa31100e, 0xff812821, 0xff812821, + 0xff762421, 0xff812821, 0xff862824, 0xff862824, 0xff912d26, 0xff912d26, 0xff943121, 0xff9a746e, + 0xff9c9694, 0xff9c9694, 0xff978481, 0xff978481, 0xff978481, 0xff978481, 0xffa29391, 0xffa29391, + 0xffa29391, 0xffa29391, 0xffa29391, 0xffa29391, 0xffa29391, 0xffa29391, 0xffa29291, 0xffa29291, + 0xffa29291, 0xffa29291, 0xffb2aeaa, 0xffb2aeaa, 0xffb2aeaa, 0xffb2aeaa, 0xffceb6b2, 0xfff7fbf7, + 0xfff7fbf7, 0xfff7fbf7, 0xffbd9694, 0xff6b2019, 0xff6b2019, 0xff6b2019, 0xff581c16, 0xff581c16, + 0xff4d1813, 0xff4d1813, 0xee2c0d0b, 0x66000000, 0x11000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x88583e3f, 0xffd6928c, 0xffd6928c, 0xffd6928c, 0xffdb928f, + 0xffdb928f, 0xffdb928f, 0xffdb928f, 0xffdb908c, 0xffdb908c, 0xffdb908c, 0xffdb908c, 0xffd68a7b, + 0xffbd776b, 0xffa5645a, 0xff8c514a, 0xff9a7484, 0xffd6cad6, 0xffd6cad6, 0xff9a7484, 0xff973b31, + 0xffa2423a, 0xffa2423a, 0xffa2423a, 0xffbd3d2f, 0xffb5392c, 0xffb5392c, 0xffad3529, 0xffaa352c, + 0xffaa352c, 0xff9f3126, 0xff9f3126, 0xff943121, 0xaa37130b, 0x44080400, 0x11080400, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xff949694, 0xffe6e3e6, 0xffce9684, 0xffce9684, + 0xffce9684, 0xffce9284, 0xffce9284, 0xffefdbd6, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xfffffbff, 0xfffffbff, 0xffbd8273, 0xffbd8273, 0xffad796b, 0xffad796b, 0xffad796b, + 0xffe6e3e6, 0xffadaaad, 0x00000000, 0x11000000, 0x22000000, 0x88190000, 0xee8c6763, 0xeec59a94, + 0xeec59a94, 0xeebd9e94, 0xeeba968c, 0xeeba968c, 0xeeb88e84, 0xeeb58a84, 0xeeb2837b, 0xeeaf7c73, + 0xeead756b, 0xee947168, 0xeecea69c, 0xeecea69c, 0x99210800, 0x33000000, 0x11000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x33000000, 0xee63201b, 0xff812821, 0xff812821, + 0xff812821, 0xff8c2d21, 0xff912d26, 0xff912d26, 0xff912d26, 0xff912d26, 0xff943121, 0xff943121, + 0xff9c9694, 0xff9c9694, 0xff978481, 0xff978481, 0xff978481, 0xff9caead, 0xffa29391, 0xffa29391, + 0xffa29391, 0xffa29391, 0xffa29391, 0xffa29391, 0xffa29391, 0xffa29391, 0xffa29291, 0xffa29291, + 0xffa29291, 0xffa29291, 0xffb2aeaa, 0xffb2aeaa, 0xffb2aeaa, 0xffb2aeaa, 0xfff7fbf7, 0xfff7fbf7, + 0xfff7fbf7, 0xfff7fbf7, 0xff864842, 0xff6b2019, 0xff6b2019, 0xff6b2019, 0xff581c16, 0xff581c16, + 0xff581c16, 0xff4d1813, 0xff421410, 0x99000000, 0x33000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x33211413, 0xdd976865, 0xffd6928c, 0xffd6928c, 0xffd6928c, 0xffd98e89, + 0xffd98e89, 0xffd98e89, 0xffd98e89, 0xffdb908c, 0xffdb908c, 0xffd98b84, 0xffd98b84, 0xffd68a7b, + 0xffbd776b, 0xffa5645a, 0xff8c514a, 0xff7b495a, 0xffd6cad6, 0xffd6cad6, 0xff7b495a, 0xff8c3529, + 0xff973b31, 0xff973b31, 0xff973b31, 0xffb5392c, 0xffb5392c, 0xffad3529, 0xffad3529, 0xffaa352c, + 0xff9f3126, 0xff9f3126, 0xff9f3126, 0xff943121, 0xee652216, 0x77080400, 0x33080400, 0x11000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xff949694, 0xffe6e3e6, 0xffc58a7b, 0xffc58a7b, + 0xffc58a7b, 0xffbd8273, 0xffe9d0cb, 0xfffff7f7, 0xfffff7f7, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xfff7f3f7, 0xfff7f3f7, 0xffdec9c8, 0xffad756b, 0xffa57163, 0xffa57163, 0xffa57163, + 0xffe6e3e6, 0xffadaaad, 0x00000000, 0x11000000, 0x22000000, 0x88190000, 0xee977779, 0xeed6b2b5, + 0xeed6b2b5, 0xeec3a39f, 0xeec09d9a, 0xeebd9694, 0xeebd9694, 0xeeb58b84, 0xeeb5847b, 0xeeb57d73, + 0xeeb57d73, 0xee9a6f68, 0xeecea29c, 0xeecea29c, 0x99310800, 0x33000000, 0x11000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00080408, 0xff4a464a, 0xff8c888c, 0xff8c888c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, + 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, + 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff949294, 0xff949294, 0xff9c9a9c, 0xff9c9a9c, + 0xff9c9a9c, 0xff9c9a9c, 0xff9c9a9c, 0xff9c9a9c, 0xff9c9a9c, 0xff9c9a9c, 0xff9c9a9c, 0xff9c9a9c, + 0xff9c9a9c, 0xff9c9a9c, 0xff9c9a9c, 0xff949694, 0xff949694, 0xff949694, 0xff949694, 0xff949694, + 0xff949694, 0xff949694, 0xff949694, 0xff949694, 0xff949694, 0xff949694, 0xff949694, 0xff949694, + 0xff949694, 0xff949694, 0xff949694, 0xff949694, 0xff949694, 0xff949694, 0xff949694, 0xff949294, + 0xff949294, 0xff949294, 0xff949294, 0xff949294, 0xff949294, 0xff949294, 0xff949294, 0xff949294, + 0xff949294, 0xff949294, 0xff949294, 0xff949294, 0xff949294, 0xff949294, 0xff949294, 0xff948e94, + 0xff948e94, 0xff948e94, 0xff948e94, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, + 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff8c8e8c, 0xff949694, + 0xff949694, 0xff949694, 0xff737573, 0xff5d5c5d, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x7731100e, 0xff943129, 0xff8c2d21, 0xff8c2d21, + 0xff8c2d21, 0xff8c2d21, 0xff912d26, 0xff9c3129, 0xff9c3129, 0xff9c3129, 0xff943121, 0xff943121, + 0xff9a746e, 0xff9c9694, 0xff9caead, 0xff9caead, 0xff9caead, 0xff9caead, 0xffadc2c5, 0xffadc2c5, + 0xffadc2c5, 0xffadc2c5, 0xffadc2c5, 0xffadc2c5, 0xffadc2c5, 0xffadc2c5, 0xffadc2c5, 0xffadc2c5, + 0xffadc2c5, 0xffadc2c5, 0xffb2aeaa, 0xffb2aeaa, 0xffceefef, 0xffceefef, 0xfff7fbf7, 0xfff7fbf7, + 0xfff7fbf7, 0xffa5716e, 0xff6b2019, 0xff6b2019, 0xff6b2019, 0xff6b2019, 0xff632019, 0xff581c16, + 0xff581c16, 0xff4d1813, 0xff421410, 0xcc160705, 0x44000000, 0x11000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x88633d3a, 0xffd6928c, 0xffd6928c, 0xffd6928c, 0xffd6928c, 0xffd98e89, + 0xffd98e89, 0xffd98e89, 0xffd68a84, 0xffd98b84, 0xffd98b84, 0xffd6867b, 0xffd6867b, 0xffbd776b, + 0xffbd776b, 0xffa5645a, 0xff8c514a, 0xff7b495a, 0xffd6cad6, 0xffd6cad6, 0xff7b495a, 0xff8c3529, + 0xff8c3529, 0xff8c3529, 0xff973b31, 0xffb5392c, 0xffad3529, 0xffad3529, 0xffad3529, 0xff9f3126, + 0xff9f3126, 0xff942d21, 0xff942d21, 0xff943121, 0xff943121, 0xbb37130b, 0x44080400, 0x11000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xff949694, 0xffe6e3e6, 0xffc58a7b, 0xffc58a7b, + 0xffc58a7b, 0xffbd8273, 0xffe9d0cb, 0xfffff7f7, 0xfffff7f7, 0xffe6d2ce, 0xffe6d2ce, 0xffe6d2ce, + 0xffe6d2ce, 0xfff7f3f7, 0xfff7f3f7, 0xffdec9c8, 0xffad756b, 0xffa57163, 0xffa57163, 0xffa57163, + 0xffe6e3e6, 0xffadaaad, 0x00000000, 0x11000000, 0x33000000, 0x88190000, 0xee977779, 0xeed6b2b5, + 0xeed6b2b5, 0xeec5aaa5, 0xeec3a39f, 0xeebd9694, 0xeebd9694, 0xeeb58b84, 0xeeb5847b, 0xeeb5847b, + 0xeeb57d73, 0xee9a6f68, 0xeecea29c, 0xeecea29c, 0x99310800, 0x33000000, 0x11000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00080408, 0xff8c888c, 0xff8c888c, 0xffcecace, 0xffbdbebd, 0xffbdbebd, 0xffbdbebd, 0xffbdbebd, + 0xffbdbebd, 0xffbdbebd, 0xffbdbebd, 0xffbdbebd, 0xffbdbebd, 0xffbdbebd, 0xffbdbebd, 0xffbdbebd, + 0xffbdbebd, 0xffbdbebd, 0xffbdbebd, 0xffbdbebd, 0xffc0c0c0, 0xffc0c0c0, 0xffced0ce, 0xffcecdce, + 0xffcecdce, 0xffcecdce, 0xffcecdce, 0xffcecdce, 0xffcecdce, 0xffcecdce, 0xffcecdce, 0xffcecdce, + 0xffcecdce, 0xffcecdce, 0xffcecdce, 0xffcbc9cb, 0xffcbc9cb, 0xffcbc9cb, 0xffcbc9cb, 0xffc5c9c5, + 0xffc5c9c5, 0xffc5c9c5, 0xffc5c9c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, + 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c5c5, + 0xffc5c5c5, 0xffc5c5c5, 0xffc5c5c5, 0xffc5c2c5, 0xffc5c2c5, 0xffc5c2c5, 0xffc5c2c5, 0xffc5c2c5, + 0xffc5c2c5, 0xffc5c2c5, 0xffc5c2c5, 0xffc0c2c0, 0xffc0c2c0, 0xffc0c2c0, 0xffc0c2c0, 0xffc0bec0, + 0xffc0bec0, 0xffc0bec0, 0xffc0bec0, 0xffbdbebd, 0xffbdbebd, 0xffbdbebd, 0xffbdbebd, 0xffbdbebd, + 0xffbdbebd, 0xffbdbebd, 0xffbdbebd, 0xffbdbebd, 0xffbdbebd, 0xffbdbebd, 0xffbdbebd, 0xffb5b6b5, + 0xffb5b6b5, 0xffb5b6b5, 0xffb5b6b5, 0xff8c8a8c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000400, 0x00000000, 0x11000000, 0xaa31100e, 0xff943129, 0xff8c2d21, 0xff8c2d21, + 0xff912f24, 0xff912f24, 0xff9c3129, 0xff9c3129, 0xffa23329, 0xffa23329, 0xffad3929, 0xffad3929, + 0xffad3929, 0xffb59a9c, 0xffc8b5b5, 0xffc8b5b5, 0xffc8b5b5, 0xffc8b5b5, 0xffd6d2d6, 0xffd6d2d6, + 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, + 0xffd6d2d6, 0xffd6d2d6, 0xffdee3de, 0xffe9ece9, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffdbb9b5, 0xff942d21, 0xff812821, 0xff812821, 0xff762421, 0xff6b2021, 0xff682019, 0xff682019, + 0xff5d1c19, 0xff521819, 0xff4a1810, 0xdd190805, 0x66000000, 0x11000000, 0x00000000, 0x00000000, + 0x00000000, 0x11000000, 0xcc8f514d, 0xffd6867b, 0xffd6867b, 0xffd6867b, 0xffd6867b, 0xffd6827b, + 0xffd6827b, 0xffd6827b, 0xffd6827b, 0xffd6867b, 0xffd6867b, 0xffd6867b, 0xffd07970, 0xffce7573, + 0xffce7573, 0xffb25e5a, 0xff974842, 0xff632d3a, 0xffefefef, 0xffefefef, 0xff632d3a, 0xff862b1e, + 0xff9a3224, 0xff9a3224, 0xffad3929, 0xffad3529, 0xffad3529, 0xff9c3126, 0xff9c3126, 0xff943121, + 0xff892d21, 0xff892d21, 0xff892d21, 0xff7b2821, 0xff7b2821, 0xdd551b16, 0x66080000, 0x22000000, + 0x11000000, 0x00000000, 0x00000000, 0x00000400, 0xff949694, 0xffe6e3e6, 0xffc58a7b, 0xffc58a7b, + 0xffc58a7b, 0xffbd8273, 0xffbd8273, 0xffbd8273, 0xffbd8273, 0xffb5796b, 0xffb5796b, 0xffb5796b, + 0xffb5796b, 0xffad756b, 0xffad756b, 0xffad756b, 0xffad756b, 0xffa57163, 0xffa57163, 0xffa57163, + 0xffe6e3e6, 0xffadaaad, 0x00000000, 0x11000000, 0x33000000, 0x99190000, 0xee977779, 0xeed6b2b5, + 0xeed6b2b5, 0xeec5aaa5, 0xeec3a39f, 0xeec09d9a, 0xeebd9694, 0xeeb58b84, 0xeeb58b84, 0xeeb5847b, + 0xeeb57d73, 0xee9a6f68, 0xeecea29c, 0xeecea29c, 0xaa310800, 0x33000000, 0x11000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00080408, 0xff8c888c, 0xffcecace, 0xffcecace, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, + 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, + 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffe6ebe6, 0xffe6e7e6, + 0xffe6e7e6, 0xffe6e7e6, 0xffe6e7e6, 0xffe6e7e6, 0xffe6e7e6, 0xffe6e7e6, 0xffe6e7e6, 0xffe6e7e6, + 0xffe6e7e6, 0xffe6e7e6, 0xffe6e7e6, 0xffe6e3e6, 0xffe6e3e6, 0xffe6e3e6, 0xffe6e3e6, 0xffdee3de, + 0xffdee3de, 0xffdee3de, 0xffdee3de, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedfde, + 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedfde, + 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, + 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6d7d6, + 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, + 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, + 0xffd6d7d6, 0xffd6d7d6, 0xffb5b6b5, 0xff8c8a8c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000400, 0x00000000, 0x22000000, 0xdd63201b, 0xff943129, 0xff912f24, 0xff912f24, + 0xff912f24, 0xff912f24, 0xffa23329, 0xffa23329, 0xffa23329, 0xffa73629, 0xffad3929, 0xffad3929, + 0xffad3929, 0xffaf5950, 0xffc8b5b5, 0xffc8b5b5, 0xffd6dbde, 0xffd6dbde, 0xffe1dfe1, 0xffe1dfe1, + 0xffecebec, 0xffecebec, 0xfff1f0f1, 0xfff1f0f1, 0xfff1f0f1, 0xfff1f0f1, 0xfff1f0f1, 0xfff1f0f1, + 0xfff1f0f1, 0xfff1f0f1, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffb8736b, 0xff942d21, 0xff8c2d21, 0xff812821, 0xff762421, 0xff762421, 0xff682019, 0xff682019, + 0xff5d1c19, 0xff521819, 0xff4a1810, 0xee31100b, 0x88000000, 0x22000000, 0x00000000, 0x00000000, + 0x00000000, 0x55472826, 0xffd67973, 0xffd37f76, 0xffd37f76, 0xffd37f76, 0xffd37f76, 0xffd6827b, + 0xffd6827b, 0xffd6827b, 0xffd6827b, 0xffd07970, 0xffd07970, 0xffd07970, 0xffd07970, 0xffce7573, + 0xffb25e5a, 0xff974842, 0xff974842, 0xff632d3a, 0xffefefef, 0xffefefef, 0xff632d3a, 0xff732419, + 0xff862b1e, 0xff9a3224, 0xff9a3224, 0xff9c3126, 0xff9c3126, 0xff9c3126, 0xff8c2d24, 0xff892d21, + 0xff892d21, 0xff7e2821, 0xff7e2821, 0xff7b2821, 0xff7b2821, 0xff7b2821, 0x992f0d0b, 0x33000000, + 0x11000000, 0x00000000, 0x00000000, 0x00000400, 0xff949694, 0xffe6e3e6, 0xffc58a7b, 0xffc58a7b, + 0xffc58a7b, 0xffbd8273, 0xffbd8273, 0xffbd8273, 0xffbd8273, 0xffb5796b, 0xffb5796b, 0xffb5796b, + 0xffb5796b, 0xffad756b, 0xffad756b, 0xffad756b, 0xffad756b, 0xffa57163, 0xffa57163, 0xffa57163, + 0xffe6e3e6, 0xffadaaad, 0x00000000, 0x11000000, 0x33000000, 0x99190000, 0xee977779, 0xeed6b2b5, + 0xeed6b2b5, 0xeec5aaa5, 0xeec5aaa5, 0xeec09d9a, 0xeebd9694, 0xeeb5928c, 0xeeb58b84, 0xeeb5847b, + 0xeeb5847b, 0xee9a6f68, 0xeecea29c, 0xeecea29c, 0xaa310800, 0x33000000, 0x11000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00080408, 0xff8c888c, 0xffcecace, 0xffcecace, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, + 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, + 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffe6ebe6, 0xffe6e7e6, + 0xffe6e7e6, 0xffe6e7e6, 0xffe6e7e6, 0xffe6e7e6, 0xffe6e7e6, 0xffe6e7e6, 0xffe6e7e6, 0xffe6e7e6, + 0xffe6e7e6, 0xffe6e7e6, 0xffe6e7e6, 0xffe6e3e6, 0xffe6e3e6, 0xffe6e3e6, 0xffe6e3e6, 0xffdee3de, + 0xffdee3de, 0xffdee3de, 0xffdee3de, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedfde, + 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedfde, + 0xffdedfde, 0xffdedfde, 0xffdedfde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffdedbde, + 0xffdedbde, 0xffdedbde, 0xffdedbde, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6dbd6, 0xffd6d7d6, + 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, + 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, + 0xffd6d7d6, 0xffd6d7d6, 0xffb5b6b5, 0xff8c8a8c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000400, 0x00000000, 0x5531100e, 0xff943129, 0xff943129, 0xff912f24, 0xff912f24, + 0xff973226, 0xff973226, 0xffa23329, 0xffa23329, 0xffa73629, 0xffa73629, 0xffad3929, 0xffad3929, + 0xffad3929, 0xffad3929, 0xffba8f8c, 0xffd6dbde, 0xffd6dbde, 0xffd6dbde, 0xffecebec, 0xffecebec, + 0xfff7f7f7, 0xfff7f7f7, 0xfff1f0f1, 0xfff1f0f1, 0xfff1f0f1, 0xfff1f0f1, 0xfff1f0f1, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffdbb9b5, + 0xff942d21, 0xff942d21, 0xff8c2d21, 0xff812821, 0xff812821, 0xff762421, 0xff682019, 0xff682019, + 0xff682019, 0xff5d1c19, 0xff4a1810, 0xff4a1810, 0xaa000000, 0x33000000, 0x00000000, 0x00000000, + 0x00000000, 0x88472826, 0xffd67973, 0xffd07870, 0xffd07870, 0xffd07870, 0xffd07870, 0xffd37b73, + 0xffd37b73, 0xffd37b73, 0xffd0746b, 0xffd07970, 0xffcb6d65, 0xffcb6d65, 0xffcb6d65, 0xffb25e5a, + 0xffb25e5a, 0xff974842, 0xff7b3129, 0xff632d3a, 0xffefefef, 0xffefefef, 0xff632d3a, 0xff732419, + 0xff862b1e, 0xff9a3224, 0xff9a3224, 0xff9c3126, 0xff8c2d24, 0xff8c2d24, 0xff8c2d24, 0xff7e2821, + 0xff7e2821, 0xff7e2821, 0xff732421, 0xff7b2821, 0xff7b2821, 0xff7b2821, 0xbb2f0d0b, 0x44000000, + 0x22000000, 0x00000000, 0x00000000, 0x00000400, 0xff949694, 0xffe9d5d0, 0xffbd8273, 0xffbd8273, + 0xffbd8273, 0xffad756b, 0xffad756b, 0xffad756b, 0xffad756b, 0xff9c6d63, 0xff9c6d63, 0xff9c6d63, + 0xff9c6d63, 0xff9c6963, 0xff9c6963, 0xff9c6963, 0xff9c6963, 0xff9c6d63, 0xff9c6d63, 0xff9c6d63, + 0xffdececb, 0xffadaaad, 0x00000000, 0x11000000, 0x33000000, 0x99190000, 0xee97827e, 0xeed6c2bd, + 0xeed6c2bd, 0xeec5b2b5, 0xeec3aaaa, 0xeec0a29f, 0xeebd9a94, 0xeeba8f86, 0xeeba8f86, 0xeeb88881, + 0xeeb5827b, 0xee976c6b, 0xeec59e9c, 0xeec59e9c, 0xaa3a0808, 0x33000000, 0x11000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000400, 0xff7e807e, 0xffbdbebd, 0xffbdbebd, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, + 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, + 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffd6d7d6, 0xffd6d7d6, + 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d7d6, 0xffd6d2d6, + 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, 0xffd6d2d6, 0xffcecece, + 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, + 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecece, 0xffcecace, + 0xffcecace, 0xffcecace, 0xffcecace, 0xffcecace, 0xffcecace, 0xffcecace, 0xffcecace, 0xffcecace, + 0xffcecace, 0xffcecace, 0xffcecace, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, + 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, + 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffc5c6c5, 0xffbdbebd, + 0xffbdbebd, 0xffbdbebd, 0xffbdbebd, 0xff848284, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000400, 0x00000000, 0x7731100e, 0xff943129, 0xff943129, 0xff973226, 0xff973226, + 0xff973226, 0xff973226, 0xffa23329, 0xffa73629, 0xffa73629, 0xffa73629, 0xffad3929, 0xffad3929, + 0xffad3929, 0xffad3929, 0xffad6963, 0xffd6dbde, 0xffd6dbde, 0xffd6dbde, 0xffecebec, 0xfff7f7f7, + 0xfff7f7f7, 0xfff7f7f7, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xff942d21, + 0xff942d21, 0xff942d21, 0xff8c2d21, 0xff8c2d21, 0xff812821, 0xff812821, 0xff732419, 0xff682019, + 0xff682019, 0xff5d1c19, 0xff4a1810, 0xff4a1810, 0xbb190805, 0x44000000, 0x11000000, 0x00000000, + 0x11000000, 0xaa8f514d, 0xffd67973, 0xffce716b, 0xffce716b, 0xffce716b, 0xffce716b, 0xffce6d63, + 0xffce6d63, 0xffce6d63, 0xffce6d63, 0xffcb6d65, 0xffcb6d65, 0xffc5615a, 0xffc5615a, 0xffb25e5a, + 0xff974842, 0xff974842, 0xff7b3129, 0xff632d3a, 0xffefefef, 0xffefefef, 0xff632d3a, 0xff732419, + 0xff732419, 0xff862b1e, 0xff862b1e, 0xff8c2d24, 0xff7b2821, 0xff7b2821, 0xff7b2821, 0xff732421, + 0xff732421, 0xff732421, 0xff732421, 0xff7b2821, 0xff7b2821, 0xff7b2821, 0xdd551b16, 0x55000000, + 0x22000000, 0x00000000, 0x00000000, 0x00000400, 0xff949694, 0xffe9d5d0, 0xffbd8273, 0xffbd8273, + 0xffbd8273, 0xffad756b, 0xffad756b, 0xffad756b, 0xffad756b, 0xff9c6d63, 0xff9c6d63, 0xff9c6d63, + 0xff9c6d63, 0xff9c6963, 0xff9c6963, 0xff9c6963, 0xff9c6963, 0xff9c6d63, 0xff9c6d63, 0xff9c6d63, + 0xffdececb, 0xffadaaad, 0x00000000, 0x11000000, 0x33000000, 0x99190000, 0xee97827e, 0xeed6c2bd, + 0xeed6c2bd, 0xeec5b2b5, 0xeec3aaaa, 0xeec0a29f, 0xeebd9a94, 0xeebd968c, 0xeeba8f86, 0xeeb88881, + 0xeeb5827b, 0xee976c6b, 0xeec59e9c, 0xeec59e9c, 0xaa3a0808, 0x33000000, 0x11000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000400, 0xff3f423f, 0xff7e807e, 0xff7e807e, 0xff848484, 0xff848484, 0xff848484, 0xff848484, + 0xff848484, 0xff848484, 0xff848484, 0xff848484, 0xff848484, 0xff848484, 0xff848484, 0xff848484, + 0xff848484, 0xff848484, 0xff848484, 0xff848484, 0xff848484, 0xff848484, 0xff8f8f8f, 0xff8f8f8f, + 0xff8f8f8f, 0xff8f8f8f, 0xff8f8f8f, 0xff8f8f8f, 0xff8f8f8f, 0xff8f8f8f, 0xff8f8f8f, 0xff8f8e8f, + 0xff8f8e8f, 0xff8f8e8f, 0xff8f8e8f, 0xff8f8c8f, 0xff8f8c8f, 0xff8f8c8f, 0xff8f8c8f, 0xff898a89, + 0xff898a89, 0xff898a89, 0xff898a89, 0xff898a89, 0xff898a89, 0xff898a89, 0xff898a89, 0xff898a89, + 0xff898a89, 0xff898a89, 0xff898a89, 0xff898a89, 0xff898a89, 0xff898a89, 0xff898a89, 0xff898789, + 0xff898789, 0xff898789, 0xff898789, 0xff898789, 0xff898789, 0xff898789, 0xff898789, 0xff898789, + 0xff898789, 0xff898789, 0xff898789, 0xff848484, 0xff848484, 0xff848484, 0xff848484, 0xff848484, + 0xff848484, 0xff848484, 0xff848484, 0xff848484, 0xff848484, 0xff848484, 0xff848484, 0xff848484, + 0xff848484, 0xff848484, 0xff848484, 0xff848484, 0xff848484, 0xff848484, 0xff848484, 0xff7e7f7e, + 0xff7e7f7e, 0xff7e7f7e, 0xff7e7f7e, 0xff585658, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x8834120e, 0xff9c3529, 0xff9c3529, 0xff9f3229, 0xff9f3229, + 0xff9f3229, 0xffa53529, 0xffaa362f, 0xffaf372c, 0xffaf372c, 0xffaf372c, 0xffb53931, 0xffb53931, + 0xffb83a2f, 0xffb53931, 0xffb53d31, 0xffcba39f, 0xffd6d7d6, 0xffd6d7d6, 0xffe6e3e6, 0xffefefef, + 0xfff7fbf7, 0xfff7fbf7, 0xfffcfcfc, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffd69e9c, 0xff9c3529, + 0xff9c3529, 0xff9c3529, 0xff942e21, 0xff8c2b21, 0xff8c2b21, 0xff842821, 0xff7b2421, 0xff651f1b, + 0xff651f1b, 0xff5a1c19, 0xff521810, 0xff521810, 0xcc1b0805, 0x55000000, 0x11000000, 0x00000000, + 0x11000000, 0xcc8f4c42, 0xffd67163, 0xffce6963, 0xffce6963, 0xffce6963, 0xffce6963, 0xffc5655a, + 0xffc5655a, 0xffc5655a, 0xffc5655a, 0xffc55952, 0xffc55952, 0xffc55952, 0xffc55952, 0xffbd493a, + 0xffbd493a, 0xff7e3126, 0xff7e3126, 0xff190808, 0xffffffff, 0xffffffff, 0xff190808, 0xff581b16, + 0xff842821, 0xff842821, 0xff842821, 0xff7b2821, 0xff7b2821, 0xff7b2821, 0xff7b2821, 0xff6b2019, + 0xff6b2019, 0xff6b2019, 0xff6b2019, 0xff6b2019, 0xff6b2019, 0xff6b2019, 0xee471610, 0x55000000, + 0x22000000, 0x00000000, 0x00000000, 0x00000400, 0xff949694, 0xffe9d5d0, 0xffffffff, 0xffbd8273, + 0xffbd8273, 0xffad756b, 0xffad756b, 0xffad756b, 0xffad756b, 0xff9c6d63, 0xff9c6d63, 0xff9c6d63, + 0xff9c6d63, 0xff9c6963, 0xff9c6963, 0xff9c6963, 0xff9c6963, 0xff9c6d63, 0xff9c6d63, 0xffffffff, + 0xffdececb, 0xffadaaad, 0x00000000, 0x11000000, 0x33000000, 0x99190000, 0xee97827e, 0xeed6c2bd, + 0xeed6c2bd, 0xeec5b2b5, 0xeec3aaaa, 0xeec0a29f, 0xeebd9a94, 0xeebd968c, 0xeeba8f86, 0xeeb88881, + 0xeeb5827b, 0xee976c6b, 0xeec59e9c, 0xeec59e9c, 0xaa3a0808, 0x33000000, 0x11000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000400, 0x00000400, 0x00000400, 0x00000400, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, + 0x00000400, 0x00000400, 0x00000400, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x9934120e, 0xff9c3529, 0xff9c3529, 0xff9f3229, 0xff9c3129, + 0xffa23329, 0xffa53529, 0xffaf372c, 0xffaf372c, 0xffb53929, 0xffb53929, 0xffb53931, 0xffb83a2f, + 0xffb53931, 0xffb83a2f, 0xffb53d31, 0xffb53d31, 0xffd6d7d6, 0xffd6d7d6, 0xffe6e3e6, 0xffefefef, + 0xffefefef, 0xfff7fbf7, 0xfffcfcfc, 0xfffcfcfc, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xff9c3529, 0xff9c3529, + 0xff9c3529, 0xff9c3529, 0xff942e21, 0xff942e21, 0xff8c2b21, 0xff842821, 0xff7b2421, 0xff70221e, + 0xff651f1b, 0xff5a1c19, 0xff521810, 0xff521810, 0xcc1b0805, 0x55000000, 0x11000000, 0x00000000, + 0x11000000, 0x22000000, 0x44000000, 0x66000000, 0x77000000, 0x77000000, 0x77000000, 0x77000000, + 0x77000000, 0x77000000, 0x77000000, 0x77000000, 0x77000000, 0x77000000, 0x77000000, 0x77000000, + 0x88000000, 0x99000000, 0xaa000000, 0xcc190808, 0xffffffff, 0xffffffff, 0xbb190808, 0xaa000000, + 0x99000000, 0x88000000, 0x77000000, 0x77000000, 0x77000000, 0x77000000, 0x77000000, 0x77000000, + 0x77000000, 0x77000000, 0x77000000, 0x77000000, 0x77000000, 0x77000000, 0x66000000, 0x44000000, + 0x22000000, 0x00000000, 0x00000000, 0x00000400, 0xff949694, 0xffe9d5d0, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffdececb, 0xffadaaad, 0x00000000, 0x11000000, 0x33000000, 0x99190000, 0xee97827e, 0xeed6c2bd, + 0xeed6c2bd, 0xeec5b2b5, 0xeec3aaaa, 0xeec0a29f, 0xeebd9a94, 0xeebd968c, 0xeeba8f86, 0xeeb88881, + 0xeeb5827b, 0xee976c6b, 0xeec59e9c, 0xeec59e9c, 0xaa3a0808, 0x33000000, 0x11000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000400, 0x00000400, 0x00000400, 0x00000400, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, + 0x00000400, 0x00000400, 0x00000400, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0xaa34120e, 0xff9c3529, 0xff9c3529, 0xff9f3229, 0xff9f3229, + 0xffa53529, 0xffa53529, 0xffaf372c, 0xffb53929, 0xffb53929, 0xffb53929, 0xffb83a2f, 0xffb83a2f, + 0xffb83a2f, 0xffb83a2f, 0xffb53d31, 0xffb53d31, 0xffc07068, 0xffd6d7d6, 0xffded7de, 0xffe6e3e6, + 0xffefefef, 0xffefefef, 0xfffafafa, 0xfffcfcfc, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffc87d76, 0xff9c3529, 0xff9c3529, + 0xff9c3529, 0xff9c3529, 0xff942e21, 0xff942e21, 0xff8c2b21, 0xff842821, 0xff7b2421, 0xff70221e, + 0xff651f1b, 0xff651f1b, 0xff521810, 0xff521810, 0xdd1b0805, 0x66000000, 0x11000000, 0x00000000, + 0x00000000, 0x11000000, 0x22000000, 0x33000000, 0x44000000, 0x44000000, 0x44000000, 0x44000000, + 0x44000000, 0x44000000, 0x44000000, 0x44000000, 0x44000000, 0x44000000, 0x44000000, 0x44000000, + 0x55000000, 0x66000000, 0x88000000, 0xaa190808, 0xffffffff, 0xffffffff, 0xaa190808, 0x88000000, + 0x66000000, 0x55000000, 0x44000000, 0x44000000, 0x44000000, 0x44000000, 0x44000000, 0x44000000, + 0x44000000, 0x44000000, 0x44000000, 0x44000000, 0x44000000, 0x44000000, 0x33000000, 0x22000000, + 0x11000000, 0x00000000, 0x00000000, 0x00000400, 0xff949694, 0xffe6e3e6, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffe6e3e6, 0xffadaaad, 0x00000000, 0x11000000, 0x33000000, 0x99190000, 0xee9c827e, 0xeedec2bd, + 0xeedec2bd, 0xeec5b6b5, 0xeec3aead, 0xeec0a6a5, 0xeebd9e9c, 0xeebd9694, 0xeeba8f8c, 0xeeb88884, + 0xeeb5827b, 0xee9c6d6b, 0xeece9e9c, 0xeece9e9c, 0xaa3a0c08, 0x33000000, 0x11000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x11000000, 0xbb68231b, 0xff9c3529, 0xff9c3529, 0xffa53529, 0xffa53529, + 0xffa53529, 0xffa53529, 0xffb53929, 0xffb53929, 0xffb53929, 0xffb53929, 0xffb83a2f, 0xffb83a2f, + 0xffba3b2c, 0xffb83a2f, 0xffb53d31, 0xffb53d31, 0xffb53d31, 0xffcba39f, 0xffded7de, 0xffe6e3e6, + 0xffe6e3e6, 0xffefefef, 0xfff7f7f7, 0xfffcfcfc, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffe4beba, 0xffad3d31, 0xff9c3529, 0xff9c3529, + 0xff9c3529, 0xff9c3529, 0xff9c3121, 0xff942e21, 0xff8c2b21, 0xff842821, 0xff7b2421, 0xff70221e, + 0xff651f1b, 0xff651f1b, 0xff521810, 0xff521810, 0xdd1b0805, 0x66000000, 0x22000000, 0x00000000, + 0x00000000, 0x00000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, + 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, + 0x22000000, 0x44000000, 0x66000000, 0x99190808, 0xffffffff, 0xffffffff, 0x88190808, 0x66000000, + 0x44000000, 0x22000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, + 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xff949694, 0xffe6e3e6, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffe6e3e6, 0xffadaaad, 0x00000000, 0x11000000, 0x33000000, 0x99190000, 0xee9c827e, 0xeedec2bd, + 0xeedec2bd, 0xeec5b6b5, 0xeec3aead, 0xeec0a6a5, 0xeebd9e9c, 0xeebd9694, 0xeeba8f8c, 0xeeb88884, + 0xeeb5827b, 0xee9c6d6b, 0xeece9e9c, 0xeece9e9c, 0xaa3a0c08, 0x33000000, 0x11000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000400, 0x00000000, 0x9937120e, 0xffa53529, 0xffa53529, 0xffa53529, 0xffa53529, + 0xffa53529, 0xffaa3729, 0xffb53929, 0xffb53a2c, 0xffb53b2f, 0xffb53b2f, 0xffbd3b31, 0xffbd3b31, + 0xffbd3b31, 0xffbd3b31, 0xffbd3d31, 0xffbd3d31, 0xffbd3d31, 0xffbd6152, 0xffdedbde, 0xffdedbde, + 0xffdedbde, 0xffdedbde, 0xfff7f7f7, 0xfff7f7f7, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xfffffbff, 0xfffffbff, 0xffc87970, 0xffad3929, 0xffa53529, 0xffa53529, + 0xffa53529, 0xff9c3129, 0xff943129, 0xff8f2e26, 0xff892b24, 0xff842821, 0xff732421, 0xff6b221e, + 0xff631f1b, 0xff631f1b, 0xff521c10, 0xff37130b, 0xdd1b0905, 0x66000000, 0x22000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x11000000, 0x33000000, 0x55000000, 0x88190808, 0xfffffbff, 0xfffffbff, 0x88190808, 0x55000000, + 0x33000000, 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xff949694, 0xffe6e3e6, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffe6e3e6, 0xffadaaad, 0x00000000, 0x11000000, 0x33000000, 0x99190000, 0xee9c827e, 0xeedec2bd, + 0xeedec2bd, 0xeec5b6b5, 0xeec3aead, 0xeec0a6a5, 0xeebd9e9c, 0xeebd9694, 0xeeba8f8c, 0xeeb88884, + 0xeeb5827b, 0xee9c6d6b, 0xeece9e9c, 0xeece9e9c, 0xaa3a0c08, 0x33000000, 0x11000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000400, 0x00000000, 0x8837120e, 0xffa53529, 0xffa53529, 0xffa53529, 0xffa53529, + 0xffa73629, 0xffad3929, 0xffb53a2c, 0xffb53a2c, 0xffb53a2c, 0xffb53a2c, 0xffbd3b31, 0xffbd3b31, + 0xffbd3b31, 0xffbd3b31, 0xffbd3d31, 0xffbd3d31, 0xffbd3d31, 0xffbd3d31, 0xffd3a9a7, 0xffdedbde, + 0xffdedbde, 0xffdedbde, 0xffefefef, 0xfff7f7f7, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xfffffbff, 0xffe4bab8, 0xffad3929, 0xffad3929, 0xffa53529, 0xffa53529, + 0xffa53529, 0xff9c3129, 0xff943129, 0xff8f2e26, 0xff892b24, 0xff842821, 0xff732421, 0xff6b221e, + 0xff631f1b, 0xff5a1c19, 0xff521c10, 0xff37130b, 0xcc1b0905, 0x66000000, 0x22000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x11000000, 0x33000000, 0x55000000, 0x88190808, 0xfffffbff, 0xfffffbff, 0x88190808, 0x55000000, + 0x33000000, 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xff949694, 0xffe6e3e6, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffe6e3e6, 0xffadaaad, 0x00000000, 0x11000000, 0x33000000, 0x99190000, 0xee9c827e, 0xeedec2bd, + 0xeedec2bd, 0xeec5b6b5, 0xeec3aead, 0xeec0a6a5, 0xeebd9e9c, 0xeebd9694, 0xeeba8f8c, 0xeeb88884, + 0xeeb5827b, 0xee9c6d6b, 0xeece9e9c, 0xeece9e9c, 0xaa3a0c08, 0x33000000, 0x11000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000400, 0x00000000, 0x7737120e, 0xffa53529, 0xffa53529, 0xffa73629, 0xffa73629, + 0xffa53529, 0xffad3929, 0xffb53929, 0xffb53a2c, 0xffb53a2c, 0xffb53b2f, 0xffbd3a31, 0xffbd3b31, + 0xffbd3b31, 0xffbd3b31, 0xffbd3d31, 0xffbd3d31, 0xffbd3d31, 0xffbd3d31, 0xffbd453a, 0xffdedbde, + 0xffdedbde, 0xffdedbde, 0xffefefef, 0xfff7f7f7, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xfffffbff, 0xffad3929, 0xffad3929, 0xffad3929, 0xffa53529, 0xffa53529, + 0xffa53529, 0xff9f3229, 0xff943129, 0xff8f2e26, 0xff892b24, 0xff842821, 0xff732421, 0xff6b221e, + 0xff631f1b, 0xff5a1c19, 0xff521c10, 0xff37130b, 0xcc1b0905, 0x66000000, 0x11000000, 0x00000000, + 0x00000000, 0x00000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, + 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, + 0x22000000, 0x44000000, 0x66000000, 0x99190808, 0xfffffbff, 0xfffffbff, 0x99190808, 0x66000000, + 0x44000000, 0x22000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, + 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xff949694, 0xffe6e3e6, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffe6e3e6, 0xffadaaad, 0x00000000, 0x11000000, 0x33000000, 0x99190000, 0xee977f79, 0xeed6beb5, + 0xeed6beb5, 0xeec5b2b5, 0xeec3abaa, 0xeec0a59f, 0xeebd9e94, 0xeebd968c, 0xeeba8f86, 0xeeb88881, + 0xeeb5827b, 0xee9a6d65, 0xeece9e94, 0xeece9e94, 0xaa310c08, 0x33000000, 0x11000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000400, 0x00000000, 0x6637120e, 0xffa53529, 0xffa53529, 0xffa53529, 0xffa53529, + 0xffa53529, 0xffaa3729, 0xffb53929, 0xffb53a2c, 0xffb53b2f, 0xffb53b2f, 0xffbd3b31, 0xffbd3b31, + 0xffbd3d31, 0xffbd3b31, 0xffbd3d31, 0xffbd3d31, 0xffbd3d31, 0xffbd3d31, 0xffbd453a, 0xffc87770, + 0xffdedbde, 0xffdedbde, 0xffe6e7e6, 0xfff7f7f7, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffc87970, 0xffad3929, 0xffad3929, 0xffad3929, 0xffa53529, 0xffa53529, + 0xffa53529, 0xff9f3229, 0xff943129, 0xff8f2e26, 0xff892b24, 0xff842821, 0xff732421, 0xff6b221e, + 0xff631f1b, 0xff5a1c19, 0xff521c10, 0xff37130b, 0xbb000000, 0x55000000, 0x11000000, 0x00000000, + 0x00000000, 0x7745221e, 0xffce655a, 0xffc56152, 0xffc56152, 0xffc56152, 0xffc56152, 0xffc5594a, + 0xffc5594a, 0xffc5594a, 0xffc5594a, 0xffbd5142, 0xffbd5142, 0xffbd5142, 0xffbd5142, 0xffce4531, + 0xff892e21, 0xff892e21, 0xff892e21, 0xff190808, 0xfffffbff, 0xfffffbff, 0xff190808, 0xff581b16, + 0xff581b16, 0xff842821, 0xff842821, 0xff732419, 0xff732419, 0xff732419, 0xff732419, 0xff632019, + 0xff632019, 0xff632019, 0xff632019, 0xff632019, 0xff632019, 0xff632019, 0x88210b08, 0x22000000, + 0x11000000, 0x00000000, 0x00000000, 0x00000400, 0xff949694, 0xffe6e3e6, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffe6e3e6, 0xffadaaad, 0x00000000, 0x11000000, 0x33000000, 0x99190000, 0xee977f79, 0xeed6beb5, + 0xeed6beb5, 0xeec5b2b5, 0xeec3abaa, 0xeec0a59f, 0xeebd9e94, 0xeebd968c, 0xeeba8f86, 0xeeb88881, + 0xeeb5827b, 0xee9a6d65, 0xeece9e94, 0xeece9e94, 0xaa310c08, 0x33000000, 0x11000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00080000, 0x33080000, 0xee9c3529, 0xff9c3529, 0xffa53529, 0xffa53529, + 0xffa73629, 0xffad3929, 0xffaf392c, 0xffb2392f, 0xffb2392f, 0xffb2392f, 0xffba3b2f, 0xffba3b2f, + 0xffba3b2f, 0xffba3b2f, 0xffba3b31, 0xffb83a31, 0xffba3b31, 0xffba3b31, 0xffb53931, 0xffb53931, + 0xffcba7a5, 0xffd6dfde, 0xffe6e3e6, 0xfff7f6f7, 0xffffffff, 0xffffffff, 0xfffffbff, 0xfffffbff, + 0xfffffbff, 0xfffffbff, 0xffb53d31, 0xffaf372c, 0xffaf372c, 0xffaf372c, 0xffa53529, 0xffa23329, + 0xff9f3229, 0xff9c3129, 0xff943121, 0xff8c2d21, 0xff8c2d21, 0xff842821, 0xff732421, 0xff68201b, + 0xff5d1c16, 0xff5d1c16, 0xff4a1810, 0xff31100b, 0xaa000000, 0x44000000, 0x11000000, 0x00000000, + 0x00000000, 0x55451f1b, 0xffce5d52, 0xffc5594a, 0xffc5594a, 0xffc5594a, 0xffc5594a, 0xffc5554a, + 0xffc5554a, 0xffc04c3f, 0xffc04c3f, 0xffc5453a, 0xffc5453a, 0xffba3e34, 0xffba3e34, 0xffad3529, + 0xffad3529, 0xff76271e, 0xff5a2019, 0xff5a2d3a, 0xffe6e7e6, 0xffe6e7e6, 0xff5a2d3a, 0xff4a1819, + 0xff652019, 0xff652019, 0xff732419, 0xff632019, 0xff632019, 0xff632019, 0xff632019, 0xff632019, + 0xff5d1e16, 0xff5d1e16, 0xff5d1e16, 0xff5a1c19, 0xff5a1c19, 0xff5a1c19, 0x88240908, 0x33000000, + 0x11000000, 0x00000000, 0x00000000, 0x00000400, 0xff949694, 0xffe6e3e6, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffe6e3e6, 0xffadaaad, 0x00000000, 0x11000000, 0x33000000, 0x99190000, 0xee977f79, 0xeed6beb5, + 0xeed6beb5, 0xeec5b2b5, 0xeec3abaa, 0xeec0a59f, 0xeebd9e94, 0xeebd968c, 0xeeba8f86, 0xeeb88881, + 0xeeb5827b, 0xee9a6d65, 0xeece9e94, 0xeece9e94, 0xaa310c08, 0x33000000, 0x11000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00080000, 0x11080000, 0xcc6b231b, 0xff9c3529, 0xffa53529, 0xffa53529, + 0xffa53529, 0xffaa3729, 0xffaf392c, 0xffb2392f, 0xffb2392f, 0xffb2392f, 0xffb83a2c, 0xffba3b2f, + 0xffba3b2f, 0xffba3b2f, 0xffb83a31, 0xffb83a31, 0xffba3b31, 0xffba3b31, 0xffb53931, 0xffb53931, + 0xffc0706b, 0xffd6dfde, 0xffe6e3e6, 0xfff7f6f7, 0xffffffff, 0xffffffff, 0xfffffbff, 0xfffffbff, + 0xfffffbff, 0xffc87770, 0xffaf372c, 0xffaf372c, 0xffaf372c, 0xffad3529, 0xffa53529, 0xffa23329, + 0xffa23329, 0xff9c3129, 0xff943121, 0xff8c2d21, 0xff8c2d21, 0xff842821, 0xff732421, 0xff68201b, + 0xff5d1c16, 0xff5d1c16, 0xff4a1810, 0xee31100b, 0x99000000, 0x33000000, 0x00000000, 0x00000000, + 0x00000000, 0x22000000, 0xcc893e37, 0xffbd5042, 0xffbd5042, 0xffbd5042, 0xffbd5042, 0xffc04c3f, + 0xffc04c3f, 0xffba4234, 0xffba4234, 0xffba3e34, 0xffba3e34, 0xffaf372f, 0xffaf372f, 0xffad3529, + 0xff912e24, 0xff76271e, 0xff5a2019, 0xff5a2d3a, 0xffe6e7e6, 0xffe6e7e6, 0xff5a2d3a, 0xff4a1819, + 0xff581c19, 0xff652019, 0xff652019, 0xff632019, 0xff632019, 0xff5a1e16, 0xff5a1e16, 0xff581b13, + 0xff581b13, 0xff581b13, 0xff581b13, 0xff5a1c19, 0xff5a1c19, 0xdd3f1310, 0x77080000, 0x44000000, + 0x11000000, 0x00000000, 0x00000000, 0x00000400, 0xff949694, 0xffe6e3e6, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffe6e3e6, 0xffadaaad, 0x00000000, 0x11000000, 0x33000000, 0x99190000, 0xee977f79, 0xeed6beb5, + 0xeed6beb5, 0xeec3abaa, 0xeec3abaa, 0xeec0a59f, 0xeebd9e94, 0xeebd968c, 0xeeba8f86, 0xeeb88881, + 0xeeb5827b, 0xee9a6d65, 0xeece9e94, 0xeece9e94, 0xaa310c08, 0x33000000, 0x11000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00080000, 0x00080000, 0x993a120e, 0xff9c3529, 0xffa53529, 0xffa53529, + 0xffa53529, 0xffa73629, 0xffaf392c, 0xffaf392c, 0xffb2392f, 0xffb2392f, 0xffb83a2c, 0xffba3b2f, + 0xffb83a2c, 0xffba3b2f, 0xffb83a31, 0xffba3b31, 0xffb83a31, 0xffba3b31, 0xffb53931, 0xffb53931, + 0xffb53931, 0xffcba7a5, 0xffe6e3e6, 0xfff7f6f7, 0xffffffff, 0xffffffff, 0xfffffbff, 0xfffffbff, + 0xffe4b9b8, 0xffad3529, 0xffaf372c, 0xffaf372c, 0xffad3529, 0xffad3529, 0xffa53529, 0xffa23329, + 0xff9f3229, 0xff9c3129, 0xff8c2d21, 0xff8c2d21, 0xff842821, 0xff7b2421, 0xff732421, 0xff68201b, + 0xff5d1c16, 0xff521810, 0xff4a1810, 0xdd190805, 0x77000000, 0x22000000, 0x00000000, 0x00000000, + 0x00000000, 0x11000000, 0x99451f1b, 0xffbd5042, 0xffb5463a, 0xffb5463a, 0xffb5463a, 0xffba4234, + 0xffba4234, 0xffb53929, 0xffb53929, 0xffaf372f, 0xffaf372f, 0xffaf372f, 0xffaf372f, 0xffad3529, + 0xff912e24, 0xff76271e, 0xff5a2019, 0xff5a2d3a, 0xffe6e7e6, 0xffe6e7e6, 0xff5a2d3a, 0xff4a1819, + 0xff4a1819, 0xff581c19, 0xff652019, 0xff5a1e16, 0xff5a1e16, 0xff521b13, 0xff521b13, 0xff581b13, + 0xff581b13, 0xff581b13, 0xff581b13, 0xff5a1c19, 0xff5a1c19, 0xcc240908, 0x77080000, 0x33000000, + 0x11000000, 0x00000000, 0x00000000, 0x00000400, 0xff949694, 0xffe6e3e6, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffe6e3e6, 0xffadaaad, 0x00000000, 0x11000000, 0x33000000, 0x88290400, 0xee977873, 0xeeceb2ad, + 0xeeceb2ad, 0xeec5aead, 0xeec3a6a2, 0xeec09e97, 0xeec09e97, 0xeebd928c, 0xeeba8b84, 0xeeb8847b, + 0xeeb8847b, 0xeeb58a84, 0xeeb58a84, 0xeeb58a84, 0xaa210400, 0x33000000, 0x11000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00080000, 0x00080000, 0x66080000, 0xff9c3529, 0xffa53529, 0xffa53529, + 0xffa53529, 0xffa53529, 0xffaf392c, 0xffaf392c, 0xffaf392c, 0xffb2392f, 0xffb83a2c, 0xffb83a2c, + 0xffb83a2c, 0xffb83a2c, 0xffb53931, 0xffb83a31, 0xffb83a31, 0xffb53931, 0xffb53931, 0xffb53931, + 0xffb53931, 0xffc0706b, 0xffe6e3e6, 0xffffffff, 0xffffffff, 0xffffffff, 0xfffffbff, 0xfffffbff, + 0xffc87770, 0xffad3529, 0xffaf372c, 0xffaf372c, 0xffad3529, 0xffad3529, 0xffa53529, 0xffa23329, + 0xff9c3129, 0xff9c3129, 0xff8c2d21, 0xff8c2d21, 0xff842821, 0xff7b2421, 0xff68201b, 0xff5d1c16, + 0xff521810, 0xff521810, 0xff31100b, 0xbb000000, 0x66000000, 0x22000000, 0x00000000, 0x00000000, + 0x00000000, 0x11000000, 0x44000000, 0xddad3d31, 0xffb5463a, 0xffad3d31, 0xffad3d31, 0xffb53929, + 0xffb53929, 0xffb53929, 0xffb53929, 0xffaf372f, 0xffaf372f, 0xffa53129, 0xffa53129, 0xff912e24, + 0xff912e24, 0xff5a2019, 0xff5a2019, 0xff5a2d3a, 0xffe6e7e6, 0xffe6e7e6, 0xff5a2d3a, 0xff4a1819, + 0xff4a1819, 0xff4a1819, 0xff581c19, 0xff521b13, 0xff521b13, 0xff521b13, 0xff4a1810, 0xff521810, + 0xff521810, 0xff521810, 0xff521810, 0xff5a1c19, 0xee3f1310, 0x99080000, 0x55080000, 0x22000000, + 0x11000000, 0x00000000, 0x00000000, 0x00000400, 0xff949694, 0xffe6e3e6, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffe6e3e6, 0xffadaaad, 0x00000000, 0x11000000, 0x22000000, 0x88290400, 0xee977873, 0xeeceb2ad, + 0xeeceb2ad, 0xeec3a6a2, 0xeec3a6a2, 0xeec09e97, 0xeebd968c, 0xeebd928c, 0xeeba8b84, 0xeeb8847b, + 0xeeb8847b, 0xeeb58a84, 0xeeb58a84, 0xeeb58a84, 0x99210400, 0x33000000, 0x11000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000400, 0x00000000, 0x00000000, 0x22000000, 0xdd6b2019, 0xff9c3129, 0xff9c3129, + 0xff9c3129, 0xff9c3129, 0xffa23329, 0xffa73629, 0xffa73629, 0xffa73629, 0xffb53929, 0xffb53929, + 0xffb53929, 0xffb53929, 0xffaf3729, 0xffb53929, 0xffaf3729, 0xffb53929, 0xffaf3729, 0xffb53929, + 0xffaf3729, 0xffaf3729, 0xffdbb9b5, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfffff7f7, 0xffe1b7b2, + 0xffa53929, 0xffa53929, 0xffa53529, 0xffa53529, 0xffa53529, 0xffa53529, 0xff9c3129, 0xff9c3129, + 0xff9c3129, 0xff942e26, 0xff8c2d21, 0xff8c2d21, 0xff7e271e, 0xff70221b, 0xff632019, 0xff632019, + 0xff471710, 0xff471710, 0xee290c08, 0xaa000000, 0x44000000, 0x11000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x11000000, 0x99451710, 0xffbd3d31, 0xffbd3d31, 0xffbd3d31, 0xffad3929, + 0xffad3929, 0xffa73629, 0xffa73629, 0xffa53529, 0xffa53529, 0xff9a3126, 0xff9a3126, 0xff842d29, + 0xff762824, 0xff5a2019, 0xff5a2019, 0xff6b495a, 0xffd6cad6, 0xffd6cad6, 0xff6b495a, 0xff4d1c1e, + 0xff4a1410, 0xff4d1c1e, 0xff4d1c1e, 0xff4a1810, 0xff4a1810, 0xff4a1810, 0xff4a1810, 0xff4a1810, + 0xff4a1810, 0xff4a1810, 0xff4a1810, 0xff4a1810, 0xcc190805, 0x77000000, 0x44000000, 0x11000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xff949694, 0xffe6e3e6, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffe6e3e6, 0xffadaaad, 0x00000000, 0x11000000, 0x22000000, 0x88290400, 0xee603e3a, 0xeeceb2ad, + 0xeeceb2ad, 0xeec3a6a2, 0xeec09e97, 0xeec09e97, 0xeebd968c, 0xeebd928c, 0xeeba8b84, 0xeeb8847b, + 0xeeb57d73, 0xeeb58a84, 0xeeb58a84, 0xeeb58a84, 0x99210400, 0x33000000, 0x11000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000400, 0x00000000, 0x00000000, 0x00000000, 0x77240b08, 0xff9c3129, 0xff9c3129, + 0xff9c3129, 0xff9c3129, 0xffa23329, 0xffa23329, 0xffa73629, 0xffa73629, 0xffb53929, 0xffad3629, + 0xffad3629, 0xffad3629, 0xffaf3729, 0xffaf3729, 0xffaf3729, 0xffaf3729, 0xffaf3729, 0xffaf3729, + 0xffaf3729, 0xffaf3729, 0xffa53d31, 0xfff7f7f7, 0xfff7f7f7, 0xfff7f7f7, 0xfffff7f7, 0xffa53929, + 0xffa53929, 0xffa53929, 0xffa53529, 0xffa53529, 0xff9f3329, 0xff9f3329, 0xff9c3129, 0xff9c3129, + 0xff942e26, 0xff942e26, 0xff8c2d21, 0xff8c2d21, 0xff7e271e, 0xff70221b, 0xff632019, 0xff471710, + 0xff471710, 0xff471710, 0xcc0e0403, 0x88000000, 0x33000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x11000000, 0x44080400, 0xcc812a21, 0xffbd3d31, 0xffbd3d31, 0xffa73629, + 0xffa73629, 0xffa73629, 0xffa23329, 0xff9a3126, 0xff9a3126, 0xff9a3126, 0xff8f2d24, 0xff762824, + 0xff68241e, 0xff5a2019, 0xff5a2019, 0xff6b495a, 0xffd6cad6, 0xffd6cad6, 0xff6b495a, 0xff4d1c1e, + 0xff4a1410, 0xff4a1410, 0xff4d1c1e, 0xff4a1810, 0xff4a1810, 0xff471710, 0xff471710, 0xff4a1810, + 0xff4a1810, 0xff4a1810, 0xff4a1810, 0xee31100b, 0x99000000, 0x55000000, 0x33000000, 0x11000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xff949694, 0xffe6e3e6, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffe6e3e6, 0xffadaaad, 0x00000000, 0x11000000, 0x22000000, 0x77290400, 0xee603e3a, 0xeeceb2ad, + 0xeeceb2ad, 0xeec3a6a2, 0xeec09e97, 0xeebd968c, 0xeebd968c, 0xeeba8b84, 0xeeba8b84, 0xeeb8847b, + 0xeeb57d73, 0xeeb58a84, 0xeeb58a84, 0xeeb58a84, 0x99210400, 0x33000000, 0x11000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000400, 0x00000000, 0x00000000, 0x00000000, 0x22000000, 0xcc6e221e, 0xff9c3129, + 0xff9c3129, 0xff9c3129, 0xff9c3129, 0xffa23329, 0xffa23329, 0xffa73629, 0xffad3629, 0xffad3629, + 0xffad3629, 0xffad3629, 0xffaf3729, 0xffaa3629, 0xffa53529, 0xffaa3629, 0xffa53529, 0xffaf3729, + 0xffaa3629, 0xffa53529, 0xffa53d31, 0xffc07b73, 0xfff7f7f7, 0xfff7f7f7, 0xffc3786e, 0xffa53929, + 0xffa53929, 0xffa53929, 0xff9f3329, 0xff9f3329, 0xff9f3329, 0xff9a3229, 0xff9c3129, 0xff942e26, + 0xff942e26, 0xff942e26, 0xff7e271e, 0xff7e271e, 0xff70221b, 0xff70221b, 0xff632019, 0xff471710, + 0xff471710, 0xee2c0d08, 0xaa000000, 0x55000000, 0x11000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x11080400, 0x77451710, 0xee812a21, 0xffbd3d31, 0xffa73629, + 0xffa23329, 0xffa23329, 0xffa23329, 0xff9a3126, 0xff9a3126, 0xff8f2d24, 0xff8f2d24, 0xff762824, + 0xff68241e, 0xff5a2019, 0xff68241e, 0xff6b495a, 0xffb29fad, 0xffb29fad, 0xff8f7484, 0xff50242c, + 0xff4a1410, 0xff4a1410, 0xff4a1410, 0xff471710, 0xff471710, 0xff451610, 0xff451610, 0xff4a1810, + 0xff4a1810, 0xff4a1810, 0xee3c130e, 0xbb190805, 0x66000000, 0x44000000, 0x11000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xff949694, 0xffe9dfdb, 0xfff7ffff, 0xffce9e94, + 0xffce9e94, 0xffd6a294, 0xffd6a294, 0xffd6a294, 0xffd6a294, 0xffd6a294, 0xffd6a294, 0xffd6a294, + 0xffd39e91, 0xffce9e94, 0xffce9e94, 0xffce988c, 0xffce988c, 0xffc58e7b, 0xffc58e7b, 0xfff7ffff, + 0xffe6d9d3, 0xffadaaad, 0x00000000, 0x11000000, 0x22000000, 0x77290400, 0xdd5d3731, 0xeec59e94, + 0xeec59e94, 0xeebd9e9c, 0xeebd9e9c, 0xeeba9794, 0xeeb8908c, 0xeeb58a84, 0xeeb2837b, 0xeeaf7c73, + 0xeeaf7c73, 0xee9c7168, 0xeed6a69c, 0xee9c7168, 0x88290800, 0x22000000, 0x11000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000400, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x66100408, 0xee6e221e, + 0xff9c3129, 0xff9c3129, 0xff9c3129, 0xff9c3129, 0xff9c3129, 0xffa23329, 0xffa53329, 0xffa53329, + 0xffa53329, 0xffa53329, 0xffa53529, 0xffa53529, 0xffa53529, 0xffa53529, 0xffa53529, 0xffa53529, + 0xffa53529, 0xffa53529, 0xffa53d31, 0xffa53d31, 0xfff7f7f7, 0xfff7f7f7, 0xffa53929, 0xffa53929, + 0xffa53929, 0xffa53929, 0xff9a3229, 0xff9a3229, 0xff943129, 0xff943129, 0xff942e26, 0xff942e26, + 0xff8c2b24, 0xff842821, 0xff7e271e, 0xff70221b, 0xff70221b, 0xff631c19, 0xff471710, 0xff471710, + 0xff471710, 0xdd100400, 0x88000000, 0x33000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x11080400, 0x22080400, 0x99451710, 0xee812a21, 0xffa23329, + 0xffa23329, 0xff9c3129, 0xff9c3129, 0xff8f2d24, 0xff8f2d24, 0xff8f2d24, 0xff842821, 0xff68241e, + 0xff68241e, 0xff5a2019, 0xff842d29, 0xff8f7484, 0xffb29fad, 0xffb29fad, 0xff8f7484, 0xff522d3a, + 0xff4d1c1e, 0xff4a1410, 0xff4a1410, 0xff451610, 0xff451610, 0xff451610, 0xff451610, 0xff3c130e, + 0xff3c130e, 0xff3c130e, 0xcc210808, 0x77000000, 0x44000000, 0x22000000, 0x11000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xff949694, 0xffe9dfdb, 0xffce9e94, 0xffce9e94, + 0xffce9e94, 0xffd39f91, 0xffd39f91, 0xffd39f91, 0xffd39f91, 0xffd39e91, 0xffd39e91, 0xffd39e91, + 0xffd39e91, 0xffce988c, 0xffce988c, 0xffce988c, 0xffce9384, 0xffc58e7b, 0xffc58e7b, 0xffc58e7b, + 0xffe6d9d3, 0xffadaaad, 0x00000000, 0x11000000, 0x22000000, 0x66290400, 0xdd5d3731, 0xeec59e94, + 0xeec59e94, 0xeebd9e9c, 0xeeba9794, 0xeeb8908c, 0xeeb58a84, 0xeeb58a84, 0xeeb2837b, 0xeeaf7c73, + 0xeeaf7c73, 0xee9c7168, 0xeed6a69c, 0xee9c7168, 0x77290800, 0x22000000, 0x11000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x11000000, 0xaa2c0f0b, + 0xff842d21, 0xff842d21, 0xff8c2d21, 0xff8c2d21, 0xff8c2d21, 0xff8c2d21, 0xff9c3129, 0xff9c3129, + 0xff9c3129, 0xff9c3129, 0xff9a3126, 0xffa53529, 0xff9a3126, 0xff9a3126, 0xff9c3129, 0xff9c3129, + 0xff9c3129, 0xff9c3129, 0xff8c2d21, 0xff8c2d21, 0xffbd6d6b, 0xffbd6d6b, 0xff9c3129, 0xff9c3129, + 0xff9c3129, 0xff9c3129, 0xff9c3121, 0xff9c3121, 0xff912d21, 0xff9c3121, 0xff842d21, 0xff842d21, + 0xff76271e, 0xff76271e, 0xff732421, 0xff732421, 0xff5d1e19, 0xff5d1e19, 0xff421410, 0xff421410, + 0xee2c0d0b, 0xaa000000, 0x55000000, 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x11000000, 0x33000000, 0x994a1410, 0xee942d21, + 0xff942d21, 0xff942d21, 0xff942d21, 0xff8c2d21, 0xff8c2d21, 0xff812821, 0xff812821, 0xff632019, + 0xff632019, 0xff632019, 0xff633134, 0xff846573, 0xffa596a5, 0xffa596a5, 0xff846573, 0xff5a3d42, + 0xff4a2221, 0xff421410, 0xff421410, 0xff421410, 0xff421410, 0xff421410, 0xff421410, 0xff421410, + 0xff421410, 0xcc160705, 0x77000000, 0x55000000, 0x33000000, 0x11000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xff949694, 0xffe9dfdb, 0xffce9e94, 0xffce9e94, + 0xffce9e94, 0xffd39f91, 0xffd09d8f, 0xffd09d8f, 0xffd09d8f, 0xffd09a8f, 0xffd09a8f, 0xffd09a8f, + 0xffd09a8f, 0xffce988c, 0xffce9384, 0xffce9384, 0xffce9384, 0xffc58e7b, 0xffc58e7b, 0xffc58e7b, + 0xffe6d9d3, 0xffadaaad, 0x00000000, 0x11000000, 0x22000000, 0x55290400, 0xcc290400, 0xeec59e94, + 0xeec59e94, 0xeeba9794, 0xeeb8908c, 0xeeb8908c, 0xeeb58a84, 0xeeb2837b, 0xeeaf7c73, 0xeeaf7c73, + 0xeead756b, 0xee9c7168, 0xeed6a69c, 0xdd633d34, 0x66290800, 0x22000000, 0x11000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x22000000, + 0xbb2c0f0b, 0xff842d21, 0xff8c2d21, 0xff8c2d21, 0xff8c2d21, 0xff8c2d21, 0xff8f2d26, 0xff8f2d26, + 0xff8f2d26, 0xff9c3129, 0xff8f2d24, 0xff9a3126, 0xff9a3126, 0xff9a3126, 0xff942e26, 0xff9c3129, + 0xff942e26, 0xff9c3129, 0xff8c2d21, 0xff8c2d21, 0xff8c2d21, 0xff8c2d21, 0xff942e26, 0xff942e26, + 0xff942e26, 0xff942e26, 0xff9c3121, 0xff912d21, 0xff912d21, 0xff912d21, 0xff842d21, 0xff76271e, + 0xff76271e, 0xff76271e, 0xff732421, 0xff5d1e19, 0xff5d1e19, 0xff471710, 0xff421410, 0xee2c0d0b, + 0xbb000000, 0x77000000, 0x33000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x11000000, 0x33000000, 0x99370f0b, + 0xee942d21, 0xff942d21, 0xff942d21, 0xff8c2d21, 0xff812821, 0xff812821, 0xff762421, 0xff632019, + 0xff632019, 0xff632019, 0xff633942, 0xff846573, 0xffa596a5, 0xffa596a5, 0xff846573, 0xff5a3d42, + 0xff4a2221, 0xff421410, 0xff421410, 0xff421410, 0xff421410, 0xff421410, 0xff421410, 0xee421410, + 0xcc160705, 0x77000000, 0x55000000, 0x33000000, 0x11000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xff949694, 0xffe9dfdb, 0xffce9e94, 0xffce9e94, + 0xffce9e94, 0xffd09d8f, 0xffd09d8f, 0xffd09d8f, 0xffce9a8c, 0xffd09a8f, 0xffce968c, 0xffce968c, + 0xffce968c, 0xffce9384, 0xffce9384, 0xffce8e7b, 0xffce8e7b, 0xffc58e7b, 0xffc58e7b, 0xffc58e7b, + 0xffe6d9d3, 0xffadaaad, 0x00000000, 0x00000000, 0x22000000, 0x44290400, 0xbb290400, 0xee916b63, + 0xeec59e94, 0xeeb8908c, 0xeeb8908c, 0xeeb58a84, 0xeeb58a84, 0xeeb2837b, 0xeeaf7c73, 0xeead756b, + 0xeead756b, 0xee9c7168, 0xeed6a69c, 0xcc290800, 0x55290800, 0x22000000, 0x11000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x33000000, 0xcc2c0f0b, 0xff76241b, 0xff76241b, 0xff76241b, 0xff76241b, 0xff812824, 0xff812824, + 0xff812824, 0xff812824, 0xff8f2d24, 0xff8f2d24, 0xff8f2d24, 0xff8f2d24, 0xff8c2b24, 0xff8c2b24, + 0xff8c2b24, 0xff8c2b24, 0xff8c2d21, 0xff8c2d21, 0xff8c2d21, 0xff8c2d21, 0xff942e26, 0xff942e26, + 0xff942e26, 0xff942e26, 0xff912d21, 0xff912d21, 0xff862821, 0xff862821, 0xff76271e, 0xff76271e, + 0xff68221b, 0xff68221b, 0xff5d1e19, 0xff5d1e19, 0xff471710, 0xff471710, 0xff2c0d0b, 0xcc000000, + 0x88000000, 0x44000000, 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x11000000, 0x33080000, + 0x88370f0b, 0xdd651e16, 0xff942d21, 0xff812821, 0xff812821, 0xff762421, 0xff762421, 0xff632019, + 0xff632019, 0xff632826, 0xff633942, 0xff846573, 0xff947d8c, 0xff947d8c, 0xff846573, 0xff5a3d42, + 0xff4a2221, 0xff421410, 0xff421410, 0xff421410, 0xff421410, 0xff421410, 0xee2f0d0b, 0xbb160705, + 0x77000000, 0x55000000, 0x33000000, 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0xff949694, 0xffe6e3e6, 0xffce9a8c, 0xffce9a8c, + 0xffce9a8c, 0xffce9a8c, 0xffce9a8c, 0xffce9a8c, 0xffce9a8c, 0xffce9a8c, 0xffce9a8c, 0xffce9a8c, + 0xffce9a8c, 0xffc58a7b, 0xffc58a7b, 0xffc58a7b, 0xffc58a7b, 0xffb57d73, 0xffb57d73, 0xffb57d73, + 0xffe6e3e6, 0xffadaaad, 0x00000000, 0x00000000, 0x11000000, 0x33190400, 0xaa190400, 0xee91584d, + 0xeece8273, 0xeeb5867b, 0xeeb5867b, 0xeeb5867b, 0xeeb5867b, 0xeead7973, 0xeead7973, 0xeeaa6d65, + 0xeeaa6d65, 0xeeaa7d73, 0xeeefbaad, 0xbb210400, 0x44210400, 0x11000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x11000000, 0x44000000, 0xcc4a1410, 0xff76241b, 0xff76241b, 0xff76241b, 0xff732421, 0xff732421, + 0xff732421, 0xff812824, 0xff842821, 0xff842821, 0xff842821, 0xff842821, 0xff842821, 0xff842821, + 0xff8c2b24, 0xff842821, 0xff8c2d21, 0xff8c2d21, 0xff8c2d21, 0xff8c2d21, 0xff8c2b24, 0xff8c2b24, + 0xff8c2b24, 0xff842821, 0xff862821, 0xff862821, 0xff862821, 0xff7b2421, 0xff76271e, 0xff68221b, + 0xff68221b, 0xff5a1c19, 0xff5d1e19, 0xff471710, 0xff311008, 0xff311008, 0xdd160705, 0x99000000, + 0x55000000, 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x11080000, + 0x33080000, 0x55080000, 0xaa370f0b, 0xee6b2021, 0xff812821, 0xff762421, 0xff762421, 0xff632019, + 0xff632019, 0xff632019, 0xff633134, 0xff734d5a, 0xff846573, 0xff846573, 0xff734d5a, 0xff522f31, + 0xff4a2221, 0xff421410, 0xff421410, 0xff421410, 0xee2f0d0b, 0xcc1b0705, 0x99080000, 0x66000000, + 0x44000000, 0x33000000, 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff949694, 0xffe6e3e6, 0xffce9a8c, 0xffce9a8c, + 0xffce9a8c, 0xffce9a8c, 0xffefdbd3, 0xfffffbf7, 0xfffffbf7, 0xffefddd9, 0xffefddd9, 0xffefddd9, + 0xffefddd9, 0xfffffbf7, 0xfffffbf7, 0xffecd5ce, 0xffc58a7b, 0xffb57d73, 0xffb57d73, 0xffb57d73, + 0xffe6e3e6, 0xffadaaad, 0x00000000, 0x00000000, 0x11000000, 0x22190400, 0x77190400, 0xdd552e26, + 0xeece8273, 0xeeaf7165, 0xeeaf7165, 0xeeb5867b, 0xeeaf7165, 0xeead7973, 0xeeaa6d65, 0xeeaa6d65, + 0xeeaa6d65, 0xeeaa7d73, 0xeeaa7d73, 0x88210400, 0x22210400, 0x11000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x11000000, 0x33000000, 0x99210b08, 0xee421610, 0xff632019, 0xff632019, 0xff632019, + 0xff632019, 0xff632019, 0xff732419, 0xff732419, 0xff732419, 0xff732419, 0xff6b221b, 0xff7b2821, + 0xff7b2821, 0xff7b2821, 0xff7b2821, 0xff7b2821, 0xff7b2821, 0xff7b2821, 0xff7b2821, 0xff7b2821, + 0xff7b2821, 0xff7b2821, 0xff7b2421, 0xff7b2421, 0xff7b2421, 0xff7b2421, 0xff6b2019, 0xff6b2019, + 0xff6b2019, 0xff4a1610, 0xff421410, 0xff421410, 0xee2c0d0b, 0xcc000000, 0x99000000, 0x55000000, + 0x22000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x11000000, 0x22000000, 0x44000000, 0x771e0908, 0xbb3c1310, 0xdd5a1c19, 0xff5a1c19, 0xff55221b, + 0xff55221b, 0xff55221b, 0xff7b3129, 0xff58373c, 0xff7b4d52, 0xff7b4d52, 0xff58373c, 0xff5a2d29, + 0xff3f1f1b, 0xff24120e, 0xee24120e, 0xcc210808, 0x990b0303, 0x77000000, 0x55000000, 0x44000000, + 0x22000000, 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff949694, 0xffe6e3e6, 0xffce9a8c, 0xffce9a8c, + 0xffce9a8c, 0xffce9a8c, 0xffefdbd3, 0xfffffbf7, 0xfffffbf7, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xfffffbf7, 0xfffffbf7, 0xffd9afa5, 0xffc58a7b, 0xffb57d73, 0xffb57d73, 0xffb57d73, + 0xffe6e3e6, 0xffadaaad, 0x00000000, 0x00000000, 0x11000000, 0x22190400, 0x44190400, 0xbb190400, + 0xee91584d, 0xeeaa5d50, 0xeeaf7165, 0xeeaf7165, 0xeeaf7165, 0xeeaa6d65, 0xeea76158, 0xeea76158, + 0xeeaa6d65, 0xeeaa7d73, 0xcc210400, 0x55210400, 0x22210400, 0x11000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x11000000, 0x22000000, 0x66000000, 0xcc210b08, 0xff451610, 0xff632019, + 0xff451610, 0xff632019, 0xff5d1c13, 0xff5d1c13, 0xff5d1c13, 0xff5d1c13, 0xff6b221b, 0xff6b221b, + 0xff6b221b, 0xff6b221b, 0xff6e231b, 0xff6e231b, 0xff6e231b, 0xff6e231b, 0xff6e231b, 0xff6e231b, + 0xff6e231b, 0xff6e231b, 0xff651e1b, 0xff7b2421, 0xff651e1b, 0xff651e1b, 0xff6b2019, 0xff4a1610, + 0xff4a1610, 0xff4a1610, 0xff2c0d0b, 0xee160705, 0xbb000000, 0x88000000, 0x55000000, 0x22000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x11000000, 0x11000000, 0x33000000, 0x44000000, 0x66000000, 0x991e0908, 0xbb2f130e, + 0xdd2f130e, 0xee55221b, 0xff55221b, 0xff58373c, 0xff58373c, 0xff58373c, 0xee342226, 0xdd3f1f1b, + 0xcc24120e, 0xaa080400, 0x88080400, 0x77000000, 0x55000000, 0x44000000, 0x33000000, 0x11000000, + 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff949694, 0xffe6e3e6, 0xffce9a8c, 0xffce9a8c, + 0xffce9a8c, 0xffce9a8c, 0xffce9a8c, 0xfffffbf7, 0xfffffbf7, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xfffffbf7, 0xffecd5ce, 0xffc58a7b, 0xffc58a7b, 0xffb57d73, 0xffb57d73, 0xffb57d73, + 0xffe6e3e6, 0xffadaaad, 0x00000000, 0x00000000, 0x00000000, 0x11190400, 0x22190400, 0x77190400, + 0xcc190400, 0xeea5493a, 0xeeaa5d50, 0xeeaa5d50, 0xeeaa5d50, 0xeea76158, 0xeea76158, 0xeea76158, + 0xeea5554a, 0xcc210400, 0x77210400, 0x22210400, 0x11210400, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x11000000, 0x44000000, 0x88080000, 0xdd260b08, + 0xee451610, 0xff451610, 0xff47140e, 0xff5d1c13, 0xff5d1c13, 0xff5d1c13, 0xff5a1b16, 0xff5a1b16, + 0xff5a1b16, 0xff5a1b16, 0xff601e16, 0xff601e16, 0xff6e231b, 0xff601e16, 0xff601e16, 0xff601e16, + 0xff601e16, 0xff601e16, 0xff651e1b, 0xff651e1b, 0xff501716, 0xff501716, 0xff4a1610, 0xff4a1610, + 0xff290b08, 0xee290b08, 0xdd000000, 0xaa000000, 0x77000000, 0x44000000, 0x11000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x11000000, 0x11000000, 0x22000000, 0x33000000, 0x55080400, + 0x66080400, 0x77080400, 0x88080400, 0x88100c10, 0x99100c10, 0x99100c10, 0x88100c10, 0x8824120e, + 0x77080400, 0x66080400, 0x55080400, 0x44000000, 0x22000000, 0x11000000, 0x11000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff949694, 0xffe6e3e6, 0xffce9284, 0xffce9284, + 0xffce9284, 0xffc58e7b, 0xffc58e7b, 0xffd9b3a7, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffcea9a2, 0xffb57d73, 0xffb57d73, 0xffad756b, 0xffad756b, 0xffad756b, + 0xffe6e3e6, 0xffadaaad, 0x00000000, 0x00000000, 0x00000000, 0x11000000, 0x11000000, 0x22000000, + 0x66000000, 0x99210400, 0xaa420800, 0xbb420800, 0xbb630c00, 0xcc520c00, 0xbb520c00, 0xbb370800, + 0x991b0400, 0x66000000, 0x33000000, 0x11000000, 0x11000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x11000000, 0x22080000, 0x44080000, + 0x77080000, 0xbb080000, 0xee310c08, 0xff47140e, 0xff47140e, 0xff47140e, 0xff4a1410, 0xff4a1410, + 0xff5a1b16, 0xff5a1b16, 0xff521810, 0xff521810, 0xff521810, 0xff521810, 0xff521810, 0xff521810, + 0xff521810, 0xff521810, 0xff501716, 0xff501716, 0xff501716, 0xff3a1010, 0xff290b08, 0xee290b08, + 0xcc080000, 0xaa080000, 0x88000000, 0x55000000, 0x33000000, 0x11000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x11000000, 0x11000000, 0x22080400, + 0x33080400, 0x33080400, 0x44080400, 0x44100c10, 0x55100c10, 0x55100c10, 0x44100c10, 0x44080400, + 0x33080400, 0x33080400, 0x22080400, 0x11000000, 0x11000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff949694, 0xffe6e3e6, 0xffce9284, 0xffce9284, + 0xffce9284, 0xffc58e7b, 0xffc58e7b, 0xffc58e7b, 0xffecd9d3, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffe6d4d0, 0xffb57d73, 0xffb57d73, 0xffb57d73, 0xffad756b, 0xffad756b, 0xffad756b, + 0xffe6e3e6, 0xffadaaad, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x11000000, 0x11000000, + 0x22000000, 0x22000000, 0x33000000, 0x33000000, 0x33000000, 0x33000000, 0x33000000, 0x33000000, + 0x22000000, 0x22000000, 0x11000000, 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x11000000, + 0x22000000, 0x44000000, 0x66000000, 0x99000000, 0xbb080303, 0xdd190808, 0xee260b0b, 0xff3a1010, + 0xff3a1010, 0xff3a1010, 0xff3a1410, 0xff3a1410, 0xff3a1410, 0xff3a1410, 0xff4a1410, 0xff4a1410, + 0xff4a1410, 0xff4a1410, 0xff311010, 0xee210b0b, 0xdd100505, 0xcc100505, 0xbb000000, 0x99000000, + 0x77000000, 0x55000000, 0x33000000, 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff949694, 0xffe6e3e6, 0xffce9284, 0xffce9284, + 0xffce9284, 0xffc58e7b, 0xffc58e7b, 0xffc58e7b, 0xffd9b3a7, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffcea9a2, 0xffb57d73, 0xffb57d73, 0xffb57d73, 0xffad756b, 0xffad756b, 0xffad756b, + 0xffe6e3e6, 0xffadaaad, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, + 0x11000000, 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x11000000, 0x11000000, 0x33000000, 0x44000000, 0x55000000, 0x77000000, 0x88000000, + 0xaa000000, 0xbb000000, 0xcc130705, 0xcc130705, 0xcc130705, 0xdd130705, 0xcc190705, 0xcc190705, + 0xcc000000, 0xbb000000, 0xbb000000, 0x99000000, 0x88000000, 0x66000000, 0x55000000, 0x44000000, + 0x33000000, 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff949694, 0xffe6e3e6, 0xffce9284, 0xffce9284, + 0xffce9284, 0xffc58e7b, 0xffc58e7b, 0xffc58e7b, 0xffc58e7b, 0xffe9d7d3, 0xffffffff, 0xffffffff, + 0xffdec2bd, 0xffb57d73, 0xffb57d73, 0xffb57d73, 0xffb57d73, 0xffad756b, 0xffad756b, 0xffad756b, + 0xffe6e3e6, 0xffadaaad, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x11000000, 0x11000000, 0x22000000, 0x22000000, + 0x33000000, 0x44000000, 0x55000000, 0x55000000, 0x55000000, 0x66000000, 0x66000000, 0x66000000, + 0x55000000, 0x55000000, 0x44000000, 0x44000000, 0x33000000, 0x22000000, 0x11000000, 0x11000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff949694, 0xffe6e3e6, 0xffc5867b, 0xffc5867b, + 0xffc5867b, 0xffc58a7b, 0xffbd8376, 0xffbd8376, 0xffbd8376, 0xffc59b8f, 0xfff7e7e6, 0xfff7e7e6, + 0xffc59b8f, 0xffb5796b, 0xffb5796b, 0xffad7568, 0xffad7568, 0xffa56d63, 0xffa56d63, 0xffa56d63, + 0xffe6e3e6, 0xffadaaad, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x11000000, + 0x11000000, 0x11000000, 0x11000000, 0x11000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff949694, 0xffe6e3e6, 0xffc5867b, 0xffc5867b, + 0xffc5867b, 0xffbd8376, 0xffbd8376, 0xffb57c70, 0xffb57c70, 0xffad7563, 0xffdec1ba, 0xffdec1ba, + 0xffad7563, 0xffad7568, 0xffad7568, 0xffa57165, 0xffa57165, 0xffa56d63, 0xffa56d63, 0xffa56d63, + 0xffe6e3e6, 0xffadaaad, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff949694, 0xffe6e3e6, 0xffc5867b, 0xffc5867b, + 0xffc5867b, 0xffbd8376, 0xffb57c70, 0xffb57c70, 0xffb57c70, 0xffad7563, 0xffad7563, 0xffad7563, + 0xffad7563, 0xffa57165, 0xffa57165, 0xffa57165, 0xff9c6d63, 0xffa56d63, 0xffa56d63, 0xffa56d63, + 0xffe6e3e6, 0xffadaaad, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff949694, 0xffe6e3e6, 0xffc5867b, 0xffc5867b, + 0xffc5867b, 0xffb57c70, 0xffb57c70, 0xffad756b, 0xffad756b, 0xffad7563, 0xffad7563, 0xffad7563, + 0xffad7563, 0xff9c6d63, 0xff9c6d63, 0xff9c6d63, 0xff9c6d63, 0xffa56d63, 0xffa56d63, 0xffa56d63, + 0xffe6e3e6, 0xffadaaad, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff8f8f8f, 0xffded4d0, 0xffad7d73, 0xffad7d73, + 0xffad7d73, 0xffa57163, 0xffa57163, 0xffa57163, 0xffa57163, 0xff9c695a, 0xff9c695a, 0xff9c695a, + 0xff9c695a, 0xff94655a, 0xff94655a, 0xff94655a, 0xff94655a, 0xff946d63, 0xff946d63, 0xff946d63, + 0xffdbcecb, 0xffa5a6a5, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff8f8f8f, 0xffded4d0, 0xfff7ffff, 0xffad7d73, + 0xffad7d73, 0xffa57163, 0xffa57163, 0xffa57163, 0xffa57163, 0xff9c695a, 0xff9c695a, 0xff9c695a, + 0xff9c695a, 0xff94655a, 0xff94655a, 0xff94655a, 0xff94655a, 0xff946d63, 0xff946d63, 0xffffffff, + 0xffdbcecb, 0xffa5a6a5, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff8f8f8f, 0xffded4d0, 0xffded4d0, 0xffded4d0, + 0xffded4d0, 0xffd6dbde, 0xffd6dbde, 0xffd6dbde, 0xffd6dbde, 0xffd6dbde, 0xffd6dbde, 0xffd6dbde, + 0xffd6dbde, 0xffd6dbde, 0xffd6dbde, 0xffd6dbde, 0xffd6dbde, 0xffdbcecb, 0xffdbcecb, 0xffdbcecb, + 0xffdbcecb, 0xffa5a6a5, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff8f8f8f, 0xffc5a9a2, 0xffc5a9a2, 0xffc5a9a2, + 0xffc5a9a2, 0xffc5b7b5, 0xffc5b7b5, 0xffc5b7b5, 0xffc5b7b5, 0xffc3b5b2, 0xffc3b5b2, 0xffc3b5b2, + 0xffc3b5b2, 0xffc0b3b2, 0xffc0b3b2, 0xffc0b3b2, 0xffc0b3b2, 0xffb89e97, 0xffb89e97, 0xffb89e97, + 0xffb89e97, 0xff6e6f6e, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 +}; + +static const UINT g_DXUTGUITextureSrcDataSizeInBytes = 262272; + +static const DWORD g_DXUTArrowMeshSrcData[] = +{ + 0x20666f78, 0x33303330, 0x70697a62, 0x32333030, 0x000030d7, 0x087930c7, 0x59ed4b43, 0xd51c6c5d, + 0x71dbbe15, 0xacbbc1d6, 0xe125d493, 0xc1024e27, 0x7133f9c1, 0xec1098ec, 0x1b1daef1, 0xc6d24eb7, + 0xc713fa10, 0x64866f59, 0xd9aecd95, 0x694304dd, 0x4485686b, 0xad2fb6a5, 0x78df44a8, 0x6cca8828, + 0x20a2895a, 0x2aaf60ef, 0x905215b5, 0x4fa9515a, 0xa45b4d45, 0xa1e09548, 0x9e94d282, 0xcf5df333, + 0x8a3acdf1, 0xec0c5368, 0xbefec6ac, 0xf77ee733, 0xdef73bdc, 0x9d667739, 0x4a65a90a, 0xf27c81a9, + 0x7040d394, 0xba2785e0, 0x7e7e38ff, 0xd5bb0be5, 0xba1f17fa, 0x56a633b0, 0x1546bf79, 0x1d7cec51, + 0x164bef39, 0x8ec9e9f3, 0xb02e0ec9, 0x1fe77ed7, 0xbf399e4f, 0x550707f2, 0x1fceceef, 0x36a1db3e, + 0xdc985b93, 0x316e794e, 0xc415a965, 0x2413551a, 0xf77d749a, 0xc2d993e5, 0x29fcb983, 0xe2d5905f, + 0x61519a86, 0x7a942488, 0x36fb0b90, 0x1df5c9ad, 0x5cc55272, 0x188e559e, 0x4288e08d, 0x1aee41e4, + 0x47c0123e, 0xae72c8b5, 0x189c29ca, 0xbebca648, 0x5a643318, 0xf91567c9, 0x90e1d964, 0x933a2f93, + 0xe963d943, 0x52685394, 0xaeaf8a1d, 0x8bcce8e4, 0x058b45b1, 0xaa87527d, 0x2afedab9, 0x642f72d5, + 0x4daeacb9, 0xfc8fd936, 0x4cc6ae0c, 0x15a5ae77, 0x2018bc05, 0x8feb9b20, 0x2bdd0e02, 0x6172b81f, + 0x50440c73, 0xbadd3f70, 0x31c0a664, 0xadf719f7, 0xf859fa15, 0x3d721e5c, 0xc62ff55f, 0x701d670c, + 0x40b14754, 0x11d86164, 0x903fbd84, 0xbd058b32, 0x97d2ddcc, 0x07f2e4cb, 0x0e711307, 0x1ffd4ffb, + 0x09963e74, 0x6121e6c2, 0x39de5391, 0xee0f8fe6, 0xc779e395, 0x6f94fac9, 0xb4e678d3, 0x664c5c13, + 0xe5244e26, 0x2cfad200, 0xcdf678ff, 0x7e4e75df, 0x20317918, 0x9f274593, 0x6f58664e, 0x8c32319f, + 0x7b94f916, 0x550533c3, 0x761ee44c, 0x300c2e88, 0x5627aea4, 0xa7527098, 0x4a3cc933, 0x4e717354, + 0xf4850ba5, 0x8e6a2d19, 0x1fb81586, 0x74e1d03a, 0x26c1c8a1, 0x06890caa, 0xb1da35be, 0x9a65dc60, + 0x3064ce14, 0x859df497, 0xd5c55639, 0xfb0b9c1f, 0xd25ef2e9, 0x46f1ae81, 0xfebf4f1f, 0x749913d3, + 0xe74c592a, 0x1c8998b2, 0x6ffdd0f0, 0x3f9bfcbc, 0xa9e868fc, 0x3fcf23f3, 0xe7f1da57, 0x3f3c31f9, + 0xcf14f5c9, 0x8fa7c81e, 0x8cc9b3a7, 0x917c919c, 0x983a7507, 0x3fb4b2f5, 0xeb6ac50a, 0xca48c6f7, + 0x07633ac9, 0xb3ea3973, 0xf58d2d2b, 0x352b3f5e, 0x8ecbab65, 0x0119b7ab, 0xf3e78c30, 0xa6af87b9, + 0xfddef7ee, 0xe5551ece, 0xafc27690, 0x65c7aaa8, 0xfbe37375, 0x6f50c91e, 0x773bf939, 0x9bc6f87c, + 0xa35729f6, 0xaef0ae99, 0x256f73b6, 0x00957ff8, 0x7d46b8f8, 0x7e7fc53e, 0x5f343232, 0x75de5ead, + 0xc1ef61ad, 0xf59d3773, 0x3950da6a, 0x35c4aa5e, 0x8a503e1e, 0x3adebfd7, 0xb2c778cb, 0x7f9dfc62, + 0x97c3d8ff, 0x8ef74db6, 0x61ecbaff, 0xd5fa7db5, 0xb2fb7024, 0xd9f6ace2, 0xab34a077, 0xece692cb, + 0x9d93d74c, 0xfe5d9cd0, 0x4757ab7a, 0xe1efef9b, 0xbf4db7f7, 0x68719a4a, 0x498126f6, 0x7c36fe33, + 0x461e3348, 0x68ce20d9, 0x5a338825, 0x568ce209, 0x95a33882, 0x2568ce20, 0x095a3388, 0x82568ce2, + 0xc44d3d38, 0x7104ad19, 0x9c412b46, 0xf4e2269e, 0xa7a71134, 0x67c93889, 0x6bf4f0fe, 0xec3ffb7d, + 0x937ab0db, 0x4e8bbc62, 0x19fabd0b, 0x5b82433a, 0x075e69b0, 0x6132f9ac, 0x9b0c23e3, 0x69b0f5e6, + 0xcd361cbe, 0xf34d83af, 0x8f34d806, 0x1479a6c0, 0x87afcd36, 0x6c18f34d, 0x6360879a, 0x9fa74cde, + 0x1d7c06ca, 0x4af0166c, 0xcd87af83, 0xf0655e02, 0xc059b00d, 0xadf8359f, 0x4dc059b0, 0x360dbf06, + 0x0673f80b, 0x059b08df, 0x6fc1837c, 0x5e02cd87, 0xd816f06d, 0x0635e02c, 0x059b04df, 0xefc1a37c, + 0xbe02cd80, 0xb0ade0c9, 0x1b37c059, 0x166c337c, 0xdf062df0, 0xdc059b02, 0x7166f068, 0xb9d2d6bf, + 0x826dce95, 0x382ede33, 0x19c136e3, 0xe33829df, 0x6e33821d, 0x4ef19c17, 0x087719c1, 0x7053b8ce, + 0x6704bbc6, 0x977825dc, 0x816b5f98, 0x1bbe0b77, 0x9592aa6d, 0x5990fe2f, 0xd25cbcf0, 0xb7df7d78, + 0x9f46a7ec, 0xe17666e9, 0x7dced644, 0xf1995cfb, 0xf6eda1e0, 0x78f667b3, 0x2607facf, 0xf479ee9f, + 0xd5e045bb, 0x6fb686e5, 0xddffb878, 0x7a707746, 0x7f4fc3c4, 0xf4cdd47f, 0xa6930f2a, 0xd0339a4b, + 0x07b34974, 0xda692e9a, 0x26932cd0, 0xd21eeaf0, 0x9369a1b4, 0x9b4d0da6, 0x60448d34, 0x33cc45ca, + 0x6515c7c2, 0x8ae9a15d, 0x83115cba, 0x8b2b622b, 0x5b45bb98, 0x5b46d16c, 0x7d16ddb4, 0xb2be8b62, + 0x98f61f45, 0x5c652f31, 0x1ed4c87b, 0xcc87b532, 0x44c87852, 0x87eedd16, 0x084ce7bd, 0x87e93f65, + 0xdea666f9, 0xb3feed9b, 0x2da69e4b, 0x5f5e2238, 0x448df95e, 0xe783dd58, 0x2758b377, 0x87573af4, + 0xb58c2c35, 0xa4d6396a, 0x513dac06, 0x8c3131ac, 0x135815cd, 0x376e6156, 0x80de8e61, 0x7306b6b9, + 0xfd8c26e6, 0xffef705b, 0xf04675df, 0x0f57b05b, 0xb2a52f7b, 0x5179b5ce, 0xced6ede0, 0xe45895bd, + 0x7c35c54d, 0xeeaea051, 0xd7b8c145, 0x85a12ddf, 0x274a972a, 0x9ec71a13, 0xa10a254f, 0x1c69b7a2, + 0xb89c3b5d, 0xe1e8ba54, 0x24b5cfb3, 0xe3274e7e, 0x08ed917f, 0x413c635d, 0xf5065cbe, 0x4eb5a4bf, + 0xdab38a87, 0xe2e941fe, 0x49fc28ec, 0x742cee63, 0x7dee6348, 0x5cef93e8, 0xc692f516, 0xf57ecfdc, + 0x7db497d3, 0xcf10b492, 0xd17b3a9c, 0xf9d225c3, 0xff8c9d05, 0xc5acfa49, 0x36f924f8, 0xb7bc1952, + 0xc62d62e9, 0xf4e3f75f, 0xc5ece870, 0x93f861f8, 0x9d04a246, 0xbdf18a31, 0x1a4faf92, 0x57a81389, + 0x6fe7db1f, 0x862f0d6d, 0x36a9636b, 0x1c1bfe96, 0xead38f56, 0x9c13f474, 0x1c8a37a3, 0xba39195d, + 0x65727232, 0xc8cae0e4, 0x639195b9, 0x56a7232b, 0x8cad0e46, 0x3919599c, 0x740dceb2, 0xe46edc4e, + 0xd45f3ac0, 0x234eef39, 0xa3f9d607, 0x8c3b79ce, 0x93e7581c, 0x44ede73a, 0x2ef9206e, 0x66e02cd8, + 0x66c17783, 0xf833af01, 0xc059b05d, 0x1bbe0deb, 0x83780b36, 0xcd86efc1, 0xe0d5be02, 0x80b3607b, + 0x3df8336f, 0x1bc059b0, 0x9b0dde0d, 0xc1bb7c05, 0x80b3607b, 0xc36e0c5b, 0x326f0166, 0x166c2f78, + 0x8f061df0, 0xb70166c3, 0x9b013c1a, 0xe0d9bc05, 0xc059b07d, 0x0fde0c5b, 0xd5bc059b, 0xb3617be0, + 0x7c19b780, 0x0679ec40, 0x7c91c7b0, 0x0681ec50, 0xfc91e7b1, 0xba27b15e, 0xc9207b17, 0x691ec487, + 0xf25b6308, 0x79de3176, 0x3a79f4bf, 0xe33820bf, 0xef19c161, 0x7ef19c13, 0x101f19c1, 0x0517f19c, + 0xc125fc67, 0x9c141f19, 0x8ce088f1, 0xf19c13ef, 0x3e3382fd, 0x07e33824, 0x65fc6704, 0x457f19c1, + 0x155fc670, 0x04d7f19c, 0x70587c67, 0x3382a3c6, 0xe338223e, 0x1f19c131, 0x52719c15, 0x7cfa24f0, + 0xd59117d1, 0xfda5d892, 0xe02969e2, 0xb71fbffd, 0xdfebfe5f, 0xe5fede67, 0xbb807a5f, 0x46c64719, + 0x5f9b96ec, 0xf1dc61ec, 0xdafda744, 0xcc66c440, 0xae3399ff, 0xc7eceba3, 0x7971cb98, 0xc98d19e0, + 0xa87daca7, 0xd2cbabac, 0xd26b577f, 0x750eb775, 0xc7573951, 0x7c233c00, 0x2baca2ca, 0x97515d34, + 0x4570622b, 0xf16e1e6c, 0x5b457663, 0x5746d15c, 0x25d75db7, 0xa58f5337, 0xcb78798e, 0xe27adff0, + 0x6fb61ccf, 0x187a67cc, 0x5eedfe1f, 0x0ba97bfb, 0x9be57e1e, 0x193e6c1b, 0x31af8db3, 0xc32e5f66, + 0x5ec16b58, 0x2ff276d6, 0x70d27f6b, 0xdcd90eb5, 0x5f27d093, 0x1a4bd757, 0x84a72f7c, 0x59fdacbd, + 0x46bceb4b, 0x4577d0a7, 0xc788aebd, 0x22ba7115, 0xcbb4577e, 0x093dedd5, 0x8dfd8e7d, 0x3f7afc87, + 0x3ffe2f4e, 0x624b5c0a, 0x2d6c496b, 0xb125ad89, 0xd3f624b5, 0xe95ec49e, 0xd638c743, 0x829fa3a9, + 0x0fb51d0f, 0x9887fe31, 0xb4bfd863, 0x621f847f, 0xdec7c59a, 0xecc3e20d, 0x7511f146, 0xa9e0f893, + 0x156e5c3f, 0xc4db201f, 0x7b8fc5c7, 0xf7e2221b, 0x0000001f +}; + +static const UINT g_DXUTArrowMeshSrcDataSizeInBytes = 2193; + +//----------------------------------------------------------------------------- +HRESULT WINAPI DXUTCreateGUITextureFromInternalArray9( LPDIRECT3DDEVICE9 pd3dDevice, IDirect3DTexture9** ppTexture, D3DXIMAGE_INFO* pInfo ) +{ + return D3DXCreateTextureFromFileInMemoryEx( pd3dDevice, g_DXUTGUITextureSrcData, g_DXUTGUITextureSrcDataSizeInBytes, + D3DX_DEFAULT, D3DX_DEFAULT, 1, 0, D3DFMT_UNKNOWN, D3DPOOL_MANAGED, + D3DX_DEFAULT, D3DX_DEFAULT, 0, pInfo, NULL, ppTexture ); +} + +//-------------------------------------------------------------------------------------- +HRESULT WINAPI DXUTCreateGUITextureFromInternalArray11(ID3D11Device* pd3dDevice, ID3D11Texture2D** ppTexture, D3DX11_IMAGE_INFO* pInfo) +{ + HRESULT hr; + + D3DX11_IMAGE_INFO SrcInfo; + if( !pInfo ) + { + D3DX11GetImageInfoFromMemory( g_DXUTGUITextureSrcData, g_DXUTGUITextureSrcDataSizeInBytes, NULL, &SrcInfo, NULL ); + pInfo = &SrcInfo; + } + + ID3D11Resource *pRes; + D3DX11_IMAGE_LOAD_INFO loadInfo; + loadInfo.Width = D3DX11_DEFAULT; + loadInfo.Height = D3DX11_DEFAULT; + loadInfo.Depth = D3DX11_DEFAULT; + loadInfo.FirstMipLevel = 0; + loadInfo.MipLevels = 1; + loadInfo.Usage = D3D11_USAGE_DEFAULT; + loadInfo.BindFlags = D3D11_BIND_SHADER_RESOURCE; + loadInfo.CpuAccessFlags = 0; + loadInfo.MiscFlags = 0; + //loadInfo.Format = MAKE_TYPELESS( pInfo->Format ); + loadInfo.Format = MAKE_SRGB( pInfo->Format ); + loadInfo.Filter = D3DX11_FILTER_NONE; + loadInfo.MipFilter = D3DX11_FILTER_NONE; + loadInfo.pSrcInfo = pInfo; + + hr = D3DX11CreateTextureFromMemory( pd3dDevice, g_DXUTGUITextureSrcData, g_DXUTGUITextureSrcDataSizeInBytes, &loadInfo, NULL, &pRes, NULL ); + if( FAILED( hr ) ) + return hr; + hr = pRes->QueryInterface( __uuidof( ID3D11Texture2D ), (LPVOID*)ppTexture ); + SAFE_RELEASE( pRes ); + + return S_OK; +} + +//----------------------------------------------------------------------------- +HRESULT WINAPI DXUTCreateArrowMeshFromInternalArray( LPDIRECT3DDEVICE9 pd3dDevice, ID3DXMesh** ppMesh ) +{ + return D3DXLoadMeshFromXInMemory( g_DXUTArrowMeshSrcData, g_DXUTArrowMeshSrcDataSizeInBytes, + D3DXMESH_MANAGED, pd3dDevice, NULL, NULL, NULL, NULL, ppMesh ); +} + diff --git a/Demos/DX11ClothDemo/DXUT/Optional/DXUTres.h b/Demos/DX11ClothDemo/DXUT/Optional/DXUTres.h new file mode 100644 index 000000000..beab017d9 --- /dev/null +++ b/Demos/DX11ClothDemo/DXUT/Optional/DXUTres.h @@ -0,0 +1,18 @@ +//---------------------------------------------------------------------------- +// File: dxutres.h +// +// Functions to create DXUT media from arrays in memory +// +// Copyright (c) Microsoft Corp. All rights reserved. +//----------------------------------------------------------------------------- +#pragma once +#ifndef DXUT_RES_H +#define DXUT_RES_H + +HRESULT WINAPI DXUTCreateGUITextureFromInternalArray9( LPDIRECT3DDEVICE9 pd3dDevice, IDirect3DTexture9** ppTexture, + D3DXIMAGE_INFO* pInfo ); +HRESULT WINAPI DXUTCreateGUITextureFromInternalArray11( ID3D11Device* pd3dDevice, ID3D11Texture2D** ppTexture, + D3DX11_IMAGE_INFO* pInfo ); +HRESULT WINAPI DXUTCreateArrowMeshFromInternalArray( LPDIRECT3DDEVICE9 pd3dDevice, ID3DXMesh** ppMesh ); + +#endif diff --git a/Demos/DX11ClothDemo/DXUT/Optional/DXUTsettingsdlg.cpp b/Demos/DX11ClothDemo/DXUT/Optional/DXUTsettingsdlg.cpp new file mode 100644 index 000000000..334fa26b6 --- /dev/null +++ b/Demos/DX11ClothDemo/DXUT/Optional/DXUTsettingsdlg.cpp @@ -0,0 +1,2853 @@ +//-------------------------------------------------------------------------------------- +// File: DXUTSettingsDlg.cpp +// +// Dialog for selection of device settings +// +// Copyright (c) Microsoft Corporation. All rights reserved +//-------------------------------------------------------------------------------------- +#include "DXUT.h" +#include "DXUTgui.h" +#include "DXUTsettingsDlg.h" +#undef min // use __min instead +#undef max // use __max instead + + +//-------------------------------------------------------------------------------------- +// Internal functions forward declarations +//-------------------------------------------------------------------------------------- +WCHAR* DXUTAPIVersionToString( DXUTDeviceVersion version ); +WCHAR* DXUTPresentIntervalToString( UINT pi ); +WCHAR* DXUTMultisampleTypeToString( D3DMULTISAMPLE_TYPE MultiSampleType ); +WCHAR* DXUTD3DDeviceTypeToString( D3DDEVTYPE devType ); +WCHAR* DXUTD3DX11DeviceTypeToString( D3D_DRIVER_TYPE devType ); +WCHAR* DXUTVertexProcessingTypeToString( DWORD vpt ); + + +HRESULT DXUTSnapDeviceSettingsToEnumDevice( DXUTDeviceSettings* pDeviceSettings, bool forceEnum, D3D_FEATURE_LEVEL forceFL = D3D_FEATURE_LEVEL(0) ); + +//-------------------------------------------------------------------------------------- +// Global state +//-------------------------------------------------------------------------------------- +DXUTDeviceSettings g_DeviceSettings; + +CD3DSettingsDlg* WINAPI DXUTGetD3DSettingsDialog() +{ + // Using an accessor function gives control of the construction order + static CD3DSettingsDlg dlg; + return &dlg; +} + + +//-------------------------------------------------------------------------------------- +CD3DSettingsDlg::CD3DSettingsDlg() +{ + m_pStateBlock = NULL; + m_bActive = false; + m_pActiveDialog = NULL; + + m_Levels[0] = D3D_FEATURE_LEVEL_9_1; + m_Levels[1] = D3D_FEATURE_LEVEL_9_2; + m_Levels[2] = D3D_FEATURE_LEVEL_9_3; + m_Levels[3] = D3D_FEATURE_LEVEL_10_0; + m_Levels[4] = D3D_FEATURE_LEVEL_10_1; + m_Levels[5] = D3D_FEATURE_LEVEL_11_0; + +} + + +//-------------------------------------------------------------------------------------- +CD3DSettingsDlg::~CD3DSettingsDlg() +{ + // Release the memory used to hold the D3D11 refresh data in the combo box + CDXUTComboBox* pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_D3D11_REFRESH_RATE ); + if( pComboBox ) + for( UINT i = 0; i < pComboBox->GetNumItems(); ++i ) + { + DXGI_RATIONAL* pRate = reinterpret_cast( pComboBox->GetItemData( i ) ); + delete pRate; + } +} + + +//-------------------------------------------------------------------------------------- +void CD3DSettingsDlg::Init( CDXUTDialogResourceManager* pManager ) +{ + assert( pManager ); + m_Dialog.Init( pManager, false ); // Don't register this dialog. + m_RevertModeDialog.Init( pManager, false ); // Don't register this dialog. + m_pActiveDialog = &m_Dialog; + CreateControls(); +} + +//-------------------------------------------------------------------------------------- +void CD3DSettingsDlg::Init( CDXUTDialogResourceManager* pManager, LPCWSTR szControlTextureFileName ) +{ + assert( pManager ); + m_Dialog.Init( pManager, false, szControlTextureFileName ); // Don't register this dialog. + m_RevertModeDialog.Init( pManager, false, szControlTextureFileName ); // Don't register this dialog. + m_pActiveDialog = &m_Dialog; + CreateControls(); +} + + +//-------------------------------------------------------------------------------------- +void CD3DSettingsDlg::Init( CDXUTDialogResourceManager* pManager, LPCWSTR pszControlTextureResourcename, + HMODULE hModule ) +{ + assert( pManager ); + m_Dialog.Init( pManager, false, pszControlTextureResourcename, hModule ); // Don't register this dialog. + m_RevertModeDialog.Init( pManager, false, pszControlTextureResourcename, hModule ); // Don't register this dialog + m_pActiveDialog = &m_Dialog; + CreateControls(); +} + + +//-------------------------------------------------------------------------------------- +void CD3DSettingsDlg::CreateControls() +{ + // Set up main settings dialog + m_Dialog.EnableKeyboardInput( true ); + m_Dialog.SetFont( 0, L"Arial", 15, FW_NORMAL ); + m_Dialog.SetFont( 1, L"Arial", 28, FW_BOLD ); + + // Right-justify static controls + CDXUTElement* pElement = m_Dialog.GetDefaultElement( DXUT_CONTROL_STATIC, 0 ); + if( pElement ) + { + pElement->dwTextFormat = DT_VCENTER | DT_RIGHT; + + // Title + CDXUTStatic* pStatic = NULL; + m_Dialog.AddStatic( DXUTSETTINGSDLG_STATIC, L"Direct3D Settings", 10, 5, 400, 50, false, &pStatic ); + pElement = pStatic->GetElement( 0 ); + pElement->iFont = 1; + pElement->dwTextFormat = DT_TOP | DT_LEFT; + } + + // DXUTSETTINGSDLG_API_VERSION + m_Dialog.AddStatic( DXUTSETTINGSDLG_STATIC, L"API Version", 10, 35, 180, 23 ); + m_Dialog.AddComboBox( DXUTSETTINGSDLG_API_VERSION, 200, 35, 300, 23 ); + + + //DXUTSETTINGSDLG_D3D11_FEATURE_LEVEL + m_Dialog.AddStatic( DXUTSETTINGSDLG_D3D11_FEATURE_LEVEL_LABEL, L"Feature Level", 10, 60, 180, 23 ); + m_Dialog.AddComboBox( DXUTSETTINGSDLG_D3D11_FEATURE_LEVEL, 200, 60, 300, 23 ); + m_Dialog.GetComboBox( DXUTSETTINGSDLG_D3D11_FEATURE_LEVEL )->SetDropHeight( 106 ); + + + // DXUTSETTINGSDLG_ADAPTER + m_Dialog.AddStatic( DXUTSETTINGSDLG_STATIC, L"Display Adapter", 10, 85, 180, 23 ); + m_Dialog.AddComboBox( DXUTSETTINGSDLG_ADAPTER, 200, 85, 300, 23 ); + + // DXUTSETTINGSDLG_DEVICE_TYPE + m_Dialog.AddStatic( DXUTSETTINGSDLG_STATIC, L"Render Device", 10, 110, 180, 23 ); + m_Dialog.AddComboBox( DXUTSETTINGSDLG_DEVICE_TYPE, 200, 110, 300, 23 ); + + // DXUTSETTINGSDLG_WINDOWED, DXUTSETTINGSDLG_FULLSCREEN + m_Dialog.AddCheckBox( DXUTSETTINGSDLG_DEVICECLIP, L"Clip to device when window spans across multiple monitors", + 250, 136, 500, 16 ); + m_Dialog.AddRadioButton( DXUTSETTINGSDLG_WINDOWED, DXUTSETTINGSDLG_WINDOWED_GROUP, L"Windowed", + 360, 157, 100, 16 ); + m_Dialog.AddRadioButton( DXUTSETTINGSDLG_FULLSCREEN, DXUTSETTINGSDLG_WINDOWED_GROUP, L"Full Screen", + 220, 157, 100, 16 ); + + // DXUTSETTINGSDLG_ADAPTER_FORMAT + m_Dialog.AddStatic( DXUTSETTINGSDLG_ADAPTER_FORMAT_LABEL, L"Adapter Format", 10, 175, 180, 23 ); + m_Dialog.AddComboBox( DXUTSETTINGSDLG_ADAPTER_FORMAT, 200, 175, 300, 23 ); + + // DXUTSETTINGSDLG_RESOLUTION + m_Dialog.AddStatic( DXUTSETTINGSDLG_RESOLUTION_LABEL, L"Resolution", 10, 200, 180, 23 ); + m_Dialog.AddComboBox( DXUTSETTINGSDLG_RESOLUTION, 200, 200, 200, 23 ); + m_Dialog.GetComboBox( DXUTSETTINGSDLG_RESOLUTION )->SetDropHeight( 106 ); + + // DXUTSETTINGSDLG_RES_SHOW_ALL + m_Dialog.AddCheckBox( DXUTSETTINGSDLG_RESOLUTION_SHOW_ALL, L"Show All Aspect Ratios", 420, 200, 200, 23, false ); + + // DXUTSETTINGSDLG_REFRESH_RATE + m_Dialog.AddStatic( DXUTSETTINGSDLG_REFRESH_RATE_LABEL, L"Refresh Rate", 10, 225, 180, 23 ); + m_Dialog.AddComboBox( DXUTSETTINGSDLG_REFRESH_RATE, 200, 225, 300, 23 ); + + // DXUTSETTINGSDLG_BACK_BUFFER_FORMAT + m_Dialog.AddStatic( DXUTSETTINGSDLG_BACK_BUFFER_FORMAT_LABEL, L"Back Buffer Format", 10, 260, 180, 23 ); + m_Dialog.AddComboBox( DXUTSETTINGSDLG_BACK_BUFFER_FORMAT, 200, 260, 300, 23 ); + + // DXUTSETTINGSDLG_DEPTH_STENCIL + m_Dialog.AddStatic( DXUTSETTINGSDLG_DEPTH_STENCIL_LABEL, L"Depth/Stencil Format", 10, 285, 180, 23 ); + m_Dialog.AddComboBox( DXUTSETTINGSDLG_DEPTH_STENCIL, 200, 285, 300, 23 ); + + // DXUTSETTINGSDLG_MULTISAMPLE_TYPE + m_Dialog.AddStatic( DXUTSETTINGSDLG_MULTISAMPLE_TYPE_LABEL, L"Multisample Type", 10, 310, 180, 23 ); + m_Dialog.AddComboBox( DXUTSETTINGSDLG_MULTISAMPLE_TYPE, 200, 310, 300, 23 ); + + // DXUTSETTINGSDLG_MULTISAMPLE_QUALITY + m_Dialog.AddStatic( DXUTSETTINGSDLG_MULTISAMPLE_QUALITY_LABEL, L"Multisample Quality", 10, 335, 180, 23 ); + m_Dialog.AddComboBox( DXUTSETTINGSDLG_MULTISAMPLE_QUALITY, 200, 335, 300, 23 ); + + // DXUTSETTINGSDLG_VERTEX_PROCESSING + m_Dialog.AddStatic( DXUTSETTINGSDLG_VERTEX_PROCESSING_LABEL, L"Vertex Processing", 10, 360, 180, 23 ); + m_Dialog.AddComboBox( DXUTSETTINGSDLG_VERTEX_PROCESSING, 200, 360, 300, 23 ); + + // DXUTSETTINGSDLG_PRESENT_INTERVAL + m_Dialog.AddStatic( DXUTSETTINGSDLG_PRESENT_INTERVAL_LABEL, L"Vertical Sync", 10, 385, 180, 23 ); + m_Dialog.AddComboBox( DXUTSETTINGSDLG_PRESENT_INTERVAL, 200, 385, 300, 23 ); + + // DXUTSETTINGSDLG_D3D11_ADAPTER_OUTPUT + m_Dialog.AddStatic( DXUTSETTINGSDLG_D3D11_ADAPTER_OUTPUT_LABEL, L"Adapter Output", 10, 175, 180, 23 ); + m_Dialog.AddComboBox( DXUTSETTINGSDLG_D3D11_ADAPTER_OUTPUT, 200, 175, 300, 23 ); + + // DXUTSETTINGSDLG_D3D11_RESOLUTION + m_Dialog.AddStatic( DXUTSETTINGSDLG_D3D11_RESOLUTION_LABEL, L"Resolution", 10, 200, 180, 23 ); + m_Dialog.AddComboBox( DXUTSETTINGSDLG_D3D11_RESOLUTION, 200, 200, 200, 23 ); + m_Dialog.GetComboBox( DXUTSETTINGSDLG_D3D11_RESOLUTION )->SetDropHeight( 106 ); + + // DXUTSETTINGSDLG_D3D11_REFRESH_RATE + m_Dialog.AddStatic( DXUTSETTINGSDLG_D3D11_REFRESH_RATE_LABEL, L"Refresh Rate", 10, 225, 180, 23 ); + m_Dialog.AddComboBox( DXUTSETTINGSDLG_D3D11_REFRESH_RATE, 200, 225, 300, 23 ); + + // DXUTSETTINGSDLG_D3D11_BACK_BUFFER_FORMAT + m_Dialog.AddStatic( DXUTSETTINGSDLG_D3D11_BACK_BUFFER_FORMAT_LABEL, L"Back Buffer Format", 10, 260, 180, 23 ); + m_Dialog.AddComboBox( DXUTSETTINGSDLG_D3D11_BACK_BUFFER_FORMAT, 200, 260, 300, 23 ); + + // DXUTSETTINGSDLG_D3D11_MULTISAMPLE_COUNT + m_Dialog.AddStatic( DXUTSETTINGSDLG_D3D11_MULTISAMPLE_COUNT_LABEL, L"Multisample Count", 10, 285, 180, 23 ); + m_Dialog.AddComboBox( DXUTSETTINGSDLG_D3D11_MULTISAMPLE_COUNT, 200, 285, 300, 23 ); + + // DXUTSETTINGSDLG_D3D11_MULTISAMPLE_QUALITY + m_Dialog.AddStatic( DXUTSETTINGSDLG_D3D11_MULTISAMPLE_QUALITY_LABEL, L"Multisample Quality", 10, 310, 180, 23 ); + m_Dialog.AddComboBox( DXUTSETTINGSDLG_D3D11_MULTISAMPLE_QUALITY, 200, 310, 300, 23 ); + + // DXUTSETTINGSDLG_D3D11_PRESENT_INTERVAL + m_Dialog.AddStatic( DXUTSETTINGSDLG_D3D11_PRESENT_INTERVAL_LABEL, L"Vertical Sync", 10, 335, 180, 23 ); + m_Dialog.AddComboBox( DXUTSETTINGSDLG_D3D11_PRESENT_INTERVAL, 200, 335, 300, 23 ); + + // DXUTSETTINGSDLG_D3D11_DEBUG_DEVICE + m_Dialog.AddCheckBox( DXUTSETTINGSDLG_D3D11_DEBUG_DEVICE, L"Create Debug Device", 200, 365, 180, 23 ); + + // DXUTSETTINGSDLG_OK, DXUTSETTINGSDLG_CANCEL + m_Dialog.AddButton( DXUTSETTINGSDLG_OK, L"OK", 230, 440, 73, 31 ); + m_Dialog.AddButton( DXUTSETTINGSDLG_CANCEL, L"Cancel", 315, 440, 73, 31, 0, true ); + + // Set up mode change dialog + m_RevertModeDialog.EnableKeyboardInput( true ); + m_RevertModeDialog.EnableNonUserEvents( true ); + m_RevertModeDialog.SetFont( 0, L"Arial", 15, FW_NORMAL ); + m_RevertModeDialog.SetFont( 1, L"Arial", 28, FW_BOLD ); + + pElement = m_RevertModeDialog.GetDefaultElement( DXUT_CONTROL_STATIC, 0 ); + if( pElement ) + { + pElement->dwTextFormat = DT_VCENTER | DT_RIGHT; + + // Title + CDXUTStatic* pStatic = NULL; + m_RevertModeDialog.AddStatic( DXUTSETTINGSDLG_STATIC, L"Do you want to keep these display settings?", 10, 5, + 640, 50, false, &pStatic ); + pElement = pStatic->GetElement( 0 ); + pElement->iFont = 1; + pElement->dwTextFormat = DT_TOP | DT_LEFT; + + // Timeout static text control + m_RevertModeDialog.AddStatic( DXUTSETTINGSDLG_STATIC_MODE_CHANGE_TIMEOUT, L"", 10, 90, 640, 30, + false, &pStatic ); + pElement = pStatic->GetElement( 0 ); + pElement->iFont = 0; + pElement->dwTextFormat = DT_TOP | DT_LEFT; + } + + // DXUTSETTINGSDLG_MODE_CHANGE_ACCEPT, DXUTSETTINGSDLG_MODE_CHANGE_REVERT + m_RevertModeDialog.AddButton( DXUTSETTINGSDLG_MODE_CHANGE_ACCEPT, L"Yes", 230, 50, 73, 31 ); + m_RevertModeDialog.AddButton( DXUTSETTINGSDLG_MODE_CHANGE_REVERT, L"No", 315, 50, 73, 31, 0, true ); +} + + +//-------------------------------------------------------------------------------------- +HRESULT CD3DSettingsDlg::OnD3D9CreateDevice( IDirect3DDevice9* pd3dDevice ) +{ + if( pd3dDevice == NULL ) + return DXUT_ERR_MSGBOX( L"CD3DSettingsDlg::OnCreatedDevice", E_INVALIDARG ); + + // Create the fonts/textures + m_Dialog.SetCallback( StaticOnEvent, ( void* )this ); + m_RevertModeDialog.SetCallback( StaticOnEvent, ( void* )this ); + + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +// Changes the UI defaults to the current device settings +//-------------------------------------------------------------------------------------- +HRESULT CD3DSettingsDlg::Refresh() +{ + HRESULT hr = S_OK; + + g_DeviceSettings = DXUTGetDeviceSettings(); + + CDXUTComboBox* pAPIComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_API_VERSION ); + pAPIComboBox->RemoveAllItems(); + if( DXUTDoesAppSupportD3D9() ) + { + // Ensure that at least one adapter got enumerated. + CD3D9Enumeration* pD3DEnum = DXUTGetD3D9Enumeration(); + if( pD3DEnum->GetAdapterInfoList()->GetSize() > 0 ) + AddAPIVersion( DXUT_D3D9_DEVICE ); + } + if( DXUTDoesAppSupportD3D11() && DXUTIsD3D11Available() ) + { + // Ensure that at least one adapter got enumerated. + CD3D11Enumeration* pD3DEnum = DXUTGetD3D11Enumeration(); + if( pD3DEnum->GetAdapterInfoList()->GetSize() > 0 ) + AddAPIVersion( DXUT_D3D11_DEVICE ); + } + + // If no API has been added, something has gone wrong. Exit the dialog. + if( pAPIComboBox->GetNumItems() == 0 ) + { + SetActive( false ); + return S_OK; + } + + pAPIComboBox->SetSelectedByData( ULongToPtr( g_DeviceSettings.ver ) ); + + switch( g_DeviceSettings.ver ) + { + case DXUT_D3D9_DEVICE: + { + // Show all D3D9-specific controls and hide controls for all other D3D versions. + ShowControlSet( DXUT_D3D9_DEVICE ); + + CD3D9Enumeration* pD3DEnum = DXUTGetD3D9Enumeration(); + + // Fill the UI with the current settings + AddDeviceType( g_DeviceSettings.d3d9.DeviceType ); + SetWindowed( FALSE != g_DeviceSettings.d3d9.pp.Windowed ); + SetDeviceClip( 0 != ( g_DeviceSettings.d3d9.pp.Flags & D3DPRESENTFLAG_DEVICECLIP ) ); + AddAdapterFormat( g_DeviceSettings.d3d9.AdapterFormat ); + AddResolution( g_DeviceSettings.d3d9.pp.BackBufferWidth, g_DeviceSettings.d3d9.pp.BackBufferHeight ); + AddRefreshRate( g_DeviceSettings.d3d9.pp.FullScreen_RefreshRateInHz ); + AddBackBufferFormat( g_DeviceSettings.d3d9.pp.BackBufferFormat ); + AddDepthStencilBufferFormat( g_DeviceSettings.d3d9.pp.AutoDepthStencilFormat ); + AddMultisampleType( g_DeviceSettings.d3d9.pp.MultiSampleType ); + AddMultisampleQuality( g_DeviceSettings.d3d9.pp.MultiSampleQuality ); + + if( g_DeviceSettings.d3d9.BehaviorFlags & D3DCREATE_PUREDEVICE ) + AddVertexProcessingType( D3DCREATE_PUREDEVICE ); + else if( g_DeviceSettings.d3d9.BehaviorFlags & D3DCREATE_HARDWARE_VERTEXPROCESSING ) + AddVertexProcessingType( D3DCREATE_HARDWARE_VERTEXPROCESSING ); + else if( g_DeviceSettings.d3d9.BehaviorFlags & D3DCREATE_SOFTWARE_VERTEXPROCESSING ) + AddVertexProcessingType( D3DCREATE_SOFTWARE_VERTEXPROCESSING ); + else if( g_DeviceSettings.d3d9.BehaviorFlags & D3DCREATE_MIXED_VERTEXPROCESSING ) + AddVertexProcessingType( D3DCREATE_MIXED_VERTEXPROCESSING ); + + CD3D9EnumDeviceSettingsCombo* pBestDeviceSettingsCombo = pD3DEnum->GetDeviceSettingsCombo( + g_DeviceSettings.d3d9.AdapterOrdinal, g_DeviceSettings.d3d9.DeviceType, + g_DeviceSettings.d3d9.AdapterFormat, g_DeviceSettings.d3d9.pp.BackBufferFormat, + ( g_DeviceSettings.d3d9.pp.Windowed != 0 ) ); + if( NULL == pBestDeviceSettingsCombo ) + return DXUT_ERR_MSGBOX( L"GetDeviceSettingsCombo", E_INVALIDARG ); + + // Get the adapters list from CD3D9Enumeration object + CGrowableArray * pAdapterInfoList = pD3DEnum->GetAdapterInfoList(); + + if( pAdapterInfoList->GetSize() == 0 ) + return DXUT_ERR_MSGBOX( L"CD3DSettingsDlg::OnCreatedDevice", DXUTERR_NOCOMPATIBLEDEVICES ); + + CDXUTComboBox* pAdapterCombo = m_Dialog.GetComboBox( DXUTSETTINGSDLG_ADAPTER ); + pAdapterCombo->RemoveAllItems(); + + // Add adapters + for( int iAdapter = 0; iAdapter < pAdapterInfoList->GetSize(); iAdapter++ ) + { + CD3D9EnumAdapterInfo* pAdapterInfo = pAdapterInfoList->GetAt( iAdapter ); + AddAdapter( pAdapterInfo->szUniqueDescription, pAdapterInfo->AdapterOrdinal ); + } + + pAdapterCombo->SetSelectedByData( ULongToPtr( g_DeviceSettings.d3d9.AdapterOrdinal ) ); + + hr = OnAPIVersionChanged( true ); + if( FAILED( hr ) ) + return hr; + + //m_Dialog.Refresh(); + CDXUTDialog::SetRefreshTime( ( float )DXUTGetTime() ); + break; + } + case DXUT_D3D11_DEVICE: + { + // Show all D3D11-specific controls and hide controls for all other D3D versions. + ShowControlSet( DXUT_D3D11_DEVICE ); + + CD3D11Enumeration* pD3DEnum = DXUTGetD3D11Enumeration(); + + // Fill the UI with the current settings + AddD3D11DeviceType( g_DeviceSettings.d3d11.DriverType ); + SetWindowed( FALSE != g_DeviceSettings.d3d11.sd.Windowed ); + CD3D11EnumOutputInfo* pOutputInfo = GetCurrentD3D11OutputInfo(); + AddD3D11AdapterOutput( pOutputInfo->Desc.DeviceName, g_DeviceSettings.d3d11.Output ); + + + + AddD3D11Resolution( g_DeviceSettings.d3d11.sd.BufferDesc.Width, + g_DeviceSettings.d3d11.sd.BufferDesc.Height ); + AddD3D11RefreshRate( g_DeviceSettings.d3d11.sd.BufferDesc.RefreshRate ); + AddD3D11BackBufferFormat( g_DeviceSettings.d3d11.sd.BufferDesc.Format ); + AddD3D11MultisampleCount( g_DeviceSettings.d3d11.sd.SampleDesc.Count ); + AddD3D11MultisampleQuality( g_DeviceSettings.d3d11.sd.SampleDesc.Quality ); + + CD3D11EnumDeviceSettingsCombo* pBestDeviceSettingsCombo = pD3DEnum->GetDeviceSettingsCombo( + g_DeviceSettings.d3d11.AdapterOrdinal, g_DeviceSettings.d3d11.DriverType, + g_DeviceSettings.d3d11.Output, g_DeviceSettings.d3d11.sd.BufferDesc.Format, + ( g_DeviceSettings.d3d11.sd.Windowed != 0 ) ); + + if( NULL == pBestDeviceSettingsCombo ) + return DXUT_ERR_MSGBOX( L"GetDeviceSettingsCombo", E_INVALIDARG ); + + CDXUTComboBox *pFeatureLevelBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_D3D11_FEATURE_LEVEL ); + pFeatureLevelBox->RemoveAllItems(); + for (int fli = 0; fli < TOTAL_FEATURE_LEVLES; fli++) { + if (m_Levels[fli] >= g_DeviceSettings.MinimumFeatureLevel + && m_Levels[fli] <=pBestDeviceSettingsCombo->pDeviceInfo->MaxLevel) { + AddD3D11FeatureLevel( m_Levels[fli] ); + } + } + pFeatureLevelBox->SetSelectedByData( ULongToPtr( g_DeviceSettings.d3d11.DeviceFeatureLevel ) ); + + + // Get the adapters list from CD3D11Enumeration object + CGrowableArray * pAdapterInfoList = pD3DEnum->GetAdapterInfoList(); + + if( pAdapterInfoList->GetSize() == 0 ) + return DXUT_ERR_MSGBOX( L"CD3DSettingsDlg::OnCreatedDevice", DXUTERR_NOCOMPATIBLEDEVICES ); + + CDXUTComboBox* pAdapterCombo = m_Dialog.GetComboBox( DXUTSETTINGSDLG_ADAPTER ); + pAdapterCombo->RemoveAllItems(); + + // Add adapters + for( int iAdapter = 0; iAdapter < pAdapterInfoList->GetSize(); iAdapter++ ) + { + CD3D11EnumAdapterInfo* pAdapterInfo = pAdapterInfoList->GetAt( iAdapter ); + AddAdapter( pAdapterInfo->szUniqueDescription, pAdapterInfo->AdapterOrdinal ); + } + + pAdapterCombo->SetSelectedByData( ULongToPtr( g_DeviceSettings.d3d11.AdapterOrdinal ) ); + + hr = OnAPIVersionChanged( true ); + if( FAILED( hr ) ) + return hr; + + //m_Dialog.Refresh(); + CDXUTDialog::SetRefreshTime( ( float )DXUTGetTime() ); + break; + } + } + + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +HRESULT CD3DSettingsDlg::OnD3D9ResetDevice() +{ + const D3DSURFACE_DESC* pDesc = DXUTGetD3D9BackBufferSurfaceDesc(); + m_Dialog.SetLocation( 0, 0 ); + m_Dialog.SetSize( pDesc->Width, pDesc->Height ); + m_Dialog.SetBackgroundColors( D3DCOLOR_ARGB( 255, 98, 138, 206 ), + D3DCOLOR_ARGB( 255, 54, 105, 192 ), + D3DCOLOR_ARGB( 255, 54, 105, 192 ), + D3DCOLOR_ARGB( 255, 10, 73, 179 ) ); + + m_RevertModeDialog.SetLocation( 0, 0 ); + m_RevertModeDialog.SetSize( pDesc->Width, pDesc->Height ); + m_RevertModeDialog.SetBackgroundColors( D3DCOLOR_ARGB( 255, 98, 138, 206 ), + D3DCOLOR_ARGB( 255, 54, 105, 192 ), + D3DCOLOR_ARGB( 255, 54, 105, 192 ), + D3DCOLOR_ARGB( 255, 10, 73, 179 ) ); + + IDirect3DDevice9* pd3dDevice = DXUTGetD3D9Device(); + pd3dDevice->BeginStateBlock(); + pd3dDevice->SetRenderState( D3DRS_FILLMODE, D3DFILL_SOLID ); + pd3dDevice->EndStateBlock( &m_pStateBlock ); + + return S_OK; +} + +//-------------------------------------------------------------------------------------- +void CD3DSettingsDlg::SetSelectedD3D11RefreshRate( DXGI_RATIONAL RefreshRate ) +{ + CDXUTComboBox* pRefreshRateComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_D3D11_REFRESH_RATE ); + + for( UINT i = 0; i < pRefreshRateComboBox->GetNumItems(); ++i ) + { + DXGI_RATIONAL* pRate = ( DXGI_RATIONAL* )pRefreshRateComboBox->GetItemData( i ); + + if( pRate && pRate->Numerator == RefreshRate.Numerator && pRate->Denominator == RefreshRate.Denominator ) + { + pRefreshRateComboBox->SetSelectedByIndex( i ); + return; + } + } +} + +//-------------------------------------------------------------------------------------- +void CD3DSettingsDlg::OnRender( float fElapsedTime ) +{ + if( DXUTGetD3D11Device() ) + OnRender11( fElapsedTime ); + else + OnRender9( fElapsedTime ); +} + + +//-------------------------------------------------------------------------------------- +void CD3DSettingsDlg::OnRender9( float fElapsedTime ) +{ + IDirect3DDevice9* pd3dDevice = DXUTGetD3D9Device(); + + // Clear the render target and the zbuffer + pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, 0x00003F3F, 1.0f, 0 ); + + // Render the scene + if( SUCCEEDED( pd3dDevice->BeginScene() ) ) + { + m_pStateBlock->Capture(); + pd3dDevice->SetRenderState( D3DRS_FILLMODE, D3DFILL_SOLID ); + m_pActiveDialog->OnRender( fElapsedTime ); + m_pStateBlock->Apply(); + pd3dDevice->EndScene(); + } +} + + + +//-------------------------------------------------------------------------------------- +void CD3DSettingsDlg::OnRender11( float fElapsedTime ) +{ + // Render the scene + m_pActiveDialog->OnRender( fElapsedTime ); +} + + +//-------------------------------------------------------------------------------------- +LRESULT CD3DSettingsDlg::MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) +{ + m_pActiveDialog->MsgProc( hWnd, uMsg, wParam, lParam ); + if( uMsg == WM_KEYDOWN && wParam == VK_F2 ) + SetActive( false ); + return 0; +} + + +//-------------------------------------------------------------------------------------- +void CD3DSettingsDlg::OnD3D9LostDevice() +{ + SAFE_RELEASE( m_pStateBlock ); +} + + +//-------------------------------------------------------------------------------------- +void CD3DSettingsDlg::OnD3D9DestroyDevice() +{ +} + + + +//-------------------------------------------------------------------------------------- +HRESULT CD3DSettingsDlg::OnD3D11CreateDevice( ID3D11Device* pd3dDevice ) +{ + //HRESULT hr; + + if( pd3dDevice == NULL ) + return DXUT_ERR_MSGBOX( L"CD3DSettingsDlg::OnCreatedDevice", E_INVALIDARG ); + + // Create the fonts/textures + m_Dialog.SetCallback( StaticOnEvent, ( void* )this ); + m_RevertModeDialog.SetCallback( StaticOnEvent, ( void* )this ); + + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +HRESULT CD3DSettingsDlg::OnD3D11ResizedSwapChain( ID3D11Device* pd3dDevice, + const DXGI_SURFACE_DESC* pBackBufferSurfaceDesc ) +{ + m_Dialog.SetLocation( 0, 0 ); + m_Dialog.SetSize( pBackBufferSurfaceDesc->Width, pBackBufferSurfaceDesc->Height ); + m_Dialog.SetBackgroundColors( D3DCOLOR_ARGB( 255, 98, 138, 206 ), + D3DCOLOR_ARGB( 255, 54, 105, 192 ), + D3DCOLOR_ARGB( 255, 54, 105, 192 ), + D3DCOLOR_ARGB( 255, 10, 73, 179 ) ); + + m_RevertModeDialog.SetLocation( 0, 0 ); + m_RevertModeDialog.SetSize( pBackBufferSurfaceDesc->Width, pBackBufferSurfaceDesc->Height ); + m_RevertModeDialog.SetBackgroundColors( D3DCOLOR_ARGB( 255, 98, 138, 206 ), + D3DCOLOR_ARGB( 255, 54, 105, 192 ), + D3DCOLOR_ARGB( 255, 54, 105, 192 ), + D3DCOLOR_ARGB( 255, 10, 73, 179 ) ); + + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +void CD3DSettingsDlg::OnD3D11DestroyDevice() +{ + + +} + +//-------------------------------------------------------------------------------------- +void CD3DSettingsDlg::ShowControlSet( DXUTDeviceVersion ver ) +{ + switch( ver ) + { + case DXUT_D3D9_DEVICE: + + m_Dialog.GetControl( DXUTSETTINGSDLG_ADAPTER_FORMAT )->SetVisible( true ); + m_Dialog.GetControl( DXUTSETTINGSDLG_ADAPTER_FORMAT_LABEL )->SetVisible( true ); + m_Dialog.GetControl( DXUTSETTINGSDLG_RESOLUTION )->SetVisible( true ); + m_Dialog.GetControl( DXUTSETTINGSDLG_RESOLUTION_LABEL )->SetVisible( true ); + m_Dialog.GetControl( DXUTSETTINGSDLG_REFRESH_RATE )->SetVisible( true ); + m_Dialog.GetControl( DXUTSETTINGSDLG_REFRESH_RATE_LABEL )->SetVisible( true ); + m_Dialog.GetControl( DXUTSETTINGSDLG_BACK_BUFFER_FORMAT )->SetVisible( true ); + m_Dialog.GetControl( DXUTSETTINGSDLG_BACK_BUFFER_FORMAT_LABEL )->SetVisible( true ); + m_Dialog.GetControl( DXUTSETTINGSDLG_DEPTH_STENCIL )->SetVisible( true ); + m_Dialog.GetControl( DXUTSETTINGSDLG_DEPTH_STENCIL_LABEL )->SetVisible( true ); + m_Dialog.GetControl( DXUTSETTINGSDLG_MULTISAMPLE_TYPE )->SetVisible( true ); + m_Dialog.GetControl( DXUTSETTINGSDLG_MULTISAMPLE_TYPE_LABEL )->SetVisible( true ); + m_Dialog.GetControl( DXUTSETTINGSDLG_MULTISAMPLE_QUALITY )->SetVisible( true ); + m_Dialog.GetControl( DXUTSETTINGSDLG_MULTISAMPLE_QUALITY_LABEL )->SetVisible( true ); + m_Dialog.GetControl( DXUTSETTINGSDLG_VERTEX_PROCESSING )->SetVisible( true ); + m_Dialog.GetControl( DXUTSETTINGSDLG_VERTEX_PROCESSING_LABEL )->SetVisible( true ); + m_Dialog.GetControl( DXUTSETTINGSDLG_PRESENT_INTERVAL )->SetVisible( true ); + m_Dialog.GetControl( DXUTSETTINGSDLG_PRESENT_INTERVAL_LABEL )->SetVisible( true ); + m_Dialog.GetControl( DXUTSETTINGSDLG_DEVICECLIP )->SetVisible( true ); + + m_Dialog.GetControl( DXUTSETTINGSDLG_D3D11_FEATURE_LEVEL )->SetVisible( false ); + m_Dialog.GetControl( DXUTSETTINGSDLG_D3D11_FEATURE_LEVEL_LABEL )->SetVisible( false ); + m_Dialog.GetControl( DXUTSETTINGSDLG_D3D11_ADAPTER_OUTPUT )->SetVisible( false ); + m_Dialog.GetControl( DXUTSETTINGSDLG_D3D11_ADAPTER_OUTPUT_LABEL )->SetVisible( false ); + m_Dialog.GetControl( DXUTSETTINGSDLG_D3D11_RESOLUTION )->SetVisible( false ); + m_Dialog.GetControl( DXUTSETTINGSDLG_D3D11_RESOLUTION_LABEL )->SetVisible( false ); + m_Dialog.GetControl( DXUTSETTINGSDLG_D3D11_REFRESH_RATE )->SetVisible( false ); + m_Dialog.GetControl( DXUTSETTINGSDLG_D3D11_REFRESH_RATE_LABEL )->SetVisible( false ); + m_Dialog.GetControl( DXUTSETTINGSDLG_D3D11_BACK_BUFFER_FORMAT )->SetVisible( false ); + m_Dialog.GetControl( DXUTSETTINGSDLG_D3D11_BACK_BUFFER_FORMAT_LABEL )->SetVisible( false ); + m_Dialog.GetControl( DXUTSETTINGSDLG_D3D11_MULTISAMPLE_COUNT )->SetVisible( false ); + m_Dialog.GetControl( DXUTSETTINGSDLG_D3D11_MULTISAMPLE_COUNT_LABEL )->SetVisible( false ); + m_Dialog.GetControl( DXUTSETTINGSDLG_D3D11_MULTISAMPLE_QUALITY )->SetVisible( false ); + m_Dialog.GetControl( DXUTSETTINGSDLG_D3D11_MULTISAMPLE_QUALITY_LABEL )->SetVisible( false ); + m_Dialog.GetControl( DXUTSETTINGSDLG_D3D11_PRESENT_INTERVAL )->SetVisible( false ); + m_Dialog.GetControl( DXUTSETTINGSDLG_D3D11_PRESENT_INTERVAL_LABEL )->SetVisible( false ); + m_Dialog.GetControl( DXUTSETTINGSDLG_D3D11_DEBUG_DEVICE )->SetVisible( false ); + + break; + + case DXUT_D3D11_DEVICE: + m_Dialog.GetControl( DXUTSETTINGSDLG_ADAPTER_FORMAT )->SetVisible( false ); + m_Dialog.GetControl( DXUTSETTINGSDLG_ADAPTER_FORMAT_LABEL )->SetVisible( false ); + m_Dialog.GetControl( DXUTSETTINGSDLG_D3D11_FEATURE_LEVEL )->SetVisible( true ); + m_Dialog.GetControl( DXUTSETTINGSDLG_D3D11_FEATURE_LEVEL_LABEL )->SetVisible( true ); + m_Dialog.GetControl( DXUTSETTINGSDLG_RESOLUTION )->SetVisible( false ); + m_Dialog.GetControl( DXUTSETTINGSDLG_RESOLUTION_LABEL )->SetVisible( false ); + m_Dialog.GetControl( DXUTSETTINGSDLG_REFRESH_RATE )->SetVisible( false ); + m_Dialog.GetControl( DXUTSETTINGSDLG_REFRESH_RATE_LABEL )->SetVisible( false ); + m_Dialog.GetControl( DXUTSETTINGSDLG_BACK_BUFFER_FORMAT )->SetVisible( false ); + m_Dialog.GetControl( DXUTSETTINGSDLG_BACK_BUFFER_FORMAT_LABEL )->SetVisible( false ); + m_Dialog.GetControl( DXUTSETTINGSDLG_DEPTH_STENCIL )->SetVisible( false ); + m_Dialog.GetControl( DXUTSETTINGSDLG_DEPTH_STENCIL_LABEL )->SetVisible( false ); + m_Dialog.GetControl( DXUTSETTINGSDLG_MULTISAMPLE_TYPE )->SetVisible( false ); + m_Dialog.GetControl( DXUTSETTINGSDLG_MULTISAMPLE_TYPE_LABEL )->SetVisible( false ); + m_Dialog.GetControl( DXUTSETTINGSDLG_MULTISAMPLE_QUALITY )->SetVisible( false ); + m_Dialog.GetControl( DXUTSETTINGSDLG_MULTISAMPLE_QUALITY_LABEL )->SetVisible( false ); + m_Dialog.GetControl( DXUTSETTINGSDLG_VERTEX_PROCESSING )->SetVisible( false ); + m_Dialog.GetControl( DXUTSETTINGSDLG_VERTEX_PROCESSING_LABEL )->SetVisible( false ); + m_Dialog.GetControl( DXUTSETTINGSDLG_PRESENT_INTERVAL )->SetVisible( false ); + m_Dialog.GetControl( DXUTSETTINGSDLG_PRESENT_INTERVAL_LABEL )->SetVisible( false ); + m_Dialog.GetControl( DXUTSETTINGSDLG_DEVICECLIP )->SetVisible( false ); + + m_Dialog.GetControl( DXUTSETTINGSDLG_D3D11_ADAPTER_OUTPUT )->SetVisible( true ); + m_Dialog.GetControl( DXUTSETTINGSDLG_D3D11_ADAPTER_OUTPUT_LABEL )->SetVisible( true ); + m_Dialog.GetControl( DXUTSETTINGSDLG_D3D11_RESOLUTION )->SetVisible( true ); + m_Dialog.GetControl( DXUTSETTINGSDLG_D3D11_RESOLUTION_LABEL )->SetVisible( true ); + m_Dialog.GetControl( DXUTSETTINGSDLG_D3D11_REFRESH_RATE )->SetVisible( true ); + m_Dialog.GetControl( DXUTSETTINGSDLG_D3D11_REFRESH_RATE_LABEL )->SetVisible( true ); + m_Dialog.GetControl( DXUTSETTINGSDLG_D3D11_BACK_BUFFER_FORMAT )->SetVisible( true ); + m_Dialog.GetControl( DXUTSETTINGSDLG_D3D11_BACK_BUFFER_FORMAT_LABEL )->SetVisible( true ); + m_Dialog.GetControl( DXUTSETTINGSDLG_D3D11_MULTISAMPLE_COUNT )->SetVisible( true ); + m_Dialog.GetControl( DXUTSETTINGSDLG_D3D11_MULTISAMPLE_COUNT_LABEL )->SetVisible( true ); + m_Dialog.GetControl( DXUTSETTINGSDLG_D3D11_MULTISAMPLE_QUALITY )->SetVisible( true ); + m_Dialog.GetControl( DXUTSETTINGSDLG_D3D11_MULTISAMPLE_QUALITY_LABEL )->SetVisible( true ); + m_Dialog.GetControl( DXUTSETTINGSDLG_D3D11_PRESENT_INTERVAL )->SetVisible( true ); + m_Dialog.GetControl( DXUTSETTINGSDLG_D3D11_PRESENT_INTERVAL_LABEL )->SetVisible( true ); + m_Dialog.GetControl( DXUTSETTINGSDLG_D3D11_DEBUG_DEVICE )->SetVisible( true ); + break; + } +} + + +//-------------------------------------------------------------------------------------- +void WINAPI CD3DSettingsDlg::StaticOnEvent( UINT nEvent, int nControlID, + CDXUTControl* pControl, void* pUserData ) +{ + CD3DSettingsDlg* pD3DSettings = ( CD3DSettingsDlg* )pUserData; + if( pD3DSettings ) + pD3DSettings->OnEvent( nEvent, nControlID, pControl ); +} + +//-------------------------------------------------------------------------------------- +// Name: CD3DSettingsDlg::StaticOnModeChangeTimer() +// Desc: Timer callback registered by a call to DXUTSetTimer. It is called each second +// until mode change timeout limit. +//-------------------------------------------------------------------------------------- +void WINAPI CD3DSettingsDlg::StaticOnModeChangeTimer( UINT nIDEvent, void* pUserContext ) +{ + CD3DSettingsDlg* pD3DSettings = ( CD3DSettingsDlg* )pUserContext; + assert( pD3DSettings ); + assert( pD3DSettings->m_pActiveDialog == &pD3DSettings->m_RevertModeDialog ); + assert( pD3DSettings->m_nIDEvent == nIDEvent ); + + if( 0 == --pD3DSettings->m_nRevertModeTimeout ) + { + CDXUTControl* pControl = pD3DSettings->m_RevertModeDialog.GetControl( DXUTSETTINGSDLG_MODE_CHANGE_REVERT ); + assert( pControl ); + pD3DSettings->m_RevertModeDialog.SendEvent( EVENT_BUTTON_CLICKED, false, pControl ); + } + pD3DSettings->UpdateModeChangeTimeoutText( pD3DSettings->m_nRevertModeTimeout ); +} + +//-------------------------------------------------------------------------------------- +void CD3DSettingsDlg::OnEvent( UINT nEvent, int nControlID, + CDXUTControl* pControl ) +{ + switch( nControlID ) + { + case DXUTSETTINGSDLG_ADAPTER: + OnAdapterChanged(); break; + case DXUTSETTINGSDLG_DEVICE_TYPE: + OnDeviceTypeChanged(); break; + case DXUTSETTINGSDLG_WINDOWED: + OnWindowedFullScreenChanged(); break; + case DXUTSETTINGSDLG_FULLSCREEN: + OnWindowedFullScreenChanged(); break; + case DXUTSETTINGSDLG_ADAPTER_FORMAT: + OnAdapterFormatChanged(); break; + case DXUTSETTINGSDLG_RESOLUTION_SHOW_ALL: + { + if( g_DeviceSettings.ver == DXUT_D3D9_DEVICE ) + { + OnAdapterFormatChanged(); + } + else + { + OnBackBufferFormatChanged(); + } + break; + } + case DXUTSETTINGSDLG_D3D11_RESOLUTION: + OnD3D11ResolutionChanged(); break; + case DXUTSETTINGSDLG_RESOLUTION: + OnResolutionChanged(); break; + case DXUTSETTINGSDLG_REFRESH_RATE: + OnRefreshRateChanged(); break; + case DXUTSETTINGSDLG_BACK_BUFFER_FORMAT: + OnBackBufferFormatChanged(); break; + case DXUTSETTINGSDLG_DEPTH_STENCIL: + OnDepthStencilBufferFormatChanged(); break; + case DXUTSETTINGSDLG_MULTISAMPLE_TYPE: + OnMultisampleTypeChanged(); break; + case DXUTSETTINGSDLG_MULTISAMPLE_QUALITY: + OnMultisampleQualityChanged(); break; + case DXUTSETTINGSDLG_VERTEX_PROCESSING: + OnVertexProcessingChanged(); break; + case DXUTSETTINGSDLG_PRESENT_INTERVAL: + OnPresentIntervalChanged(); break; + case DXUTSETTINGSDLG_DEVICECLIP: + OnDeviceClipChanged(); break; + case DXUTSETTINGSDLG_API_VERSION: + OnAPIVersionChanged(); break; + case DXUTSETTINGSDLG_D3D11_FEATURE_LEVEL: + OnFeatureLevelChanged(); break; + case DXUTSETTINGSDLG_D3D11_ADAPTER_OUTPUT: + OnAdapterOutputChanged(); break; + case DXUTSETTINGSDLG_D3D11_REFRESH_RATE: + OnRefreshRateChanged(); break; + case DXUTSETTINGSDLG_D3D11_BACK_BUFFER_FORMAT: + OnBackBufferFormatChanged(); break; + case DXUTSETTINGSDLG_D3D11_MULTISAMPLE_COUNT: + OnMultisampleTypeChanged(); break; + case DXUTSETTINGSDLG_D3D11_MULTISAMPLE_QUALITY: + OnMultisampleQualityChanged(); break; + case DXUTSETTINGSDLG_D3D11_PRESENT_INTERVAL: + OnPresentIntervalChanged(); break; + case DXUTSETTINGSDLG_D3D11_DEBUG_DEVICE: + OnDebugDeviceChanged(); break; + + case DXUTSETTINGSDLG_OK: + { + bool bFullScreenModeChange = false; + DXUTDeviceSettings currentSettings = DXUTGetDeviceSettings(); + g_DeviceSettings.MinimumFeatureLevel = currentSettings.MinimumFeatureLevel; + if( g_DeviceSettings.ver == DXUT_D3D9_DEVICE ) + { + if( g_DeviceSettings.d3d9.pp.Windowed ) + { + g_DeviceSettings.d3d9.pp.FullScreen_RefreshRateInHz = 0; + + RECT rcClient; + if( DXUTIsWindowed() ) + GetClientRect( DXUTGetHWND(), &rcClient ); + else + rcClient = DXUTGetWindowClientRectAtModeChange(); + DWORD dwWindowWidth = rcClient.right - rcClient.left; + DWORD dwWindowHeight = rcClient.bottom - rcClient.top; + + g_DeviceSettings.d3d9.pp.BackBufferWidth = dwWindowWidth; + g_DeviceSettings.d3d9.pp.BackBufferHeight = dwWindowHeight; + } + else + { + // Check for fullscreen mode change + bFullScreenModeChange = g_DeviceSettings.d3d9.pp.BackBufferWidth != + currentSettings.d3d9.pp.BackBufferWidth || + g_DeviceSettings.d3d9.pp.BackBufferHeight != currentSettings.d3d9.pp.BackBufferHeight || + g_DeviceSettings.d3d9.pp.FullScreen_RefreshRateInHz != + currentSettings.d3d9.pp.FullScreen_RefreshRateInHz; + } + + if( g_DeviceSettings.d3d9.pp.MultiSampleType != D3DMULTISAMPLE_NONE ) + { + g_DeviceSettings.d3d9.pp.Flags &= ~D3DPRESENTFLAG_LOCKABLE_BACKBUFFER; + } + } + else // D3D11 + { + if( g_DeviceSettings.d3d11.sd.Windowed ) + { + g_DeviceSettings.d3d11.sd.BufferDesc.RefreshRate.Denominator = + g_DeviceSettings.d3d11.sd.BufferDesc.RefreshRate.Numerator = 0; + + RECT rcClient; + if( DXUTIsWindowed() ) + GetClientRect( DXUTGetHWND(), &rcClient ); + else + rcClient = DXUTGetWindowClientRectAtModeChange(); + DWORD dwWindowWidth = rcClient.right - rcClient.left; + DWORD dwWindowHeight = rcClient.bottom - rcClient.top; + + g_DeviceSettings.d3d11.sd.BufferDesc.Width = dwWindowWidth; + g_DeviceSettings.d3d11.sd.BufferDesc.Height = dwWindowHeight; + } + else + { + // Check for fullscreen mode change + bFullScreenModeChange = g_DeviceSettings.d3d11.sd.BufferDesc.Width != + currentSettings.d3d11.sd.BufferDesc.Width || + g_DeviceSettings.d3d11.sd.BufferDesc.Height != currentSettings.d3d11.sd.BufferDesc.Height || + g_DeviceSettings.d3d11.sd.BufferDesc.RefreshRate.Denominator != + currentSettings.d3d11.sd.BufferDesc.RefreshRate.Denominator || + g_DeviceSettings.d3d11.sd.BufferDesc.RefreshRate.Numerator != + currentSettings.d3d11.sd.BufferDesc.RefreshRate.Numerator; + } + } + + if( bFullScreenModeChange ) + { + // set appropriate global device settings to that of the current device + // settings. These will get set to the user-defined settings once the + // user accepts the mode change + DXUTDeviceSettings tSettings = g_DeviceSettings; + if( g_DeviceSettings.ver == DXUT_D3D9_DEVICE ) + { + g_DeviceSettings.d3d9.pp.BackBufferWidth = + currentSettings.d3d9.pp.BackBufferWidth; + g_DeviceSettings.d3d9.pp.BackBufferHeight = + currentSettings.d3d9.pp.BackBufferHeight; + g_DeviceSettings.d3d9.pp.FullScreen_RefreshRateInHz = + currentSettings.d3d9.pp.FullScreen_RefreshRateInHz; + g_DeviceSettings.d3d9.pp.Windowed = + currentSettings.d3d9.pp.Windowed; + } + else + { + + g_DeviceSettings.d3d11.sd.BufferDesc.Width = + currentSettings.d3d11.sd.BufferDesc.Width; + g_DeviceSettings.d3d11.sd.BufferDesc.Height = + currentSettings.d3d11.sd.BufferDesc.Height; + g_DeviceSettings.d3d11.sd.BufferDesc.RefreshRate.Denominator = + currentSettings.d3d11.sd.BufferDesc.RefreshRate.Denominator; + g_DeviceSettings.d3d11.sd.BufferDesc.RefreshRate.Numerator = + currentSettings.d3d11.sd.BufferDesc.RefreshRate.Numerator; + g_DeviceSettings.d3d11.sd.Windowed = currentSettings.d3d11.sd.Windowed; + + } + + // apply the user-defined settings + DXUTCreateDeviceFromSettings( &tSettings ); + // create the mode change timeout dialog + m_pActiveDialog = &m_RevertModeDialog; + m_nRevertModeTimeout = 15; + UpdateModeChangeTimeoutText( m_nRevertModeTimeout ); + // activate a timer for 1-second updates + DXUTSetTimer( StaticOnModeChangeTimer, 1.0f, &m_nIDEvent, ( void* )this ); + } + else + { + DXUTCreateDeviceFromSettings( &g_DeviceSettings ); + SetActive( false ); + } + break; + } + + case DXUTSETTINGSDLG_CANCEL: + { + SetActive( false ); + break; + } + + case DXUTSETTINGSDLG_MODE_CHANGE_ACCEPT: + { + DXUTKillTimer( m_nIDEvent ); + g_DeviceSettings = DXUTGetDeviceSettings(); + m_pActiveDialog = &m_Dialog; + SetActive( false ); + break; + } + + case DXUTSETTINGSDLG_MODE_CHANGE_REVERT: + { + DXUTKillTimer( m_nIDEvent ); + m_pActiveDialog = &m_Dialog; + m_nIDEvent = 0; + m_nRevertModeTimeout = 0; + DXUTCreateDeviceFromSettings( &g_DeviceSettings ); + Refresh(); + break; + } + } +} + + +//------------------------------------------------------------------------------------- +HRESULT CD3DSettingsDlg::SetDeviceSettingsFromUI() +{ + CDXUTComboBox* pComboBox; + CDXUTRadioButton* pRadioButton; + + // DXUTSETTINGSDLG_DEVICE_TYPE + pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_DEVICE_TYPE ); + g_DeviceSettings.d3d9.DeviceType = ( D3DDEVTYPE )PtrToUlong( pComboBox->GetSelectedData() ); + + // DXUTSETTINGSDLG_WINDOWED + pRadioButton = m_Dialog.GetRadioButton( DXUTSETTINGSDLG_WINDOWED ); + g_DeviceSettings.d3d9.pp.Windowed = pRadioButton->GetChecked(); + + // DXUTSETTINGSDLG_ADAPTER_FORMAT + pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_ADAPTER_FORMAT ); + g_DeviceSettings.d3d9.AdapterFormat = ( D3DFORMAT )PtrToUlong( pComboBox->GetSelectedData() ); + + if( g_DeviceSettings.d3d9.pp.Windowed ) + { + g_DeviceSettings.d3d9.pp.BackBufferFormat = D3DFMT_UNKNOWN; + g_DeviceSettings.d3d9.pp.FullScreen_RefreshRateInHz = 0; + } + else + { + // DXUTSETTINGSDLG_BACK_BUFFER_FORMAT + pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_BACK_BUFFER_FORMAT ); + g_DeviceSettings.d3d9.pp.BackBufferFormat = ( D3DFORMAT )PtrToUlong( pComboBox->GetSelectedData() ); + + // DXUTSETTINGSDLG_RESOLUTION + pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_RESOLUTION ); + DWORD dwResolution = PtrToUlong( pComboBox->GetSelectedData() ); + g_DeviceSettings.d3d9.pp.BackBufferWidth = HIWORD( dwResolution ); + g_DeviceSettings.d3d9.pp.BackBufferHeight = LOWORD( dwResolution ); + + // DXUTSETTINGSDLG_REFRESH_RATE + pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_REFRESH_RATE ); + g_DeviceSettings.d3d9.pp.FullScreen_RefreshRateInHz = PtrToUlong( pComboBox->GetSelectedData() ); + } + + // DXUTSETTINGSDLG_DEPTH_STENCIL + pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_DEPTH_STENCIL ); + g_DeviceSettings.d3d9.pp.AutoDepthStencilFormat = ( D3DFORMAT )PtrToUlong( pComboBox->GetSelectedData() ); + + return S_OK; +} + + +//------------------------------------------------------------------------------------- +CD3D9EnumAdapterInfo* CD3DSettingsDlg::GetCurrentAdapterInfo() +{ + CD3D9Enumeration* pD3DEnum = DXUTGetD3D9Enumeration(); + return pD3DEnum->GetAdapterInfo( g_DeviceSettings.d3d9.AdapterOrdinal ); +} + + +//------------------------------------------------------------------------------------- +CD3D9EnumDeviceInfo* CD3DSettingsDlg::GetCurrentDeviceInfo() +{ + CD3D9Enumeration* pD3DEnum = DXUTGetD3D9Enumeration(); + return pD3DEnum->GetDeviceInfo( g_DeviceSettings.d3d9.AdapterOrdinal, + g_DeviceSettings.d3d9.DeviceType ); +} + +//------------------------------------------------------------------------------------- +CD3D11EnumAdapterInfo* CD3DSettingsDlg::GetCurrentD3D11AdapterInfo() +{ + CD3D11Enumeration* pD3DEnum = DXUTGetD3D11Enumeration(); + return pD3DEnum->GetAdapterInfo( g_DeviceSettings.d3d11.AdapterOrdinal ); +} + + +//------------------------------------------------------------------------------------- +CD3D11EnumDeviceInfo* CD3DSettingsDlg::GetCurrentD3D11DeviceInfo() +{ + CD3D11Enumeration* pD3DEnum = DXUTGetD3D11Enumeration(); + return pD3DEnum->GetDeviceInfo( g_DeviceSettings.d3d11.AdapterOrdinal, + g_DeviceSettings.d3d11.DriverType ); +} + + +//------------------------------------------------------------------------------------- +CD3D11EnumOutputInfo* CD3DSettingsDlg::GetCurrentD3D11OutputInfo() +{ + CD3D11Enumeration* pD3DEnum = DXUTGetD3D11Enumeration(); + return pD3DEnum->GetOutputInfo( g_DeviceSettings.d3d11.AdapterOrdinal, + g_DeviceSettings.d3d11.Output ); +} + + +//------------------------------------------------------------------------------------- +CD3D9EnumDeviceSettingsCombo* CD3DSettingsDlg::GetCurrentDeviceSettingsCombo() +{ + CD3D9Enumeration* pD3DEnum = DXUTGetD3D9Enumeration(); + return pD3DEnum->GetDeviceSettingsCombo( g_DeviceSettings.d3d9.AdapterOrdinal, + g_DeviceSettings.d3d9.DeviceType, + g_DeviceSettings.d3d9.AdapterFormat, + g_DeviceSettings.d3d9.pp.BackBufferFormat, + ( g_DeviceSettings.d3d9.pp.Windowed == TRUE ) ); +} + +//------------------------------------------------------------------------------------- +CD3D11EnumDeviceSettingsCombo* CD3DSettingsDlg::GetCurrentD3D11DeviceSettingsCombo() +{ + CD3D11Enumeration* pD3DEnum = DXUTGetD3D11Enumeration(); + return pD3DEnum->GetDeviceSettingsCombo( g_DeviceSettings.d3d11.AdapterOrdinal, + g_DeviceSettings.d3d11.DriverType, + g_DeviceSettings.d3d11.Output, + g_DeviceSettings.d3d11.sd.BufferDesc.Format, + ( g_DeviceSettings.d3d11.sd.Windowed == TRUE ) ); +} + +HRESULT CD3DSettingsDlg::OnD3D11ResolutionChanged () { + DWORD dwWidth, dwHeight; + GetSelectedD3D11Resolution( &dwWidth, &dwHeight ); + g_DeviceSettings.d3d11.sd.BufferDesc.Width= dwWidth; + g_DeviceSettings.d3d11.sd.BufferDesc.Height = dwHeight; + + return S_OK; +} + +HRESULT CD3DSettingsDlg::OnFeatureLevelChanged () { + HRESULT hr = E_FAIL; + if (g_DeviceSettings.ver == DXUT_D3D11_DEVICE) { + if (g_DeviceSettings.d3d11.DeviceFeatureLevel == GetSelectedFeatureLevel()) return S_OK; + //if( !bRefresh ) + //{ + // Obtain a set of valid D3D10 device settings. + UINT CreateFlags = g_DeviceSettings.d3d11.CreateFlags; + ZeroMemory( &g_DeviceSettings, sizeof( g_DeviceSettings ) ); + + DXUTApplyDefaultDeviceSettings(&g_DeviceSettings); + g_DeviceSettings.d3d11.CreateFlags = CreateFlags; + g_DeviceSettings.ver = DXUT_D3D11_DEVICE; + //g_DeviceSettings.d3d11.fl = GetSelectedFeatureLevel(); + hr = DXUTSnapDeviceSettingsToEnumDevice(&g_DeviceSettings, true, GetSelectedFeatureLevel()); + + //} + + CD3D11Enumeration* pD3DEnum = DXUTGetD3D11Enumeration(); + CGrowableArray * pAdapterInfoList = pD3DEnum->GetAdapterInfoList(); + + CDXUTComboBox* pAdapterComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_ADAPTER ); + pAdapterComboBox->RemoveAllItems(); + + for( int iAdapter = 0; iAdapter < pAdapterInfoList->GetSize(); ++iAdapter ) + { + CD3D11EnumAdapterInfo* pAdapterInfo = pAdapterInfoList->GetAt( iAdapter ); + AddAdapter( pAdapterInfo->szUniqueDescription, pAdapterInfo->AdapterOrdinal ); + } + + pAdapterComboBox->SetSelectedByData( ULongToPtr( g_DeviceSettings.d3d11.AdapterOrdinal ) ); + + CDXUTCheckBox* pCheckBox = m_Dialog.GetCheckBox( DXUTSETTINGSDLG_D3D11_DEBUG_DEVICE ); + pCheckBox->SetChecked( 0 != ( g_DeviceSettings.d3d11.CreateFlags & D3D11_CREATE_DEVICE_DEBUG ) ); + + hr = OnAdapterChanged(); + if( FAILED( hr ) ) + return hr; + } + + return hr; +} + +//------------------------------------------------------------------------------------- +HRESULT CD3DSettingsDlg::OnAPIVersionChanged( bool bRefresh ) +{ + HRESULT hr; + + // Store the API version + g_DeviceSettings.ver = GetSelectedAPIVersion(); + + // Show/hide appropriate dialog controls based on version. + ShowControlSet( g_DeviceSettings.ver ); + + switch( g_DeviceSettings.ver ) + { + case DXUT_D3D9_DEVICE: + { + if( !bRefresh ) + { + // Obtain a set of valid D3D9 device settings. + UINT CreateFlags = g_DeviceSettings.d3d11.CreateFlags; + ZeroMemory( &g_DeviceSettings, sizeof( g_DeviceSettings ) ); + // We want a specific API version, so set up match option to preserve it. + DXUTApplyDefaultDeviceSettings(&g_DeviceSettings); + g_DeviceSettings.d3d11.CreateFlags = CreateFlags; + g_DeviceSettings.ver = DXUT_D3D9_DEVICE; + DXUTSnapDeviceSettingsToEnumDevice ( &g_DeviceSettings, true); + } + + CD3D9Enumeration* pD3DEnum = DXUTGetD3D9Enumeration(); + CGrowableArray * pAdapterInfoList = pD3DEnum->GetAdapterInfoList(); + + CDXUTComboBox* pAdapterComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_ADAPTER ); + pAdapterComboBox->RemoveAllItems(); + + for( int iAdapter = 0; iAdapter < pAdapterInfoList->GetSize(); ++iAdapter ) + { + CD3D9EnumAdapterInfo* pAdapterInfo = pAdapterInfoList->GetAt( iAdapter ); + AddAdapter( pAdapterInfo->szUniqueDescription, pAdapterInfo->AdapterOrdinal ); + } + + pAdapterComboBox->SetSelectedByData( ULongToPtr( g_DeviceSettings.d3d9.AdapterOrdinal ) ); + + hr = OnAdapterChanged(); + if( FAILED( hr ) ) + return hr; + + break; + } + + case DXUT_D3D11_DEVICE: + { + if( !bRefresh ) + { + // Obtain a set of valid D3D10 device settings. + UINT CreateFlags = g_DeviceSettings.d3d11.CreateFlags; + ZeroMemory( &g_DeviceSettings, sizeof( g_DeviceSettings ) ); + // We want a specific API version, so set up match option to preserve it. + DXUTApplyDefaultDeviceSettings(&g_DeviceSettings); + g_DeviceSettings.d3d11.CreateFlags = CreateFlags; + g_DeviceSettings.ver = DXUT_D3D11_DEVICE; + DXUTSnapDeviceSettingsToEnumDevice(&g_DeviceSettings, true); + + } + + CD3D11Enumeration* pD3DEnum = DXUTGetD3D11Enumeration(); + CGrowableArray * pAdapterInfoList = pD3DEnum->GetAdapterInfoList(); + + CDXUTComboBox* pAdapterComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_ADAPTER ); + pAdapterComboBox->RemoveAllItems(); + + for( int iAdapter = 0; iAdapter < pAdapterInfoList->GetSize(); ++iAdapter ) + { + CD3D11EnumAdapterInfo* pAdapterInfo = pAdapterInfoList->GetAt( iAdapter ); + AddAdapter( pAdapterInfo->szUniqueDescription, pAdapterInfo->AdapterOrdinal ); + } + + pAdapterComboBox->SetSelectedByData( ULongToPtr( g_DeviceSettings.d3d11.AdapterOrdinal ) ); + + CDXUTCheckBox* pCheckBox = m_Dialog.GetCheckBox( DXUTSETTINGSDLG_D3D11_DEBUG_DEVICE ); + pCheckBox->SetChecked( 0 != ( g_DeviceSettings.d3d11.CreateFlags & D3D11_CREATE_DEVICE_DEBUG ) ); + + hr = OnAdapterChanged(); + if( FAILED( hr ) ) + return hr; + + break; + } + } + + return S_OK; +} + + +//------------------------------------------------------------------------------------- +HRESULT CD3DSettingsDlg::OnAdapterChanged() +{ + HRESULT hr = S_OK; + + switch( g_DeviceSettings.ver ) + { + case DXUT_D3D9_DEVICE: + { + // Store the adapter index + g_DeviceSettings.d3d9.AdapterOrdinal = GetSelectedAdapter(); + + // DXUTSETTINGSDLG_DEVICE_TYPE + CDXUTComboBox* pDeviceTypeComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_DEVICE_TYPE ); + pDeviceTypeComboBox->RemoveAllItems(); + + CD3D9EnumAdapterInfo* pAdapterInfo = GetCurrentAdapterInfo(); + if( pAdapterInfo == NULL ) + return E_FAIL; + + for( int iDeviceInfo = 0; iDeviceInfo < pAdapterInfo->deviceInfoList.GetSize(); iDeviceInfo++ ) + { + CD3D9EnumDeviceInfo* pDeviceInfo = pAdapterInfo->deviceInfoList.GetAt( iDeviceInfo ); + AddDeviceType( pDeviceInfo->DeviceType ); + } + + pDeviceTypeComboBox->SetSelectedByData( ULongToPtr( g_DeviceSettings.d3d9.DeviceType ) ); + + hr = OnDeviceTypeChanged(); + if( FAILED( hr ) ) + return hr; + + break; + } + + case DXUT_D3D11_DEVICE: + { + // Store the adapter index + g_DeviceSettings.d3d11.AdapterOrdinal = GetSelectedAdapter(); + + // DXUTSETTINGSDLG_DEVICE_TYPE + CDXUTComboBox* pDeviceTypeComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_DEVICE_TYPE ); + pDeviceTypeComboBox->RemoveAllItems(); + + CD3D11EnumAdapterInfo* pAdapterInfo = GetCurrentD3D11AdapterInfo(); + if( pAdapterInfo == NULL ) + return E_FAIL; + + for( int iDeviceInfo = 0; iDeviceInfo < pAdapterInfo->deviceInfoList.GetSize(); iDeviceInfo++ ) + { + CD3D11EnumDeviceInfo* pDeviceInfo = pAdapterInfo->deviceInfoList.GetAt( iDeviceInfo ); + AddD3D11DeviceType( pDeviceInfo->DeviceType ); + } + + pDeviceTypeComboBox->SetSelectedByData( ULongToPtr( g_DeviceSettings.d3d11.DriverType ) ); + + hr = OnDeviceTypeChanged(); + if( FAILED( hr ) ) + return hr; + + break; + } + } + + return S_OK; +} + + + +//------------------------------------------------------------------------------------- +HRESULT CD3DSettingsDlg::OnDeviceTypeChanged() +{ + HRESULT hr = S_OK; + + switch( g_DeviceSettings.ver ) + { + case DXUT_D3D9_DEVICE: + { + g_DeviceSettings.d3d9.DeviceType = GetSelectedDeviceType(); + + // Update windowed/full screen radio buttons + bool bHasWindowedDeviceCombo = false; + bool bHasFullScreenDeviceCombo = false; + + CD3D9EnumDeviceInfo* pDeviceInfo = GetCurrentDeviceInfo(); + if( pDeviceInfo == NULL ) + return E_FAIL; + + for( int idc = 0; idc < pDeviceInfo->deviceSettingsComboList.GetSize(); idc++ ) + { + CD3D9EnumDeviceSettingsCombo* pDeviceSettingsCombo = pDeviceInfo->deviceSettingsComboList.GetAt( idc ); + + if( pDeviceSettingsCombo->Windowed ) + bHasWindowedDeviceCombo = true; + else + bHasFullScreenDeviceCombo = true; + } + + // DXUTSETTINGSDLG_WINDOWED, DXUTSETTINGSDLG_FULLSCREEN + m_Dialog.SetControlEnabled( DXUTSETTINGSDLG_WINDOWED, bHasWindowedDeviceCombo ); + m_Dialog.SetControlEnabled( DXUTSETTINGSDLG_FULLSCREEN, bHasFullScreenDeviceCombo ); + + SetWindowed( g_DeviceSettings.d3d9.pp.Windowed && bHasWindowedDeviceCombo ); + + hr = OnWindowedFullScreenChanged(); + if( FAILED( hr ) ) + return hr; + + break; + } + case DXUT_D3D11_DEVICE: + { + g_DeviceSettings.d3d11.DriverType = GetSelectedD3D11DeviceType(); + + // DXUTSETTINGSDLG_WINDOWED, DXUTSETTINGSDLG_FULLSCREEN + m_Dialog.SetControlEnabled( DXUTSETTINGSDLG_WINDOWED, true ); + m_Dialog.SetControlEnabled( DXUTSETTINGSDLG_FULLSCREEN, true ); + + SetWindowed( g_DeviceSettings.d3d11.sd.Windowed != 0 ); + + hr = OnWindowedFullScreenChanged(); + if( FAILED( hr ) ) + return hr; + + break; + } + } + + return S_OK; +} + + + +//------------------------------------------------------------------------------------- +HRESULT CD3DSettingsDlg::OnWindowedFullScreenChanged() +{ + HRESULT hr = S_OK; + bool bWindowed = IsWindowed(); + + m_Dialog.SetControlEnabled( DXUTSETTINGSDLG_ADAPTER_FORMAT_LABEL, !bWindowed ); + m_Dialog.SetControlEnabled( DXUTSETTINGSDLG_RESOLUTION_LABEL, !bWindowed ); + m_Dialog.SetControlEnabled( DXUTSETTINGSDLG_REFRESH_RATE_LABEL, !bWindowed ); + m_Dialog.SetControlEnabled( DXUTSETTINGSDLG_D3D11_ADAPTER_OUTPUT_LABEL, !bWindowed ); + m_Dialog.SetControlEnabled( DXUTSETTINGSDLG_D3D11_RESOLUTION_LABEL, !bWindowed ); + m_Dialog.SetControlEnabled( DXUTSETTINGSDLG_D3D11_REFRESH_RATE_LABEL, !bWindowed ); + + m_Dialog.SetControlEnabled( DXUTSETTINGSDLG_ADAPTER_FORMAT, !bWindowed ); + m_Dialog.SetControlEnabled( DXUTSETTINGSDLG_RESOLUTION, !bWindowed ); + m_Dialog.SetControlEnabled( DXUTSETTINGSDLG_RESOLUTION_SHOW_ALL, !bWindowed ); + m_Dialog.SetControlEnabled( DXUTSETTINGSDLG_REFRESH_RATE, !bWindowed ); + m_Dialog.SetControlEnabled( DXUTSETTINGSDLG_DEVICECLIP, bWindowed ); + m_Dialog.SetControlEnabled( DXUTSETTINGSDLG_D3D11_ADAPTER_OUTPUT, !bWindowed ); + m_Dialog.SetControlEnabled( DXUTSETTINGSDLG_D3D11_RESOLUTION, !bWindowed ); + m_Dialog.SetControlEnabled( DXUTSETTINGSDLG_D3D11_REFRESH_RATE, !bWindowed ); + + switch( g_DeviceSettings.ver ) + { + case DXUT_D3D9_DEVICE: + { + g_DeviceSettings.d3d9.pp.Windowed = bWindowed; + bool bDeviceClip = ( 0x0 != ( g_DeviceSettings.d3d9.pp.Flags & D3DPRESENTFLAG_DEVICECLIP ) ); + + // If windowed, get the appropriate adapter format from Direct3D + if( g_DeviceSettings.d3d9.pp.Windowed ) + { + IDirect3D9* pD3D = DXUTGetD3D9Object(); + if( pD3D == NULL ) + return DXTRACE_ERR( L"DXUTGetD3DObject", E_FAIL ); + + D3DDISPLAYMODE mode; + hr = pD3D->GetAdapterDisplayMode( g_DeviceSettings.d3d9.AdapterOrdinal, &mode ); + if( FAILED( hr ) ) + return DXTRACE_ERR( L"GetAdapterDisplayMode", hr ); + + // Default resolution to the fullscreen res that was last used + RECT rc = DXUTGetFullsceenClientRectAtModeChange(); + if( rc.right == 0 || rc.bottom == 0 ) + { + // If nothing last used, then default to the adapter desktop res + g_DeviceSettings.d3d9.pp.BackBufferWidth = mode.Width; + g_DeviceSettings.d3d9.pp.BackBufferHeight = mode.Height; + } + else + { + g_DeviceSettings.d3d9.pp.BackBufferWidth = rc.right; + g_DeviceSettings.d3d9.pp.BackBufferHeight = rc.bottom; + } + + g_DeviceSettings.d3d9.AdapterFormat = mode.Format; + g_DeviceSettings.d3d9.pp.FullScreen_RefreshRateInHz = mode.RefreshRate; + } + + const D3DFORMAT adapterFormat = g_DeviceSettings.d3d9.AdapterFormat; + const DWORD dwWidth = g_DeviceSettings.d3d9.pp.BackBufferWidth; + const DWORD dwHeight = g_DeviceSettings.d3d9.pp.BackBufferHeight; + const DWORD dwRefreshRate = g_DeviceSettings.d3d9.pp.FullScreen_RefreshRateInHz; + + // DXUTSETTINGSDLG_DEVICECLIP + SetDeviceClip( bDeviceClip ); + + // DXUTSETTINGSDLG_ADAPTER_FORMAT + CDXUTComboBox* pAdapterFormatComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_ADAPTER_FORMAT ); + if( pAdapterFormatComboBox == NULL ) + return E_FAIL; + pAdapterFormatComboBox->RemoveAllItems(); + + CD3D9EnumDeviceInfo* pDeviceInfo = GetCurrentDeviceInfo(); + if( pDeviceInfo == NULL ) + return E_FAIL; + + if( bWindowed ) + { + AddAdapterFormat( adapterFormat ); + } + else + { + for( int iSettingsCombo = 0; iSettingsCombo < pDeviceInfo->deviceSettingsComboList.GetSize(); + iSettingsCombo++ ) + { + CD3D9EnumDeviceSettingsCombo* pSettingsCombo = pDeviceInfo->deviceSettingsComboList.GetAt( + iSettingsCombo ); + AddAdapterFormat( pSettingsCombo->AdapterFormat ); + } + } + + pAdapterFormatComboBox->SetSelectedByData( ULongToPtr( adapterFormat ) ); + + hr = OnAdapterFormatChanged(); + if( FAILED( hr ) ) + return hr; + + // DXUTSETTINGSDLG_RESOLUTION + CDXUTComboBox* pResolutionComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_RESOLUTION ); + + if( bWindowed ) + { + pResolutionComboBox->RemoveAllItems(); + AddResolution( dwWidth, dwHeight ); + } + + pResolutionComboBox->SetSelectedByData( ULongToPtr( MAKELONG( dwWidth, dwHeight ) ) ); + + hr = OnResolutionChanged(); + if( FAILED( hr ) ) + return hr; + + // DXUTSETTINGSDLG_REFRESH_RATE + CDXUTComboBox* pRefreshRateComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_REFRESH_RATE ); + + if( bWindowed ) + { + pRefreshRateComboBox->RemoveAllItems(); + AddRefreshRate( dwRefreshRate ); + } + + pRefreshRateComboBox->SetSelectedByData( ULongToPtr( dwRefreshRate ) ); + + hr = OnRefreshRateChanged(); + if( FAILED( hr ) ) + return hr; + + break; + } + + case DXUT_D3D11_DEVICE: + { + g_DeviceSettings.d3d11.sd.Windowed = bWindowed; + + // Get available adapter output + CD3D11Enumeration* pD3DEnum = DXUTGetD3D11Enumeration(); + + CDXUTComboBox* pOutputComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_D3D11_ADAPTER_OUTPUT ); + pOutputComboBox->RemoveAllItems(); + + CD3D11EnumAdapterInfo* pAdapterInfo = pD3DEnum->GetAdapterInfo( g_DeviceSettings.d3d11.AdapterOrdinal ); + for( int ioutput = 0; ioutput < pAdapterInfo->outputInfoList.GetSize(); ++ioutput ) + { + CD3D11EnumOutputInfo* pOutputInfo = pAdapterInfo->outputInfoList.GetAt( ioutput ); + AddD3D11AdapterOutput( pOutputInfo->Desc.DeviceName, pOutputInfo->Output ); + } + + pOutputComboBox->SetSelectedByData( ULongToPtr( g_DeviceSettings.d3d11.Output ) ); + + hr = OnAdapterOutputChanged(); + if( FAILED( hr ) ) + return hr; + + break; + } + } + + return S_OK; +} + + +//------------------------------------------------------------------------------------- +HRESULT CD3DSettingsDlg::OnAdapterOutputChanged() +{ + HRESULT hr; + + switch( g_DeviceSettings.ver ) + { + case DXUT_D3D11_DEVICE: + { + bool bWindowed = IsWindowed(); + g_DeviceSettings.d3d11.sd.Windowed = bWindowed; + + // If windowed, get the appropriate adapter format from Direct3D + if( g_DeviceSettings.d3d11.sd.Windowed ) + { + DXGI_MODE_DESC mode; + hr = DXUTGetD3D11AdapterDisplayMode( g_DeviceSettings.d3d11.AdapterOrdinal, + g_DeviceSettings.d3d11.Output, &mode ); + if( FAILED( hr ) ) + return DXTRACE_ERR( L"GetD3D11AdapterDisplayMode", hr ); + + // Default resolution to the fullscreen res that was last used + RECT rc = DXUTGetFullsceenClientRectAtModeChange(); + if( rc.right == 0 || rc.bottom == 0 ) + { + // If nothing last used, then default to the adapter desktop res + g_DeviceSettings.d3d11.sd.BufferDesc.Width = mode.Width; + g_DeviceSettings.d3d11.sd.BufferDesc.Height = mode.Height; + } + else + { + g_DeviceSettings.d3d11.sd.BufferDesc.Width = rc.right; + g_DeviceSettings.d3d11.sd.BufferDesc.Height = rc.bottom; + } + + g_DeviceSettings.d3d11.sd.BufferDesc.RefreshRate = mode.RefreshRate; + } + + const DXGI_RATIONAL RefreshRate = g_DeviceSettings.d3d11.sd.BufferDesc.RefreshRate; + + CD3D11EnumAdapterInfo* pAdapterInfo = GetCurrentD3D11AdapterInfo(); + if( pAdapterInfo == NULL ) + return E_FAIL; + + // DXUTSETTINGSDLG_D3D11_RESOLUTION + hr = UpdateD3D11Resolutions(); + if( FAILED( hr ) ) + return hr; + + // DXUTSETTINGSDLG_D3D11_BACK_BUFFER_FORMAT + CDXUTComboBox* pBackBufferFormatComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_D3D11_BACK_BUFFER_FORMAT + ); + pBackBufferFormatComboBox->RemoveAllItems(); + + for( int idc = 0; idc < pAdapterInfo->deviceSettingsComboList.GetSize(); idc++ ) + { + CD3D11EnumDeviceSettingsCombo* pDeviceCombo = pAdapterInfo->deviceSettingsComboList.GetAt( idc ); + if( ( pDeviceCombo->Windowed == TRUE ) == bWindowed ) + { + AddD3D11BackBufferFormat( pDeviceCombo->BackBufferFormat ); + } + } + + pBackBufferFormatComboBox->SetSelectedByData( ULongToPtr( g_DeviceSettings.d3d11.sd.BufferDesc.Format ) ); + + hr = OnBackBufferFormatChanged(); + if( FAILED( hr ) ) + return hr; + + // DXUTSETTINGSDLG_D3D11_REFRESH_RATE + if( bWindowed ) + { + CDXUTComboBox* pRefreshRateComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_D3D11_REFRESH_RATE ); + for( UINT i = 0; i < pRefreshRateComboBox->GetNumItems(); ++i ) + { + DXGI_RATIONAL* pRefreshRate = reinterpret_cast( + pRefreshRateComboBox->GetItemData( i ) ); + delete pRefreshRate; + } + pRefreshRateComboBox->RemoveAllItems(); + AddD3D11RefreshRate( RefreshRate ); + } + + SetSelectedD3D11RefreshRate( RefreshRate ); + break; + } + }; + + hr = OnRefreshRateChanged(); + if( FAILED( hr ) ) + return hr; + + return S_OK; +} + + +//------------------------------------------------------------------------------------- +HRESULT CD3DSettingsDlg::OnAdapterFormatChanged() +{ + HRESULT hr = S_OK; + + switch( g_DeviceSettings.ver ) + { + case DXUT_D3D9_DEVICE: + { + // DXUTSETTINGSDLG_ADAPTER_FORMAT + D3DFORMAT adapterFormat = GetSelectedAdapterFormat(); + g_DeviceSettings.d3d9.AdapterFormat = adapterFormat; + + // DXUTSETTINGSDLG_RESOLUTION + CDXUTComboBox* pResolutionComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_RESOLUTION ); + pResolutionComboBox->RemoveAllItems(); + + CD3D9EnumAdapterInfo* pAdapterInfo = GetCurrentAdapterInfo(); + if( pAdapterInfo == NULL ) + return E_FAIL; + + bool bShowAll = m_Dialog.GetCheckBox( DXUTSETTINGSDLG_RESOLUTION_SHOW_ALL )->GetChecked(); + + // Get the desktop aspect ratio + D3DDISPLAYMODE dmDesktop; + DXUTGetDesktopResolution( g_DeviceSettings.d3d9.AdapterOrdinal, &dmDesktop.Width, &dmDesktop.Height ); + float fDesktopAspectRatio = dmDesktop.Width / ( float )dmDesktop.Height; + + for( int idm = 0; idm < pAdapterInfo->displayModeList.GetSize(); idm++ ) + { + D3DDISPLAYMODE DisplayMode = pAdapterInfo->displayModeList.GetAt( idm ); + float fAspect = ( float )DisplayMode.Width / ( float )DisplayMode.Height; + + if( DisplayMode.Format == g_DeviceSettings.d3d9.AdapterFormat ) + { + // If "Show All" is not checked, then hide all resolutions + // that don't match the aspect ratio of the desktop resolution + if( bShowAll || ( !bShowAll && fabsf( fDesktopAspectRatio - fAspect ) < 0.05f ) ) + { + AddResolution( DisplayMode.Width, DisplayMode.Height ); + } + } + } + + const DWORD dwCurResolution = MAKELONG( g_DeviceSettings.d3d9.pp.BackBufferWidth, + g_DeviceSettings.d3d9.pp.BackBufferHeight ); + + pResolutionComboBox->SetSelectedByData( ULongToPtr( dwCurResolution ) ); + + hr = OnResolutionChanged(); + if( FAILED( hr ) ) + return hr; + + // DXUTSETTINGSDLG_BACK_BUFFER_FORMAT + CDXUTComboBox* pBackBufferFormatComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_BACK_BUFFER_FORMAT ); + pBackBufferFormatComboBox->RemoveAllItems(); + + CD3D9EnumDeviceInfo* pDeviceInfo = GetCurrentDeviceInfo(); + if( pDeviceInfo == NULL ) + return E_FAIL; + + const BOOL bWindowed = IsWindowed(); + bool bHasWindowedBackBuffer = false; + + for( int idc = 0; idc < pDeviceInfo->deviceSettingsComboList.GetSize(); idc++ ) + { + CD3D9EnumDeviceSettingsCombo* pDeviceCombo = pDeviceInfo->deviceSettingsComboList.GetAt( idc ); + if( pDeviceCombo->Windowed == bWindowed && + pDeviceCombo->AdapterFormat == g_DeviceSettings.d3d9.AdapterFormat ) + { + AddBackBufferFormat( pDeviceCombo->BackBufferFormat ); + bHasWindowedBackBuffer = true; + } + } + + pBackBufferFormatComboBox->SetSelectedByData( ULongToPtr( g_DeviceSettings.d3d9.pp.BackBufferFormat ) ); + + hr = OnBackBufferFormatChanged(); + if( FAILED( hr ) ) + return hr; + + if( !bHasWindowedBackBuffer ) + { + m_Dialog.SetControlEnabled( DXUTSETTINGSDLG_WINDOWED, false ); + + if( g_DeviceSettings.d3d9.pp.Windowed ) + { + SetWindowed( false ); + + hr = OnWindowedFullScreenChanged(); + if( FAILED( hr ) ) + return hr; + } + } + + break; + } + } + + return S_OK; +} + + +//------------------------------------------------------------------------------------- +HRESULT CD3DSettingsDlg::OnResolutionChanged() +{ + HRESULT hr = S_OK; + + CD3D9EnumAdapterInfo* pAdapterInfo = GetCurrentAdapterInfo(); + if( pAdapterInfo == NULL ) + return E_FAIL; + + // Set resolution + DWORD dwWidth, dwHeight; + GetSelectedResolution( &dwWidth, &dwHeight ); + g_DeviceSettings.d3d9.pp.BackBufferWidth = dwWidth; + g_DeviceSettings.d3d9.pp.BackBufferHeight = dwHeight; + + DWORD dwRefreshRate = g_DeviceSettings.d3d9.pp.FullScreen_RefreshRateInHz; + + // Update the refresh rate list + CDXUTComboBox* pRefreshRateComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_REFRESH_RATE ); + pRefreshRateComboBox->RemoveAllItems(); + + D3DFORMAT adapterFormat = g_DeviceSettings.d3d9.AdapterFormat; + for( int idm = 0; idm < pAdapterInfo->displayModeList.GetSize(); idm++ ) + { + D3DDISPLAYMODE displayMode = pAdapterInfo->displayModeList.GetAt( idm ); + + if( displayMode.Format == adapterFormat && + displayMode.Width == dwWidth && + displayMode.Height == dwHeight ) + { + AddRefreshRate( displayMode.RefreshRate ); + } + } + + pRefreshRateComboBox->SetSelectedByData( ULongToPtr( dwRefreshRate ) ); + + hr = OnRefreshRateChanged(); + if( FAILED( hr ) ) + return hr; + + return S_OK; +} + + + +//------------------------------------------------------------------------------------- +HRESULT CD3DSettingsDlg::OnRefreshRateChanged() +{ + // Set refresh rate + switch( g_DeviceSettings.ver ) + { + case DXUT_D3D9_DEVICE: + g_DeviceSettings.d3d9.pp.FullScreen_RefreshRateInHz = GetSelectedRefreshRate(); + break; + + case DXUT_D3D11_DEVICE: + g_DeviceSettings.d3d11.sd.BufferDesc.RefreshRate = GetSelectedD3D11RefreshRate(); + break; + } + + return S_OK; +} + + +//------------------------------------------------------------------------------------- +HRESULT CD3DSettingsDlg::OnBackBufferFormatChanged() +{ + HRESULT hr = S_OK; + + switch( g_DeviceSettings.ver ) + { + case DXUT_D3D9_DEVICE: + { + g_DeviceSettings.d3d9.pp.BackBufferFormat = GetSelectedBackBufferFormat(); + + D3DFORMAT adapterFormat = g_DeviceSettings.d3d9.AdapterFormat; + D3DFORMAT backBufferFormat = g_DeviceSettings.d3d9.pp.BackBufferFormat; + + CD3D9EnumDeviceInfo* pDeviceInfo = GetCurrentDeviceInfo(); + if( pDeviceInfo == NULL ) + return E_FAIL; + + bool bAllowSoftwareVP, bAllowHardwareVP, bAllowPureHardwareVP, bAllowMixedVP; + DXUTGetD3D9Enumeration()->GetPossibleVertexProcessingList( &bAllowSoftwareVP, &bAllowHardwareVP, + &bAllowPureHardwareVP, &bAllowMixedVP ); + + for( int idc = 0; idc < pDeviceInfo->deviceSettingsComboList.GetSize(); idc++ ) + { + CD3D9EnumDeviceSettingsCombo* pDeviceCombo = pDeviceInfo->deviceSettingsComboList.GetAt( idc ); + + if( pDeviceCombo->Windowed == ( g_DeviceSettings.d3d9.pp.Windowed == TRUE ) && + pDeviceCombo->AdapterFormat == adapterFormat && + pDeviceCombo->BackBufferFormat == backBufferFormat ) + { + CDXUTComboBox* pDepthStencilComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_DEPTH_STENCIL ); + pDepthStencilComboBox->RemoveAllItems(); + pDepthStencilComboBox->SetEnabled( ( g_DeviceSettings.d3d9.pp.EnableAutoDepthStencil == TRUE ) ); + + if( g_DeviceSettings.d3d9.pp.EnableAutoDepthStencil ) + { + for( int ifmt = 0; ifmt < pDeviceCombo->depthStencilFormatList.GetSize(); ifmt++ ) + { + D3DFORMAT fmt = pDeviceCombo->depthStencilFormatList.GetAt( ifmt ); + + AddDepthStencilBufferFormat( fmt ); + } + + pDepthStencilComboBox->SetSelectedByData( ULongToPtr( + g_DeviceSettings.d3d9.pp.AutoDepthStencilFormat ) ); + } + else + { + if( !pDepthStencilComboBox->ContainsItem( L"(not used)" ) ) + pDepthStencilComboBox->AddItem( L"(not used)", NULL ); + } + + hr = OnDepthStencilBufferFormatChanged(); + if( FAILED( hr ) ) + return hr; + + CDXUTComboBox* pVertexProcessingComboBox = + m_Dialog.GetComboBox( DXUTSETTINGSDLG_VERTEX_PROCESSING ); + pVertexProcessingComboBox->RemoveAllItems(); + + // Add valid vertex processing types + if( bAllowSoftwareVP ) + AddVertexProcessingType( D3DCREATE_SOFTWARE_VERTEXPROCESSING ); + + if( bAllowHardwareVP && pDeviceInfo->Caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT ) + AddVertexProcessingType( D3DCREATE_HARDWARE_VERTEXPROCESSING ); + + if( bAllowPureHardwareVP && pDeviceInfo->Caps.DevCaps & D3DDEVCAPS_PUREDEVICE ) + AddVertexProcessingType( D3DCREATE_PUREDEVICE ); + + if( bAllowMixedVP && pDeviceInfo->Caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT ) + AddVertexProcessingType( D3DCREATE_MIXED_VERTEXPROCESSING ); + + if( g_DeviceSettings.d3d9.BehaviorFlags & D3DCREATE_PUREDEVICE ) + pVertexProcessingComboBox->SetSelectedByData( ULongToPtr( D3DCREATE_PUREDEVICE ) ); + else if( g_DeviceSettings.d3d9.BehaviorFlags & D3DCREATE_SOFTWARE_VERTEXPROCESSING ) + pVertexProcessingComboBox->SetSelectedByData( ULongToPtr( + D3DCREATE_SOFTWARE_VERTEXPROCESSING ) ); + else if( g_DeviceSettings.d3d9.BehaviorFlags & D3DCREATE_HARDWARE_VERTEXPROCESSING ) + pVertexProcessingComboBox->SetSelectedByData( ULongToPtr( + D3DCREATE_HARDWARE_VERTEXPROCESSING ) ); + else if( g_DeviceSettings.d3d9.BehaviorFlags & D3DCREATE_MIXED_VERTEXPROCESSING ) + pVertexProcessingComboBox->SetSelectedByData( ULongToPtr( D3DCREATE_MIXED_VERTEXPROCESSING ) ); + + hr = OnVertexProcessingChanged(); + if( FAILED( hr ) ) + return hr; + + CDXUTComboBox* pPresentIntervalComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_PRESENT_INTERVAL ); + pPresentIntervalComboBox->RemoveAllItems(); + pPresentIntervalComboBox->AddItem( L"On", ULongToPtr( D3DPRESENT_INTERVAL_DEFAULT ) ); + pPresentIntervalComboBox->AddItem( L"Off", ULongToPtr( D3DPRESENT_INTERVAL_IMMEDIATE ) ); + + pPresentIntervalComboBox->SetSelectedByData( ULongToPtr( + g_DeviceSettings.d3d9.pp.PresentationInterval ) ); + + hr = OnPresentIntervalChanged(); + if( FAILED( hr ) ) + return hr; + } + } + + break; + } + + case DXUT_D3D11_DEVICE: + { + g_DeviceSettings.d3d11.sd.BufferDesc.Format = GetSelectedD3D11BackBufferFormat(); + + DXGI_FORMAT backBufferFormat = g_DeviceSettings.d3d11.sd.BufferDesc.Format; + + CD3D11EnumAdapterInfo* pAdapterInfo = GetCurrentD3D11AdapterInfo(); + if( pAdapterInfo == NULL ) + return E_FAIL; + + for( int idc = 0; idc < pAdapterInfo->deviceSettingsComboList.GetSize(); idc++ ) + { + CD3D11EnumDeviceSettingsCombo* pDeviceCombo = pAdapterInfo->deviceSettingsComboList.GetAt( idc ); + + if( pDeviceCombo->Windowed == ( g_DeviceSettings.d3d11.sd.Windowed == TRUE ) && + pDeviceCombo->BackBufferFormat == backBufferFormat && + pDeviceCombo->DeviceType == g_DeviceSettings.d3d11.DriverType ) + { + CDXUTComboBox* pMultisampleCountCombo = m_Dialog.GetComboBox( DXUTSETTINGSDLG_D3D11_MULTISAMPLE_COUNT + ); + pMultisampleCountCombo->RemoveAllItems(); + for( int i = 0; i < pDeviceCombo->multiSampleCountList.GetSize(); ++i ) + AddD3D11MultisampleCount( pDeviceCombo->multiSampleCountList.GetAt( i ) ); + pMultisampleCountCombo->SetSelectedByData( ULongToPtr( + g_DeviceSettings.d3d11.sd.SampleDesc.Count ) ); + + hr = OnMultisampleTypeChanged(); + if( FAILED( hr ) ) + return hr; + + CDXUTComboBox* pPresentIntervalComboBox = + m_Dialog.GetComboBox( DXUTSETTINGSDLG_D3D11_PRESENT_INTERVAL ); + pPresentIntervalComboBox->RemoveAllItems(); + pPresentIntervalComboBox->AddItem( L"On", ULongToPtr( 1 ) ); + pPresentIntervalComboBox->AddItem( L"Off", ULongToPtr( 0 ) ); + + pPresentIntervalComboBox->SetSelectedByData( ULongToPtr( g_DeviceSettings.d3d11.SyncInterval ) ); + + hr = OnPresentIntervalChanged(); + if( FAILED( hr ) ) + return hr; + + hr = UpdateD3D11Resolutions(); + if( FAILED( hr ) ) + return hr; + } + } + + break; + } + } + + return S_OK; +} + + +//------------------------------------------------------------------------------------- +HRESULT CD3DSettingsDlg::OnDepthStencilBufferFormatChanged() +{ + HRESULT hr = S_OK; + + D3DFORMAT depthStencilBufferFormat = GetSelectedDepthStencilBufferFormat(); + + if( g_DeviceSettings.d3d9.pp.EnableAutoDepthStencil ) + g_DeviceSettings.d3d9.pp.AutoDepthStencilFormat = depthStencilBufferFormat; + + CD3D9EnumDeviceSettingsCombo* pDeviceSettingsCombo = GetCurrentDeviceSettingsCombo(); + if( pDeviceSettingsCombo == NULL ) + return E_FAIL; + + CDXUTComboBox* pMultisampleTypeCombo = m_Dialog.GetComboBox( DXUTSETTINGSDLG_MULTISAMPLE_TYPE ); + pMultisampleTypeCombo->RemoveAllItems(); + + for( int ims = 0; ims < pDeviceSettingsCombo->multiSampleTypeList.GetSize(); ims++ ) + { + D3DMULTISAMPLE_TYPE msType = pDeviceSettingsCombo->multiSampleTypeList.GetAt( ims ); + + bool bConflictFound = false; + for( int iConf = 0; iConf < pDeviceSettingsCombo->DSMSConflictList.GetSize(); iConf++ ) + { + CD3D9EnumDSMSConflict DSMSConf = pDeviceSettingsCombo->DSMSConflictList.GetAt( iConf ); + if( DSMSConf.DSFormat == depthStencilBufferFormat && + DSMSConf.MSType == msType ) + { + bConflictFound = true; + break; + } + } + + if( !bConflictFound ) + AddMultisampleType( msType ); + } + + CDXUTComboBox* pMultisampleQualityCombo = m_Dialog.GetComboBox( DXUTSETTINGSDLG_MULTISAMPLE_TYPE ); + pMultisampleQualityCombo->SetSelectedByData( ULongToPtr( g_DeviceSettings.d3d9.pp.MultiSampleType ) ); + + hr = OnMultisampleTypeChanged(); + if( FAILED( hr ) ) + return hr; + + return S_OK; +} + + +//------------------------------------------------------------------------------------- +HRESULT CD3DSettingsDlg::OnMultisampleTypeChanged() +{ + HRESULT hr = S_OK; + + switch( g_DeviceSettings.ver ) + { + case DXUT_D3D9_DEVICE: + { + D3DMULTISAMPLE_TYPE multisampleType = GetSelectedMultisampleType(); + g_DeviceSettings.d3d9.pp.MultiSampleType = multisampleType; + + CD3D9EnumDeviceSettingsCombo* pDeviceSettingsCombo = GetCurrentDeviceSettingsCombo(); + if( pDeviceSettingsCombo == NULL ) + return E_FAIL; + + DWORD dwMaxQuality = 0; + for( int iType = 0; iType < pDeviceSettingsCombo->multiSampleTypeList.GetSize(); iType++ ) + { + D3DMULTISAMPLE_TYPE msType = pDeviceSettingsCombo->multiSampleTypeList.GetAt( iType ); + if( msType == multisampleType ) + { + dwMaxQuality = pDeviceSettingsCombo->multiSampleQualityList.GetAt( iType ); + break; + } + } + + // DXUTSETTINGSDLG_MULTISAMPLE_QUALITY + CDXUTComboBox* pMultisampleQualityCombo = m_Dialog.GetComboBox( DXUTSETTINGSDLG_MULTISAMPLE_QUALITY ); + pMultisampleQualityCombo->RemoveAllItems(); + + for( UINT iQuality = 0; iQuality < dwMaxQuality; iQuality++ ) + { + AddMultisampleQuality( iQuality ); + } + + pMultisampleQualityCombo->SetSelectedByData( ULongToPtr( g_DeviceSettings.d3d9.pp.MultiSampleQuality ) ); + + hr = OnMultisampleQualityChanged(); + if( FAILED( hr ) ) + return hr; + + break; + } + case DXUT_D3D11_DEVICE: + { + UINT multisampleCount = GetSelectedD3D11MultisampleCount(); + g_DeviceSettings.d3d11.sd.SampleDesc.Count = multisampleCount; + + CD3D11EnumDeviceSettingsCombo* pDeviceSettingsCombo = GetCurrentD3D11DeviceSettingsCombo(); + if( pDeviceSettingsCombo == NULL ) + return E_FAIL; + + UINT MaxQuality = 0; + for( int iCount = 0; iCount < pDeviceSettingsCombo->multiSampleCountList.GetSize(); iCount++ ) + { + UINT Count = pDeviceSettingsCombo->multiSampleCountList.GetAt( iCount ); + if( Count == multisampleCount ) + { + MaxQuality = pDeviceSettingsCombo->multiSampleQualityList.GetAt( iCount ); + break; + } + } + + // DXUTSETTINGSDLG_D3D11_MULTISAMPLE_QUALITY + CDXUTComboBox* pMultisampleQualityCombo = m_Dialog.GetComboBox( DXUTSETTINGSDLG_D3D11_MULTISAMPLE_QUALITY + ); + pMultisampleQualityCombo->RemoveAllItems(); + + for( UINT iQuality = 0; iQuality < MaxQuality; iQuality++ ) + { + AddD3D11MultisampleQuality( iQuality ); + } + + pMultisampleQualityCombo->SetSelectedByData( ULongToPtr( g_DeviceSettings.d3d11.sd.SampleDesc.Quality ) ); + + hr = OnMultisampleQualityChanged(); + if( FAILED( hr ) ) + return hr; + + break; + } + } + + return S_OK; +} + + +//------------------------------------------------------------------------------------- +HRESULT CD3DSettingsDlg::OnMultisampleQualityChanged() +{ + switch( g_DeviceSettings.ver ) + { + case DXUT_D3D9_DEVICE: + g_DeviceSettings.d3d9.pp.MultiSampleQuality = GetSelectedMultisampleQuality(); + break; + + case DXUT_D3D11_DEVICE: + g_DeviceSettings.d3d11.sd.SampleDesc.Quality = GetSelectedD3D11MultisampleQuality(); + break; + } + + return S_OK; +} + + +//------------------------------------------------------------------------------------- +HRESULT CD3DSettingsDlg::OnVertexProcessingChanged() +{ + DWORD dwBehavior = g_DeviceSettings.d3d9.BehaviorFlags; + + // Clear vertex processing flags + dwBehavior &= ~D3DCREATE_HARDWARE_VERTEXPROCESSING; + dwBehavior &= ~D3DCREATE_SOFTWARE_VERTEXPROCESSING; + dwBehavior &= ~D3DCREATE_MIXED_VERTEXPROCESSING; + dwBehavior &= ~D3DCREATE_PUREDEVICE; + + // Determine new flags + DWORD dwNewFlags = GetSelectedVertexProcessingType(); + if( dwNewFlags & D3DCREATE_PUREDEVICE ) + dwNewFlags |= D3DCREATE_HARDWARE_VERTEXPROCESSING; + + // Make changes + g_DeviceSettings.d3d9.BehaviorFlags = dwBehavior | dwNewFlags; + + return S_OK; +} + + +//------------------------------------------------------------------------------------- +HRESULT CD3DSettingsDlg::OnPresentIntervalChanged() +{ + switch( g_DeviceSettings.ver ) + { + case DXUT_D3D9_DEVICE: + g_DeviceSettings.d3d9.pp.PresentationInterval = GetSelectedPresentInterval(); + break; + + case DXUT_D3D11_DEVICE: + g_DeviceSettings.d3d11.SyncInterval = GetSelectedD3D11PresentInterval(); + break; + } + + return S_OK; +} + + +//------------------------------------------------------------------------------------- +HRESULT CD3DSettingsDlg::OnDebugDeviceChanged() +{ + bool bDebugDevice = GetSelectedDebugDeviceValue(); + + if( bDebugDevice ) + g_DeviceSettings.d3d11.CreateFlags |= D3D11_CREATE_DEVICE_DEBUG; + else + g_DeviceSettings.d3d11.CreateFlags &= ~D3D11_CREATE_DEVICE_DEBUG; + + return S_OK; +} + +//------------------------------------------------------------------------------------- +HRESULT CD3DSettingsDlg::OnDeviceClipChanged() +{ + if( IsDeviceClip() ) + g_DeviceSettings.d3d9.pp.Flags |= D3DPRESENTFLAG_DEVICECLIP; + else + g_DeviceSettings.d3d9.pp.Flags &= ~D3DPRESENTFLAG_DEVICECLIP; + + return S_OK; +} + + +//------------------------------------------------------------------------------------- +void CD3DSettingsDlg::AddAPIVersion( DXUTDeviceVersion version ) +{ + CDXUTComboBox* pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_API_VERSION ); + + if( !pComboBox->ContainsItem( DXUTAPIVersionToString( version ) ) ) + pComboBox->AddItem( DXUTAPIVersionToString( version ), ULongToPtr( version ) ); +} + + +//------------------------------------------------------------------------------------- +DXUTDeviceVersion CD3DSettingsDlg::GetSelectedAPIVersion() +{ + CDXUTComboBox* pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_API_VERSION ); + + return ( DXUTDeviceVersion )PtrToUlong( pComboBox->GetSelectedData() ); +} + + +//------------------------------------------------------------------------------------- +void CD3DSettingsDlg::AddAdapter( const WCHAR* strDescription, UINT iAdapter ) +{ + CDXUTComboBox* pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_ADAPTER ); + + if( !pComboBox->ContainsItem( strDescription ) ) + pComboBox->AddItem( strDescription, ULongToPtr( iAdapter ) ); +} + + +//------------------------------------------------------------------------------------- +UINT CD3DSettingsDlg::GetSelectedAdapter() +{ + CDXUTComboBox* pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_ADAPTER ); + + return PtrToUlong( pComboBox->GetSelectedData() ); +} + + +//------------------------------------------------------------------------------------- +void CD3DSettingsDlg::AddDeviceType( D3DDEVTYPE devType ) +{ + CDXUTComboBox* pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_DEVICE_TYPE ); + + if( !pComboBox->ContainsItem( DXUTD3DDeviceTypeToString( devType ) ) ) + pComboBox->AddItem( DXUTD3DDeviceTypeToString( devType ), ULongToPtr( devType ) ); +} + + +//------------------------------------------------------------------------------------- +D3DDEVTYPE CD3DSettingsDlg::GetSelectedDeviceType() +{ + CDXUTComboBox* pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_DEVICE_TYPE ); + + return ( D3DDEVTYPE )PtrToUlong( pComboBox->GetSelectedData() ); +} + + +//------------------------------------------------------------------------------------- +void CD3DSettingsDlg::SetWindowed( bool bWindowed ) +{ + CDXUTRadioButton* pRadioButton = m_Dialog.GetRadioButton( DXUTSETTINGSDLG_WINDOWED ); + pRadioButton->SetChecked( bWindowed ); + + pRadioButton = m_Dialog.GetRadioButton( DXUTSETTINGSDLG_FULLSCREEN ); + pRadioButton->SetChecked( !bWindowed ); +} + + +//------------------------------------------------------------------------------------- +bool CD3DSettingsDlg::IsWindowed() +{ + CDXUTRadioButton* pRadioButton = m_Dialog.GetRadioButton( DXUTSETTINGSDLG_WINDOWED ); + return pRadioButton->GetChecked(); +} + + +//------------------------------------------------------------------------------------- +void CD3DSettingsDlg::AddAdapterFormat( D3DFORMAT format ) +{ + CDXUTComboBox* pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_ADAPTER_FORMAT ); + + if( !pComboBox->ContainsItem( DXUTD3DFormatToString( format, TRUE ) ) ) + pComboBox->AddItem( DXUTD3DFormatToString( format, TRUE ), ULongToPtr( format ) ); +} + + +//------------------------------------------------------------------------------------- +D3DFORMAT CD3DSettingsDlg::GetSelectedAdapterFormat() +{ + CDXUTComboBox* pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_ADAPTER_FORMAT ); + + return ( D3DFORMAT )PtrToUlong( pComboBox->GetSelectedData() ); +} + + +//------------------------------------------------------------------------------------- +void CD3DSettingsDlg::AddD3D11AdapterOutput( const WCHAR* strName, UINT Output ) +{ + CDXUTComboBox* pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_D3D11_ADAPTER_OUTPUT ); + + if( !pComboBox->ContainsItem( strName ) ) + pComboBox->AddItem( strName, ULongToPtr( Output ) ); +} + + +//------------------------------------------------------------------------------------- +UINT CD3DSettingsDlg::GetSelectedD3D11AdapterOutput() +{ + CDXUTComboBox* pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_D3D11_ADAPTER_OUTPUT ); + + return PtrToUlong( pComboBox->GetSelectedData() ); +} + + +//------------------------------------------------------------------------------------- +void CD3DSettingsDlg::AddResolution( DWORD dwWidth, DWORD dwHeight ) +{ + CDXUTComboBox* pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_RESOLUTION ); + + DWORD dwResolutionData; + WCHAR strResolution[50]; + dwResolutionData = MAKELONG( dwWidth, dwHeight ); + swprintf_s( strResolution, 50, L"%d by %d", dwWidth, dwHeight ); + + if( !pComboBox->ContainsItem( strResolution ) ) + pComboBox->AddItem( strResolution, ULongToPtr( dwResolutionData ) ); +} + + +//------------------------------------------------------------------------------------- +void CD3DSettingsDlg::GetSelectedResolution( DWORD* pdwWidth, DWORD* pdwHeight ) +{ + CDXUTComboBox* pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_RESOLUTION ); + + DWORD dwResolution = PtrToUlong( pComboBox->GetSelectedData() ); + + *pdwWidth = LOWORD( dwResolution ); + *pdwHeight = HIWORD( dwResolution ); +} + + +//------------------------------------------------------------------------------------- +void CD3DSettingsDlg::AddD3D11Resolution( DWORD dwWidth, DWORD dwHeight ) +{ + CDXUTComboBox* pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_D3D11_RESOLUTION ); + + DWORD dwResolutionData; + WCHAR strResolution[50]; + dwResolutionData = MAKELONG( dwWidth, dwHeight ); + swprintf_s( strResolution, 50, L"%d by %d", dwWidth, dwHeight ); + + if( !pComboBox->ContainsItem( strResolution ) ) + pComboBox->AddItem( strResolution, ULongToPtr( dwResolutionData ) ); +} + + +//------------------------------------------------------------------------------------- +void CD3DSettingsDlg::GetSelectedD3D11Resolution( DWORD* pdwWidth, DWORD* pdwHeight ) +{ + CDXUTComboBox* pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_D3D11_RESOLUTION ); + + DWORD dwResolution = PtrToUlong( pComboBox->GetSelectedData() ); + + *pdwWidth = LOWORD( dwResolution ); + *pdwHeight = HIWORD( dwResolution ); +} + +void CD3DSettingsDlg::AddD3D11FeatureLevel(D3D_FEATURE_LEVEL fl) { + CDXUTComboBox* pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_D3D11_FEATURE_LEVEL ); + switch( fl ) + { + case D3D_FEATURE_LEVEL_9_1: + { + if( !pComboBox->ContainsItem( L"D3D_FEATURE_LEVEL_9_1" ) ) + pComboBox->AddItem( L"D3D_FEATURE_LEVEL_9_1", ULongToPtr( D3D_FEATURE_LEVEL_9_1 ) ); + } + break; + case D3D_FEATURE_LEVEL_9_2: + { + if( !pComboBox->ContainsItem( L"D3D_FEATURE_LEVEL_9_2" ) ) + pComboBox->AddItem( L"D3D_FEATURE_LEVEL_9_2", ULongToPtr( D3D_FEATURE_LEVEL_9_2 ) ); + } + break; + case D3D_FEATURE_LEVEL_9_3: + { + if( !pComboBox->ContainsItem( L"D3D_FEATURE_LEVEL_9_3" ) ) + pComboBox->AddItem( L"D3D_FEATURE_LEVEL_9_3", ULongToPtr( D3D_FEATURE_LEVEL_9_3 ) ); + } + break; + case D3D_FEATURE_LEVEL_10_0: + { + if( !pComboBox->ContainsItem( L"D3D_FEATURE_LEVEL_10_0" ) ) + pComboBox->AddItem( L"D3D_FEATURE_LEVEL_10_0", ULongToPtr( D3D_FEATURE_LEVEL_10_0 ) ); + } + break; + case D3D_FEATURE_LEVEL_10_1: + { + if( !pComboBox->ContainsItem( L"D3D_FEATURE_LEVEL_10_1" ) ) + pComboBox->AddItem( L"D3D_FEATURE_LEVEL_10_1", ULongToPtr( D3D_FEATURE_LEVEL_10_1 ) ); + } + break; + case D3D_FEATURE_LEVEL_11_0: + { + if( !pComboBox->ContainsItem( L"D3D_FEATURE_LEVEL_11_0" ) ) + pComboBox->AddItem( L"D3D_FEATURE_LEVEL_11_0", ULongToPtr( D3D_FEATURE_LEVEL_11_0 ) ); + } + break; + } + +} + +D3D_FEATURE_LEVEL CD3DSettingsDlg::GetSelectedFeatureLevel() { + CDXUTComboBox* pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_D3D11_FEATURE_LEVEL ); + + return (D3D_FEATURE_LEVEL)PtrToUlong( pComboBox->GetSelectedData() ); +} +//------------------------------------------------------------------------------------- +void CD3DSettingsDlg::AddRefreshRate( DWORD dwRate ) +{ + CDXUTComboBox* pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_REFRESH_RATE ); + + WCHAR strRefreshRate[50]; + + if( dwRate == 0 ) + wcscpy_s( strRefreshRate, 50, L"Default Rate" ); + else + swprintf_s( strRefreshRate, 50, L"%d Hz", dwRate ); + + if( !pComboBox->ContainsItem( strRefreshRate ) ) + pComboBox->AddItem( strRefreshRate, ULongToPtr( dwRate ) ); +} + + +//------------------------------------------------------------------------------------- +DWORD CD3DSettingsDlg::GetSelectedRefreshRate() +{ + CDXUTComboBox* pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_REFRESH_RATE ); + + return PtrToUlong( pComboBox->GetSelectedData() ); +} + + +//------------------------------------------------------------------------------------- +void CD3DSettingsDlg::AddD3D11RefreshRate( DXGI_RATIONAL RefreshRate ) +{ + CDXUTComboBox* pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_D3D11_REFRESH_RATE ); + + WCHAR strRefreshRate[50]; + + if( RefreshRate.Numerator == 0 && RefreshRate.Denominator == 0 ) + wcscpy_s( strRefreshRate, 50, L"Default Rate" ); + else + swprintf_s( strRefreshRate, 50, L"%d Hz", RefreshRate.Numerator / RefreshRate.Denominator ); + + if( !pComboBox->ContainsItem( strRefreshRate ) ) + { + DXGI_RATIONAL* pNewRate = new DXGI_RATIONAL; + if( pNewRate ) + { + *pNewRate = RefreshRate; + pComboBox->AddItem( strRefreshRate, pNewRate ); + } + } +} + + +//------------------------------------------------------------------------------------- +DXGI_RATIONAL CD3DSettingsDlg::GetSelectedD3D11RefreshRate() +{ + DXGI_RATIONAL dxgiR; + dxgiR.Numerator = 0; + dxgiR.Denominator = 1; + + CDXUTComboBox* pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_D3D11_REFRESH_RATE ); + + return *reinterpret_cast( pComboBox->GetSelectedData() ); + +} + + +//------------------------------------------------------------------------------------- +void CD3DSettingsDlg::AddBackBufferFormat( D3DFORMAT format ) +{ + CDXUTComboBox* pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_BACK_BUFFER_FORMAT ); + + if( !pComboBox->ContainsItem( DXUTD3DFormatToString( format, TRUE ) ) ) + pComboBox->AddItem( DXUTD3DFormatToString( format, TRUE ), ULongToPtr( format ) ); +} + + +//------------------------------------------------------------------------------------- +D3DFORMAT CD3DSettingsDlg::GetSelectedBackBufferFormat() +{ + CDXUTComboBox* pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_BACK_BUFFER_FORMAT ); + + return ( D3DFORMAT )PtrToUlong( pComboBox->GetSelectedData() ); +} + + +//------------------------------------------------------------------------------------- +void CD3DSettingsDlg::AddD3D11BackBufferFormat( DXGI_FORMAT format ) +{ + CDXUTComboBox* pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_D3D11_BACK_BUFFER_FORMAT ); + + if( !pComboBox->ContainsItem( DXUTDXGIFormatToString( format, TRUE ) ) ) + pComboBox->AddItem( DXUTDXGIFormatToString( format, TRUE ), ULongToPtr( format ) ); +} + + +//------------------------------------------------------------------------------------- +DXGI_FORMAT CD3DSettingsDlg::GetSelectedD3D11BackBufferFormat() +{ + CDXUTComboBox* pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_D3D11_BACK_BUFFER_FORMAT ); + + return ( DXGI_FORMAT )PtrToUlong( pComboBox->GetSelectedData() ); +} + + +//------------------------------------------------------------------------------------- +void CD3DSettingsDlg::AddDepthStencilBufferFormat( D3DFORMAT format ) +{ + CDXUTComboBox* pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_DEPTH_STENCIL ); + + if( !pComboBox->ContainsItem( DXUTD3DFormatToString( format, TRUE ) ) ) + pComboBox->AddItem( DXUTD3DFormatToString( format, TRUE ), ULongToPtr( format ) ); +} + + +//------------------------------------------------------------------------------------- +D3DFORMAT CD3DSettingsDlg::GetSelectedDepthStencilBufferFormat() +{ + CDXUTComboBox* pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_DEPTH_STENCIL ); + + return ( D3DFORMAT )PtrToUlong( pComboBox->GetSelectedData() ); +} + + +//------------------------------------------------------------------------------------- +void CD3DSettingsDlg::AddMultisampleType( D3DMULTISAMPLE_TYPE type ) +{ + CDXUTComboBox* pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_MULTISAMPLE_TYPE ); + + if( !pComboBox->ContainsItem( DXUTMultisampleTypeToString( type ) ) ) + pComboBox->AddItem( DXUTMultisampleTypeToString( type ), ULongToPtr( type ) ); +} + + +//------------------------------------------------------------------------------------- +D3DMULTISAMPLE_TYPE CD3DSettingsDlg::GetSelectedMultisampleType() +{ + CDXUTComboBox* pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_MULTISAMPLE_TYPE ); + + return ( D3DMULTISAMPLE_TYPE )PtrToUlong( pComboBox->GetSelectedData() ); +} + + +//------------------------------------------------------------------------------------- +void CD3DSettingsDlg::AddMultisampleQuality( DWORD dwQuality ) +{ + CDXUTComboBox* pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_MULTISAMPLE_QUALITY ); + + WCHAR strQuality[50]; + swprintf_s( strQuality, 50, L"%d", dwQuality ); + + if( !pComboBox->ContainsItem( strQuality ) ) + pComboBox->AddItem( strQuality, ULongToPtr( dwQuality ) ); +} + + +//------------------------------------------------------------------------------------- +DWORD CD3DSettingsDlg::GetSelectedMultisampleQuality() +{ + CDXUTComboBox* pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_MULTISAMPLE_QUALITY ); + + return PtrToUlong( pComboBox->GetSelectedData() ); +} + + +//------------------------------------------------------------------------------------- +void CD3DSettingsDlg::AddD3D11MultisampleCount( UINT Count ) +{ + CDXUTComboBox* pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_D3D11_MULTISAMPLE_COUNT ); + + WCHAR str[50]; + swprintf_s( str, 50, L"%u", Count ); + + if( !pComboBox->ContainsItem( str ) ) + pComboBox->AddItem( str, ULongToPtr( Count ) ); +} + + +//------------------------------------------------------------------------------------- +UINT CD3DSettingsDlg::GetSelectedD3D11MultisampleCount() +{ + CDXUTComboBox* pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_D3D11_MULTISAMPLE_COUNT ); + + return ( UINT )PtrToUlong( pComboBox->GetSelectedData() ); +} + + +//------------------------------------------------------------------------------------- +void CD3DSettingsDlg::AddD3D11MultisampleQuality( UINT Quality ) +{ + CDXUTComboBox* pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_D3D11_MULTISAMPLE_QUALITY ); + + WCHAR strQuality[50]; + swprintf_s( strQuality, 50, L"%d", Quality ); + + if( !pComboBox->ContainsItem( strQuality ) ) + pComboBox->AddItem( strQuality, ULongToPtr( Quality ) ); +} + + +//------------------------------------------------------------------------------------- +UINT CD3DSettingsDlg::GetSelectedD3D11MultisampleQuality() +{ + CDXUTComboBox* pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_D3D11_MULTISAMPLE_QUALITY ); + + return ( UINT )PtrToUlong( pComboBox->GetSelectedData() ); +} + + +//------------------------------------------------------------------------------------- +void CD3DSettingsDlg::AddVertexProcessingType( DWORD dwType ) +{ + CDXUTComboBox* pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_VERTEX_PROCESSING ); + + if( !pComboBox->ContainsItem( DXUTVertexProcessingTypeToString( dwType ) ) ) + pComboBox->AddItem( DXUTVertexProcessingTypeToString( dwType ), ULongToPtr( dwType ) ); +} + + +//------------------------------------------------------------------------------------- +DWORD CD3DSettingsDlg::GetSelectedVertexProcessingType() +{ + CDXUTComboBox* pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_VERTEX_PROCESSING ); + + return PtrToUlong( pComboBox->GetSelectedData() ); +} + + +//------------------------------------------------------------------------------------- +DWORD CD3DSettingsDlg::GetSelectedPresentInterval() +{ + CDXUTComboBox* pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_PRESENT_INTERVAL ); + + return PtrToUlong( pComboBox->GetSelectedData() ); +} + + +//------------------------------------------------------------------------------------- +DWORD CD3DSettingsDlg::GetSelectedD3D11PresentInterval() +{ + CDXUTComboBox* pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_D3D11_PRESENT_INTERVAL ); + + return PtrToUlong( pComboBox->GetSelectedData() ); +} + +//------------------------------------------------------------------------------------- +bool CD3DSettingsDlg::GetSelectedDebugDeviceValue() +{ + CDXUTCheckBox* pCheckBox = m_Dialog.GetCheckBox( DXUTSETTINGSDLG_D3D11_DEBUG_DEVICE ); + + return pCheckBox->GetChecked(); +} + + +//------------------------------------------------------------------------------------- +void CD3DSettingsDlg::SetDeviceClip( bool bDeviceClip ) +{ + CDXUTCheckBox* pCheckBox = m_Dialog.GetCheckBox( DXUTSETTINGSDLG_DEVICECLIP ); + pCheckBox->SetChecked( bDeviceClip ); +} + + +//------------------------------------------------------------------------------------- +bool CD3DSettingsDlg::IsDeviceClip() +{ + CDXUTCheckBox* pCheckBox = m_Dialog.GetCheckBox( DXUTSETTINGSDLG_DEVICECLIP ); + return pCheckBox->GetChecked(); +} + +//-------------------------------------------------------------------------------------- +// Updates the resolution list for D3D11 +//-------------------------------------------------------------------------------------- +HRESULT CD3DSettingsDlg::UpdateD3D11Resolutions() +{ + + const DWORD dwWidth = g_DeviceSettings.d3d11.sd.BufferDesc.Width; + const DWORD dwHeight = g_DeviceSettings.d3d11.sd.BufferDesc.Height; + + // DXUTSETTINGSDLG_D3D11_RESOLUTION + CDXUTComboBox* pResolutionComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_D3D11_RESOLUTION ); + pResolutionComboBox->RemoveAllItems(); + + CD3D11EnumOutputInfo* pOutputInfo = GetCurrentD3D11OutputInfo(); + if( pOutputInfo == NULL ) + return E_FAIL; + + bool bShowAll = m_Dialog.GetCheckBox( DXUTSETTINGSDLG_RESOLUTION_SHOW_ALL )->GetChecked(); + + // Get the desktop aspect ratio + DXGI_MODE_DESC dmDesktop; + DXUTGetDesktopResolution( g_DeviceSettings.d3d11.AdapterOrdinal, &dmDesktop.Width, &dmDesktop.Height ); + float fDesktopAspectRatio = dmDesktop.Width / ( float )dmDesktop.Height; + + for( int idm = 0; idm < pOutputInfo->displayModeList.GetSize(); idm++ ) + { + DXGI_MODE_DESC DisplayMode = pOutputInfo->displayModeList.GetAt( idm ); + float fAspect = ( float )DisplayMode.Width / ( float )DisplayMode.Height; + + if( DisplayMode.Format == g_DeviceSettings.d3d11.sd.BufferDesc.Format ) + { + // If "Show All" is not checked, then hide all resolutions + // that don't match the aspect ratio of the desktop resolution + if( bShowAll || ( !bShowAll && fabsf( fDesktopAspectRatio - fAspect ) < 0.05f ) ) + { + AddD3D11Resolution( DisplayMode.Width, DisplayMode.Height ); + } + } + } + + const DWORD dwCurResolution = MAKELONG( g_DeviceSettings.d3d11.sd.BufferDesc.Width, + g_DeviceSettings.d3d11.sd.BufferDesc.Height ); + + pResolutionComboBox->SetSelectedByData( ULongToPtr( dwCurResolution ) ); + + + bool bWindowed = IsWindowed(); + if( bWindowed ) + { + pResolutionComboBox->RemoveAllItems(); + AddD3D11Resolution( dwWidth, dwHeight ); + + pResolutionComboBox->SetSelectedByData( ULongToPtr( MAKELONG( dwWidth, dwHeight ) ) ); + + + } + + return S_OK; +} + + +// +//------------------------------------------------------------------------------------- +void CD3DSettingsDlg::AddD3D11DeviceType( D3D_DRIVER_TYPE devType ) +{ + CDXUTComboBox* pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_DEVICE_TYPE ); + + if( !pComboBox->ContainsItem( DXUTD3DX11DeviceTypeToString( devType ) ) ) + pComboBox->AddItem( DXUTD3DX11DeviceTypeToString( devType ), ULongToPtr( devType ) ); +} + + +//------------------------------------------------------------------------------------- +D3D_DRIVER_TYPE CD3DSettingsDlg::GetSelectedD3D11DeviceType() +{ + CDXUTComboBox* pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_DEVICE_TYPE ); + + return ( D3D_DRIVER_TYPE )PtrToUlong( pComboBox->GetSelectedData() ); +} + + +void CD3DSettingsDlg::UpdateModeChangeTimeoutText( int nSecRemaining ) +{ + const WCHAR StrTimeout[] = L"Reverting to previous display settings in %d seconds"; + const DWORD CchBuf = sizeof( StrTimeout ) / sizeof( WCHAR ) + 16; + WCHAR buf[CchBuf]; + + swprintf_s( buf, CchBuf, StrTimeout, nSecRemaining ); + + CDXUTStatic* pStatic = m_RevertModeDialog.GetStatic( DXUTSETTINGSDLG_STATIC_MODE_CHANGE_TIMEOUT ); + pStatic->SetText( buf ); +} + +//-------------------------------------------------------------------------------------- +// Returns the string for the given DXUTDeviceVersion. +//-------------------------------------------------------------------------------------- +WCHAR* DXUTAPIVersionToString( DXUTDeviceVersion version ) +{ + switch( version ) + { + case DXUT_D3D9_DEVICE: + return L"Direct3D 9"; + case DXUT_D3D11_DEVICE: + return L"Direct3D 11"; + default: + return L"Unknown version"; + } +} + + +//-------------------------------------------------------------------------------------- +// Returns the string for the given D3DDEVTYPE. +//-------------------------------------------------------------------------------------- +WCHAR* DXUTD3DDeviceTypeToString( D3DDEVTYPE devType ) +{ + switch( devType ) + { + case D3DDEVTYPE_HAL: + return L"D3DDEVTYPE_HAL"; + case D3DDEVTYPE_SW: + return L"D3DDEVTYPE_SW"; + case D3DDEVTYPE_REF: + return L"D3DDEVTYPE_REF"; + default: + return L"Unknown devType"; + } +} + + + + +//-------------------------------------------------------------------------------------- +// Returns the string for the given D3D_DRIVER_TYPE. +//-------------------------------------------------------------------------------------- +WCHAR* DXUTD3DX11DeviceTypeToString( D3D_DRIVER_TYPE devType ) +{ + switch( devType ) + { + case D3D_DRIVER_TYPE_HARDWARE: + return L"D3D_DRIVER_TYPE_HARDWARE"; + case D3D_DRIVER_TYPE_REFERENCE: + return L"D3D_DRIVER_TYPE_REFERENCE"; + case D3D_DRIVER_TYPE_NULL: + return L"D3D_DRIVER_TYPE_NULL"; + case D3D_DRIVER_TYPE_WARP: + return L"D3D_DRIVER_TYPE_WARP"; + default: + return L"Unknown devType"; + } +} + + +//-------------------------------------------------------------------------------------- +// Returns the string for the given D3DMULTISAMPLE_TYPE. +//-------------------------------------------------------------------------------------- +WCHAR* DXUTMultisampleTypeToString( D3DMULTISAMPLE_TYPE MultiSampleType ) +{ + switch( MultiSampleType ) + { + case D3DMULTISAMPLE_NONE: + return L"D3DMULTISAMPLE_NONE"; + case D3DMULTISAMPLE_NONMASKABLE: + return L"D3DMULTISAMPLE_NONMASKABLE"; + case D3DMULTISAMPLE_2_SAMPLES: + return L"D3DMULTISAMPLE_2_SAMPLES"; + case D3DMULTISAMPLE_3_SAMPLES: + return L"D3DMULTISAMPLE_3_SAMPLES"; + case D3DMULTISAMPLE_4_SAMPLES: + return L"D3DMULTISAMPLE_4_SAMPLES"; + case D3DMULTISAMPLE_5_SAMPLES: + return L"D3DMULTISAMPLE_5_SAMPLES"; + case D3DMULTISAMPLE_6_SAMPLES: + return L"D3DMULTISAMPLE_6_SAMPLES"; + case D3DMULTISAMPLE_7_SAMPLES: + return L"D3DMULTISAMPLE_7_SAMPLES"; + case D3DMULTISAMPLE_8_SAMPLES: + return L"D3DMULTISAMPLE_8_SAMPLES"; + case D3DMULTISAMPLE_9_SAMPLES: + return L"D3DMULTISAMPLE_9_SAMPLES"; + case D3DMULTISAMPLE_10_SAMPLES: + return L"D3DMULTISAMPLE_10_SAMPLES"; + case D3DMULTISAMPLE_11_SAMPLES: + return L"D3DMULTISAMPLE_11_SAMPLES"; + case D3DMULTISAMPLE_12_SAMPLES: + return L"D3DMULTISAMPLE_12_SAMPLES"; + case D3DMULTISAMPLE_13_SAMPLES: + return L"D3DMULTISAMPLE_13_SAMPLES"; + case D3DMULTISAMPLE_14_SAMPLES: + return L"D3DMULTISAMPLE_14_SAMPLES"; + case D3DMULTISAMPLE_15_SAMPLES: + return L"D3DMULTISAMPLE_15_SAMPLES"; + case D3DMULTISAMPLE_16_SAMPLES: + return L"D3DMULTISAMPLE_16_SAMPLES"; + default: + return L"Unknown Multisample Type"; + } +} + + +//-------------------------------------------------------------------------------------- +// Returns the string for the given vertex processing type +//-------------------------------------------------------------------------------------- +WCHAR* DXUTVertexProcessingTypeToString( DWORD vpt ) +{ + switch( vpt ) + { + case D3DCREATE_SOFTWARE_VERTEXPROCESSING: + return L"Software vertex processing"; + case D3DCREATE_MIXED_VERTEXPROCESSING: + return L"Mixed vertex processing"; + case D3DCREATE_HARDWARE_VERTEXPROCESSING: + return L"Hardware vertex processing"; + case D3DCREATE_PUREDEVICE: + return L"Pure hardware vertex processing"; + default: + return L"Unknown vertex processing type"; + } +} + + +//-------------------------------------------------------------------------------------- +// Returns the string for the given present interval. +//-------------------------------------------------------------------------------------- +WCHAR* DXUTPresentIntervalToString( UINT pi ) +{ + switch( pi ) + { + case D3DPRESENT_INTERVAL_IMMEDIATE: + return L"D3DPRESENT_INTERVAL_IMMEDIATE"; + case D3DPRESENT_INTERVAL_DEFAULT: + return L"D3DPRESENT_INTERVAL_DEFAULT"; + case D3DPRESENT_INTERVAL_ONE: + return L"D3DPRESENT_INTERVAL_ONE"; + case D3DPRESENT_INTERVAL_TWO: + return L"D3DPRESENT_INTERVAL_TWO"; + case D3DPRESENT_INTERVAL_THREE: + return L"D3DPRESENT_INTERVAL_THREE"; + case D3DPRESENT_INTERVAL_FOUR: + return L"D3DPRESENT_INTERVAL_FOUR"; + default: + return L"Unknown PresentInterval"; + } +} + + diff --git a/Demos/DX11ClothDemo/DXUT/Optional/DXUTsettingsdlg.h b/Demos/DX11ClothDemo/DXUT/Optional/DXUTsettingsdlg.h new file mode 100644 index 000000000..fee91f3a1 --- /dev/null +++ b/Demos/DX11ClothDemo/DXUT/Optional/DXUTsettingsdlg.h @@ -0,0 +1,248 @@ +//-------------------------------------------------------------------------------------- +// File: DXUTSettingsDlg.cpp +// +// Copyright (c) Microsoft Corporation. All rights reserved +//-------------------------------------------------------------------------------------- +#pragma once +#ifndef DXUT_SETTINGS_H +#define DXUT_SETTINGS_H + +//-------------------------------------------------------------------------------------- +// Header Includes +//-------------------------------------------------------------------------------------- +#include "DXUTgui.h" +//-------------------------------------------------------------------------------------- +// Control IDs +//-------------------------------------------------------------------------------------- +#define DXUTSETTINGSDLG_STATIC -1 +#define DXUTSETTINGSDLG_OK 1 +#define DXUTSETTINGSDLG_CANCEL 2 +#define DXUTSETTINGSDLG_ADAPTER 3 +#define DXUTSETTINGSDLG_DEVICE_TYPE 4 +#define DXUTSETTINGSDLG_WINDOWED 5 +#define DXUTSETTINGSDLG_FULLSCREEN 6 +#define DXUTSETTINGSDLG_ADAPTER_FORMAT 7 +#define DXUTSETTINGSDLG_ADAPTER_FORMAT_LABEL 8 +#define DXUTSETTINGSDLG_RESOLUTION 9 +#define DXUTSETTINGSDLG_RESOLUTION_LABEL 10 +#define DXUTSETTINGSDLG_REFRESH_RATE 11 +#define DXUTSETTINGSDLG_REFRESH_RATE_LABEL 12 +#define DXUTSETTINGSDLG_BACK_BUFFER_FORMAT 13 +#define DXUTSETTINGSDLG_BACK_BUFFER_FORMAT_LABEL 14 +#define DXUTSETTINGSDLG_DEPTH_STENCIL 15 +#define DXUTSETTINGSDLG_DEPTH_STENCIL_LABEL 16 +#define DXUTSETTINGSDLG_MULTISAMPLE_TYPE 17 +#define DXUTSETTINGSDLG_MULTISAMPLE_TYPE_LABEL 18 +#define DXUTSETTINGSDLG_MULTISAMPLE_QUALITY 19 +#define DXUTSETTINGSDLG_MULTISAMPLE_QUALITY_LABEL 20 +#define DXUTSETTINGSDLG_VERTEX_PROCESSING 21 +#define DXUTSETTINGSDLG_VERTEX_PROCESSING_LABEL 22 +#define DXUTSETTINGSDLG_PRESENT_INTERVAL 23 +#define DXUTSETTINGSDLG_PRESENT_INTERVAL_LABEL 24 +#define DXUTSETTINGSDLG_DEVICECLIP 25 +#define DXUTSETTINGSDLG_RESOLUTION_SHOW_ALL 26 +#define DXUTSETTINGSDLG_API_VERSION 27 +#define DXUTSETTINGSDLG_D3D11_ADAPTER_OUTPUT 28 +#define DXUTSETTINGSDLG_D3D11_ADAPTER_OUTPUT_LABEL 29 +#define DXUTSETTINGSDLG_D3D11_RESOLUTION 30 +#define DXUTSETTINGSDLG_D3D11_RESOLUTION_LABEL 31 +#define DXUTSETTINGSDLG_D3D11_REFRESH_RATE 32 +#define DXUTSETTINGSDLG_D3D11_REFRESH_RATE_LABEL 33 +#define DXUTSETTINGSDLG_D3D11_BACK_BUFFER_FORMAT 34 +#define DXUTSETTINGSDLG_D3D11_BACK_BUFFER_FORMAT_LABEL 35 +#define DXUTSETTINGSDLG_D3D11_MULTISAMPLE_COUNT 36 +#define DXUTSETTINGSDLG_D3D11_MULTISAMPLE_COUNT_LABEL 37 +#define DXUTSETTINGSDLG_D3D11_MULTISAMPLE_QUALITY 38 +#define DXUTSETTINGSDLG_D3D11_MULTISAMPLE_QUALITY_LABEL 39 +#define DXUTSETTINGSDLG_D3D11_PRESENT_INTERVAL 40 +#define DXUTSETTINGSDLG_D3D11_PRESENT_INTERVAL_LABEL 41 +#define DXUTSETTINGSDLG_D3D11_DEBUG_DEVICE 42 +#define DXUTSETTINGSDLG_D3D11_FEATURE_LEVEL 43 +#define DXUTSETTINGSDLG_D3D11_FEATURE_LEVEL_LABEL 44 + +#define DXUTSETTINGSDLG_MODE_CHANGE_ACCEPT 58 +#define DXUTSETTINGSDLG_MODE_CHANGE_REVERT 59 +#define DXUTSETTINGSDLG_STATIC_MODE_CHANGE_TIMEOUT 60 +#define DXUTSETTINGSDLG_WINDOWED_GROUP 0x0100 + +#define TOTAL_FEATURE_LEVLES 6 +//-------------------------------------------------------------------------------------- +// Dialog for selection of device settings +// Use DXUTGetD3DSettingsDialog() to access global instance +// To control the contents of the dialog, use the CD3D9Enumeration class. +//-------------------------------------------------------------------------------------- +class CD3DSettingsDlg +{ +public: + CD3DSettingsDlg(); + ~CD3DSettingsDlg(); + + void Init( CDXUTDialogResourceManager* pManager ); + void Init( CDXUTDialogResourceManager* pManager, LPCWSTR szControlTextureFileName ); + void Init( CDXUTDialogResourceManager* pManager, LPCWSTR pszControlTextureResourcename, + HMODULE hModule ); + + HRESULT Refresh(); + void OnRender( float fElapsedTime ); + void OnRender9( float fElapsedTime ); + void OnRender10( float fElapsedTime ); + void OnRender11( float fElapsedTime ); + + HRESULT OnD3D9CreateDevice( IDirect3DDevice9* pd3dDevice ); + HRESULT OnD3D9ResetDevice(); + void OnD3D9LostDevice(); + void OnD3D9DestroyDevice(); + + HRESULT OnD3D11CreateDevice( ID3D11Device* pd3dDevice ); + HRESULT OnD3D11ResizedSwapChain( ID3D11Device* pd3dDevice, + const DXGI_SURFACE_DESC* pBackBufferSurfaceDesc ); + void OnD3D11DestroyDevice(); + + CDXUTDialog* GetDialogControl() + { + return &m_Dialog; + } + bool IsActive() + { + return m_bActive; + } + void SetActive( bool bActive ) + { + m_bActive = bActive; if( bActive ) Refresh(); + } + void ShowControlSet( DXUTDeviceVersion ver ); + + LRESULT MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ); + +protected: + friend CD3DSettingsDlg* WINAPI DXUTGetD3DSettingsDialog(); + + void CreateControls(); + HRESULT SetDeviceSettingsFromUI(); + void SetSelectedD3D11RefreshRate( DXGI_RATIONAL RefreshRate ); + HRESULT UpdateD3D11Resolutions(); + + void OnEvent( UINT nEvent, int nControlID, CDXUTControl* pControl ); + static void WINAPI StaticOnEvent( UINT nEvent, int nControlID, CDXUTControl* pControl, void* pUserData ); + static void WINAPI StaticOnModeChangeTimer( UINT nIDEvent, void* pUserContext ); + + CD3D9EnumAdapterInfo* GetCurrentAdapterInfo(); + CD3D9EnumDeviceInfo* GetCurrentDeviceInfo(); + CD3D9EnumDeviceSettingsCombo* GetCurrentDeviceSettingsCombo(); + + CD3D11EnumAdapterInfo* GetCurrentD3D11AdapterInfo(); + CD3D11EnumDeviceInfo* GetCurrentD3D11DeviceInfo(); + CD3D11EnumOutputInfo* GetCurrentD3D11OutputInfo(); + CD3D11EnumDeviceSettingsCombo* GetCurrentD3D11DeviceSettingsCombo(); + + void AddAPIVersion( DXUTDeviceVersion version ); + DXUTDeviceVersion GetSelectedAPIVersion(); + + void AddAdapter( const WCHAR* strDescription, UINT iAdapter ); + UINT GetSelectedAdapter(); + + void AddDeviceType( D3DDEVTYPE devType ); + D3DDEVTYPE GetSelectedDeviceType(); + + void SetWindowed( bool bWindowed ); + bool IsWindowed(); + + void AddAdapterFormat( D3DFORMAT format ); + D3DFORMAT GetSelectedAdapterFormat(); + + void AddResolution( DWORD dwWidth, DWORD dwHeight ); + void GetSelectedResolution( DWORD* pdwWidth, DWORD* pdwHeight ); + + void AddRefreshRate( DWORD dwRate ); + DWORD GetSelectedRefreshRate(); + + void AddBackBufferFormat( D3DFORMAT format ); + D3DFORMAT GetSelectedBackBufferFormat(); + + void AddDepthStencilBufferFormat( D3DFORMAT format ); + D3DFORMAT GetSelectedDepthStencilBufferFormat(); + + void AddMultisampleType( D3DMULTISAMPLE_TYPE type ); + D3DMULTISAMPLE_TYPE GetSelectedMultisampleType(); + + void AddMultisampleQuality( DWORD dwQuality ); + DWORD GetSelectedMultisampleQuality(); + + void AddVertexProcessingType( DWORD dwType ); + DWORD GetSelectedVertexProcessingType(); + + DWORD GetSelectedPresentInterval(); + + void SetDeviceClip( bool bDeviceClip ); + bool IsDeviceClip(); + + // D3D11 + void AddD3D11DeviceType( D3D_DRIVER_TYPE devType ); + D3D_DRIVER_TYPE GetSelectedD3D11DeviceType(); + + void AddD3D11AdapterOutput( const WCHAR* strName, UINT nOutput ); + UINT GetSelectedD3D11AdapterOutput(); + + void AddD3D11Resolution( DWORD dwWidth, DWORD dwHeight ); + void GetSelectedD3D11Resolution( DWORD* pdwWidth, DWORD* pdwHeight ); + + void AddD3D11FeatureLevel(D3D_FEATURE_LEVEL); + D3D_FEATURE_LEVEL GetSelectedFeatureLevel(); + + void AddD3D11RefreshRate( DXGI_RATIONAL RefreshRate ); + DXGI_RATIONAL GetSelectedD3D11RefreshRate(); + + void AddD3D11BackBufferFormat( DXGI_FORMAT format ); + DXGI_FORMAT GetSelectedD3D11BackBufferFormat(); + + void AddD3D11MultisampleCount( UINT count ); + UINT GetSelectedD3D11MultisampleCount(); + + void AddD3D11MultisampleQuality( UINT Quality ); + UINT GetSelectedD3D11MultisampleQuality(); + + DWORD GetSelectedD3D11PresentInterval(); + bool GetSelectedDebugDeviceValue(); + + + + HRESULT OnD3D11ResolutionChanged (); + HRESULT OnAPIVersionChanged( bool bRefresh=false ); + HRESULT OnFeatureLevelChanged(); + HRESULT OnAdapterChanged(); + HRESULT OnDeviceTypeChanged(); + HRESULT OnWindowedFullScreenChanged(); + HRESULT OnAdapterOutputChanged(); + HRESULT OnAdapterFormatChanged(); + HRESULT OnResolutionChanged(); + HRESULT OnRefreshRateChanged(); + HRESULT OnBackBufferFormatChanged(); + HRESULT OnDepthStencilBufferFormatChanged(); + HRESULT OnMultisampleTypeChanged(); + HRESULT OnMultisampleQualityChanged(); + HRESULT OnVertexProcessingChanged(); + HRESULT OnPresentIntervalChanged(); + HRESULT OnDebugDeviceChanged(); + HRESULT OnDeviceClipChanged(); + + void UpdateModeChangeTimeoutText( int nSecRemaining ); + + IDirect3DStateBlock9* m_pStateBlock; + CDXUTDialog* m_pActiveDialog; + CDXUTDialog m_Dialog; + CDXUTDialog m_RevertModeDialog; + int m_nRevertModeTimeout; + UINT m_nIDEvent; + bool m_bActive; + + D3D_FEATURE_LEVEL m_Levels[TOTAL_FEATURE_LEVLES]; + +}; + + +CD3DSettingsDlg* WINAPI DXUTGetD3DSettingsDialog(); + + + +#endif + diff --git a/Demos/DX11ClothDemo/DXUT/Optional/ImeUi.cpp b/Demos/DX11ClothDemo/DXUT/Optional/ImeUi.cpp new file mode 100644 index 000000000..912c6d6ad --- /dev/null +++ b/Demos/DX11ClothDemo/DXUT/Optional/ImeUi.cpp @@ -0,0 +1,3662 @@ +//-------------------------------------------------------------------------------------- +// File: ImeUi.cpp +// +// Copyright (c) Microsoft Corporation. All rights reserved. +//-------------------------------------------------------------------------------------- +#include "dxut.h" +#include "ImeUi.h" +#include +#include +#include +#include + +// Ignore typecast warnings +#pragma warning( disable : 4312 ) +#pragma warning( disable : 4244 ) +#pragma warning( disable : 4311 ) + + +#define MAX_CANDIDATE_LENGTH 256 +#define COUNTOF(a) ( sizeof( a ) / sizeof( ( a )[0] ) ) +#define POSITION_UNINITIALIZED ((DWORD)-1) + +#define LANG_CHT MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL) +#define LANG_CHS MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED) + +#define MAKEIMEVERSION(major,minor) ( (DWORD)( ( (BYTE)( major ) << 24 ) | ( (BYTE)( minor ) << 16 ) ) ) +#define IMEID_VER(dwId) ( ( dwId ) & 0xffff0000 ) +#define IMEID_LANG(dwId) ( ( dwId ) & 0x0000ffff ) + +#define _CHT_HKL_DAYI ( (HKL)0xE0060404 ) // DaYi +#define _CHT_HKL_NEW_PHONETIC ( (HKL)0xE0080404 ) // New Phonetic +#define _CHT_HKL_NEW_CHANG_JIE ( (HKL)0xE0090404 ) // New Chang Jie +#define _CHT_HKL_NEW_QUICK ( (HKL)0xE00A0404 ) // New Quick +#define _CHT_HKL_HK_CANTONESE ( (HKL)0xE00B0404 ) // Hong Kong Cantonese +#define _CHT_IMEFILENAME "TINTLGNT.IME" // New Phonetic +#define _CHT_IMEFILENAME2 "CINTLGNT.IME" // New Chang Jie +#define _CHT_IMEFILENAME3 "MSTCIPHA.IME" // Phonetic 5.1 +#define IMEID_CHT_VER42 ( LANG_CHT | MAKEIMEVERSION( 4, 2 ) ) // New(Phonetic/ChanJie)IME98 : 4.2.x.x // Win98 +#define IMEID_CHT_VER43 ( LANG_CHT | MAKEIMEVERSION( 4, 3 ) ) // New(Phonetic/ChanJie)IME98a : 4.3.x.x // Win2k +#define IMEID_CHT_VER44 ( LANG_CHT | MAKEIMEVERSION( 4, 4 ) ) // New ChanJie IME98b : 4.4.x.x // WinXP +#define IMEID_CHT_VER50 ( LANG_CHT | MAKEIMEVERSION( 5, 0 ) ) // New(Phonetic/ChanJie)IME5.0 : 5.0.x.x // WinME +#define IMEID_CHT_VER51 ( LANG_CHT | MAKEIMEVERSION( 5, 1 ) ) // New(Phonetic/ChanJie)IME5.1 : 5.1.x.x // IME2002(w/OfficeXP) +#define IMEID_CHT_VER52 ( LANG_CHT | MAKEIMEVERSION( 5, 2 ) ) // New(Phonetic/ChanJie)IME5.2 : 5.2.x.x // IME2002a(w/WinXP) +#define IMEID_CHT_VER60 ( LANG_CHT | MAKEIMEVERSION( 6, 0 ) ) // New(Phonetic/ChanJie)IME6.0 : 6.0.x.x // New IME 6.0(web download) +#define IMEID_CHT_VER_VISTA ( LANG_CHT | MAKEIMEVERSION( 7, 0 ) ) // All TSF TIP under Cicero UI-less mode: a hack to make GetImeId() return non-zero value + +#define _CHS_HKL ( (HKL)0xE00E0804 ) // MSPY +#define _CHS_IMEFILENAME "PINTLGNT.IME" // MSPY1.5/2/3 +#define _CHS_IMEFILENAME2 "MSSCIPYA.IME" // MSPY3 for OfficeXP +#define IMEID_CHS_VER41 ( LANG_CHS | MAKEIMEVERSION( 4, 1 ) ) // MSPY1.5 // SCIME97 or MSPY1.5 (w/Win98, Office97) +#define IMEID_CHS_VER42 ( LANG_CHS | MAKEIMEVERSION( 4, 2 ) ) // MSPY2 // Win2k/WinME +#define IMEID_CHS_VER53 ( LANG_CHS | MAKEIMEVERSION( 5, 3 ) ) // MSPY3 // WinXP + +static CHAR signature[] = "%%%IMEUILIB:070111%%%"; + +static IMEUI_APPEARANCE gSkinIME = +{ + 0, // symbolColor; + 0x404040, // symbolColorOff; + 0xff000000, // symbolColorText; + 24, // symbolHeight; + 0xa0, // symbolTranslucence; + 0, // symbolPlacement; + NULL, // symbolFont; + 0xffffffff, // candColorBase; + 0xff000000, // candColorBorder; + 0, // candColorText; + 0x00ffff00, // compColorInput; + 0x000000ff, // compColorTargetConv; + 0x0000ff00, // compColorConverted; + 0x00ff0000, // compColorTargetNotConv; + 0x00ff0000, // compColorInputErr; + 0x80, // compTranslucence; + 0, // compColorText; + 2, // caretWidth; + 1, // caretYMargin; +}; + +struct _SkinCompStr +{ + DWORD colorInput; + DWORD colorTargetConv; + DWORD colorConverted; + DWORD colorTargetNotConv; + DWORD colorInputErr; +}; + +_SkinCompStr gSkinCompStr; + +// Definition from Win98DDK version of IMM.H +typedef struct +tagINPUTCONTEXT2 +{ + HWND hWnd; + BOOL fOpen; + POINT ptStatusWndPos; + POINT ptSoftKbdPos; + DWORD fdwConversion; + DWORD fdwSentence; + union + { + LOGFONTA A; + LOGFONTW W; + } lfFont; + COMPOSITIONFORM cfCompForm; + CANDIDATEFORM cfCandForm[4]; + HIMCC hCompStr; + HIMCC hCandInfo; + HIMCC hGuideLine; + HIMCC hPrivate; + DWORD dwNumMsgBuf; + HIMCC hMsgBuf; + DWORD fdwInit; + DWORD dwReserve[3]; +} +INPUTCONTEXT2, *PINPUTCONTEXT2, NEAR *NPINPUTCONTEXT2, +FAR* LPINPUTCONTEXT2; + + +// Class to disable Cicero in case ImmDisableTextFrameService() doesn't disable it completely +class CDisableCicero +{ +public: + CDisableCicero() : m_ptim( NULL ), + m_bComInit( false ) + { + } + ~CDisableCicero() + { + Uninitialize(); + } + void Initialize() + { + if( m_bComInit ) + { + return; + } + HRESULT hr; + hr = CoInitializeEx( NULL, COINIT_APARTMENTTHREADED ); + if( SUCCEEDED( hr ) ) + { + m_bComInit = true; + hr = CoCreateInstance( CLSID_TF_ThreadMgr, + NULL, + CLSCTX_INPROC_SERVER, + __uuidof( ITfThreadMgr ), + ( void** )&m_ptim ); + } + } + void Uninitialize() + { + if( m_ptim ) + { + m_ptim->Release(); + m_ptim = NULL; + } + if( m_bComInit ) + CoUninitialize(); + m_bComInit = false; + } + + void DisableCiceroOnThisWnd( HWND hwnd ) + { + if( m_ptim == NULL ) + return; + ITfDocumentMgr* pdimPrev; // the dim that is associated previously. + // Associate NULL dim to the window. + // When this window gets the focus, Cicero does not work and IMM32 IME + // will be activated. + if( SUCCEEDED( m_ptim->AssociateFocus( hwnd, NULL, &pdimPrev ) ) ) + { + if( pdimPrev ) + pdimPrev->Release(); + } + } +private: + ITfThreadMgr* m_ptim; + bool m_bComInit; +}; +static CDisableCicero g_disableCicero; + +#define _IsLeadByte(x) ( LeadByteTable[(BYTE)( x )] ) +static void _PumpMessage(); +static BYTE LeadByteTable[256]; +#define _ImmGetContext ImmGetContext +#define _ImmReleaseContext ImmReleaseContext +#define _ImmAssociateContext ImmAssociateContext +static LONG ( WINAPI* _ImmGetCompositionString )( HIMC himc, DWORD dwIndex, LPVOID lpBuf, DWORD dwBufLen ); +#define _ImmGetOpenStatus ImmGetOpenStatus +#define _ImmSetOpenStatus ImmSetOpenStatus +#define _ImmGetConversionStatus ImmGetConversionStatus +static DWORD ( WINAPI* _ImmGetCandidateList )( HIMC himc, DWORD deIndex, LPCANDIDATELIST lpCandList, DWORD dwBufLen ); +static LPINPUTCONTEXT2 ( WINAPI* _ImmLockIMC )( HIMC hIMC ); +static BOOL ( WINAPI* _ImmUnlockIMC )( HIMC hIMC ); +static LPVOID ( WINAPI* _ImmLockIMCC )( HIMCC hIMCC ); +static BOOL ( WINAPI* _ImmUnlockIMCC )( HIMCC hIMCC ); +#define _ImmGetDefaultIMEWnd ImmGetDefaultIMEWnd +#define _ImmGetIMEFileNameA ImmGetIMEFileNameA +#define _ImmGetVirtualKey ImmGetVirtualKey +#define _ImmNotifyIME ImmNotifyIME +#define _ImmSetConversionStatus ImmSetConversionStatus +#define _ImmSimulateHotKey ImmSimulateHotKey +#define _ImmIsIME ImmIsIME + +// private API provided by CHT IME. Available on version 6.0 or later. +UINT ( WINAPI*_GetReadingString )( HIMC himc, UINT uReadingBufLen, LPWSTR lpwReadingBuf, PINT pnErrorIndex, + BOOL* pfIsVertical, PUINT puMaxReadingLen ); +BOOL ( WINAPI*_ShowReadingWindow )( HIMC himc, BOOL bShow ); + +// Callbacks +void ( CALLBACK*ImeUiCallback_DrawRect )( int x1, int y1, int x2, int y2, DWORD color ); +void ( CALLBACK*ImeUiCallback_DrawFans )( const IMEUI_VERTEX* paVertex, UINT uNum ); +void* ( __cdecl*ImeUiCallback_Malloc )( size_t bytes ); +void ( __cdecl*ImeUiCallback_Free )( void* ptr ); +void ( CALLBACK*ImeUiCallback_OnChar )( WCHAR wc ); + +static void (*_SendCompString )(); +static LRESULT ( WINAPI* _SendMessage )( HWND hwnd, UINT msg, WPARAM wp, LPARAM lp ) = SendMessageA; +static DWORD (* _GetCandidateList )( HIMC himc, DWORD dwIndex, LPCANDIDATELIST* ppCandList ); + +static HWND g_hwndMain; +static HWND g_hwndCurr; +static HIMC g_himcOrg; +static bool g_bImeEnabled = false; +static TCHAR g_szCompositionString[256]; +static BYTE g_szCompAttrString[256]; +static DWORD g_IMECursorBytes = 0; +static DWORD g_IMECursorChars = 0; +static TCHAR g_szCandidate[MAX_CANDLIST][MAX_CANDIDATE_LENGTH]; +static DWORD g_dwSelection, g_dwCount; +static UINT g_uCandPageSize; +static DWORD g_bDisableImeCompletely = false; +static DWORD g_dwIMELevel; +static DWORD g_dwIMELevelSaved; +static TCHAR g_szMultiLineCompString[ 256 *( 3 - sizeof( TCHAR ) ) ]; +static bool g_bReadingWindow = false; +static bool g_bHorizontalReading = false; +static bool g_bVerticalCand = true; +static UINT g_uCaretBlinkTime = 0; +static UINT g_uCaretBlinkLast = 0; +static bool g_bCaretDraw = false; +static bool g_bChineseIME; +static bool g_bInsertMode = true; +static TCHAR g_szReadingString[32]; // Used only in case of horizontal reading window +static int g_iReadingError; // Used only in case of horizontal reading window +static UINT g_screenWidth, g_screenHeight; +static DWORD g_dwPrevFloat; +static bool bIsSendingKeyMessage = false; +static OSVERSIONINFOA g_osi; +static bool g_bInitialized = false; +static bool g_bCandList = false; +static DWORD g_dwCandX, g_dwCandY; +static DWORD g_dwCaretX, g_dwCaretY; +static DWORD g_hCompChar; +static int g_iCandListIndexBase; +static DWORD g_dwImeUiFlags = IMEUI_FLAG_SUPPORT_CARET; +static bool g_bUILessMode = false; +static HMODULE g_hImmDll = NULL; + +#define IsNT() (g_osi.dwPlatformId == VER_PLATFORM_WIN32_NT) + +struct CompStringAttribute +{ + UINT caretX; + UINT caretY; + CImeUiFont_Base* pFont; + DWORD colorComp; + DWORD colorCand; + RECT margins; +}; + +static CompStringAttribute g_CaretInfo; +static DWORD g_dwState = IMEUI_STATE_OFF; +static DWORD swirl = 0; +static double lastSwirl; + +#define INDICATOR_NON_IME 0 +#define INDICATOR_CHS 1 +#define INDICATOR_CHT 2 +#define INDICATOR_KOREAN 3 +#define INDICATOR_JAPANESE 4 + +#define GETLANG() LOWORD(g_hklCurrent) +#define GETPRIMLANG() ((WORD)PRIMARYLANGID(GETLANG())) +#define GETSUBLANG() SUBLANGID(GETLANG()) + +#define LANG_CHS MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED) +#define LANG_CHT MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL) + +static HKL g_hklCurrent = 0; +static UINT g_uCodePage = 0; +static LPTSTR g_aszIndicator[] = +{ + TEXT( "A" ), +#ifdef UNICODE + L"\x7B80", + L"\x7E41", + L"\xac00", + L"\x3042", +#else + "\xd6\xd0", + "\xa4\xa4", + "\xb0\xa1", + "\x82\xa0", +#endif +}; +static LPTSTR g_pszIndicatior = g_aszIndicator[0]; + +static void GetReadingString( HWND hWnd ); +static DWORD GetImeId( UINT uIndex = 0 ); +static void CheckToggleState(); +static void DrawImeIndicator(); +static void DrawCandidateList(); +static void DrawCompositionString( bool bDrawCompAttr ); +static void GetReadingWindowOrientation( DWORD dwId ); +static void OnInputLangChangeWorker(); +static void OnInputLangChange(); +static void SetImeApi(); +static void CheckInputLocale(); +static void SetSupportLevel( DWORD dwImeLevel ); +void ImeUi_SetSupportLevel( DWORD dwImeLevel ); + + +// +// local helper functions +// +inline LRESULT SendKeyMsg( HWND hwnd, UINT msg, WPARAM wp ) +{ + bIsSendingKeyMessage = true; + LRESULT lRc = _SendMessage( hwnd, msg, wp, 1 ); + bIsSendingKeyMessage = false; + return lRc; +} +#define SendKeyMsg_DOWN(hwnd,vk) SendKeyMsg(hwnd, WM_KEYDOWN, vk) +#define SendKeyMsg_UP(hwnd,vk) SendKeyMsg(hwnd, WM_KEYUP, vk) + +/////////////////////////////////////////////////////////////////////////////// +// +// CTsfUiLessMode +// Handles IME events using Text Service Framework (TSF). Before Vista, +// IMM (Input Method Manager) API has been used to handle IME events and +// inqueries. Some IMM functions lose backward compatibility due to design +// of TSF, so we have to use new TSF interfaces. +// +/////////////////////////////////////////////////////////////////////////////// +class CTsfUiLessMode +{ +protected: + // Sink receives event notifications + class CUIElementSink : public ITfUIElementSink, + public ITfInputProcessorProfileActivationSink, + public ITfCompartmentEventSink + { + public: + CUIElementSink(); + ~CUIElementSink(); + + // IUnknown + STDMETHODIMP QueryInterface( REFIID riid, void** ppvObj ); + STDMETHODIMP_( ULONG ) + AddRef( void ); + STDMETHODIMP_( ULONG ) + Release( void ); + + // ITfUIElementSink + // Notifications for Reading Window events. We could process candidate as well, but we'll use IMM for simplicity sake. + STDMETHODIMP BeginUIElement( DWORD dwUIElementId, BOOL* pbShow ); + STDMETHODIMP UpdateUIElement( DWORD dwUIElementId ); + STDMETHODIMP EndUIElement( DWORD dwUIElementId ); + + // ITfInputProcessorProfileActivationSink + // Notification for keyboard input locale change + STDMETHODIMP OnActivated( DWORD dwProfileType, LANGID langid, REFCLSID clsid, REFGUID catid, + REFGUID guidProfile, HKL hkl, DWORD dwFlags ); + + // ITfCompartmentEventSink + // Notification for open mode (toggle state) change + STDMETHODIMP OnChange( REFGUID rguid ); + + private: + LONG _cRef; + }; + + static void MakeReadingInformationString( ITfReadingInformationUIElement* preading ); + static void MakeCandidateStrings( ITfCandidateListUIElement* pcandidate ); + static ITfUIElement* GetUIElement( DWORD dwUIElementId ); + static BOOL GetCompartments( ITfCompartmentMgr** ppcm, ITfCompartment** ppTfOpenMode, + ITfCompartment** ppTfConvMode ); + static BOOL SetupCompartmentSinks( BOOL bResetOnly = FALSE, ITfCompartment* pTfOpenMode = NULL, + ITfCompartment* ppTfConvMode = NULL ); + + static ITfThreadMgrEx* m_tm; + static DWORD m_dwUIElementSinkCookie; + static DWORD m_dwAlpnSinkCookie; + static DWORD m_dwOpenModeSinkCookie; + static DWORD m_dwConvModeSinkCookie; + static CUIElementSink* m_TsfSink; + static int m_nCandidateRefCount; // Some IME shows multiple candidate lists but the Library doesn't support multiple candidate list. + // So track open / close events to make sure the candidate list opened last is shown. + CTsfUiLessMode() + { + } // this class can't be instanciated + +public: + static BOOL SetupSinks(); + static void ReleaseSinks(); + static BOOL CurrentInputLocaleIsIme(); + static void UpdateImeState( BOOL bResetCompartmentEventSink = FALSE ); + static void EnableUiUpdates( bool bEnable ); +}; + +ITfThreadMgrEx* CTsfUiLessMode::m_tm; +DWORD CTsfUiLessMode::m_dwUIElementSinkCookie = TF_INVALID_COOKIE; +DWORD CTsfUiLessMode::m_dwAlpnSinkCookie = TF_INVALID_COOKIE; +DWORD CTsfUiLessMode::m_dwOpenModeSinkCookie = TF_INVALID_COOKIE; +DWORD CTsfUiLessMode::m_dwConvModeSinkCookie = TF_INVALID_COOKIE; +CTsfUiLessMode::CUIElementSink* CTsfUiLessMode::m_TsfSink = NULL; +int CTsfUiLessMode::m_nCandidateRefCount = NULL; + +static unsigned long _strtoul( LPCSTR psz, LPTSTR*, int ) +{ + if( !psz ) + return 0; + + ULONG ulRet = 0; + if( psz[0] == '0' && ( psz[1] == 'x' || psz[1] == 'X' ) ) + { + psz += 2; + ULONG ul = 0; + while( *psz ) + { + if( '0' <= *psz && *psz <= '9' ) + ul = *psz - '0'; + else if( 'A' <= *psz && *psz <= 'F' ) + ul = *psz - 'A' + 10; + else if( 'a' <= *psz && *psz <= 'f' ) + ul = *psz - 'a' + 10; + else + break; + ulRet = ulRet * 16 + ul; + psz++; + } + } + else + { + while( *psz && ( '0' <= *psz && *psz <= '9' ) ) + { + ulRet = ulRet * 10 + ( *psz - '0' ); + psz++; + } + } + return ulRet; +} + +#ifdef UNICODE +#define GetCharCount(psz) lstrlen(psz) +#define GetCharCountFromBytes(psz,iBytes) (iBytes) +static void AW_SendCompString() +{ + int i, iLen; + if ( ImeUiCallback_OnChar ) + { + for ( i = 0; g_szCompositionString[i]; i++ ) + { + ImeUiCallback_OnChar( g_szCompositionString[i] ); + } + return; + } + + BYTE szCompStr[COUNTOF(g_szCompositionString) * 2]; + iLen = WideCharToMultiByte(g_uCodePage, 0, g_szCompositionString, -1, + (LPSTR)szCompStr, COUNTOF(szCompStr), NULL, NULL) - 1; // don't need to send NUL terminator; + for (i = 0; i < iLen; i++) + { + SendKeyMsg(g_hwndCurr, WM_CHAR, szCompStr[i]); + } +} + +// The following AW_Imm* functions are there to support Win95/98 first version. +// They can be deleted if the game doesn't supports them (i.e. games requires Win98 SE or later). +static DWORD AW_GetCandidateList(HIMC himc, DWORD dwIndex, LPCANDIDATELIST* ppCandList) +{ + DWORD dwBufLen = ImmGetCandidateListA( himc, dwIndex, NULL, 0 ); + if (dwBufLen) + { + LPCANDIDATELIST pCandList = (LPCANDIDATELIST)ImeUiCallback_Malloc(dwBufLen); + if (pCandList) { + dwBufLen = ImmGetCandidateListA( himc, dwIndex, pCandList, dwBufLen ); + if (dwBufLen) { + int i; + int wideBufLen = 0; + for (i = 0; i < (int)pCandList->dwCount; i++) { + wideBufLen += MultiByteToWideChar(g_uCodePage, 0, (LPSTR)pCandList + pCandList->dwOffset[i], -1, NULL, 0) * sizeof(WCHAR); + } + wideBufLen += pCandList->dwOffset[0]; + *ppCandList = (LPCANDIDATELIST)ImeUiCallback_Malloc(wideBufLen); + LPCANDIDATELIST pCandListW = *ppCandList; + memcpy(pCandListW, pCandList, pCandList->dwOffset[0]); + LPWSTR pwz = (LPWSTR)((LPSTR)pCandListW + pCandList->dwOffset[0]); + for (i = 0; i < (int)pCandList->dwCount; i++) { + pCandListW->dwOffset[i] = (LPSTR)pwz - (LPSTR)pCandListW; + pwz += MultiByteToWideChar(g_uCodePage, 0, (LPSTR)pCandList + pCandList->dwOffset[i], -1, pwz, 256); + } + dwBufLen = wideBufLen; + } + ImeUiCallback_Free(pCandList); + } + } + return dwBufLen; +} + +static LONG WINAPI AW_ImmGetCompositionString(HIMC himc, DWORD dwIndex, LPVOID lpBuf, DWORD dwBufLen) +{ + char pszMb[COUNTOF(g_szCompositionString) * 2]; + DWORD dwRet = ImmGetCompositionStringA(himc, dwIndex, pszMb, sizeof(pszMb)); + switch (dwIndex) { + case GCS_RESULTSTR: + case GCS_COMPSTR: + if (dwRet) { + pszMb[dwRet] = 0; + dwRet = (DWORD)MultiByteToWideChar(g_uCodePage, 0, pszMb, -1, (LPWSTR)lpBuf, dwBufLen); + if (dwRet) { + // Note that ImmGetCompositionString() returns number of bytes copied, regardless of the width of character. + dwRet = (dwRet - 1) * sizeof(WCHAR); + } + } + break; + case GCS_CURSORPOS: + dwRet /= 2; + break; + case GCS_COMPATTR: { + char pszMb2[COUNTOF(g_szCompositionString) * 2]; + DWORD dwRet2 = ImmGetCompositionStringA(himc, GCS_COMPSTR, pszMb2, sizeof(pszMb2)); + if (!dwRet2) { + dwRet2 = ImmGetCompositionStringA(himc, GCS_RESULTSTR, pszMb2, sizeof(pszMb2)); + if (!dwRet2) { + return 0; + } + } + char* pOut = (char*)lpBuf; + for (DWORD i = 0; i < dwRet; i++) { + *pOut++ = pszMb[i]; // copy attribute + if (_IsLeadByte(pszMb2[i])) + i++; + } + dwRet = pOut - (char*)lpBuf; + } + break; + } + return dwRet; +} + +#else // !UNICODE +// returns number of characters from number of bytes +static int GetCharCountFromBytes( LPCSTR pszString, int iBytes ) +{ + int iCount = 0; + int i; + for( i = 0; pszString[i] && i < iBytes; i++ ) + { + iCount++; + if( _IsLeadByte(pszString[i]) ) + i++; + } + if( i != iBytes ) + iCount = -iCount; // indicate error - iBytes specifies wrong boundary (i.e. the last byte is leadbyte) + return iCount; +} + +static int GetCharCount( LPTSTR psz ) +{ + int i = 0; + while( *psz ) + { + if( _IsLeadByte(*psz) ) + { + psz++; + } + psz++; + i++; + } + return i; +} + +static DWORD WA_GetCandidateList( HIMC himc, DWORD dwIndex, LPCANDIDATELIST* ppCandList ) +{ + DWORD dwBufLen = ImmGetCandidateListW( himc, dwIndex, NULL, 0 ); + if( dwBufLen ) + { + LPCANDIDATELIST pCandList = ( LPCANDIDATELIST )ImeUiCallback_Malloc( dwBufLen ); + if( pCandList ) + { + dwBufLen = ImmGetCandidateListW( himc, dwIndex, pCandList, dwBufLen ); + if( dwBufLen ) + { + int i; + int mbBufLen = 0; + for( i = 0; i < ( int )pCandList->dwCount; i++ ) + { + mbBufLen += WideCharToMultiByte( g_uCodePage, 0, ( LPWSTR )( ( LPSTR )pCandList + + pCandList->dwOffset[i] ), -1, NULL, 0, + NULL, NULL ); + } + mbBufLen += pCandList->dwOffset[0]; + *ppCandList = ( LPCANDIDATELIST )ImeUiCallback_Malloc( mbBufLen ); + LPCANDIDATELIST pCandListA = *ppCandList; + memcpy( pCandListA, pCandList, pCandList->dwOffset[0] ); + LPSTR psz = ( LPSTR )pCandListA + pCandList->dwOffset[0]; + for( i = 0; i < ( int )pCandList->dwCount; i++ ) + { + pCandListA->dwOffset[i] = ( LPSTR )psz - ( LPSTR )pCandListA; + psz += WideCharToMultiByte( g_uCodePage, 0, ( LPWSTR )( ( LPSTR )pCandList + + pCandList->dwOffset[i] ), -1, psz, 256, + NULL, NULL ); + } + dwBufLen = mbBufLen; + } + ImeUiCallback_Free( pCandList ); + } + } + return dwBufLen; +} + +static LONG WINAPI WA_ImmGetCompositionString( HIMC himc, DWORD dwIndex, LPVOID lpBuf, DWORD dwBufLen ) +{ + WCHAR pwzUc[COUNTOF(g_szCompositionString)]; + DWORD dwRet = ImmGetCompositionStringW( himc, dwIndex, pwzUc, sizeof( pwzUc ) ); + switch( dwIndex ) + { + case GCS_RESULTSTR: + case GCS_COMPSTR: + if( dwRet ) + { + pwzUc[dwRet / sizeof( WCHAR )] = 0; + dwRet = ( DWORD )WideCharToMultiByte( g_uCodePage, 0, pwzUc, -1, ( LPSTR )lpBuf, dwBufLen, NULL, + NULL ); + if( dwRet ) + { + dwRet = dwRet - 1; + } + } + break; + + case GCS_CURSORPOS: + { + WCHAR pwzUc2[COUNTOF(g_szCompositionString)]; + DWORD dwRet2 = ImmGetCompositionStringW( himc, GCS_COMPSTR, pwzUc2, sizeof( pwzUc2 ) ); + if( !dwRet2 ) + { + dwRet2 = ImmGetCompositionStringW( himc, GCS_RESULTSTR, pwzUc2, sizeof( pwzUc2 ) ); + if( !dwRet2 ) + { + return 0; + } + } + dwRet2 /= 2; + //The return value of WideCharToMultiByte() should probably be checked/asserted for success. + //bounds violation (overflow) 'pszMb[iRc]' + const int bufSize = COUNTOF(g_szCompositionString) * 2; + char pszMb[bufSize]; + int iRc = WideCharToMultiByte( g_uCodePage, 0, pwzUc2, dwRet2, pszMb, sizeof( pszMb ), NULL, NULL ); + assert( iRc > 0 ); //WideCharToMultiByte returns 0 if it failed, and it should *never* be negative in the first place + if( iRc >= bufSize ) //if we wrote more bytes than the length of the buffer, we need to terminate it + { + pszMb[ bufSize - 1] = 0; //0 terminate the end of the buffer + } + else + { + pszMb[ iRc ] = 0; + } + char* psz = pszMb; + for( dwRet2 = 0; dwRet2 != dwRet; dwRet2++ ) + { + if( _IsLeadByte( *psz ) ) + psz++; + psz++; + } + dwRet = psz - pszMb; + } + break; + + case GCS_COMPATTR: + { + WCHAR pwzUc2[COUNTOF(g_szCompositionString)]; + DWORD dwRet2 = ImmGetCompositionStringW( himc, GCS_COMPSTR, pwzUc2, sizeof( pwzUc2 ) ); + if( !dwRet2 ) + { + dwRet2 = ImmGetCompositionStringW( himc, GCS_RESULTSTR, pwzUc2, sizeof( pwzUc2 ) ); + if( !dwRet2 ) + { + return 0; + } + } + dwRet2 /= 2; + const int bufSize = COUNTOF(g_szCompositionString) * 2; + char pszMb[bufSize]; + int iRc = WideCharToMultiByte( g_uCodePage, 0, pwzUc2, dwRet2, pszMb, sizeof( pszMb ), NULL, NULL ); + assert( iRc > 0 ); //WideCharToMultiByte returns 0 if it failed, and it should *never* be negative in the first place + if( iRc >= bufSize ) //if we wrote more bytes than the length of the buffer, we need to terminate it + { + pszMb[ bufSize - 1] = 0; //0 terminate the end of the buffer + } + else + { + pszMb[ iRc ] = 0; + } + char* pSrc = ( char* )pwzUc; + char* pOut = ( char* )lpBuf; + for( char* psz = pszMb; *psz; psz++, pSrc++ ) + { + *pOut++ = *pSrc; // copy attribute + if( _IsLeadByte( *psz ) ) + { + *pOut++ = *pSrc; + psz++; + } + // buffer overrun protection, pOut is incremented in the loop, but not part of the + // loop invariant test. To make the code more readable we have a test rather than + // rolling this into the for stmt. + if( ( DWORD )( pOut - ( char* )lpBuf ) >= dwBufLen ) + break; + } + dwRet = pOut - ( char* )lpBuf; + } + break; + } + return dwRet; +} + +#endif // UNICODE + +static void ComposeCandidateLine( int index, LPCTSTR pszCandidate ) +{ + LPTSTR psz = g_szCandidate[index]; + *psz++ = ( TCHAR )( TEXT( '0' ) + ( ( index + g_iCandListIndexBase ) % 10 ) ); + if( g_bVerticalCand ) + { + *psz++ = TEXT( ' ' ); + } + while( *pszCandidate && ( COUNTOF(g_szCandidate[index]) > ( psz - g_szCandidate[index] ) ) ) + { + *psz++ = *pszCandidate++; + } + *psz = 0; +} + +static void SendCompString() +{ + int i, iLen = lstrlen( g_szCompositionString ); + if( ImeUiCallback_OnChar ) + { + LPCWSTR pwz; +#ifdef UNICODE + pwz = g_szCompositionString; +#else + WCHAR szUnicode[COUNTOF( g_szCompositionString ) ]; + pwz = szUnicode; + iLen = MultiByteToWideChar( g_uCodePage, 0, g_szCompositionString, -1, szUnicode, COUNTOF(szUnicode) ) - 1; +#endif + for( i = 0; i < iLen; i++ ) + { + ImeUiCallback_OnChar( pwz[i] ); + } + return; + } + for( i = 0; i < iLen; i++ ) + { + SendKeyMsg( g_hwndCurr, WM_CHAR, +#ifdef UNICODE + (WPARAM)g_szCompositionString[i] +#else + ( WPARAM )( BYTE )g_szCompositionString[i] +#endif + ); + } +} + +static DWORD GetCandidateList( HIMC himc, DWORD dwIndex, LPCANDIDATELIST* ppCandList ) +{ + DWORD dwBufLen = _ImmGetCandidateList( himc, dwIndex, NULL, 0 ); + if( dwBufLen ) + { + *ppCandList = ( LPCANDIDATELIST )ImeUiCallback_Malloc( dwBufLen ); + dwBufLen = _ImmGetCandidateList( himc, dwIndex, *ppCandList, dwBufLen ); + } + return dwBufLen; +} + +static void SendControlKeys( UINT vk, UINT num ) +{ + if( num == 0 ) + return; + for( UINT i = 0; i < num; i++ ) + { + SendKeyMsg_DOWN(g_hwndCurr, vk); + } + SendKeyMsg_UP(g_hwndCurr, vk); +} + +// send key messages to erase composition string. +static void CancelCompString( HWND hwnd, bool bUseBackSpace = true, int iNewStrLen = 0 ) +{ + if( g_dwIMELevel != 3 ) + return; + int cc = GetCharCount( g_szCompositionString ); + int i; + // move caret to the end of composition string + SendControlKeys( VK_RIGHT, cc - g_IMECursorChars ); + + if( bUseBackSpace || g_bInsertMode ) + iNewStrLen = 0; + + // The caller sets bUseBackSpace to false if there's possibility of sending + // new composition string to the app right after this function call. + // + // If the app is in overwriting mode and new comp string is + // shorter than current one, delete previous comp string + // till it's same long as the new one. Then move caret to the beginning of comp string. + // New comp string will overwrite old one. + if( iNewStrLen < cc ) + { + for( i = 0; i < cc - iNewStrLen; i++ ) + { + SendKeyMsg_DOWN(hwnd, VK_BACK); + SendKeyMsg( hwnd, WM_CHAR, 8 ); //Backspace character + } + SendKeyMsg_UP(hwnd, VK_BACK); + } + else + iNewStrLen = cc; + + SendControlKeys( VK_LEFT, iNewStrLen ); +} + +// initialize composition string data. +static void InitCompStringData( void ) +{ + g_IMECursorBytes = 0; + g_IMECursorChars = 0; + memset( &g_szCompositionString, 0, sizeof( g_szCompositionString ) ); + memset( &g_szCompAttrString, 0, sizeof( g_szCompAttrString ) ); +} + +static void DrawCaret( DWORD x, DWORD y, DWORD height ) +{ + if( g_bCaretDraw && ImeUiCallback_DrawRect ) + ImeUiCallback_DrawRect( x, y + gSkinIME.caretYMargin, x + gSkinIME.caretWidth, + y + height - gSkinIME.caretYMargin, g_CaretInfo.colorComp ); +} + +// +// Apps that draw the composition string on top of composition string attribute +// in level 3 support should call this function twice in rendering a frame. +// // Draw edit box UI; +// ImeUi_RenderUI(true, false); // paint composition string attribute; +// // Draw text in the edit box; +// ImeUi_RenderUi(false, true); // paint the rest of IME UI; +// +void ImeUi_RenderUI( bool bDrawCompAttr, bool bDrawOtherUi ) +{ + if( !g_bInitialized || !g_bImeEnabled || !g_CaretInfo.pFont ) + return; + if( !bDrawCompAttr && !bDrawOtherUi ) + return; // error case + if( g_dwIMELevel == 2 ) + { + if( !bDrawOtherUi ) + return; // 1st call for level 3 support + } + + if( bDrawOtherUi ) + DrawImeIndicator(); + + DrawCompositionString( bDrawCompAttr ); + + if( bDrawOtherUi ) + DrawCandidateList(); +} + +static void DrawImeIndicator() +{ + bool bOn = g_dwState != IMEUI_STATE_OFF; + + IMEUI_VERTEX PieData[17]; + float SizeOfPie = ( float )gSkinIME.symbolHeight; + + memset( PieData, 0, sizeof( PieData ) ); + + switch( gSkinIME.symbolPlacement ) + { + case 0: // vertical centering IME indicator + { + if( SizeOfPie + g_CaretInfo.margins.right + 4 > g_screenWidth ) + { + PieData[0].sx = ( -SizeOfPie / 2 ) + g_CaretInfo.margins.left - 4; + PieData[0].sy = ( float )g_CaretInfo.margins.top + ( g_CaretInfo.margins.bottom - + g_CaretInfo.margins.top ) / 2; + } + else + { + PieData[0].sx = -( SizeOfPie / 2 ) + g_CaretInfo.margins.right + gSkinIME.symbolHeight + 4; + PieData[0].sy = ( float )g_CaretInfo.margins.top + ( g_CaretInfo.margins.bottom - + g_CaretInfo.margins.top ) / 2; + } + break; + } + case 1: // upperleft + PieData[0].sx = 4 + ( SizeOfPie / 2 ); + PieData[0].sy = 4 + ( SizeOfPie / 2 ); + break; + case 2: // upperright + PieData[0].sx = g_screenWidth - ( 4 + ( SizeOfPie / 2 ) ); + PieData[0].sy = 4 + ( SizeOfPie / 2 ); + break; + case 3: // lowerright + PieData[0].sx = g_screenWidth - ( 4 + ( SizeOfPie / 2 ) ); + PieData[0].sy = g_screenHeight - ( 4 + ( SizeOfPie / 2 ) ); + break; + case 4: // lowerleft + PieData[0].sx = 4 + ( SizeOfPie / 2 ); + PieData[0].sy = g_screenHeight - ( 4 + ( SizeOfPie / 2 ) ); + break; + } + PieData[0].rhw = 1.0f; + if( bOn ) + { + if( GetTickCount() - lastSwirl > 250 ) + { + swirl++; + lastSwirl = GetTickCount(); + if( swirl > 13 ) + swirl = 0; + } + } + else + swirl = 0; + for( int t1 = 1; t1 < 16; t1++ ) + { + float radian = 2.0f * 3.1415926f * ( t1 - 1 + ( bOn * swirl ) ) / 14.0f; + PieData[t1].sx = ( float )( PieData[0].sx + SizeOfPie / 2 * cos( radian ) ); + PieData[t1].sy = ( float )( PieData[0].sy + SizeOfPie / 2 * sin( radian ) ); + PieData[t1].rhw = 1.0f; + } + + PieData[0].color = 0xffffff + ( ( ( DWORD )gSkinIME.symbolTranslucence ) << 24 ); + if( !gSkinIME.symbolColor && bOn ) + { + { + PieData[1].color = 0xff0000 + ( ( ( DWORD )gSkinIME.symbolTranslucence ) << 24 ); + PieData[2].color = 0xff3000 + ( ( ( DWORD )gSkinIME.symbolTranslucence ) << 24 ); + PieData[3].color = 0xff6000 + ( ( ( DWORD )gSkinIME.symbolTranslucence ) << 24 ); + PieData[4].color = 0xff9000 + ( ( ( DWORD )gSkinIME.symbolTranslucence ) << 24 ); + PieData[5].color = 0xffC000 + ( ( ( DWORD )gSkinIME.symbolTranslucence ) << 24 ); + PieData[6].color = 0xffff00 + ( ( ( DWORD )gSkinIME.symbolTranslucence ) << 24 ); + PieData[7].color = 0xC0ff00 + ( ( ( DWORD )gSkinIME.symbolTranslucence ) << 24 ); + PieData[8].color = 0x90ff00 + ( ( ( DWORD )gSkinIME.symbolTranslucence ) << 24 ); + PieData[9].color = 0x60ff00 + ( ( ( DWORD )gSkinIME.symbolTranslucence ) << 24 ); + PieData[10].color = 0x30c0ff + ( ( ( DWORD )gSkinIME.symbolTranslucence ) << 24 ); + PieData[11].color = 0x00a0ff + ( ( ( DWORD )gSkinIME.symbolTranslucence ) << 24 ); + PieData[12].color = 0x3090ff + ( ( ( DWORD )gSkinIME.symbolTranslucence ) << 24 ); + PieData[13].color = 0x6060ff + ( ( ( DWORD )gSkinIME.symbolTranslucence ) << 24 ); + PieData[14].color = 0x9030ff + ( ( ( DWORD )gSkinIME.symbolTranslucence ) << 24 ); + PieData[15].color = 0xc000ff + ( ( ( DWORD )gSkinIME.symbolTranslucence ) << 24 ); + } + } + else + { + DWORD dwColor = bOn ? gSkinIME.symbolColor : gSkinIME.symbolColorOff; + for( int t1 = 1; t1 < 16; t1++ ) + { + PieData[t1].color = dwColor + ( ( ( DWORD )gSkinIME.symbolTranslucence ) << 24 ); + } + } + PieData[16] = PieData[1]; + + if( ImeUiCallback_DrawFans ) + ImeUiCallback_DrawFans( PieData, 17 ); + + float fHeight = gSkinIME.symbolHeight * 0.625f; + + // fix for Ent Gen #120 - reduce the height of character when Korean IME is on + if( GETPRIMLANG() == LANG_KOREAN && bOn ) + { + fHeight *= 0.8f; + } + + if( gSkinIME.symbolFont ) + { +#ifdef DS2 + // save the font height here since DS2 shares editbox font and indicator font + DWORD _w, _h; + g_CaretInfo.pFont->GetTextExtent( TEXT(" "), &_w, &_h ); +#endif //DS2 + + // GOS deals height in points that is 1/72nd inch and assumes display device is 96dpi. + fHeight = fHeight * 96 / 72; + gSkinIME.symbolFont->SetHeight( ( UINT )fHeight ); + gSkinIME.symbolFont->SetColor( ( ( ( DWORD )gSkinIME.symbolTranslucence ) << 24 ) | gSkinIME.symbolColorText ); + + // + // draw the proper symbol over the fan + // + DWORD w, h; + LPCTSTR cszSymbol = ( g_dwState == IMEUI_STATE_ON ) ? g_pszIndicatior : g_aszIndicator[0]; + + gSkinIME.symbolFont->GetTextExtent( cszSymbol, &w, &h ); + gSkinIME.symbolFont->SetPosition( ( int )( PieData[0].sx ) - w / 2, ( int )( PieData[0].sy ) - h / 2 ); + gSkinIME.symbolFont->DrawText( cszSymbol ); + +#ifdef DS2 + // revert the height. + g_CaretInfo.pFont->SetHeight( _h ); + + // Double-check: Confirm match by testing a range of font heights to find best fit + DWORD _h2; + g_CaretInfo.pFont->GetTextExtent( TEXT(" "), &_w, &_h2 ); + if ( _h2 < _h ) + { + for ( int i=1; _h2<_h && i<10; i++ ) + { + g_CaretInfo.pFont->SetHeight( _h+i ); + g_CaretInfo.pFont->GetTextExtent( TEXT(" "), &_w, &_h2 ); + } + } + else if ( _h2 > _h ) + { + for ( int i=1; _h2>_h && i<10; i++ ) + { + g_CaretInfo.pFont->SetHeight( _h-i ); + g_CaretInfo.pFont->GetTextExtent( TEXT(" "), &_w, &_h2 ); + } + } +#endif //DS2 + } +} + +static void DrawCompositionString( bool bDrawCompAttr ) +{ + // Process timer for caret blink + UINT uCurrentTime = GetTickCount(); + if( uCurrentTime - g_uCaretBlinkLast > g_uCaretBlinkTime ) + { + g_uCaretBlinkLast = uCurrentTime; + g_bCaretDraw = !g_bCaretDraw; + } + + int i = 0; + + g_CaretInfo.pFont->SetColor( g_CaretInfo.colorComp ); + + DWORD uDummy; + + int len = lstrlen( g_szCompositionString ); + + DWORD bgX = g_CaretInfo.caretX; + DWORD bgY = g_CaretInfo.caretY; + g_dwCaretX = POSITION_UNINITIALIZED; + g_dwCaretY = POSITION_UNINITIALIZED; + DWORD candX = POSITION_UNINITIALIZED; + DWORD candY = 0; + LPTSTR pszMlcs = g_szMultiLineCompString; + + DWORD wCompChar = 0; + DWORD hCompChar = 0; + g_CaretInfo.pFont->GetTextExtent( TEXT( " " ), &uDummy, &hCompChar ); + if( g_dwIMELevel == 3 && g_IMECursorBytes && g_szCompositionString[0] ) + { + // shift starting point of drawing composition string according to the current caret position. + TCHAR temp = g_szCompositionString[g_IMECursorBytes]; + g_szCompositionString[g_IMECursorBytes] = 0; + g_CaretInfo.pFont->GetTextExtent( g_szCompositionString, &wCompChar, &hCompChar ); + g_szCompositionString[g_IMECursorBytes] = temp; + bgX -= wCompChar; + } + + // + // Draw the background colors for IME text nuggets + // + bool saveCandPos = false; + DWORD cType = 1; + LPTSTR pszCurrentCompLine = g_szCompositionString; + DWORD dwCompLineStart = bgX; + DWORD bgXnext = bgX; + + if( GETPRIMLANG() != LANG_KOREAN || g_bCaretDraw ) // Korean uses composition attribute as blinking block caret + for( i = 0; i < len; i += cType ) + { + DWORD bgColor = 0x00000000; + TCHAR szChar[3]; + szChar[0] = g_szCompositionString[i]; + szChar[1] = szChar[2] = 0; +#ifndef UNICODE + cType = 1 + ( ( _IsLeadByte(g_szCompositionString[i]) ) ? 1 : 0 ); + if( cType == 2 && g_szCompositionString[i + 1] ) // in case we have 0 in trailbyte, we don't count it. + szChar[1] = g_szCompositionString[i + 1]; +#endif + bgX = bgXnext; + TCHAR cSave = g_szCompositionString[i + cType]; + g_szCompositionString[i + cType] = 0; + g_CaretInfo.pFont->GetTextExtent( pszCurrentCompLine, &bgXnext, &hCompChar ); + g_szCompositionString[i + cType] = cSave; + bgXnext += dwCompLineStart; + wCompChar = bgXnext - bgX; + + switch( g_szCompAttrString[i] ) + { + case ATTR_INPUT: + bgColor = gSkinCompStr.colorInput; + break; + case ATTR_TARGET_CONVERTED: + bgColor = gSkinCompStr.colorTargetConv; + if( IMEID_LANG( GetImeId() ) != LANG_CHS ) + saveCandPos = true; + break; + case ATTR_CONVERTED: + bgColor = gSkinCompStr.colorConverted; + break; + case ATTR_TARGET_NOTCONVERTED: + // + // This is the one the user is working with currently + // + bgColor = gSkinCompStr.colorTargetNotConv; + break; + case ATTR_INPUT_ERROR: + bgColor = gSkinCompStr.colorInputErr; + break; + default: + // STOP( TEXT( "Attributes on IME characters are wrong" ) ); + break; + } + + if( g_dwIMELevel == 3 && bDrawCompAttr ) + { + if( ( LONG )bgX >= g_CaretInfo.margins.left && ( LONG )bgX <= g_CaretInfo.margins.right ) + { + if( g_dwImeUiFlags & IMEUI_FLAG_SUPPORT_CARET ) + { + if( ImeUiCallback_DrawRect ) + ImeUiCallback_DrawRect( bgX, bgY, bgX + wCompChar, bgY + hCompChar, bgColor ); + } + else + { + if( ImeUiCallback_DrawRect ) + ImeUiCallback_DrawRect( bgX - wCompChar, bgY, bgX, bgY + hCompChar, bgColor ); + } + } + } + else if( g_dwIMELevel == 2 ) + { + // make sure enough buffer space (possible space, NUL for current line, possible DBCS, 2 more NUL) + // are available in multiline composition string buffer + bool bWrite = ( pszMlcs - g_szMultiLineCompString < + COUNTOF( g_szMultiLineCompString ) - 5 * ( 3 - sizeof( TCHAR ) ) ); + + if( ( LONG )( bgX + wCompChar ) >= g_CaretInfo.margins.right ) + { + bgX = dwCompLineStart = bgXnext = g_CaretInfo.margins.left; + bgY = bgY + hCompChar; + pszCurrentCompLine = g_szCompositionString + i; + if( bWrite ) + { + if( pszMlcs == g_szMultiLineCompString || pszMlcs[-1] == 0 ) + *pszMlcs++ = ' '; // to avoid zero length line + *pszMlcs++ = 0; + } + } + if( ImeUiCallback_DrawRect ) + ImeUiCallback_DrawRect( bgX, bgY, bgX + wCompChar, bgY + hCompChar, bgColor ); + if( bWrite ) + { + *pszMlcs++ = g_szCompositionString[i]; +#ifndef UNICODE + if( cType == 2 ) + *pszMlcs++ = g_szCompositionString[i + 1]; +#endif + } + if( ( DWORD )i == g_IMECursorBytes ) + { + g_dwCaretX = bgX; + g_dwCaretY = bgY; + } + } + if( ( saveCandPos && candX == POSITION_UNINITIALIZED ) || + ( IMEID_LANG( GetImeId() ) == LANG_CHS && i / ( 3 - sizeof( TCHAR ) ) == ( int )g_IMECursorChars ) ) + { + candX = bgX; + candY = bgY; + } + saveCandPos = false; + } + + bgX = bgXnext; + if( g_dwIMELevel == 2 ) + { + // in case the caret in composition string is at the end of it, draw it here + if( len != 0 && ( DWORD )i == g_IMECursorBytes ) + { + g_dwCaretX = bgX; + g_dwCaretY = bgY; + } + + // Draw composition string. + //assert(pszMlcs - g_szMultiLineCompString <= + // sizeof(g_szMultiLineCompString) / sizeof(g_szMultiLineCompString[0]) - 2); + *pszMlcs++ = 0; + *pszMlcs++ = 0; + DWORD x, y; + x = g_CaretInfo.caretX; + y = g_CaretInfo.caretY; + pszMlcs = g_szMultiLineCompString; + while( *pszMlcs && + pszMlcs - g_szMultiLineCompString < sizeof( g_szMultiLineCompString ) / sizeof + ( g_szMultiLineCompString[0] ) ) + { + g_CaretInfo.pFont->SetPosition( x, y ); + g_CaretInfo.pFont->DrawText( pszMlcs ); + pszMlcs += lstrlen( pszMlcs ) + 1; + x = g_CaretInfo.margins.left; + y += hCompChar; + } + } + // for changing z-order of caret + if( g_dwCaretX != POSITION_UNINITIALIZED && g_dwCaretY != POSITION_UNINITIALIZED ) + { + DrawCaret( g_dwCaretX, g_dwCaretY, hCompChar ); + } + g_dwCandX = candX; + g_dwCandY = candY; + g_hCompChar = hCompChar; +} + +static void DrawCandidateList() +{ + DWORD candX = g_dwCandX; + DWORD candY = g_dwCandY; + DWORD hCompChar = g_hCompChar; + int i; + + // draw candidate list / reading window + if( !g_dwCount || g_szCandidate[0][0] == 0 ) + { + return; + } + + // If position of candidate list is not initialized yet, set it here. + if( candX == POSITION_UNINITIALIZED ) + { + // CHT IME in Vista doesn't have ATTR_TARGET_CONVERTED attribute while typing, + // so display the candidate list near the caret in the composition string + if( GETLANG() == LANG_CHT && GetImeId() != 0 && g_dwCaretX != POSITION_UNINITIALIZED ) + { + candX = g_dwCaretX; + candY = g_dwCaretY; + } + else + { + candX = g_CaretInfo.caretX; + candY = g_CaretInfo.caretY; + } + } + + SIZE largest = + { + 0,0 + }; + + static DWORD uDigitWidth = 0; + DWORD uSpaceWidth = 0; + static DWORD uDigitWidthList[10]; + static CImeUiFont_Base* pPrevFont = NULL; + // find out the widest width of the digits + if( pPrevFont != g_CaretInfo.pFont ) + { + pPrevFont = g_CaretInfo.pFont; + for( int cnt = 0; cnt <= 9; cnt++ ) + { + DWORD uDW = 0; + DWORD uDH = 0; + TCHAR ss[8]; + swprintf_s( ss, COUNTOF(ss), TEXT( "%d" ), cnt ); + g_CaretInfo.pFont->GetTextExtent( ss, &uDW, &uDH ); + uDigitWidthList[cnt] = uDW; + if( uDW > uDigitWidth ) + uDigitWidth = uDW; + if( ( signed )uDH > largest.cy ) + largest.cy = uDH; + } + } + uSpaceWidth = uDigitWidth; + DWORD dwMarginX = ( uSpaceWidth + 1 ) / 2; + DWORD adwCandWidth[ MAX_CANDLIST ]; + + // Find out the widest width of the candidate strings + DWORD dwCandWidth = 0; + if( g_bReadingWindow && g_bHorizontalReading ) + g_CaretInfo.pFont->GetTextExtent( g_szReadingString, ( DWORD* )&largest.cx, ( DWORD* )&largest.cy ); + else + { + for( i = 0; g_szCandidate[i][0] && i < ( int )g_uCandPageSize; i++ ) + { + DWORD tx = 0; + DWORD ty = 0; + + if( g_bReadingWindow ) + g_CaretInfo.pFont->GetTextExtent( g_szCandidate[i], &tx, &ty ); + else + { + if( g_bVerticalCand ) + g_CaretInfo.pFont->GetTextExtent( g_szCandidate[i] + 2, &tx, &ty ); + else + g_CaretInfo.pFont->GetTextExtent( g_szCandidate[i] + 1, &tx, &ty ); + tx = tx + uDigitWidth + uSpaceWidth; + } + + if( ( signed )tx > largest.cx ) + largest.cx = tx; + if( ( signed )ty > largest.cy ) + largest.cy = ty; + adwCandWidth[ i ] = tx; + dwCandWidth += tx; + } + } + + DWORD slotsUsed; + if( g_bReadingWindow && g_dwCount < g_uCandPageSize ) + slotsUsed = g_dwCount; + else + slotsUsed = g_uCandPageSize; + + // Show candidate list above composition string if there isn't enough room below. + DWORD dwCandHeight; + if( g_bVerticalCand && !( g_bReadingWindow && g_bHorizontalReading ) ) + dwCandHeight = slotsUsed * largest.cy + 2; + else + dwCandHeight = largest.cy + 2; + if( candY + hCompChar + dwCandHeight > g_screenHeight ) + candY -= dwCandHeight; + else + candY += hCompChar; + if( ( int )candY < 0 ) + candY = 0; + + // Move candidate list horizontally to keep it inside of screen + if( !g_bReadingWindow && IMEID_LANG( GetImeId() ) == LANG_CHS ) + dwCandWidth += dwMarginX * ( slotsUsed - 1 ); + else if( g_bReadingWindow && g_bHorizontalReading ) + dwCandWidth = largest.cx + 2 + dwMarginX * 2; + else if( g_bVerticalCand || g_bReadingWindow ) + dwCandWidth = largest.cx + 2 + dwMarginX * 2; + else + dwCandWidth = slotsUsed * ( largest.cx + 1 ) + 1; + if( candX + dwCandWidth > g_screenWidth ) + candX = g_screenWidth - dwCandWidth; + if( ( int )candX < 0 ) + candX = 0; + + // Draw frame and background of candidate list / reading window + int seperateLineX = 0; + int left = candX; + int top = candY; + int right = candX + dwCandWidth; + int bottom = candY + dwCandHeight; + if( ImeUiCallback_DrawRect ) + ImeUiCallback_DrawRect( left, top, right, bottom, gSkinIME.candColorBorder ); + left++; + top++; + right--; + bottom--; + if( g_bReadingWindow || IMEID_LANG( GetImeId() ) == LANG_CHS ) + { + if( ImeUiCallback_DrawRect ) + ImeUiCallback_DrawRect( left, top, right, bottom, gSkinIME.candColorBase ); + } + else if( g_bVerticalCand ) + { + // uDigitWidth is the max width of all digits. + if( !g_bReadingWindow ) + { + seperateLineX = left + dwMarginX + uDigitWidth + uSpaceWidth / 2; + if( ImeUiCallback_DrawRect ) + { + ImeUiCallback_DrawRect( left, top, seperateLineX - 1, bottom, gSkinIME.candColorBase ); + ImeUiCallback_DrawRect( seperateLineX, top, right, bottom, gSkinIME.candColorBase ); + } + } + } + else + { + for( i = 0; ( DWORD )i < slotsUsed; i++ ) + { + if( ImeUiCallback_DrawRect ) + ImeUiCallback_DrawRect( left, top, left + largest.cx, bottom, gSkinIME.candColorBase ); + left += largest.cx + 1; + } + } + + // Draw candidates / reading strings + candX++; + candY++; + if( g_bReadingWindow && g_bHorizontalReading ) + { + int iStart = -1, iEnd = -1, iDummy; + candX += dwMarginX; + + // draw background of error character if it exists + TCHAR szTemp[COUNTOF( g_szReadingString ) ]; + if( g_iReadingError >= 0 ) + { + StringCchCopy( szTemp, COUNTOF(szTemp), g_szReadingString ); + LPTSTR psz = szTemp + g_iReadingError; +#ifdef UNICODE + psz++; +#else + psz += ( _IsLeadByte( szTemp[g_iReadingError] ) ) ? 2 : 1; +#endif + *psz = 0; + g_CaretInfo.pFont->GetTextExtent( szTemp, ( DWORD* )&iEnd, ( DWORD* )&iDummy ); + TCHAR cSave = szTemp[ g_iReadingError ]; + szTemp[g_iReadingError] = 0; + g_CaretInfo.pFont->GetTextExtent( szTemp, ( DWORD* )&iStart, ( DWORD* )&iDummy ); + szTemp[g_iReadingError] = cSave; + if( ImeUiCallback_DrawRect ) + ImeUiCallback_DrawRect( candX + iStart, candY, candX + iEnd, candY + largest.cy, + gSkinIME.candColorBorder ); + } + + g_CaretInfo.pFont->SetPosition( candX, candY ); + g_CaretInfo.pFont->SetColor( g_CaretInfo.colorCand ); + g_CaretInfo.pFont->DrawText( g_szReadingString ); + + // draw error character if it exists + if( iStart >= 0 ) + { + g_CaretInfo.pFont->SetPosition( candX + iStart, candY ); + if( gSkinIME.candColorBase != 0xffffffff || gSkinIME.candColorBorder != 0xff000000 ) + g_CaretInfo.pFont->SetColor( g_CaretInfo.colorCand ); + else + g_CaretInfo.pFont->SetColor( 0xff000000 + ( ~( ( 0x00ffffff ) & g_CaretInfo.colorCand ) ) ); + g_CaretInfo.pFont->DrawText( szTemp + g_iReadingError ); + } + } + else + { + for( i = 0; i < ( int )g_uCandPageSize && ( DWORD )i < g_dwCount; i++ ) + { + if( g_dwSelection == ( DWORD )i ) + { + if( gSkinIME.candColorBase != 0xffffffff || gSkinIME.candColorBorder != 0xff000000 ) + g_CaretInfo.pFont->SetColor( g_CaretInfo.colorCand ); + else + g_CaretInfo.pFont->SetColor( 0xff000000 + ( ~( ( 0x00ffffff ) & g_CaretInfo.colorCand ) ) ); + + if( ImeUiCallback_DrawRect ) + { + if( g_bReadingWindow || g_bVerticalCand ) + ImeUiCallback_DrawRect( candX, candY + i * largest.cy, + candX - 1 + dwCandWidth, candY + ( i + 1 ) * largest.cy, + gSkinIME.candColorBorder ); + else + ImeUiCallback_DrawRect( candX, candY, + candX + adwCandWidth[i], candY + largest.cy, + gSkinIME.candColorBorder ); + } + } + else + g_CaretInfo.pFont->SetColor( g_CaretInfo.colorCand ); + if( g_szCandidate[i][0] != 0 ) + { + if( !g_bReadingWindow && g_bVerticalCand ) + { + TCHAR szOneDigit[2] = + { + g_szCandidate[i][0], 0 + }; + int nOneDigit = g_szCandidate[i][0] - TEXT( '0' ); + TCHAR* szCandidateBody = g_szCandidate[i] + 2; + + int dx = candX + ( seperateLineX - candX - uDigitWidthList[nOneDigit] ) / 2; + int dy = candY + largest.cy * i; + + g_CaretInfo.pFont->SetPosition( dx, dy ); + g_CaretInfo.pFont->DrawText( szOneDigit ); + g_CaretInfo.pFont->SetPosition( seperateLineX + dwMarginX, dy ); + g_CaretInfo.pFont->DrawText( szCandidateBody ); + } + else if( g_bReadingWindow ) + { + g_CaretInfo.pFont->SetPosition( dwMarginX + candX, candY + i * largest.cy ); + g_CaretInfo.pFont->DrawText( g_szCandidate[i] ); + } + else + { + g_CaretInfo.pFont->SetPosition( uSpaceWidth / 2 + candX, candY ); + g_CaretInfo.pFont->DrawText( g_szCandidate[i] ); + } + } + if( !g_bReadingWindow && !g_bVerticalCand ) + { + if( IMEID_LANG( GetImeId() ) == LANG_CHS ) + candX += adwCandWidth[i] + dwMarginX; + else + candX += largest.cx + 1; + } + } + } +} + +static void CloseCandidateList() +{ + g_bCandList = false; + if( !g_bReadingWindow ) // fix for Ent Gen #120. + { + g_dwCount = 0; + memset( &g_szCandidate, 0, sizeof( g_szCandidate ) ); + } +} + +// +// ProcessIMEMessages() +// Processes IME related messages and acquire information +// +LPARAM ImeUi_ProcessMessage( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM& lParam, bool* trapped ) +{ + HIMC himc; + int len; + static LPARAM lAlt = 0x80000000, lCtrl = 0x80000000, lShift = 0x80000000; + + *trapped = false; + if( !g_bInitialized || g_bDisableImeCompletely ) + { + return 0; + } + + switch( uMsg ) + { + // + // IME Handling + // + case WM_INPUTLANGCHANGE: + OnInputLangChange(); + break; + + case WM_IME_SETCONTEXT: + // + // We don't want anything to display, so we have to clear lParam and pass it to DefWindowProc(). + // Expecially important in Vista to receive IMN_CHANGECANDIDATE correctly. + // + lParam = 0; + break; + + case WM_IME_STARTCOMPOSITION: + InitCompStringData(); + *trapped = true; + break; + + case WM_IME_COMPOSITION: + { + LONG lRet; + TCHAR szCompStr[COUNTOF(g_szCompositionString)]; + + *trapped = true; + if( NULL == ( himc = _ImmGetContext( hWnd ) ) ) + { + break; + } + + // ResultStr must be processed before composition string. + if( lParam & GCS_RESULTSTR ) + { + lRet = ( LONG )_ImmGetCompositionString( himc, GCS_RESULTSTR, szCompStr, + COUNTOF( szCompStr ) ) / sizeof( TCHAR ); + szCompStr[lRet] = 0; + CancelCompString( g_hwndCurr, false, GetCharCount( szCompStr ) ); + StringCchCopy( g_szCompositionString, COUNTOF(g_szCompositionString), szCompStr ); + _SendCompString(); + InitCompStringData(); + } + // + // Reads in the composition string. + // + if( lParam & GCS_COMPSTR ) + { + ////////////////////////////////////////////////////// + // Retrieve the latest user-selected IME candidates + lRet = ( LONG )_ImmGetCompositionString( himc, GCS_COMPSTR, szCompStr, + COUNTOF( szCompStr ) ) / sizeof( TCHAR ); + szCompStr[lRet] = 0; + // + // Remove the whole of the string + // + CancelCompString( g_hwndCurr, false, GetCharCount( szCompStr ) ); + + StringCchCopy( g_szCompositionString, COUNTOF(g_szCompositionString), szCompStr ); + lRet = _ImmGetCompositionString( himc, GCS_COMPATTR, g_szCompAttrString, + COUNTOF( g_szCompAttrString ) ); + g_szCompAttrString[lRet] = 0; + // Older CHT IME uses composition string for reading string + if( GETLANG() == LANG_CHT && !GetImeId() ) + { + int i, chars = lstrlen( g_szCompositionString ) / ( 3 - sizeof( TCHAR ) ); + if( chars ) + { + g_dwCount = 4; + g_dwSelection = ( DWORD )-1; // don't select any candidate + + for( i = 3; i >= 0; i-- ) + { + if( i > chars - 1 ) + g_szCandidate[i][0] = 0; + else + { +#ifdef UNICODE + g_szCandidate[i][0] = g_szCompositionString[i]; + g_szCandidate[i][1] = 0; +#else + g_szCandidate[i][0] = g_szCompositionString[i * 2]; + g_szCandidate[i][1] = g_szCompositionString[i * 2 + 1]; + g_szCandidate[i][2] = 0; +#endif + } + } + g_uCandPageSize = MAX_CANDLIST; + memset( g_szCompositionString, 0, 8 ); + g_bReadingWindow = true; + GetReadingWindowOrientation( 0 ); + if( g_bHorizontalReading ) + { + g_iReadingError = -1; + g_szReadingString[0] = 0; + for( i = 0; i < ( int )g_dwCount; i++ ) + { + if( g_dwSelection == ( DWORD )i ) + g_iReadingError = lstrlen( g_szReadingString ); + LPCTSTR pszTmp = g_szCandidate[i]; + wcscat_s( g_szReadingString, COUNTOF(g_szReadingString), pszTmp ); + } + } + } + else + g_dwCount = 0; + } + + // get caret position in composition string + g_IMECursorBytes = _ImmGetCompositionString( himc, GCS_CURSORPOS, NULL, 0 ); + g_IMECursorChars = GetCharCountFromBytes( g_szCompositionString, g_IMECursorBytes ); + + if( g_dwIMELevel == 3 ) + { + // send composition string via WM_CHAR + _SendCompString(); + // move caret to appropreate location + len = GetCharCount( g_szCompositionString + g_IMECursorBytes ); + SendControlKeys( VK_LEFT, len ); + } + } + _ImmReleaseContext( hWnd, himc ); + } + break; + + case WM_IME_ENDCOMPOSITION: + CancelCompString( g_hwndCurr ); + InitCompStringData(); + break; + + case WM_IME_NOTIFY: + switch( wParam ) + { + case IMN_SETCONVERSIONMODE: + { + // Disable CHT IME software keyboard. + static bool bNoReentrance = false; + if( LANG_CHT == GETLANG() && !bNoReentrance ) + { + bNoReentrance = true; + DWORD dwConvMode, dwSentMode; + _ImmGetConversionStatus( g_himcOrg, &dwConvMode, &dwSentMode ); + const DWORD dwFlag = IME_CMODE_SOFTKBD | IME_CMODE_SYMBOL; + if( dwConvMode & dwFlag ) + _ImmSetConversionStatus( g_himcOrg, dwConvMode & ~dwFlag, dwSentMode ); + } + bNoReentrance = false; + } + // fall through + case IMN_SETOPENSTATUS: + if( g_bUILessMode ) + break; + CheckToggleState(); + break; + + case IMN_OPENCANDIDATE: + case IMN_CHANGECANDIDATE: + if( g_bUILessMode ) + { + break; + } + { + g_bCandList = true; + *trapped = true; + if( NULL == ( himc = _ImmGetContext( hWnd ) ) ) + break; + + LPCANDIDATELIST lpCandList; + DWORD dwIndex, dwBufLen; + + g_bReadingWindow = false; + dwIndex = 0; + dwBufLen = _GetCandidateList( himc, dwIndex, &lpCandList ); + + if( dwBufLen ) + { + g_dwSelection = lpCandList->dwSelection; + g_dwCount = lpCandList->dwCount; + + int startOfPage = 0; + if( GETLANG() == LANG_CHS && GetImeId() ) + { + // MSPY (CHS IME) has variable number of candidates in candidate window + // find where current page starts, and the size of current page + const int maxCandChar = 18 * ( 3 - sizeof( TCHAR ) ); + UINT cChars = 0; + UINT i; + for( i = 0; i < g_dwCount; i++ ) + { + UINT uLen = lstrlen( + ( LPTSTR )( ( DWORD )lpCandList + lpCandList->dwOffset[i] ) ) + + ( 3 - sizeof( TCHAR ) ); + if( uLen + cChars > maxCandChar ) + { + if( i > g_dwSelection ) + { + break; + } + startOfPage = i; + cChars = uLen; + } + else + { + cChars += uLen; + } + } + g_uCandPageSize = i - startOfPage; + } + else + { + g_uCandPageSize = min( lpCandList->dwPageSize, MAX_CANDLIST ); + startOfPage = g_bUILessMode ? lpCandList->dwPageStart : + ( g_dwSelection / g_uCandPageSize ) * g_uCandPageSize; + } + + g_dwSelection = ( GETLANG() == LANG_CHS && !GetImeId() ) ? ( DWORD )-1 + : g_dwSelection - startOfPage; + + memset( &g_szCandidate, 0, sizeof( g_szCandidate ) ); + for( UINT i = startOfPage, j = 0; + ( DWORD )i < lpCandList->dwCount && j < g_uCandPageSize; + i++, j++ ) + { + ComposeCandidateLine( j, + ( LPTSTR )( ( DWORD )lpCandList + lpCandList->dwOffset[i] ) ); + } + ImeUiCallback_Free( ( HANDLE )lpCandList ); + _ImmReleaseContext( hWnd, himc ); + + // don't display selection in candidate list in case of Korean and old Chinese IME. + if( GETPRIMLANG() == LANG_KOREAN || + GETLANG() == LANG_CHT && !GetImeId() ) + g_dwSelection = ( DWORD )-1; + } + break; + } + + case IMN_CLOSECANDIDATE: + if( g_bUILessMode ) + { + break; + } + CloseCandidateList(); + *trapped = true; + break; + + // Jun.16,2000 05:21 by yutaka. + case IMN_PRIVATE: + { + if( !g_bCandList ) + { + GetReadingString( hWnd ); + } + // Trap some messages to hide reading window + DWORD dwId = GetImeId(); + switch( dwId ) + { + case IMEID_CHT_VER42: + case IMEID_CHT_VER43: + case IMEID_CHT_VER44: + case IMEID_CHS_VER41: + case IMEID_CHS_VER42: + if( ( lParam == 1 ) || ( lParam == 2 ) ) + { + *trapped = true; + } + break; + case IMEID_CHT_VER50: + case IMEID_CHT_VER51: + case IMEID_CHT_VER52: + case IMEID_CHT_VER60: + case IMEID_CHS_VER53: + if( ( lParam == 16 ) || ( lParam == 17 ) || ( lParam == 26 ) || ( lParam == 27 ) || + ( lParam == 28 ) ) + { + *trapped = true; + } + break; + } + } + break; + + default: + *trapped = true; + break; + } + break; + + // fix for #15386 - When Text Service Framework is installed in Win2K, Alt+Shift and Ctrl+Shift combination (to switch + // input locale / keyboard layout) doesn't send WM_KEYUP message for the key that is released first. We need to check + // if these keys are actually up whenever we receive key up message for other keys. + case WM_KEYUP: + case WM_SYSKEYUP: + if( !( lAlt & 0x80000000 ) && wParam != VK_MENU && ( GetAsyncKeyState( VK_MENU ) & 0x8000 ) == 0 ) + { + PostMessageA( GetFocus(), WM_KEYUP, ( WPARAM )VK_MENU, ( lAlt & 0x01ff0000 ) | 0xC0000001 ); + } + else if( !( lCtrl & 0x80000000 ) && wParam != VK_CONTROL && + ( GetAsyncKeyState( VK_CONTROL ) & 0x8000 ) == 0 ) + { + PostMessageA( GetFocus(), WM_KEYUP, ( WPARAM )VK_CONTROL, ( lCtrl & 0x01ff0000 ) | 0xC0000001 ); + } + else if( !( lShift & 0x80000000 ) && wParam != VK_SHIFT && ( GetAsyncKeyState( VK_SHIFT ) & 0x8000 ) == 0 ) + { + PostMessageA( GetFocus(), WM_KEYUP, ( WPARAM )VK_SHIFT, ( lShift & 0x01ff0000 ) | 0xC0000001 ); + } + // fall through WM_KEYDOWN / WM_SYSKEYDOWN + case WM_KEYDOWN: + case WM_SYSKEYDOWN: + { + switch( wParam ) + { + case VK_MENU: + lAlt = lParam; + break; + case VK_SHIFT: + lShift = lParam; + break; + case VK_CONTROL: + lCtrl = lParam; + break; + } + } + break; + } + return 0; +} + +void ImeUi_SetCaretPosition( UINT x, UINT y ) +{ + if( !g_bInitialized ) + return; + g_CaretInfo.caretX = x; + g_CaretInfo.caretY = y; +} + +void ImeUi_SetCompStringAppearance( CImeUiFont_Base* pFont, DWORD color, const RECT* prc ) +{ + if( !g_bInitialized ) + return; + g_CaretInfo.pFont = pFont; + g_CaretInfo.margins = *prc; + + if( 0 == gSkinIME.candColorText ) + g_CaretInfo.colorCand = color; + else + g_CaretInfo.colorCand = gSkinIME.candColorText; + if( 0 == gSkinIME.compColorText ) + g_CaretInfo.colorComp = color; + else + g_CaretInfo.colorComp = gSkinIME.compColorText; +} + +void ImeUi_SetState( DWORD dwState ) +{ + if( !g_bInitialized ) + return; + HIMC himc; + if( dwState == IMEUI_STATE_ON ) + { + ImeUi_EnableIme( true ); + } + if( NULL != ( himc = _ImmGetContext( g_hwndCurr ) ) ) + { + if( g_bDisableImeCompletely ) + dwState = IMEUI_STATE_OFF; + + bool bOn = dwState == IMEUI_STATE_ON; // for non-Chinese IME + switch( GETPRIMLANG() ) + { + case LANG_CHINESE: + { + // toggle Chinese IME + DWORD dwId; + DWORD dwConvMode = 0, dwSentMode = 0; + if( ( g_bChineseIME && dwState == IMEUI_STATE_OFF ) || + ( !g_bChineseIME && dwState != IMEUI_STATE_OFF ) ) + { + _ImmSimulateHotKey( g_hwndCurr, IME_THOTKEY_IME_NONIME_TOGGLE ); + _PumpMessage(); + } + if( dwState != IMEUI_STATE_OFF ) + { + dwId = GetImeId(); + if( dwId ) + { + _ImmGetConversionStatus( himc, &dwConvMode, &dwSentMode ); + dwConvMode = ( dwState == IMEUI_STATE_ON ) + ? ( dwConvMode | IME_CMODE_NATIVE ) + : ( dwConvMode & ~IME_CMODE_NATIVE ); + _ImmSetConversionStatus( himc, dwConvMode, dwSentMode ); + } + } + break; + } + case LANG_KOREAN: + // toggle Korean IME + if( ( bOn && g_dwState != IMEUI_STATE_ON ) || ( !bOn && g_dwState == IMEUI_STATE_ON ) ) + { + _ImmSimulateHotKey( g_hwndCurr, IME_KHOTKEY_ENGLISH ); + } + break; + case LANG_JAPANESE: + _ImmSetOpenStatus( himc, bOn ); + break; + } + _ImmReleaseContext( g_hwndCurr, himc ); + CheckToggleState(); + } +} + +DWORD ImeUi_GetState() +{ + if( !g_bInitialized ) + return IMEUI_STATE_OFF; + CheckToggleState(); + return g_dwState; +} + +void ImeUi_EnableIme( bool bEnable ) +{ + if( !g_bInitialized || !g_hwndCurr ) + return; + if( g_bDisableImeCompletely ) + bEnable = false; + + if( g_hwndCurr == g_hwndMain ) + { + HIMC himcDbg; + himcDbg = _ImmAssociateContext( g_hwndCurr, bEnable? g_himcOrg : NULL ); + } + g_bImeEnabled = bEnable; + if( bEnable ) + { + CheckToggleState(); + } + CTsfUiLessMode::EnableUiUpdates( bEnable ); +} + +bool ImeUi_IsEnabled( void ) +{ + return g_bImeEnabled; +} + +bool ImeUi_Initialize( HWND hwnd, bool bDisable ) +{ + if( g_bInitialized ) + { + return true; + } + g_hwndMain = hwnd; + g_disableCicero.Initialize(); + + g_osi.dwOSVersionInfoSize = sizeof( OSVERSIONINFOA ); + GetVersionExA( &g_osi ); + + bool bUnicodeImm = false; + // IMM in NT or Win98 supports Unicode + if( g_osi.dwPlatformId == VER_PLATFORM_WIN32_NT || + ( g_osi.dwMajorVersion > 4 ) || + ( g_osi.dwMajorVersion == 4 ) && ( g_osi.dwMinorVersion > 0 ) ) + { + bUnicodeImm = true; + } + + g_hImmDll = LoadLibraryA( "imm32.dll" ); + g_bDisableImeCompletely = false; + + if( g_hImmDll ) + { + _ImmLockIMC = ( LPINPUTCONTEXT2 ( WINAPI* )( HIMC hIMC ) )GetProcAddress( g_hImmDll, "ImmLockIMC" ); + _ImmUnlockIMC = ( BOOL ( WINAPI* )( HIMC hIMC ) )GetProcAddress( g_hImmDll, "ImmUnlockIMC" ); + _ImmLockIMCC = ( LPVOID ( WINAPI* )( HIMCC hIMCC ) )GetProcAddress( g_hImmDll, "ImmLockIMCC" ); + _ImmUnlockIMCC = ( BOOL ( WINAPI* )( HIMCC hIMCC ) )GetProcAddress( g_hImmDll, "ImmUnlockIMCC" ); + BOOL ( WINAPI* _ImmDisableTextFrameService )( DWORD ) = ( BOOL ( WINAPI* )( DWORD ) )GetProcAddress( g_hImmDll, + "ImmDisableTextFrameService" ); + if( _ImmDisableTextFrameService ) + { + _ImmDisableTextFrameService( ( DWORD )-1 ); + } + } + else + { + g_bDisableImeCompletely = true; + return false; + } +#ifdef UNICODE + if ( bUnicodeImm ) + { + _ImmGetCompositionString = ImmGetCompositionStringW; + _ImmGetCandidateList = ImmGetCandidateListW; + _GetCandidateList = GetCandidateList; + } + else + { + _ImmGetCandidateList = ImmGetCandidateListA; + _ImmGetCompositionString = AW_ImmGetCompositionString; + _GetCandidateList = AW_GetCandidateList; + } +#else + if( bUnicodeImm ) + { + _ImmGetCompositionString = WA_ImmGetCompositionString; + _ImmGetCandidateList = ImmGetCandidateListA; + _GetCandidateList = WA_GetCandidateList; + } + else + { + _ImmGetCompositionString = ImmGetCompositionStringA; + _ImmGetCandidateList = ImmGetCandidateListA; + _GetCandidateList = GetCandidateList; + } +#endif + + // There are the following combinations of code config, window type, and the method of sending characters. + // Wnd: Unicode, Code: Unicode, Method: SendMessageW (SendMessageW must be supported since RegisterClassW is successful) + // Wnd: non Uni, Code: Unicode, Method: AW_SendCompString (Send characters in multibyte after W->A conversion) + // Wnd: Unicode, Code: non Uni, Method: SendMessageA (System does A->W conversion) - possible, but unlikely to be used. + // Wnd: non Uni, Code: non Uni, Method: SendMessageA +#ifdef UNICODE + if ( !IsWindowUnicode( hwnd ) ) + { + _SendCompString = AW_SendCompString; + } + else +#endif + { + _SendCompString = SendCompString; +#ifdef UNICODE + _SendMessage = SendMessageW; +#endif + } + + // turn init flag on so that subsequent calls to ImeUi functions work. + g_bInitialized = true; + + ImeUi_SetWindow( g_hwndMain ); + g_himcOrg = _ImmGetContext( g_hwndMain ); + _ImmReleaseContext( g_hwndMain, g_himcOrg ); + + if( !g_himcOrg ) + { + bDisable = true; + } + + // the following pointers to function has to be initialized before this function is called. + if( bDisable || + !ImeUiCallback_Malloc || + !ImeUiCallback_Free + ) + { + g_bDisableImeCompletely = true; + ImeUi_EnableIme( false ); + g_bInitialized = bDisable; + return false; + } + + g_uCaretBlinkTime = GetCaretBlinkTime(); + +#ifndef UNICODE + // Check if system is SBCS system + CPINFO cpi; + BOOL bRc = GetCPInfo( CP_ACP, &cpi ); + if( bRc ) + { + if( cpi.MaxCharSize == 1 ) + { + g_bDisableImeCompletely = true; // SBCS system. Disable IME. + } + } +#endif + + g_CaretInfo.caretX = 0; + g_CaretInfo.caretY = 0; + g_CaretInfo.pFont = 0; + g_CaretInfo.colorComp = 0; + g_CaretInfo.colorCand = 0; + g_CaretInfo.margins.left = 0; + g_CaretInfo.margins.right = 640; + g_CaretInfo.margins.top = 0; + g_CaretInfo.margins.bottom = 480; + + CheckInputLocale(); + OnInputLangChangeWorker(); + ImeUi_SetSupportLevel( 2 ); + + // SetupTSFSinks has to be called before CheckToggleState to make it work correctly. + g_bUILessMode = CTsfUiLessMode::SetupSinks() != FALSE; + CheckToggleState(); + if( g_bUILessMode ) + { + g_bChineseIME = ( GETPRIMLANG() == LANG_CHINESE ) && CTsfUiLessMode::CurrentInputLocaleIsIme(); + CTsfUiLessMode::UpdateImeState(); + } + ImeUi_EnableIme( false ); + + return true; +} + +void ImeUi_Uninitialize() +{ + if( !g_bInitialized ) + { + return; + } + CTsfUiLessMode::ReleaseSinks(); + if( g_hwndMain ) + { + ImmAssociateContext( g_hwndMain, g_himcOrg ); + } + g_hwndMain = NULL; + g_himcOrg = NULL; + if( g_hImmDll ) + { + FreeLibrary( g_hImmDll ); + g_hImmDll = NULL; + } + g_disableCicero.Uninitialize(); + g_bInitialized = false; +} + +// +// GetImeId( UINT uIndex ) +// returns +// returned value: +// 0: In the following cases +// - Non Chinese IME input locale +// - Older Chinese IME +// - Other error cases +// +// Othewise: +// When uIndex is 0 (default) +// bit 31-24: Major version +// bit 23-16: Minor version +// bit 15-0: Language ID +// When uIndex is 1 +// pVerFixedInfo->dwFileVersionLS +// +// Use IMEID_VER and IMEID_LANG macro to extract version and language information. +// +static DWORD GetImeId( UINT uIndex ) +{ + static HKL hklPrev = 0; + static DWORD dwRet[2] = + { + 0, 0 + }; + + DWORD dwVerSize; + DWORD dwVerHandle; + LPVOID lpVerBuffer; + LPVOID lpVerData; + UINT cbVerData; + char szTmp[1024]; + + if( uIndex >= sizeof( dwRet ) / sizeof( dwRet[0] ) ) + return 0; + + HKL kl = g_hklCurrent; + if( hklPrev == kl ) + { + return dwRet[uIndex]; + } + hklPrev = kl; + DWORD dwLang = ( ( DWORD )kl & 0xffff ); + + if( g_bUILessMode && GETLANG() == LANG_CHT ) + { + // In case of Vista, artifitial value is returned so that it's not considered as older IME. + dwRet[0] = IMEID_CHT_VER_VISTA; + dwRet[1] = 0; + return dwRet[0]; + } + + if( kl != _CHT_HKL_NEW_PHONETIC && kl != _CHT_HKL_NEW_CHANG_JIE + && kl != _CHT_HKL_NEW_QUICK && kl != _CHT_HKL_HK_CANTONESE && kl != _CHS_HKL ) + { + goto error; + } + + if( _ImmGetIMEFileNameA( kl, szTmp, sizeof( szTmp ) - 1 ) <= 0 ) + { + goto error; + } + + if( !_GetReadingString ) // IME that doesn't implement private API + { +#define LCID_INVARIANT MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT) + if( ( CompareStringA( LCID_INVARIANT, NORM_IGNORECASE, szTmp, -1, _CHT_IMEFILENAME, -1 ) != 2 ) + && ( CompareStringA( LCID_INVARIANT, NORM_IGNORECASE, szTmp, -1, _CHT_IMEFILENAME2, -1 ) != 2 ) + && ( CompareStringA( LCID_INVARIANT, NORM_IGNORECASE, szTmp, -1, _CHT_IMEFILENAME3, -1 ) != 2 ) + && ( CompareStringA( LCID_INVARIANT, NORM_IGNORECASE, szTmp, -1, _CHS_IMEFILENAME, -1 ) != 2 ) + && ( CompareStringA( LCID_INVARIANT, NORM_IGNORECASE, szTmp, -1, _CHS_IMEFILENAME2, -1 ) != 2 ) + ) + { + goto error; + } + } + + dwVerSize = GetFileVersionInfoSizeA( szTmp, &dwVerHandle ); + if( dwVerSize ) + { + lpVerBuffer = ( LPVOID )ImeUiCallback_Malloc( dwVerSize ); + if( lpVerBuffer ) + { + if( GetFileVersionInfoA( szTmp, dwVerHandle, dwVerSize, lpVerBuffer ) ) + { + if( VerQueryValueA( lpVerBuffer, "\\", &lpVerData, &cbVerData ) ) + { +#define pVerFixedInfo ((VS_FIXEDFILEINFO FAR*)lpVerData) + DWORD dwVer = pVerFixedInfo->dwFileVersionMS; + dwVer = ( dwVer & 0x00ff0000 ) << 8 | ( dwVer & 0x000000ff ) << 16; + if( _GetReadingString || + dwLang == LANG_CHT && ( + dwVer == MAKEIMEVERSION(4, 2) || + dwVer == MAKEIMEVERSION(4, 3) || + dwVer == MAKEIMEVERSION(4, 4) || + dwVer == MAKEIMEVERSION(5, 0) || + dwVer == MAKEIMEVERSION(5, 1) || + dwVer == MAKEIMEVERSION(5, 2) || + dwVer == MAKEIMEVERSION(6, 0) ) + || + dwLang == LANG_CHS && ( + dwVer == MAKEIMEVERSION(4, 1) || + dwVer == MAKEIMEVERSION(4, 2) || + dwVer == MAKEIMEVERSION(5, 3) ) ) + { + dwRet[0] = dwVer | dwLang; + dwRet[1] = pVerFixedInfo->dwFileVersionLS; + ImeUiCallback_Free( lpVerBuffer ); + return dwRet[0]; + } +#undef pVerFixedInfo + } + } + } + ImeUiCallback_Free( lpVerBuffer ); + } + + // The flow comes here in the following conditions + // - Non Chinese IME input locale + // - Older Chinese IME + // - Other error cases +error: + dwRet[0] = dwRet[1] = 0; + return dwRet[uIndex]; +} + +static void GetReadingString( HWND hWnd ) +{ + if( g_bUILessMode ) + { + return; + } + DWORD dwId = GetImeId(); + if( !dwId ) + { + return; + } + + HIMC himc; + himc = _ImmGetContext( hWnd ); + if( !himc ) + return; + + DWORD dwlen = 0; + DWORD dwerr = 0; + WCHAR wzBuf[16]; // We believe 16 wchars are big enough to hold reading string after having discussion with CHT IME team. + WCHAR* wstr = wzBuf; + bool unicode = FALSE; + LPINPUTCONTEXT2 lpIMC = NULL; + + if( _GetReadingString ) + { + BOOL bVertical; + UINT uMaxUiLen; + dwlen = _GetReadingString( himc, 0, NULL, ( PINT )&dwerr, &bVertical, &uMaxUiLen ); + if( dwlen ) + { + if( dwlen > COUNTOF(wzBuf) ) + { + dwlen = COUNTOF(wzBuf); + } + dwlen = _GetReadingString( himc, dwlen, wstr, ( PINT )&dwerr, &bVertical, &uMaxUiLen ); + } + + g_bHorizontalReading = bVertical == 0; + unicode = true; + } + else // IMEs that doesn't implement Reading String API + { + lpIMC = _ImmLockIMC( himc ); + + // *** hacking code from Michael Yang *** + + LPBYTE p = 0; + + switch( dwId ) + { + + case IMEID_CHT_VER42: // New(Phonetic/ChanJie)IME98 : 4.2.x.x // Win98 + case IMEID_CHT_VER43: // New(Phonetic/ChanJie)IME98a : 4.3.x.x // WinMe, Win2k + case IMEID_CHT_VER44: // New ChanJie IME98b : 4.4.x.x // WinXP + + p = *( LPBYTE* )( ( LPBYTE )_ImmLockIMCC( lpIMC->hPrivate ) + 24 ); + if( !p ) break; + dwlen = *( DWORD* )( p + 7 * 4 + 32 * 4 ); //m_dwInputReadStrLen + dwerr = *( DWORD* )( p + 8 * 4 + 32 * 4 ); //m_dwErrorReadStrStart + wstr = ( WCHAR* )( p + 56 ); + unicode = TRUE; + break; + + case IMEID_CHT_VER50: // 5.0.x.x // WinME + + p = *( LPBYTE* )( ( LPBYTE )_ImmLockIMCC( lpIMC->hPrivate ) + 3 * 4 ); // PCKeyCtrlManager + if( !p ) break; + p = *( LPBYTE* )( ( LPBYTE )p + 1 * 4 + 5 * 4 + 4 * 2 ); // = PCReading = &STypingInfo + if( !p ) break; + dwlen = *( DWORD* )( p + 1 * 4 + ( 16 * 2 + 2 * 4 ) + 5 * 4 + 16 ); //m_dwDisplayStringLength; + dwerr = *( DWORD* )( p + 1 * 4 + ( 16 * 2 + 2 * 4 ) + 5 * 4 + 16 + 1 * 4 ); //m_dwDisplayErrorStart; + wstr = ( WCHAR* )( p + 1 * 4 + ( 16 * 2 + 2 * 4 ) + 5 * 4 ); + unicode = FALSE; + break; + + case IMEID_CHT_VER51: // 5.1.x.x // IME2002(w/OfficeXP) + case IMEID_CHT_VER52: // 5.2.x.x // (w/whistler) + case IMEID_CHS_VER53: // 5.3.x.x // SCIME2k or MSPY3 (w/OfficeXP and Whistler) + + p = *( LPBYTE* )( ( LPBYTE )_ImmLockIMCC( lpIMC->hPrivate ) + 4 ); // PCKeyCtrlManager + if( !p ) break; + p = *( LPBYTE* )( ( LPBYTE )p + 1 * 4 + 5 * 4 ); // = PCReading = &STypingInfo + if( !p ) break; + dwlen = *( DWORD* )( p + 1 * 4 + ( 16 * 2 + 2 * 4 ) + 5 * 4 + 16 * 2 ); //m_dwDisplayStringLength; + dwerr = *( DWORD* )( p + 1 * 4 + ( 16 * 2 + 2 * 4 ) + 5 * 4 + 16 * 2 + 1 * 4 ); //m_dwDisplayErrorStart; + wstr = ( WCHAR* )( p + 1 * 4 + ( 16 * 2 + 2 * 4 ) + 5 * 4 ); + unicode = TRUE; + break; + + // the code tested only with Win 98 SE (MSPY 1.5/ ver 4.1.0.21) + case IMEID_CHS_VER41: + { + int offset; + offset = ( GetImeId( 1 ) >= 0x00000002 ) ? 8 : 7; + + p = *( LPBYTE* )( ( LPBYTE )_ImmLockIMCC( lpIMC->hPrivate ) + offset * 4 ); + if( !p ) break; + dwlen = *( DWORD* )( p + 7 * 4 + 16 * 2 * 4 ); + dwerr = *( DWORD* )( p + 8 * 4 + 16 * 2 * 4 ); + dwerr = min( dwerr, dwlen ); + wstr = ( WCHAR* )( p + 6 * 4 + 16 * 2 * 1 ); + unicode = TRUE; + break; + } + + case IMEID_CHS_VER42: // 4.2.x.x // SCIME98 or MSPY2 (w/Office2k, Win2k, WinME, etc) + { + int nTcharSize = IsNT() ? sizeof( WCHAR ) : sizeof( char ); + p = *( LPBYTE* )( ( LPBYTE )_ImmLockIMCC( lpIMC->hPrivate ) + 1 * 4 + 1 * 4 + 6 * 4 ); // = PCReading = &STypintInfo + if( !p ) break; + dwlen = *( DWORD* )( p + 1 * 4 + ( 16 * 2 + 2 * 4 ) + 5 * 4 + 16 * nTcharSize ); //m_dwDisplayStringLength; + dwerr = *( DWORD* )( p + 1 * 4 + ( 16 * 2 + 2 * 4 ) + 5 * 4 + 16 * nTcharSize + 1 * 4 ); //m_dwDisplayErrorStart; + wstr = ( WCHAR* )( p + 1 * 4 + ( 16 * 2 + 2 * 4 ) + 5 * 4 ); //m_tszDisplayString + unicode = IsNT() ? TRUE : FALSE; + } + } // switch + + g_szCandidate[0][0] = 0; + g_szCandidate[1][0] = 0; + g_szCandidate[2][0] = 0; + g_szCandidate[3][0] = 0; + } + g_dwCount = dwlen; + g_dwSelection = ( DWORD )-1; // do not select any char + if( unicode ) + { + int i; + for( i = 0; ( DWORD )i < dwlen; i++ ) // dwlen > 0, if known IME : yutakah + { + if( dwerr <= ( DWORD )i && g_dwSelection == ( DWORD )-1 ) + { // select error char + g_dwSelection = i; + } +#ifdef UNICODE + g_szCandidate[i][0] = wstr[i]; + g_szCandidate[i][1] = 0; +#else + char mbc[3]; + mbc[1] = 0; + mbc[2] = 0; + WideCharToMultiByte( g_uCodePage, 0, wstr + i, 1, mbc, sizeof( mbc ), NULL, NULL ); + + g_szCandidate[i][0] = mbc[0]; + g_szCandidate[i][1] = mbc[1]; + g_szCandidate[i][2] = 0; +#endif + } + g_szCandidate[i][0] = 0; + } + else + { + char* p = ( char* )wstr; + int i, j; + for( i = 0, j = 0; ( DWORD )i < dwlen; i++, j++ ) // dwlen > 0, if known IME : yutakah + { + if( dwerr <= ( DWORD )i && g_dwSelection == ( DWORD )-1 ) + { + g_dwSelection = ( DWORD )j; + } +#ifdef UNICODE + MultiByteToWideChar( g_uCodePage, 0, p + i, 1 + ( _IsLeadByte( p[i] ) ? 1 : 0 ), + g_szCandidate[j], 1 ); + if ( _IsLeadByte( p[i] ) ) + { + i++; + } +#else + g_szCandidate[j][0] = p[i]; + g_szCandidate[j][1] = 0; + g_szCandidate[j][2] = 0; + if( _IsLeadByte(p[i]) ) + { + i++; + g_szCandidate[j][1] = p[i]; + } +#endif + } + g_szCandidate[j][0] = 0; + g_dwCount = j; + } + if( !_GetReadingString ) + { + _ImmUnlockIMCC( lpIMC->hPrivate ); + _ImmUnlockIMC( himc ); + GetReadingWindowOrientation( dwId ); + } + _ImmReleaseContext( hWnd, himc ); + + g_bReadingWindow = true; + if( g_bHorizontalReading ) + { + g_iReadingError = -1; + g_szReadingString[0] = 0; + for( UINT i = 0; i < g_dwCount; i++ ) + { + if( g_dwSelection == ( DWORD )i ) + g_iReadingError = lstrlen( g_szReadingString ); + LPCTSTR pszTmp = g_szCandidate[i]; + wcscat_s( g_szReadingString, COUNTOF(g_szReadingString), pszTmp ); + } + } + g_uCandPageSize = MAX_CANDLIST; +} + + +static struct +{ + bool m_bCtrl; + bool m_bShift; + bool m_bAlt; + UINT m_uVk; +} + aHotKeys[] = +{ + false, false, false, VK_APPS, + true, false, false, '8', + true, false, false, 'Y', + true, false, false, VK_DELETE, + true, false, false, VK_F7, + true, false, false, VK_F9, + true, false, false, VK_F10, + true, false, false, VK_F11, + true, false, false, VK_F12, + false, false, false, VK_F2, + false, false, false, VK_F3, + false, false, false, VK_F4, + false, false, false, VK_F5, + false, false, false, VK_F10, + false, true, false, VK_F6, + false, true, false, VK_F7, + false, true, false, VK_F8, + true, true, false, VK_F10, + true, true, false, VK_F11, + true, false, false, VK_CONVERT, + true, false, false, VK_SPACE, + true, false, true, 0xbc, // Alt + Ctrl + ',': SW keyboard for Trad. Chinese IME + true, false, false, VK_TAB, // ATOK2005's Ctrl+TAB +}; + +// +// Ignores specific keys when IME is on. Returns true if the message is a hot key to ignore. +// - Caller doesn't have to check whether IME is on. +// - This function must be called before TranslateMessage() is called. +// +bool ImeUi_IgnoreHotKey( const MSG* pmsg ) +{ + if( !g_bInitialized || !pmsg ) + return false; + + if( pmsg->wParam == VK_PROCESSKEY && ( pmsg->message == WM_KEYDOWN || pmsg->message == WM_SYSKEYDOWN ) ) + { + bool bCtrl, bShift, bAlt; + UINT uVkReal = _ImmGetVirtualKey( pmsg->hwnd ); + // special case #1 - VK_JUNJA toggles half/full width input mode in Korean IME. + // This VK (sent by Alt+'=' combo) is ignored regardless of the modifier state. + if( uVkReal == VK_JUNJA ) + { + return true; + } + // special case #2 - disable right arrow key that switches the candidate list to expanded mode in CHT IME. + if( uVkReal == VK_RIGHT && g_bCandList && GETLANG() == LANG_CHT ) + { + return true; + } +#ifndef ENABLE_HANJA_KEY + // special case #3 - we disable VK_HANJA key because 1. some Korean fonts don't Hanja and 2. to reduce testing cost. + if( uVkReal == VK_HANJA && GETPRIMLANG() == LANG_KOREAN ) + { + return true; + } +#endif + bCtrl = ( GetKeyState( VK_CONTROL ) & 0x8000 ) ? true : false; + bShift = ( GetKeyState( VK_SHIFT ) & 0x8000 ) ? true : false; + bAlt = ( GetKeyState( VK_MENU ) & 0x8000 ) ? true : false; + for( int i = 0; i < COUNTOF(aHotKeys); i++ ) + { + if( aHotKeys[i].m_bCtrl == bCtrl && + aHotKeys[i].m_bShift == bShift && + aHotKeys[i].m_bAlt == bAlt && + aHotKeys[i].m_uVk == uVkReal ) + return true; + } + } + return false; +} + +void ImeUi_FinalizeString( bool bSend ) +{ + HIMC himc; + static bool bProcessing = false; // to avoid infinite recursion + if( !g_bInitialized || bProcessing || NULL == ( himc = _ImmGetContext( g_hwndCurr ) ) ) + return; + bProcessing = true; + + if( g_dwIMELevel == 2 && bSend ) + { + // Send composition string to app. + LONG lRet = lstrlen( g_szCompositionString ); + assert( lRet >= 2 ); + // In case of CHT IME, don't send the trailing double byte space, if it exists. +#ifdef UNICODE + if ( GETLANG() == LANG_CHT && (lRet >= 1) + && g_szCompositionString[lRet - 1] == 0x3000 ) + { + lRet--; + } +#else + if( GETLANG() == LANG_CHT && ( lRet >= 2 ) + && ( BYTE )( g_szCompositionString[lRet - 2] ) == 0xa1 + && ( BYTE )( g_szCompositionString[lRet - 1] ) == 0x40 ) + { + lRet -= 2; + } +#endif + _SendCompString(); + } + + InitCompStringData(); + // clear composition string in IME + _ImmNotifyIME( himc, NI_COMPOSITIONSTR, CPS_CANCEL, 0 ); + if( g_bUILessMode ) + { + // For some reason ImmNotifyIME doesn't work on DaYi and Array CHT IMEs. Cancel composition string by setting zero-length string. + ImmSetCompositionString( himc, SCS_SETSTR, TEXT( "" ), sizeof( TCHAR ), TEXT( "" ), sizeof( TCHAR ) ); + } + // the following line is necessary as Korean IME doesn't close cand list when comp string is cancelled. + _ImmNotifyIME( himc, NI_CLOSECANDIDATE, 0, 0 ); + _ImmReleaseContext( g_hwndCurr, himc ); + // Zooty2 RAID #4759: Sometimes application doesn't receive IMN_CLOSECANDIDATE on Alt+Tab + // So the same code for IMN_CLOSECANDIDATE is replicated here. + CloseCandidateList(); + bProcessing = false; + return; +} + +static void SetCompStringColor() +{ + // change color setting according to current IME level. + DWORD dwTranslucency = ( g_dwIMELevel == 2 ) ? 0xff000000 : ( ( DWORD )gSkinIME.compTranslucence << 24 ); + gSkinCompStr.colorInput = dwTranslucency | gSkinIME.compColorInput; + gSkinCompStr.colorTargetConv = dwTranslucency | gSkinIME.compColorTargetConv; + gSkinCompStr.colorConverted = dwTranslucency | gSkinIME.compColorConverted; + gSkinCompStr.colorTargetNotConv = dwTranslucency | gSkinIME.compColorTargetNotConv; + gSkinCompStr.colorInputErr = dwTranslucency | gSkinIME.compColorInputErr; +} + +static void SetSupportLevel( DWORD dwImeLevel ) +{ + if( dwImeLevel < 2 || 3 < dwImeLevel ) + return; + if( GETPRIMLANG() == LANG_KOREAN ) + { + dwImeLevel = 3; + } + g_dwIMELevel = dwImeLevel; + // cancel current composition string. + ImeUi_FinalizeString(); + SetCompStringColor(); +} + +void ImeUi_SetSupportLevel( DWORD dwImeLevel ) +{ + if( !g_bInitialized ) + return; + g_dwIMELevelSaved = dwImeLevel; + SetSupportLevel( dwImeLevel ); +} + +void ImeUi_SetAppearance( const IMEUI_APPEARANCE* pia ) +{ + if( !g_bInitialized || NULL == pia ) + return; + gSkinIME = *pia; + gSkinIME.symbolColor &= 0xffffff; // mask translucency + gSkinIME.symbolColorOff &= 0xffffff; // mask translucency + gSkinIME.symbolColorText &= 0xffffff; // mask translucency + gSkinIME.compColorInput &= 0xffffff; // mask translucency + gSkinIME.compColorTargetConv &= 0xffffff; // mask translucency + gSkinIME.compColorConverted &= 0xffffff; // mask translucency + gSkinIME.compColorTargetNotConv &= 0xffffff; // mask translucency + gSkinIME.compColorInputErr &= 0xffffff; // mask translucency + SetCompStringColor(); +} + +void ImeUi_GetAppearance( IMEUI_APPEARANCE* pia ) +{ + if( g_bInitialized && pia ) + { + *pia = gSkinIME; + } +} + +static void CheckToggleState() +{ + CheckInputLocale(); + + // In Vista, we have to use TSF since few IMM functions don't work as expected. + // WARNING: Because of timing, g_dwState and g_bChineseIME may not be updated + // immediately after the change on IME states by user. + if( g_bUILessMode ) + { + return; + } + + bool bIme = _ImmIsIME( g_hklCurrent ) != 0 + && ( ( 0xF0000000 & ( DWORD )g_hklCurrent ) == 0xE0000000 ); // Hack to detect IME correctly. When IME is running as TIP, ImmIsIME() returns true for CHT US keyboard. + g_bChineseIME = ( GETPRIMLANG() == LANG_CHINESE ) && bIme; + + HIMC himc; + if( NULL != ( himc = _ImmGetContext( g_hwndCurr ) ) ) + { + if( g_bChineseIME ) + { + DWORD dwConvMode, dwSentMode; + _ImmGetConversionStatus( himc, &dwConvMode, &dwSentMode ); + g_dwState = ( dwConvMode & IME_CMODE_NATIVE ) ? IMEUI_STATE_ON : IMEUI_STATE_ENGLISH; + } + else + { + g_dwState = ( bIme && _ImmGetOpenStatus( himc ) != 0 ) ? IMEUI_STATE_ON : IMEUI_STATE_OFF; + } + _ImmReleaseContext( g_hwndCurr, himc ); + } + else + g_dwState = IMEUI_STATE_OFF; +} + +void ImeUi_SetInsertMode( bool bInsert ) +{ + if( !g_bInitialized ) + return; + g_bInsertMode = bInsert; +} + +bool ImeUi_GetCaretStatus() +{ + return !g_bInitialized || !g_szCompositionString[0]; +} + +void ImeUi_SetScreenDimension( UINT width, UINT height ) +{ + if( !g_bInitialized ) + return; + g_screenWidth = width; + g_screenHeight = height; +} + +// this function is used only in brief time in CHT IME handling, so accelerator isn't processed. +static void _PumpMessage() +{ + MSG msg; + while( PeekMessageA( &msg, NULL, 0, 0, PM_NOREMOVE ) ) + { + if( !GetMessageA( &msg, NULL, 0, 0 ) ) + { + PostQuitMessage( msg.wParam ); + return; + } + // if (0 == TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) { + TranslateMessage( &msg ); + DispatchMessageA( &msg ); + // } + } +} + +static void GetReadingWindowOrientation( DWORD dwId ) +{ + g_bHorizontalReading = ( g_hklCurrent == _CHS_HKL ) || ( g_hklCurrent == _CHT_HKL_NEW_CHANG_JIE ) || ( dwId == 0 ); + if( !g_bHorizontalReading && IMEID_LANG( dwId ) == LANG_CHT ) + { + char szRegPath[MAX_PATH]; + HKEY hkey; + DWORD dwVer = IMEID_VER( dwId ); + StringCchCopyA( szRegPath, COUNTOF(szRegPath), "software\\microsoft\\windows\\currentversion\\" ); + strcat_s( szRegPath, COUNTOF(szRegPath), ( dwVer >= MAKEIMEVERSION(5, 1) ) ? "MSTCIPH" : "TINTLGNT" ); + LONG lRc = RegOpenKeyExA( HKEY_CURRENT_USER, szRegPath, 0, KEY_READ, &hkey ); + if( lRc == ERROR_SUCCESS ) + { + DWORD dwSize = sizeof( DWORD ), dwMapping, dwType; + lRc = RegQueryValueExA( hkey, "keyboard mapping", NULL, &dwType, ( PBYTE )&dwMapping, &dwSize ); + if( lRc == ERROR_SUCCESS ) + { + if( + ( dwVer <= MAKEIMEVERSION( 5, 0 ) && + ( ( BYTE )dwMapping == 0x22 || ( BYTE )dwMapping == 0x23 ) + ) || + ( ( dwVer == MAKEIMEVERSION( 5, 1 ) || dwVer == MAKEIMEVERSION( 5, 2 ) ) && + ( ( BYTE )dwMapping >= 0x22 && ( BYTE )dwMapping <= 0x24 ) + ) + ) + { + g_bHorizontalReading = true; + } + } + RegCloseKey( hkey ); + } + } +} + +void ImeUi_ToggleLanguageBar( BOOL bRestore ) +{ + static BOOL prevRestore = TRUE; + bool bCheck = ( prevRestore == TRUE || bRestore == TRUE ); + prevRestore = bRestore; + if( !bCheck ) + return; + + static int iShowStatusWindow = -1; + if( iShowStatusWindow == -1 ) + { + iShowStatusWindow = IsNT() && g_osi.dwMajorVersion >= 5 && + ( g_osi.dwMinorVersion > 1 || ( g_osi.dwMinorVersion == 1 && lstrlenA( g_osi.szCSDVersion ) ) ) ? 1 : 0; + } + HWND hwndImeDef = _ImmGetDefaultIMEWnd( g_hwndCurr ); + if( hwndImeDef && bRestore && iShowStatusWindow ) + SendMessageA( hwndImeDef, WM_IME_CONTROL, IMC_OPENSTATUSWINDOW, 0 ); + HRESULT hr; + hr = CoInitialize( NULL ); + if( SUCCEEDED( hr ) ) + { + ITfLangBarMgr* plbm = NULL; + hr = CoCreateInstance( CLSID_TF_LangBarMgr, NULL, CLSCTX_INPROC_SERVER, __uuidof( ITfLangBarMgr ), + ( void** )&plbm ); + if( SUCCEEDED( hr ) && plbm ) + { + DWORD dwCur; + ULONG uRc; + if( SUCCEEDED( hr ) ) + { + if( bRestore ) + { + if( g_dwPrevFloat ) + hr = plbm->ShowFloating( g_dwPrevFloat ); + } + else + { + hr = plbm->GetShowFloatingStatus( &dwCur ); + if( SUCCEEDED( hr ) ) + g_dwPrevFloat = dwCur; + if( !( g_dwPrevFloat & TF_SFT_DESKBAND ) ) + { + hr = plbm->ShowFloating( TF_SFT_HIDDEN ); + } + } + } + uRc = plbm->Release(); + } + CoUninitialize(); + } + if( hwndImeDef && !bRestore ) + { + // The following OPENSTATUSWINDOW is required to hide ATOK16 toolbar (FS9:#7546) + SendMessageA( hwndImeDef, WM_IME_CONTROL, IMC_OPENSTATUSWINDOW, 0 ); + SendMessageA( hwndImeDef, WM_IME_CONTROL, IMC_CLOSESTATUSWINDOW, 0 ); + } +} + +bool ImeUi_IsSendingKeyMessage() +{ + return bIsSendingKeyMessage; +} + +static void OnInputLangChangeWorker() +{ + if( !g_bUILessMode ) + { + g_iCandListIndexBase = ( g_hklCurrent == _CHT_HKL_DAYI ) ? 0 : 1; + } + SetImeApi(); +} + +static void OnInputLangChange() +{ + UINT uLang = GETPRIMLANG(); + CheckToggleState(); + OnInputLangChangeWorker(); + if( uLang != GETPRIMLANG() ) + { + // Korean IME always uses level 3 support. + // Other languages use the level that is specified by ImeUi_SetSupportLevel() + SetSupportLevel( ( GETPRIMLANG() == LANG_KOREAN ) ? 3 : g_dwIMELevelSaved ); + } + HWND hwndImeDef = _ImmGetDefaultIMEWnd( g_hwndCurr ); + if( hwndImeDef ) + { + // Fix for Zooty #3995: prevent CHT IME toobar from showing up + SendMessageA( hwndImeDef, WM_IME_CONTROL, IMC_OPENSTATUSWINDOW, 0 ); + SendMessageA( hwndImeDef, WM_IME_CONTROL, IMC_CLOSESTATUSWINDOW, 0 ); + } +} + +static void SetImeApi() +{ + _GetReadingString = NULL; + _ShowReadingWindow = NULL; + if( g_bUILessMode ) + return; + + char szImeFile[MAX_PATH + 1]; + HKL kl = g_hklCurrent; + if( _ImmGetIMEFileNameA( kl, szImeFile, sizeof( szImeFile ) - 1 ) <= 0 ) + return; + HMODULE hIme = LoadLibraryA( szImeFile ); + if( !hIme ) + return; + _GetReadingString = ( UINT ( WINAPI* )( HIMC, UINT, LPWSTR, PINT, BOOL*, PUINT ) ) + ( GetProcAddress( hIme, "GetReadingString" ) ); + _ShowReadingWindow = ( BOOL ( WINAPI* )( HIMC himc, BOOL ) ) + ( GetProcAddress( hIme, "ShowReadingWindow" ) ); + if( _ShowReadingWindow ) + { + HIMC himc; + if( NULL != ( himc = _ImmGetContext( g_hwndCurr ) ) ) + { + _ShowReadingWindow( himc, false ); + _ImmReleaseContext( g_hwndCurr, himc ); + } + } +} + +static void CheckInputLocale() +{ + static HKL hklPrev = 0; + g_hklCurrent = GetKeyboardLayout( 0 ); + if( hklPrev == g_hklCurrent ) + { + return; + } + hklPrev = g_hklCurrent; + switch( GETPRIMLANG() ) + { + // Simplified Chinese + case LANG_CHINESE: + g_bVerticalCand = true; + switch( GETSUBLANG() ) + { + case SUBLANG_CHINESE_SIMPLIFIED: + g_pszIndicatior = g_aszIndicator[INDICATOR_CHS]; + //g_bVerticalCand = GetImeId() == 0; + g_bVerticalCand = false; + break; + case SUBLANG_CHINESE_TRADITIONAL: + g_pszIndicatior = g_aszIndicator[INDICATOR_CHT]; + break; + default: // unsupported sub-language + g_pszIndicatior = g_aszIndicator[INDICATOR_NON_IME]; + break; + } + break; + // Korean + case LANG_KOREAN: + g_pszIndicatior = g_aszIndicator[INDICATOR_KOREAN]; + g_bVerticalCand = false; + break; + // Japanese + case LANG_JAPANESE: + g_pszIndicatior = g_aszIndicator[INDICATOR_JAPANESE]; + g_bVerticalCand = true; + break; + default: + g_pszIndicatior = g_aszIndicator[INDICATOR_NON_IME]; + } + char szCodePage[8]; + int iRc = GetLocaleInfoA( MAKELCID( GETLANG(), SORT_DEFAULT ), LOCALE_IDEFAULTANSICODEPAGE, szCodePage, + COUNTOF( szCodePage ) ); iRc; + g_uCodePage = _strtoul( szCodePage, NULL, 0 ); + for( int i = 0; i < 256; i++ ) + { + LeadByteTable[i] = ( BYTE )IsDBCSLeadByteEx( g_uCodePage, ( BYTE )i ); + } +} + +void ImeUi_SetWindow( HWND hwnd ) +{ + g_hwndCurr = hwnd; + g_disableCicero.DisableCiceroOnThisWnd( hwnd ); +} + +UINT ImeUi_GetInputCodePage() +{ + return g_uCodePage; +} + +DWORD ImeUi_GetFlags() +{ + return g_dwImeUiFlags; +} + +void ImeUi_SetFlags( DWORD dwFlags, bool bSet ) +{ + if( bSet ) + { + g_dwImeUiFlags |= dwFlags; + } + else + { + g_dwImeUiFlags &= ~dwFlags; + } +} + +/////////////////////////////////////////////////////////////////////////////// +// +// CTsfUiLessMode methods +// +/////////////////////////////////////////////////////////////////////////////// + +// +// SetupSinks() +// Set up sinks. A sink is used to receive a Text Service Framework event. +// CUIElementSink implements multiple sink interfaces to receive few different TSF events. +// +BOOL CTsfUiLessMode::SetupSinks() +{ + // ITfThreadMgrEx is available on Vista or later. + HRESULT hr; + hr = CoCreateInstance( CLSID_TF_ThreadMgr, + NULL, + CLSCTX_INPROC_SERVER, + __uuidof( ITfThreadMgrEx ), + ( void** )&m_tm ); + + if( hr != S_OK ) + { + return FALSE; + } + + // ready to start interacting + TfClientId cid; // not used + if( FAILED( m_tm->ActivateEx( &cid, TF_TMAE_UIELEMENTENABLEDONLY ) ) ) + { + return FALSE; + } + + // Setup sinks + BOOL bRc = FALSE; + m_TsfSink = new CUIElementSink(); + if( m_TsfSink ) + { + ITfSource* srcTm; + if( SUCCEEDED( hr = m_tm->QueryInterface( __uuidof( ITfSource ), ( void** )&srcTm ) ) ) + { + // Sink for reading window change + if( SUCCEEDED( hr = srcTm->AdviseSink( __uuidof( ITfUIElementSink ), ( ITfUIElementSink* )m_TsfSink, + &m_dwUIElementSinkCookie ) ) ) + { + // Sink for input locale change + if( SUCCEEDED( hr = srcTm->AdviseSink( __uuidof( ITfInputProcessorProfileActivationSink ), + ( ITfInputProcessorProfileActivationSink* )m_TsfSink, + &m_dwAlpnSinkCookie ) ) ) + { + if( SetupCompartmentSinks() ) // Setup compartment sinks for the first time + { + bRc = TRUE; + } + } + } + srcTm->Release(); + } + } + return bRc; +} + +void CTsfUiLessMode::ReleaseSinks() +{ + HRESULT hr; + ITfSource* source; + + // Remove all sinks + if( m_tm && SUCCEEDED( m_tm->QueryInterface( __uuidof( ITfSource ), ( void** )&source ) ) ) + { + hr = source->UnadviseSink( m_dwUIElementSinkCookie ); + hr = source->UnadviseSink( m_dwAlpnSinkCookie ); + source->Release(); + SetupCompartmentSinks( TRUE ); // Remove all compartment sinks + m_tm->Deactivate(); + SAFE_RELEASE( m_tm ); + SAFE_RELEASE( m_TsfSink ); + } +} + +CTsfUiLessMode::CUIElementSink::CUIElementSink() +{ + _cRef = 1; +} + + +CTsfUiLessMode::CUIElementSink::~CUIElementSink() +{ +} + +STDAPI CTsfUiLessMode::CUIElementSink::QueryInterface( REFIID riid, void** ppvObj ) +{ + if( ppvObj == NULL ) + return E_INVALIDARG; + + *ppvObj = NULL; + + if( IsEqualIID( riid, IID_IUnknown ) ) + { + *ppvObj = reinterpret_cast( this ); + } + else if( IsEqualIID( riid, __uuidof( ITfUIElementSink ) ) ) + { + *ppvObj = ( ITfUIElementSink* )this; + } + else if( IsEqualIID( riid, __uuidof( ITfInputProcessorProfileActivationSink ) ) ) + { + *ppvObj = ( ITfInputProcessorProfileActivationSink* )this; + } + else if( IsEqualIID( riid, __uuidof( ITfCompartmentEventSink ) ) ) + { + *ppvObj = ( ITfCompartmentEventSink* )this; + } + + if( *ppvObj ) + { + AddRef(); + return S_OK; + } + + return E_NOINTERFACE; +} + +STDAPI_( ULONG ) +CTsfUiLessMode::CUIElementSink::AddRef() +{ + return ++_cRef; +} + +STDAPI_( ULONG ) +CTsfUiLessMode::CUIElementSink::Release() +{ + LONG cr = --_cRef; + + if( _cRef == 0 ) + { + delete this; + } + + return cr; +} + +STDAPI CTsfUiLessMode::CUIElementSink::BeginUIElement( DWORD dwUIElementId, BOOL* pbShow ) +{ + ITfUIElement* pElement = GetUIElement( dwUIElementId ); + if( !pElement ) + return E_INVALIDARG; + + ITfReadingInformationUIElement* preading = NULL; + ITfCandidateListUIElement* pcandidate = NULL; + *pbShow = FALSE; + if( !g_bCandList && SUCCEEDED( pElement->QueryInterface( __uuidof( ITfReadingInformationUIElement ), + ( void** )&preading ) ) ) + { + MakeReadingInformationString( preading ); + preading->Release(); + } + else if( SUCCEEDED( pElement->QueryInterface( __uuidof( ITfCandidateListUIElement ), + ( void** )&pcandidate ) ) ) + { + m_nCandidateRefCount++; + MakeCandidateStrings( pcandidate ); + pcandidate->Release(); + } + + pElement->Release(); + return S_OK; +} + +STDAPI CTsfUiLessMode::CUIElementSink::UpdateUIElement( DWORD dwUIElementId ) +{ + ITfUIElement* pElement = GetUIElement( dwUIElementId ); + if( !pElement ) + return E_INVALIDARG; + + ITfReadingInformationUIElement* preading = NULL; + ITfCandidateListUIElement* pcandidate = NULL; + if( !g_bCandList && SUCCEEDED( pElement->QueryInterface( __uuidof( ITfReadingInformationUIElement ), + ( void** )&preading ) ) ) + { + MakeReadingInformationString( preading ); + preading->Release(); + } + else if( SUCCEEDED( pElement->QueryInterface( __uuidof( ITfCandidateListUIElement ), + ( void** )&pcandidate ) ) ) + { + MakeCandidateStrings( pcandidate ); + pcandidate->Release(); + } + + pElement->Release(); + return S_OK; +} + +STDAPI CTsfUiLessMode::CUIElementSink::EndUIElement( DWORD dwUIElementId ) +{ + ITfUIElement* pElement = GetUIElement( dwUIElementId ); + if( !pElement ) + return E_INVALIDARG; + + ITfReadingInformationUIElement* preading = NULL; + if( !g_bCandList && SUCCEEDED( pElement->QueryInterface( __uuidof( ITfReadingInformationUIElement ), + ( void** )&preading ) ) ) + { + g_dwCount = 0; + preading->Release(); + } + + ITfCandidateListUIElement* pcandidate = NULL; + if( SUCCEEDED( pElement->QueryInterface( __uuidof( ITfCandidateListUIElement ), + ( void** )&pcandidate ) ) ) + { + m_nCandidateRefCount--; + if( m_nCandidateRefCount == 0 ) + CloseCandidateList(); + pcandidate->Release(); + } + + pElement->Release(); + return S_OK; +} + +void CTsfUiLessMode::UpdateImeState( BOOL bResetCompartmentEventSink ) +{ + ITfCompartmentMgr* pcm; + ITfCompartment* pTfOpenMode = NULL; + ITfCompartment* pTfConvMode = NULL; + if( GetCompartments( &pcm, &pTfOpenMode, &pTfConvMode ) ) + { + VARIANT valOpenMode; + VARIANT valConvMode; + pTfOpenMode->GetValue( &valOpenMode ); + pTfConvMode->GetValue( &valConvMode ); + if( valOpenMode.vt == VT_I4 ) + { + if( g_bChineseIME ) + { + g_dwState = valOpenMode.lVal != 0 && valConvMode.lVal != 0 ? IMEUI_STATE_ON : IMEUI_STATE_ENGLISH; + } + else + { + g_dwState = valOpenMode.lVal != 0 ? IMEUI_STATE_ON : IMEUI_STATE_OFF; + } + } + VariantClear( &valOpenMode ); + VariantClear( &valConvMode ); + + if( bResetCompartmentEventSink ) + { + SetupCompartmentSinks( FALSE, pTfOpenMode, pTfConvMode ); // Reset compartment sinks + } + pTfOpenMode->Release(); + pTfConvMode->Release(); + pcm->Release(); + } +} + +STDAPI CTsfUiLessMode::CUIElementSink::OnActivated( DWORD dwProfileType, LANGID langid, REFCLSID clsid, REFGUID catid, + REFGUID guidProfile, HKL hkl, DWORD dwFlags ) +{ + static GUID TF_PROFILE_DAYI = + { + 0x037B2C25, 0x480C, 0x4D7F, 0xB0, 0x27, 0xD6, 0xCA, 0x6B, 0x69, 0x78, 0x8A + }; + g_iCandListIndexBase = IsEqualGUID( TF_PROFILE_DAYI, guidProfile ) ? 0 : 1; + if( IsEqualIID( catid, GUID_TFCAT_TIP_KEYBOARD ) && ( dwFlags & TF_IPSINK_FLAG_ACTIVE ) ) + { + g_bChineseIME = ( dwProfileType & TF_PROFILETYPE_INPUTPROCESSOR ) && langid == LANG_CHT; + if( dwProfileType & TF_PROFILETYPE_INPUTPROCESSOR ) + { + UpdateImeState( TRUE ); + } + else + g_dwState = IMEUI_STATE_OFF; + OnInputLangChange(); + } + return S_OK; +} + +STDAPI CTsfUiLessMode::CUIElementSink::OnChange( REFGUID rguid ) +{ + UpdateImeState(); + return S_OK; +} + +void CTsfUiLessMode::MakeReadingInformationString( ITfReadingInformationUIElement* preading ) +{ + UINT cchMax; + UINT uErrorIndex = 0; + BOOL fVertical; + DWORD dwFlags; + + preading->GetUpdatedFlags( &dwFlags ); + preading->GetMaxReadingStringLength( &cchMax ); + preading->GetErrorIndex( &uErrorIndex ); // errorIndex is zero-based + preading->IsVerticalOrderPreferred( &fVertical ); + g_iReadingError = ( int )uErrorIndex; + g_bHorizontalReading = !fVertical; + g_bReadingWindow = true; + g_uCandPageSize = MAX_CANDLIST; + g_dwSelection = g_iReadingError ? g_iReadingError - 1 : ( DWORD )-1; + g_iReadingError--; // g_iReadingError is used only in horizontal window, and has to be -1 if there's no error. +#ifndef UNICODE + if( g_iReadingError > 0 ) + { + // convert g_iReadingError to byte based + LPCSTR pszNext = g_szReadingString; + for( int i = 0; i < g_iReadingError && pszNext && *pszNext; ++i ) + { + pszNext = CharNext( pszNext ); + } + if( pszNext ) // should be non-NULL, but just in case + { + g_iReadingError = pszNext - g_szReadingString; + } + } +#endif + + BSTR bstr; + if( SUCCEEDED( preading->GetString( &bstr ) ) ) + { + if( bstr ) + { +#ifndef UNICODE + char szStr[COUNTOF(g_szReadingString)*2]; + szStr[0] = 0; + int iRc = WideCharToMultiByte( CP_ACP, 0, bstr, -1, szStr, sizeof( szStr ), NULL, NULL ); + if( iRc >= sizeof( szStr ) ) + { + szStr[sizeof( szStr ) - 1] = 0; + } + StringCchCopy( g_szReadingString, COUNTOF(g_szReadingString), szStr ); +#else + StringCchCopy( g_szReadingString, COUNTOF(g_szReadingString), bstr ); +#endif + g_dwCount = cchMax; + LPCTSTR pszSource = g_szReadingString; + if( fVertical ) + { + // for vertical reading window, copy each character to g_szCandidate array. + for( UINT i = 0; i < cchMax; i++ ) + { + LPTSTR pszDest = g_szCandidate[i]; + if( *pszSource ) + { + LPTSTR pszNextSrc = CharNext( pszSource ); + SIZE_T size = ( LPSTR )pszNextSrc - ( LPSTR )pszSource; + CopyMemory( pszDest, pszSource, size ); + pszSource = pszNextSrc; + pszDest += size; + } + *pszDest = 0; + } + } + else + { + g_szCandidate[0][0] = TEXT( ' ' ); // hack to make rendering happen + } + SysFreeString( bstr ); + } + } +} + +void CTsfUiLessMode::MakeCandidateStrings( ITfCandidateListUIElement* pcandidate ) +{ + UINT uIndex = 0; + UINT uCount = 0; + UINT uCurrentPage = 0; + UINT* IndexList = NULL; + UINT uPageCnt = 0; + DWORD dwPageStart = 0; + DWORD dwPageSize = 0; + BSTR bstr; + + pcandidate->GetSelection( &uIndex ); + pcandidate->GetCount( &uCount ); + pcandidate->GetCurrentPage( &uCurrentPage ); + g_dwSelection = ( DWORD )uIndex; + g_dwCount = ( DWORD )uCount; + g_bCandList = true; + g_bReadingWindow = false; + + pcandidate->GetPageIndex( NULL, 0, &uPageCnt ); + if( uPageCnt > 0 ) + { + IndexList = ( UINT* )ImeUiCallback_Malloc( sizeof( UINT ) * uPageCnt ); + if( IndexList ) + { + pcandidate->GetPageIndex( IndexList, uPageCnt, &uPageCnt ); + dwPageStart = IndexList[uCurrentPage]; + dwPageSize = ( uCurrentPage < uPageCnt - 1 ) ? + min( uCount, IndexList[uCurrentPage + 1] ) - dwPageStart: + uCount - dwPageStart; + } + } + + g_uCandPageSize = min( dwPageSize, MAX_CANDLIST ); + g_dwSelection = g_dwSelection - dwPageStart; + + memset( &g_szCandidate, 0, sizeof( g_szCandidate ) ); + for( UINT i = dwPageStart, j = 0; ( DWORD )i < g_dwCount && j < g_uCandPageSize; i++, j++ ) + { + if( SUCCEEDED( pcandidate->GetString( i, &bstr ) ) ) + { + if( bstr ) + { +#ifndef UNICODE + char szStr[COUNTOF(g_szCandidate[0])*2]; + szStr[0] = 0; + int iRc = WideCharToMultiByte( CP_ACP, 0, bstr, -1, szStr, sizeof( szStr ), NULL, NULL ); + if( iRc >= sizeof( szStr ) ) + { + szStr[sizeof( szStr ) - 1] = 0; + } + ComposeCandidateLine( j, szStr ); +#else + ComposeCandidateLine( j, bstr ); +#endif + SysFreeString( bstr ); + } + } + } + + if( GETPRIMLANG() == LANG_KOREAN ) + { + g_dwSelection = ( DWORD )-1; + } + + if( IndexList ) + { + ImeUiCallback_Free( IndexList ); + } +} + +ITfUIElement* CTsfUiLessMode::GetUIElement( DWORD dwUIElementId ) +{ + ITfUIElementMgr* puiem; + ITfUIElement* pElement = NULL; + + if( SUCCEEDED( m_tm->QueryInterface( __uuidof( ITfUIElementMgr ), ( void** )&puiem ) ) ) + { + puiem->GetUIElement( dwUIElementId, &pElement ); + puiem->Release(); + } + + return pElement; +} + +BOOL CTsfUiLessMode::CurrentInputLocaleIsIme() +{ + BOOL ret = FALSE; + HRESULT hr; + + ITfInputProcessorProfiles* pProfiles; + hr = CoCreateInstance( CLSID_TF_InputProcessorProfiles, NULL, CLSCTX_INPROC_SERVER, + __uuidof( ITfInputProcessorProfiles ), ( LPVOID* )&pProfiles ); + if( SUCCEEDED( hr ) ) + { + ITfInputProcessorProfileMgr* pProfileMgr; + hr = pProfiles->QueryInterface( __uuidof( ITfInputProcessorProfileMgr ), ( LPVOID* )&pProfileMgr ); + if( SUCCEEDED( hr ) ) + { + TF_INPUTPROCESSORPROFILE tip; + hr = pProfileMgr->GetActiveProfile( GUID_TFCAT_TIP_KEYBOARD, &tip ); + if( SUCCEEDED( hr ) ) + { + ret = ( tip.dwProfileType & TF_PROFILETYPE_INPUTPROCESSOR ) != 0; + } + pProfileMgr->Release(); + } + pProfiles->Release(); + } + return ret; +} + +// Sets up or removes sink for UI element. +// UI element sink should be removed when IME is disabled, +// otherwise the sink can be triggered when a game has multiple instances of IME UI library. +void CTsfUiLessMode::EnableUiUpdates( bool bEnable ) +{ + if( m_tm == NULL || + ( bEnable && m_dwUIElementSinkCookie != TF_INVALID_COOKIE ) || + ( !bEnable && m_dwUIElementSinkCookie == TF_INVALID_COOKIE ) ) + { + return; + } + ITfSource* srcTm = NULL; + HRESULT hr = E_FAIL; + if( SUCCEEDED( hr = m_tm->QueryInterface( __uuidof( ITfSource ), ( void** )&srcTm ) ) ) + { + if( bEnable ) + { + hr = srcTm->AdviseSink( __uuidof( ITfUIElementSink ), ( ITfUIElementSink* )m_TsfSink, + &m_dwUIElementSinkCookie ); + } + else + { + hr = srcTm->UnadviseSink( m_dwUIElementSinkCookie ); + m_dwUIElementSinkCookie = TF_INVALID_COOKIE; + } + srcTm->Release(); + } +} + +// Returns open mode compartments and compartment manager. +// Function fails if it fails to acquire any of the objects to be returned. +BOOL CTsfUiLessMode::GetCompartments( ITfCompartmentMgr** ppcm, ITfCompartment** ppTfOpenMode, + ITfCompartment** ppTfConvMode ) +{ + ITfCompartmentMgr* pcm = NULL; + ITfCompartment* pTfOpenMode = NULL; + ITfCompartment* pTfConvMode = NULL; + + static GUID _GUID_COMPARTMENT_KEYBOARD_INPUTMODE_CONVERSION = + { + 0xCCF05DD8, 0x4A87, 0x11D7, 0xA6, 0xE2, 0x00, 0x06, 0x5B, 0x84, 0x43, 0x5C + }; + + HRESULT hr; + if( SUCCEEDED( hr = m_tm->QueryInterface( IID_ITfCompartmentMgr, ( void** )&pcm ) ) ) + { + if( SUCCEEDED( hr = pcm->GetCompartment( GUID_COMPARTMENT_KEYBOARD_OPENCLOSE, &pTfOpenMode ) ) ) + { + if( SUCCEEDED( hr = pcm->GetCompartment( _GUID_COMPARTMENT_KEYBOARD_INPUTMODE_CONVERSION, + &pTfConvMode ) ) ) + { + *ppcm = pcm; + *ppTfOpenMode = pTfOpenMode; + *ppTfConvMode = pTfConvMode; + return TRUE; + } + pTfOpenMode->Release(); + } + pcm->Release(); + } + return FALSE; +} + +// There are three ways to call this function: +// SetupCompartmentSinks() : initialization +// SetupCompartmentSinks(FALSE, openmode, convmode) : Resetting sinks. This is necessary as DaYi and Array IME resets compartment on switching input locale +// SetupCompartmentSinks(TRUE) : clean up sinks +BOOL CTsfUiLessMode::SetupCompartmentSinks( BOOL bRemoveOnly, ITfCompartment* pTfOpenMode, + ITfCompartment* pTfConvMode ) +{ + bool bLocalCompartments = false; + ITfCompartmentMgr* pcm = NULL; + BOOL bRc = FALSE; + HRESULT hr = E_FAIL; + + if( !pTfOpenMode && !pTfConvMode ) + { + bLocalCompartments = true; + GetCompartments( &pcm, &pTfOpenMode, &pTfConvMode ); + } + if( !( pTfOpenMode && pTfConvMode ) ) + { + // Invalid parameters or GetCompartments() has failed. + return FALSE; + } + ITfSource* srcOpenMode = NULL; + if( SUCCEEDED( hr = pTfOpenMode->QueryInterface( IID_ITfSource, ( void** )&srcOpenMode ) ) ) + { + // Remove existing sink for open mode + if( m_dwOpenModeSinkCookie != TF_INVALID_COOKIE ) + { + srcOpenMode->UnadviseSink( m_dwOpenModeSinkCookie ); + m_dwOpenModeSinkCookie = TF_INVALID_COOKIE; + } + // Setup sink for open mode (toggle state) change + if( bRemoveOnly || SUCCEEDED( hr = srcOpenMode->AdviseSink( IID_ITfCompartmentEventSink, + ( ITfCompartmentEventSink* )m_TsfSink, + &m_dwOpenModeSinkCookie ) ) ) + { + ITfSource* srcConvMode = NULL; + if( SUCCEEDED( hr = pTfConvMode->QueryInterface( IID_ITfSource, ( void** )&srcConvMode ) ) ) + { + // Remove existing sink for open mode + if( m_dwConvModeSinkCookie != TF_INVALID_COOKIE ) + { + srcConvMode->UnadviseSink( m_dwConvModeSinkCookie ); + m_dwConvModeSinkCookie = TF_INVALID_COOKIE; + } + // Setup sink for open mode (toggle state) change + if( bRemoveOnly || SUCCEEDED( hr = srcConvMode->AdviseSink( IID_ITfCompartmentEventSink, + ( ITfCompartmentEventSink* )m_TsfSink, + &m_dwConvModeSinkCookie ) ) ) + { + bRc = TRUE; + } + srcConvMode->Release(); + } + } + srcOpenMode->Release(); + } + if( bLocalCompartments ) + { + pTfOpenMode->Release(); + pTfConvMode->Release(); + pcm->Release(); + } + return bRc; +} + + +WORD ImeUi_GetPrimaryLanguage() +{ + return GETPRIMLANG(); +}; + +DWORD ImeUi_GetImeId( UINT uIndex ) +{ + return GetImeId( uIndex ); +}; + +WORD ImeUi_GetLanguage() +{ + return GETLANG(); +}; + +PTSTR ImeUi_GetIndicatior() +{ + return g_pszIndicatior; +}; + + +bool ImeUi_IsShowReadingWindow() +{ + return g_bReadingWindow; +}; + +bool ImeUi_IsShowCandListWindow() +{ + return g_bCandList; +}; + +bool ImeUi_IsVerticalCand() +{ + return g_bVerticalCand; +}; + +bool ImeUi_IsHorizontalReading() +{ + return g_bHorizontalReading; +}; + +TCHAR* ImeUi_GetCandidate( UINT idx ) +{ + if( idx < MAX_CANDLIST ) + return g_szCandidate[idx]; + else + return g_szCandidate[0]; +} + +DWORD ImeUi_GetCandidateSelection() +{ + return g_dwSelection; +} + +DWORD ImeUi_GetCandidateCount() +{ + return g_dwCount; +} + +TCHAR* ImeUi_GetCompositionString() +{ + return g_szCompositionString; +} + +BYTE* ImeUi_GetCompStringAttr() +{ + return g_szCompAttrString; +} + +DWORD ImeUi_GetImeCursorChars() +{ + return g_IMECursorChars; +} + diff --git a/Demos/DX11ClothDemo/DXUT/Optional/ImeUi.h b/Demos/DX11ClothDemo/DXUT/Optional/ImeUi.h new file mode 100644 index 000000000..c8d2b2f06 --- /dev/null +++ b/Demos/DX11ClothDemo/DXUT/Optional/ImeUi.h @@ -0,0 +1,124 @@ +//-------------------------------------------------------------------------------------- +// File: ImeUi.h +// +// Copyright (c) Microsoft Corporation. All rights reserved. +//-------------------------------------------------------------------------------------- +#ifndef _IMEUI_H_ +#define _IMEUI_H_ +#if _WIN32_WINNT < 0x0400 +#error IMEUI requires _WIN32_WINNT to be 0x0400 or higher. Please add "_WIN32_WINNT=0x0400" to your project's preprocessor setting. +#endif +#include + +class CImeUiFont_Base +{ +public: + virtual void SetHeight( UINT uHeight ) + { + uHeight; + }; // for backward compatibility + virtual void SetColor( DWORD color ) = 0; + virtual void SetPosition( int x, int y ) = 0; + virtual void GetTextExtent( LPCTSTR szText, DWORD* puWidth, DWORD* puHeight ) = 0; + virtual void DrawText( LPCTSTR pszText ) = 0; +}; + +typedef struct +{ + // symbol (Henkan-kyu) + DWORD symbolColor; + DWORD symbolColorOff; + DWORD symbolColorText; + BYTE symbolHeight; + BYTE symbolTranslucence; + BYTE symbolPlacement; + CImeUiFont_Base* symbolFont; + + // candidate list + DWORD candColorBase; + DWORD candColorBorder; + DWORD candColorText; + + // composition string + DWORD compColorInput; + DWORD compColorTargetConv; + DWORD compColorConverted; + DWORD compColorTargetNotConv; + DWORD compColorInputErr; + BYTE compTranslucence; + DWORD compColorText; + + // caret + BYTE caretWidth; + BYTE caretYMargin; +} IMEUI_APPEARANCE; + +typedef struct // D3DTLVERTEX compatible +{ + float sx; + float sy; + float sz; + float rhw; + DWORD color; + DWORD specular; + float tu; + float tv; +} IMEUI_VERTEX; + +// IME States +#define IMEUI_STATE_OFF 0 +#define IMEUI_STATE_ON 1 +#define IMEUI_STATE_ENGLISH 2 + +// IME const +#define MAX_CANDLIST 10 + +// IME Flags +#define IMEUI_FLAG_SUPPORT_CARET 0x00000001 + +bool ImeUi_Initialize( HWND hwnd, bool bDisable = false ); +void ImeUi_Uninitialize(); +void ImeUi_SetAppearance( const IMEUI_APPEARANCE* pia ); +void ImeUi_GetAppearance( IMEUI_APPEARANCE* pia ); +bool ImeUi_IgnoreHotKey( const MSG* pmsg ); +LPARAM ImeUi_ProcessMessage( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM& lParam, bool* trapped ); +void ImeUi_SetScreenDimension( UINT width, UINT height ); +void ImeUi_RenderUI( bool bDrawCompAttr = true, bool bDrawOtherUi = true ); +void ImeUi_SetCaretPosition( UINT x, UINT y ); +void ImeUi_SetCompStringAppearance( CImeUiFont_Base* pFont, DWORD color, const RECT* prc ); +bool ImeUi_GetCaretStatus(); +void ImeUi_SetInsertMode( bool bInsert ); +void ImeUi_SetState( DWORD dwState ); +DWORD ImeUi_GetState(); +void ImeUi_EnableIme( bool bEnable ); +bool ImeUi_IsEnabled( void ); +void ImeUi_FinalizeString( bool bSend = false ); +void ImeUi_ToggleLanguageBar( BOOL bRestore ); +bool ImeUi_IsSendingKeyMessage(); +void ImeUi_SetWindow( HWND hwnd ); +UINT ImeUi_GetInputCodePage(); +DWORD ImeUi_GetFlags(); +void ImeUi_SetFlags( DWORD dwFlags, bool bSet ); + +WORD ImeUi_GetPrimaryLanguage(); +DWORD ImeUi_GetImeId( UINT uIndex ); +WORD ImeUi_GetLanguage(); +LPTSTR ImeUi_GetIndicatior(); +bool ImeUi_IsShowReadingWindow(); +bool ImeUi_IsShowCandListWindow(); +bool ImeUi_IsVerticalCand(); +bool ImeUi_IsHorizontalReading(); +TCHAR* ImeUi_GetCandidate( UINT idx ); +TCHAR* ImeUi_GetCompositionString(); +DWORD ImeUi_GetCandidateSelection(); +DWORD ImeUi_GetCandidateCount(); +BYTE* ImeUi_GetCompStringAttr(); +DWORD ImeUi_GetImeCursorChars(); + +extern void ( CALLBACK*ImeUiCallback_DrawRect )( int x1, int y1, int x2, int y2, DWORD color ); +extern void* ( __cdecl*ImeUiCallback_Malloc )( size_t bytes ); +extern void ( __cdecl*ImeUiCallback_Free )( void* ptr ); +extern void ( CALLBACK*ImeUiCallback_DrawFans )( const IMEUI_VERTEX* paVertex, UINT uNum ); +extern void ( CALLBACK*ImeUiCallback_OnChar )( WCHAR wc ); + +#endif //_IMEUI_H_ diff --git a/Demos/DX11ClothDemo/DXUT/Optional/SDKmesh.cpp b/Demos/DX11ClothDemo/DXUT/Optional/SDKmesh.cpp new file mode 100644 index 000000000..42bae83cc --- /dev/null +++ b/Demos/DX11ClothDemo/DXUT/Optional/SDKmesh.cpp @@ -0,0 +1,2348 @@ +//-------------------------------------------------------------------------------------- +// File: SDKMesh.cpp +// +// The SDK Mesh format (.sdkmesh) is not a recommended file format for games. +// It was designed to meet the specific needs of the SDK samples. Any real-world +// applications should avoid this file format in favor of a destination format that +// meets the specific needs of the application. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +//-------------------------------------------------------------------------------------- +#include "DXUT.h" +#include "SDKMesh.h" +#include "SDKMisc.h" + +//-------------------------------------------------------------------------------------- +void CDXUTSDKMesh::LoadMaterials( ID3D11Device* pd3dDevice, SDKMESH_MATERIAL* pMaterials, UINT numMaterials, + SDKMESH_CALLBACKS11* pLoaderCallbacks ) +{ + // TODO: D3D11 + char strPath[MAX_PATH]; + + if( pLoaderCallbacks && pLoaderCallbacks->pCreateTextureFromFile ) + { + for( UINT m = 0; m < numMaterials; m++ ) + { + pMaterials[m].pDiffuseTexture11 = NULL; + pMaterials[m].pNormalTexture11 = NULL; + pMaterials[m].pSpecularTexture11 = NULL; + pMaterials[m].pDiffuseRV11 = NULL; + pMaterials[m].pNormalRV11 = NULL; + pMaterials[m].pSpecularRV11 = NULL; + + // load textures + if( pMaterials[m].DiffuseTexture[0] != 0 ) + { + pLoaderCallbacks->pCreateTextureFromFile( pd3dDevice, + pMaterials[m].DiffuseTexture, &pMaterials[m].pDiffuseRV11, + pLoaderCallbacks->pContext ); + } + if( pMaterials[m].NormalTexture[0] != 0 ) + { + pLoaderCallbacks->pCreateTextureFromFile( pd3dDevice, + pMaterials[m].NormalTexture, &pMaterials[m].pNormalRV11, + pLoaderCallbacks->pContext ); + } + if( pMaterials[m].SpecularTexture[0] != 0 ) + { + pLoaderCallbacks->pCreateTextureFromFile( pd3dDevice, + pMaterials[m].SpecularTexture, &pMaterials[m].pSpecularRV11, + pLoaderCallbacks->pContext ); + } + } + } + else + { + for( UINT m = 0; m < numMaterials; m++ ) + { + pMaterials[m].pDiffuseTexture11 = NULL; + pMaterials[m].pNormalTexture11 = NULL; + pMaterials[m].pSpecularTexture11 = NULL; + pMaterials[m].pDiffuseRV11 = NULL; + pMaterials[m].pNormalRV11 = NULL; + pMaterials[m].pSpecularRV11 = NULL; + + // load textures + if( pMaterials[m].DiffuseTexture[0] != 0 ) + { + sprintf_s( strPath, MAX_PATH, "%s%s", m_strPath, pMaterials[m].DiffuseTexture ); + if( FAILED( DXUTGetGlobalResourceCache().CreateTextureFromFile( pd3dDevice, DXUTGetD3D11DeviceContext(), + strPath, &pMaterials[m].pDiffuseRV11, + true ) ) ) + pMaterials[m].pDiffuseRV11 = ( ID3D11ShaderResourceView* )ERROR_RESOURCE_VALUE; + + } + if( pMaterials[m].NormalTexture[0] != 0 ) + { + sprintf_s( strPath, MAX_PATH, "%s%s", m_strPath, pMaterials[m].NormalTexture ); + if( FAILED( DXUTGetGlobalResourceCache().CreateTextureFromFile( pd3dDevice, DXUTGetD3D11DeviceContext(), + strPath, + &pMaterials[m].pNormalRV11 ) ) ) + pMaterials[m].pNormalRV11 = ( ID3D11ShaderResourceView* )ERROR_RESOURCE_VALUE; + } + if( pMaterials[m].SpecularTexture[0] != 0 ) + { + sprintf_s( strPath, MAX_PATH, "%s%s", m_strPath, pMaterials[m].SpecularTexture ); + if( FAILED( DXUTGetGlobalResourceCache().CreateTextureFromFile( pd3dDevice, DXUTGetD3D11DeviceContext(), + strPath, + &pMaterials[m].pSpecularRV11 ) ) ) + pMaterials[m].pSpecularRV11 = ( ID3D11ShaderResourceView* )ERROR_RESOURCE_VALUE; + } + } + } +} + +//-------------------------------------------------------------------------------------- +void CDXUTSDKMesh::LoadMaterials( IDirect3DDevice9* pd3dDevice, SDKMESH_MATERIAL* pMaterials, UINT numMaterials, + SDKMESH_CALLBACKS9* pLoaderCallbacks ) +{ + char strPath[MAX_PATH]; + + if( pLoaderCallbacks && pLoaderCallbacks->pCreateTextureFromFile ) + { + for( UINT m = 0; m < numMaterials; m++ ) + { + pMaterials[m].pDiffuseTexture9 = NULL; + pMaterials[m].pNormalTexture9 = NULL; + pMaterials[m].pSpecularTexture9 = NULL; + + // load textures + if( pMaterials[m].DiffuseTexture[0] != 0 ) + { + pLoaderCallbacks->pCreateTextureFromFile( pd3dDevice, + pMaterials[m].DiffuseTexture, + &pMaterials[m].pDiffuseTexture9, + pLoaderCallbacks->pContext ); + } + if( pMaterials[m].NormalTexture[0] != 0 ) + { + pLoaderCallbacks->pCreateTextureFromFile( pd3dDevice, + pMaterials[m].NormalTexture, &pMaterials[m].pNormalTexture9, + pLoaderCallbacks->pContext ); + } + if( pMaterials[m].SpecularTexture[0] != 0 ) + { + pLoaderCallbacks->pCreateTextureFromFile( pd3dDevice, + pMaterials[m].SpecularTexture, + &pMaterials[m].pSpecularTexture9, + pLoaderCallbacks->pContext ); + } + } + } + else + { + for( UINT m = 0; m < numMaterials; m++ ) + { + pMaterials[m].pDiffuseTexture9 = NULL; + pMaterials[m].pNormalTexture9 = NULL; + pMaterials[m].pSpecularTexture9 = NULL; + pMaterials[m].pDiffuseRV11 = NULL; + pMaterials[m].pNormalRV11 = NULL; + pMaterials[m].pSpecularRV11 = NULL; + + // load textures + if( pMaterials[m].DiffuseTexture[0] != 0 ) + { + sprintf_s( strPath, MAX_PATH, "%s%s", m_strPath, pMaterials[m].DiffuseTexture ); + if( FAILED( DXUTGetGlobalResourceCache().CreateTextureFromFile( pd3dDevice, + strPath, + &pMaterials[m].pDiffuseTexture9 ) ) ) + pMaterials[m].pDiffuseTexture9 = ( IDirect3DTexture9* )ERROR_RESOURCE_VALUE; + } + if( pMaterials[m].NormalTexture[0] != 0 ) + { + sprintf_s( strPath, MAX_PATH, "%s%s", m_strPath, pMaterials[m].NormalTexture ); + if( FAILED( DXUTGetGlobalResourceCache().CreateTextureFromFile( pd3dDevice, + strPath, + &pMaterials[m].pNormalTexture9 ) ) ) + pMaterials[m].pNormalTexture9 = ( IDirect3DTexture9* )ERROR_RESOURCE_VALUE; + } + if( pMaterials[m].SpecularTexture[0] != 0 ) + { + sprintf_s( strPath, MAX_PATH, "%s%s", m_strPath, pMaterials[m].SpecularTexture ); + if( FAILED( DXUTGetGlobalResourceCache().CreateTextureFromFile( pd3dDevice, + strPath, + &pMaterials[m].pSpecularTexture9 ) ) ) + pMaterials[m].pSpecularTexture9 = ( IDirect3DTexture9* )ERROR_RESOURCE_VALUE; + } + + } + } +} + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTSDKMesh::CreateVertexBuffer( ID3D11Device* pd3dDevice, SDKMESH_VERTEX_BUFFER_HEADER* pHeader, + void* pVertices, SDKMESH_CALLBACKS11* pLoaderCallbacks ) +{ + HRESULT hr = S_OK; + pHeader->DataOffset = 0; + //Vertex Buffer + D3D11_BUFFER_DESC bufferDesc; + bufferDesc.ByteWidth = ( UINT )( pHeader->SizeBytes ); + bufferDesc.Usage = D3D11_USAGE_DEFAULT; + bufferDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER; + bufferDesc.CPUAccessFlags = 0; + bufferDesc.MiscFlags = 0; + + if( pLoaderCallbacks && pLoaderCallbacks->pCreateVertexBuffer ) + { + pLoaderCallbacks->pCreateVertexBuffer( pd3dDevice, &pHeader->pVB11, bufferDesc, pVertices, + pLoaderCallbacks->pContext ); + } + else + { + D3D11_SUBRESOURCE_DATA InitData; + InitData.pSysMem = pVertices; + hr = pd3dDevice->CreateBuffer( &bufferDesc, &InitData, &pHeader->pVB11 ); + } + + return hr; +} + + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTSDKMesh::CreateIndexBuffer( ID3D11Device* pd3dDevice, SDKMESH_INDEX_BUFFER_HEADER* pHeader, + void* pIndices, SDKMESH_CALLBACKS11* pLoaderCallbacks ) +{ + HRESULT hr = S_OK; + pHeader->DataOffset = 0; + //Index Buffer + D3D11_BUFFER_DESC bufferDesc; + bufferDesc.ByteWidth = ( UINT )( pHeader->SizeBytes ); + bufferDesc.Usage = D3D11_USAGE_DEFAULT; + bufferDesc.BindFlags = D3D11_BIND_INDEX_BUFFER; + bufferDesc.CPUAccessFlags = 0; + bufferDesc.MiscFlags = 0; + + if( pLoaderCallbacks && pLoaderCallbacks->pCreateIndexBuffer ) + { + pLoaderCallbacks->pCreateIndexBuffer( pd3dDevice, &pHeader->pIB11, bufferDesc, pIndices, + pLoaderCallbacks->pContext ); + } + else + { + D3D11_SUBRESOURCE_DATA InitData; + InitData.pSysMem = pIndices; + hr = pd3dDevice->CreateBuffer( &bufferDesc, &InitData, &pHeader->pIB11 ); + } + + return hr; +} + + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTSDKMesh::CreateVertexBuffer( IDirect3DDevice9* pd3dDevice, SDKMESH_VERTEX_BUFFER_HEADER* pHeader, + void* pVertices, SDKMESH_CALLBACKS9* pLoaderCallbacks ) +{ + HRESULT hr = S_OK; + + pHeader->DataOffset = 0; + if( pLoaderCallbacks && pLoaderCallbacks->pCreateVertexBuffer ) + { + pLoaderCallbacks->pCreateVertexBuffer( pd3dDevice, &pHeader->pVB9, ( UINT )pHeader->SizeBytes, + D3DUSAGE_WRITEONLY, 0, D3DPOOL_DEFAULT, pVertices, + pLoaderCallbacks->pContext ); + } + else + { + hr = pd3dDevice->CreateVertexBuffer( ( UINT )pHeader->SizeBytes, + D3DUSAGE_WRITEONLY, + 0, + D3DPOOL_DEFAULT, + &pHeader->pVB9, + NULL ); + + //lock + if( SUCCEEDED( hr ) ) + { + void* pLockedVerts = NULL; + V_RETURN( pHeader->pVB9->Lock( 0, 0, &pLockedVerts, 0 ) ); + CopyMemory( pLockedVerts, pVertices, ( size_t )pHeader->SizeBytes ); + pHeader->pVB9->Unlock(); + } + } + + return hr; +} + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTSDKMesh::CreateIndexBuffer( IDirect3DDevice9* pd3dDevice, SDKMESH_INDEX_BUFFER_HEADER* pHeader, + void* pIndices, SDKMESH_CALLBACKS9* pLoaderCallbacks ) +{ + HRESULT hr = S_OK; + + pHeader->DataOffset = 0; + + D3DFORMAT ibFormat = D3DFMT_INDEX16; + switch( pHeader->IndexType ) + { + case IT_16BIT: + ibFormat = D3DFMT_INDEX16; + break; + case IT_32BIT: + ibFormat = D3DFMT_INDEX32; + break; + }; + + if( pLoaderCallbacks && pLoaderCallbacks->pCreateIndexBuffer ) + { + pLoaderCallbacks->pCreateIndexBuffer( pd3dDevice, &pHeader->pIB9, ( UINT )pHeader->SizeBytes, + D3DUSAGE_WRITEONLY, ibFormat, D3DPOOL_DEFAULT, pIndices, + pLoaderCallbacks->pContext ); + } + else + { + hr = pd3dDevice->CreateIndexBuffer( ( UINT )( pHeader->SizeBytes ), + D3DUSAGE_WRITEONLY, + ibFormat, + D3DPOOL_DEFAULT, + &pHeader->pIB9, + NULL ); + + if( SUCCEEDED( hr ) ) + { + void* pLockedIndices = NULL; + V_RETURN( pHeader->pIB9->Lock( 0, 0, &pLockedIndices, 0 ) ); + CopyMemory( pLockedIndices, pIndices, ( size_t )( pHeader->SizeBytes ) ); + pHeader->pIB9->Unlock(); + } + } + + return hr; +} + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTSDKMesh::CreateFromFile( ID3D11Device* pDev11, + IDirect3DDevice9* pDev9, + LPCTSTR szFileName, + bool bCreateAdjacencyIndices, + SDKMESH_CALLBACKS11* pLoaderCallbacks11, + SDKMESH_CALLBACKS9* pLoaderCallbacks9 ) +{ + HRESULT hr = S_OK; + + // Find the path for the file + V_RETURN( DXUTFindDXSDKMediaFileCch( m_strPathW, sizeof( m_strPathW ) / sizeof( WCHAR ), szFileName ) ); + + // Open the file + m_hFile = CreateFile( m_strPathW, FILE_READ_DATA, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, + NULL ); + if( INVALID_HANDLE_VALUE == m_hFile ) + return DXUTERR_MEDIANOTFOUND; + + // Change the path to just the directory + WCHAR* pLastBSlash = wcsrchr( m_strPathW, L'\\' ); + if( pLastBSlash ) + *( pLastBSlash + 1 ) = L'\0'; + else + *m_strPathW = L'\0'; + + WideCharToMultiByte( CP_ACP, 0, m_strPathW, -1, m_strPath, MAX_PATH, NULL, FALSE ); + + // Get the file size + LARGE_INTEGER FileSize; + GetFileSizeEx( m_hFile, &FileSize ); + UINT cBytes = FileSize.LowPart; + + // Allocate memory + m_pStaticMeshData = new BYTE[ cBytes ]; + if( !m_pStaticMeshData ) + { + CloseHandle( m_hFile ); + return E_OUTOFMEMORY; + } + + // Read in the file + DWORD dwBytesRead; + if( !ReadFile( m_hFile, m_pStaticMeshData, cBytes, &dwBytesRead, NULL ) ) + hr = E_FAIL; + + CloseHandle( m_hFile ); + + if( SUCCEEDED( hr ) ) + { + hr = CreateFromMemory( pDev11, + pDev9, + m_pStaticMeshData, + cBytes, + bCreateAdjacencyIndices, + false, + pLoaderCallbacks11, + pLoaderCallbacks9 ); + if( FAILED( hr ) ) + delete []m_pStaticMeshData; + } + + return hr; +} + +HRESULT CDXUTSDKMesh::CreateFromMemory( ID3D11Device* pDev11, + IDirect3DDevice9* pDev9, + BYTE* pData, + UINT DataBytes, + bool bCreateAdjacencyIndices, + bool bCopyStatic, + SDKMESH_CALLBACKS11* pLoaderCallbacks11, + SDKMESH_CALLBACKS9* pLoaderCallbacks9 ) +{ + HRESULT hr = E_FAIL; + D3DXVECTOR3 lower; + D3DXVECTOR3 upper; + + m_pDev9 = pDev9; + m_pDev11 = pDev11; + + // Set outstanding resources to zero + m_NumOutstandingResources = 0; + + if( bCopyStatic ) + { + SDKMESH_HEADER* pHeader = ( SDKMESH_HEADER* )pData; + + SIZE_T StaticSize = ( SIZE_T )( pHeader->HeaderSize + pHeader->NonBufferDataSize ); + m_pHeapData = new BYTE[ StaticSize ]; + if( !m_pHeapData ) + return hr; + + m_pStaticMeshData = m_pHeapData; + + CopyMemory( m_pStaticMeshData, pData, StaticSize ); + } + else + { + m_pHeapData = pData; + m_pStaticMeshData = pData; + } + + // Pointer fixup + m_pMeshHeader = ( SDKMESH_HEADER* )m_pStaticMeshData; + m_pVertexBufferArray = ( SDKMESH_VERTEX_BUFFER_HEADER* )( m_pStaticMeshData + + m_pMeshHeader->VertexStreamHeadersOffset ); + m_pIndexBufferArray = ( SDKMESH_INDEX_BUFFER_HEADER* )( m_pStaticMeshData + + m_pMeshHeader->IndexStreamHeadersOffset ); + m_pMeshArray = ( SDKMESH_MESH* )( m_pStaticMeshData + m_pMeshHeader->MeshDataOffset ); + m_pSubsetArray = ( SDKMESH_SUBSET* )( m_pStaticMeshData + m_pMeshHeader->SubsetDataOffset ); + m_pFrameArray = ( SDKMESH_FRAME* )( m_pStaticMeshData + m_pMeshHeader->FrameDataOffset ); + m_pMaterialArray = ( SDKMESH_MATERIAL* )( m_pStaticMeshData + m_pMeshHeader->MaterialDataOffset ); + + // Setup subsets + for( UINT i = 0; i < m_pMeshHeader->NumMeshes; i++ ) + { + m_pMeshArray[i].pSubsets = ( UINT* )( m_pStaticMeshData + m_pMeshArray[i].SubsetOffset ); + m_pMeshArray[i].pFrameInfluences = ( UINT* )( m_pStaticMeshData + m_pMeshArray[i].FrameInfluenceOffset ); + } + + // error condition + if( m_pMeshHeader->Version != SDKMESH_FILE_VERSION ) + { + hr = E_NOINTERFACE; + goto Error; + } + + // Setup buffer data pointer + BYTE* pBufferData = pData + m_pMeshHeader->HeaderSize + m_pMeshHeader->NonBufferDataSize; + + // Get the start of the buffer data + UINT64 BufferDataStart = m_pMeshHeader->HeaderSize + m_pMeshHeader->NonBufferDataSize; + + // Create VBs + m_ppVertices = new BYTE*[m_pMeshHeader->NumVertexBuffers]; + for( UINT i = 0; i < m_pMeshHeader->NumVertexBuffers; i++ ) + { + BYTE* pVertices = NULL; + pVertices = ( BYTE* )( pBufferData + ( m_pVertexBufferArray[i].DataOffset - BufferDataStart ) ); + + if( pDev11 ) + CreateVertexBuffer( pDev11, &m_pVertexBufferArray[i], pVertices, pLoaderCallbacks11 ); + else if( pDev9 ) + CreateVertexBuffer( pDev9, &m_pVertexBufferArray[i], pVertices, pLoaderCallbacks9 ); + + m_ppVertices[i] = pVertices; + } + + // Create IBs + m_ppIndices = new BYTE*[m_pMeshHeader->NumIndexBuffers]; + for( UINT i = 0; i < m_pMeshHeader->NumIndexBuffers; i++ ) + { + BYTE* pIndices = NULL; + pIndices = ( BYTE* )( pBufferData + ( m_pIndexBufferArray[i].DataOffset - BufferDataStart ) ); + + if( pDev11 ) + CreateIndexBuffer( pDev11, &m_pIndexBufferArray[i], pIndices, pLoaderCallbacks11 ); + else if( pDev9 ) + CreateIndexBuffer( pDev9, &m_pIndexBufferArray[i], pIndices, pLoaderCallbacks9 ); + + m_ppIndices[i] = pIndices; + } + + // Load Materials + if( pDev11 ) + LoadMaterials( pDev11, m_pMaterialArray, m_pMeshHeader->NumMaterials, pLoaderCallbacks11 ); + else if( pDev9 ) + LoadMaterials( pDev9, m_pMaterialArray, m_pMeshHeader->NumMaterials, pLoaderCallbacks9 ); + + // Create a place to store our bind pose frame matrices + m_pBindPoseFrameMatrices = new D3DXMATRIX[ m_pMeshHeader->NumFrames ]; + if( !m_pBindPoseFrameMatrices ) + goto Error; + + // Create a place to store our transformed frame matrices + m_pTransformedFrameMatrices = new D3DXMATRIX[ m_pMeshHeader->NumFrames ]; + if( !m_pTransformedFrameMatrices ) + goto Error; + m_pWorldPoseFrameMatrices = new D3DXMATRIX[ m_pMeshHeader->NumFrames ]; + if( !m_pWorldPoseFrameMatrices ) + goto Error; + + SDKMESH_SUBSET* pSubset = NULL; + D3D11_PRIMITIVE_TOPOLOGY PrimType; + + // update bounding volume + SDKMESH_MESH* currentMesh = &m_pMeshArray[0]; + int tris = 0; + for (UINT meshi=0; meshi < m_pMeshHeader->NumMeshes; ++meshi) { + lower.x = FLT_MAX; lower.y = FLT_MAX; lower.z = FLT_MAX; + upper.x = -FLT_MAX; upper.y = -FLT_MAX; upper.z = -FLT_MAX; + currentMesh = GetMesh( meshi ); + INT indsize; + if (m_pIndexBufferArray[currentMesh->IndexBuffer].IndexType == IT_16BIT ) { + indsize = 2; + }else { + indsize = 4; + } + + for( UINT subset = 0; subset < currentMesh->NumSubsets; subset++ ) + { + pSubset = GetSubset( meshi, subset ); //&m_pSubsetArray[ currentMesh->pSubsets[subset] ]; + + PrimType = GetPrimitiveType11( ( SDKMESH_PRIMITIVE_TYPE )pSubset->PrimitiveType ); + assert( PrimType == D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST );// only triangle lists are handled. + + UINT IndexCount = ( UINT )pSubset->IndexCount; + UINT IndexStart = ( UINT )pSubset->IndexStart; + + /*if( bAdjacent ) + { + IndexCount *= 2; + IndexStart *= 2; + }*/ + + //BYTE* pIndices = NULL; + //m_ppIndices[i] + UINT *ind = ( UINT * )m_ppIndices[currentMesh->IndexBuffer]; + FLOAT *verts = ( FLOAT* )m_ppVertices[currentMesh->VertexBuffers[0]]; + UINT stride = (UINT)m_pVertexBufferArray[currentMesh->VertexBuffers[0]].StrideBytes; + assert (stride % 4 == 0); + stride /=4; + for (UINT vertind = IndexStart; vertind < IndexStart + IndexCount; ++vertind) { //TODO: test 16 bit and 32 bit + UINT current_ind=0; + if (indsize == 2) { + UINT ind_div2 = vertind / 2; + current_ind = ind[ind_div2]; + if (vertind %2 ==0) { + current_ind = current_ind << 16; + current_ind = current_ind >> 16; + }else { + current_ind = current_ind >> 16; + } + }else { + current_ind = ind[vertind]; + } + tris++; + D3DXVECTOR3 *pt = (D3DXVECTOR3*)&(verts[stride * current_ind]); + if (pt->x < lower.x) { + lower.x = pt->x; + } + if (pt->y < lower.y) { + lower.y = pt->y; + } + if (pt->z < lower.z) { + lower.z = pt->z; + } + if (pt->x > upper.x) { + upper.x = pt->x; + } + if (pt->y > upper.y) { + upper.y = pt->y; + } + if (pt->z > upper.z) { + upper.z = pt->z; + } + //BYTE** m_ppVertices; + //BYTE** m_ppIndices; + } + //pd3dDeviceContext->DrawIndexed( IndexCount, IndexStart, VertexStart ); + } + + D3DXVECTOR3 half = upper - lower; + half *=0.5f; + + currentMesh->BoundingBoxCenter = lower + half; + currentMesh->BoundingBoxExtents = half; + + } + // Update + + + + hr = S_OK; +Error: + + if( !pLoaderCallbacks9 ) + { + CheckLoadDone(); + } + + return hr; +} + +//-------------------------------------------------------------------------------------- +// transform bind pose frame using a recursive traversal +//-------------------------------------------------------------------------------------- +void CDXUTSDKMesh::TransformBindPoseFrame( UINT iFrame, D3DXMATRIX* pParentWorld ) +{ + if( !m_pBindPoseFrameMatrices ) + return; + + // Transform ourselves + D3DXMATRIX LocalWorld; + D3DXMatrixMultiply( &LocalWorld, &m_pFrameArray[iFrame].Matrix, pParentWorld ); + m_pBindPoseFrameMatrices[iFrame] = LocalWorld; + + // Transform our siblings + if( m_pFrameArray[iFrame].SiblingFrame != INVALID_FRAME ) + TransformBindPoseFrame( m_pFrameArray[iFrame].SiblingFrame, pParentWorld ); + + // Transform our children + if( m_pFrameArray[iFrame].ChildFrame != INVALID_FRAME ) + TransformBindPoseFrame( m_pFrameArray[iFrame].ChildFrame, &LocalWorld ); +} + +//-------------------------------------------------------------------------------------- +// transform frame using a recursive traversal +//-------------------------------------------------------------------------------------- +void CDXUTSDKMesh::TransformFrame( UINT iFrame, D3DXMATRIX* pParentWorld, double fTime ) +{ + // Get the tick data + D3DXMATRIX LocalTransform; + UINT iTick = GetAnimationKeyFromTime( fTime ); + + if( INVALID_ANIMATION_DATA != m_pFrameArray[iFrame].AnimationDataIndex ) + { + SDKANIMATION_FRAME_DATA* pFrameData = &m_pAnimationFrameData[ m_pFrameArray[iFrame].AnimationDataIndex ]; + SDKANIMATION_DATA* pData = &pFrameData->pAnimationData[ iTick ]; + + // turn it into a matrix (Ignore scaling for now) + D3DXVECTOR3 parentPos = pData->Translation; + D3DXMATRIX mTranslate; + D3DXMatrixTranslation( &mTranslate, parentPos.x, parentPos.y, parentPos.z ); + + D3DXQUATERNION quat; + D3DXMATRIX mQuat; + quat.w = pData->Orientation.w; + quat.x = pData->Orientation.x; + quat.y = pData->Orientation.y; + quat.z = pData->Orientation.z; + if( quat.w == 0 && quat.x == 0 && quat.y == 0 && quat.z == 0 ) + D3DXQuaternionIdentity( &quat ); + D3DXQuaternionNormalize( &quat, &quat ); + D3DXMatrixRotationQuaternion( &mQuat, &quat ); + LocalTransform = ( mQuat * mTranslate ); + } + else + { + LocalTransform = m_pFrameArray[iFrame].Matrix; + } + + // Transform ourselves + D3DXMATRIX LocalWorld; + D3DXMatrixMultiply( &LocalWorld, &LocalTransform, pParentWorld ); + m_pTransformedFrameMatrices[iFrame] = LocalWorld; + m_pWorldPoseFrameMatrices[iFrame] = LocalWorld; + + // Transform our siblings + if( m_pFrameArray[iFrame].SiblingFrame != INVALID_FRAME ) + TransformFrame( m_pFrameArray[iFrame].SiblingFrame, pParentWorld, fTime ); + + // Transform our children + if( m_pFrameArray[iFrame].ChildFrame != INVALID_FRAME ) + TransformFrame( m_pFrameArray[iFrame].ChildFrame, &LocalWorld, fTime ); +} + +//-------------------------------------------------------------------------------------- +// transform frame assuming that it is an absolute transformation +//-------------------------------------------------------------------------------------- +void CDXUTSDKMesh::TransformFrameAbsolute( UINT iFrame, double fTime ) +{ + D3DXMATRIX mTrans1; + D3DXMATRIX mTrans2; + D3DXMATRIX mRot1; + D3DXMATRIX mRot2; + D3DXQUATERNION quat1; + D3DXQUATERNION quat2; + D3DXMATRIX mTo; + D3DXMATRIX mInvTo; + D3DXMATRIX mFrom; + + UINT iTick = GetAnimationKeyFromTime( fTime ); + + if( INVALID_ANIMATION_DATA != m_pFrameArray[iFrame].AnimationDataIndex ) + { + SDKANIMATION_FRAME_DATA* pFrameData = &m_pAnimationFrameData[ m_pFrameArray[iFrame].AnimationDataIndex ]; + SDKANIMATION_DATA* pData = &pFrameData->pAnimationData[ iTick ]; + SDKANIMATION_DATA* pDataOrig = &pFrameData->pAnimationData[ 0 ]; + + D3DXMatrixTranslation( &mTrans1, -pDataOrig->Translation.x, + -pDataOrig->Translation.y, + -pDataOrig->Translation.z ); + D3DXMatrixTranslation( &mTrans2, pData->Translation.x, + pData->Translation.y, + pData->Translation.z ); + + quat1.x = pDataOrig->Orientation.x; + quat1.y = pDataOrig->Orientation.y; + quat1.z = pDataOrig->Orientation.z; + quat1.w = pDataOrig->Orientation.w; + D3DXQuaternionInverse( &quat1, &quat1 ); + D3DXMatrixRotationQuaternion( &mRot1, &quat1 ); + mInvTo = mTrans1 * mRot1; + + quat2.x = pData->Orientation.x; + quat2.y = pData->Orientation.y; + quat2.z = pData->Orientation.z; + quat2.w = pData->Orientation.w; + D3DXMatrixRotationQuaternion( &mRot2, &quat2 ); + mFrom = mRot2 * mTrans2; + + D3DXMATRIX mOutput = mInvTo * mFrom; + m_pTransformedFrameMatrices[iFrame] = mOutput; + } +} + +#define MAX_D3D11_VERTEX_STREAMS D3D11_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT +//-------------------------------------------------------------------------------------- +void CDXUTSDKMesh::RenderMesh( UINT iMesh, + bool bAdjacent, + ID3D11DeviceContext* pd3dDeviceContext, + UINT iDiffuseSlot, + UINT iNormalSlot, + UINT iSpecularSlot ) +{ + if( 0 < GetOutstandingBufferResources() ) + return; + + SDKMESH_MESH* pMesh = &m_pMeshArray[iMesh]; + + UINT Strides[MAX_D3D11_VERTEX_STREAMS]; + UINT Offsets[MAX_D3D11_VERTEX_STREAMS]; + ID3D11Buffer* pVB[MAX_D3D11_VERTEX_STREAMS]; + + if( pMesh->NumVertexBuffers > MAX_D3D11_VERTEX_STREAMS ) + return; + + for( UINT64 i = 0; i < pMesh->NumVertexBuffers; i++ ) + { + pVB[i] = m_pVertexBufferArray[ pMesh->VertexBuffers[i] ].pVB11; + Strides[i] = ( UINT )m_pVertexBufferArray[ pMesh->VertexBuffers[i] ].StrideBytes; + Offsets[i] = 0; + } + + SDKMESH_INDEX_BUFFER_HEADER* pIndexBufferArray; + if( bAdjacent ) + pIndexBufferArray = m_pAdjacencyIndexBufferArray; + else + pIndexBufferArray = m_pIndexBufferArray; + + ID3D11Buffer* pIB = pIndexBufferArray[ pMesh->IndexBuffer ].pIB11; + DXGI_FORMAT ibFormat = DXGI_FORMAT_R16_UINT; + switch( pIndexBufferArray[ pMesh->IndexBuffer ].IndexType ) + { + case IT_16BIT: + ibFormat = DXGI_FORMAT_R16_UINT; + break; + case IT_32BIT: + ibFormat = DXGI_FORMAT_R32_UINT; + break; + }; + + pd3dDeviceContext->IASetVertexBuffers( 0, pMesh->NumVertexBuffers, pVB, Strides, Offsets ); + pd3dDeviceContext->IASetIndexBuffer( pIB, ibFormat, 0 ); + + SDKMESH_SUBSET* pSubset = NULL; + SDKMESH_MATERIAL* pMat = NULL; + D3D11_PRIMITIVE_TOPOLOGY PrimType; + + for( UINT subset = 0; subset < pMesh->NumSubsets; subset++ ) + { + pSubset = &m_pSubsetArray[ pMesh->pSubsets[subset] ]; + + PrimType = GetPrimitiveType11( ( SDKMESH_PRIMITIVE_TYPE )pSubset->PrimitiveType ); + if( bAdjacent ) + { + switch( PrimType ) + { + case D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST: + PrimType = D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST_ADJ; + break; + case D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP: + PrimType = D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP_ADJ; + break; + case D3D11_PRIMITIVE_TOPOLOGY_LINELIST: + PrimType = D3D11_PRIMITIVE_TOPOLOGY_LINELIST_ADJ; + break; + case D3D11_PRIMITIVE_TOPOLOGY_LINESTRIP: + PrimType = D3D11_PRIMITIVE_TOPOLOGY_LINESTRIP_ADJ; + break; + } + } + + pd3dDeviceContext->IASetPrimitiveTopology( PrimType ); + + pMat = &m_pMaterialArray[ pSubset->MaterialID ]; + if( iDiffuseSlot != INVALID_SAMPLER_SLOT && !IsErrorResource( pMat->pDiffuseRV11 ) ) + pd3dDeviceContext->PSSetShaderResources( iDiffuseSlot, 1, &pMat->pDiffuseRV11 ); + if( iNormalSlot != INVALID_SAMPLER_SLOT && !IsErrorResource( pMat->pNormalRV11 ) ) + pd3dDeviceContext->PSSetShaderResources( iNormalSlot, 1, &pMat->pNormalRV11 ); + if( iSpecularSlot != INVALID_SAMPLER_SLOT && !IsErrorResource( pMat->pSpecularRV11 ) ) + pd3dDeviceContext->PSSetShaderResources( iSpecularSlot, 1, &pMat->pSpecularRV11 ); + + UINT IndexCount = ( UINT )pSubset->IndexCount; + UINT IndexStart = ( UINT )pSubset->IndexStart; + UINT VertexStart = ( UINT )pSubset->VertexStart; + if( bAdjacent ) + { + IndexCount *= 2; + IndexStart *= 2; + } + + pd3dDeviceContext->DrawIndexed( IndexCount, IndexStart, VertexStart ); + } +} + +//-------------------------------------------------------------------------------------- +void CDXUTSDKMesh::RenderFrame( UINT iFrame, + bool bAdjacent, + ID3D11DeviceContext* pd3dDeviceContext, + UINT iDiffuseSlot, + UINT iNormalSlot, + UINT iSpecularSlot ) +{ + if( !m_pStaticMeshData || !m_pFrameArray ) + return; + + if( m_pFrameArray[iFrame].Mesh != INVALID_MESH ) + { + RenderMesh( m_pFrameArray[iFrame].Mesh, + bAdjacent, + pd3dDeviceContext, + iDiffuseSlot, + iNormalSlot, + iSpecularSlot ); + } + + // Render our children + if( m_pFrameArray[iFrame].ChildFrame != INVALID_FRAME ) + RenderFrame( m_pFrameArray[iFrame].ChildFrame, bAdjacent, pd3dDeviceContext, iDiffuseSlot, + iNormalSlot, iSpecularSlot ); + + // Render our siblings + if( m_pFrameArray[iFrame].SiblingFrame != INVALID_FRAME ) + RenderFrame( m_pFrameArray[iFrame].SiblingFrame, bAdjacent, pd3dDeviceContext, iDiffuseSlot, + iNormalSlot, iSpecularSlot ); +} + +//-------------------------------------------------------------------------------------- + +//-------------------------------------------------------------------------------------- +void CDXUTSDKMesh::RenderMesh( UINT iMesh, + LPDIRECT3DDEVICE9 pd3dDevice, + LPD3DXEFFECT pEffect, + D3DXHANDLE hTechnique, + D3DXHANDLE htxDiffuse, + D3DXHANDLE htxNormal, + D3DXHANDLE htxSpecular ) +{ + if( 0 < GetOutstandingBufferResources() ) + return; + + SDKMESH_MESH* pMesh = &m_pMeshArray[iMesh]; + + // set vb streams + for( UINT i = 0; i < ( UINT )pMesh->NumVertexBuffers; i++ ) + { + pd3dDevice->SetStreamSource( i, + m_pVertexBufferArray[ pMesh->VertexBuffers[i] ].pVB9, + 0, + ( UINT )m_pVertexBufferArray[ pMesh->VertexBuffers[i] ].StrideBytes ); + } + + // Set our index buffer as well + pd3dDevice->SetIndices( m_pIndexBufferArray[ pMesh->IndexBuffer ].pIB9 ); + + // Render the scene with this technique + pEffect->SetTechnique( hTechnique ); + + SDKMESH_SUBSET* pSubset = NULL; + SDKMESH_MATERIAL* pMat = NULL; + D3DPRIMITIVETYPE PrimType; + UINT cPasses = 0; + pEffect->Begin( &cPasses, 0 ); + + for( UINT p = 0; p < cPasses; ++p ) + { + pEffect->BeginPass( p ); + + for( UINT subset = 0; subset < pMesh->NumSubsets; subset++ ) + { + pSubset = &m_pSubsetArray[ pMesh->pSubsets[subset] ]; + + PrimType = GetPrimitiveType9( ( SDKMESH_PRIMITIVE_TYPE )pSubset->PrimitiveType ); + + if( INVALID_MATERIAL != pSubset->MaterialID && m_pMeshHeader->NumMaterials > 0 ) + { + pMat = &m_pMaterialArray[ pSubset->MaterialID ]; + if( htxDiffuse && !IsErrorResource( pMat->pDiffuseTexture9 ) ) + pEffect->SetTexture( htxDiffuse, pMat->pDiffuseTexture9 ); + if( htxNormal && !IsErrorResource( pMat->pNormalTexture9 ) ) + pEffect->SetTexture( htxNormal, pMat->pNormalTexture9 ); + if( htxSpecular && !IsErrorResource( pMat->pSpecularTexture9 ) ) + pEffect->SetTexture( htxSpecular, pMat->pSpecularTexture9 ); + } + + pEffect->CommitChanges(); + + UINT PrimCount = ( UINT )pSubset->IndexCount; + UINT IndexStart = ( UINT )pSubset->IndexStart; + UINT VertexStart = ( UINT )pSubset->VertexStart; + UINT VertexCount = ( UINT )pSubset->VertexCount; + if( D3DPT_TRIANGLELIST == PrimType ) + PrimCount /= 3; + if( D3DPT_LINELIST == PrimType ) + PrimCount /= 2; + if( D3DPT_TRIANGLESTRIP == PrimType ) + PrimCount = ( PrimCount - 3 ) + 1; + if( D3DPT_LINESTRIP == PrimType ) + PrimCount -= 1; + + pd3dDevice->DrawIndexedPrimitive( PrimType, VertexStart, 0, VertexCount, IndexStart, PrimCount ); + } + + pEffect->EndPass(); + } + + pEffect->End(); +} + +//-------------------------------------------------------------------------------------- +void CDXUTSDKMesh::RenderFrame( UINT iFrame, + LPDIRECT3DDEVICE9 pd3dDevice, + LPD3DXEFFECT pEffect, + D3DXHANDLE hTechnique, + D3DXHANDLE htxDiffuse, + D3DXHANDLE htxNormal, + D3DXHANDLE htxSpecular ) +{ + if( !m_pStaticMeshData || !m_pFrameArray ) + return; + + if( m_pFrameArray[iFrame].Mesh != INVALID_MESH ) + { + RenderMesh( m_pFrameArray[iFrame].Mesh, + pd3dDevice, + pEffect, + hTechnique, + htxDiffuse, + htxNormal, + htxSpecular ); + } + + // Render our children + if( m_pFrameArray[iFrame].ChildFrame != INVALID_FRAME ) + RenderFrame( m_pFrameArray[iFrame].ChildFrame, pd3dDevice, pEffect, hTechnique, htxDiffuse, htxNormal, + htxSpecular ); + + // Render our siblings + if( m_pFrameArray[iFrame].SiblingFrame != INVALID_FRAME ) + RenderFrame( m_pFrameArray[iFrame].SiblingFrame, pd3dDevice, pEffect, hTechnique, htxDiffuse, htxNormal, + htxSpecular ); +} + + +//-------------------------------------------------------------------------------------- +CDXUTSDKMesh::CDXUTSDKMesh() : m_NumOutstandingResources( 0 ), + m_bLoading( false ), + m_hFile( 0 ), + m_hFileMappingObject( 0 ), + m_pMeshHeader( NULL ), + m_pStaticMeshData( NULL ), + m_pHeapData( NULL ), + m_pAdjacencyIndexBufferArray( NULL ), + m_pAnimationData( NULL ), + m_pAnimationHeader( NULL ), + m_ppVertices( NULL ), + m_ppIndices( NULL ), + m_pBindPoseFrameMatrices( NULL ), + m_pTransformedFrameMatrices( NULL ), + m_pWorldPoseFrameMatrices( NULL ), + m_pDev9( NULL ), + m_pDev11( NULL ) +{ +} + + +//-------------------------------------------------------------------------------------- +CDXUTSDKMesh::~CDXUTSDKMesh() +{ + Destroy(); +} + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTSDKMesh::Create( ID3D11Device* pDev11, LPCTSTR szFileName, bool bCreateAdjacencyIndices, + SDKMESH_CALLBACKS11* pLoaderCallbacks ) +{ + return CreateFromFile( pDev11, NULL, szFileName, bCreateAdjacencyIndices, pLoaderCallbacks, NULL ); +} + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTSDKMesh::Create( IDirect3DDevice9* pDev9, LPCTSTR szFileName, bool bCreateAdjacencyIndices, + SDKMESH_CALLBACKS9* pLoaderCallbacks ) +{ + return CreateFromFile( NULL, pDev9, szFileName, bCreateAdjacencyIndices, NULL, pLoaderCallbacks ); +} + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTSDKMesh::Create( ID3D11Device* pDev11, BYTE* pData, UINT DataBytes, bool bCreateAdjacencyIndices, + bool bCopyStatic, SDKMESH_CALLBACKS11* pLoaderCallbacks ) +{ + return CreateFromMemory( pDev11, NULL, pData, DataBytes, bCreateAdjacencyIndices, bCopyStatic, + pLoaderCallbacks, NULL ); +} + + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTSDKMesh::Create( IDirect3DDevice9* pDev9, BYTE* pData, UINT DataBytes, bool bCreateAdjacencyIndices, + bool bCopyStatic, SDKMESH_CALLBACKS9* pLoaderCallbacks ) +{ + return CreateFromMemory( NULL, pDev9, pData, DataBytes, bCreateAdjacencyIndices, bCopyStatic, NULL, + pLoaderCallbacks ); +} + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTSDKMesh::LoadAnimation( WCHAR* szFileName ) +{ + HRESULT hr = E_FAIL; + DWORD dwBytesRead = 0; + LARGE_INTEGER liMove; + WCHAR strPath[MAX_PATH]; + + // Find the path for the file + V_RETURN( DXUTFindDXSDKMediaFileCch( strPath, MAX_PATH, szFileName ) ); + + // Open the file + HANDLE hFile = CreateFile( strPath, FILE_READ_DATA, FILE_SHARE_READ, NULL, OPEN_EXISTING, + FILE_FLAG_SEQUENTIAL_SCAN, NULL ); + if( INVALID_HANDLE_VALUE == hFile ) + return DXUTERR_MEDIANOTFOUND; + + ///////////////////////// + // Header + SDKANIMATION_FILE_HEADER fileheader; + if( !ReadFile( hFile, &fileheader, sizeof( SDKANIMATION_FILE_HEADER ), &dwBytesRead, NULL ) ) + goto Error; + + //allocate + m_pAnimationData = new BYTE[ ( size_t )( sizeof( SDKANIMATION_FILE_HEADER ) + fileheader.AnimationDataSize ) ]; + if( !m_pAnimationData ) + { + hr = E_OUTOFMEMORY; + goto Error; + } + + // read it all in + liMove.QuadPart = 0; + if( !SetFilePointerEx( hFile, liMove, NULL, FILE_BEGIN ) ) + goto Error; + if( !ReadFile( hFile, m_pAnimationData, ( DWORD )( sizeof( SDKANIMATION_FILE_HEADER ) + + fileheader.AnimationDataSize ), &dwBytesRead, NULL ) ) + goto Error; + + // pointer fixup + m_pAnimationHeader = ( SDKANIMATION_FILE_HEADER* )m_pAnimationData; + m_pAnimationFrameData = ( SDKANIMATION_FRAME_DATA* )( m_pAnimationData + m_pAnimationHeader->AnimationDataOffset ); + + UINT64 BaseOffset = sizeof( SDKANIMATION_FILE_HEADER ); + for( UINT i = 0; i < m_pAnimationHeader->NumFrames; i++ ) + { + m_pAnimationFrameData[i].pAnimationData = ( SDKANIMATION_DATA* )( m_pAnimationData + + m_pAnimationFrameData[i].DataOffset + + BaseOffset ); + SDKMESH_FRAME* pFrame = FindFrame( m_pAnimationFrameData[i].FrameName ); + if( pFrame ) + { + pFrame->AnimationDataIndex = i; + } + } + + hr = S_OK; +Error: + CloseHandle( hFile ); + return hr; +} + +//-------------------------------------------------------------------------------------- +void CDXUTSDKMesh::Destroy() +{ + if( !CheckLoadDone() ) + return; + + if( m_pStaticMeshData ) + { + if( m_pMaterialArray ) + { + for( UINT64 m = 0; m < m_pMeshHeader->NumMaterials; m++ ) + { + if( m_pDev9 ) + { + if( !IsErrorResource( m_pMaterialArray[m].pDiffuseTexture9 ) ) + SAFE_RELEASE( m_pMaterialArray[m].pDiffuseTexture9 ); + if( !IsErrorResource( m_pMaterialArray[m].pNormalTexture9 ) ) + SAFE_RELEASE( m_pMaterialArray[m].pNormalTexture9 ); + if( !IsErrorResource( m_pMaterialArray[m].pSpecularTexture9 ) ) + SAFE_RELEASE( m_pMaterialArray[m].pSpecularTexture9 ); + } + else if( m_pDev11 ) + { + //ID3D11Resource* pRes = NULL; + if( m_pMaterialArray[m].pDiffuseRV11 && !IsErrorResource( m_pMaterialArray[m].pDiffuseRV11 ) ) + { + //m_pMaterialArray[m].pDiffuseRV11->GetResource( &pRes ); + //SAFE_RELEASE( pRes ); + + SAFE_RELEASE( m_pMaterialArray[m].pDiffuseRV11 ); + } + if( m_pMaterialArray[m].pNormalRV11 && !IsErrorResource( m_pMaterialArray[m].pNormalRV11 ) ) + { + //m_pMaterialArray[m].pNormalRV11->GetResource( &pRes ); + //SAFE_RELEASE( pRes ); + + SAFE_RELEASE( m_pMaterialArray[m].pNormalRV11 ); + } + if( m_pMaterialArray[m].pSpecularRV11 && !IsErrorResource( m_pMaterialArray[m].pSpecularRV11 ) ) + { + //m_pMaterialArray[m].pSpecularRV11->GetResource( &pRes ); + //SAFE_RELEASE( pRes ); + + SAFE_RELEASE( m_pMaterialArray[m].pSpecularRV11 ); + } + } + } + } + + for( UINT64 i = 0; i < m_pMeshHeader->NumVertexBuffers; i++ ) + { + if( !IsErrorResource( m_pVertexBufferArray[i].pVB9 ) ) + SAFE_RELEASE( m_pVertexBufferArray[i].pVB9 ); + } + + for( UINT64 i = 0; i < m_pMeshHeader->NumIndexBuffers; i++ ) + { + if( !IsErrorResource( m_pIndexBufferArray[i].pIB9 ) ) + SAFE_RELEASE( m_pIndexBufferArray[i].pIB9 ); + } + } + + if( m_pAdjacencyIndexBufferArray ) + { + for( UINT64 i = 0; i < m_pMeshHeader->NumIndexBuffers; i++ ) + { + SAFE_RELEASE( m_pAdjacencyIndexBufferArray[i].pIB11 ); + } + } + SAFE_DELETE_ARRAY( m_pAdjacencyIndexBufferArray ); + + SAFE_DELETE_ARRAY( m_pHeapData ); + m_pStaticMeshData = NULL; + SAFE_DELETE_ARRAY( m_pAnimationData ); + SAFE_DELETE_ARRAY( m_pBindPoseFrameMatrices ); + SAFE_DELETE_ARRAY( m_pTransformedFrameMatrices ); + SAFE_DELETE_ARRAY( m_pWorldPoseFrameMatrices ); + + SAFE_DELETE_ARRAY( m_ppVertices ); + SAFE_DELETE_ARRAY( m_ppIndices ); + + m_pMeshHeader = NULL; + m_pVertexBufferArray = NULL; + m_pIndexBufferArray = NULL; + m_pMeshArray = NULL; + m_pSubsetArray = NULL; + m_pFrameArray = NULL; + m_pMaterialArray = NULL; + + m_pAnimationHeader = NULL; + m_pAnimationFrameData = NULL; + +} + +//-------------------------------------------------------------------------------------- +// transform the bind pose +//-------------------------------------------------------------------------------------- +void CDXUTSDKMesh::TransformBindPose( D3DXMATRIX* pWorld ) +{ + TransformBindPoseFrame( 0, pWorld ); +} + +//-------------------------------------------------------------------------------------- +// transform the mesh frames according to the animation for time fTime +//-------------------------------------------------------------------------------------- +void CDXUTSDKMesh::TransformMesh( D3DXMATRIX* pWorld, double fTime ) +{ + if( m_pAnimationHeader == NULL || FTT_RELATIVE == m_pAnimationHeader->FrameTransformType ) + { + TransformFrame( 0, pWorld, fTime ); + + // For each frame, move the transform to the bind pose, then + // move it to the final position + D3DXMATRIX mInvBindPose; + D3DXMATRIX mFinal; + for( UINT i = 0; i < m_pMeshHeader->NumFrames; i++ ) + { + D3DXMatrixInverse( &mInvBindPose, NULL, &m_pBindPoseFrameMatrices[i] ); + mFinal = mInvBindPose * m_pTransformedFrameMatrices[i]; + m_pTransformedFrameMatrices[i] = mFinal; + } + } + else if( FTT_ABSOLUTE == m_pAnimationHeader->FrameTransformType ) + { + for( UINT i = 0; i < m_pAnimationHeader->NumFrames; i++ ) + TransformFrameAbsolute( i, fTime ); + } +} + + +//-------------------------------------------------------------------------------------- +void CDXUTSDKMesh::Render( ID3D11DeviceContext* pd3dDeviceContext, + UINT iDiffuseSlot, + UINT iNormalSlot, + UINT iSpecularSlot ) +{ + RenderFrame( 0, false, pd3dDeviceContext, iDiffuseSlot, iNormalSlot, iSpecularSlot ); +} + +//-------------------------------------------------------------------------------------- +void CDXUTSDKMesh::RenderAdjacent( ID3D11DeviceContext* pd3dDeviceContext, + UINT iDiffuseSlot, + UINT iNormalSlot, + UINT iSpecularSlot ) +{ + RenderFrame( 0, true, pd3dDeviceContext, iDiffuseSlot, iNormalSlot, iSpecularSlot ); +} + + +//-------------------------------------------------------------------------------------- +void CDXUTSDKMesh::Render( LPDIRECT3DDEVICE9 pd3dDevice, + LPD3DXEFFECT pEffect, + D3DXHANDLE hTechnique, + D3DXHANDLE htxDiffuse, + D3DXHANDLE htxNormal, + D3DXHANDLE htxSpecular ) +{ + RenderFrame( 0, pd3dDevice, pEffect, hTechnique, htxDiffuse, htxNormal, htxSpecular ); +} + +//-------------------------------------------------------------------------------------- +D3D11_PRIMITIVE_TOPOLOGY CDXUTSDKMesh::GetPrimitiveType11( SDKMESH_PRIMITIVE_TYPE PrimType ) +{ + D3D11_PRIMITIVE_TOPOLOGY retType = D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST; + + switch( PrimType ) + { + case PT_TRIANGLE_LIST: + retType = D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST; + break; + case PT_TRIANGLE_STRIP: + retType = D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP; + break; + case PT_LINE_LIST: + retType = D3D11_PRIMITIVE_TOPOLOGY_LINELIST; + break; + case PT_LINE_STRIP: + retType = D3D11_PRIMITIVE_TOPOLOGY_LINESTRIP; + break; + case PT_POINT_LIST: + retType = D3D11_PRIMITIVE_TOPOLOGY_POINTLIST; + break; + case PT_TRIANGLE_LIST_ADJ: + retType = D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST_ADJ; + break; + case PT_TRIANGLE_STRIP_ADJ: + retType = D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP_ADJ; + break; + case PT_LINE_LIST_ADJ: + retType = D3D11_PRIMITIVE_TOPOLOGY_LINELIST_ADJ; + break; + case PT_LINE_STRIP_ADJ: + retType = D3D11_PRIMITIVE_TOPOLOGY_LINESTRIP_ADJ; + break; + }; + + return retType; +} + +//-------------------------------------------------------------------------------------- +DXGI_FORMAT CDXUTSDKMesh::GetIBFormat11( UINT iMesh ) +{ + switch( m_pIndexBufferArray[ m_pMeshArray[ iMesh ].IndexBuffer ].IndexType ) + { + case IT_16BIT: + return DXGI_FORMAT_R16_UINT; + case IT_32BIT: + return DXGI_FORMAT_R32_UINT; + }; + return DXGI_FORMAT_R16_UINT; +} + +//-------------------------------------------------------------------------------------- +ID3D11Buffer* CDXUTSDKMesh::GetVB11( UINT iMesh, UINT iVB ) +{ + return m_pVertexBufferArray[ m_pMeshArray[ iMesh ].VertexBuffers[iVB] ].pVB11; +} + +//-------------------------------------------------------------------------------------- +ID3D11Buffer* CDXUTSDKMesh::GetIB11( UINT iMesh ) +{ + return m_pIndexBufferArray[ m_pMeshArray[ iMesh ].IndexBuffer ].pIB11; +} +SDKMESH_INDEX_TYPE CDXUTSDKMesh::GetIndexType( UINT iMesh ) +{ + return ( SDKMESH_INDEX_TYPE ) m_pIndexBufferArray[m_pMeshArray[ iMesh ].IndexBuffer].IndexType; +} +//-------------------------------------------------------------------------------------- +ID3D11Buffer* CDXUTSDKMesh::GetAdjIB11( UINT iMesh ) +{ + return m_pAdjacencyIndexBufferArray[ m_pMeshArray[ iMesh ].IndexBuffer ].pIB11; +} + +//-------------------------------------------------------------------------------------- +D3DPRIMITIVETYPE CDXUTSDKMesh::GetPrimitiveType9( SDKMESH_PRIMITIVE_TYPE PrimType ) +{ + D3DPRIMITIVETYPE retType = D3DPT_TRIANGLELIST; + + switch( PrimType ) + { + case PT_TRIANGLE_LIST: + retType = D3DPT_TRIANGLELIST; + break; + case PT_TRIANGLE_STRIP: + retType = D3DPT_TRIANGLESTRIP; + break; + case PT_LINE_LIST: + retType = D3DPT_LINELIST; + break; + case PT_LINE_STRIP: + retType = D3DPT_LINESTRIP; + break; + case PT_POINT_LIST: + retType = D3DPT_POINTLIST; + break; + }; + + return retType; +} + +//-------------------------------------------------------------------------------------- +D3DFORMAT CDXUTSDKMesh::GetIBFormat9( UINT iMesh ) +{ + switch( m_pIndexBufferArray[ m_pMeshArray[ iMesh ].IndexBuffer ].IndexType ) + { + case IT_16BIT: + return D3DFMT_INDEX16; + case IT_32BIT: + return D3DFMT_INDEX32; + }; + return D3DFMT_INDEX16; +} + +//-------------------------------------------------------------------------------------- +IDirect3DVertexBuffer9* CDXUTSDKMesh::GetVB9( UINT iMesh, UINT iVB ) +{ + return m_pVertexBufferArray[ m_pMeshArray[ iMesh ].VertexBuffers[iVB] ].pVB9; +} + +//-------------------------------------------------------------------------------------- +IDirect3DIndexBuffer9* CDXUTSDKMesh::GetIB9( UINT iMesh ) +{ + return m_pIndexBufferArray[ m_pMeshArray[ iMesh ].IndexBuffer ].pIB9; +} + +//-------------------------------------------------------------------------------------- +char* CDXUTSDKMesh::GetMeshPathA() +{ + return m_strPath; +} + +//-------------------------------------------------------------------------------------- +WCHAR* CDXUTSDKMesh::GetMeshPathW() +{ + return m_strPathW; +} + +//-------------------------------------------------------------------------------------- +UINT CDXUTSDKMesh::GetNumMeshes() +{ + if( !m_pMeshHeader ) + return 0; + return m_pMeshHeader->NumMeshes; +} + +//-------------------------------------------------------------------------------------- +UINT CDXUTSDKMesh::GetNumMaterials() +{ + if( !m_pMeshHeader ) + return 0; + return m_pMeshHeader->NumMaterials; +} + +//-------------------------------------------------------------------------------------- +UINT CDXUTSDKMesh::GetNumVBs() +{ + if( !m_pMeshHeader ) + return 0; + return m_pMeshHeader->NumVertexBuffers; +} + +//-------------------------------------------------------------------------------------- +UINT CDXUTSDKMesh::GetNumIBs() +{ + if( !m_pMeshHeader ) + return 0; + return m_pMeshHeader->NumIndexBuffers; +} + +//-------------------------------------------------------------------------------------- +ID3D11Buffer* CDXUTSDKMesh::GetVB11At( UINT iVB ) +{ + return m_pVertexBufferArray[ iVB ].pVB11; +} + +//-------------------------------------------------------------------------------------- +ID3D11Buffer* CDXUTSDKMesh::GetIB11At( UINT iIB ) +{ + return m_pIndexBufferArray[ iIB ].pIB11; +} + +//-------------------------------------------------------------------------------------- +IDirect3DVertexBuffer9* CDXUTSDKMesh::GetVB9At( UINT iVB ) +{ + return m_pVertexBufferArray[ iVB ].pVB9; +} + +//-------------------------------------------------------------------------------------- +IDirect3DIndexBuffer9* CDXUTSDKMesh::GetIB9At( UINT iIB ) +{ + return m_pIndexBufferArray[ iIB ].pIB9; +} + +//-------------------------------------------------------------------------------------- +BYTE* CDXUTSDKMesh::GetRawVerticesAt( UINT iVB ) +{ + return m_ppVertices[iVB]; +} + +//-------------------------------------------------------------------------------------- +BYTE* CDXUTSDKMesh::GetRawIndicesAt( UINT iIB ) +{ + return m_ppIndices[iIB]; +} + +//-------------------------------------------------------------------------------------- +SDKMESH_MATERIAL* CDXUTSDKMesh::GetMaterial( UINT iMaterial ) +{ + return &m_pMaterialArray[ iMaterial ]; +} + +//-------------------------------------------------------------------------------------- +SDKMESH_MESH* CDXUTSDKMesh::GetMesh( UINT iMesh ) +{ + return &m_pMeshArray[ iMesh ]; +} + +//-------------------------------------------------------------------------------------- +UINT CDXUTSDKMesh::GetNumSubsets( UINT iMesh ) +{ + return m_pMeshArray[ iMesh ].NumSubsets; +} + +//-------------------------------------------------------------------------------------- +SDKMESH_SUBSET* CDXUTSDKMesh::GetSubset( UINT iMesh, UINT iSubset ) +{ + return &m_pSubsetArray[ m_pMeshArray[ iMesh ].pSubsets[iSubset] ]; +} + +//-------------------------------------------------------------------------------------- +UINT CDXUTSDKMesh::GetVertexStride( UINT iMesh, UINT iVB ) +{ + return ( UINT )m_pVertexBufferArray[ m_pMeshArray[ iMesh ].VertexBuffers[iVB] ].StrideBytes; +} + +//-------------------------------------------------------------------------------------- +UINT CDXUTSDKMesh::GetNumFrames() +{ + return m_pMeshHeader->NumFrames; +} + +//-------------------------------------------------------------------------------------- +SDKMESH_FRAME* CDXUTSDKMesh::GetFrame( UINT iFrame ) +{ + assert( iFrame < m_pMeshHeader->NumFrames ); + return &m_pFrameArray[ iFrame ]; +} + +//-------------------------------------------------------------------------------------- +SDKMESH_FRAME* CDXUTSDKMesh::FindFrame( char* pszName ) +{ + for( UINT i = 0; i < m_pMeshHeader->NumFrames; i++ ) + { + if( _stricmp( m_pFrameArray[i].Name, pszName ) == 0 ) + { + return &m_pFrameArray[i]; + } + } + return NULL; +} + +//-------------------------------------------------------------------------------------- +UINT64 CDXUTSDKMesh::GetNumVertices( UINT iMesh, UINT iVB ) +{ + return m_pVertexBufferArray[ m_pMeshArray[ iMesh ].VertexBuffers[iVB] ].NumVertices; +} + +//-------------------------------------------------------------------------------------- +UINT64 CDXUTSDKMesh::GetNumIndices( UINT iMesh ) +{ + return m_pIndexBufferArray[ m_pMeshArray[ iMesh ].IndexBuffer ].NumIndices; +} + +//-------------------------------------------------------------------------------------- +D3DXVECTOR3 CDXUTSDKMesh::GetMeshBBoxCenter( UINT iMesh ) +{ + return m_pMeshArray[iMesh].BoundingBoxCenter; +} + +//-------------------------------------------------------------------------------------- +D3DXVECTOR3 CDXUTSDKMesh::GetMeshBBoxExtents( UINT iMesh ) +{ + return m_pMeshArray[iMesh].BoundingBoxExtents; +} + +//-------------------------------------------------------------------------------------- +UINT CDXUTSDKMesh::GetOutstandingResources() +{ + UINT outstandingResources = 0; + if( !m_pMeshHeader ) + return 1; + + outstandingResources += GetOutstandingBufferResources(); + + if( m_pDev11 ) + { + for( UINT i = 0; i < m_pMeshHeader->NumMaterials; i++ ) + { + if( m_pMaterialArray[i].DiffuseTexture[0] != 0 ) + { + if( !m_pMaterialArray[i].pDiffuseRV11 && !IsErrorResource( m_pMaterialArray[i].pDiffuseRV11 ) ) + outstandingResources ++; + } + + if( m_pMaterialArray[i].NormalTexture[0] != 0 ) + { + if( !m_pMaterialArray[i].pNormalRV11 && !IsErrorResource( m_pMaterialArray[i].pNormalRV11 ) ) + outstandingResources ++; + } + + if( m_pMaterialArray[i].SpecularTexture[0] != 0 ) + { + if( !m_pMaterialArray[i].pSpecularRV11 && !IsErrorResource( m_pMaterialArray[i].pSpecularRV11 ) ) + outstandingResources ++; + } + } + } + else + { + for( UINT i = 0; i < m_pMeshHeader->NumMaterials; i++ ) + { + if( m_pMaterialArray[i].DiffuseTexture[0] != 0 ) + { + if( !m_pMaterialArray[i].pDiffuseTexture9 && !IsErrorResource( m_pMaterialArray[i].pDiffuseTexture9 ) ) + outstandingResources ++; + } + + if( m_pMaterialArray[i].NormalTexture[0] != 0 ) + { + if( !m_pMaterialArray[i].pNormalTexture9 && !IsErrorResource( m_pMaterialArray[i].pNormalTexture9 ) ) + outstandingResources ++; + } + + if( m_pMaterialArray[i].SpecularTexture[0] != 0 ) + { + if( !m_pMaterialArray[i].pSpecularTexture9 && + !IsErrorResource( m_pMaterialArray[i].pSpecularTexture9 ) ) + outstandingResources ++; + } + } + } + + return outstandingResources; +} + +//-------------------------------------------------------------------------------------- +UINT CDXUTSDKMesh::GetOutstandingBufferResources() +{ + UINT outstandingResources = 0; + if( !m_pMeshHeader ) + return 1; + + for( UINT i = 0; i < m_pMeshHeader->NumVertexBuffers; i++ ) + { + if( !m_pVertexBufferArray[i].pVB9 && !IsErrorResource( m_pVertexBufferArray[i].pVB9 ) ) + outstandingResources ++; + } + + for( UINT i = 0; i < m_pMeshHeader->NumIndexBuffers; i++ ) + { + if( !m_pIndexBufferArray[i].pIB9 && !IsErrorResource( m_pIndexBufferArray[i].pIB9 ) ) + outstandingResources ++; + } + + return outstandingResources; +} + +//-------------------------------------------------------------------------------------- +bool CDXUTSDKMesh::CheckLoadDone() +{ + if( 0 == GetOutstandingResources() ) + { + m_bLoading = false; + return true; + } + + return false; +} + +//-------------------------------------------------------------------------------------- +bool CDXUTSDKMesh::IsLoaded() +{ + if( m_pStaticMeshData && !m_bLoading ) + { + return true; + } + + return false; +} + +//-------------------------------------------------------------------------------------- +bool CDXUTSDKMesh::IsLoading() +{ + return m_bLoading; +} + +//-------------------------------------------------------------------------------------- +void CDXUTSDKMesh::SetLoading( bool bLoading ) +{ + m_bLoading = bLoading; +} + +//-------------------------------------------------------------------------------------- +BOOL CDXUTSDKMesh::HadLoadingError() +{ + if( m_pMeshHeader ) + { + for( UINT i = 0; i < m_pMeshHeader->NumVertexBuffers; i++ ) + { + if( IsErrorResource( m_pVertexBufferArray[i].pVB9 ) ) + return TRUE; + } + + for( UINT i = 0; i < m_pMeshHeader->NumIndexBuffers; i++ ) + { + if( IsErrorResource( m_pIndexBufferArray[i].pIB9 ) ) + return TRUE; + } + } + + return FALSE; +} + +//-------------------------------------------------------------------------------------- +UINT CDXUTSDKMesh::GetNumInfluences( UINT iMesh ) +{ + return m_pMeshArray[iMesh].NumFrameInfluences; +} + +//-------------------------------------------------------------------------------------- +const D3DXMATRIX* CDXUTSDKMesh::GetMeshInfluenceMatrix( UINT iMesh, UINT iInfluence ) +{ + UINT iFrame = m_pMeshArray[iMesh].pFrameInfluences[ iInfluence ]; + return &m_pTransformedFrameMatrices[iFrame]; +} + +const D3DXMATRIX* CDXUTSDKMesh::GetWorldMatrix( UINT iFrameIndex ) +{ + return &m_pWorldPoseFrameMatrices[iFrameIndex]; +} + +const D3DXMATRIX* CDXUTSDKMesh::GetInfluenceMatrix( UINT iFrameIndex ) +{ + return &m_pTransformedFrameMatrices[iFrameIndex]; +} + +//-------------------------------------------------------------------------------------- +UINT CDXUTSDKMesh::GetAnimationKeyFromTime( double fTime ) +{ + if( m_pAnimationHeader == NULL ) + { + return 0; + } + + UINT iTick = ( UINT )( m_pAnimationHeader->AnimationFPS * fTime ); + + iTick = iTick % ( m_pAnimationHeader->NumAnimationKeys - 1 ); + iTick ++; + + return iTick; +} + +bool CDXUTSDKMesh::GetAnimationProperties( UINT* pNumKeys, FLOAT* pFrameTime ) +{ + if( m_pAnimationHeader == NULL ) + { + return false; + } + + *pNumKeys = m_pAnimationHeader->NumAnimationKeys; + *pFrameTime = 1.0f / (FLOAT)m_pAnimationHeader->AnimationFPS; + + return true; +} + + +//------------------------------------------------------------------------------------- +// CDXUTXFileMesh implementation. +//------------------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +CDXUTXFileMesh::CDXUTXFileMesh( LPCWSTR strName ) +{ + wcscpy_s( m_strName, 512, strName ); + m_pMesh = NULL; + m_pMaterials = NULL; + m_pTextures = NULL; + m_bUseMaterials = TRUE; + m_pVB = NULL; + m_pIB = NULL; + m_pDecl = NULL; + m_strMaterials = NULL; + m_dwNumMaterials = 0; + m_dwNumVertices = 0; + m_dwNumFaces = 0; + m_dwBytesPerVertex = 0; +} + + + + +//----------------------------------------------------------------------------- +CDXUTXFileMesh::~CDXUTXFileMesh() +{ + Destroy(); +} + + + + +//----------------------------------------------------------------------------- +HRESULT CDXUTXFileMesh::Create( LPDIRECT3DDEVICE9 pd3dDevice, LPCWSTR strFilename ) +{ + WCHAR strPath[MAX_PATH]; + LPD3DXBUFFER pAdjacencyBuffer = NULL; + LPD3DXBUFFER pMtrlBuffer = NULL; + HRESULT hr; + + // Cleanup previous mesh if any + Destroy(); + + // Find the path for the file, and convert it to ANSI (for the D3DX API) + DXUTFindDXSDKMediaFileCch( strPath, sizeof( strPath ) / sizeof( WCHAR ), strFilename ); + + // Load the mesh + if( FAILED( hr = D3DXLoadMeshFromX( strPath, D3DXMESH_MANAGED, pd3dDevice, + &pAdjacencyBuffer, &pMtrlBuffer, NULL, + &m_dwNumMaterials, &m_pMesh ) ) ) + { + return hr; + } + + // Optimize the mesh for performance + if( FAILED( hr = m_pMesh->OptimizeInplace( + D3DXMESHOPT_COMPACT | D3DXMESHOPT_ATTRSORT | D3DXMESHOPT_VERTEXCACHE, + ( DWORD* )pAdjacencyBuffer->GetBufferPointer(), NULL, NULL, NULL ) ) ) + { + SAFE_RELEASE( pAdjacencyBuffer ); + SAFE_RELEASE( pMtrlBuffer ); + return hr; + } + + // Set strPath to the path of the mesh file + WCHAR* pLastBSlash = wcsrchr( strPath, L'\\' ); + if( pLastBSlash ) + *( pLastBSlash + 1 ) = L'\0'; + else + *strPath = L'\0'; + + D3DXMATERIAL* d3dxMtrls = ( D3DXMATERIAL* )pMtrlBuffer->GetBufferPointer(); + hr = CreateMaterials( strPath, pd3dDevice, d3dxMtrls, m_dwNumMaterials ); + + SAFE_RELEASE( pAdjacencyBuffer ); + SAFE_RELEASE( pMtrlBuffer ); + + // Extract data from m_pMesh for easy access + D3DVERTEXELEMENT9 decl[MAX_FVF_DECL_SIZE]; + m_dwNumVertices = m_pMesh->GetNumVertices(); + m_dwNumFaces = m_pMesh->GetNumFaces(); + m_dwBytesPerVertex = m_pMesh->GetNumBytesPerVertex(); + m_pMesh->GetIndexBuffer( &m_pIB ); + m_pMesh->GetVertexBuffer( &m_pVB ); + m_pMesh->GetDeclaration( decl ); + pd3dDevice->CreateVertexDeclaration( decl, &m_pDecl ); + + return hr; +} + + +//----------------------------------------------------------------------------- +HRESULT CDXUTXFileMesh::Create( LPDIRECT3DDEVICE9 pd3dDevice, + LPD3DXFILEDATA pFileData ) +{ + LPD3DXBUFFER pMtrlBuffer = NULL; + LPD3DXBUFFER pAdjacencyBuffer = NULL; + HRESULT hr; + + // Cleanup previous mesh if any + Destroy(); + + // Load the mesh from the DXFILEDATA object + if( FAILED( hr = D3DXLoadMeshFromXof( pFileData, D3DXMESH_MANAGED, pd3dDevice, + &pAdjacencyBuffer, &pMtrlBuffer, NULL, + &m_dwNumMaterials, &m_pMesh ) ) ) + { + return hr; + } + + // Optimize the mesh for performance + if( FAILED( hr = m_pMesh->OptimizeInplace( + D3DXMESHOPT_COMPACT | D3DXMESHOPT_ATTRSORT | D3DXMESHOPT_VERTEXCACHE, + ( DWORD* )pAdjacencyBuffer->GetBufferPointer(), NULL, NULL, NULL ) ) ) + { + SAFE_RELEASE( pAdjacencyBuffer ); + SAFE_RELEASE( pMtrlBuffer ); + return hr; + } + + D3DXMATERIAL* d3dxMtrls = ( D3DXMATERIAL* )pMtrlBuffer->GetBufferPointer(); + hr = CreateMaterials( L"", pd3dDevice, d3dxMtrls, m_dwNumMaterials ); + + SAFE_RELEASE( pAdjacencyBuffer ); + SAFE_RELEASE( pMtrlBuffer ); + + // Extract data from m_pMesh for easy access + D3DVERTEXELEMENT9 decl[MAX_FVF_DECL_SIZE]; + m_dwNumVertices = m_pMesh->GetNumVertices(); + m_dwNumFaces = m_pMesh->GetNumFaces(); + m_dwBytesPerVertex = m_pMesh->GetNumBytesPerVertex(); + m_pMesh->GetIndexBuffer( &m_pIB ); + m_pMesh->GetVertexBuffer( &m_pVB ); + m_pMesh->GetDeclaration( decl ); + pd3dDevice->CreateVertexDeclaration( decl, &m_pDecl ); + + return hr; +} + + +//----------------------------------------------------------------------------- +HRESULT CDXUTXFileMesh::Create( LPDIRECT3DDEVICE9 pd3dDevice, ID3DXMesh* pInMesh, + D3DXMATERIAL* pd3dxMaterials, DWORD dwMaterials ) +{ + // Cleanup previous mesh if any + Destroy(); + + // Optimize the mesh for performance + DWORD* rgdwAdjacency = NULL; + rgdwAdjacency = new DWORD[pInMesh->GetNumFaces() * 3]; + if( rgdwAdjacency == NULL ) + return E_OUTOFMEMORY; + pInMesh->GenerateAdjacency( 1e-6f, rgdwAdjacency ); + + D3DVERTEXELEMENT9 decl[MAX_FVF_DECL_SIZE]; + pInMesh->GetDeclaration( decl ); + + DWORD dwOptions = pInMesh->GetOptions(); + dwOptions &= ~( D3DXMESH_32BIT | D3DXMESH_SYSTEMMEM | D3DXMESH_WRITEONLY ); + dwOptions |= D3DXMESH_MANAGED; + dwOptions |= D3DXMESHOPT_COMPACT | D3DXMESHOPT_ATTRSORT | D3DXMESHOPT_VERTEXCACHE; + + ID3DXMesh* pTempMesh = NULL; + if( FAILED( pInMesh->Optimize( dwOptions, rgdwAdjacency, NULL, NULL, NULL, &pTempMesh ) ) ) + { + SAFE_DELETE_ARRAY( rgdwAdjacency ); + return E_FAIL; + } + + SAFE_DELETE_ARRAY( rgdwAdjacency ); + SAFE_RELEASE( m_pMesh ); + m_pMesh = pTempMesh; + + HRESULT hr; + hr = CreateMaterials( L"", pd3dDevice, pd3dxMaterials, dwMaterials ); + + // Extract data from m_pMesh for easy access + m_dwNumVertices = m_pMesh->GetNumVertices(); + m_dwNumFaces = m_pMesh->GetNumFaces(); + m_dwBytesPerVertex = m_pMesh->GetNumBytesPerVertex(); + m_pMesh->GetIndexBuffer( &m_pIB ); + m_pMesh->GetVertexBuffer( &m_pVB ); + m_pMesh->GetDeclaration( decl ); + pd3dDevice->CreateVertexDeclaration( decl, &m_pDecl ); + + return hr; +} + + +//----------------------------------------------------------------------------- +HRESULT CDXUTXFileMesh::CreateMaterials( LPCWSTR strPath, IDirect3DDevice9* pd3dDevice, D3DXMATERIAL* d3dxMtrls, + DWORD dwNumMaterials ) +{ + // Get material info for the mesh + // Get the array of materials out of the buffer + m_dwNumMaterials = dwNumMaterials; + if( d3dxMtrls && m_dwNumMaterials > 0 ) + { + // Allocate memory for the materials and textures + m_pMaterials = new D3DMATERIAL9[m_dwNumMaterials]; + if( m_pMaterials == NULL ) + return E_OUTOFMEMORY; + m_pTextures = new LPDIRECT3DBASETEXTURE9[m_dwNumMaterials]; + if( m_pTextures == NULL ) + return E_OUTOFMEMORY; + m_strMaterials = new CHAR[m_dwNumMaterials][MAX_PATH]; + if( m_strMaterials == NULL ) + return E_OUTOFMEMORY; + + // Copy each material and create its texture + for( DWORD i = 0; i < m_dwNumMaterials; i++ ) + { + // Copy the material + m_pMaterials[i] = d3dxMtrls[i].MatD3D; + m_pTextures[i] = NULL; + + // Create a texture + if( d3dxMtrls[i].pTextureFilename ) + { + strcpy_s( m_strMaterials[i], MAX_PATH, d3dxMtrls[i].pTextureFilename ); + + WCHAR strTexture[MAX_PATH]; + WCHAR strTextureTemp[MAX_PATH]; + D3DXIMAGE_INFO ImgInfo; + + // First attempt to look for texture in the same folder as the input folder. + MultiByteToWideChar( CP_ACP, 0, d3dxMtrls[i].pTextureFilename, -1, strTextureTemp, MAX_PATH ); + strTextureTemp[MAX_PATH - 1] = 0; + + wcscpy_s( strTexture, MAX_PATH, strPath ); + wcscat_s( strTexture, MAX_PATH, strTextureTemp ); + + // Inspect the texture file to determine the texture type. + if( FAILED( D3DXGetImageInfoFromFile( strTexture, &ImgInfo ) ) ) + { + // Search the media folder + if( FAILED( DXUTFindDXSDKMediaFileCch( strTexture, MAX_PATH, strTextureTemp ) ) ) + continue; // Can't find. Skip. + + D3DXGetImageInfoFromFile( strTexture, &ImgInfo ); + } + + // Call the appropriate loader according to the texture type. + switch( ImgInfo.ResourceType ) + { + case D3DRTYPE_TEXTURE: + { + IDirect3DTexture9* pTex; + if( SUCCEEDED( D3DXCreateTextureFromFile( pd3dDevice, strTexture, &pTex ) ) ) + { + // Obtain the base texture interface + pTex->QueryInterface( IID_IDirect3DBaseTexture9, ( LPVOID* )&m_pTextures[i] ); + // Release the specialized instance + pTex->Release(); + } + break; + } + case D3DRTYPE_CUBETEXTURE: + { + IDirect3DCubeTexture9* pTex; + if( SUCCEEDED( D3DXCreateCubeTextureFromFile( pd3dDevice, strTexture, &pTex ) ) ) + { + // Obtain the base texture interface + pTex->QueryInterface( IID_IDirect3DBaseTexture9, ( LPVOID* )&m_pTextures[i] ); + // Release the specialized instance + pTex->Release(); + } + break; + } + case D3DRTYPE_VOLUMETEXTURE: + { + IDirect3DVolumeTexture9* pTex; + if( SUCCEEDED( D3DXCreateVolumeTextureFromFile( pd3dDevice, strTexture, &pTex ) ) ) + { + // Obtain the base texture interface + pTex->QueryInterface( IID_IDirect3DBaseTexture9, ( LPVOID* )&m_pTextures[i] ); + // Release the specialized instance + pTex->Release(); + } + break; + } + } + } + } + } + return S_OK; +} + + +//----------------------------------------------------------------------------- +HRESULT CDXUTXFileMesh::SetFVF( LPDIRECT3DDEVICE9 pd3dDevice, DWORD dwFVF ) +{ + LPD3DXMESH pTempMesh = NULL; + + if( m_pMesh ) + { + if( FAILED( m_pMesh->CloneMeshFVF( m_pMesh->GetOptions(), dwFVF, + pd3dDevice, &pTempMesh ) ) ) + { + SAFE_RELEASE( pTempMesh ); + return E_FAIL; + } + + DWORD dwOldFVF = 0; + dwOldFVF = m_pMesh->GetFVF(); + SAFE_RELEASE( m_pMesh ); + m_pMesh = pTempMesh; + + // Compute normals if they are being requested and + // the old mesh does not have them. + if( !( dwOldFVF & D3DFVF_NORMAL ) && dwFVF & D3DFVF_NORMAL ) + { + D3DXComputeNormals( m_pMesh, NULL ); + } + } + + return S_OK; +} + + + + +//----------------------------------------------------------------------------- +// Convert the mesh to the format specified by the given vertex declarations. +//----------------------------------------------------------------------------- +HRESULT CDXUTXFileMesh::SetVertexDecl( LPDIRECT3DDEVICE9 pd3dDevice, const D3DVERTEXELEMENT9* pDecl, + bool bAutoComputeNormals, bool bAutoComputeTangents, + bool bSplitVertexForOptimalTangents ) +{ + LPD3DXMESH pTempMesh = NULL; + + if( m_pMesh ) + { + if( FAILED( m_pMesh->CloneMesh( m_pMesh->GetOptions(), pDecl, + pd3dDevice, &pTempMesh ) ) ) + { + SAFE_RELEASE( pTempMesh ); + return E_FAIL; + } + } + + + // Check if the old declaration contains a normal. + bool bHadNormal = false; + bool bHadTangent = false; + D3DVERTEXELEMENT9 aOldDecl[MAX_FVF_DECL_SIZE]; + if( m_pMesh && SUCCEEDED( m_pMesh->GetDeclaration( aOldDecl ) ) ) + { + for( UINT index = 0; index < D3DXGetDeclLength( aOldDecl ); ++index ) + { + if( aOldDecl[index].Usage == D3DDECLUSAGE_NORMAL ) + { + bHadNormal = true; + } + if( aOldDecl[index].Usage == D3DDECLUSAGE_TANGENT ) + { + bHadTangent = true; + } + } + } + + // Check if the new declaration contains a normal. + bool bHaveNormalNow = false; + bool bHaveTangentNow = false; + D3DVERTEXELEMENT9 aNewDecl[MAX_FVF_DECL_SIZE]; + if( pTempMesh && SUCCEEDED( pTempMesh->GetDeclaration( aNewDecl ) ) ) + { + for( UINT index = 0; index < D3DXGetDeclLength( aNewDecl ); ++index ) + { + if( aNewDecl[index].Usage == D3DDECLUSAGE_NORMAL ) + { + bHaveNormalNow = true; + } + if( aNewDecl[index].Usage == D3DDECLUSAGE_TANGENT ) + { + bHaveTangentNow = true; + } + } + } + + SAFE_RELEASE( m_pMesh ); + + if( pTempMesh ) + { + m_pMesh = pTempMesh; + + if( !bHadNormal && bHaveNormalNow && bAutoComputeNormals ) + { + // Compute normals in case the meshes have them + D3DXComputeNormals( m_pMesh, NULL ); + } + + if( bHaveNormalNow && !bHadTangent && bHaveTangentNow && bAutoComputeTangents ) + { + ID3DXMesh* pNewMesh; + HRESULT hr; + + DWORD* rgdwAdjacency = NULL; + rgdwAdjacency = new DWORD[m_pMesh->GetNumFaces() * 3]; + if( rgdwAdjacency == NULL ) + return E_OUTOFMEMORY; + V( m_pMesh->GenerateAdjacency( 1e-6f, rgdwAdjacency ) ); + + float fPartialEdgeThreshold; + float fSingularPointThreshold; + float fNormalEdgeThreshold; + if( bSplitVertexForOptimalTangents ) + { + fPartialEdgeThreshold = 0.01f; + fSingularPointThreshold = 0.25f; + fNormalEdgeThreshold = 0.01f; + } + else + { + fPartialEdgeThreshold = -1.01f; + fSingularPointThreshold = 0.01f; + fNormalEdgeThreshold = -1.01f; + } + + // Compute tangents, which are required for normal mapping + hr = D3DXComputeTangentFrameEx( m_pMesh, + D3DDECLUSAGE_TEXCOORD, 0, + D3DDECLUSAGE_TANGENT, 0, + D3DX_DEFAULT, 0, + D3DDECLUSAGE_NORMAL, 0, + 0, rgdwAdjacency, + fPartialEdgeThreshold, fSingularPointThreshold, fNormalEdgeThreshold, + &pNewMesh, NULL ); + + SAFE_DELETE_ARRAY( rgdwAdjacency ); + if( FAILED( hr ) ) + return hr; + + SAFE_RELEASE( m_pMesh ); + m_pMesh = pNewMesh; + } + } + + return S_OK; +} + + + + +//----------------------------------------------------------------------------- +HRESULT CDXUTXFileMesh::RestoreDeviceObjects( LPDIRECT3DDEVICE9 pd3dDevice ) +{ + return S_OK; +} + + + + +//----------------------------------------------------------------------------- +HRESULT CDXUTXFileMesh::InvalidateDeviceObjects() +{ + SAFE_RELEASE( m_pIB ); + SAFE_RELEASE( m_pVB ); + SAFE_RELEASE( m_pDecl ); + + return S_OK; +} + + + + +//----------------------------------------------------------------------------- +HRESULT CDXUTXFileMesh::Destroy() +{ + InvalidateDeviceObjects(); + for( UINT i = 0; i < m_dwNumMaterials; i++ ) + SAFE_RELEASE( m_pTextures[i] ); + SAFE_DELETE_ARRAY( m_pTextures ); + SAFE_DELETE_ARRAY( m_pMaterials ); + SAFE_DELETE_ARRAY( m_strMaterials ); + + SAFE_RELEASE( m_pMesh ); + + m_dwNumMaterials = 0L; + + return S_OK; +} + + + + +//----------------------------------------------------------------------------- +HRESULT CDXUTXFileMesh::Render( LPDIRECT3DDEVICE9 pd3dDevice, bool bDrawOpaqueSubsets, + bool bDrawAlphaSubsets ) +{ + if( NULL == m_pMesh ) + return E_FAIL; + + // Frist, draw the subsets without alpha + if( bDrawOpaqueSubsets ) + { + for( DWORD i = 0; i < m_dwNumMaterials; i++ ) + { + if( m_bUseMaterials ) + { + if( m_pMaterials[i].Diffuse.a < 1.0f ) + continue; + pd3dDevice->SetMaterial( &m_pMaterials[i] ); + pd3dDevice->SetTexture( 0, m_pTextures[i] ); + } + m_pMesh->DrawSubset( i ); + } + } + + // Then, draw the subsets with alpha + if( bDrawAlphaSubsets && m_bUseMaterials ) + { + for( DWORD i = 0; i < m_dwNumMaterials; i++ ) + { + if( m_pMaterials[i].Diffuse.a == 1.0f ) + continue; + + // Set the material and texture + pd3dDevice->SetMaterial( &m_pMaterials[i] ); + pd3dDevice->SetTexture( 0, m_pTextures[i] ); + m_pMesh->DrawSubset( i ); + } + } + + return S_OK; +} + + + + +//----------------------------------------------------------------------------- +HRESULT CDXUTXFileMesh::Render( ID3DXEffect* pEffect, + D3DXHANDLE hTexture, + D3DXHANDLE hDiffuse, + D3DXHANDLE hAmbient, + D3DXHANDLE hSpecular, + D3DXHANDLE hEmissive, + D3DXHANDLE hPower, + bool bDrawOpaqueSubsets, + bool bDrawAlphaSubsets ) +{ + if( NULL == m_pMesh ) + return E_FAIL; + + UINT cPasses; + // Frist, draw the subsets without alpha + if( bDrawOpaqueSubsets ) + { + pEffect->Begin( &cPasses, 0 ); + for( UINT p = 0; p < cPasses; ++p ) + { + pEffect->BeginPass( p ); + for( DWORD i = 0; i < m_dwNumMaterials; i++ ) + { + if( m_bUseMaterials ) + { + if( m_pMaterials[i].Diffuse.a < 1.0f ) + continue; + if( hTexture ) + pEffect->SetTexture( hTexture, m_pTextures[i] ); + // D3DCOLORVALUE and D3DXVECTOR4 are data-wise identical. + // No conversion is needed. + if( hDiffuse ) + pEffect->SetVector( hDiffuse, ( D3DXVECTOR4* )&m_pMaterials[i].Diffuse ); + if( hAmbient ) + pEffect->SetVector( hAmbient, ( D3DXVECTOR4* )&m_pMaterials[i].Ambient ); + if( hSpecular ) + pEffect->SetVector( hSpecular, ( D3DXVECTOR4* )&m_pMaterials[i].Specular ); + if( hEmissive ) + pEffect->SetVector( hEmissive, ( D3DXVECTOR4* )&m_pMaterials[i].Emissive ); + if( hPower ) + pEffect->SetFloat( hPower, m_pMaterials[i].Power ); + pEffect->CommitChanges(); + } + m_pMesh->DrawSubset( i ); + } + pEffect->EndPass(); + } + pEffect->End(); + } + + // Then, draw the subsets with alpha + if( bDrawAlphaSubsets && m_bUseMaterials ) + { + pEffect->Begin( &cPasses, 0 ); + for( UINT p = 0; p < cPasses; ++p ) + { + pEffect->BeginPass( p ); + for( DWORD i = 0; i < m_dwNumMaterials; i++ ) + { + if( m_bUseMaterials ) + { + if( m_pMaterials[i].Diffuse.a == 1.0f ) + continue; + if( hTexture ) + pEffect->SetTexture( hTexture, m_pTextures[i] ); + // D3DCOLORVALUE and D3DXVECTOR4 are data-wise identical. + // No conversion is needed. + if( hDiffuse ) + pEffect->SetVector( hDiffuse, ( D3DXVECTOR4* )&m_pMaterials[i].Diffuse ); + if( hAmbient ) + pEffect->SetVector( hAmbient, ( D3DXVECTOR4* )&m_pMaterials[i].Ambient ); + if( hSpecular ) + pEffect->SetVector( hSpecular, ( D3DXVECTOR4* )&m_pMaterials[i].Specular ); + if( hEmissive ) + pEffect->SetVector( hEmissive, ( D3DXVECTOR4* )&m_pMaterials[i].Emissive ); + if( hPower ) + pEffect->SetFloat( hPower, m_pMaterials[i].Power ); + pEffect->CommitChanges(); + } + m_pMesh->DrawSubset( i ); + } + pEffect->EndPass(); + } + pEffect->End(); + } + + return S_OK; +} diff --git a/Demos/DX11ClothDemo/DXUT/Optional/SDKmesh.h b/Demos/DX11ClothDemo/DXUT/Optional/SDKmesh.h new file mode 100644 index 000000000..79a41d0a0 --- /dev/null +++ b/Demos/DX11ClothDemo/DXUT/Optional/SDKmesh.h @@ -0,0 +1,589 @@ +//-------------------------------------------------------------------------------------- +// File: SDKMesh.h +// +// Disclaimer: +// The SDK Mesh format (.sdkmesh) is not a recommended file format for shipping titles. +// It was designed to meet the specific needs of the SDK samples. Any real-world +// applications should avoid this file format in favor of a destination format that +// meets the specific needs of the application. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +//-------------------------------------------------------------------------------------- +#pragma once +#ifndef _SDKMESH_ +#define _SDKMESH_ + +//-------------------------------------------------------------------------------------- +// Hard Defines for the various structures +//-------------------------------------------------------------------------------------- +#define SDKMESH_FILE_VERSION 101 +#define MAX_VERTEX_ELEMENTS 32 +#define MAX_VERTEX_STREAMS 16 +#define MAX_FRAME_NAME 100 +#define MAX_MESH_NAME 100 +#define MAX_SUBSET_NAME 100 +#define MAX_MATERIAL_NAME 100 +#define MAX_TEXTURE_NAME MAX_PATH +#define MAX_MATERIAL_PATH MAX_PATH +#define INVALID_FRAME ((UINT)-1) +#define INVALID_MESH ((UINT)-1) +#define INVALID_MATERIAL ((UINT)-1) +#define INVALID_SUBSET ((UINT)-1) +#define INVALID_ANIMATION_DATA ((UINT)-1) +#define INVALID_SAMPLER_SLOT ((UINT)-1) +#define ERROR_RESOURCE_VALUE 1 + +template BOOL IsErrorResource( TYPE data ) +{ + if( ( TYPE )ERROR_RESOURCE_VALUE == data ) + return TRUE; + return FALSE; +} +//-------------------------------------------------------------------------------------- +// Enumerated Types. These will have mirrors in both D3D9 and D3D11 +//-------------------------------------------------------------------------------------- +enum SDKMESH_PRIMITIVE_TYPE +{ + PT_TRIANGLE_LIST = 0, + PT_TRIANGLE_STRIP, + PT_LINE_LIST, + PT_LINE_STRIP, + PT_POINT_LIST, + PT_TRIANGLE_LIST_ADJ, + PT_TRIANGLE_STRIP_ADJ, + PT_LINE_LIST_ADJ, + PT_LINE_STRIP_ADJ, + PT_QUAD_PATCH_LIST, + PT_TRIANGLE_PATCH_LIST, +}; + +enum SDKMESH_INDEX_TYPE +{ + IT_16BIT = 0, + IT_32BIT, +}; + +enum FRAME_TRANSFORM_TYPE +{ + FTT_RELATIVE = 0, + FTT_ABSOLUTE, //This is not currently used but is here to support absolute transformations in the future +}; + +//-------------------------------------------------------------------------------------- +// Structures. Unions with pointers are forced to 64bit. +//-------------------------------------------------------------------------------------- +struct SDKMESH_HEADER +{ + //Basic Info and sizes + UINT Version; + BYTE IsBigEndian; + UINT64 HeaderSize; + UINT64 NonBufferDataSize; + UINT64 BufferDataSize; + + //Stats + UINT NumVertexBuffers; + UINT NumIndexBuffers; + UINT NumMeshes; + UINT NumTotalSubsets; + UINT NumFrames; + UINT NumMaterials; + + //Offsets to Data + UINT64 VertexStreamHeadersOffset; + UINT64 IndexStreamHeadersOffset; + UINT64 MeshDataOffset; + UINT64 SubsetDataOffset; + UINT64 FrameDataOffset; + UINT64 MaterialDataOffset; +}; + +struct SDKMESH_VERTEX_BUFFER_HEADER +{ + UINT64 NumVertices; + UINT64 SizeBytes; + UINT64 StrideBytes; + D3DVERTEXELEMENT9 Decl[MAX_VERTEX_ELEMENTS]; + union + { + UINT64 DataOffset; //(This also forces the union to 64bits) + IDirect3DVertexBuffer9* pVB9; + ID3D11Buffer* pVB11; + }; +}; + +struct SDKMESH_INDEX_BUFFER_HEADER +{ + UINT64 NumIndices; + UINT64 SizeBytes; + UINT IndexType; + union + { + UINT64 DataOffset; //(This also forces the union to 64bits) + IDirect3DIndexBuffer9* pIB9; + ID3D11Buffer* pIB11; + }; +}; + +struct SDKMESH_MESH +{ + char Name[MAX_MESH_NAME]; + BYTE NumVertexBuffers; + UINT VertexBuffers[MAX_VERTEX_STREAMS]; + UINT IndexBuffer; + UINT NumSubsets; + UINT NumFrameInfluences; //aka bones + + D3DXVECTOR3 BoundingBoxCenter; + D3DXVECTOR3 BoundingBoxExtents; + + union + { + UINT64 SubsetOffset; //Offset to list of subsets (This also forces the union to 64bits) + UINT* pSubsets; //Pointer to list of subsets + }; + union + { + UINT64 FrameInfluenceOffset; //Offset to list of frame influences (This also forces the union to 64bits) + UINT* pFrameInfluences; //Pointer to list of frame influences + }; +}; + +struct SDKMESH_SUBSET +{ + char Name[MAX_SUBSET_NAME]; + UINT MaterialID; + UINT PrimitiveType; + UINT64 IndexStart; + UINT64 IndexCount; + UINT64 VertexStart; + UINT64 VertexCount; +}; + +struct SDKMESH_FRAME +{ + char Name[MAX_FRAME_NAME]; + UINT Mesh; + UINT ParentFrame; + UINT ChildFrame; + UINT SiblingFrame; + D3DXMATRIX Matrix; + UINT AnimationDataIndex; //Used to index which set of keyframes transforms this frame +}; + +struct SDKMESH_MATERIAL +{ + char Name[MAX_MATERIAL_NAME]; + + // Use MaterialInstancePath + char MaterialInstancePath[MAX_MATERIAL_PATH]; + + // Or fall back to d3d8-type materials + char DiffuseTexture[MAX_TEXTURE_NAME]; + char NormalTexture[MAX_TEXTURE_NAME]; + char SpecularTexture[MAX_TEXTURE_NAME]; + + D3DXVECTOR4 Diffuse; + D3DXVECTOR4 Ambient; + D3DXVECTOR4 Specular; + D3DXVECTOR4 Emissive; + FLOAT Power; + + union + { + UINT64 Force64_1; //Force the union to 64bits + IDirect3DTexture9* pDiffuseTexture9; + ID3D11Texture2D* pDiffuseTexture11; + }; + union + { + UINT64 Force64_2; //Force the union to 64bits + IDirect3DTexture9* pNormalTexture9; + ID3D11Texture2D* pNormalTexture11; + }; + union + { + UINT64 Force64_3; //Force the union to 64bits + IDirect3DTexture9* pSpecularTexture9; + ID3D11Texture2D* pSpecularTexture11; + }; + + union + { + UINT64 Force64_4; //Force the union to 64bits + ID3D11ShaderResourceView* pDiffuseRV11; + }; + union + { + UINT64 Force64_5; //Force the union to 64bits + ID3D11ShaderResourceView* pNormalRV11; + }; + union + { + UINT64 Force64_6; //Force the union to 64bits + ID3D11ShaderResourceView* pSpecularRV11; + }; + +}; + +struct SDKANIMATION_FILE_HEADER +{ + UINT Version; + BYTE IsBigEndian; + UINT FrameTransformType; + UINT NumFrames; + UINT NumAnimationKeys; + UINT AnimationFPS; + UINT64 AnimationDataSize; + UINT64 AnimationDataOffset; +}; + +struct SDKANIMATION_DATA +{ + D3DXVECTOR3 Translation; + D3DXVECTOR4 Orientation; + D3DXVECTOR3 Scaling; +}; + +struct SDKANIMATION_FRAME_DATA +{ + char FrameName[MAX_FRAME_NAME]; + union + { + UINT64 DataOffset; + SDKANIMATION_DATA* pAnimationData; + }; +}; + +#ifndef _CONVERTER_APP_ + +//-------------------------------------------------------------------------------------- +// AsyncLoading callbacks +//-------------------------------------------------------------------------------------- +typedef void ( CALLBACK*LPCREATETEXTUREFROMFILE9 )( IDirect3DDevice9* pDev, char* szFileName, + IDirect3DTexture9** ppTexture, void* pContext ); +typedef void ( CALLBACK*LPCREATEVERTEXBUFFER9 )( IDirect3DDevice9* pDev, IDirect3DVertexBuffer9** ppBuffer, + UINT iSizeBytes, DWORD Usage, DWORD FVF, D3DPOOL Pool, void* pData, + void* pContext ); +typedef void ( CALLBACK*LPCREATEINDEXBUFFER9 )( IDirect3DDevice9* pDev, IDirect3DIndexBuffer9** ppBuffer, + UINT iSizeBytes, DWORD Usage, D3DFORMAT ibFormat, D3DPOOL Pool, + void* pData, void* pContext ); +struct SDKMESH_CALLBACKS9 +{ + LPCREATETEXTUREFROMFILE9 pCreateTextureFromFile; + LPCREATEVERTEXBUFFER9 pCreateVertexBuffer; + LPCREATEINDEXBUFFER9 pCreateIndexBuffer; + void* pContext; +}; + + +typedef void ( CALLBACK*LPCREATETEXTUREFROMFILE11 )( ID3D11Device* pDev, char* szFileName, + ID3D11ShaderResourceView** ppRV, void* pContext ); +typedef void ( CALLBACK*LPCREATEVERTEXBUFFER11 )( ID3D11Device* pDev, ID3D11Buffer** ppBuffer, + D3D11_BUFFER_DESC BufferDesc, void* pData, void* pContext ); +typedef void ( CALLBACK*LPCREATEINDEXBUFFER11 )( ID3D11Device* pDev, ID3D11Buffer** ppBuffer, + D3D11_BUFFER_DESC BufferDesc, void* pData, void* pContext ); +struct SDKMESH_CALLBACKS11 +{ + LPCREATETEXTUREFROMFILE11 pCreateTextureFromFile; + LPCREATEVERTEXBUFFER11 pCreateVertexBuffer; + LPCREATEINDEXBUFFER11 pCreateIndexBuffer; + void* pContext; +}; + +//-------------------------------------------------------------------------------------- +// CDXUTSDKMesh class. This class reads the sdkmesh file format for use by the samples +//-------------------------------------------------------------------------------------- +class CDXUTSDKMesh +{ +private: + UINT m_NumOutstandingResources; + bool m_bLoading; + //BYTE* m_pBufferData; + HANDLE m_hFile; + HANDLE m_hFileMappingObject; + CGrowableArray m_MappedPointers; + IDirect3DDevice9* m_pDev9; + ID3D11Device* m_pDev11; + ID3D11DeviceContext* m_pDevContext11; + +protected: + //These are the pointers to the two chunks of data loaded in from the mesh file + BYTE* m_pStaticMeshData; + BYTE* m_pHeapData; + BYTE* m_pAnimationData; + BYTE** m_ppVertices; + BYTE** m_ppIndices; + + //Keep track of the path + WCHAR m_strPathW[MAX_PATH]; + char m_strPath[MAX_PATH]; + + //General mesh info + SDKMESH_HEADER* m_pMeshHeader; + SDKMESH_VERTEX_BUFFER_HEADER* m_pVertexBufferArray; + SDKMESH_INDEX_BUFFER_HEADER* m_pIndexBufferArray; + SDKMESH_MESH* m_pMeshArray; + SDKMESH_SUBSET* m_pSubsetArray; + SDKMESH_FRAME* m_pFrameArray; + SDKMESH_MATERIAL* m_pMaterialArray; + + // Adjacency information (not part of the m_pStaticMeshData, so it must be created and destroyed separately ) + SDKMESH_INDEX_BUFFER_HEADER* m_pAdjacencyIndexBufferArray; + + //Animation (TODO: Add ability to load/track multiple animation sets) + SDKANIMATION_FILE_HEADER* m_pAnimationHeader; + SDKANIMATION_FRAME_DATA* m_pAnimationFrameData; + D3DXMATRIX* m_pBindPoseFrameMatrices; + D3DXMATRIX* m_pTransformedFrameMatrices; + D3DXMATRIX* m_pWorldPoseFrameMatrices; + +protected: + void LoadMaterials( ID3D11Device* pd3dDevice, SDKMESH_MATERIAL* pMaterials, + UINT NumMaterials, SDKMESH_CALLBACKS11* pLoaderCallbacks=NULL ); + + void LoadMaterials( IDirect3DDevice9* pd3dDevice, SDKMESH_MATERIAL* pMaterials, + UINT NumMaterials, SDKMESH_CALLBACKS9* pLoaderCallbacks=NULL ); + + HRESULT CreateVertexBuffer( ID3D11Device* pd3dDevice, + SDKMESH_VERTEX_BUFFER_HEADER* pHeader, void* pVertices, + SDKMESH_CALLBACKS11* pLoaderCallbacks=NULL ); + HRESULT CreateVertexBuffer( IDirect3DDevice9* pd3dDevice, + SDKMESH_VERTEX_BUFFER_HEADER* pHeader, void* pVertices, + SDKMESH_CALLBACKS9* pLoaderCallbacks=NULL ); + + HRESULT CreateIndexBuffer( ID3D11Device* pd3dDevice, SDKMESH_INDEX_BUFFER_HEADER* pHeader, + void* pIndices, SDKMESH_CALLBACKS11* pLoaderCallbacks=NULL ); + HRESULT CreateIndexBuffer( IDirect3DDevice9* pd3dDevice, + SDKMESH_INDEX_BUFFER_HEADER* pHeader, void* pIndices, + SDKMESH_CALLBACKS9* pLoaderCallbacks=NULL ); + + virtual HRESULT CreateFromFile( ID3D11Device* pDev11, + IDirect3DDevice9* pDev9, + LPCTSTR szFileName, + bool bCreateAdjacencyIndices, + SDKMESH_CALLBACKS11* pLoaderCallbacks11 = NULL, + SDKMESH_CALLBACKS9* pLoaderCallbacks9 = NULL ); + + virtual HRESULT CreateFromMemory( ID3D11Device* pDev11, + IDirect3DDevice9* pDev9, + BYTE* pData, + UINT DataBytes, + bool bCreateAdjacencyIndices, + bool bCopyStatic, + SDKMESH_CALLBACKS11* pLoaderCallbacks11 = NULL, + SDKMESH_CALLBACKS9* pLoaderCallbacks9 = NULL ); + + //frame manipulation + void TransformBindPoseFrame( UINT iFrame, D3DXMATRIX* pParentWorld ); + void TransformFrame( UINT iFrame, D3DXMATRIX* pParentWorld, double fTime ); + void TransformFrameAbsolute( UINT iFrame, double fTime ); + + //Direct3D 11 rendering helpers + void RenderMesh( UINT iMesh, + bool bAdjacent, + ID3D11DeviceContext* pd3dDeviceContext, + UINT iDiffuseSlot, + UINT iNormalSlot, + UINT iSpecularSlot ); + void RenderFrame( UINT iFrame, + bool bAdjacent, + ID3D11DeviceContext* pd3dDeviceContext, + UINT iDiffuseSlot, + UINT iNormalSlot, + UINT iSpecularSlot ); + + + //Direct3D 9 rendering helpers + void RenderMesh( UINT iMesh, + LPDIRECT3DDEVICE9 pd3dDevice, + LPD3DXEFFECT pEffect, + D3DXHANDLE hTechnique, + D3DXHANDLE htxDiffuse, + D3DXHANDLE htxNormal, + D3DXHANDLE htxSpecular ); + void RenderFrame( UINT iFrame, + LPDIRECT3DDEVICE9 pd3dDevice, + LPD3DXEFFECT pEffect, + D3DXHANDLE hTechnique, + D3DXHANDLE htxDiffuse, + D3DXHANDLE htxNormal, + D3DXHANDLE htxSpecular ); + +public: + CDXUTSDKMesh(); + virtual ~CDXUTSDKMesh(); + + virtual HRESULT Create( ID3D11Device* pDev11, LPCTSTR szFileName, bool bCreateAdjacencyIndices= + false, SDKMESH_CALLBACKS11* pLoaderCallbacks=NULL ); + virtual HRESULT Create( IDirect3DDevice9* pDev9, LPCTSTR szFileName, bool bCreateAdjacencyIndices= + false, SDKMESH_CALLBACKS9* pLoaderCallbacks=NULL ); + virtual HRESULT Create( ID3D11Device* pDev11, BYTE* pData, UINT DataBytes, + bool bCreateAdjacencyIndices=false, bool bCopyStatic=false, + SDKMESH_CALLBACKS11* pLoaderCallbacks=NULL ); + virtual HRESULT Create( IDirect3DDevice9* pDev9, BYTE* pData, UINT DataBytes, + bool bCreateAdjacencyIndices=false, bool bCopyStatic=false, + SDKMESH_CALLBACKS9* pLoaderCallbacks=NULL ); + virtual HRESULT LoadAnimation( WCHAR* szFileName ); + virtual void Destroy(); + + //Frame manipulation + void TransformBindPose( D3DXMATRIX* pWorld ); + void TransformMesh( D3DXMATRIX* pWorld, double fTime ); + + + //Direct3D 11 Rendering + virtual void Render( ID3D11DeviceContext* pd3dDeviceContext, + UINT iDiffuseSlot = INVALID_SAMPLER_SLOT, + UINT iNormalSlot = INVALID_SAMPLER_SLOT, + UINT iSpecularSlot = INVALID_SAMPLER_SLOT ); + virtual void RenderAdjacent( ID3D11DeviceContext* pd3dDeviceContext, + UINT iDiffuseSlot = INVALID_SAMPLER_SLOT, + UINT iNormalSlot = INVALID_SAMPLER_SLOT, + UINT iSpecularSlot = INVALID_SAMPLER_SLOT ); + + //Direct3D 9 Rendering + virtual void Render( LPDIRECT3DDEVICE9 pd3dDevice, + LPD3DXEFFECT pEffect, + D3DXHANDLE hTechnique, + D3DXHANDLE htxDiffuse = 0, + D3DXHANDLE htxNormal = 0, + D3DXHANDLE htxSpecular = 0 ); + + //Helpers (D3D11 specific) + static D3D11_PRIMITIVE_TOPOLOGY GetPrimitiveType11( SDKMESH_PRIMITIVE_TYPE PrimType ); + DXGI_FORMAT GetIBFormat11( UINT iMesh ); + ID3D11Buffer* GetVB11( UINT iMesh, UINT iVB ); + ID3D11Buffer* GetIB11( UINT iMesh ); + SDKMESH_INDEX_TYPE GetIndexType( UINT iMesh ); + + ID3D11Buffer* GetAdjIB11( UINT iMesh ); + + //Helpers (D3D9 specific) + static D3DPRIMITIVETYPE GetPrimitiveType9( SDKMESH_PRIMITIVE_TYPE PrimType ); + D3DFORMAT GetIBFormat9( UINT iMesh ); + IDirect3DVertexBuffer9* GetVB9( UINT iMesh, UINT iVB ); + IDirect3DIndexBuffer9* GetIB9( UINT iMesh ); + + //Helpers (general) + char* GetMeshPathA(); + WCHAR* GetMeshPathW(); + UINT GetNumMeshes(); + UINT GetNumMaterials(); + UINT GetNumVBs(); + UINT GetNumIBs(); + + ID3D11Buffer* GetVB11At( UINT iVB ); + ID3D11Buffer* GetIB11At( UINT iIB ); + + IDirect3DVertexBuffer9* GetVB9At( UINT iVB ); + IDirect3DIndexBuffer9* GetIB9At( UINT iIB ); + + BYTE* GetRawVerticesAt( UINT iVB ); + BYTE* GetRawIndicesAt( UINT iIB ); + SDKMESH_MATERIAL* GetMaterial( UINT iMaterial ); + SDKMESH_MESH* GetMesh( UINT iMesh ); + UINT GetNumSubsets( UINT iMesh ); + SDKMESH_SUBSET* GetSubset( UINT iMesh, UINT iSubset ); + UINT GetVertexStride( UINT iMesh, UINT iVB ); + UINT GetNumFrames(); + SDKMESH_FRAME* GetFrame( UINT iFrame ); + SDKMESH_FRAME* FindFrame( char* pszName ); + UINT64 GetNumVertices( UINT iMesh, UINT iVB ); + UINT64 GetNumIndices( UINT iMesh ); + D3DXVECTOR3 GetMeshBBoxCenter( UINT iMesh ); + D3DXVECTOR3 GetMeshBBoxExtents( UINT iMesh ); + UINT GetOutstandingResources(); + UINT GetOutstandingBufferResources(); + bool CheckLoadDone(); + bool IsLoaded(); + bool IsLoading(); + void SetLoading( bool bLoading ); + BOOL HadLoadingError(); + + //Animation + UINT GetNumInfluences( UINT iMesh ); + const D3DXMATRIX* GetMeshInfluenceMatrix( UINT iMesh, UINT iInfluence ); + UINT GetAnimationKeyFromTime( double fTime ); + const D3DXMATRIX* GetWorldMatrix( UINT iFrameIndex ); + const D3DXMATRIX* GetInfluenceMatrix( UINT iFrameIndex ); + bool GetAnimationProperties( UINT* pNumKeys, FLOAT* pFrameTime ); +}; + +//----------------------------------------------------------------------------- +// Name: class CDXUTXFileMesh +// Desc: Class for loading and rendering file-based meshes +//----------------------------------------------------------------------------- +class CDXUTXFileMesh +{ +public: + WCHAR m_strName[512]; + LPD3DXMESH m_pMesh; // Managed mesh + + // Cache of data in m_pMesh for easy access + IDirect3DVertexBuffer9* m_pVB; + IDirect3DIndexBuffer9* m_pIB; + IDirect3DVertexDeclaration9* m_pDecl; + DWORD m_dwNumVertices; + DWORD m_dwNumFaces; + DWORD m_dwBytesPerVertex; + + DWORD m_dwNumMaterials; // Materials for the mesh + D3DMATERIAL9* m_pMaterials; + CHAR (*m_strMaterials )[MAX_PATH]; + IDirect3DBaseTexture9** m_pTextures; + bool m_bUseMaterials; + +public: + // Rendering + HRESULT Render( LPDIRECT3DDEVICE9 pd3dDevice, + bool bDrawOpaqueSubsets = true, + bool bDrawAlphaSubsets = true ); + HRESULT Render( ID3DXEffect* pEffect, + D3DXHANDLE hTexture = NULL, + D3DXHANDLE hDiffuse = NULL, + D3DXHANDLE hAmbient = NULL, + D3DXHANDLE hSpecular = NULL, + D3DXHANDLE hEmissive = NULL, + D3DXHANDLE hPower = NULL, + bool bDrawOpaqueSubsets = true, + bool bDrawAlphaSubsets = true ); + + // Mesh access + LPD3DXMESH GetMesh() + { + return m_pMesh; + } + + // Rendering options + void UseMeshMaterials( bool bFlag ) + { + m_bUseMaterials = bFlag; + } + HRESULT SetFVF( LPDIRECT3DDEVICE9 pd3dDevice, DWORD dwFVF ); + HRESULT SetVertexDecl( LPDIRECT3DDEVICE9 pd3dDevice, const D3DVERTEXELEMENT9* pDecl, + bool bAutoComputeNormals = true, bool bAutoComputeTangents = true, + bool bSplitVertexForOptimalTangents = false ); + + // Initializing + HRESULT RestoreDeviceObjects( LPDIRECT3DDEVICE9 pd3dDevice ); + HRESULT InvalidateDeviceObjects(); + + // Creation/destruction + HRESULT Create( LPDIRECT3DDEVICE9 pd3dDevice, LPCWSTR strFilename ); + HRESULT Create( LPDIRECT3DDEVICE9 pd3dDevice, LPD3DXFILEDATA pFileData ); + HRESULT Create( LPDIRECT3DDEVICE9 pd3dDevice, ID3DXMesh* pInMesh, D3DXMATERIAL* pd3dxMaterials, + DWORD dwMaterials ); + HRESULT CreateMaterials( LPCWSTR strPath, IDirect3DDevice9* pd3dDevice, D3DXMATERIAL* d3dxMtrls, + DWORD dwNumMaterials ); + HRESULT Destroy(); + + CDXUTXFileMesh( LPCWSTR strName = L"CDXUTXMeshFile_Mesh" ); + virtual ~CDXUTXFileMesh(); +}; + + +#endif + +#endif + diff --git a/Demos/DX11ClothDemo/DXUT/Optional/SDKmisc.cpp b/Demos/DX11ClothDemo/DXUT/Optional/SDKmisc.cpp new file mode 100644 index 000000000..79b144810 --- /dev/null +++ b/Demos/DX11ClothDemo/DXUT/Optional/SDKmisc.cpp @@ -0,0 +1,1684 @@ +//-------------------------------------------------------------------------------------- +// File: SDKmisc.cpp +// +// Various helper functionality that is shared between SDK samples +// +// Copyright (c) Microsoft Corporation. All rights reserved +//-------------------------------------------------------------------------------------- +#include "dxut.h" +#include "SDKmisc.h" +#include "DXUTres.h" +#undef min // use __min instead +#undef max // use __max instead + +#include "DXUTGui.h" + +//-------------------------------------------------------------------------------------- +// Global/Static Members +//-------------------------------------------------------------------------------------- +CDXUTResourceCache& WINAPI DXUTGetGlobalResourceCache() +{ + // Using an accessor function gives control of the construction order + static CDXUTResourceCache cache; + return cache; +} + + +//-------------------------------------------------------------------------------------- +// Internal functions forward declarations +//-------------------------------------------------------------------------------------- +bool DXUTFindMediaSearchTypicalDirs( __in_ecount(cchSearch) WCHAR* strSearchPath, + int cchSearch, + __in LPCWSTR strLeaf, + __in WCHAR* strExePath, + __in WCHAR* strExeName ); +bool DXUTFindMediaSearchParentDirs( __in_ecount(cchSearch) WCHAR* strSearchPath, + int cchSearch, + __in WCHAR* strStartAt, + __in WCHAR* strLeafName ); +INT_PTR CALLBACK DisplaySwitchToREFWarningProc( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam ); + + +//-------------------------------------------------------------------------------------- +// Shared code for samples to ask user if they want to use a REF device or quit +//-------------------------------------------------------------------------------------- +void WINAPI DXUTDisplaySwitchingToREFWarning( DXUTDeviceVersion ver ) +{ + if( DXUTGetShowMsgBoxOnError() ) + { + DWORD dwSkipWarning = 0, dwRead = 0, dwWritten = 0; + HANDLE hFile = NULL; + + // Read previous user settings + WCHAR strPath[MAX_PATH]; + SHGetFolderPath( DXUTGetHWND(), CSIDL_LOCAL_APPDATA, NULL, SHGFP_TYPE_CURRENT, strPath ); + wcscat_s( strPath, MAX_PATH, L"\\DXUT\\SkipRefWarning.dat" ); + if( ( hFile = CreateFile( strPath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, + NULL ) ) != INVALID_HANDLE_VALUE ) + { + ReadFile( hFile, &dwSkipWarning, sizeof( DWORD ), &dwRead, NULL ); + CloseHandle( hFile ); + } + + if( dwSkipWarning == 0 ) + { + // Compact code to create a custom dialog box without using a template in a resource file. + // If this dialog were in a .rc file, this would be a lot simpler but every sample calling this function would + // need a copy of the dialog in its own .rc file. Also MessageBox API could be used here instead, but + // the MessageBox API is simpler to call but it can't provide a "Don't show again" checkbox + typedef struct + { + DLGITEMTEMPLATE a; + WORD b; + WORD c; + WORD d; + WORD e; + WORD f; + } DXUT_DLG_ITEM; + typedef struct + { + DLGTEMPLATE a; + WORD b; + WORD c; + WCHAR d[2]; + WORD e; + WCHAR f[16]; + DXUT_DLG_ITEM i1; + DXUT_DLG_ITEM i2; + DXUT_DLG_ITEM i3; + DXUT_DLG_ITEM i4; + DXUT_DLG_ITEM i5; + } DXUT_DLG_DATA; + + DXUT_DLG_DATA dtp = + { + {WS_CAPTION | WS_POPUP | WS_VISIBLE | WS_SYSMENU | DS_ABSALIGN | DS_3DLOOK | DS_SETFONT | + DS_MODALFRAME | DS_CENTER,0,5,0,0,269,82},0,0,L" ",8,L"MS Shell Dlg 2", + { {WS_CHILD | WS_VISIBLE | SS_ICON | SS_CENTERIMAGE,0,7,7,24,24,0x100},0xFFFF,0x0082,0,0,0}, // icon + { {WS_CHILD | WS_VISIBLE,0,40,7,230,25,0x101},0xFFFF,0x0082,0,0,0}, // static text + { {WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_DEFPUSHBUTTON,0,80,39,50,14,IDYES},0xFFFF,0x0080,0,0,0}, // Yes button + { {WS_CHILD | WS_VISIBLE | WS_TABSTOP,0,133,39,50,14,IDNO},0xFFFF,0x0080,0,0,0}, // No button + { {WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_CHECKBOX,0,7,59,70,16,IDIGNORE},0xFFFF,0x0080,0,0,0}, // checkbox + }; + + LPARAM lParam; + if( ver == DXUT_D3D9_DEVICE ) + lParam = 9; + else + lParam = 11; + int nResult = ( int )DialogBoxIndirectParam( DXUTGetHINSTANCE(), ( DLGTEMPLATE* )&dtp, DXUTGetHWND(), + DisplaySwitchToREFWarningProc, lParam ); + + if( ( nResult & 0x80 ) == 0x80 ) // "Don't show again" checkbox was checked + { + // Save user settings + dwSkipWarning = 1; + SHGetFolderPath( DXUTGetHWND(), CSIDL_LOCAL_APPDATA, NULL, SHGFP_TYPE_CURRENT, strPath ); + wcscat_s( strPath, MAX_PATH, L"\\DXUT" ); + CreateDirectory( strPath, NULL ); + wcscat_s( strPath, MAX_PATH, L"\\SkipRefWarning.dat" ); + if( ( hFile = CreateFile( strPath, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, + NULL ) ) != INVALID_HANDLE_VALUE ) + { + WriteFile( hFile, &dwSkipWarning, sizeof( DWORD ), &dwWritten, NULL ); + CloseHandle( hFile ); + } + } + + // User choose not to continue + if( ( nResult & 0x0F ) == IDNO ) + DXUTShutdown( 1 ); + } + } +} + + +//-------------------------------------------------------------------------------------- +// MsgProc for DXUTDisplaySwitchingToREFWarning() dialog box +//-------------------------------------------------------------------------------------- +INT_PTR CALLBACK DisplaySwitchToREFWarningProc( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam ) +{ + switch( message ) + { + case WM_INITDIALOG: + // Easier to set text here than in the DLGITEMTEMPLATE + SetWindowText( hDlg, DXUTGetWindowTitle() ); + SendMessage( GetDlgItem( hDlg, 0x100 ), STM_SETIMAGE, IMAGE_ICON, ( LPARAM )LoadIcon( 0, IDI_QUESTION ) ); + WCHAR sz[512]; + swprintf_s( sz, 512, + L"This program needs to use the Direct3D %d reference device. This device implements the entire Direct3D %d feature set, but runs very slowly. Do you wish to continue?", lParam, lParam ); + SetDlgItemText( hDlg, 0x101, sz ); + SetDlgItemText( hDlg, IDYES, L"&Yes" ); + SetDlgItemText( hDlg, IDNO, L"&No" ); + SetDlgItemText( hDlg, IDIGNORE, L"&Don't show again" ); + break; + + case WM_COMMAND: + switch( LOWORD( wParam ) ) + { + case IDIGNORE: + CheckDlgButton( hDlg, IDIGNORE, ( IsDlgButtonChecked( hDlg, + IDIGNORE ) == BST_CHECKED ) ? BST_UNCHECKED : + BST_CHECKED ); + EnableWindow( GetDlgItem( hDlg, IDNO ), ( IsDlgButtonChecked( hDlg, IDIGNORE ) != BST_CHECKED ) ); + break; + case IDNO: + EndDialog( hDlg, ( IsDlgButtonChecked( hDlg, IDIGNORE ) == BST_CHECKED ) ? IDNO | 0x80 : IDNO | + 0x00 ); return TRUE; + case IDCANCEL: + case IDYES: + EndDialog( hDlg, ( IsDlgButtonChecked( hDlg, IDIGNORE ) == BST_CHECKED ) ? IDYES | 0x80 : IDYES | + 0x00 ); return TRUE; + } + break; + } + return FALSE; +} + + +//-------------------------------------------------------------------------------------- +// Returns pointer to static media search buffer +//-------------------------------------------------------------------------------------- +WCHAR* DXUTMediaSearchPath() +{ + static WCHAR s_strMediaSearchPath[MAX_PATH] = + { + 0 + }; + return s_strMediaSearchPath; + +} + +//-------------------------------------------------------------------------------------- +LPCWSTR WINAPI DXUTGetMediaSearchPath() +{ + return DXUTMediaSearchPath(); +} + + +//-------------------------------------------------------------------------------------- +HRESULT WINAPI DXUTSetMediaSearchPath( LPCWSTR strPath ) +{ + HRESULT hr; + + WCHAR* s_strSearchPath = DXUTMediaSearchPath(); + + hr = wcscpy_s( s_strSearchPath, MAX_PATH, strPath ); + if( SUCCEEDED( hr ) ) + { + // append slash if needed + size_t ch = 0; + ch = wcsnlen( s_strSearchPath, MAX_PATH); + if( SUCCEEDED( hr ) && s_strSearchPath[ch - 1] != L'\\' ) + { + hr = wcscat_s( s_strSearchPath, MAX_PATH, L"\\" ); + } + } + + return hr; +} + + +//-------------------------------------------------------------------------------------- +// Tries to find the location of a SDK media file +// cchDest is the size in WCHARs of strDestPath. Be careful not to +// pass in sizeof(strDest) on UNICODE builds. +//-------------------------------------------------------------------------------------- +HRESULT WINAPI DXUTFindDXSDKMediaFileCch(__in_ecount(cchDest) WCHAR* strDestPath, + int cchDest, + __in LPCWSTR strFilename ) +{ + bool bFound; + WCHAR strSearchFor[MAX_PATH]; + + if( NULL == strFilename || strFilename[0] == 0 || NULL == strDestPath || cchDest < 10 ) + return E_INVALIDARG; + + // Get the exe name, and exe path + WCHAR strExePath[MAX_PATH] = + { + 0 + }; + WCHAR strExeName[MAX_PATH] = + { + 0 + }; + WCHAR* strLastSlash = NULL; + GetModuleFileName( NULL, strExePath, MAX_PATH ); + strExePath[MAX_PATH - 1] = 0; + strLastSlash = wcsrchr( strExePath, TEXT( '\\' ) ); + if( strLastSlash ) + { + wcscpy_s( strExeName, MAX_PATH, &strLastSlash[1] ); + + // Chop the exe name from the exe path + *strLastSlash = 0; + + // Chop the .exe from the exe name + strLastSlash = wcsrchr( strExeName, TEXT( '.' ) ); + if( strLastSlash ) + *strLastSlash = 0; + } + + // Typical directories: + // .\ + // ..\ + // ..\..\ + // %EXE_DIR%\ + // %EXE_DIR%\..\ + // %EXE_DIR%\..\..\ + // %EXE_DIR%\..\%EXE_NAME% + // %EXE_DIR%\..\..\%EXE_NAME% + + // Typical directory search + bFound = DXUTFindMediaSearchTypicalDirs( strDestPath, cchDest, strFilename, strExePath, strExeName ); + if( bFound ) + return S_OK; + + // Typical directory search again, but also look in a subdir called "\media\" + swprintf_s( strSearchFor, MAX_PATH, L"media\\%s", strFilename ); + bFound = DXUTFindMediaSearchTypicalDirs( strDestPath, cchDest, strSearchFor, strExePath, strExeName ); + if( bFound ) + return S_OK; + + WCHAR strLeafName[MAX_PATH] = + { + 0 + }; + + // Search all parent directories starting at .\ and using strFilename as the leaf name + wcscpy_s( strLeafName, MAX_PATH, strFilename ); + bFound = DXUTFindMediaSearchParentDirs( strDestPath, cchDest, L".", strLeafName ); + if( bFound ) + return S_OK; + + // Search all parent directories starting at the exe's dir and using strFilename as the leaf name + bFound = DXUTFindMediaSearchParentDirs( strDestPath, cchDest, strExePath, strLeafName ); + if( bFound ) + return S_OK; + + // Search all parent directories starting at .\ and using "media\strFilename" as the leaf name + swprintf_s( strLeafName, MAX_PATH, L"media\\%s", strFilename ); + bFound = DXUTFindMediaSearchParentDirs( strDestPath, cchDest, L".", strLeafName ); + if( bFound ) + return S_OK; + + // Search all parent directories starting at the exe's dir and using "media\strFilename" as the leaf name + bFound = DXUTFindMediaSearchParentDirs( strDestPath, cchDest, strExePath, strLeafName ); + if( bFound ) + return S_OK; + + // On failure, return the file as the path but also return an error code + wcscpy_s( strDestPath, cchDest, strFilename ); + + return DXUTERR_MEDIANOTFOUND; +} + + +//-------------------------------------------------------------------------------------- +// Search a set of typical directories +//-------------------------------------------------------------------------------------- +bool DXUTFindMediaSearchTypicalDirs( __in_ecount(cchSearch) WCHAR* strSearchPath, + int cchSearch, + __in LPCWSTR strLeaf, + __in WCHAR* strExePath, + __in WCHAR* strExeName ) +{ + // Typical directories: + // .\ + // ..\ + // ..\..\ + // %EXE_DIR%\ + // %EXE_DIR%\..\ + // %EXE_DIR%\..\..\ + // %EXE_DIR%\..\%EXE_NAME% + // %EXE_DIR%\..\..\%EXE_NAME% + // DXSDK media path + + // Search in .\ + wcscpy_s( strSearchPath, cchSearch, strLeaf ); + if( GetFileAttributes( strSearchPath ) != 0xFFFFFFFF ) + return true; + + // Search in ..\ + swprintf_s( strSearchPath, cchSearch, L"..\\%s", strLeaf ); + if( GetFileAttributes( strSearchPath ) != 0xFFFFFFFF ) + return true; + + // Search in ..\..\ + swprintf_s( strSearchPath, cchSearch, L"..\\..\\%s", strLeaf ); + if( GetFileAttributes( strSearchPath ) != 0xFFFFFFFF ) + return true; + + // Search in ..\..\ + swprintf_s( strSearchPath, cchSearch, L"..\\..\\%s", strLeaf ); + if( GetFileAttributes( strSearchPath ) != 0xFFFFFFFF ) + return true; + + // Search in the %EXE_DIR%\ + swprintf_s( strSearchPath, cchSearch, L"%s\\%s", strExePath, strLeaf ); + if( GetFileAttributes( strSearchPath ) != 0xFFFFFFFF ) + return true; + + // Search in the %EXE_DIR%\..\ + swprintf_s( strSearchPath, cchSearch, L"%s\\..\\%s", strExePath, strLeaf ); + if( GetFileAttributes( strSearchPath ) != 0xFFFFFFFF ) + return true; + + // Search in the %EXE_DIR%\..\..\ + swprintf_s( strSearchPath, cchSearch, L"%s\\..\\..\\%s", strExePath, strLeaf ); + if( GetFileAttributes( strSearchPath ) != 0xFFFFFFFF ) + return true; + + // Search in "%EXE_DIR%\..\%EXE_NAME%\". This matches the DirectX SDK layout + swprintf_s( strSearchPath, cchSearch, L"%s\\..\\%s\\%s", strExePath, strExeName, strLeaf ); + if( GetFileAttributes( strSearchPath ) != 0xFFFFFFFF ) + return true; + + // Search in "%EXE_DIR%\..\..\%EXE_NAME%\". This matches the DirectX SDK layout + swprintf_s( strSearchPath, cchSearch, L"%s\\..\\..\\%s\\%s", strExePath, strExeName, strLeaf ); + if( GetFileAttributes( strSearchPath ) != 0xFFFFFFFF ) + return true; + + // Search in media search dir + WCHAR* s_strSearchPath = DXUTMediaSearchPath(); + if( s_strSearchPath[0] != 0 ) + { + swprintf_s( strSearchPath, cchSearch, L"%s%s", s_strSearchPath, strLeaf ); + if( GetFileAttributes( strSearchPath ) != 0xFFFFFFFF ) + return true; + } + + return false; +} + + + +//-------------------------------------------------------------------------------------- +// Search parent directories starting at strStartAt, and appending strLeafName +// at each parent directory. It stops at the root directory. +//-------------------------------------------------------------------------------------- +bool DXUTFindMediaSearchParentDirs( __in_ecount(cchSearch) WCHAR* strSearchPath, + int cchSearch, + __in WCHAR* strStartAt, + __in WCHAR* strLeafName ) +{ + WCHAR strFullPath[MAX_PATH] = + { + 0 + }; + WCHAR strFullFileName[MAX_PATH] = + { + 0 + }; + WCHAR strSearch[MAX_PATH] = + { + 0 + }; + WCHAR* strFilePart = NULL; + + GetFullPathName( strStartAt, MAX_PATH, strFullPath, &strFilePart ); + if( strFilePart == NULL ) + return false; + + while( strFilePart != NULL && *strFilePart != '\0' ) + { + swprintf_s( strFullFileName, MAX_PATH, L"%s\\%s", strFullPath, strLeafName ); + if( GetFileAttributes( strFullFileName ) != 0xFFFFFFFF ) + { + wcscpy_s( strSearchPath, cchSearch, strFullFileName ); + return true; + } + + swprintf_s( strSearch, MAX_PATH, L"%s\\..", strFullPath ); + GetFullPathName( strSearch, MAX_PATH, strFullPath, &strFilePart ); + } + + return false; +} + + +//-------------------------------------------------------------------------------------- +// CDXUTResourceCache +//-------------------------------------------------------------------------------------- + +//-------------------------------------------------------------------------------------- +CDXUTResourceCache::~CDXUTResourceCache() +{ + OnDestroyDevice(); + + m_TextureCache.RemoveAll(); + m_EffectCache.RemoveAll(); + m_FontCache.RemoveAll(); +} + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTResourceCache::CreateTextureFromFile( LPDIRECT3DDEVICE9 pDevice, LPCTSTR pSrcFile, + LPDIRECT3DTEXTURE9* ppTexture ) +{ + return CreateTextureFromFileEx( pDevice, pSrcFile, D3DX_DEFAULT, D3DX_DEFAULT, D3DX_DEFAULT, + 0, D3DFMT_UNKNOWN, D3DPOOL_MANAGED, D3DX_DEFAULT, D3DX_DEFAULT, + 0, NULL, NULL, ppTexture ); +} + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTResourceCache::CreateTextureFromFile( LPDIRECT3DDEVICE9 pDevice, LPCSTR pSrcFile, + LPDIRECT3DTEXTURE9* ppTexture ) +{ + WCHAR szSrcFile[MAX_PATH]; + MultiByteToWideChar( CP_ACP, 0, pSrcFile, -1, szSrcFile, MAX_PATH ); + szSrcFile[MAX_PATH - 1] = 0; + + return CreateTextureFromFile( pDevice, szSrcFile, ppTexture ); +} + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTResourceCache::CreateTextureFromFile( ID3D11Device* pDevice, ID3D11DeviceContext *pContext, LPCTSTR pSrcFile, + ID3D11ShaderResourceView** ppOutputRV, bool bSRGB ) +{ + return CreateTextureFromFileEx( pDevice, pContext, pSrcFile, NULL, NULL, ppOutputRV, bSRGB ); +} + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTResourceCache::CreateTextureFromFile( ID3D11Device* pDevice, ID3D11DeviceContext *pContext, LPCSTR pSrcFile, + ID3D11ShaderResourceView** ppOutputRV, bool bSRGB ) +{ + WCHAR szSrcFile[MAX_PATH]; + MultiByteToWideChar( CP_ACP, 0, pSrcFile, -1, szSrcFile, MAX_PATH ); + szSrcFile[MAX_PATH - 1] = 0; + + return CreateTextureFromFile( pDevice, pContext, szSrcFile, ppOutputRV, bSRGB ); +} + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTResourceCache::CreateTextureFromFileEx( LPDIRECT3DDEVICE9 pDevice, LPCTSTR pSrcFile, UINT Width, + UINT Height, UINT MipLevels, DWORD Usage, D3DFORMAT Format, + D3DPOOL Pool, DWORD Filter, DWORD MipFilter, D3DCOLOR ColorKey, + D3DXIMAGE_INFO* pSrcInfo, PALETTEENTRY* pPalette, + LPDIRECT3DTEXTURE9* ppTexture ) +{ + // Search the cache for a matching entry. + for( int i = 0; i < m_TextureCache.GetSize(); ++i ) + { + DXUTCache_Texture& Entry = m_TextureCache[i]; + if( Entry.Location == DXUTCACHE_LOCATION_FILE && + !lstrcmpW( Entry.wszSource, pSrcFile ) && + Entry.Width == Width && + Entry.Height == Height && + Entry.MipLevels == MipLevels && + Entry.Usage9 == Usage && + Entry.Format9 == Format && + Entry.Pool9 == Pool && + Entry.Type9 == D3DRTYPE_TEXTURE ) + { + // A match is found. Obtain the IDirect3DTexture9 interface and return that. + return Entry.pTexture9->QueryInterface( IID_IDirect3DTexture9, ( LPVOID* )ppTexture ); + } + } + + HRESULT hr; + + // No matching entry. Load the resource and create a new entry. + hr = D3DXCreateTextureFromFileEx( pDevice, pSrcFile, Width, Height, MipLevels, Usage, Format, + Pool, Filter, MipFilter, ColorKey, pSrcInfo, pPalette, ppTexture ); + if( FAILED( hr ) ) + return hr; + + DXUTCache_Texture NewEntry; + NewEntry.Location = DXUTCACHE_LOCATION_FILE; + wcscpy_s( NewEntry.wszSource, MAX_PATH, pSrcFile ); + NewEntry.Width = Width; + NewEntry.Height = Height; + NewEntry.MipLevels = MipLevels; + NewEntry.Usage9 = Usage; + NewEntry.Format9 = Format; + NewEntry.Pool9 = Pool; + NewEntry.Type9 = D3DRTYPE_TEXTURE; + ( *ppTexture )->QueryInterface( IID_IDirect3DBaseTexture9, ( LPVOID* )&NewEntry.pTexture9 ); + + m_TextureCache.Add( NewEntry ); + return S_OK; +} + + + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTResourceCache::CreateTextureFromFileEx( ID3D11Device* pDevice, ID3D11DeviceContext* pContext, LPCTSTR pSrcFile, + D3DX11_IMAGE_LOAD_INFO* pLoadInfo, ID3DX11ThreadPump* pPump, + ID3D11ShaderResourceView** ppOutputRV, bool bSRGB ) +{ + + bool is10L9 = DXUTGetDeviceSettings().d3d11.DeviceFeatureLevel < D3D_FEATURE_LEVEL_10_0; + HRESULT hr = S_OK; + D3DX11_IMAGE_LOAD_INFO ZeroInfo; //D3DX11_IMAGE_LOAD_INFO has a default constructor + D3DX11_IMAGE_INFO SrcInfo; + + if( !pLoadInfo ) + { + pLoadInfo = &ZeroInfo; + } + + if( !pLoadInfo->pSrcInfo ) + { + D3DX11GetImageInfoFromFile( pSrcFile, NULL, &SrcInfo, NULL ); + pLoadInfo->pSrcInfo = &SrcInfo; + + pLoadInfo->Format = pLoadInfo->pSrcInfo->Format; + } + + // Search the cache for a matching entry. + for( int i = 0; i < m_TextureCache.GetSize(); ++i ) + { + DXUTCache_Texture& Entry = m_TextureCache[i]; + if( Entry.Location == DXUTCACHE_LOCATION_FILE && + !lstrcmpW( Entry.wszSource, pSrcFile ) && + Entry.Width == pLoadInfo->Width && + Entry.Height == pLoadInfo->Height && + Entry.MipLevels == pLoadInfo->MipLevels && + Entry.Usage11 == pLoadInfo->Usage && + Entry.Format == pLoadInfo->Format && + Entry.CpuAccessFlags == pLoadInfo->CpuAccessFlags && + Entry.BindFlags == pLoadInfo->BindFlags && + Entry.MiscFlags == pLoadInfo->MiscFlags ) + { + // A match is found. Obtain the IDirect3DTexture9 interface and return that. + return Entry.pSRV11->QueryInterface( __uuidof( ID3D11ShaderResourceView ), ( LPVOID* )ppOutputRV ); + } + } + + //Ready a new entry to the texture cache + //Do this before creating the texture since pLoadInfo may be volatile + DXUTCache_Texture NewEntry; + NewEntry.Location = DXUTCACHE_LOCATION_FILE; + wcscpy_s( NewEntry.wszSource, MAX_PATH, pSrcFile ); + NewEntry.Width = pLoadInfo->Width; + NewEntry.Height = pLoadInfo->Height; + NewEntry.MipLevels = pLoadInfo->MipLevels; + NewEntry.Usage11 = pLoadInfo->Usage; + // 10L9 can't handle typesless, so we cant make a typesless format + if (is10L9 && bSRGB) { + NewEntry.Format = MAKE_SRGB(pLoadInfo->Format); + }else { + NewEntry.Format = pLoadInfo->Format; + } + NewEntry.CpuAccessFlags = pLoadInfo->CpuAccessFlags; + NewEntry.BindFlags = pLoadInfo->BindFlags; + NewEntry.MiscFlags = pLoadInfo->MiscFlags; + + //Create the rexture + ID3D11Texture2D* pRes = NULL; + hr = D3DX11CreateTextureFromFile( pDevice, pSrcFile, pLoadInfo, pPump, ( ID3D11Resource** )&pRes, NULL ); + + if( FAILED( hr ) ) + return hr; + D3D11_TEXTURE2D_DESC tex_dsc; + pRes->GetDesc(&tex_dsc); + + + + if (bSRGB ) { + // This is a workaround so that we can load linearly, but sample in SRGB. Right now, we can't load + // as linear since D3DX will try to do conversion on load. Loading as TYPELESS doesn't work either, and + // loading as typed _UNORM doesn't allow us to create an SRGB view. + + // on d3d11 featuer levels this is just a copy, but on 10L9 we must use a cpu side copy with 2 staging resources. + ID3D11Texture2D* unormStaging = NULL; + ID3D11Texture2D* srgbStaging = NULL; + + D3D11_TEXTURE2D_DESC CopyDesc; + pRes->GetDesc( &CopyDesc ); + + pLoadInfo->BindFlags = 0; + pLoadInfo->CpuAccessFlags = D3D11_CPU_ACCESS_WRITE | D3D11_CPU_ACCESS_READ; + pLoadInfo->Depth = 0; + pLoadInfo->Filter = D3DX11_FILTER_POINT; + pLoadInfo->FirstMipLevel = 0; + pLoadInfo->Format = CopyDesc.Format; + pLoadInfo->Height = CopyDesc.Height; + pLoadInfo->MipFilter = D3DX11_FILTER_POINT; + pLoadInfo->MiscFlags = CopyDesc.MiscFlags; + pLoadInfo->Usage = D3D11_USAGE_STAGING; + pLoadInfo->Width = CopyDesc.Width; + + CopyDesc.BindFlags = 0; + CopyDesc.Usage = D3D11_USAGE_STAGING; + CopyDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE | D3D11_CPU_ACCESS_READ; + CopyDesc.Format = MAKE_SRGB(CopyDesc.Format); + + hr = D3DX11CreateTextureFromFile( pDevice, pSrcFile, pLoadInfo, pPump, ( ID3D11Resource** )&unormStaging, NULL ); + + hr = pDevice->CreateTexture2D(&CopyDesc, NULL, &srgbStaging); + pContext->CopyResource( srgbStaging, unormStaging ); + ID3D11Texture2D* srgbGPU; + + pRes->GetDesc( &CopyDesc ); + CopyDesc.Format = MAKE_SRGB(CopyDesc.Format); + hr = pDevice->CreateTexture2D(&CopyDesc, NULL, &srgbGPU); + pContext->CopyResource( srgbGPU, srgbStaging ); + + SAFE_RELEASE(pRes); + SAFE_RELEASE(srgbStaging); + SAFE_RELEASE(unormStaging); + pRes = srgbGPU; + + } + + D3D11_SHADER_RESOURCE_VIEW_DESC SRVDesc; + if( bSRGB ) + SRVDesc.Format = MAKE_SRGB( ZeroInfo.Format ); + else + SRVDesc.Format = ZeroInfo.Format; + if( pLoadInfo->pSrcInfo->ResourceDimension == D3D11_RESOURCE_DIMENSION_TEXTURE1D ) + { + SRVDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE1D; + SRVDesc.Texture1D.MostDetailedMip = 0; + SRVDesc.Texture1D.MipLevels = pLoadInfo->pSrcInfo->MipLevels; + } + else if( pLoadInfo->pSrcInfo->ResourceDimension == D3D11_RESOURCE_DIMENSION_TEXTURE2D ) + { + SRVDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; + SRVDesc.Texture2D.MostDetailedMip = 0; + SRVDesc.Texture2D.MipLevels = pLoadInfo->pSrcInfo->MipLevels; + + if( pLoadInfo->pSrcInfo->MiscFlags & D3D11_RESOURCE_MISC_TEXTURECUBE ) + { + SRVDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURECUBE; + SRVDesc.TextureCube.MostDetailedMip = 0; + SRVDesc.TextureCube.MipLevels = pLoadInfo->pSrcInfo->MipLevels; + } + } + else if( pLoadInfo->pSrcInfo->ResourceDimension == D3D11_RESOURCE_DIMENSION_TEXTURE3D ) + { + SRVDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE3D; + SRVDesc.Texture3D.MostDetailedMip = 0; + SRVDesc.Texture3D.MipLevels = pLoadInfo->pSrcInfo->MipLevels; + } + if (bSRGB) { + SRVDesc.Format = MAKE_SRGB(tex_dsc.Format); + }else { + SRVDesc.Format = tex_dsc.Format; + } + SRVDesc.Texture2D.MipLevels = tex_dsc.MipLevels; + SRVDesc.Texture2D.MostDetailedMip = 0; + hr = pDevice->CreateShaderResourceView( pRes, &SRVDesc, ppOutputRV ); + pRes->Release(); + if( FAILED( hr ) ) + return hr; + + ( *ppOutputRV )->QueryInterface( __uuidof( ID3D11ShaderResourceView ), ( LPVOID* )&NewEntry.pSRV11 ); + + m_TextureCache.Add( NewEntry ); + + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTResourceCache::CreateTextureFromResource( LPDIRECT3DDEVICE9 pDevice, HMODULE hSrcModule, + LPCTSTR pSrcResource, LPDIRECT3DTEXTURE9* ppTexture ) +{ + return CreateTextureFromResourceEx( pDevice, hSrcModule, pSrcResource, D3DX_DEFAULT, D3DX_DEFAULT, + D3DX_DEFAULT, 0, D3DFMT_UNKNOWN, D3DPOOL_MANAGED, D3DX_DEFAULT, + D3DX_DEFAULT, 0, NULL, NULL, ppTexture ); +} + + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTResourceCache::CreateTextureFromResourceEx( LPDIRECT3DDEVICE9 pDevice, HMODULE hSrcModule, + LPCTSTR pSrcResource, UINT Width, UINT Height, UINT MipLevels, + DWORD Usage, D3DFORMAT Format, D3DPOOL Pool, DWORD Filter, + DWORD MipFilter, D3DCOLOR ColorKey, D3DXIMAGE_INFO* pSrcInfo, + PALETTEENTRY* pPalette, LPDIRECT3DTEXTURE9* ppTexture ) +{ + // Search the cache for a matching entry. + for( int i = 0; i < m_TextureCache.GetSize(); ++i ) + { + DXUTCache_Texture& Entry = m_TextureCache[i]; + if( Entry.Location == DXUTCACHE_LOCATION_RESOURCE && + Entry.hSrcModule == hSrcModule && + !lstrcmpW( Entry.wszSource, pSrcResource ) && + Entry.Width == Width && + Entry.Height == Height && + Entry.MipLevels == MipLevels && + Entry.Usage9 == Usage && + Entry.Format9 == Format && + Entry.Pool9 == Pool && + Entry.Type9 == D3DRTYPE_TEXTURE ) + { + // A match is found. Obtain the IDirect3DTexture9 interface and return that. + return Entry.pTexture9->QueryInterface( IID_IDirect3DTexture9, ( LPVOID* )ppTexture ); + } + } + + HRESULT hr; + + // No matching entry. Load the resource and create a new entry. + hr = D3DXCreateTextureFromResourceEx( pDevice, hSrcModule, pSrcResource, Width, Height, MipLevels, Usage, + Format, Pool, Filter, MipFilter, ColorKey, pSrcInfo, pPalette, ppTexture ); + if( FAILED( hr ) ) + return hr; + + DXUTCache_Texture NewEntry; + NewEntry.Location = DXUTCACHE_LOCATION_RESOURCE; + NewEntry.hSrcModule = hSrcModule; + wcscpy_s( NewEntry.wszSource, MAX_PATH, pSrcResource ); + NewEntry.Width = Width; + NewEntry.Height = Height; + NewEntry.MipLevels = MipLevels; + NewEntry.Usage9 = Usage; + NewEntry.Format9 = Format; + NewEntry.Pool9 = Pool; + NewEntry.Type9 = D3DRTYPE_TEXTURE; + ( *ppTexture )->QueryInterface( IID_IDirect3DBaseTexture9, ( LPVOID* )&NewEntry.pTexture9 ); + + m_TextureCache.Add( NewEntry ); + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTResourceCache::CreateCubeTextureFromFile( LPDIRECT3DDEVICE9 pDevice, LPCTSTR pSrcFile, + LPDIRECT3DCUBETEXTURE9* ppCubeTexture ) +{ + return CreateCubeTextureFromFileEx( pDevice, pSrcFile, D3DX_DEFAULT, D3DX_DEFAULT, 0, + D3DFMT_UNKNOWN, D3DPOOL_MANAGED, D3DX_DEFAULT, D3DX_DEFAULT, + 0, NULL, NULL, ppCubeTexture ); +} + + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTResourceCache::CreateCubeTextureFromFileEx( LPDIRECT3DDEVICE9 pDevice, LPCTSTR pSrcFile, UINT Size, + UINT MipLevels, DWORD Usage, D3DFORMAT Format, D3DPOOL Pool, + DWORD Filter, DWORD MipFilter, D3DCOLOR ColorKey, + D3DXIMAGE_INFO* pSrcInfo, PALETTEENTRY* pPalette, + LPDIRECT3DCUBETEXTURE9* ppCubeTexture ) +{ + // Search the cache for a matching entry. + for( int i = 0; i < m_TextureCache.GetSize(); ++i ) + { + DXUTCache_Texture& Entry = m_TextureCache[i]; + if( Entry.Location == DXUTCACHE_LOCATION_FILE && + !lstrcmpW( Entry.wszSource, pSrcFile ) && + Entry.Width == Size && + Entry.MipLevels == MipLevels && + Entry.Usage9 == Usage && + Entry.Format9 == Format && + Entry.Pool9 == Pool && + Entry.Type9 == D3DRTYPE_CUBETEXTURE ) + { + // A match is found. Obtain the IDirect3DCubeTexture9 interface and return that. + return Entry.pTexture9->QueryInterface( IID_IDirect3DCubeTexture9, ( LPVOID* )ppCubeTexture ); + } + } + + HRESULT hr; + + // No matching entry. Load the resource and create a new entry. + hr = D3DXCreateCubeTextureFromFileEx( pDevice, pSrcFile, Size, MipLevels, Usage, Format, Pool, Filter, + MipFilter, ColorKey, pSrcInfo, pPalette, ppCubeTexture ); + if( FAILED( hr ) ) + return hr; + + DXUTCache_Texture NewEntry; + NewEntry.Location = DXUTCACHE_LOCATION_FILE; + wcscpy_s( NewEntry.wszSource, MAX_PATH, pSrcFile ); + NewEntry.Width = Size; + NewEntry.MipLevels = MipLevels; + NewEntry.Usage9 = Usage; + NewEntry.Format9 = Format; + NewEntry.Pool9 = Pool; + NewEntry.Type9 = D3DRTYPE_CUBETEXTURE; + ( *ppCubeTexture )->QueryInterface( IID_IDirect3DBaseTexture9, ( LPVOID* )&NewEntry.pTexture9 ); + + m_TextureCache.Add( NewEntry ); + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTResourceCache::CreateCubeTextureFromResource( LPDIRECT3DDEVICE9 pDevice, HMODULE hSrcModule, + LPCTSTR pSrcResource, + LPDIRECT3DCUBETEXTURE9* ppCubeTexture ) +{ + return CreateCubeTextureFromResourceEx( pDevice, hSrcModule, pSrcResource, D3DX_DEFAULT, D3DX_DEFAULT, + 0, D3DFMT_UNKNOWN, D3DPOOL_MANAGED, D3DX_DEFAULT, D3DX_DEFAULT, + 0, NULL, NULL, ppCubeTexture ); +} + + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTResourceCache::CreateCubeTextureFromResourceEx( LPDIRECT3DDEVICE9 pDevice, HMODULE hSrcModule, + LPCTSTR pSrcResource, UINT Size, UINT MipLevels, + DWORD Usage, D3DFORMAT Format, D3DPOOL Pool, DWORD Filter, + DWORD MipFilter, D3DCOLOR ColorKey, + D3DXIMAGE_INFO* pSrcInfo, PALETTEENTRY* pPalette, + LPDIRECT3DCUBETEXTURE9* ppCubeTexture ) +{ + // Search the cache for a matching entry. + for( int i = 0; i < m_TextureCache.GetSize(); ++i ) + { + DXUTCache_Texture& Entry = m_TextureCache[i]; + if( Entry.Location == DXUTCACHE_LOCATION_RESOURCE && + Entry.hSrcModule == hSrcModule && + !lstrcmpW( Entry.wszSource, pSrcResource ) && + Entry.Width == Size && + Entry.MipLevels == MipLevels && + Entry.Usage9 == Usage && + Entry.Format9 == Format && + Entry.Pool9 == Pool && + Entry.Type9 == D3DRTYPE_CUBETEXTURE ) + { + // A match is found. Obtain the IDirect3DCubeTexture9 interface and return that. + return Entry.pTexture9->QueryInterface( IID_IDirect3DCubeTexture9, ( LPVOID* )ppCubeTexture ); + } + } + + HRESULT hr; + + // No matching entry. Load the resource and create a new entry. + hr = D3DXCreateCubeTextureFromResourceEx( pDevice, hSrcModule, pSrcResource, Size, MipLevels, Usage, Format, + Pool, Filter, MipFilter, ColorKey, pSrcInfo, pPalette, ppCubeTexture ); + if( FAILED( hr ) ) + return hr; + + DXUTCache_Texture NewEntry; + NewEntry.Location = DXUTCACHE_LOCATION_RESOURCE; + NewEntry.hSrcModule = hSrcModule; + wcscpy_s( NewEntry.wszSource, MAX_PATH, pSrcResource ); + NewEntry.Width = Size; + NewEntry.MipLevels = MipLevels; + NewEntry.Usage9 = Usage; + NewEntry.Format9 = Format; + NewEntry.Pool9 = Pool; + NewEntry.Type9 = D3DRTYPE_CUBETEXTURE; + ( *ppCubeTexture )->QueryInterface( IID_IDirect3DBaseTexture9, ( LPVOID* )&NewEntry.pTexture9 ); + + m_TextureCache.Add( NewEntry ); + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTResourceCache::CreateVolumeTextureFromFile( LPDIRECT3DDEVICE9 pDevice, LPCTSTR pSrcFile, + LPDIRECT3DVOLUMETEXTURE9* ppVolumeTexture ) +{ + return CreateVolumeTextureFromFileEx( pDevice, pSrcFile, D3DX_DEFAULT, D3DX_DEFAULT, D3DX_DEFAULT, D3DX_DEFAULT, + 0, D3DFMT_UNKNOWN, D3DPOOL_MANAGED, D3DX_DEFAULT, D3DX_DEFAULT, + 0, NULL, NULL, ppVolumeTexture ); +} + + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTResourceCache::CreateVolumeTextureFromFileEx( LPDIRECT3DDEVICE9 pDevice, LPCTSTR pSrcFile, UINT Width, + UINT Height, UINT Depth, UINT MipLevels, DWORD Usage, + D3DFORMAT Format, D3DPOOL Pool, DWORD Filter, + DWORD MipFilter, D3DCOLOR ColorKey, + D3DXIMAGE_INFO* pSrcInfo, PALETTEENTRY* pPalette, + LPDIRECT3DVOLUMETEXTURE9* ppTexture ) +{ + // Search the cache for a matching entry. + for( int i = 0; i < m_TextureCache.GetSize(); ++i ) + { + DXUTCache_Texture& Entry = m_TextureCache[i]; + if( Entry.Location == DXUTCACHE_LOCATION_FILE && + !lstrcmpW( Entry.wszSource, pSrcFile ) && + Entry.Width == Width && + Entry.Height == Height && + Entry.Depth == Depth && + Entry.MipLevels == MipLevels && + Entry.Usage9 == Usage && + Entry.Format9 == Format && + Entry.Pool9 == Pool && + Entry.Type9 == D3DRTYPE_VOLUMETEXTURE ) + { + // A match is found. Obtain the IDirect3DVolumeTexture9 interface and return that. + return Entry.pTexture9->QueryInterface( IID_IDirect3DVolumeTexture9, ( LPVOID* )ppTexture ); + } + } + + HRESULT hr; + + // No matching entry. Load the resource and create a new entry. + hr = D3DXCreateVolumeTextureFromFileEx( pDevice, pSrcFile, Width, Height, Depth, MipLevels, Usage, Format, + Pool, Filter, MipFilter, ColorKey, pSrcInfo, pPalette, ppTexture ); + if( FAILED( hr ) ) + return hr; + + DXUTCache_Texture NewEntry; + NewEntry.Location = DXUTCACHE_LOCATION_FILE; + wcscpy_s( NewEntry.wszSource, MAX_PATH, pSrcFile ); + NewEntry.Width = Width; + NewEntry.Height = Height; + NewEntry.Depth = Depth; + NewEntry.MipLevels = MipLevels; + NewEntry.Usage9 = Usage; + NewEntry.Format9 = Format; + NewEntry.Pool9 = Pool; + NewEntry.Type9 = D3DRTYPE_VOLUMETEXTURE; + ( *ppTexture )->QueryInterface( IID_IDirect3DBaseTexture9, ( LPVOID* )&NewEntry.pTexture9 ); + + m_TextureCache.Add( NewEntry ); + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTResourceCache::CreateVolumeTextureFromResource( LPDIRECT3DDEVICE9 pDevice, HMODULE hSrcModule, + LPCTSTR pSrcResource, + LPDIRECT3DVOLUMETEXTURE9* ppVolumeTexture ) +{ + return CreateVolumeTextureFromResourceEx( pDevice, hSrcModule, pSrcResource, D3DX_DEFAULT, D3DX_DEFAULT, + D3DX_DEFAULT, D3DX_DEFAULT, 0, D3DFMT_UNKNOWN, D3DPOOL_MANAGED, + D3DX_DEFAULT, D3DX_DEFAULT, 0, NULL, NULL, ppVolumeTexture ); +} + + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTResourceCache::CreateVolumeTextureFromResourceEx( LPDIRECT3DDEVICE9 pDevice, HMODULE hSrcModule, + LPCTSTR pSrcResource, UINT Width, UINT Height, + UINT Depth, UINT MipLevels, DWORD Usage, + D3DFORMAT Format, D3DPOOL Pool, DWORD Filter, + DWORD MipFilter, D3DCOLOR ColorKey, + D3DXIMAGE_INFO* pSrcInfo, PALETTEENTRY* pPalette, + LPDIRECT3DVOLUMETEXTURE9* ppVolumeTexture ) +{ + // Search the cache for a matching entry. + for( int i = 0; i < m_TextureCache.GetSize(); ++i ) + { + DXUTCache_Texture& Entry = m_TextureCache[i]; + if( Entry.Location == DXUTCACHE_LOCATION_RESOURCE && + Entry.hSrcModule == hSrcModule && + !lstrcmpW( Entry.wszSource, pSrcResource ) && + Entry.Width == Width && + Entry.Height == Height && + Entry.Depth == Depth && + Entry.MipLevels == MipLevels && + Entry.Usage9 == Usage && + Entry.Format9 == Format && + Entry.Pool9 == Pool && + Entry.Type9 == D3DRTYPE_VOLUMETEXTURE ) + { + // A match is found. Obtain the IDirect3DVolumeTexture9 interface and return that. + return Entry.pTexture9->QueryInterface( IID_IDirect3DVolumeTexture9, ( LPVOID* )ppVolumeTexture ); + } + } + + HRESULT hr; + + // No matching entry. Load the resource and create a new entry. + hr = D3DXCreateVolumeTextureFromResourceEx( pDevice, hSrcModule, pSrcResource, Width, Height, Depth, MipLevels, + Usage, + Format, Pool, Filter, MipFilter, ColorKey, pSrcInfo, pPalette, + ppVolumeTexture ); + if( FAILED( hr ) ) + return hr; + + DXUTCache_Texture NewEntry; + NewEntry.Location = DXUTCACHE_LOCATION_RESOURCE; + NewEntry.hSrcModule = hSrcModule; + wcscpy_s( NewEntry.wszSource, MAX_PATH, pSrcResource ); + NewEntry.Width = Width; + NewEntry.Height = Height; + NewEntry.Depth = Depth; + NewEntry.MipLevels = MipLevels; + NewEntry.Usage9 = Usage; + NewEntry.Format9 = Format; + NewEntry.Pool9 = Pool; + NewEntry.Type9 = D3DRTYPE_VOLUMETEXTURE; + ( *ppVolumeTexture )->QueryInterface( IID_IDirect3DBaseTexture9, ( LPVOID* )&NewEntry.pTexture9 ); + + m_TextureCache.Add( NewEntry ); + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTResourceCache::CreateFont( LPDIRECT3DDEVICE9 pDevice, UINT Height, UINT Width, UINT Weight, + UINT MipLevels, BOOL Italic, DWORD CharSet, DWORD OutputPrecision, + DWORD Quality, DWORD PitchAndFamily, LPCTSTR pFacename, LPD3DXFONT* ppFont ) +{ + D3DXFONT_DESCW Desc; + + Desc.Height = Height; + Desc.Width = Width; + Desc.Weight = Weight; + Desc.MipLevels = MipLevels; + Desc.Italic = Italic; + Desc.CharSet = ( BYTE )CharSet; + Desc.OutputPrecision = ( BYTE )OutputPrecision; + Desc.Quality = ( BYTE )Quality; + Desc.PitchAndFamily = ( BYTE )PitchAndFamily; + wcscpy_s( Desc.FaceName, LF_FACESIZE, pFacename ); + + return CreateFontIndirect( pDevice, &Desc, ppFont ); +} + + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTResourceCache::CreateFontIndirect( LPDIRECT3DDEVICE9 pDevice, CONST D3DXFONT_DESC *pDesc, LPD3DXFONT *ppFont ) + { + // Search the cache for a matching entry. + for( int i = 0; i < m_FontCache.GetSize(); ++i ) + { + DXUTCache_Font &Entry = m_FontCache[i]; + + if( Entry.Width == pDesc->Width && + Entry.Height == pDesc->Height && + Entry.Weight == pDesc->Weight && + Entry.MipLevels == pDesc->MipLevels && + Entry.Italic == pDesc->Italic && + Entry.CharSet == pDesc->CharSet && + Entry.OutputPrecision == pDesc->OutputPrecision && + Entry.Quality == pDesc->Quality && + Entry.PitchAndFamily == pDesc->PitchAndFamily && + CompareString( LOCALE_USER_DEFAULT, NORM_IGNORECASE, + Entry.FaceName, -1, + pDesc->FaceName, -1 ) == CSTR_EQUAL ) + { + // A match is found. Increment the reference and return the ID3DXFont object. + Entry.pFont->AddRef(); + *ppFont = Entry.pFont; + return S_OK; + } + } + + HRESULT hr; + + // No matching entry. Load the resource and create a new entry. + hr = D3DXCreateFontIndirect( pDevice, pDesc, ppFont ); + if( FAILED( hr ) ) + return hr; + + DXUTCache_Font NewEntry; + ( D3DXFONT_DESC & )NewEntry = *pDesc; + NewEntry.pFont = *ppFont; + NewEntry.pFont->AddRef(); + + m_FontCache.Add( NewEntry ); + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTResourceCache::CreateEffectFromFile( LPDIRECT3DDEVICE9 pDevice, LPCTSTR pSrcFile, + const D3DXMACRO* pDefines, LPD3DXINCLUDE pInclude, DWORD Flags, + LPD3DXEFFECTPOOL pPool, LPD3DXEFFECT* ppEffect, + LPD3DXBUFFER* ppCompilationErrors ) +{ + // Search the cache for a matching entry. + for( int i = 0; i < m_EffectCache.GetSize(); ++i ) + { + DXUTCache_Effect& Entry = m_EffectCache[i]; + + if( Entry.Location == DXUTCACHE_LOCATION_FILE && + !lstrcmpW( Entry.wszSource, pSrcFile ) && + Entry.dwFlags == Flags ) + { + // A match is found. Increment the ref coutn and return the ID3DXEffect object. + *ppEffect = Entry.pEffect; + ( *ppEffect )->AddRef(); + return S_OK; + } + } + + HRESULT hr; + + // No matching entry. Load the resource and create a new entry. + hr = D3DXCreateEffectFromFile( pDevice, pSrcFile, pDefines, pInclude, Flags, pPool, ppEffect, + ppCompilationErrors ); + if( FAILED( hr ) ) + return hr; + + DXUTCache_Effect NewEntry; + NewEntry.Location = DXUTCACHE_LOCATION_FILE; + wcscpy_s( NewEntry.wszSource, MAX_PATH, pSrcFile ); + NewEntry.dwFlags = Flags; + NewEntry.pEffect = *ppEffect; + NewEntry.pEffect->AddRef(); + + m_EffectCache.Add( NewEntry ); + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTResourceCache::CreateEffectFromResource( LPDIRECT3DDEVICE9 pDevice, HMODULE hSrcModule, + LPCTSTR pSrcResource, const D3DXMACRO* pDefines, + LPD3DXINCLUDE pInclude, DWORD Flags, LPD3DXEFFECTPOOL pPool, + LPD3DXEFFECT* ppEffect, LPD3DXBUFFER* ppCompilationErrors ) +{ + // Search the cache for a matching entry. + for( int i = 0; i < m_EffectCache.GetSize(); ++i ) + { + DXUTCache_Effect& Entry = m_EffectCache[i]; + + if( Entry.Location == DXUTCACHE_LOCATION_RESOURCE && + Entry.hSrcModule == hSrcModule && + !lstrcmpW( Entry.wszSource, pSrcResource ) && + Entry.dwFlags == Flags ) + { + // A match is found. Increment the ref coutn and return the ID3DXEffect object. + *ppEffect = Entry.pEffect; + ( *ppEffect )->AddRef(); + return S_OK; + } + } + + HRESULT hr; + + // No matching entry. Load the resource and create a new entry. + hr = D3DXCreateEffectFromResource( pDevice, hSrcModule, pSrcResource, pDefines, pInclude, Flags, + pPool, ppEffect, ppCompilationErrors ); + if( FAILED( hr ) ) + return hr; + + DXUTCache_Effect NewEntry; + NewEntry.Location = DXUTCACHE_LOCATION_RESOURCE; + NewEntry.hSrcModule = hSrcModule; + wcscpy_s( NewEntry.wszSource, MAX_PATH, pSrcResource ); + NewEntry.dwFlags = Flags; + NewEntry.pEffect = *ppEffect; + NewEntry.pEffect->AddRef(); + + m_EffectCache.Add( NewEntry ); + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +// Device event callbacks +//-------------------------------------------------------------------------------------- + + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTResourceCache::OnCreateDevice( IDirect3DDevice9* pd3dDevice ) +{ + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTResourceCache::OnResetDevice( IDirect3DDevice9* pd3dDevice ) +{ + // Call OnResetDevice on all effect and font objects + for( int i = 0; i < m_EffectCache.GetSize(); ++i ) + m_EffectCache[i].pEffect->OnResetDevice(); + for( int i = 0; i < m_FontCache.GetSize(); ++i ) + m_FontCache[i].pFont->OnResetDevice(); + + + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTResourceCache::OnLostDevice() +{ + // Call OnLostDevice on all effect and font objects + for( int i = 0; i < m_EffectCache.GetSize(); ++i ) + m_EffectCache[i].pEffect->OnLostDevice(); + for( int i = 0; i < m_FontCache.GetSize(); ++i ) + m_FontCache[i].pFont->OnLostDevice(); + + // Release all the default pool textures + for( int i = m_TextureCache.GetSize() - 1; i >= 0; --i ) + if( m_TextureCache[i].Pool9 == D3DPOOL_DEFAULT ) + { + SAFE_RELEASE( m_TextureCache[i].pTexture9 ); + m_TextureCache.Remove( i ); // Remove the entry + } + + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTResourceCache::OnDestroyDevice() +{ + // Release all resources + for( int i = m_EffectCache.GetSize() - 1; i >= 0; --i ) + { + SAFE_RELEASE( m_EffectCache[i].pEffect ); + m_EffectCache.Remove( i ); + } + for( int i = m_FontCache.GetSize() - 1; i >= 0; --i ) + { + SAFE_RELEASE( m_FontCache[i].pFont ); + m_FontCache.Remove( i ); + } + for( int i = m_TextureCache.GetSize() - 1; i >= 0; --i ) + { + SAFE_RELEASE( m_TextureCache[i].pTexture9 ); + SAFE_RELEASE( m_TextureCache[i].pSRV11 ); + m_TextureCache.Remove( i ); + } + + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +// Desc: Returns a view matrix for rendering to a face of a cubemap. +//-------------------------------------------------------------------------------------- +D3DXMATRIX WINAPI DXUTGetCubeMapViewMatrix( DWORD dwFace ) +{ + D3DXVECTOR3 vEyePt = D3DXVECTOR3( 0.0f, 0.0f, 0.0f ); + D3DXVECTOR3 vLookDir; + D3DXVECTOR3 vUpDir; + + switch( dwFace ) + { + case D3DCUBEMAP_FACE_POSITIVE_X: + vLookDir = D3DXVECTOR3( 1.0f, 0.0f, 0.0f ); + vUpDir = D3DXVECTOR3( 0.0f, 1.0f, 0.0f ); + break; + case D3DCUBEMAP_FACE_NEGATIVE_X: + vLookDir = D3DXVECTOR3( -1.0f, 0.0f, 0.0f ); + vUpDir = D3DXVECTOR3( 0.0f, 1.0f, 0.0f ); + break; + case D3DCUBEMAP_FACE_POSITIVE_Y: + vLookDir = D3DXVECTOR3( 0.0f, 1.0f, 0.0f ); + vUpDir = D3DXVECTOR3( 0.0f, 0.0f, -1.0f ); + break; + case D3DCUBEMAP_FACE_NEGATIVE_Y: + vLookDir = D3DXVECTOR3( 0.0f, -1.0f, 0.0f ); + vUpDir = D3DXVECTOR3( 0.0f, 0.0f, 1.0f ); + break; + case D3DCUBEMAP_FACE_POSITIVE_Z: + vLookDir = D3DXVECTOR3( 0.0f, 0.0f, 1.0f ); + vUpDir = D3DXVECTOR3( 0.0f, 1.0f, 0.0f ); + break; + case D3DCUBEMAP_FACE_NEGATIVE_Z: + vLookDir = D3DXVECTOR3( 0.0f, 0.0f, -1.0f ); + vUpDir = D3DXVECTOR3( 0.0f, 1.0f, 0.0f ); + break; + } + + // Set the view transform for this cubemap surface + D3DXMATRIXA16 mView; + D3DXMatrixLookAtLH( &mView, &vEyePt, &vLookDir, &vUpDir ); + return mView; +} + + +//-------------------------------------------------------------------------------------- +CDXUTLineManager::CDXUTLineManager() +{ + m_pd3dDevice = NULL; + m_pD3DXLine = NULL; +} + + +//-------------------------------------------------------------------------------------- +CDXUTLineManager::~CDXUTLineManager() +{ + OnDeletedDevice(); +} + + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTLineManager::OnCreatedDevice( IDirect3DDevice9* pd3dDevice ) +{ + m_pd3dDevice = pd3dDevice; + + HRESULT hr; + hr = D3DXCreateLine( m_pd3dDevice, &m_pD3DXLine ); + if( FAILED( hr ) ) + return hr; + + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTLineManager::OnResetDevice() +{ + if( m_pD3DXLine ) + m_pD3DXLine->OnResetDevice(); + + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTLineManager::OnRender() +{ + HRESULT hr; + if( NULL == m_pD3DXLine ) + return E_INVALIDARG; + + bool bDrawingHasBegun = false; + float fLastWidth = 0.0f; + bool bLastAntiAlias = false; + + for( int i = 0; i < m_LinesList.GetSize(); i++ ) + { + LINE_NODE* pLineNode = m_LinesList.GetAt( i ); + if( pLineNode ) + { + if( !bDrawingHasBegun || + fLastWidth != pLineNode->fWidth || + bLastAntiAlias != pLineNode->bAntiAlias ) + { + if( bDrawingHasBegun ) + { + hr = m_pD3DXLine->End(); + if( FAILED( hr ) ) + return hr; + } + + m_pD3DXLine->SetWidth( pLineNode->fWidth ); + m_pD3DXLine->SetAntialias( pLineNode->bAntiAlias ); + + fLastWidth = pLineNode->fWidth; + bLastAntiAlias = pLineNode->bAntiAlias; + + hr = m_pD3DXLine->Begin(); + if( FAILED( hr ) ) + return hr; + bDrawingHasBegun = true; + } + + hr = m_pD3DXLine->Draw( pLineNode->pVertexList, pLineNode->dwVertexListCount, pLineNode->Color ); + if( FAILED( hr ) ) + return hr; + } + } + + if( bDrawingHasBegun ) + { + hr = m_pD3DXLine->End(); + if( FAILED( hr ) ) + return hr; + } + + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTLineManager::OnLostDevice() +{ + if( m_pD3DXLine ) + m_pD3DXLine->OnLostDevice(); + + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTLineManager::OnDeletedDevice() +{ + RemoveAllLines(); + SAFE_RELEASE( m_pD3DXLine ); + + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTLineManager::AddLine( int* pnLineID, D3DXVECTOR2* pVertexList, DWORD dwVertexListCount, D3DCOLOR Color, + float fWidth, float fScaleRatio, bool bAntiAlias ) +{ + if( pVertexList == NULL || dwVertexListCount == 0 ) + return E_INVALIDARG; + + LINE_NODE* pLineNode = new LINE_NODE; + if( pLineNode == NULL ) + return E_OUTOFMEMORY; + ZeroMemory( pLineNode, sizeof( LINE_NODE ) ); + + pLineNode->nLineID = m_LinesList.GetSize(); + pLineNode->Color = Color; + pLineNode->fWidth = fWidth; + pLineNode->bAntiAlias = bAntiAlias; + pLineNode->dwVertexListCount = dwVertexListCount; + + if( pnLineID ) + *pnLineID = pLineNode->nLineID; + + pLineNode->pVertexList = new D3DXVECTOR2[dwVertexListCount]; + if( pLineNode->pVertexList == NULL ) + { + delete pLineNode; + return E_OUTOFMEMORY; + } + for( DWORD i = 0; i < dwVertexListCount; i++ ) + { + pLineNode->pVertexList[i] = pVertexList[i] * fScaleRatio; + } + + m_LinesList.Add( pLineNode ); + + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTLineManager::AddRect( int* pnLineID, RECT rc, D3DCOLOR Color, float fWidth, float fScaleRatio, + bool bAntiAlias ) +{ + if( fWidth > 2.0f ) + { + D3DXVECTOR2 vertexList[8]; + + vertexList[0].x = ( float )rc.left; + vertexList[0].y = ( float )rc.top - ( fWidth / 2.0f ); + + vertexList[1].x = ( float )rc.left; + vertexList[1].y = ( float )rc.bottom + ( fWidth / 2.0f ); + + vertexList[2].x = ( float )rc.left; + vertexList[2].y = ( float )rc.bottom - 0.5f; + + vertexList[3].x = ( float )rc.right; + vertexList[3].y = ( float )rc.bottom - 0.5f; + + vertexList[4].x = ( float )rc.right; + vertexList[4].y = ( float )rc.bottom + ( fWidth / 2.0f ); + + vertexList[5].x = ( float )rc.right; + vertexList[5].y = ( float )rc.top - ( fWidth / 2.0f ); + + vertexList[6].x = ( float )rc.right; + vertexList[6].y = ( float )rc.top; + + vertexList[7].x = ( float )rc.left; + vertexList[7].y = ( float )rc.top; + + return AddLine( pnLineID, vertexList, 8, Color, fWidth, fScaleRatio, bAntiAlias ); + } + else + { + D3DXVECTOR2 vertexList[5]; + vertexList[0].x = ( float )rc.left; + vertexList[0].y = ( float )rc.top; + + vertexList[1].x = ( float )rc.left; + vertexList[1].y = ( float )rc.bottom; + + vertexList[2].x = ( float )rc.right; + vertexList[2].y = ( float )rc.bottom; + + vertexList[3].x = ( float )rc.right; + vertexList[3].y = ( float )rc.top; + + vertexList[4].x = ( float )rc.left; + vertexList[4].y = ( float )rc.top; + + return AddLine( pnLineID, vertexList, 5, Color, fWidth, fScaleRatio, bAntiAlias ); + } +} + + + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTLineManager::RemoveLine( int nLineID ) +{ + for( int i = 0; i < m_LinesList.GetSize(); i++ ) + { + LINE_NODE* pLineNode = m_LinesList.GetAt( i ); + if( pLineNode && pLineNode->nLineID == nLineID ) + { + SAFE_DELETE_ARRAY( pLineNode->pVertexList ); + delete pLineNode; + m_LinesList.SetAt( i, NULL ); + } + } + + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTLineManager::RemoveAllLines() +{ + for( int i = 0; i < m_LinesList.GetSize(); i++ ) + { + LINE_NODE* pLineNode = m_LinesList.GetAt( i ); + if( pLineNode ) + { + SAFE_DELETE_ARRAY( pLineNode->pVertexList ); + delete pLineNode; + } + } + m_LinesList.RemoveAll(); + + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +CDXUTTextHelper::CDXUTTextHelper( ID3DXFont* pFont9, ID3DXSprite* pSprite9, int nLineHeight ) +{ + Init( pFont9, pSprite9, nLineHeight ); +} + +CDXUTTextHelper::CDXUTTextHelper( ID3D11Device* pd3d11Device, ID3D11DeviceContext* pd3d11DeviceContext, CDXUTDialogResourceManager* pManager, int nLineHeight ) +{ + Init( NULL, NULL, nLineHeight ); + m_pd3d11Device = pd3d11Device; + m_pd3d11DeviceContext = pd3d11DeviceContext; + m_pManager = pManager; +} +CDXUTTextHelper::~CDXUTTextHelper() +{ + +} + +//-------------------------------------------------------------------------------------- +void CDXUTTextHelper::Init( ID3DXFont* pFont9, ID3DXSprite* pSprite9, + int nLineHeight ) +{ + m_pFont9 = pFont9; + m_pSprite9 = pSprite9; + m_clr = D3DXCOLOR( 1, 1, 1, 1 ); + m_pt.x = 0; + m_pt.y = 0; + m_nLineHeight = nLineHeight; + m_pd3d11Device = NULL; + m_pd3d11DeviceContext = NULL; + m_pManager = NULL; + + // Create a blend state if a sprite is passed in +} + + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTTextHelper::DrawFormattedTextLine( const WCHAR* strMsg, ... ) +{ + WCHAR strBuffer[512]; + + va_list args; + va_start( args, strMsg ); + vswprintf_s( strBuffer, 512, strMsg, args ); + strBuffer[511] = L'\0'; + va_end( args ); + + return DrawTextLine( strBuffer ); +} + + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTTextHelper::DrawTextLine( const WCHAR* strMsg ) +{ + if( NULL == m_pFont9 && NULL == m_pd3d11DeviceContext ) + return DXUT_ERR_MSGBOX( L"DrawTextLine", E_INVALIDARG ); + + HRESULT hr = S_OK; + RECT rc; + SetRect( &rc, m_pt.x, m_pt.y, 0, 0 ); + if( m_pFont9 ) + hr = m_pFont9->DrawText( m_pSprite9, strMsg, -1, &rc, DT_NOCLIP, m_clr ); + else if( m_pd3d11DeviceContext ) + DrawText11DXUT( m_pd3d11Device, m_pd3d11DeviceContext, strMsg, rc, m_clr, + (float)m_pManager->m_nBackBufferWidth, (float)m_pManager->m_nBackBufferHeight, false ); + + if( FAILED( hr ) ) + return DXTRACE_ERR_MSGBOX( L"DrawText", hr ); + + m_pt.y += m_nLineHeight; + + return S_OK; +} + + +HRESULT CDXUTTextHelper::DrawFormattedTextLine( RECT& rc, DWORD dwFlags, const WCHAR* strMsg, ... ) +{ + WCHAR strBuffer[512]; + + va_list args; + va_start( args, strMsg ); + vswprintf_s( strBuffer, 512, strMsg, args ); + strBuffer[511] = L'\0'; + va_end( args ); + + return DrawTextLine( rc, dwFlags, strBuffer ); +} + + +HRESULT CDXUTTextHelper::DrawTextLine( RECT& rc, DWORD dwFlags, const WCHAR* strMsg ) +{ + if( NULL == m_pFont9 && NULL == m_pd3d11DeviceContext ) + return DXUT_ERR_MSGBOX( L"DrawTextLine", E_INVALIDARG ); + + HRESULT hr = S_OK; + if( m_pFont9 ) + hr = m_pFont9->DrawText( m_pSprite9, strMsg, -1, &rc, dwFlags, m_clr ); + else if( m_pd3d11DeviceContext ) + DrawText11DXUT( m_pd3d11Device, m_pd3d11DeviceContext, strMsg, rc, m_clr, + (float)m_pManager->m_nBackBufferWidth, (float)m_pManager->m_nBackBufferHeight, false ); + + if( FAILED( hr ) ) + return DXTRACE_ERR_MSGBOX( L"DrawText", hr ); + + m_pt.y += m_nLineHeight; + + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +void CDXUTTextHelper::Begin() +{ + if( m_pSprite9 ) + m_pSprite9->Begin( D3DXSPRITE_ALPHABLEND | D3DXSPRITE_SORT_TEXTURE ); + + if( m_pd3d11DeviceContext ) + { + m_pManager->StoreD3D11State( m_pd3d11DeviceContext ); + m_pManager->ApplyRenderUI11( m_pd3d11DeviceContext ); + } + + +} +void CDXUTTextHelper::End() +{ + if( m_pSprite9 ) + m_pSprite9->End(); + + if( m_pd3d11DeviceContext ) + { + m_pManager->RestoreD3D11State( m_pd3d11DeviceContext ); + } +} diff --git a/Demos/DX11ClothDemo/DXUT/Optional/SDKmisc.h b/Demos/DX11ClothDemo/DXUT/Optional/SDKmisc.h new file mode 100644 index 000000000..ac9178259 --- /dev/null +++ b/Demos/DX11ClothDemo/DXUT/Optional/SDKmisc.h @@ -0,0 +1,368 @@ +//-------------------------------------------------------------------------------------- +// File: SDKMisc.h +// +// Various helper functionality that is shared between SDK samples +// +// Copyright (c) Microsoft Corporation. All rights reserved +//-------------------------------------------------------------------------------------- +#pragma once +#ifndef SDKMISC_H +#define SDKMISC_H + + +//----------------------------------------------------------------------------- +// Resource cache for textures, fonts, meshs, and effects. +// Use DXUTGetGlobalResourceCache() to access the global cache +//----------------------------------------------------------------------------- + +enum DXUTCACHE_SOURCELOCATION +{ + DXUTCACHE_LOCATION_FILE, + DXUTCACHE_LOCATION_RESOURCE +}; + +struct DXUTCache_Texture +{ + DXUTCACHE_SOURCELOCATION Location; + WCHAR wszSource[MAX_PATH]; + HMODULE hSrcModule; + UINT Width; + UINT Height; + UINT Depth; + UINT MipLevels; + UINT MiscFlags; + union + { + DWORD Usage9; + D3D11_USAGE Usage11; + }; + union + { + D3DFORMAT Format9; + DXGI_FORMAT Format; + }; + union + { + D3DPOOL Pool9; + UINT CpuAccessFlags; + }; + union + { + D3DRESOURCETYPE Type9; + UINT BindFlags; + }; + IDirect3DBaseTexture9* pTexture9; + ID3D11ShaderResourceView* pSRV11; + + DXUTCache_Texture() + { + pTexture9 = NULL; + pSRV11 = NULL; + } +}; + +struct DXUTCache_Font : public D3DXFONT_DESC +{ + ID3DXFont* pFont; +}; + +struct DXUTCache_Effect +{ + DXUTCACHE_SOURCELOCATION Location; + WCHAR wszSource[MAX_PATH]; + HMODULE hSrcModule; + DWORD dwFlags; + ID3DXEffect* pEffect; +}; + + +class CDXUTResourceCache +{ +public: + ~CDXUTResourceCache(); + + HRESULT CreateTextureFromFile( LPDIRECT3DDEVICE9 pDevice, LPCTSTR pSrcFile, + LPDIRECT3DTEXTURE9* ppTexture ); + HRESULT CreateTextureFromFile( LPDIRECT3DDEVICE9 pDevice, LPCSTR pSrcFile, + LPDIRECT3DTEXTURE9* ppTexture ); + HRESULT CreateTextureFromFile( ID3D11Device* pDevice, ID3D11DeviceContext *pContext, LPCTSTR pSrcFile, + ID3D11ShaderResourceView** ppOutputRV, bool bSRGB=false ); + HRESULT CreateTextureFromFile( ID3D11Device* pDevice, ID3D11DeviceContext *pContext, LPCSTR pSrcFile, + ID3D11ShaderResourceView** ppOutputRV, bool bSRGB=false ); + HRESULT CreateTextureFromFileEx( LPDIRECT3DDEVICE9 pDevice, LPCTSTR pSrcFile, UINT Width, + UINT Height, UINT MipLevels, DWORD Usage, D3DFORMAT Format, + D3DPOOL Pool, DWORD Filter, DWORD MipFilter, D3DCOLOR ColorKey, + D3DXIMAGE_INFO* pSrcInfo, PALETTEENTRY* pPalette, + LPDIRECT3DTEXTURE9* ppTexture ); + HRESULT CreateTextureFromFileEx( ID3D11Device* pDevice, ID3D11DeviceContext* pContext, LPCTSTR pSrcFile, + D3DX11_IMAGE_LOAD_INFO* pLoadInfo, ID3DX11ThreadPump* pPump, + ID3D11ShaderResourceView** ppOutputRV, bool bSRGB ); + HRESULT CreateTextureFromResource( LPDIRECT3DDEVICE9 pDevice, HMODULE hSrcModule, + LPCTSTR pSrcResource, LPDIRECT3DTEXTURE9* ppTexture ); + HRESULT CreateTextureFromResourceEx( LPDIRECT3DDEVICE9 pDevice, HMODULE hSrcModule, + LPCTSTR pSrcResource, UINT Width, UINT Height, UINT MipLevels, + DWORD Usage, D3DFORMAT Format, D3DPOOL Pool, DWORD Filter, + DWORD MipFilter, D3DCOLOR ColorKey, D3DXIMAGE_INFO* pSrcInfo, + PALETTEENTRY* pPalette, LPDIRECT3DTEXTURE9* ppTexture ); + HRESULT CreateCubeTextureFromFile( LPDIRECT3DDEVICE9 pDevice, LPCTSTR pSrcFile, + LPDIRECT3DCUBETEXTURE9* ppCubeTexture ); + HRESULT CreateCubeTextureFromFileEx( LPDIRECT3DDEVICE9 pDevice, LPCTSTR pSrcFile, UINT Size, + UINT MipLevels, DWORD Usage, D3DFORMAT Format, D3DPOOL Pool, + DWORD Filter, DWORD MipFilter, D3DCOLOR ColorKey, + D3DXIMAGE_INFO* pSrcInfo, PALETTEENTRY* pPalette, + LPDIRECT3DCUBETEXTURE9* ppCubeTexture ); + HRESULT CreateCubeTextureFromResource( LPDIRECT3DDEVICE9 pDevice, HMODULE hSrcModule, + LPCTSTR pSrcResource, + LPDIRECT3DCUBETEXTURE9* ppCubeTexture ); + HRESULT CreateCubeTextureFromResourceEx( LPDIRECT3DDEVICE9 pDevice, HMODULE hSrcModule, + LPCTSTR pSrcResource, UINT Size, UINT MipLevels, + DWORD Usage, D3DFORMAT Format, D3DPOOL Pool, DWORD Filter, + DWORD MipFilter, D3DCOLOR ColorKey, + D3DXIMAGE_INFO* pSrcInfo, PALETTEENTRY* pPalette, + LPDIRECT3DCUBETEXTURE9* ppCubeTexture ); + HRESULT CreateVolumeTextureFromFile( LPDIRECT3DDEVICE9 pDevice, LPCTSTR pSrcFile, + LPDIRECT3DVOLUMETEXTURE9* ppVolumeTexture ); + HRESULT CreateVolumeTextureFromFileEx( LPDIRECT3DDEVICE9 pDevice, LPCTSTR pSrcFile, UINT Width, + UINT Height, UINT Depth, UINT MipLevels, DWORD Usage, + D3DFORMAT Format, D3DPOOL Pool, DWORD Filter, + DWORD MipFilter, D3DCOLOR ColorKey, + D3DXIMAGE_INFO* pSrcInfo, PALETTEENTRY* pPalette, + LPDIRECT3DVOLUMETEXTURE9* ppTexture ); + HRESULT CreateVolumeTextureFromResource( LPDIRECT3DDEVICE9 pDevice, HMODULE hSrcModule, + LPCTSTR pSrcResource, + LPDIRECT3DVOLUMETEXTURE9* ppVolumeTexture ); + HRESULT CreateVolumeTextureFromResourceEx( LPDIRECT3DDEVICE9 pDevice, HMODULE hSrcModule, + LPCTSTR pSrcResource, UINT Width, UINT Height, + UINT Depth, UINT MipLevels, DWORD Usage, + D3DFORMAT Format, D3DPOOL Pool, DWORD Filter, + DWORD MipFilter, D3DCOLOR ColorKey, + D3DXIMAGE_INFO* pSrcInfo, PALETTEENTRY* pPalette, + LPDIRECT3DVOLUMETEXTURE9* ppVolumeTexture ); + HRESULT CreateFont( LPDIRECT3DDEVICE9 pDevice, UINT Height, UINT Width, UINT Weight, + UINT MipLevels, BOOL Italic, DWORD CharSet, DWORD OutputPrecision, + DWORD Quality, DWORD PitchAndFamily, LPCTSTR pFacename, LPD3DXFONT* ppFont ); + HRESULT CreateFontIndirect( LPDIRECT3DDEVICE9 pDevice, CONST D3DXFONT_DESC *pDesc, LPD3DXFONT *ppFont ); + HRESULT CreateEffectFromFile( LPDIRECT3DDEVICE9 pDevice, LPCTSTR pSrcFile, + const D3DXMACRO* pDefines, LPD3DXINCLUDE pInclude, DWORD Flags, + LPD3DXEFFECTPOOL pPool, LPD3DXEFFECT* ppEffect, + LPD3DXBUFFER* ppCompilationErrors ); + HRESULT CreateEffectFromResource( LPDIRECT3DDEVICE9 pDevice, HMODULE hSrcModule, + LPCTSTR pSrcResource, const D3DXMACRO* pDefines, + LPD3DXINCLUDE pInclude, DWORD Flags, LPD3DXEFFECTPOOL pPool, + LPD3DXEFFECT* ppEffect, LPD3DXBUFFER* ppCompilationErrors ); + +public: + HRESULT OnCreateDevice( IDirect3DDevice9* pd3dDevice ); + HRESULT OnResetDevice( IDirect3DDevice9* pd3dDevice ); + HRESULT OnLostDevice(); + HRESULT OnDestroyDevice(); + +protected: + friend CDXUTResourceCache& WINAPI DXUTGetGlobalResourceCache(); + friend HRESULT WINAPI DXUTInitialize3DEnvironment(); + friend HRESULT WINAPI DXUTReset3DEnvironment(); + friend void WINAPI DXUTCleanup3DEnvironment( bool bReleaseSettings ); + + CDXUTResourceCache() + { + } + + CGrowableArray m_TextureCache; + CGrowableArray m_EffectCache; + CGrowableArray m_FontCache; +}; + +CDXUTResourceCache& WINAPI DXUTGetGlobalResourceCache(); + + +//-------------------------------------------------------------------------------------- +// Manages the insertion point when drawing text +//-------------------------------------------------------------------------------------- +class CDXUTDialogResourceManager; +class CDXUTTextHelper +{ +public: + CDXUTTextHelper( ID3DXFont* pFont9 = NULL, ID3DXSprite* pSprite9 = NULL, + int nLineHeight = 15 ); + CDXUTTextHelper( ID3D11Device* pd3d11Device, ID3D11DeviceContext* pd3dDeviceContext, CDXUTDialogResourceManager* pManager, int nLineHeight ); + ~CDXUTTextHelper(); + + void Init( ID3DXFont* pFont9 = NULL, ID3DXSprite* pSprite9 = NULL, + int nLineHeight = 15 ); + + void SetInsertionPos( int x, int y ) + { + m_pt.x = x; m_pt.y = y; + } + void SetForegroundColor( D3DXCOLOR clr ) + { + m_clr = clr; + } + + void Begin(); + HRESULT DrawFormattedTextLine( const WCHAR* strMsg, ... ); + HRESULT DrawTextLine( const WCHAR* strMsg ); + HRESULT DrawFormattedTextLine( RECT& rc, DWORD dwFlags, const WCHAR* strMsg, ... ); + HRESULT DrawTextLine( RECT& rc, DWORD dwFlags, const WCHAR* strMsg ); + void End(); + +protected: + ID3DXFont* m_pFont9; + ID3DXSprite* m_pSprite9; + D3DXCOLOR m_clr; + POINT m_pt; + int m_nLineHeight; + + // D3D11 font + ID3D11Device* m_pd3d11Device; + ID3D11DeviceContext* m_pd3d11DeviceContext; + CDXUTDialogResourceManager* m_pManager; +}; + + +//-------------------------------------------------------------------------------------- +// Manages a persistent list of lines and draws them using ID3DXLine +//-------------------------------------------------------------------------------------- +class CDXUTLineManager +{ +public: + CDXUTLineManager(); + ~CDXUTLineManager(); + + HRESULT OnCreatedDevice( IDirect3DDevice9* pd3dDevice ); + HRESULT OnResetDevice(); + HRESULT OnRender(); + HRESULT OnLostDevice(); + HRESULT OnDeletedDevice(); + + HRESULT AddLine( int* pnLineID, D3DXVECTOR2* pVertexList, DWORD dwVertexListCount, D3DCOLOR Color, float fWidth, + float fScaleRatio, bool bAntiAlias ); + HRESULT AddRect( int* pnLineID, RECT rc, D3DCOLOR Color, float fWidth, float fScaleRatio, bool bAntiAlias ); + HRESULT RemoveLine( int nLineID ); + HRESULT RemoveAllLines(); + +protected: + struct LINE_NODE + { + int nLineID; + D3DCOLOR Color; + float fWidth; + bool bAntiAlias; + float fScaleRatio; + D3DXVECTOR2* pVertexList; + DWORD dwVertexListCount; + }; + + CGrowableArray m_LinesList; + IDirect3DDevice9* m_pd3dDevice; + ID3DXLine* m_pD3DXLine; +}; + + +//-------------------------------------------------------------------------------------- +// Shared code for samples to ask user if they want to use a REF device or quit +//-------------------------------------------------------------------------------------- +void WINAPI DXUTDisplaySwitchingToREFWarning( DXUTDeviceVersion ver ); + +//-------------------------------------------------------------------------------------- +// Tries to finds a media file by searching in common locations +//-------------------------------------------------------------------------------------- +HRESULT WINAPI DXUTFindDXSDKMediaFileCch( __in_ecount(cchDest) WCHAR* strDestPath, + int cchDest, + __in LPCWSTR strFilename ); +HRESULT WINAPI DXUTSetMediaSearchPath( LPCWSTR strPath ); +LPCWSTR WINAPI DXUTGetMediaSearchPath(); + + +//-------------------------------------------------------------------------------------- +// Returns a view matrix for rendering to a face of a cubemap. +//-------------------------------------------------------------------------------------- +D3DXMATRIX WINAPI DXUTGetCubeMapViewMatrix( DWORD dwFace ); + + +//-------------------------------------------------------------------------------------- +// Simple helper stack class +//-------------------------------------------------------------------------------------- +template class CDXUTStack +{ +private: + UINT m_MemorySize; + UINT m_NumElements; + T* m_pData; + + bool EnsureStackSize( UINT64 iElements ) + { + if( m_MemorySize > iElements ) + return true; + + T* pTemp = new T[ ( size_t )( iElements * 2 + 256 ) ]; + if( !pTemp ) + return false; + + if( m_NumElements ) + { + CopyMemory( pTemp, m_pData, ( size_t )( m_NumElements * sizeof( T ) ) ); + } + + if( m_pData ) delete []m_pData; + m_pData = pTemp; + return true; + } + +public: + CDXUTStack() + { + m_pData = NULL; m_NumElements = 0; m_MemorySize = 0; + } + ~CDXUTStack() + { + if( m_pData ) delete []m_pData; + } + + UINT GetCount() + { + return m_NumElements; + } + T GetAt( UINT i ) + { + return m_pData[i]; + } + T GetTop() + { + if( m_NumElements < 1 ) + return NULL; + + return m_pData[ m_NumElements - 1 ]; + } + + T GetRelative( INT i ) + { + INT64 iVal = m_NumElements - 1 + i; + if( iVal < 0 ) + return NULL; + return m_pData[ iVal ]; + } + + bool Push( T pElem ) + { + if( !EnsureStackSize( m_NumElements + 1 ) ) + return false; + + m_pData[m_NumElements] = pElem; + m_NumElements++; + + return true; + } + + T Pop() + { + if( m_NumElements < 1 ) + return NULL; + + m_NumElements --; + return m_pData[m_NumElements]; + } +}; + + +#endif diff --git a/Demos/DX11ClothDemo/DXUT/Optional/SDKsound.cpp b/Demos/DX11ClothDemo/DXUT/Optional/SDKsound.cpp new file mode 100644 index 000000000..a1256c758 --- /dev/null +++ b/Demos/DX11ClothDemo/DXUT/Optional/SDKsound.cpp @@ -0,0 +1,1053 @@ +//----------------------------------------------------------------------------- +// File: DXUTsound.cpp +// +// Desc: DirectSound framework classes for playing wav files in DirectSound +// buffers. Feel free to use these classes as a starting point for adding +// extra functionality. +// +// Copyright (c) Microsoft Corp. All rights reserved. +//----------------------------------------------------------------------------- +#define STRICT +#include "DXUT.h" +#include +#include +#include "SDKsound.h" +#include "SDKwavefile.h" +#undef min // use __min instead +#undef max // use __max instead + + +//----------------------------------------------------------------------------- +// Name: CSoundManager::CSoundManager() +// Desc: Constructs the class +//----------------------------------------------------------------------------- +CSoundManager::CSoundManager() +{ + m_pDS = NULL; +} + + +//----------------------------------------------------------------------------- +// Name: CSoundManager::~CSoundManager() +// Desc: Destroys the class +//----------------------------------------------------------------------------- +CSoundManager::~CSoundManager() +{ + SAFE_RELEASE( m_pDS ); +} + + +//----------------------------------------------------------------------------- +// Name: CSoundManager::Initialize() +// Desc: Initializes the IDirectSound object and also sets the primary buffer +// format. This function must be called before any others. +//----------------------------------------------------------------------------- +HRESULT CSoundManager::Initialize( HWND hWnd, + DWORD dwCoopLevel ) +{ + HRESULT hr; + + SAFE_RELEASE( m_pDS ); + + // Create IDirectSound using the primary sound device + if( FAILED( hr = DirectSoundCreate8( NULL, &m_pDS, NULL ) ) ) + return DXUT_ERR( L"DirectSoundCreate8", hr ); + + // Set DirectSound coop level + if( FAILED( hr = m_pDS->SetCooperativeLevel( hWnd, dwCoopLevel ) ) ) + return DXUT_ERR( L"SetCooperativeLevel", hr ); + + return S_OK; +} + + +//----------------------------------------------------------------------------- +// Name: CSoundManager::SetPrimaryBufferFormat() +// Desc: Set primary buffer to a specified format +// !WARNING! - Setting the primary buffer format and then using this +// same DirectSound object for DirectMusic messes up +// DirectMusic! +// For example, to set the primary buffer format to 22kHz stereo, 16-bit +// then: dwPrimaryChannels = 2 +// dwPrimaryFreq = 22050, +// dwPrimaryBitRate = 16 +//----------------------------------------------------------------------------- +HRESULT CSoundManager::SetPrimaryBufferFormat( DWORD dwPrimaryChannels, + DWORD dwPrimaryFreq, + DWORD dwPrimaryBitRate ) +{ + HRESULT hr; + LPDIRECTSOUNDBUFFER pDSBPrimary = NULL; + + if( m_pDS == NULL ) + return CO_E_NOTINITIALIZED; + + // Get the primary buffer + DSBUFFERDESC dsbd; + ZeroMemory( &dsbd, sizeof( DSBUFFERDESC ) ); + dsbd.dwSize = sizeof( DSBUFFERDESC ); + dsbd.dwFlags = DSBCAPS_PRIMARYBUFFER; + dsbd.dwBufferBytes = 0; + dsbd.lpwfxFormat = NULL; + + if( FAILED( hr = m_pDS->CreateSoundBuffer( &dsbd, &pDSBPrimary, NULL ) ) ) + return DXUT_ERR( L"CreateSoundBuffer", hr ); + + WAVEFORMATEX wfx; + ZeroMemory( &wfx, sizeof( WAVEFORMATEX ) ); + wfx.wFormatTag = ( WORD )WAVE_FORMAT_PCM; + wfx.nChannels = ( WORD )dwPrimaryChannels; + wfx.nSamplesPerSec = ( DWORD )dwPrimaryFreq; + wfx.wBitsPerSample = ( WORD )dwPrimaryBitRate; + wfx.nBlockAlign = ( WORD )( wfx.wBitsPerSample / 8 * wfx.nChannels ); + wfx.nAvgBytesPerSec = ( DWORD )( wfx.nSamplesPerSec * wfx.nBlockAlign ); + + if( FAILED( hr = pDSBPrimary->SetFormat( &wfx ) ) ) + return DXUT_ERR( L"SetFormat", hr ); + + SAFE_RELEASE( pDSBPrimary ); + + return S_OK; +} + + +//----------------------------------------------------------------------------- +// Name: CSoundManager::Get3DListenerInterface() +// Desc: Returns the 3D listener interface associated with primary buffer. +//----------------------------------------------------------------------------- +HRESULT CSoundManager::Get3DListenerInterface( LPDIRECTSOUND3DLISTENER* ppDSListener ) +{ + HRESULT hr; + DSBUFFERDESC dsbdesc; + LPDIRECTSOUNDBUFFER pDSBPrimary = NULL; + + if( ppDSListener == NULL ) + return E_INVALIDARG; + if( m_pDS == NULL ) + return CO_E_NOTINITIALIZED; + + *ppDSListener = NULL; + + // Obtain primary buffer, asking it for 3D control + ZeroMemory( &dsbdesc, sizeof( DSBUFFERDESC ) ); + dsbdesc.dwSize = sizeof( DSBUFFERDESC ); + dsbdesc.dwFlags = DSBCAPS_CTRL3D | DSBCAPS_PRIMARYBUFFER; + if( FAILED( hr = m_pDS->CreateSoundBuffer( &dsbdesc, &pDSBPrimary, NULL ) ) ) + return DXUT_ERR( L"CreateSoundBuffer", hr ); + + if( FAILED( hr = pDSBPrimary->QueryInterface( IID_IDirectSound3DListener, + ( VOID** )ppDSListener ) ) ) + { + SAFE_RELEASE( pDSBPrimary ); + return DXUT_ERR( L"QueryInterface", hr ); + } + + // Release the primary buffer, since it is not need anymore + SAFE_RELEASE( pDSBPrimary ); + + return S_OK; +} + + +//----------------------------------------------------------------------------- +// Name: CSoundManager::Create() +// Desc: +//----------------------------------------------------------------------------- +HRESULT CSoundManager::Create( CSound** ppSound, + LPWSTR strWaveFileName, + DWORD dwCreationFlags, + GUID guid3DAlgorithm, + DWORD dwNumBuffers ) +{ + HRESULT hr; + HRESULT hrRet = S_OK; + DWORD i; + LPDIRECTSOUNDBUFFER* apDSBuffer = NULL; + DWORD dwDSBufferSize = NULL; + CWaveFile* pWaveFile = NULL; + + if( m_pDS == NULL ) + return CO_E_NOTINITIALIZED; + if( strWaveFileName == NULL || ppSound == NULL || dwNumBuffers < 1 ) + return E_INVALIDARG; + + apDSBuffer = new LPDIRECTSOUNDBUFFER[dwNumBuffers]; + if( apDSBuffer == NULL ) + { + hr = E_OUTOFMEMORY; + goto LFail; + } + + pWaveFile = new CWaveFile(); + if( pWaveFile == NULL ) + { + hr = E_OUTOFMEMORY; + goto LFail; + } + + pWaveFile->Open( strWaveFileName, NULL, WAVEFILE_READ ); + + if( pWaveFile->GetSize() == 0 ) + { + // Wave is blank, so don't create it. + hr = E_FAIL; + goto LFail; + } + + // Make the DirectSound buffer the same size as the wav file + dwDSBufferSize = pWaveFile->GetSize(); + + // Create the direct sound buffer, and only request the flags needed + // since each requires some overhead and limits if the buffer can + // be hardware accelerated + DSBUFFERDESC dsbd; + ZeroMemory( &dsbd, sizeof( DSBUFFERDESC ) ); + dsbd.dwSize = sizeof( DSBUFFERDESC ); + dsbd.dwFlags = dwCreationFlags; + dsbd.dwBufferBytes = dwDSBufferSize; + dsbd.guid3DAlgorithm = guid3DAlgorithm; + dsbd.lpwfxFormat = pWaveFile->m_pwfx; + + // DirectSound is only guarenteed to play PCM data. Other + // formats may or may not work depending the sound card driver. + hr = m_pDS->CreateSoundBuffer( &dsbd, &apDSBuffer[0], NULL ); + + // Be sure to return this error code if it occurs so the + // callers knows this happened. + if( hr == DS_NO_VIRTUALIZATION ) + hrRet = DS_NO_VIRTUALIZATION; + + if( FAILED( hr ) ) + { + // DSERR_BUFFERTOOSMALL will be returned if the buffer is + // less than DSBSIZE_FX_MIN and the buffer is created + // with DSBCAPS_CTRLFX. + + // It might also fail if hardware buffer mixing was requested + // on a device that doesn't support it. + DXUT_ERR( L"CreateSoundBuffer", hr ); + + goto LFail; + } + + // Default to use DuplicateSoundBuffer() when created extra buffers since always + // create a buffer that uses the same memory however DuplicateSoundBuffer() will fail if + // DSBCAPS_CTRLFX is used, so use CreateSoundBuffer() instead in this case. + if( ( dwCreationFlags & DSBCAPS_CTRLFX ) == 0 ) + { + for( i = 1; i < dwNumBuffers; i++ ) + { + if( FAILED( hr = m_pDS->DuplicateSoundBuffer( apDSBuffer[0], &apDSBuffer[i] ) ) ) + { + DXUT_ERR( L"DuplicateSoundBuffer", hr ); + goto LFail; + } + } + } + else + { + for( i = 1; i < dwNumBuffers; i++ ) + { + hr = m_pDS->CreateSoundBuffer( &dsbd, &apDSBuffer[i], NULL ); + if( FAILED( hr ) ) + { + DXUT_ERR( L"CreateSoundBuffer", hr ); + goto LFail; + } + } + } + + // Create the sound + *ppSound = new CSound( apDSBuffer, dwDSBufferSize, dwNumBuffers, pWaveFile, dwCreationFlags ); + + SAFE_DELETE_ARRAY( apDSBuffer ); + return hrRet; + +LFail: + // Cleanup + SAFE_DELETE( pWaveFile ); + SAFE_DELETE_ARRAY( apDSBuffer ); + return hr; +} + + +//----------------------------------------------------------------------------- +// Name: CSoundManager::CreateFromMemory() +// Desc: +//----------------------------------------------------------------------------- +HRESULT CSoundManager::CreateFromMemory( CSound** ppSound, + BYTE* pbData, + ULONG ulDataSize, + LPWAVEFORMATEX pwfx, + DWORD dwCreationFlags, + GUID guid3DAlgorithm, + DWORD dwNumBuffers ) +{ + HRESULT hr; + DWORD i; + LPDIRECTSOUNDBUFFER* apDSBuffer = NULL; + DWORD dwDSBufferSize = NULL; + CWaveFile* pWaveFile = NULL; + + if( m_pDS == NULL ) + return CO_E_NOTINITIALIZED; + if( pbData == NULL || ppSound == NULL || dwNumBuffers < 1 ) + return E_INVALIDARG; + + apDSBuffer = new LPDIRECTSOUNDBUFFER[dwNumBuffers]; + if( apDSBuffer == NULL ) + { + hr = E_OUTOFMEMORY; + goto LFail; + } + + pWaveFile = new CWaveFile(); + if( pWaveFile == NULL ) + { + hr = E_OUTOFMEMORY; + goto LFail; + } + + pWaveFile->OpenFromMemory( pbData, ulDataSize, pwfx, WAVEFILE_READ ); + + + // Make the DirectSound buffer the same size as the wav file + dwDSBufferSize = ulDataSize; + + // Create the direct sound buffer, and only request the flags needed + // since each requires some overhead and limits if the buffer can + // be hardware accelerated + DSBUFFERDESC dsbd; + ZeroMemory( &dsbd, sizeof( DSBUFFERDESC ) ); + dsbd.dwSize = sizeof( DSBUFFERDESC ); + dsbd.dwFlags = dwCreationFlags; + dsbd.dwBufferBytes = dwDSBufferSize; + dsbd.guid3DAlgorithm = guid3DAlgorithm; + dsbd.lpwfxFormat = pwfx; + + if( FAILED( hr = m_pDS->CreateSoundBuffer( &dsbd, &apDSBuffer[0], NULL ) ) ) + { + DXUT_ERR( L"CreateSoundBuffer", hr ); + goto LFail; + } + + // Default to use DuplicateSoundBuffer() when created extra buffers since always + // create a buffer that uses the same memory however DuplicateSoundBuffer() will fail if + // DSBCAPS_CTRLFX is used, so use CreateSoundBuffer() instead in this case. + if( ( dwCreationFlags & DSBCAPS_CTRLFX ) == 0 ) + { + for( i = 1; i < dwNumBuffers; i++ ) + { + if( FAILED( hr = m_pDS->DuplicateSoundBuffer( apDSBuffer[0], &apDSBuffer[i] ) ) ) + { + DXUT_ERR( L"DuplicateSoundBuffer", hr ); + goto LFail; + } + } + } + else + { + for( i = 1; i < dwNumBuffers; i++ ) + { + hr = m_pDS->CreateSoundBuffer( &dsbd, &apDSBuffer[i], NULL ); + if( FAILED( hr ) ) + { + DXUT_ERR( L"CreateSoundBuffer", hr ); + goto LFail; + } + } + } + + // Create the sound + *ppSound = new CSound( apDSBuffer, dwDSBufferSize, dwNumBuffers, pWaveFile, dwCreationFlags ); + + SAFE_DELETE_ARRAY( apDSBuffer ); + return S_OK; + +LFail: + // Cleanup + + SAFE_DELETE_ARRAY( apDSBuffer ); + return hr; +} + + +//----------------------------------------------------------------------------- +// Name: CSoundManager::CreateStreaming() +// Desc: +//----------------------------------------------------------------------------- +HRESULT CSoundManager::CreateStreaming( CStreamingSound** ppStreamingSound, + LPWSTR strWaveFileName, + DWORD dwCreationFlags, + GUID guid3DAlgorithm, + DWORD dwNotifyCount, + DWORD dwNotifySize, + HANDLE hNotifyEvent ) +{ + HRESULT hr; + + if( m_pDS == NULL ) + return CO_E_NOTINITIALIZED; + if( strWaveFileName == NULL || ppStreamingSound == NULL || hNotifyEvent == NULL ) + return E_INVALIDARG; + + LPDIRECTSOUNDBUFFER pDSBuffer = NULL; + DWORD dwDSBufferSize = NULL; + CWaveFile* pWaveFile = NULL; + DSBPOSITIONNOTIFY* aPosNotify = NULL; + LPDIRECTSOUNDNOTIFY pDSNotify = NULL; + + pWaveFile = new CWaveFile(); + if( pWaveFile == NULL ) + return E_OUTOFMEMORY; + pWaveFile->Open( strWaveFileName, NULL, WAVEFILE_READ ); + + // Figure out how big the DirectSound buffer should be + dwDSBufferSize = dwNotifySize * dwNotifyCount; + + // Set up the direct sound buffer. Request the NOTIFY flag, so + // that we are notified as the sound buffer plays. Note, that using this flag + // may limit the amount of hardware acceleration that can occur. + DSBUFFERDESC dsbd; + ZeroMemory( &dsbd, sizeof( DSBUFFERDESC ) ); + dsbd.dwSize = sizeof( DSBUFFERDESC ); + dsbd.dwFlags = dwCreationFlags | + DSBCAPS_CTRLPOSITIONNOTIFY | + DSBCAPS_GETCURRENTPOSITION2; + dsbd.dwBufferBytes = dwDSBufferSize; + dsbd.guid3DAlgorithm = guid3DAlgorithm; + dsbd.lpwfxFormat = pWaveFile->m_pwfx; + + if( FAILED( hr = m_pDS->CreateSoundBuffer( &dsbd, &pDSBuffer, NULL ) ) ) + { + // If wave format isn't then it will return + // either DSERR_BADFORMAT or E_INVALIDARG + if( hr == DSERR_BADFORMAT || hr == E_INVALIDARG ) + return DXUT_ERR( L"CreateSoundBuffer", hr ); + + return DXUT_ERR( L"CreateSoundBuffer", hr ); + } + + // Create the notification events, so that we know when to fill + // the buffer as the sound plays. + if( FAILED( hr = pDSBuffer->QueryInterface( IID_IDirectSoundNotify, + ( VOID** )&pDSNotify ) ) ) + { + SAFE_DELETE_ARRAY( aPosNotify ); + return DXUT_ERR( L"QueryInterface", hr ); + } + + aPosNotify = new DSBPOSITIONNOTIFY[ dwNotifyCount ]; + if( aPosNotify == NULL ) + return E_OUTOFMEMORY; + + for( DWORD i = 0; i < dwNotifyCount; i++ ) + { + aPosNotify[i].dwOffset = ( dwNotifySize * i ) + dwNotifySize - 1; + aPosNotify[i].hEventNotify = hNotifyEvent; + } + + // Tell DirectSound when to notify us. The notification will come in the from + // of signaled events that are handled in WinMain() + if( FAILED( hr = pDSNotify->SetNotificationPositions( dwNotifyCount, + aPosNotify ) ) ) + { + SAFE_RELEASE( pDSNotify ); + SAFE_DELETE_ARRAY( aPosNotify ); + return DXUT_ERR( L"SetNotificationPositions", hr ); + } + + SAFE_RELEASE( pDSNotify ); + SAFE_DELETE_ARRAY( aPosNotify ); + + // Create the sound + *ppStreamingSound = new CStreamingSound( pDSBuffer, dwDSBufferSize, pWaveFile, dwNotifySize ); + + return S_OK; +} + + +//----------------------------------------------------------------------------- +// Name: CSound::CSound() +// Desc: Constructs the class +//----------------------------------------------------------------------------- +CSound::CSound( LPDIRECTSOUNDBUFFER* apDSBuffer, DWORD dwDSBufferSize, + DWORD dwNumBuffers, CWaveFile* pWaveFile, DWORD dwCreationFlags ) +{ + DWORD i; + + if( dwNumBuffers <= 0 ) + return; + + m_apDSBuffer = new LPDIRECTSOUNDBUFFER[dwNumBuffers]; + if( NULL != m_apDSBuffer ) + { + for( i = 0; i < dwNumBuffers; i++ ) + m_apDSBuffer[i] = apDSBuffer[i]; + + m_dwDSBufferSize = dwDSBufferSize; + m_dwNumBuffers = dwNumBuffers; + m_pWaveFile = pWaveFile; + m_dwCreationFlags = dwCreationFlags; + + FillBufferWithSound( m_apDSBuffer[0], FALSE ); + } +} + + +//----------------------------------------------------------------------------- +// Name: CSound::~CSound() +// Desc: Destroys the class +//----------------------------------------------------------------------------- +CSound::~CSound() +{ + for( DWORD i = 0; i < m_dwNumBuffers; i++ ) + { + SAFE_RELEASE( m_apDSBuffer[i] ); + } + + SAFE_DELETE_ARRAY( m_apDSBuffer ); + SAFE_DELETE( m_pWaveFile ); +} + + +//----------------------------------------------------------------------------- +// Name: CSound::FillBufferWithSound() +// Desc: Fills a DirectSound buffer with a sound file +//----------------------------------------------------------------------------- +HRESULT CSound::FillBufferWithSound( LPDIRECTSOUNDBUFFER pDSB, BOOL bRepeatWavIfBufferLarger ) +{ + HRESULT hr; + VOID* pDSLockedBuffer = NULL; // Pointer to locked buffer memory + DWORD dwDSLockedBufferSize = 0; // Size of the locked DirectSound buffer + DWORD dwWavDataRead = 0; // Amount of data read from the wav file + + if( pDSB == NULL ) + return CO_E_NOTINITIALIZED; + + // Make sure we have focus, and we didn't just switch in from + // an app which had a DirectSound device + if( FAILED( hr = RestoreBuffer( pDSB, NULL ) ) ) + return DXUT_ERR( L"RestoreBuffer", hr ); + + // Lock the buffer down + if( FAILED( hr = pDSB->Lock( 0, m_dwDSBufferSize, + &pDSLockedBuffer, &dwDSLockedBufferSize, + NULL, NULL, 0L ) ) ) + return DXUT_ERR( L"Lock", hr ); + + // Reset the wave file to the beginning + m_pWaveFile->ResetFile(); + + if( FAILED( hr = m_pWaveFile->Read( ( BYTE* )pDSLockedBuffer, + dwDSLockedBufferSize, + &dwWavDataRead ) ) ) + return DXUT_ERR( L"Read", hr ); + + if( dwWavDataRead == 0 ) + { + // Wav is blank, so just fill with silence + FillMemory( ( BYTE* )pDSLockedBuffer, + dwDSLockedBufferSize, + ( BYTE )( m_pWaveFile->m_pwfx->wBitsPerSample == 8 ? 128 : 0 ) ); + } + else if( dwWavDataRead < dwDSLockedBufferSize ) + { + // If the wav file was smaller than the DirectSound buffer, + // we need to fill the remainder of the buffer with data + if( bRepeatWavIfBufferLarger ) + { + // Reset the file and fill the buffer with wav data + DWORD dwReadSoFar = dwWavDataRead; // From previous call above. + while( dwReadSoFar < dwDSLockedBufferSize ) + { + // This will keep reading in until the buffer is full + // for very short files + if( FAILED( hr = m_pWaveFile->ResetFile() ) ) + return DXUT_ERR( L"ResetFile", hr ); + + hr = m_pWaveFile->Read( ( BYTE* )pDSLockedBuffer + dwReadSoFar, + dwDSLockedBufferSize - dwReadSoFar, + &dwWavDataRead ); + if( FAILED( hr ) ) + return DXUT_ERR( L"Read", hr ); + + dwReadSoFar += dwWavDataRead; + } + } + else + { + // Don't repeat the wav file, just fill in silence + FillMemory( ( BYTE* )pDSLockedBuffer + dwWavDataRead, + dwDSLockedBufferSize - dwWavDataRead, + ( BYTE )( m_pWaveFile->m_pwfx->wBitsPerSample == 8 ? 128 : 0 ) ); + } + } + + // Unlock the buffer, we don't need it anymore. + pDSB->Unlock( pDSLockedBuffer, dwDSLockedBufferSize, NULL, 0 ); + + return S_OK; +} + + +//----------------------------------------------------------------------------- +// Name: CSound::RestoreBuffer() +// Desc: Restores the lost buffer. *pbWasRestored returns TRUE if the buffer was +// restored. It can also NULL if the information is not needed. +//----------------------------------------------------------------------------- +HRESULT CSound::RestoreBuffer( LPDIRECTSOUNDBUFFER pDSB, BOOL* pbWasRestored ) +{ + HRESULT hr; + + if( pDSB == NULL ) + return CO_E_NOTINITIALIZED; + if( pbWasRestored ) + *pbWasRestored = FALSE; + + DWORD dwStatus; + if( FAILED( hr = pDSB->GetStatus( &dwStatus ) ) ) + return DXUT_ERR( L"GetStatus", hr ); + + if( dwStatus & DSBSTATUS_BUFFERLOST ) + { + // Since the app could have just been activated, then + // DirectSound may not be giving us control yet, so + // the restoring the buffer may fail. + // If it does, sleep until DirectSound gives us control. + do + { + hr = pDSB->Restore(); + if( hr == DSERR_BUFFERLOST ) + Sleep( 10 ); + } while( ( hr = pDSB->Restore() ) == DSERR_BUFFERLOST ); + + if( pbWasRestored != NULL ) + *pbWasRestored = TRUE; + + return S_OK; + } + else + { + return S_FALSE; + } +} + + +//----------------------------------------------------------------------------- +// Name: CSound::GetFreeBuffer() +// Desc: Finding the first buffer that is not playing and return a pointer to +// it, or if all are playing return a pointer to a randomly selected buffer. +//----------------------------------------------------------------------------- +LPDIRECTSOUNDBUFFER CSound::GetFreeBuffer() +{ + if( m_apDSBuffer == NULL ) + return FALSE; + + DWORD i; + for( i = 0; i < m_dwNumBuffers; i++ ) + { + if( m_apDSBuffer[i] ) + { + DWORD dwStatus = 0; + m_apDSBuffer[i]->GetStatus( &dwStatus ); + if( ( dwStatus & DSBSTATUS_PLAYING ) == 0 ) + break; + } + } + + if( i != m_dwNumBuffers ) + return m_apDSBuffer[ i ]; + else + return m_apDSBuffer[ rand() % m_dwNumBuffers ]; +} + + +//----------------------------------------------------------------------------- +// Name: CSound::GetBuffer() +// Desc: +//----------------------------------------------------------------------------- +LPDIRECTSOUNDBUFFER CSound::GetBuffer( DWORD dwIndex ) +{ + if( m_apDSBuffer == NULL ) + return NULL; + if( dwIndex >= m_dwNumBuffers ) + return NULL; + + return m_apDSBuffer[dwIndex]; +} + + +//----------------------------------------------------------------------------- +// Name: CSound::Get3DBufferInterface() +// Desc: +//----------------------------------------------------------------------------- +HRESULT CSound::Get3DBufferInterface( DWORD dwIndex, LPDIRECTSOUND3DBUFFER* ppDS3DBuffer ) +{ + if( m_apDSBuffer == NULL ) + return CO_E_NOTINITIALIZED; + if( dwIndex >= m_dwNumBuffers ) + return E_INVALIDARG; + + *ppDS3DBuffer = NULL; + + return m_apDSBuffer[dwIndex]->QueryInterface( IID_IDirectSound3DBuffer, + ( VOID** )ppDS3DBuffer ); +} + + +//----------------------------------------------------------------------------- +// Name: CSound::Play() +// Desc: Plays the sound using voice management flags. Pass in DSBPLAY_LOOPING +// in the dwFlags to loop the sound +//----------------------------------------------------------------------------- +HRESULT CSound::Play( DWORD dwPriority, DWORD dwFlags, LONG lVolume, LONG lFrequency, LONG lPan ) +{ + HRESULT hr; + BOOL bRestored; + + if( m_apDSBuffer == NULL ) + return CO_E_NOTINITIALIZED; + + LPDIRECTSOUNDBUFFER pDSB = GetFreeBuffer(); + + if( pDSB == NULL ) + return DXUT_ERR( L"GetFreeBuffer", E_FAIL ); + + // Restore the buffer if it was lost + if( FAILED( hr = RestoreBuffer( pDSB, &bRestored ) ) ) + return DXUT_ERR( L"RestoreBuffer", hr ); + + if( bRestored ) + { + // The buffer was restored, so we need to fill it with new data + if( FAILED( hr = FillBufferWithSound( pDSB, FALSE ) ) ) + return DXUT_ERR( L"FillBufferWithSound", hr ); + } + + if( m_dwCreationFlags & DSBCAPS_CTRLVOLUME ) + { + pDSB->SetVolume( lVolume ); + } + + if( lFrequency != -1 && + ( m_dwCreationFlags & DSBCAPS_CTRLFREQUENCY ) ) + { + pDSB->SetFrequency( lFrequency ); + } + + if( m_dwCreationFlags & DSBCAPS_CTRLPAN ) + { + pDSB->SetPan( lPan ); + } + + return pDSB->Play( 0, dwPriority, dwFlags ); +} + + +//----------------------------------------------------------------------------- +// Name: CSound::Play3D() +// Desc: Plays the sound using voice management flags. Pass in DSBPLAY_LOOPING +// in the dwFlags to loop the sound +//----------------------------------------------------------------------------- +HRESULT CSound::Play3D( LPDS3DBUFFER p3DBuffer, DWORD dwPriority, DWORD dwFlags, LONG lFrequency ) +{ + HRESULT hr; + BOOL bRestored; + DWORD dwBaseFrequency; + + if( m_apDSBuffer == NULL ) + return CO_E_NOTINITIALIZED; + + LPDIRECTSOUNDBUFFER pDSB = GetFreeBuffer(); + if( pDSB == NULL ) + return DXUT_ERR( L"GetFreeBuffer", E_FAIL ); + + // Restore the buffer if it was lost + if( FAILED( hr = RestoreBuffer( pDSB, &bRestored ) ) ) + return DXUT_ERR( L"RestoreBuffer", hr ); + + if( bRestored ) + { + // The buffer was restored, so we need to fill it with new data + if( FAILED( hr = FillBufferWithSound( pDSB, FALSE ) ) ) + return DXUT_ERR( L"FillBufferWithSound", hr ); + } + + if( m_dwCreationFlags & DSBCAPS_CTRLFREQUENCY ) + { + pDSB->GetFrequency( &dwBaseFrequency ); + pDSB->SetFrequency( dwBaseFrequency + lFrequency ); + } + + // QI for the 3D buffer + LPDIRECTSOUND3DBUFFER pDS3DBuffer; + hr = pDSB->QueryInterface( IID_IDirectSound3DBuffer, ( VOID** )&pDS3DBuffer ); + if( SUCCEEDED( hr ) ) + { + hr = pDS3DBuffer->SetAllParameters( p3DBuffer, DS3D_IMMEDIATE ); + if( SUCCEEDED( hr ) ) + { + hr = pDSB->Play( 0, dwPriority, dwFlags ); + } + + pDS3DBuffer->Release(); + } + + return hr; +} + + +//----------------------------------------------------------------------------- +// Name: CSound::Stop() +// Desc: Stops the sound from playing +//----------------------------------------------------------------------------- +HRESULT CSound::Stop() +{ + if( m_apDSBuffer == NULL ) + return CO_E_NOTINITIALIZED; + + HRESULT hr = 0; + + for( DWORD i = 0; i < m_dwNumBuffers; i++ ) + hr |= m_apDSBuffer[i]->Stop(); + + return hr; +} + + +//----------------------------------------------------------------------------- +// Name: CSound::Reset() +// Desc: Reset all of the sound buffers +//----------------------------------------------------------------------------- +HRESULT CSound::Reset() +{ + if( m_apDSBuffer == NULL ) + return CO_E_NOTINITIALIZED; + + HRESULT hr = 0; + + for( DWORD i = 0; i < m_dwNumBuffers; i++ ) + hr |= m_apDSBuffer[i]->SetCurrentPosition( 0 ); + + return hr; +} + + +//----------------------------------------------------------------------------- +// Name: CSound::IsSoundPlaying() +// Desc: Checks to see if a buffer is playing and returns TRUE if it is. +//----------------------------------------------------------------------------- +BOOL CSound::IsSoundPlaying() +{ + BOOL bIsPlaying = FALSE; + + if( m_apDSBuffer == NULL ) + return FALSE; + + for( DWORD i = 0; i < m_dwNumBuffers; i++ ) + { + if( m_apDSBuffer[i] ) + { + DWORD dwStatus = 0; + m_apDSBuffer[i]->GetStatus( &dwStatus ); + bIsPlaying |= ( ( dwStatus & DSBSTATUS_PLAYING ) != 0 ); + } + } + + return bIsPlaying; +} + + +//----------------------------------------------------------------------------- +// Name: CStreamingSound::CStreamingSound() +// Desc: Setups up a buffer so data can be streamed from the wave file into +// a buffer. This is very useful for large wav files that would take a +// while to load. The buffer is initially filled with data, then +// as sound is played the notification events are signaled and more data +// is written into the buffer by calling HandleWaveStreamNotification() +//----------------------------------------------------------------------------- +CStreamingSound::CStreamingSound( LPDIRECTSOUNDBUFFER pDSBuffer, DWORD dwDSBufferSize, + CWaveFile* pWaveFile, DWORD dwNotifySize ) : CSound( &pDSBuffer, dwDSBufferSize, 1, + pWaveFile, 0 ) +{ + m_dwLastPlayPos = 0; + m_dwPlayProgress = 0; + m_dwNotifySize = dwNotifySize; + m_dwNextWriteOffset = 0; + m_bFillNextNotificationWithSilence = FALSE; +} + + +//----------------------------------------------------------------------------- +// Name: CStreamingSound::~CStreamingSound() +// Desc: Destroys the class +//----------------------------------------------------------------------------- +CStreamingSound::~CStreamingSound() +{ +} + + +//----------------------------------------------------------------------------- +// Name: CStreamingSound::HandleWaveStreamNotification() +// Desc: Handle the notification that tells us to put more wav data in the +// circular buffer +//----------------------------------------------------------------------------- +HRESULT CStreamingSound::HandleWaveStreamNotification( BOOL bLoopedPlay ) +{ + HRESULT hr; + DWORD dwCurrentPlayPos; + DWORD dwPlayDelta; + DWORD dwBytesWrittenToBuffer; + VOID* pDSLockedBuffer = NULL; + VOID* pDSLockedBuffer2 = NULL; + DWORD dwDSLockedBufferSize; + DWORD dwDSLockedBufferSize2; + + if( m_apDSBuffer == NULL || m_pWaveFile == NULL ) + return CO_E_NOTINITIALIZED; + + // Restore the buffer if it was lost + BOOL bRestored; + if( FAILED( hr = RestoreBuffer( m_apDSBuffer[0], &bRestored ) ) ) + return DXUT_ERR( L"RestoreBuffer", hr ); + + if( bRestored ) + { + // The buffer was restored, so we need to fill it with new data + if( FAILED( hr = FillBufferWithSound( m_apDSBuffer[0], FALSE ) ) ) + return DXUT_ERR( L"FillBufferWithSound", hr ); + return S_OK; + } + + // Lock the DirectSound buffer + if( FAILED( hr = m_apDSBuffer[0]->Lock( m_dwNextWriteOffset, m_dwNotifySize, + &pDSLockedBuffer, &dwDSLockedBufferSize, + &pDSLockedBuffer2, &dwDSLockedBufferSize2, 0L ) ) ) + return DXUT_ERR( L"Lock", hr ); + + // m_dwDSBufferSize and m_dwNextWriteOffset are both multiples of m_dwNotifySize, + // it should the second buffer, so it should never be valid + if( pDSLockedBuffer2 != NULL ) + return E_UNEXPECTED; + + if( !m_bFillNextNotificationWithSilence ) + { + // Fill the DirectSound buffer with wav data + if( FAILED( hr = m_pWaveFile->Read( ( BYTE* )pDSLockedBuffer, + dwDSLockedBufferSize, + &dwBytesWrittenToBuffer ) ) ) + return DXUT_ERR( L"Read", hr ); + } + else + { + // Fill the DirectSound buffer with silence + FillMemory( pDSLockedBuffer, dwDSLockedBufferSize, + ( BYTE )( m_pWaveFile->m_pwfx->wBitsPerSample == 8 ? 128 : 0 ) ); + dwBytesWrittenToBuffer = dwDSLockedBufferSize; + } + + // If the number of bytes written is less than the + // amount we requested, we have a short file. + if( dwBytesWrittenToBuffer < dwDSLockedBufferSize ) + { + if( !bLoopedPlay ) + { + // Fill in silence for the rest of the buffer. + FillMemory( ( BYTE* )pDSLockedBuffer + dwBytesWrittenToBuffer, + dwDSLockedBufferSize - dwBytesWrittenToBuffer, + ( BYTE )( m_pWaveFile->m_pwfx->wBitsPerSample == 8 ? 128 : 0 ) ); + + // Any future notifications should just fill the buffer with silence + m_bFillNextNotificationWithSilence = TRUE; + } + else + { + // We are looping, so reset the file and fill the buffer with wav data + DWORD dwReadSoFar = dwBytesWrittenToBuffer; // From previous call above. + while( dwReadSoFar < dwDSLockedBufferSize ) + { + // This will keep reading in until the buffer is full (for very short files). + if( FAILED( hr = m_pWaveFile->ResetFile() ) ) + return DXUT_ERR( L"ResetFile", hr ); + + if( FAILED( hr = m_pWaveFile->Read( ( BYTE* )pDSLockedBuffer + dwReadSoFar, + dwDSLockedBufferSize - dwReadSoFar, + &dwBytesWrittenToBuffer ) ) ) + return DXUT_ERR( L"Read", hr ); + + dwReadSoFar += dwBytesWrittenToBuffer; + } + } + } + + // Unlock the DirectSound buffer + m_apDSBuffer[0]->Unlock( pDSLockedBuffer, dwDSLockedBufferSize, NULL, 0 ); + + // Figure out how much data has been played so far. When we have played + // past the end of the file, we will either need to start filling the + // buffer with silence or starting reading from the beginning of the file, + // depending if the user wants to loop the sound + if( FAILED( hr = m_apDSBuffer[0]->GetCurrentPosition( &dwCurrentPlayPos, NULL ) ) ) + return DXUT_ERR( L"GetCurrentPosition", hr ); + + // Check to see if the position counter looped + if( dwCurrentPlayPos < m_dwLastPlayPos ) + dwPlayDelta = ( m_dwDSBufferSize - m_dwLastPlayPos ) + dwCurrentPlayPos; + else + dwPlayDelta = dwCurrentPlayPos - m_dwLastPlayPos; + + m_dwPlayProgress += dwPlayDelta; + m_dwLastPlayPos = dwCurrentPlayPos; + + // If we are now filling the buffer with silence, then we have found the end so + // check to see if the entire sound has played, if it has then stop the buffer. + if( m_bFillNextNotificationWithSilence ) + { + // We don't want to cut off the sound before it's done playing. + if( m_dwPlayProgress >= m_pWaveFile->GetSize() ) + { + m_apDSBuffer[0]->Stop(); + } + } + + // Update where the buffer will lock (for next time) + m_dwNextWriteOffset += dwDSLockedBufferSize; + m_dwNextWriteOffset %= m_dwDSBufferSize; // Circular buffer + + return S_OK; +} + + +//----------------------------------------------------------------------------- +// Name: CStreamingSound::Reset() +// Desc: Resets the sound so it will begin playing at the beginning +//----------------------------------------------------------------------------- +HRESULT CStreamingSound::Reset() +{ + HRESULT hr; + + if( m_apDSBuffer[0] == NULL || m_pWaveFile == NULL ) + return CO_E_NOTINITIALIZED; + + m_dwLastPlayPos = 0; + m_dwPlayProgress = 0; + m_dwNextWriteOffset = 0; + m_bFillNextNotificationWithSilence = FALSE; + + // Restore the buffer if it was lost + BOOL bRestored; + if( FAILED( hr = RestoreBuffer( m_apDSBuffer[0], &bRestored ) ) ) + return DXUT_ERR( L"RestoreBuffer", hr ); + + if( bRestored ) + { + // The buffer was restored, so we need to fill it with new data + if( FAILED( hr = FillBufferWithSound( m_apDSBuffer[0], FALSE ) ) ) + return DXUT_ERR( L"FillBufferWithSound", hr ); + } + + m_pWaveFile->ResetFile(); + + return m_apDSBuffer[0]->SetCurrentPosition( 0L ); +} diff --git a/Demos/DX11ClothDemo/DXUT/Optional/SDKsound.h b/Demos/DX11ClothDemo/DXUT/Optional/SDKsound.h new file mode 100644 index 000000000..b79054a5c --- /dev/null +++ b/Demos/DX11ClothDemo/DXUT/Optional/SDKsound.h @@ -0,0 +1,124 @@ +//----------------------------------------------------------------------------- +// File: DXUTsound.h +// +// Copyright (c) Microsoft Corp. All rights reserved. +//----------------------------------------------------------------------------- +#ifndef DXUTSOUND_H +#define DXUTSOUND_H + +//----------------------------------------------------------------------------- +// Header Includes +//----------------------------------------------------------------------------- +#include +#include + +//----------------------------------------------------------------------------- +// Classes used by this header +//----------------------------------------------------------------------------- +class CSoundManager; +class CSound; +class CStreamingSound; +class CWaveFile; + + +//----------------------------------------------------------------------------- +// Typing macros +//----------------------------------------------------------------------------- +#define DXUT_StopSound(s) { if(s) s->Stop(); } +#define DXUT_PlaySound(s) { if(s) s->Play( 0, 0 ); } +#define DXUT_PlaySoundLooping(s) { if(s) s->Play( 0, DSBPLAY_LOOPING ); } + + +//----------------------------------------------------------------------------- +// Name: class CSoundManager +// Desc: +//----------------------------------------------------------------------------- +class CSoundManager +{ +protected: + IDirectSound8* m_pDS; + +public: + CSoundManager(); + ~CSoundManager(); + + HRESULT Initialize( HWND hWnd, DWORD dwCoopLevel ); + inline LPDIRECTSOUND8 GetDirectSound() + { + return m_pDS; + } + HRESULT SetPrimaryBufferFormat( DWORD dwPrimaryChannels, DWORD dwPrimaryFreq, + DWORD dwPrimaryBitRate ); + HRESULT Get3DListenerInterface( LPDIRECTSOUND3DLISTENER* ppDSListener ); + + HRESULT Create( CSound** ppSound, LPWSTR strWaveFileName, DWORD dwCreationFlags = 0, + GUID guid3DAlgorithm = GUID_NULL, DWORD dwNumBuffers = 1 ); + HRESULT CreateFromMemory( CSound** ppSound, BYTE* pbData, ULONG ulDataSize, LPWAVEFORMATEX pwfx, + DWORD dwCreationFlags = 0, GUID guid3DAlgorithm = GUID_NULL, + DWORD dwNumBuffers = 1 ); + HRESULT CreateStreaming( CStreamingSound** ppStreamingSound, LPWSTR strWaveFileName, + DWORD dwCreationFlags, GUID guid3DAlgorithm, DWORD dwNotifyCount, + DWORD dwNotifySize, HANDLE hNotifyEvent ); +}; + + +//----------------------------------------------------------------------------- +// Name: class CSound +// Desc: Encapsulates functionality of a DirectSound buffer. +//----------------------------------------------------------------------------- +class CSound +{ +protected: + LPDIRECTSOUNDBUFFER* m_apDSBuffer; + DWORD m_dwDSBufferSize; + CWaveFile* m_pWaveFile; + DWORD m_dwNumBuffers; + DWORD m_dwCreationFlags; + + HRESULT RestoreBuffer( LPDIRECTSOUNDBUFFER pDSB, BOOL* pbWasRestored ); + +public: + CSound( LPDIRECTSOUNDBUFFER* apDSBuffer, DWORD dwDSBufferSize, DWORD dwNumBuffers, + CWaveFile* pWaveFile, DWORD dwCreationFlags ); + virtual ~CSound(); + + HRESULT Get3DBufferInterface( DWORD dwIndex, LPDIRECTSOUND3DBUFFER* ppDS3DBuffer ); + HRESULT FillBufferWithSound( LPDIRECTSOUNDBUFFER pDSB, BOOL bRepeatWavIfBufferLarger ); + LPDIRECTSOUNDBUFFER GetFreeBuffer(); + LPDIRECTSOUNDBUFFER GetBuffer( DWORD dwIndex ); + + HRESULT Play( DWORD dwPriority = 0, DWORD dwFlags = 0, LONG lVolume = 0, LONG lFrequency = -1, + LONG lPan = 0 ); + HRESULT Play3D( LPDS3DBUFFER p3DBuffer, DWORD dwPriority = 0, DWORD dwFlags = 0, LONG lFrequency = 0 ); + HRESULT Stop(); + HRESULT Reset(); + BOOL IsSoundPlaying(); +}; + + +//----------------------------------------------------------------------------- +// Name: class CStreamingSound +// Desc: Encapsulates functionality to play a wave file with DirectSound. +// The Create() method loads a chunk of wave file into the buffer, +// and as sound plays more is written to the buffer by calling +// HandleWaveStreamNotification() whenever hNotifyEvent is signaled. +//----------------------------------------------------------------------------- +class CStreamingSound : public CSound +{ +protected: + DWORD m_dwLastPlayPos; + DWORD m_dwPlayProgress; + DWORD m_dwNotifySize; + DWORD m_dwNextWriteOffset; + BOOL m_bFillNextNotificationWithSilence; + +public: + CStreamingSound( LPDIRECTSOUNDBUFFER pDSBuffer, DWORD dwDSBufferSize, CWaveFile* pWaveFile, + DWORD dwNotifySize ); + ~CStreamingSound(); + + HRESULT HandleWaveStreamNotification( BOOL bLoopedPlay ); + HRESULT Reset(); +}; + +#endif // DXUTSOUND_H diff --git a/Demos/DX11ClothDemo/DXUT/Optional/SDKwavefile.cpp b/Demos/DX11ClothDemo/DXUT/Optional/SDKwavefile.cpp new file mode 100644 index 000000000..fb2725f6f --- /dev/null +++ b/Demos/DX11ClothDemo/DXUT/Optional/SDKwavefile.cpp @@ -0,0 +1,539 @@ +//----------------------------------------------------------------------------- +// File: SDKWaveFile.cpp +// +// Desc: Classes for reading and writing wav files. Feel free to use this class +// as a starting point for adding extra functionality. +// +// XNA Developer Connection +// +// Copyright (c) Microsoft Corp. All rights reserved. +//----------------------------------------------------------------------------- +#define STRICT +#include "DXUT.h" +#include "SDKwavefile.h" +#undef min // use __min instead +#undef max // use __max instead + +//----------------------------------------------------------------------------- +// Name: CWaveFile::CWaveFile() +// Desc: Constructs the class. Call Open() to open a wave file for reading. +// Then call Read() as needed. Calling the destructor or Close() +// will close the file. +//----------------------------------------------------------------------------- +CWaveFile::CWaveFile() +{ + m_pwfx = NULL; + m_hmmio = NULL; + m_pResourceBuffer = NULL; + m_dwSize = 0; + m_bIsReadingFromMemory = FALSE; +} + + +//----------------------------------------------------------------------------- +// Name: CWaveFile::~CWaveFile() +// Desc: Destructs the class +//----------------------------------------------------------------------------- +CWaveFile::~CWaveFile() +{ + Close(); + + if( !m_bIsReadingFromMemory ) + SAFE_DELETE_ARRAY( m_pwfx ); +} + + +//----------------------------------------------------------------------------- +// Name: CWaveFile::Open() +// Desc: Opens a wave file for reading +//----------------------------------------------------------------------------- +HRESULT CWaveFile::Open( LPWSTR strFileName, WAVEFORMATEX* pwfx, DWORD dwFlags ) +{ + HRESULT hr; + + m_dwFlags = dwFlags; + m_bIsReadingFromMemory = FALSE; + + if( m_dwFlags == WAVEFILE_READ ) + { + if( strFileName == NULL ) + return E_INVALIDARG; + SAFE_DELETE_ARRAY( m_pwfx ); + + m_hmmio = mmioOpen( strFileName, NULL, MMIO_ALLOCBUF | MMIO_READ ); + + if( NULL == m_hmmio ) + { + HRSRC hResInfo; + HGLOBAL hResData; + DWORD dwSize; + VOID* pvRes; + + // Loading it as a file failed, so try it as a resource + if( NULL == ( hResInfo = FindResource( NULL, strFileName, L"WAVE" ) ) ) + { + if( NULL == ( hResInfo = FindResource( NULL, strFileName, L"WAV" ) ) ) + return DXTRACE_ERR( L"FindResource", E_FAIL ); + } + + if( NULL == ( hResData = LoadResource( GetModuleHandle( NULL ), hResInfo ) ) ) + return DXTRACE_ERR( L"LoadResource", E_FAIL ); + + if( 0 == ( dwSize = SizeofResource( GetModuleHandle( NULL ), hResInfo ) ) ) + return DXTRACE_ERR( L"SizeofResource", E_FAIL ); + + if( NULL == ( pvRes = LockResource( hResData ) ) ) + return DXTRACE_ERR( L"LockResource", E_FAIL ); + + m_pResourceBuffer = new CHAR[ dwSize ]; + if( m_pResourceBuffer == NULL ) + return DXTRACE_ERR( L"new", E_OUTOFMEMORY ); + memcpy( m_pResourceBuffer, pvRes, dwSize ); + + MMIOINFO mmioInfo; + ZeroMemory( &mmioInfo, sizeof( mmioInfo ) ); + mmioInfo.fccIOProc = FOURCC_MEM; + mmioInfo.cchBuffer = dwSize; + mmioInfo.pchBuffer = ( CHAR* )m_pResourceBuffer; + + m_hmmio = mmioOpen( NULL, &mmioInfo, MMIO_ALLOCBUF | MMIO_READ ); + } + + if( FAILED( hr = ReadMMIO() ) ) + { + // ReadMMIO will fail if its an not a wave file + mmioClose( m_hmmio, 0 ); + return DXTRACE_ERR( L"ReadMMIO", hr ); + } + + if( FAILED( hr = ResetFile() ) ) + return DXTRACE_ERR( L"ResetFile", hr ); + + // After the reset, the size of the wav file is m_ck.cksize so store it now + m_dwSize = m_ck.cksize; + } + else + { + m_hmmio = mmioOpen( strFileName, NULL, MMIO_ALLOCBUF | + MMIO_READWRITE | + MMIO_CREATE ); + if( NULL == m_hmmio ) + return DXTRACE_ERR( L"mmioOpen", E_FAIL ); + + if( FAILED( hr = WriteMMIO( pwfx ) ) ) + { + mmioClose( m_hmmio, 0 ); + return DXTRACE_ERR( L"WriteMMIO", hr ); + } + + if( FAILED( hr = ResetFile() ) ) + return DXTRACE_ERR( L"ResetFile", hr ); + } + + return hr; +} + + +//----------------------------------------------------------------------------- +// Name: CWaveFile::OpenFromMemory() +// Desc: copy data to CWaveFile member variable from memory +//----------------------------------------------------------------------------- +HRESULT CWaveFile::OpenFromMemory( BYTE* pbData, ULONG ulDataSize, + WAVEFORMATEX* pwfx, DWORD dwFlags ) +{ + m_pwfx = pwfx; + m_ulDataSize = ulDataSize; + m_pbData = pbData; + m_pbDataCur = m_pbData; + m_bIsReadingFromMemory = TRUE; + + if( dwFlags != WAVEFILE_READ ) + return E_NOTIMPL; + + return S_OK; +} + + +//----------------------------------------------------------------------------- +// Name: CWaveFile::ReadMMIO() +// Desc: Support function for reading from a multimedia I/O stream. +// m_hmmio must be valid before calling. This function uses it to +// update m_ckRiff, and m_pwfx. +//----------------------------------------------------------------------------- +HRESULT CWaveFile::ReadMMIO() +{ + MMCKINFO ckIn; // chunk info. for general use. + PCMWAVEFORMAT pcmWaveFormat; // Temp PCM structure to load in. + + m_pwfx = NULL; + + if( ( 0 != mmioDescend( m_hmmio, &m_ckRiff, NULL, 0 ) ) ) + return DXTRACE_ERR( L"mmioDescend", E_FAIL ); + + // Check to make sure this is a valid wave file + if( ( m_ckRiff.ckid != FOURCC_RIFF ) || + ( m_ckRiff.fccType != mmioFOURCC( 'W', 'A', 'V', 'E' ) ) ) + return DXTRACE_ERR( L"mmioFOURCC", E_FAIL ); + + // Search the input file for for the 'fmt ' chunk. + ckIn.ckid = mmioFOURCC( 'f', 'm', 't', ' ' ); + if( 0 != mmioDescend( m_hmmio, &ckIn, &m_ckRiff, MMIO_FINDCHUNK ) ) + return DXTRACE_ERR( L"mmioDescend", E_FAIL ); + + // Expect the 'fmt' chunk to be at least as large as ; + // if there are extra parameters at the end, we'll ignore them + if( ckIn.cksize < ( LONG )sizeof( PCMWAVEFORMAT ) ) + return DXTRACE_ERR( L"sizeof(PCMWAVEFORMAT)", E_FAIL ); + + // Read the 'fmt ' chunk into . + if( mmioRead( m_hmmio, ( HPSTR )&pcmWaveFormat, + sizeof( pcmWaveFormat ) ) != sizeof( pcmWaveFormat ) ) + return DXTRACE_ERR( L"mmioRead", E_FAIL ); + + // Allocate the waveformatex, but if its not pcm format, read the next + // word, and thats how many extra bytes to allocate. + if( pcmWaveFormat.wf.wFormatTag == WAVE_FORMAT_PCM ) + { + m_pwfx = ( WAVEFORMATEX* )new CHAR[ sizeof( WAVEFORMATEX ) ]; + if( NULL == m_pwfx ) + return DXTRACE_ERR( L"m_pwfx", E_FAIL ); + + // Copy the bytes from the pcm structure to the waveformatex structure + memcpy( m_pwfx, &pcmWaveFormat, sizeof( pcmWaveFormat ) ); + m_pwfx->cbSize = 0; + } + else + { + // Read in length of extra bytes. + WORD cbExtraBytes = 0L; + if( mmioRead( m_hmmio, ( CHAR* )&cbExtraBytes, sizeof( WORD ) ) != sizeof( WORD ) ) + return DXTRACE_ERR( L"mmioRead", E_FAIL ); + + m_pwfx = ( WAVEFORMATEX* )new CHAR[ sizeof( WAVEFORMATEX ) + cbExtraBytes ]; + if( NULL == m_pwfx ) + return DXTRACE_ERR( L"new", E_FAIL ); + + // Copy the bytes from the pcm structure to the waveformatex structure + memcpy( m_pwfx, &pcmWaveFormat, sizeof( pcmWaveFormat ) ); + m_pwfx->cbSize = cbExtraBytes; + + // Now, read those extra bytes into the structure, if cbExtraAlloc != 0. + if( mmioRead( m_hmmio, ( CHAR* )( ( ( BYTE* )&( m_pwfx->cbSize ) ) + sizeof( WORD ) ), + cbExtraBytes ) != cbExtraBytes ) + { + SAFE_DELETE( m_pwfx ); + return DXTRACE_ERR( L"mmioRead", E_FAIL ); + } + } + + // Ascend the input file out of the 'fmt ' chunk. + if( 0 != mmioAscend( m_hmmio, &ckIn, 0 ) ) + { + SAFE_DELETE( m_pwfx ); + return DXTRACE_ERR( L"mmioAscend", E_FAIL ); + } + + return S_OK; +} + + +//----------------------------------------------------------------------------- +// Name: CWaveFile::GetSize() +// Desc: Retuns the size of the read access wave file +//----------------------------------------------------------------------------- +DWORD CWaveFile::GetSize() +{ + return m_dwSize; +} + + +//----------------------------------------------------------------------------- +// Name: CWaveFile::ResetFile() +// Desc: Resets the internal m_ck pointer so reading starts from the +// beginning of the file again +//----------------------------------------------------------------------------- +HRESULT CWaveFile::ResetFile() +{ + if( m_bIsReadingFromMemory ) + { + m_pbDataCur = m_pbData; + } + else + { + if( m_hmmio == NULL ) + return CO_E_NOTINITIALIZED; + + if( m_dwFlags == WAVEFILE_READ ) + { + // Seek to the data + if( -1 == mmioSeek( m_hmmio, m_ckRiff.dwDataOffset + sizeof( FOURCC ), + SEEK_SET ) ) + return DXTRACE_ERR( L"mmioSeek", E_FAIL ); + + // Search the input file for the 'data' chunk. + m_ck.ckid = mmioFOURCC( 'd', 'a', 't', 'a' ); + if( 0 != mmioDescend( m_hmmio, &m_ck, &m_ckRiff, MMIO_FINDCHUNK ) ) + return DXTRACE_ERR( L"mmioDescend", E_FAIL ); + } + else + { + // Create the 'data' chunk that holds the waveform samples. + m_ck.ckid = mmioFOURCC( 'd', 'a', 't', 'a' ); + m_ck.cksize = 0; + + if( 0 != mmioCreateChunk( m_hmmio, &m_ck, 0 ) ) + return DXTRACE_ERR( L"mmioCreateChunk", E_FAIL ); + + if( 0 != mmioGetInfo( m_hmmio, &m_mmioinfoOut, 0 ) ) + return DXTRACE_ERR( L"mmioGetInfo", E_FAIL ); + } + } + + return S_OK; +} + + +//----------------------------------------------------------------------------- +// Name: CWaveFile::Read() +// Desc: Reads section of data from a wave file into pBuffer and returns +// how much read in pdwSizeRead, reading not more than dwSizeToRead. +// This uses m_ck to determine where to start reading from. So +// subsequent calls will be continue where the last left off unless +// Reset() is called. +//----------------------------------------------------------------------------- +HRESULT CWaveFile::Read( BYTE* pBuffer, DWORD dwSizeToRead, DWORD* pdwSizeRead ) +{ + if( m_bIsReadingFromMemory ) + { + if( m_pbDataCur == NULL ) + return CO_E_NOTINITIALIZED; + if( pdwSizeRead != NULL ) + *pdwSizeRead = 0; + + if( ( BYTE* )( m_pbDataCur + dwSizeToRead ) > + ( BYTE* )( m_pbData + m_ulDataSize ) ) + { + dwSizeToRead = m_ulDataSize - ( DWORD )( m_pbDataCur - m_pbData ); + } + +#pragma warning( disable: 4616 ) // disable warning about warning number '22104' being out of range +#pragma warning( disable: 22104 ) // disable PREfast warning during static code analysis + CopyMemory( pBuffer, m_pbDataCur, dwSizeToRead ); +#pragma warning( default: 22104 ) +#pragma warning( default: 4616 ) + + if( pdwSizeRead != NULL ) + *pdwSizeRead = dwSizeToRead; + + return S_OK; + } + else + { + MMIOINFO mmioinfoIn; // current status of m_hmmio + + if( m_hmmio == NULL ) + return CO_E_NOTINITIALIZED; + if( pBuffer == NULL || pdwSizeRead == NULL ) + return E_INVALIDARG; + + *pdwSizeRead = 0; + + if( 0 != mmioGetInfo( m_hmmio, &mmioinfoIn, 0 ) ) + return DXTRACE_ERR( L"mmioGetInfo", E_FAIL ); + + UINT cbDataIn = dwSizeToRead; + if( cbDataIn > m_ck.cksize ) + cbDataIn = m_ck.cksize; + + m_ck.cksize -= cbDataIn; + + for( DWORD cT = 0; cT < cbDataIn; cT++ ) + { + // Copy the bytes from the io to the buffer. + if( mmioinfoIn.pchNext == mmioinfoIn.pchEndRead ) + { + if( 0 != mmioAdvance( m_hmmio, &mmioinfoIn, MMIO_READ ) ) + return DXTRACE_ERR( L"mmioAdvance", E_FAIL ); + + if( mmioinfoIn.pchNext == mmioinfoIn.pchEndRead ) + return DXTRACE_ERR( L"mmioinfoIn.pchNext", E_FAIL ); + } + + // Actual copy. + *( ( BYTE* )pBuffer + cT ) = *( ( BYTE* )mmioinfoIn.pchNext ); + mmioinfoIn.pchNext++; + } + + if( 0 != mmioSetInfo( m_hmmio, &mmioinfoIn, 0 ) ) + return DXTRACE_ERR( L"mmioSetInfo", E_FAIL ); + + *pdwSizeRead = cbDataIn; + + return S_OK; + } +} + + +//----------------------------------------------------------------------------- +// Name: CWaveFile::Close() +// Desc: Closes the wave file +//----------------------------------------------------------------------------- +HRESULT CWaveFile::Close() +{ + if( m_dwFlags == WAVEFILE_READ ) + { + mmioClose( m_hmmio, 0 ); + m_hmmio = NULL; + SAFE_DELETE_ARRAY( m_pResourceBuffer ); + } + else + { + m_mmioinfoOut.dwFlags |= MMIO_DIRTY; + + if( m_hmmio == NULL ) + return CO_E_NOTINITIALIZED; + + if( 0 != mmioSetInfo( m_hmmio, &m_mmioinfoOut, 0 ) ) + return DXTRACE_ERR( L"mmioSetInfo", E_FAIL ); + + // Ascend the output file out of the 'data' chunk -- this will cause + // the chunk size of the 'data' chunk to be written. + if( 0 != mmioAscend( m_hmmio, &m_ck, 0 ) ) + return DXTRACE_ERR( L"mmioAscend", E_FAIL ); + + // Do this here instead... + if( 0 != mmioAscend( m_hmmio, &m_ckRiff, 0 ) ) + return DXTRACE_ERR( L"mmioAscend", E_FAIL ); + + mmioSeek( m_hmmio, 0, SEEK_SET ); + + if( 0 != ( INT )mmioDescend( m_hmmio, &m_ckRiff, NULL, 0 ) ) + return DXTRACE_ERR( L"mmioDescend", E_FAIL ); + + m_ck.ckid = mmioFOURCC( 'f', 'a', 'c', 't' ); + + if( 0 == mmioDescend( m_hmmio, &m_ck, &m_ckRiff, MMIO_FINDCHUNK ) ) + { + DWORD dwSamples = 0; + mmioWrite( m_hmmio, ( HPSTR )&dwSamples, sizeof( DWORD ) ); + mmioAscend( m_hmmio, &m_ck, 0 ); + } + + // Ascend the output file out of the 'RIFF' chunk -- this will cause + // the chunk size of the 'RIFF' chunk to be written. + if( 0 != mmioAscend( m_hmmio, &m_ckRiff, 0 ) ) + return DXTRACE_ERR( L"mmioAscend", E_FAIL ); + + mmioClose( m_hmmio, 0 ); + m_hmmio = NULL; + } + + return S_OK; +} + + +//----------------------------------------------------------------------------- +// Name: CWaveFile::WriteMMIO() +// Desc: Support function for reading from a multimedia I/O stream +// pwfxDest is the WAVEFORMATEX for this new wave file. +// m_hmmio must be valid before calling. This function uses it to +// update m_ckRiff, and m_ck. +//----------------------------------------------------------------------------- +HRESULT CWaveFile::WriteMMIO( WAVEFORMATEX* pwfxDest ) +{ + DWORD dwFactChunk; // Contains the actual fact chunk. Garbage until WaveCloseWriteFile. + MMCKINFO ckOut1; + + dwFactChunk = ( DWORD )-1; + + // Create the output file RIFF chunk of form type 'WAVE'. + m_ckRiff.fccType = mmioFOURCC( 'W', 'A', 'V', 'E' ); + m_ckRiff.cksize = 0; + + if( 0 != mmioCreateChunk( m_hmmio, &m_ckRiff, MMIO_CREATERIFF ) ) + return DXTRACE_ERR( L"mmioCreateChunk", E_FAIL ); + + // We are now descended into the 'RIFF' chunk we just created. + // Now create the 'fmt ' chunk. Since we know the size of this chunk, + // specify it in the MMCKINFO structure so MMIO doesn't have to seek + // back and set the chunk size after ascending from the chunk. + m_ck.ckid = mmioFOURCC( 'f', 'm', 't', ' ' ); + m_ck.cksize = sizeof( PCMWAVEFORMAT ); + + if( 0 != mmioCreateChunk( m_hmmio, &m_ck, 0 ) ) + return DXTRACE_ERR( L"mmioCreateChunk", E_FAIL ); + + // Write the PCMWAVEFORMAT structure to the 'fmt ' chunk if its that type. + if( pwfxDest->wFormatTag == WAVE_FORMAT_PCM ) + { + if( mmioWrite( m_hmmio, ( HPSTR )pwfxDest, + sizeof( PCMWAVEFORMAT ) ) != sizeof( PCMWAVEFORMAT ) ) + return DXTRACE_ERR( L"mmioWrite", E_FAIL ); + } + else + { + // Write the variable length size. + if( ( UINT )mmioWrite( m_hmmio, ( HPSTR )pwfxDest, + sizeof( *pwfxDest ) + pwfxDest->cbSize ) != + ( sizeof( *pwfxDest ) + pwfxDest->cbSize ) ) + return DXTRACE_ERR( L"mmioWrite", E_FAIL ); + } + + // Ascend out of the 'fmt ' chunk, back into the 'RIFF' chunk. + if( 0 != mmioAscend( m_hmmio, &m_ck, 0 ) ) + return DXTRACE_ERR( L"mmioAscend", E_FAIL ); + + // Now create the fact chunk, not required for PCM but nice to have. This is filled + // in when the close routine is called. + ckOut1.ckid = mmioFOURCC( 'f', 'a', 'c', 't' ); + ckOut1.cksize = 0; + + if( 0 != mmioCreateChunk( m_hmmio, &ckOut1, 0 ) ) + return DXTRACE_ERR( L"mmioCreateChunk", E_FAIL ); + + if( mmioWrite( m_hmmio, ( HPSTR )&dwFactChunk, sizeof( dwFactChunk ) ) != + sizeof( dwFactChunk ) ) + return DXTRACE_ERR( L"mmioWrite", E_FAIL ); + + // Now ascend out of the fact chunk... + if( 0 != mmioAscend( m_hmmio, &ckOut1, 0 ) ) + return DXTRACE_ERR( L"mmioAscend", E_FAIL ); + + return S_OK; +} + + +//----------------------------------------------------------------------------- +// Name: CWaveFile::Write() +// Desc: Writes data to the open wave file +//----------------------------------------------------------------------------- +HRESULT CWaveFile::Write( UINT nSizeToWrite, BYTE* pbSrcData, UINT* pnSizeWrote ) +{ + UINT cT; + + if( m_bIsReadingFromMemory ) + return E_NOTIMPL; + if( m_hmmio == NULL ) + return CO_E_NOTINITIALIZED; + if( pnSizeWrote == NULL || pbSrcData == NULL ) + return E_INVALIDARG; + + *pnSizeWrote = 0; + + for( cT = 0; cT < nSizeToWrite; cT++ ) + { + if( m_mmioinfoOut.pchNext == m_mmioinfoOut.pchEndWrite ) + { + m_mmioinfoOut.dwFlags |= MMIO_DIRTY; + if( 0 != mmioAdvance( m_hmmio, &m_mmioinfoOut, MMIO_WRITE ) ) + return DXTRACE_ERR( L"mmioAdvance", E_FAIL ); + } + + *( ( BYTE* )m_mmioinfoOut.pchNext ) = *( ( BYTE* )pbSrcData + cT ); + ( BYTE* )m_mmioinfoOut.pchNext++; + + ( *pnSizeWrote )++; + } + + return S_OK; +} diff --git a/Demos/DX11ClothDemo/DXUT/Optional/SDKwavefile.h b/Demos/DX11ClothDemo/DXUT/Optional/SDKwavefile.h new file mode 100644 index 000000000..921f1d465 --- /dev/null +++ b/Demos/DX11ClothDemo/DXUT/Optional/SDKwavefile.h @@ -0,0 +1,59 @@ +//----------------------------------------------------------------------------- +// File: WaveFile.h +// +// Copyright (c) Microsoft Corp. All rights reserved. +//----------------------------------------------------------------------------- +#ifndef DXUTWAVEFILE_H +#define DXUTWAVEFILE_H + +//----------------------------------------------------------------------------- +// Typing macros +//----------------------------------------------------------------------------- +#define WAVEFILE_READ 1 +#define WAVEFILE_WRITE 2 + +//----------------------------------------------------------------------------- +// Name: class CWaveFile +// Desc: Encapsulates reading or writing sound data to or from a wave file +//----------------------------------------------------------------------------- +class CWaveFile +{ +public: + WAVEFORMATEX* m_pwfx; // Pointer to WAVEFORMATEX structure + HMMIO m_hmmio; // MM I/O handle for the WAVE + MMCKINFO m_ck; // Multimedia RIFF chunk + MMCKINFO m_ckRiff; // Use in opening a WAVE file + DWORD m_dwSize; // The size of the wave file + MMIOINFO m_mmioinfoOut; + DWORD m_dwFlags; + BOOL m_bIsReadingFromMemory; + BYTE* m_pbData; + BYTE* m_pbDataCur; + ULONG m_ulDataSize; + CHAR* m_pResourceBuffer; + +protected: + HRESULT ReadMMIO(); + HRESULT WriteMMIO( WAVEFORMATEX* pwfxDest ); + +public: + CWaveFile(); + ~CWaveFile(); + + HRESULT Open( LPWSTR strFileName, WAVEFORMATEX* pwfx, DWORD dwFlags ); + HRESULT OpenFromMemory( BYTE* pbData, ULONG ulDataSize, WAVEFORMATEX* pwfx, DWORD dwFlags ); + HRESULT Close(); + + HRESULT Read( BYTE* pBuffer, DWORD dwSizeToRead, DWORD* pdwSizeRead ); + HRESULT Write( UINT nSizeToWrite, BYTE* pbData, UINT* pnSizeWrote ); + + DWORD GetSize(); + HRESULT ResetFile(); + WAVEFORMATEX* GetFormat() + { + return m_pwfx; + }; +}; + + +#endif // DXUTWAVEFILE_H diff --git a/Demos/DX11ClothDemo/DXUT/Optional/directx.ico b/Demos/DX11ClothDemo/DXUT/Optional/directx.ico new file mode 100644 index 000000000..bc43c1b20 Binary files /dev/null and b/Demos/DX11ClothDemo/DXUT/Optional/directx.ico differ diff --git a/Demos/DX11ClothDemo/Media/Tiny/Tiny_skin.dds b/Demos/DX11ClothDemo/Media/Tiny/Tiny_skin.dds new file mode 100644 index 000000000..63f9f0eb4 Binary files /dev/null and b/Demos/DX11ClothDemo/Media/Tiny/Tiny_skin.dds differ diff --git a/Demos/DX11ClothDemo/Media/Tiny/tiny.sdkmesh b/Demos/DX11ClothDemo/Media/Tiny/tiny.sdkmesh new file mode 100644 index 000000000..c4a141211 Binary files /dev/null and b/Demos/DX11ClothDemo/Media/Tiny/tiny.sdkmesh differ diff --git a/Demos/DX11ClothDemo/Media/Tiny/tiny.x b/Demos/DX11ClothDemo/Media/Tiny/tiny.x new file mode 100644 index 000000000..17f8d0821 --- /dev/null +++ b/Demos/DX11ClothDemo/Media/Tiny/tiny.x @@ -0,0 +1,53984 @@ +xof 0303txt 0032 +template XSkinMeshHeader { + <3cf169ce-ff7c-44ab-93c0-f78f62d172e2> + WORD nMaxSkinWeightsPerVertex; + WORD nMaxSkinWeightsPerFace; + WORD nBones; +} + +template VertexDuplicationIndices { + + DWORD nIndices; + DWORD nOriginalVertices; + array DWORD indices[nIndices]; +} + +template SkinWeights { + <6f0d123b-bad2-4167-a0d0-80224f25fabb> + STRING transformNodeName; + DWORD nWeights; + array DWORD vertexIndices[nWeights]; + array FLOAT weights[nWeights]; + Matrix4x4 matrixOffset; +} + + +Frame Scene_Root { + + + FrameTransformMatrix { + 1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000;; + } + + Frame body { + + + FrameTransformMatrix { + 1.278853,0.000000,-0.000000,0.000000,0.000000,0.000000,1.123165,0.000000,0.000000,-1.470235,0.000000,0.000000,0.135977,2.027985,133.967667,1.000000;; + } + + Frame { + + + FrameTransformMatrix { + 1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,-0.142114,0.000023,-49.556850,1.000000;; + } + + Mesh { + 4432; + -34.720058;-12.484819;48.088928;, + -25.565304;-9.924385;26.239328;, + -34.612186;-1.674418;34.789925;, + 0.141491;7.622670;25.743210;, + -34.612175;17.843525;39.827816;, + -9.608727;27.597115;38.148296;, + -9.798330;-0.357897;65.599075;, + -34.612179;8.990501;57.540577;, + 0.077733;21.348866;52.164078;, + -11.429913;16.434713;56.577648;, + 0.141490;12.205804;59.792637;, + -17.647087;-15.421692;74.962234;, + 0.139748;-15.745451;70.035706;, + -28.078594;-4.899444;63.550846;, + 0.141491;-27.796947;71.486557;, + -23.021046;8.957323;28.295084;, + 0.141491;-9.487318;27.256748;, + 0.141491;-26.664299;32.989830;, + -11.193695;-27.720463;30.196030;, + -20.920319;-26.441757;33.507900;, + -23.021046;22.545492;38.817097;, + -4.681036;23.543238;52.237732;, + -7.199147;18.381388;29.309721;, + -31.657711;-16.623283;68.586205;, + -7.168321;-28.208626;74.147346;, + -27.854467;-30.229647;72.082443;, + -16.966074;-26.227253;76.131516;, + -33.277031;-27.463528;63.505905;, + -31.930122;-26.942392;51.688797;, + -26.290180;-21.425268;74.259827;, + -32.341526;-14.948000;58.484459;, + -14.724298;0.438756;65.826607;, + -17.688755;-53.253067;77.227638;, + -30.976030;-51.338348;55.580246;, + 0.141491;-50.060425;24.873173;, + -22.127073;-50.465675;31.947027;, + -24.287395;-54.514771;54.652374;, + 0.141374;-56.516960;39.995022;, + 0.141491;-37.227283;70.123970;, + -29.140186;-40.740757;54.994888;, + -18.598015;-63.628139;61.096786;, + -18.580341;-63.659996;42.089684;, + 0.141491;-28.374607;32.989838;, + -11.193696;-29.430769;30.196033;, + -20.920321;-28.152065;33.507904;, + -25.494289;-63.762321;51.551601;, + 0.102538;-63.445549;68.379417;, + 0.102538;-63.638348;37.841175;, + -16.503817;-36.463478;72.030708;, + -24.298424;-39.992043;64.994545;, + -14.590791;-42.557045;68.336487;, + -26.760902;-31.939959;72.082443;, + -16.966076;-27.937576;75.155312;, + -32.183464;-29.173838;63.505913;, + -31.930124;-28.652702;51.688805;, + -19.449144;-51.888283;62.452682;, + -6.438459;-49.943382;70.242874;, + 0.141491;-49.688911;68.965103;, + 0.141491;-29.773867;26.064960;, + -12.711588;-29.992414;25.556252;, + -23.846188;-30.195030;29.093178;, + -32.848045;-32.305534;51.981480;, + -30.142681;-11.598551;37.311020;, + -28.347116;-31.250282;40.537331;, + -26.551552;-50.902012;43.763638;, + -24.332394;-52.295708;66.403946;, + -26.425222;-28.402384;42.598354;, + -32.056793;-28.913269;57.597359;, + -34.612183;9.271671;35.005108;, + -34.612183;13.697768;49.116459;, + -34.666122;-2.091087;56.933292;, + -34.666122;-7.473567;40.417480;, + -33.602604;-10.886051;47.766304;, + -33.245544;-1.592087;55.511299;, + -33.454399;8.516764;56.378914;, + -33.377022;12.971798;48.765106;, + -33.285355;-1.230055;35.845985;, + -33.422455;-6.066209;41.124596;, + -33.326355;16.538502;40.337154;, + -33.380333;8.824398;35.941063;, + 0.141491;-46.403996;39.221611;, + -5.525791;-46.932079;37.824707;, + -10.389103;-46.292725;39.480644;, + -20.399273;-44.550671;45.133575;, + -24.509207;-50.845016;55.877068;, + 0.141491;17.711647;27.783634;, + 0.077734;27.263643;33.720470;, + -5.109205;27.415857;34.161194;, + -9.139874;26.594124;45.452682;, + 0.141491;22.863007;31.002354;, + -6.363874;23.153360;30.623175;, + -9.748887;22.893982;32.226307;, + -13.398946;24.794630;34.246376;, + -16.294899;25.090145;38.449425;, + -18.686239;24.355274;46.119999;, + -13.692654;24.681557;52.324207;, + -8.242743;20.971973;54.090229;, + -3.765221;20.286398;55.975685;, + 0.141491;18.192966;54.231785;, + -10.778057;22.307632;52.895199;, + -8.655515;-23.637917;29.537901;, + -19.722260;-1.585354;65.224693;, + -20.110298;5.311386;60.448208;, + -21.278301;13.060091;57.191551;, + -19.918121;19.050785;53.541157;, + -15.815639;16.328318;56.204815;, + -10.153260;28.853861;37.612610;, + -11.867444;17.503666;57.664883;, + -15.160084;1.466462;66.822762;, + 0.141491;28.542030;33.277145;, + -5.618525;28.677891;33.713886;, + -9.625071;27.664139;46.092670;, + 0.141491;24.137672;30.525173;, + -6.801406;24.428030;30.145996;, + -10.186419;24.168652;31.749128;, + -13.836477;26.069300;33.769196;, + -16.732431;26.364815;37.972244;, + -19.123772;25.424227;46.716579;, + -11.215589;23.376585;53.491779;, + -20.159792;-0.516401;65.821274;, + -20.547831;6.380339;61.044788;, + -21.715834;14.129044;57.788132;, + -20.355654;20.119738;54.137737;, + -16.253172;17.397270;56.801395;, + -29.388227;-40.601273;63.974194;, + -30.997221;-35.165527;63.780437;, + -29.736418;-23.496841;70.352409;, + -30.377008;-28.942865;68.092697;, + -32.118473;-39.484562;59.515316;, + -29.846169;-43.697968;61.553284;, + -28.709795;-30.444099;72.554062;, + -30.243555;-40.815727;64.445816;, + -31.852549;-35.379982;64.252060;, + -30.591745;-23.711294;70.824028;, + -31.232336;-29.157318;68.564316;, + -32.973801;-39.699017;59.986935;, + -30.701496;-43.912422;62.024902;, + 35.004288;-12.484816;48.088928;, + 25.849533;-9.924379;26.239330;, + 34.896416;-1.674414;34.789925;, + 34.896404;17.843529;39.827820;, + 9.931857;27.639982;38.133949;, + 10.079079;-0.357885;66.089737;, + 34.896408;8.990503;57.540577;, + 11.714142;16.434715;57.068302;, + 17.931316;-15.421690;74.962234;, + 28.362823;-4.899441;63.550846;, + 23.305275;8.957328;28.295086;, + 11.477924;-27.720457;30.196030;, + 21.204548;-26.441751;33.507900;, + 23.305275;22.545494;38.817101;, + 4.827426;23.522514;52.188004;, + 7.483376;18.381392;29.309723;, + 31.941940;-16.623281;68.586205;, + 7.452550;-28.208622;74.147346;, + 28.138697;-30.229643;72.082443;, + 17.250303;-26.227251;76.131516;, + 33.561260;-27.463524;63.505905;, + 32.214352;-26.942389;51.688797;, + 26.574409;-21.425266;74.259827;, + 32.625755;-14.947996;58.484459;, + 15.005043;0.438756;66.317261;, + 17.972984;-53.253063;77.227638;, + 31.260260;-51.338341;55.580242;, + 22.411303;-50.465668;31.947027;, + 24.562241;-54.514763;54.652370;, + 29.424416;-40.740753;54.994888;, + 18.770283;-63.633057;61.106705;, + 18.773201;-63.677704;42.028572;, + 11.477925;-29.430763;30.196033;, + 21.204550;-28.152060;33.507904;, + 25.705898;-63.638660;51.490501;, + 16.788046;-36.463474;72.030708;, + 24.582653;-39.992039;64.994545;, + 14.875020;-42.557041;68.336487;, + 27.045132;-31.939955;72.082443;, + 17.250305;-27.937574;75.155312;, + 32.467693;-29.173834;63.505913;, + 32.214352;-28.652699;51.688805;, + 19.723988;-51.888283;62.452682;, + 6.722688;-49.943378;70.242874;, + 12.995817;-29.992407;25.556252;, + 24.130417;-30.195024;29.093178;, + 33.132275;-32.305531;51.981480;, + 30.426910;-11.598546;37.311020;, + 28.631346;-31.250277;40.537331;, + 26.835781;-50.902004;43.763638;, + 24.616623;-52.295704;66.403946;, + 26.709452;-28.402378;42.598354;, + 32.341022;-28.913265;57.597359;, + 34.896412;9.271675;35.005108;, + 34.896412;13.697771;49.116459;, + 34.950352;-2.091084;56.933292;, + 34.950352;-7.473563;40.417480;, + 33.931534;-10.798729;47.691635;, + 33.266479;-1.659648;55.141335;, + 33.733215;8.483885;56.324486;, + 33.578400;13.114620;48.755165;, + 33.395126;-1.314395;35.941048;, + 33.696419;-6.417687;40.866890;, + 33.477127;16.479158;40.343475;, + 33.569466;8.843540;35.935562;, + 5.810019;-46.932072;37.824707;, + 10.673332;-46.292717;39.480644;, + 20.683502;-44.550663;45.133575;, + 24.793436;-50.845009;55.877064;, + 5.227813;27.441788;34.143456;, + 9.646603;26.610264;45.446602;, + 6.648103;23.153364;30.623177;, + 10.033116;22.893986;32.226311;, + 13.683175;24.794634;34.246380;, + 16.579128;25.090147;38.449429;, + 18.970469;24.355276;46.119999;, + 13.976883;24.681559;52.324207;, + 8.526972;20.971975;54.090229;, + 4.049450;20.286400;55.975685;, + 11.062286;22.307634;52.895199;, + 8.939744;-23.637911;29.537901;, + 20.006489;-1.585352;65.224693;, + 20.394527;5.311388;60.448208;, + 21.562531;13.060093;57.191551;, + 20.202351;19.050787;53.541157;, + 16.099869;16.328320;56.204815;, + 10.437490;28.853863;37.612614;, + 12.151673;17.503668;57.664883;, + 15.444313;1.466464;66.822762;, + 5.902754;28.677893;33.713890;, + 9.909300;27.664141;46.092674;, + 7.085635;24.428034;30.145998;, + 10.470648;24.168655;31.749130;, + 14.120707;26.069304;33.769199;, + 17.016661;26.364817;37.972248;, + 19.408001;25.424229;46.716579;, + 11.499818;23.376587;53.491779;, + 20.444021;-0.516399;65.821274;, + 20.832060;6.380341;61.044788;, + 22.000063;14.129045;57.788132;, + 20.639883;20.119740;54.137737;, + 16.537401;17.397272;56.801395;, + 29.672457;-40.601269;63.974190;, + 31.281450;-35.165524;63.780437;, + 30.020647;-23.496838;70.352409;, + 30.661238;-28.942862;68.092697;, + 32.402702;-39.484558;59.515316;, + 30.130398;-43.697964;61.553280;, + 28.994024;-30.444096;72.554062;, + 30.527784;-40.815723;64.445816;, + 32.136776;-35.379978;64.252060;, + 30.875975;-23.711290;70.824028;, + 31.516565;-29.157314;68.564316;, + 33.258030;-39.699013;59.986935;, + 30.985725;-43.912418;62.024899;, + 0.100870;-93.627769;27.356903;, + 0.100870;-80.794510;68.288246;, + -41.760616;-103.151527;46.673916;, + -24.713787;-129.635101;24.771605;, + -18.089975;-112.633553;62.624924;, + 0.100870;-118.350113;30.024460;, + -5.798617;-124.775063;56.960815;, + -25.173319;-90.214371;26.265825;, + -37.889961;-84.783730;46.673920;, + -4.658672;-143.854736;42.160900;, + -33.648396;-119.084198;29.032738;, + -19.782078;-86.427551;62.399220;, + 0.100870;-105.624802;63.766800;, + -33.875122;-127.515556;35.677757;, + -41.014412;-121.305328;41.175835;, + -15.635758;-212.122009;56.766579;, + -11.671675;-229.887054;44.415508;, + -11.967894;-201.991714;48.101704;, + -33.998722;-220.566071;61.510651;, + -39.528782;-322.910553;59.808899;, + -23.342522;-325.221313;36.655556;, + -35.048260;-213.572937;32.058167;, + -43.113548;-194.904678;46.172501;, + -43.619999;-206.619293;50.933479;, + -46.585148;-323.985016;35.078949;, + -34.708954;-324.151184;32.796345;, + -44.766525;-223.910660;41.391571;, + -13.351915;-168.910248;60.740967;, + -8.177140;-173.738678;44.589825;, + -22.042976;-120.057648;62.105083;, + -30.082495;-176.538712;60.086678;, + -23.352434;-144.066956;25.433430;, + -38.057816;-164.488510;57.655933;, + -25.025139;-183.704147;31.840212;, + -41.240711;-158.109726;38.305466;, + -31.089090;-190.013657;63.028923;, + -27.205957;-198.419052;34.729908;, + -35.127117;-120.041656;57.534679;, + -36.447479;-347.590393;81.989037;, + -32.971939;-348.840668;75.068268;, + -30.483822;-349.513580;64.542366;, + -30.277090;-349.285034;45.291451;, + -30.731056;-349.140869;32.597919;, + -50.995792;-347.566376;80.111809;, + -54.063526;-348.805878;72.346741;, + -53.720398;-349.475220;61.544106;, + -49.480873;-349.253357;42.813530;, + -44.998409;-349.114563;30.769142;, + -37.752792;-344.579865;81.882141;, + -33.638000;-341.897522;75.396339;, + -32.718132;-336.016754;68.786903;, + -25.375702;-326.803925;43.166012;, + -50.401588;-344.387238;80.484764;, + -53.600422;-344.479889;72.777603;, + -52.430077;-341.348145;62.750374;, + -52.006966;-325.347748;41.525673;, + -37.431126;-348.022339;28.784142;, + -30.811893;-349.229279;40.184383;, + -47.579365;-349.201599;38.020824;, + -23.738852;-160.860565;27.560469;, + -32.426979;-277.766174;32.203541;, + -24.943554;-117.940918;21.795742;, + -27.146837;-312.724365;57.102558;, + -41.869755;-312.813507;56.621277;, + -19.773428;-311.714844;51.152798;, + -17.516390;-311.220673;43.257233;, + -53.350098;-311.978485;48.287319;, + -24.548374;-311.052429;38.861855;, + -49.043320;-311.481262;40.787697;, + -36.779060;-311.947937;34.579979;, + -13.444867;-241.724686;43.812698;, + -18.083738;-235.404388;32.990765;, + -39.270157;-235.407135;32.086258;, + -18.709482;-278.846039;51.472935;, + -47.800510;-278.654022;48.696930;, + -15.278575;-278.076538;41.723305;, + -42.724228;-277.794373;38.664391;, + -47.843460;-278.215302;43.605659;, + -37.205242;-278.835236;54.105011;, + -21.722435;-277.300140;35.149902;, + -42.656788;-120.929993;49.355263;, + -17.315336;-184.822891;56.888432;, + -37.002441;-178.638748;55.923828;, + -14.539805;-213.740479;34.164742;, + -28.676964;-235.063950;29.100901;, + -26.290127;-159.034851;62.359310;, + -44.822357;-162.486374;47.417561;, + -26.283358;-192.193878;33.507416;, + -27.280354;-203.100555;31.769535;, + -26.421682;-194.991638;31.950752;, + -25.691517;-188.165451;31.257717;, + -32.553154;-207.822937;62.845280;, + -38.257362;-201.972275;59.263458;, + -23.653395;-201.105835;63.411591;, + -25.556084;-324.127594;55.527039;, + -37.508007;-327.823730;63.943375;, + -48.660114;-323.846619;52.634663;, + -43.124073;-327.569916;63.163582;, + -46.985233;-330.924652;60.877213;, + -47.738998;-332.348511;57.905354;, + -48.218380;-333.043976;53.745155;, + -46.926067;-335.870056;46.077358;, + -46.011299;-336.928101;39.876133;, + -39.092888;-333.629852;32.004887;, + -42.781075;-334.302216;33.467194;, + -32.159611;-328.701721;61.163334;, + -32.027699;-330.586823;57.891068;, + -30.829683;-335.353180;51.935188;, + -30.289175;-336.679779;37.674358;, + -33.346500;-333.002716;32.172970;, + -30.620396;-337.228912;46.045479;, + -30.907063;-337.423279;41.478359;, + -30.290890;-334.903290;34.539791;, + -36.497189;-333.552704;31.073109;, + -44.659866;-335.766113;36.478382;, + -37.186310;-327.136566;64.882172;, + -43.760216;-326.861603;63.886238;, + -48.019054;-330.368195;61.125313;, + -48.864738;-331.923981;57.957317;, + -49.377052;-332.709412;53.701771;, + -48.091980;-335.719604;45.783157;, + -47.151276;-336.782074;39.490070;, + -39.525562;-333.437286;30.882923;, + -43.645668;-334.103790;32.636833;, + -31.204782;-328.177948;61.712044;, + -30.816942;-330.532898;57.981380;, + -29.621853;-335.235016;52.022976;, + -29.081070;-336.669037;37.797260;, + -32.739624;-332.828003;31.129665;, + -29.406822;-337.163391;46.021709;, + -29.694448;-337.386993;41.543434;, + -29.145948;-334.835358;34.136993;, + -36.550041;-333.356628;29.870857;, + -45.758202;-335.587708;35.996567;, + -45.427898;-130.595413;48.340775;, + -42.336990;-130.488724;54.945263;, + -37.678047;-130.227783;58.228161;, + -45.523903;-130.013565;42.878948;, + -41.142269;-130.155960;39.554146;, + -24.386381;-143.741119;62.231689;, + -32.621887;-188.625381;36.814716;, + -11.541974;-184.862228;45.883656;, + -41.620197;-179.552460;46.748608;, + -39.826946;-174.615158;38.212673;, + -43.535854;-120.777649;40.070557;, + -22.938877;-119.976494;64.392769;, + -30.902096;-176.652710;61.614151;, + -42.871780;-158.253891;37.723408;, + -36.567158;-119.911232;59.557304;, + -45.200268;-120.584846;49.944744;, + -38.287941;-178.810394;57.081314;, + -27.014326;-159.047546;63.937130;, + -42.580544;-130.073517;38.311958;, + -24.975321;-143.678299;63.863117;, + -43.319576;-179.781570;47.035759;, + -41.500957;-174.797165;37.779552;, + -23.619888;-130.097656;63.516205;, + -38.861588;-164.565750;58.167274;, + -45.622833;-162.561295;47.934299;, + -46.311371;-130.569748;48.698330;, + -38.258266;-130.203033;58.985287;, + -46.929386;-129.807648;42.502537;, + -39.136471;-178.898392;57.512791;, + -43.810833;-129.927979;37.517529;, + -44.150005;-179.891830;47.497341;, + -24.121252;-130.069931;64.903618;, + -43.136353;-130.426819;55.607552;, + -47.307560;-130.516037;48.990032;, + -38.841251;-130.165939;59.846836;, + 0.100870;-113.035980;52.159779;, + -42.175369;-334.770050;70.948944;, + -47.093388;-334.957916;67.363968;, + -35.253540;-336.022400;70.615288;, + -50.392654;-342.841522;46.961720;, + -31.481352;-343.813690;66.423645;, + -14.078679;-70.624992;36.359470;, + 0.100870;-70.522980;34.969410;, + -10.657997;-70.656097;64.141533;, + 0.100870;-70.455383;68.554764;, + -20.407236;-70.663857;37.704983;, + -25.309130;-70.709183;43.680515;, + -20.123388;-70.712914;61.395264;, + -25.333038;-70.735931;56.047955;, + -29.135050;-70.748413;50.137466;, + -3.877978;-63.520813;66.895554;, + -3.855402;-70.482147;66.867348;, + -19.676884;-63.736073;61.580589;, + -19.676886;-63.736065;41.365475;, + -27.052189;-63.743755;51.457161;, + 0.100870;-63.591896;69.324707;, + 0.100870;-63.725189;37.057167;, + -14.884621;-70.698990;35.456879;, + 0.100870;-70.596962;33.974888;, + -11.246261;-70.730103;64.830460;, + 0.100870;-70.535385;69.452461;, + -21.615906;-70.737846;36.711586;, + -26.829739;-70.783180;43.067379;, + -21.313995;-70.786911;61.909431;, + -26.855167;-70.809929;56.221832;, + -30.899126;-70.822411;49.935226;, + -4.034785;-63.594818;67.636086;, + -3.998070;-70.562149;67.711349;, + 0.100870;-63.526737;69.920647;, + 0.100870;-70.464218;70.091736;, + -4.383465;-63.529644;68.232056;, + -4.359452;-70.490974;68.296936;, + -3.386524;-75.591728;67.510147;, + -2.776832;-102.840965;65.045303;, + 0.100870;-80.880516;69.142647;, + 0.100870;-105.710800;64.621178;, + -3.516490;-75.677727;68.364532;, + -2.906797;-102.926964;65.899696;, + -22.798948;-79.832886;31.235064;, + -25.056231;-101.901466;22.759089;, + -26.274025;-98.021988;61.838871;, + -12.963859;-92.037811;25.319746;, + -13.494529;-98.258217;23.341805;, + -14.609492;-108.732101;22.072079;, + -14.476962;-118.111931;22.543592;, + -14.431333;-124.958817;24.257095;, + -14.850490;-137.747299;29.875664;, + -30.438990;-82.029594;36.202908;, + -32.929981;-95.527786;32.765190;, + -12.144010;-151.520721;33.476109;, + -14.428178;-166.866211;34.299915;, + -16.716248;-179.708649;34.860874;, + -32.423717;-145.852829;29.285240;, + -35.720222;-158.855484;33.087280;, + -34.360893;-178.742081;33.996445;, + -9.632311;-81.213554;66.041458;, + -27.866913;-87.057098;57.616055;, + -14.684381;-100.398880;63.420395;, + -19.517466;-85.226929;63.991261;, + -40.065174;-318.672638;64.375366;, + -35.993942;-318.696655;64.690056;, + -31.878841;-318.817719;31.286600;, + -36.170387;-318.762360;30.458429;, + -26.210686;-317.713867;48.030136;, + -25.361750;-319.393433;40.717945;, + -24.732561;-319.150665;36.669399;, + -48.911896;-319.507538;43.118351;, + -47.664860;-317.929291;52.098011;, + -44.133797;-318.262634;57.600853;, + -27.271666;-318.973633;33.779339;, + -40.532146;-318.881866;32.536850;, + -45.276333;-318.965332;34.026871;, + -29.160122;-318.455261;60.501675;, + -26.977306;-318.229187;56.671257;, + -46.791954;-319.251740;38.820690;, + -35.793861;-302.649597;62.947060;, + -26.227007;-302.503235;60.257622;, + -43.178516;-302.253784;56.495960;, + -39.922192;-302.337189;60.689114;, + -44.792736;-300.990540;35.366993;, + -47.422535;-301.286255;40.386948;, + -36.019176;-300.612274;28.811062;, + -32.605831;-300.673798;29.757746;, + -23.851152;-301.120178;37.022240;, + -27.166359;-300.722290;30.436232;, + -23.590527;-301.899200;50.070431;, + -21.858656;-301.316620;40.265823;, + -24.232523;-302.246063;55.899723;, + -48.612350;-301.920135;51.038540;, + -41.315552;-300.854462;32.999699;, + -48.634773;-301.610474;45.850082;, + -40.141144;-255.114700;53.952099;, + -36.110058;-255.272278;56.438984;, + -23.373695;-253.775467;31.533113;, + -30.086535;-252.832504;28.237844;, + -19.459860;-253.800369;31.844227;, + -25.706972;-255.490616;61.349560;, + -17.805582;-255.126160;53.579521;, + -46.995369;-254.835419;49.536797;, + -47.021446;-254.582092;45.376308;, + -46.248730;-254.337875;41.345463;, + -43.542858;-254.140945;38.043243;, + -16.171713;-254.259338;39.300293;, + -14.507923;-254.391815;41.434330;, + -15.366711;-254.579529;44.539597;, + -40.648895;-253.837158;32.980343;, + -36.819706;-253.722290;30.997900;, + -12.445428;-224.292206;47.498665;, + -15.667706;-223.691574;37.720806;, + -18.508575;-223.414154;32.083805;, + -35.438473;-223.276321;30.279057;, + -14.603230;-224.687500;54.050613;, + -24.829622;-225.708954;61.528713;, + -15.676450;-224.947296;58.346878;, + -40.303440;-224.300476;58.010777;, + -46.628914;-224.518768;52.147167;, + -34.276493;-225.076096;60.967789;, + -25.784931;-212.417236;28.070059;, + -27.219553;-222.078049;29.233458;, + -25.575615;-279.096832;57.975468;, + -42.281010;-210.077301;42.464180;, + -12.848580;-215.346298;46.368130;, + -15.573069;-134.748444;59.732529;, + -7.157517;-152.749008;49.893009;, + -23.513350;-142.361069;25.355200;, + -5.245355;-134.035217;49.777805;, + -14.712274;-189.112885;40.448975;, + -16.435289;-199.126770;56.824585;, + 0.100870;-77.831696;33.694950;, + 0.100870;-107.150894;26.804878;, + -13.586044;-80.087227;31.121128;, + 41.958218;-103.151527;46.673912;, + 24.911388;-129.635101;24.771599;, + 18.287577;-112.633553;62.624916;, + 5.996217;-124.775055;56.960815;, + 25.370918;-90.214363;26.265820;, + 38.087563;-84.783722;46.673916;, + 4.856273;-143.854736;42.160900;, + 33.845997;-119.084190;29.032734;, + 19.979677;-86.427544;62.399212;, + 34.072723;-127.515556;35.677750;, + 41.212013;-121.305321;41.175831;, + 15.833360;-212.121994;56.766575;, + 11.869275;-229.887054;44.415504;, + 12.165494;-201.991699;48.101700;, + 34.196323;-220.566040;61.510643;, + 39.726387;-322.910522;59.808895;, + 23.540123;-325.221313;36.655552;, + 35.245861;-213.572937;32.058163;, + 43.311150;-194.904678;46.172497;, + 43.817604;-206.619293;50.933479;, + 46.782749;-323.985016;35.078949;, + 34.906559;-324.151184;32.796345;, + 44.964127;-223.910675;41.391571;, + 13.549516;-168.910248;60.740959;, + 8.374740;-173.738678;44.589821;, + 22.240578;-120.057648;62.105080;, + 30.280094;-176.538696;60.086674;, + 23.550035;-144.066940;25.433426;, + 38.255417;-164.488495;57.655930;, + 25.222740;-183.704147;31.840208;, + 41.438313;-158.109711;38.305462;, + 31.286692;-190.013657;63.028919;, + 27.403559;-198.419037;34.729908;, + 35.324718;-120.041656;57.534676;, + 36.645081;-347.590363;81.989037;, + 33.169540;-348.840668;75.068268;, + 30.681425;-349.513580;64.542366;, + 30.474693;-349.285034;45.291451;, + 30.928658;-349.140839;32.597916;, + 51.193394;-347.566376;80.111809;, + 54.261131;-348.805878;72.346741;, + 53.918003;-349.475220;61.544106;, + 49.678474;-349.253357;42.813526;, + 45.196014;-349.114563;30.769142;, + 37.950394;-344.579834;81.882141;, + 33.835602;-341.897522;75.396339;, + 32.915733;-336.016724;68.786911;, + 25.573301;-326.803894;43.166008;, + 50.599190;-344.387238;80.484764;, + 53.798027;-344.479858;72.777603;, + 52.627678;-341.348145;62.750374;, + 52.204571;-325.347748;41.525669;, + 37.628727;-348.022308;28.784140;, + 31.009497;-349.229279;40.184380;, + 47.776966;-349.201569;38.020821;, + 23.936451;-160.860550;27.560463;, + 32.624580;-277.766174;32.203537;, + 25.141153;-117.940918;21.795738;, + 27.344439;-312.724365;57.102554;, + 42.067356;-312.813507;56.621273;, + 19.971029;-311.714844;51.152798;, + 17.713989;-311.220673;43.257229;, + 53.547699;-311.978485;48.287315;, + 24.745977;-311.052429;38.861851;, + 49.240925;-311.481262;40.787693;, + 36.976662;-311.947937;34.579979;, + 13.642469;-241.724686;43.812695;, + 18.281340;-235.404388;32.990765;, + 39.467758;-235.407135;32.086258;, + 18.907082;-278.846008;51.472931;, + 47.998108;-278.654022;48.696930;, + 15.476175;-278.076508;41.723305;, + 42.921829;-277.794373;38.664387;, + 48.041061;-278.215271;43.605659;, + 37.402847;-278.835236;54.105007;, + 21.920036;-277.300110;35.149902;, + 42.854393;-120.929985;49.355259;, + 17.512936;-184.822891;56.888428;, + 37.200043;-178.638748;55.923824;, + 14.737406;-213.740463;34.164738;, + 28.874565;-235.063934;29.100899;, + 26.487728;-159.034851;62.359303;, + 45.019958;-162.486359;47.417557;, + 26.480961;-192.193863;33.507412;, + 27.477957;-203.100555;31.769531;, + 26.619284;-194.991638;31.950748;, + 25.889118;-188.165451;31.257713;, + 32.750755;-207.822937;62.845276;, + 38.454964;-201.972275;59.263454;, + 23.850996;-201.105820;63.411583;, + 25.753687;-324.127563;55.527039;, + 37.705608;-327.823700;63.943378;, + 48.857719;-323.846619;52.634659;, + 43.321674;-327.569916;63.163586;, + 47.182835;-330.924622;60.877216;, + 47.936604;-332.348511;57.905350;, + 48.415981;-333.043976;53.745152;, + 47.123669;-335.870056;46.077354;, + 46.208900;-336.928101;39.876129;, + 39.290493;-333.629852;32.004887;, + 42.978680;-334.302216;33.467194;, + 32.357216;-328.701721;61.163334;, + 32.225300;-330.586823;57.891064;, + 31.027285;-335.353180;51.935184;, + 30.486776;-336.679749;37.674358;, + 33.544102;-333.002716;32.172966;, + 30.817997;-337.228882;46.045475;, + 31.104664;-337.423279;41.478355;, + 30.488491;-334.903290;34.539787;, + 36.694790;-333.552673;31.073109;, + 44.857464;-335.766083;36.478382;, + 37.383911;-327.136536;64.882172;, + 43.957817;-326.861603;63.886242;, + 48.216656;-330.368195;61.125313;, + 49.062340;-331.923950;57.957314;, + 49.574654;-332.709381;53.701767;, + 48.289585;-335.719604;45.783157;, + 47.348877;-336.782074;39.490070;, + 39.723164;-333.437256;30.882921;, + 43.843269;-334.103760;32.636829;, + 31.402386;-328.177948;61.712044;, + 31.014545;-330.532867;57.981380;, + 29.819454;-335.234985;52.022972;, + 29.278673;-336.669006;37.797256;, + 32.937225;-332.828003;31.129665;, + 29.604424;-337.163391;46.021706;, + 29.892050;-337.386993;41.543430;, + 29.343552;-334.835358;34.136990;, + 36.747643;-333.356598;29.870857;, + 45.955803;-335.587677;35.996567;, + 45.625500;-130.595398;48.340771;, + 42.534595;-130.488724;54.945255;, + 37.875648;-130.227783;58.228153;, + 45.721504;-130.013565;42.878941;, + 41.339870;-130.155960;39.554138;, + 24.583982;-143.741119;62.231686;, + 32.819485;-188.625366;36.814716;, + 11.739574;-184.862213;45.883652;, + 41.817802;-179.552460;46.748608;, + 40.024551;-174.615143;38.212673;, + 43.733459;-120.777641;40.070549;, + 23.136478;-119.976486;64.392761;, + 31.099697;-176.652695;61.614147;, + 43.069382;-158.253876;37.723404;, + 36.764759;-119.911224;59.557301;, + 45.397869;-120.584854;49.944736;, + 38.485538;-178.810379;57.081314;, + 27.211926;-159.047531;63.937126;, + 42.778149;-130.073502;38.311954;, + 25.172922;-143.678284;63.863113;, + 43.517178;-179.781570;47.035755;, + 41.698555;-174.797165;37.779549;, + 23.817490;-130.097641;63.516201;, + 39.059189;-164.565750;58.167271;, + 45.820435;-162.561295;47.934296;, + 46.508972;-130.569733;48.698326;, + 38.455868;-130.203018;58.985283;, + 47.126987;-129.807632;42.502533;, + 39.334072;-178.898392;57.512791;, + 44.008434;-129.927979;37.517525;, + 44.347607;-179.891815;47.497337;, + 24.318851;-130.069931;64.903610;, + 43.333954;-130.426819;55.607544;, + 47.505161;-130.516037;48.990028;, + 39.038853;-130.165924;59.846832;, + 42.372971;-334.770050;70.948944;, + 47.290989;-334.957916;67.363968;, + 35.451141;-336.022369;70.615288;, + 50.590260;-342.841522;46.961720;, + 31.678953;-343.813690;66.423653;, + 14.276281;-70.624985;36.359463;, + 10.855597;-70.656097;64.141525;, + 20.604836;-70.663849;37.704975;, + 25.506731;-70.709175;43.680508;, + 20.320988;-70.712906;61.395260;, + 25.530638;-70.735931;56.047947;, + 29.332651;-70.748413;50.137463;, + 4.075578;-63.520775;66.895554;, + 4.053002;-70.482147;66.867340;, + 19.874485;-63.736065;61.580585;, + 19.874485;-63.736057;41.365467;, + 27.249788;-63.743755;51.457157;, + 15.082223;-70.698982;35.456871;, + 11.443861;-70.730095;64.830460;, + 21.813507;-70.737846;36.711578;, + 27.027336;-70.783173;43.067371;, + 21.511593;-70.786903;61.909428;, + 27.052767;-70.809921;56.221828;, + 31.096729;-70.822411;49.935223;, + 4.232385;-63.594814;67.636078;, + 4.195670;-70.562141;67.711349;, + 4.581065;-63.529640;68.232048;, + 4.557052;-70.490967;68.296928;, + 3.584123;-75.591721;67.510139;, + 2.974431;-102.840958;65.045296;, + 3.714089;-75.677727;68.364525;, + 3.104397;-102.926956;65.899689;, + 22.996550;-79.832886;31.235056;, + 25.253832;-101.901466;22.759085;, + 26.471624;-98.021980;61.838863;, + 13.161459;-92.037811;25.319742;, + 13.692128;-98.258209;23.341801;, + 14.807093;-108.732094;22.072075;, + 14.674563;-118.111923;22.543589;, + 14.628933;-124.958817;24.257090;, + 15.048090;-137.747284;29.875660;, + 30.636589;-82.029587;36.202900;, + 33.127583;-95.527786;32.765182;, + 12.341610;-151.520721;33.476105;, + 14.625778;-166.866196;34.299911;, + 16.913849;-179.708649;34.860870;, + 32.621319;-145.852814;29.285236;, + 35.917824;-158.855484;33.087276;, + 34.558495;-178.742081;33.996445;, + 9.829911;-81.213554;66.041458;, + 28.064514;-87.057091;57.616047;, + 14.881982;-100.398872;63.420387;, + 19.715067;-85.226913;63.991257;, + 40.262775;-318.672607;64.375366;, + 36.191544;-318.696625;64.690056;, + 32.076443;-318.817719;31.286600;, + 36.367989;-318.762360;30.458429;, + 26.408287;-317.713867;48.030132;, + 25.559353;-319.393433;40.717941;, + 24.930161;-319.150635;36.669395;, + 49.109501;-319.507538;43.118351;, + 47.862465;-317.929291;52.098011;, + 44.331398;-318.262634;57.600853;, + 27.469267;-318.973633;33.779335;, + 40.729748;-318.881866;32.536850;, + 45.473934;-318.965332;34.026867;, + 29.357723;-318.455261;60.501675;, + 27.174908;-318.229156;56.671257;, + 46.989555;-319.251740;38.820686;, + 35.991463;-302.649597;62.947060;, + 26.424608;-302.503204;60.257622;, + 43.376122;-302.253784;56.495960;, + 40.119797;-302.337189;60.689114;, + 44.990337;-300.990540;35.366989;, + 47.620136;-301.286255;40.386948;, + 36.216778;-300.612274;28.811060;, + 32.803436;-300.673798;29.757744;, + 24.048756;-301.120178;37.022236;, + 27.363960;-300.722260;30.436230;, + 23.788128;-301.899200;50.070427;, + 22.056257;-301.316620;40.265823;, + 24.430126;-302.246063;55.899719;, + 48.809952;-301.920135;51.038536;, + 41.513157;-300.854462;32.999695;, + 48.832378;-301.610474;45.850079;, + 40.338745;-255.114685;53.952095;, + 36.307659;-255.272247;56.438980;, + 23.571297;-253.775452;31.533110;, + 30.284136;-252.832504;28.237841;, + 19.657463;-253.800369;31.844225;, + 25.904573;-255.490616;61.349560;, + 18.003183;-255.126160;53.579521;, + 47.192974;-254.835419;49.536793;, + 47.219048;-254.582077;45.376305;, + 46.446331;-254.337875;41.345459;, + 43.740459;-254.140930;38.043240;, + 16.369314;-254.259338;39.300289;, + 14.705525;-254.391815;41.434326;, + 15.564311;-254.579514;44.539597;, + 40.846497;-253.837143;32.980343;, + 37.017307;-253.722290;30.997898;, + 12.643028;-224.292191;47.498661;, + 15.865307;-223.691589;37.720802;, + 18.706177;-223.414139;32.083801;, + 35.636074;-223.276321;30.279055;, + 14.800831;-224.687500;54.050610;, + 25.027224;-225.708954;61.528706;, + 15.874051;-224.947296;58.346874;, + 40.501038;-224.300461;58.010777;, + 46.826515;-224.518753;52.147167;, + 34.474094;-225.076096;60.967781;, + 25.982531;-212.417236;28.070055;, + 27.417156;-222.078049;29.233456;, + 25.773218;-279.096802;57.975464;, + 42.478611;-210.077286;42.464176;, + 13.046181;-215.346298;46.368130;, + 15.770669;-134.748428;59.732525;, + 7.355118;-152.749008;49.893005;, + 23.710951;-142.361053;25.355196;, + 5.442955;-134.035202;49.777802;, + 14.909875;-189.112885;40.448971;, + 16.632891;-199.126770;56.824585;, + 13.783645;-80.087219;31.121120;, + -8.380501;25.169817;49.343712;, + 8.527061;25.316885;48.399185;, + 12.786732;-55.480198;44.790428;, + -12.997930;-55.440056;45.084347;, + 60.698940;10.489414;61.040886;, + 59.605530;7.137096;70.365372;, + 36.555004;14.780283;44.255161;, + 50.340195;11.466660;40.450012;, + 77.780144;-0.616348;69.076759;, + 61.100998;-12.097787;52.234310;, + 54.395813;-21.261244;55.889946;, + 42.876431;-10.391958;41.524540;, + 70.006081;2.367340;76.967026;, + 67.389786;-1.205821;78.118034;, + 68.045258;-14.292754;73.173157;, + 78.460449;-9.570584;65.570358;, + 75.694405;-15.631040;66.051804;, + 78.295067;-4.036124;86.370949;, + 87.136154;-19.603304;74.055412;, + 78.082153;2.534071;68.323830;, + 66.419693;-15.575734;72.678177;, + 87.648987;-4.948394;78.487473;, + 77.807617;-19.174520;83.090736;, + 83.368835;-3.849846;82.306015;, + 89.470627;-9.871181;75.022331;, + 69.084702;6.252669;77.456337;, + 64.973396;0.815134;79.337639;, + 80.264275;-7.343033;63.092098;, + 75.774590;-18.309954;63.527412;, + 64.148453;-7.608615;77.332436;, + 73.421997;6.648875;73.774124;, + 83.376282;-20.182905;76.867386;, + 70.002251;-18.073837;68.726471;, + 77.197746;-9.981779;85.393761;, + 80.318741;-7.420647;85.493256;, + 82.789978;-6.610463;83.296829;, + 79.655968;-17.333593;83.765129;, + 79.183868;-11.467402;85.242088;, + 86.196594;-18.624458;77.084518;, + 82.521919;-17.837069;80.497223;, + 86.199554;-6.060757;79.316513;, + 86.261154;-12.489821;78.381943;, + 71.219742;-15.793794;69.989906;, + 66.651627;-8.248512;76.491966;, + 73.890327;2.056242;73.440269;, + 77.791145;1.105025;78.607323;, + 75.326248;1.267426;80.857727;, + 71.689697;-0.853509;83.395920;, + 73.386116;1.385114;82.625687;, + 83.216957;-4.725611;71.840660;, + 84.570229;-9.819118;68.947449;, + 83.728851;-14.435865;68.167923;, + 81.882507;-19.600512;68.102516;, + 77.441238;-19.029276;72.249611;, + 75.713539;-17.538631;74.283043;, + 71.547607;-4.747393;82.232681;, + 71.182411;-7.791823;81.549644;, + 71.304077;-12.113186;80.009758;, + 79.083267;-19.016726;70.790459;, + 80.102303;-1.256049;75.765610;, + 82.761185;-1.128553;73.438354;, + 72.702766;-16.469456;77.320290;, + 98.099678;-15.343760;83.785767;, + 93.154732;-6.980587;90.899246;, + 93.242905;-25.622953;81.159538;, + 114.749481;-29.371605;104.351402;, + 116.328888;-21.406776;103.886078;, + 84.665817;-9.600757;93.965752;, + 92.986916;-29.187506;89.371254;, + 110.432236;-25.897305;108.404945;, + 110.916962;-20.728716;110.111130;, + 87.785217;-19.995790;96.978920;, + 90.982941;-23.993515;93.046989;, + 85.656944;-14.398671;96.109711;, + 93.408386;-29.026354;84.485863;, + 90.449799;-8.323028;93.510162;, + 97.216904;-8.657048;85.987465;, + 97.339188;-20.929985;83.303215;, + 106.770485;-25.673952;93.617485;, + 105.883774;-28.288433;93.625610;, + 107.882225;-22.395979;93.607300;, + 108.385857;-19.427256;94.058815;, + 107.024353;-17.016718;96.046471;, + 102.020210;-15.026966;101.239967;, + 103.800346;-13.394409;100.111961;, + 101.485901;-28.208586;97.676857;, + 103.374771;-29.259912;95.624199;, + 104.934151;-29.521204;94.116104;, + 105.666786;-14.613162;98.028366;, + 100.699852;-25.001989;99.382347;, + 98.765816;-23.374475;101.653488;, + 99.300377;-20.235739;102.128960;, + 99.750626;-17.848330;102.450653;, + 100.601974;-16.327637;102.138657;, + 94.361519;-7.107321;83.677322;, + 90.721161;-5.196348;81.449821;, + 88.812431;-6.982263;88.106316;, + 93.009644;-14.297369;82.089050;, + 45.919392;12.804501;48.821217;, + 67.424805;2.305351;54.072571;, + 51.500221;-7.577340;65.697365;, + 43.626652;11.654449;36.415169;, + 114.547729;-31.794006;101.703148;, + 116.597923;-18.573429;102.008530;, + 106.487419;-27.751755;108.534760;, + 108.661095;-18.210699;110.956673;, + 120.240417;-32.382523;107.405258;, + 120.625252;-22.188108;107.598892;, + 113.002747;-28.165403;111.418968;, + 115.310875;-21.371449;114.672195;, + 128.789810;-29.466074;108.954926;, + 133.926620;-25.436079;121.826721;, + 135.061844;-38.374813;119.353981;, + 132.477707;-23.264696;124.912544;, + 119.123390;-33.322960;112.785774;, + 128.149567;-26.597660;127.790276;, + 118.771370;-29.660498;118.893425;, + 137.268311;-36.747177;118.004539;, + 120.575157;-22.560459;120.307121;, + 119.121994;-28.036406;123.119385;, + 114.274811;-23.003649;117.528297;, + 117.293953;-23.343679;126.162247;, + 115.772141;-28.293201;126.710030;, + 114.847473;-23.354944;126.325142;, + 133.524338;-30.337019;122.600365;, + 131.403183;-26.611431;125.127594;, + 134.824646;-26.838270;122.262741;, + 135.487198;-33.834320;120.160095;, + 130.670029;-24.829245;124.070786;, + 135.851913;-31.051704;118.766632;, + 137.676193;-32.291035;118.807190;, + 136.074463;-28.661200;120.936546;, + 132.979828;-35.570160;121.777008;, + 130.007385;-30.424955;125.430290;, + 128.967941;-28.056011;126.763344;, + 134.236618;-36.868240;120.362709;, + 127.290657;-35.227036;113.798904;, + 123.047722;-33.416660;109.614326;, + 120.623116;-30.226761;117.721672;, + 116.504295;-28.635885;114.683411;, + 129.463760;-23.354002;127.461098;, + 123.396797;-27.431246;121.069450;, + 124.584869;-28.187895;119.902473;, + 121.760422;-25.243605;123.489906;, + 120.613640;-25.185886;123.257240;, + 117.859741;-27.379353;126.710335;, + 116.538414;-28.334110;120.958870;, + 114.465019;-26.505037;126.579056;, + 120.118660;-28.808155;129.262100;, + 115.234482;-28.095364;129.084930;, + 115.773735;-23.653730;128.726898;, + 119.515671;-24.100697;128.185318;, + 117.369904;-31.079527;128.957718;, + 120.607414;-29.430899;132.556305;, + 117.583008;-29.569143;132.374924;, + 118.315994;-26.222034;131.904175;, + 120.763031;-25.726934;131.562943;, + 118.686279;-31.174704;132.509644;, + 120.230301;-29.213165;134.837173;, + 118.653221;-29.758589;134.962555;, + 119.351463;-27.770924;134.521164;, + 120.681877;-27.087921;134.183151;, + 119.078453;-30.474968;135.038971;, + 134.292740;-27.557007;120.420303;, + 133.862167;-25.069214;123.489700;, + 136.922577;-30.224680;119.848274;, + 138.524689;-33.810150;117.661865;, + 131.526566;-21.883783;126.059494;, + 130.900803;-32.067825;124.310493;, + 132.172577;-33.992134;122.873032;, + 132.345215;-26.909451;126.571350;, + 133.379410;-24.327793;126.319145;, + 132.650177;-22.985157;127.267006;, + 130.886734;-24.224178;128.467072;, + 129.605988;-27.135897;128.838928;, + 130.335205;-28.478533;127.891075;, + 133.363693;-27.150629;127.933983;, + 134.300049;-24.941853;127.674355;, + 133.717270;-23.873322;128.430740;, + 132.198166;-25.013567;129.446793;, + 131.015244;-27.552404;129.826096;, + 131.598038;-28.620930;129.069702;, + 134.645630;-27.372400;128.641541;, + 135.366272;-25.452135;128.495346;, + 134.776291;-24.375912;129.259750;, + 133.465668;-25.219961;130.170334;, + 132.745026;-27.140228;130.316544;, + 133.335007;-28.216450;129.552139;, + 135.557129;-28.123676;129.259583;, + 136.419373;-25.779036;129.096115;, + 135.688400;-24.438776;130.044846;, + 134.095200;-25.443157;131.157074;, + 133.232941;-27.787798;131.320541;, + 133.963898;-29.128056;130.371811;, + 136.416260;-29.042286;130.719208;, + 137.311722;-26.758564;130.512604;, + 136.647217;-25.540148;131.375107;, + 135.087219;-26.605450;132.444199;, + 134.191742;-28.889170;132.650787;, + 134.856277;-30.107586;131.788284;, + 137.309525;-29.130545;131.811081;, + 137.970703;-27.438389;131.659988;, + 137.471268;-26.529640;132.306519;, + 136.310669;-27.313053;133.104141;, + 135.649460;-29.005211;133.255219;, + 136.148911;-29.913960;132.608688;, + 138.067566;-29.848610;132.534195;, + 138.751144;-28.014139;132.398666;, + 138.182465;-26.977980;133.135162;, + 136.930222;-27.776287;134.007202;, + 136.246643;-29.610752;134.142715;, + 136.815308;-30.646914;133.406219;, + 138.629425;-30.705997;132.982819;, + 139.286957;-28.643524;132.924973;, + 138.553925;-27.306091;133.874786;, + 137.163391;-28.031139;134.882431;, + 136.505844;-30.093613;134.940262;, + 137.238861;-31.431042;133.990463;, + 139.375854;-31.531094;134.386230;, + 139.871201;-29.845297;134.374817;, + 139.231964;-28.684835;135.201675;, + 138.097382;-29.210182;136.039948;, + 137.602036;-30.895979;136.051376;, + 138.241287;-32.056435;135.224518;, + 140.178970;-31.048899;135.399673;, + 140.418076;-30.152719;135.414230;, + 140.041107;-29.477694;135.899567;, + 139.425034;-29.698851;136.370346;, + 139.185928;-30.595028;136.355789;, + 139.562897;-31.270054;135.870453;, + 140.513062;-30.455763;135.941559;, + 140.258026;-30.001667;136.269287;, + 134.998978;-30.947582;124.347214;, + 136.184570;-27.988020;124.058090;, + 135.348587;-26.448853;125.144691;, + 133.326996;-27.869246;126.520409;, + 131.894867;-31.158863;126.929192;, + 132.730850;-32.698029;125.842598;, + 136.426865;-31.351122;126.151329;, + 137.500275;-28.819027;125.853668;, + 136.832184;-27.594086;126.720772;, + 135.090698;-28.901239;127.885551;, + 134.017303;-31.433332;128.183212;, + 134.685394;-32.658272;127.316093;, + 138.107239;-31.708241;127.158394;, + 138.933365;-29.506886;126.990791;, + 138.257019;-28.273127;127.867088;, + 136.754562;-29.240726;128.910980;, + 135.928421;-31.442081;129.078583;, + 136.604767;-32.675838;128.202286;, + 139.331543;-32.657040;128.033676;, + 140.320007;-29.969194;127.846275;, + 139.482040;-28.432751;128.933884;, + 137.655624;-29.584154;130.208908;, + 136.667160;-32.271999;130.396317;, + 137.505127;-33.808445;129.308701;, + 140.591125;-33.844181;129.962296;, + 141.617676;-31.226170;129.725464;, + 140.855896;-29.829403;130.714218;, + 139.067566;-31.050646;131.939789;, + 138.041000;-33.668652;132.176636;, + 138.802795;-35.065418;131.187897;, + 141.828308;-34.049400;131.412170;, + 142.586258;-32.109543;131.238968;, + 142.013733;-31.067778;131.980133;, + 140.683243;-31.965866;132.894485;, + 139.925278;-33.905720;133.067688;, + 140.497818;-34.947487;132.326523;, + 142.872879;-34.958260;132.404327;, + 143.656509;-32.855263;132.248962;, + 143.004608;-31.667431;133.093292;, + 141.569046;-32.582588;134.092957;, + 140.785416;-34.685585;134.248322;, + 141.437332;-35.873421;133.404007;, + 143.646179;-36.004208;133.038742;, + 144.399963;-33.639832;132.972427;, + 143.559647;-32.106628;134.061264;, + 141.965546;-32.937801;135.216400;, + 141.211761;-35.302185;135.282715;, + 142.052078;-36.835381;134.193878;, + 144.756668;-37.074436;134.884445;, + 145.324524;-35.141872;134.871353;, + 144.591705;-33.811550;135.819244;, + 143.291046;-34.413788;136.780243;, + 142.723190;-36.346355;136.793335;, + 143.456009;-37.676674;135.845428;, + 145.857040;-36.609371;136.213287;, + 146.131134;-35.582005;136.229980;, + 145.699005;-34.808174;136.786362;, + 144.992767;-35.061703;137.326050;, + 144.718674;-36.089062;137.309357;, + 145.150803;-36.862896;136.752975;, + 146.317627;-35.967274;136.906616;, + 146.025253;-35.446705;137.282303;, + 136.889267;-34.388729;121.786079;, + 138.043243;-31.519651;121.509171;, + 137.240128;-30.030424;122.570480;, + 135.283035;-31.410269;123.908699;, + 133.882507;-34.609402;124.305260;, + 134.685638;-36.098633;123.243958;, + 138.202103;-34.760567;123.442123;, + 139.246475;-32.305771;123.156197;, + 138.604645;-31.120579;124.003120;, + 136.918472;-32.390182;125.135963;, + 135.874115;-34.844978;125.421883;, + 136.515945;-36.030170;124.574966;, + 139.771439;-35.090023;124.340836;, + 140.575928;-32.956081;124.181114;, + 139.926163;-31.762369;125.036995;, + 138.471878;-32.702595;126.052612;, + 137.667374;-34.836536;126.212334;, + 138.317154;-36.030251;125.356453;, + 140.906357;-35.995464;125.122398;, + 141.869110;-33.389969;124.944168;, + 141.064072;-31.903385;126.006470;, + 139.296295;-33.022293;127.247002;, + 138.333542;-35.627785;127.425224;, + 139.138565;-37.114368;126.362930;, + 142.050705;-37.125763;126.892921;, + 143.050034;-34.587837;126.666389;, + 142.318192;-33.236397;127.632103;, + 140.587006;-34.422878;128.824356;, + 139.587677;-36.960800;129.050888;, + 140.319519;-38.312241;128.085159;, + 143.191742;-37.308819;128.222427;, + 143.929611;-35.428307;128.056824;, + 143.379562;-34.420353;128.780731;, + 142.091629;-35.292908;129.670227;, + 141.353745;-37.173420;129.835846;, + 141.903809;-38.181374;129.111954;, + 144.154083;-38.176163;129.119446;, + 144.917267;-36.137577;128.971481;, + 144.290955;-34.988300;129.796127;, + 142.901459;-35.877598;130.768753;, + 142.138290;-37.916183;130.916702;, + 142.764603;-39.065464;130.092056;, + 144.865631;-39.179722;129.685654;, + 145.600723;-36.888016;129.624908;, + 144.793411;-35.404579;130.688385;, + 143.251007;-36.212845;131.812622;, + 142.515900;-38.504547;131.873383;, + 143.323227;-39.987988;130.809906;, + 145.871307;-40.198315;131.383316;, + 146.425507;-38.325241;131.373688;, + 145.721451;-37.038101;132.299500;, + 144.463196;-37.624027;133.234940;, + 143.908981;-39.497101;133.244537;, + 144.613022;-40.784241;132.318726;, + 146.890518;-39.734459;132.609009;, + 147.158310;-38.738781;132.626938;, + 146.743103;-37.990078;133.170349;, + 146.060104;-38.237057;133.695831;, + 145.792313;-39.232731;133.677887;, + 146.207520;-39.981438;133.134476;, + 147.317841;-39.106766;133.255463;, + 147.036926;-38.603104;133.622391;, + 138.085999;-37.138863;119.175186;, + 139.090546;-34.734760;118.968651;, + 138.476166;-33.511417;119.918930;, + 136.857193;-34.692177;121.075745;, + 135.606110;-37.426338;121.401924;, + 136.220490;-38.649681;120.451653;, + 139.088989;-37.460236;120.374466;, + 139.994675;-35.402271;120.154755;, + 139.503555;-34.428730;120.913040;, + 138.106750;-35.513153;121.891022;, + 136.954514;-37.901169;122.230385;, + 137.445618;-38.874702;121.472107;, + 140.310577;-37.735165;120.957130;, + 141.014175;-35.948002;120.844086;, + 140.516815;-34.967522;121.610336;, + 139.315872;-35.774200;122.489632;, + 138.612274;-37.561363;122.602676;, + 139.109634;-38.541847;121.836426;, + 141.172485;-38.492016;121.459724;, + 142.015732;-36.310272;121.336426;, + 141.399719;-35.089157;122.287537;, + 139.940460;-36.049793;123.361938;, + 139.097214;-38.231537;123.485237;, + 139.713226;-39.452652;122.534126;, + 142.017715;-39.448486;122.736076;, + 142.888947;-37.322247;122.569550;, + 142.328949;-36.212143;123.434189;, + 140.897690;-37.228283;124.465363;, + 140.026443;-39.354527;124.631889;, + 140.586456;-40.464630;123.767242;, + 142.895447;-39.609592;123.696373;, + 143.538910;-38.034172;123.574936;, + 143.117813;-37.206295;124.223007;, + 142.053253;-37.953835;124.992500;, + 141.409805;-39.529259;125.113930;, + 141.830887;-40.357136;124.465874;, + 143.619232;-40.337288;124.304420;, + 144.287018;-38.630085;124.200493;, + 143.807587;-37.686111;124.938774;, + 142.660355;-38.449345;125.780983;, + 141.992584;-40.156551;125.884911;, + 142.472015;-41.100525;125.146629;, + 144.145706;-41.176258;124.664856;, + 144.796890;-39.259224;124.640663;, + 144.178955;-38.040764;125.592773;, + 142.909821;-38.739342;126.569069;, + 142.258636;-40.656376;126.593254;, + 142.876572;-41.874832;125.641159;, + 144.885223;-42.039631;125.897728;, + 145.379715;-40.473606;125.913101;, + 144.840652;-39.416443;126.741905;, + 143.807114;-39.925308;127.555336;, + 143.312622;-41.491337;127.539970;, + 143.851685;-42.548496;126.711159;, + 145.686615;-41.660812;126.807167;, + 145.927765;-40.828819;126.835564;, + 145.609604;-40.213989;127.321953;, + 145.050308;-40.431152;127.779945;, + 144.809174;-41.263145;127.751549;, + 145.127319;-41.877975;127.265160;, + 146.032715;-41.142326;127.308174;, + 145.817383;-40.728752;127.636574;, + 124.973160;-23.354237;117.701744;, + 130.100662;-32.931473;123.451958;, + 128.472305;-28.867155;125.483269;, + 131.961060;-36.499588;120.635719;, + 130.957870;-35.780834;116.981300;, + 124.282539;-24.769093;125.526192;, + 125.508987;-30.949331;117.392708;, + 127.017143;-25.364244;114.287338;, + 117.540039;-22.350718;100.953659;, + 112.563721;-15.887562;106.469879;, + 110.663788;-31.643456;105.394226;, + 106.306908;-24.835386;110.495728;, + 110.832993;-28.654867;112.050888;, + 110.854927;-23.530939;113.587791;, + 121.598297;-21.157846;106.522896;, + 120.238564;-20.029554;107.979340;, + 114.466507;-18.879122;111.705498;, + 111.886719;-19.639212;113.723465;, + 117.792206;-32.974083;105.142754;, + 119.345352;-28.410704;105.006744;, + 115.554443;-33.065868;107.042320;, + 112.233528;-30.176003;110.656517;, + 33.827938;10.960120;51.807289;, + 39.182789;8.123861;57.134254;, + 39.964428;-10.933758;50.220123;, + 41.310238;-5.151076;57.811226;, + 60.861866;5.824606;48.839558;, + 71.769287;-1.344572;58.966167;, + 52.727615;10.033523;60.222115;, + 48.911415;-16.086357;49.050552;, + 50.863899;-3.190058;44.773193;, + -60.511364;10.489422;61.040886;, + -59.417953;7.137104;70.365372;, + -36.367424;14.780292;44.255165;, + -50.152618;11.466668;40.450016;, + -77.592583;-0.616339;69.076759;, + -60.913422;-12.097776;52.234310;, + -54.208237;-21.261230;55.889942;, + -42.688854;-10.391947;41.524540;, + -69.818512;2.367348;76.967026;, + -67.202217;-1.205813;78.118034;, + -67.857689;-14.292745;73.173157;, + -78.272881;-9.570575;65.570358;, + -75.506836;-15.631029;66.051804;, + -78.107506;-4.036117;86.370941;, + -86.948593;-19.603292;74.055412;, + -77.894592;2.534080;68.323830;, + -66.232124;-15.575725;72.678177;, + -87.461426;-4.948386;78.487473;, + -77.620056;-19.174511;83.090729;, + -83.181274;-3.849838;82.306007;, + -89.283066;-9.871171;75.022331;, + -68.897133;6.252676;77.456337;, + -64.785828;0.815142;79.337639;, + -80.076714;-7.343022;63.092098;, + -75.587021;-18.309942;63.527412;, + -63.960876;-7.608606;77.332436;, + -73.234436;6.648881;73.774124;, + -83.188721;-20.182894;76.867378;, + -69.814682;-18.073826;68.726471;, + -77.010178;-9.981771;85.393753;, + -80.131180;-7.420639;85.493248;, + -82.859459;-6.312282;83.425949;, + -79.468399;-17.333584;83.765121;, + -78.996300;-11.467393;85.242081;, + -86.009033;-18.624449;77.084511;, + -82.334358;-17.837059;80.497215;, + -86.011993;-6.060749;79.316505;, + -86.073555;-12.696040;78.345314;, + -71.032173;-15.793784;69.989906;, + -66.464066;-8.248504;76.491966;, + -73.702766;2.056248;73.440269;, + -77.603577;1.105032;78.607323;, + -75.138687;1.267434;80.857719;, + -71.502121;-0.853501;83.395912;, + -73.198547;1.385122;82.625679;, + -83.029396;-4.725603;71.840660;, + -84.382668;-9.819108;68.947449;, + -83.541290;-14.435856;68.167923;, + -81.694946;-19.600500;68.102516;, + -77.253677;-19.029264;72.249611;, + -75.525970;-17.538622;74.283043;, + -71.360039;-4.747385;82.232674;, + -70.994850;-7.791813;81.549637;, + -71.116508;-12.113177;80.009750;, + -78.895706;-19.016714;70.790459;, + -79.914742;-1.256042;75.765610;, + -82.573624;-1.128545;73.438354;, + -72.515198;-16.469446;77.320282;, + -97.912117;-15.343751;83.785759;, + -92.967171;-6.980580;90.899239;, + -93.055344;-25.622944;81.159531;, + -114.561913;-29.371595;104.351395;, + -116.141319;-21.406767;103.886070;, + -84.478256;-9.600749;93.965744;, + -92.799355;-29.187496;89.371246;, + -110.244675;-25.897297;108.404938;, + -110.729401;-20.728708;110.111122;, + -87.597656;-19.995781;96.978912;, + -90.795380;-23.993507;93.046982;, + -85.469383;-14.398664;96.109703;, + -93.220825;-29.026344;84.485855;, + -90.262238;-8.323020;93.510155;, + -97.029335;-8.657041;85.987457;, + -97.151627;-20.929976;83.303207;, + -106.582924;-25.673943;93.617477;, + -105.696213;-28.288424;93.625603;, + -107.694664;-22.395969;93.607292;, + -108.198296;-19.427246;94.058807;, + -106.836792;-17.016710;96.046463;, + -101.832649;-15.026958;101.239960;, + -103.612785;-13.394403;100.111954;, + -101.298340;-28.208574;97.676849;, + -103.187210;-29.259903;95.624191;, + -104.746590;-29.521194;94.116096;, + -105.479225;-14.613154;98.028358;, + -100.512291;-25.001982;99.382339;, + -98.578255;-23.374466;101.653481;, + -99.112808;-20.235731;102.128952;, + -99.563057;-17.848322;102.450645;, + -100.414413;-16.327629;102.138649;, + -94.173958;-7.107313;83.677315;, + -90.533600;-5.196339;81.449814;, + -88.624870;-6.982255;88.106308;, + -92.822083;-14.297360;82.089043;, + -45.731812;12.804509;48.821217;, + -67.237244;2.305361;54.072567;, + -51.312645;-7.577330;65.697365;, + -43.439075;11.654459;36.415169;, + -114.360168;-31.793995;101.703140;, + -116.410362;-18.573421;102.008522;, + -106.299858;-27.751747;108.534752;, + -108.473534;-18.210691;110.956665;, + -118.763100;-32.416569;106.890343;, + -119.195221;-22.221508;107.119102;, + -112.815208;-28.165394;111.418961;, + -115.208687;-21.985653;115.587814;, + -128.864243;-29.984035;109.850922;, + -133.928619;-25.617853;122.127678;, + -134.985291;-38.562931;119.605125;, + -132.439087;-23.407928;125.120613;, + -118.979370;-33.894085;113.600273;, + -127.981033;-26.736771;127.892494;, + -118.573692;-30.116972;119.482887;, + -137.255630;-36.934776;118.303642;, + -120.451622;-22.976614;120.888481;, + -118.885986;-28.402800;123.534958;, + -114.103012;-23.569595;118.313278;, + -117.037895;-23.683615;126.520027;, + -115.439522;-28.633007;127.009117;, + -114.556931;-23.727386;126.708763;, + -133.461777;-30.497587;122.817970;, + -131.314377;-26.758501;125.303482;, + -134.818481;-26.994595;122.516602;, + -135.449875;-34.009403;120.420280;, + -130.603973;-25.013189;124.323257;, + -135.866348;-31.256813;119.114555;, + -137.701736;-32.465740;119.114777;, + -136.085159;-28.822893;121.211914;, + -132.869873;-35.744339;121.980255;, + -129.858322;-30.577702;125.569275;, + -128.810074;-28.201370;126.883720;, + -134.150055;-37.050697;120.597130;, + -127.220825;-35.652714;114.436562;, + -122.998520;-33.996376;110.515045;, + -120.460487;-30.679323;118.331627;, + -116.345764;-29.216154;115.501526;, + -129.349152;-23.487917;127.596153;, + -123.251488;-27.779137;121.524582;, + -124.463943;-28.541100;120.384758;, + -121.581490;-25.569689;123.884338;, + -120.423470;-25.533827;123.678185;, + -117.563560;-27.690514;126.991264;, + -116.295723;-28.783062;121.501877;, + -114.134766;-26.870768;126.921577;, + -119.802361;-29.029490;129.383438;, + -114.863617;-28.393749;129.288300;, + -115.458870;-23.961578;128.988220;, + -119.253044;-24.363922;128.414917;, + -116.999329;-31.342564;129.104553;, + -120.245399;-29.574646;132.518158;, + -117.182472;-29.760815;132.384308;, + -117.964737;-26.420248;131.961685;, + -120.453552;-25.897451;131.607895;, + -118.282471;-31.343769;132.480225;, + -119.833649;-29.315147;134.705521;, + -118.228737;-29.879900;134.840668;, + -118.961952;-27.895647;134.431473;, + -120.321297;-27.201702;134.097992;, + -118.651398;-30.586836;134.899963;, + -134.298187;-27.758150;120.755005;, + -133.843735;-25.217905;123.721947;, + -136.944122;-30.393238;120.142960;, + -138.562317;-33.993008;117.991791;, + -131.473114;-22.020031;126.245018;, + -130.762848;-32.227257;124.468689;, + -132.052338;-34.158718;123.056244;, + -132.245651;-27.011766;126.667183;, + -133.322495;-24.425945;126.440849;, + -132.583725;-23.077150;127.371544;, + -130.768127;-24.314178;128.528564;, + -129.436584;-27.230442;128.868927;, + -130.175354;-28.579237;127.938255;, + -133.256104;-27.208897;127.952965;, + -134.230194;-24.996719;127.716698;, + -133.639786;-23.923281;128.459366;, + -132.075287;-25.062017;129.438324;, + -130.846466;-27.604633;129.788620;, + -131.436874;-28.678068;129.045944;, + -134.542770;-27.396519;128.609299;, + -135.293900;-25.473001;128.481171;, + -134.696152;-24.391825;129.231689;, + -133.347275;-25.234171;130.110321;, + -132.596161;-27.157688;130.238464;, + -133.193909;-28.238865;129.487946;, + -135.450180;-28.119780;129.179245;, + -136.349197;-25.771114;129.037415;, + -135.608658;-24.424700;129.968933;, + -133.969086;-25.426950;131.042328;, + -133.070053;-27.775614;131.184158;, + -133.810593;-29.122028;130.252640;, + -136.291122;-28.993143;130.552338;, + -137.223816;-26.705677;130.368149;, + -136.550583;-25.481665;131.214996;, + -134.944672;-26.545113;132.246048;, + -134.011978;-28.832579;132.430222;, + -134.685211;-30.056591;131.583374;, + -137.179993;-29.045206;131.582748;, + -137.868683;-27.350267;131.448212;, + -137.362671;-26.437330;132.082977;, + -136.167953;-27.219339;132.852280;, + -135.479263;-28.914282;132.986816;, + -135.985291;-29.827215;132.352036;, + -137.930786;-29.735388;132.255539;, + -138.643372;-27.897797;132.137161;, + -138.067200;-26.856865;132.860275;, + -136.778458;-27.653521;133.701782;, + -136.065872;-29.491106;133.820175;, + -136.642044;-30.532040;133.097046;, + -138.485275;-30.573214;132.667130;, + -139.172653;-28.506882;132.625885;, + -138.429977;-27.163292;133.558441;, + -136.999939;-27.886042;134.532242;, + -136.312576;-29.952375;134.573486;, + -137.055237;-31.295958;133.640945;, + -139.213760;-31.356102;133.989075;, + -139.732437;-29.667019;133.990204;, + -139.084747;-28.501205;134.802032;, + -137.918381;-29.024487;135.612717;, + -137.399704;-30.713572;135.611588;, + -138.047409;-31.879387;134.799774;, + -140.018036;-30.841948;134.952103;, + -140.268936;-29.943945;134.972733;, + -139.886917;-29.265791;135.449203;, + -139.254013;-29.485641;135.905014;, + -139.003113;-30.383642;135.884384;, + -139.385117;-31.061798;135.407928;, + -140.354813;-30.233871;135.472046;, + -140.096344;-29.777664;135.793762;, + -134.925339;-31.048527;124.460655;, + -136.159790;-28.084190;124.201187;, + -135.312897;-26.537964;125.268112;, + -133.231537;-27.956072;126.594505;, + -131.742386;-31.250843;126.968010;, + -132.589279;-32.797073;125.901085;, + -136.342789;-31.392393;126.160988;, + -137.459473;-28.856398;125.890129;, + -136.782639;-27.625828;126.741508;, + -134.989136;-28.931255;127.863777;, + -133.872452;-31.467245;128.134628;, + -134.549286;-32.697823;127.283241;, + -138.027634;-31.702929;127.096672;, + -138.888702;-29.497849;126.949776;, + -138.203445;-28.258413;127.810158;, + -136.657150;-29.224060;128.817413;, + -135.796066;-31.429138;128.964310;, + -136.481308;-32.668583;128.103928;, + -139.246399;-32.613304;127.906013;, + -140.277039;-29.920834;127.743416;, + -139.428085;-28.377333;128.811295;, + -137.548523;-29.526291;130.041809;, + -136.517883;-32.218758;130.204422;, + -137.366837;-33.762257;129.136520;, + -140.483856;-33.738888;129.718903;, + -141.553055;-31.116575;129.507767;, + -140.781296;-29.713392;130.478592;, + -138.940323;-30.932508;131.660553;, + -137.871094;-33.554817;131.871689;, + -138.642868;-34.957996;130.900879;, + -141.714996;-33.895096;131.085495;, + -142.504501;-31.952051;130.931244;, + -141.924408;-30.905476;131.658936;, + -140.554810;-31.801954;132.540863;, + -139.765320;-33.745007;132.695084;, + -140.345413;-34.791569;131.967392;, + -142.750443;-34.765797;132.009415;, + -143.567322;-32.659225;131.873703;, + -142.906815;-31.465914;132.702682;, + -141.429428;-32.379189;133.667358;, + -140.612549;-34.485764;133.803070;, + -141.273041;-35.679066;132.974091;, + -143.514694;-35.784763;132.593597;, + -144.302673;-33.415970;132.546310;, + -143.451279;-31.875710;133.615356;, + -141.811935;-32.704250;134.731705;, + -141.023956;-35.073055;134.778992;, + -141.875320;-36.613304;133.709930;, + -144.603409;-36.797626;134.330566;, + -145.197998;-34.861298;134.331848;, + -144.455490;-33.524841;135.262497;, + -143.118393;-34.124710;136.191864;, + -142.523804;-36.061047;136.190567;, + -143.266312;-37.397495;135.259933;, + -145.704269;-36.289589;135.590790;, + -145.991882;-35.260136;135.614456;, + -145.553955;-34.482719;136.160660;, + -144.828415;-34.734749;136.683197;, + -144.540802;-35.764202;136.659546;, + -144.978714;-36.541618;136.113327;, + -146.167557;-35.627628;136.254303;, + -145.871262;-35.104645;136.623108;, + -136.842163;-34.507912;121.949051;, + -138.043503;-31.634064;121.700676;, + -137.229767;-30.137711;122.742432;, + -135.214676;-31.515200;124.032562;, + -133.758621;-34.719486;124.394966;, + -134.572357;-36.215839;123.353210;, + -138.145432;-34.824940;123.509781;, + -139.231766;-32.366253;123.249680;, + -138.581421;-31.175377;124.080971;, + -136.844757;-32.443195;125.172371;, + -135.758438;-34.901882;125.432487;, + -136.408783;-36.092754;124.601196;, + -139.719559;-35.111778;124.343742;, + -140.557938;-32.974113;124.203918;, + -139.899506;-31.774664;125.043983;, + -138.402664;-32.712887;126.023872;, + -137.564270;-34.850555;126.163696;, + -138.222717;-36.049999;125.323631;, + -140.849487;-35.982155;125.065216;, + -141.853134;-33.372047;124.910805;, + -141.037415;-31.878336;125.953506;, + -139.218048;-32.994740;127.150612;, + -138.214417;-35.604839;127.305016;, + -139.030136;-37.098549;126.262321;, + -141.972977;-37.056030;126.729210;, + -143.013672;-34.513821;126.527390;, + -142.272110;-33.155907;127.475288;, + -140.489838;-34.340195;128.625000;, + -139.449127;-36.882404;128.826813;, + -140.190689;-38.240322;127.878899;, + -143.108612;-37.194061;127.982307;, + -143.877075;-35.310364;127.834953;, + -143.319672;-34.297565;128.545441;, + -141.993790;-35.168465;129.403305;, + -141.225327;-37.052162;129.550674;, + -141.782730;-38.064957;128.840179;, + -144.062485;-38.026543;128.816864;, + -144.857895;-35.984383;128.687775;, + -144.223221;-34.829582;129.497177;, + -142.793137;-35.716938;130.435669;, + -141.997726;-37.759098;130.564743;, + -142.632401;-38.913898;129.755356;, + -144.765549;-39.005554;129.337189;, + -145.533783;-36.709423;129.294647;, + -144.715698;-35.218861;130.338470;, + -143.129379;-36.024429;131.424835;, + -142.361115;-38.320564;131.467377;, + -143.179214;-39.811123;130.423553;, + -145.750641;-39.971535;130.934662;, + -146.330765;-38.094688;130.938782;, + -145.617279;-36.801361;131.847458;, + -144.323669;-37.384869;132.751999;, + -143.743530;-39.261711;132.747849;, + -144.457001;-40.555042;131.839188;, + -146.770706;-39.468060;132.097397;, + -147.051620;-38.470287;132.121964;, + -146.630768;-37.717964;132.655273;, + -145.929031;-37.963417;133.163986;, + -145.648132;-38.961185;133.139404;, + -146.068970;-39.713509;132.606094;, + -147.200821;-38.821938;132.716400;, + -146.916077;-38.315838;133.076492;, + -138.063828;-37.289051;119.406982;, + -139.108231;-34.879868;119.222725;, + -138.484604;-33.648365;120.152847;, + -136.816589;-34.826042;121.267235;, + -135.517487;-37.565662;121.565521;, + -136.141098;-38.797169;120.635399;, + -139.060074;-37.569843;120.535957;, + -140.001053;-35.507759;120.336586;, + -139.502533;-34.527710;121.078781;, + -138.063034;-35.609749;122.020325;, + -136.867325;-38.002270;122.333717;, + -137.365829;-38.982311;121.591530;, + -140.286835;-37.814011;121.073189;, + -141.018921;-36.022858;120.975487;, + -140.514023;-35.035809;121.725449;, + -139.277069;-35.839912;122.573105;, + -138.544998;-37.631069;122.670799;, + -139.049896;-38.618114;121.920837;, + -141.145554;-38.545986;121.533401;, + -142.023148;-36.359291;121.428398;, + -141.397858;-35.130013;122.359329;, + -139.894958;-36.087437;123.395241;, + -139.017365;-38.274132;123.500229;, + -139.642654;-39.503407;122.569305;, + -141.974594;-39.461166;122.731110;, + -142.880615;-37.330349;122.583794;, + -142.312164;-36.212826;123.430077;, + -140.837692;-37.226124;124.423691;, + -139.931671;-39.356945;124.570999;, + -140.500122;-40.474468;123.724709;, + -142.848846;-39.588902;123.635170;, + -143.518021;-38.010078;123.527908;, + -143.090546;-37.176647;124.162201;, + -141.993881;-37.922039;124.903725;, + -141.324722;-39.500870;125.010979;, + -141.752197;-40.334293;124.376701;, + -143.566452;-40.291603;124.198372;, + -144.261322;-38.580566;124.108978;, + -143.774628;-37.630268;124.831566;, + -142.593063;-38.391006;125.643524;, + -141.898178;-40.102051;125.732918;, + -142.384872;-41.052349;125.010338;, + -144.086502;-41.113419;124.526360;, + -144.765533;-39.191589;124.515739;, + -144.138245;-37.964970;125.447609;, + -142.831924;-38.660183;126.390099;, + -142.152893;-40.582008;126.400719;, + -142.780182;-41.808628;125.468857;, + -144.809982;-41.938175;125.684982;, + -145.326218;-40.368050;125.710388;, + -144.778976;-39.303791;126.521545;, + -143.715500;-39.809662;127.307304;, + -143.199249;-41.379795;127.281898;, + -143.746490;-42.444050;126.470741;, + -145.612946;-41.529369;126.547478;, + -145.865082;-40.695091;126.580605;, + -145.542038;-40.076111;127.056602;, + -144.966858;-40.291412;127.499474;, + -144.714737;-41.125694;127.466347;, + -145.037766;-41.744671;126.990349;, + -145.961716;-40.996456;127.027367;, + -145.743073;-40.580086;127.348747;, + -124.935844;-23.758604;118.330032;, + -129.955658;-33.118725;123.649422;, + -128.317764;-29.044809;125.658051;, + -131.844467;-36.710579;120.893005;, + -130.886246;-36.084728;117.422089;, + -124.112961;-25.016518;125.801498;, + -125.407913;-31.335402;117.942909;, + -127.034424;-25.805647;115.016808;, + -117.352478;-22.350708;100.953651;, + -112.376160;-15.887554;106.469872;, + -110.476227;-31.643446;105.394218;, + -106.119347;-24.835379;110.495720;, + -110.645432;-28.654860;112.050880;, + -110.667366;-23.530931;113.587784;, + -120.163315;-21.191313;106.039421;, + -118.809158;-20.062948;107.500015;, + -114.278946;-18.879114;111.705490;, + -111.699158;-19.639204;113.723457;, + -117.604637;-32.974075;105.142746;, + -119.157791;-28.410696;105.006737;, + -115.366882;-33.065861;107.042313;, + -112.045959;-30.175995;110.656509;, + -33.640362;10.960128;51.807285;, + -38.995209;8.123871;57.134251;, + -39.776852;-10.933746;50.220119;, + -41.122662;-5.151066;57.811222;, + -60.674290;5.824616;48.839558;, + -71.581718;-1.344563;58.966167;, + -52.540039;10.033530;60.222115;, + -48.723839;-16.086346;49.050549;, + -50.676323;-3.190047;44.773193;, + -6.262792;13.473364;58.013275;, + 6.173337;13.337016;58.607582;, + -11.545969;16.822830;57.059074;, + 0.138007;12.423479;60.187363;, + 11.825384;16.819580;57.419716;, + -6.266276;13.691039;58.408001;, + 6.169853;13.554691;59.002308;, + 0.057848;95.886368;65.707542;, + 0.057848;97.662560;43.454536;, + 0.057848;90.668213;33.607914;, + 0.057848;73.976425;70.984543;, + 0.057848;63.606403;31.055357;, + 0.057848;99.177589;56.123409;, + 0.057848;84.042374;71.322975;, + 0.057848;75.714500;30.620197;, + 0.057848;53.154804;40.756420;, + -15.043728;50.197842;49.912075;, + -13.469022;92.920013;60.063766;, + -11.461862;93.826927;46.940403;, + -8.418667;86.102859;35.841724;, + -2.182251;64.795692;35.886501;, + -13.655560;74.702049;67.510803;, + -16.338684;73.054062;51.038074;, + -7.371841;73.847633;69.711700;, + -4.494127;83.274292;70.169548;, + -13.097512;71.430748;40.778584;, + -13.263326;61.285336;39.593838;, + -13.865308;81.275604;65.186821;, + -4.402893;95.093262;63.828449;, + -14.668218;94.575356;62.197353;, + -6.418187;97.562218;66.945374;, + -6.403885;85.831749;72.998459;, + -2.904975;98.340385;68.672066;, + -3.096079;86.564301;74.622665;, + -15.709467;82.386459;66.627968;, + -14.238920;86.733635;61.588871;, + -15.816927;87.518616;62.681839;, + -11.518435;84.699326;70.485474;, + -8.635912;82.575844;67.678185;, + -10.775403;96.597122;64.803986;, + -7.852941;94.312172;61.946106;, + -16.338850;66.013954;51.296288;, + -14.718096;68.331589;44.645512;, + -15.784473;69.911873;57.321053;, + -15.528388;63.130802;45.068886;, + -14.675630;70.832016;46.772766;, + -15.347429;57.616409;47.193058;, + -7.149835;52.817856;41.486317;, + -7.580388;47.204636;47.215710;, + -3.355227;56.332371;40.007046;, + -14.710178;77.561653;59.569633;, + -12.242872;104.272034;59.466625;, + -13.871002;106.867241;51.713676;, + -6.555738;100.376198;26.176455;, + -10.330755;93.744308;22.167315;, + -25.391743;66.042480;44.113369;, + -20.371532;85.581749;31.614416;, + -3.509032;68.824097;16.563112;, + -16.921518;68.428406;22.861071;, + -23.283691;91.554054;44.497189;, + -22.312506;78.019226;58.252476;, + -5.355029;81.806320;13.441270;, + -6.858363;107.464165;38.205128;, + -1.630455;58.319656;15.177998;, + -19.439602;55.002464;25.954828;, + -14.163750;71.116005;45.658489;, + -16.339277;34.462788;24.538301;, + -3.199738;106.311531;63.356800;, + -7.285188;105.334877;61.411713;, + -19.911991;74.556313;27.957836;, + -23.002449;68.454033;35.866280;, + -23.994633;83.695297;38.363724;, + -21.688162;63.338444;39.264874;, + -21.994913;54.244259;32.219749;, + -11.261707;52.068916;45.952110;, + -6.553079;49.986835;18.220219;, + -13.583147;45.560303;22.582418;, + -3.504504;39.875324;20.493166;, + -24.415617;69.041245;50.481827;, + -15.101998;82.440125;58.401062;, + -4.228397;103.816078;53.739082;, + -10.791362;101.190048;49.992683;, + -11.328189;101.622627;54.213688;, + -2.042533;104.242516;48.194424;, + -2.467957;102.354828;41.462799;, + -5.581229;102.438309;43.389084;, + -2.102569;101.711769;35.092808;, + -5.357594;98.838608;34.631802;, + -2.575568;97.464630;31.897514;, + -9.509275;96.133217;33.318790;, + -6.373484;96.717354;29.011164;, + -8.609506;92.094917;28.785583;, + -0.961346;89.876480;22.612808;, + -3.750705;87.223274;24.470808;, + -1.293535;83.343231;22.908096;, + -7.475338;76.444283;20.933500;, + -7.155903;71.146484;21.280985;, + -4.020619;75.279213;22.110722;, + -1.186798;66.427330;20.374010;, + -1.050320;61.116470;21.804775;, + -3.120998;63.629890;20.392683;, + -6.236067;57.664822;24.799372;, + -3.291713;57.533966;22.859617;, + -4.431494;55.146961;25.181421;, + -2.515443;47.986980;22.845200;, + -2.247637;45.361992;27.063856;, + -3.458311;46.185818;25.952394;, + -15.542780;91.786743;39.028736;, + -15.098378;89.391930;35.078747;, + -16.682585;85.833199;39.137646;, + -15.960197;80.988068;32.730686;, + -17.451015;78.322830;36.557224;, + -16.864700;74.552986;34.352123;, + -13.662128;75.346954;26.811104;, + -13.099884;69.581734;27.209919;, + -14.475806;72.210419;29.167706;, + -16.048969;64.284309;32.004520;, + -14.420856;61.870514;29.131302;, + -16.221205;60.286003;31.238237;, + -14.534574;44.794735;26.116779;, + -14.848799;44.863647;29.381424;, + -13.599534;41.942635;29.015915;, + -10.621090;54.617325;25.569170;, + -8.996603;52.321831;27.760847;, + -10.189517;51.242924;27.917196;, + -17.834475;94.101349;53.041599;, + -17.518343;94.489967;48.203121;, + -19.293009;90.274719;49.298183;, + -19.945814;88.506752;43.413734;, + -18.563108;84.403915;43.736874;, + -21.033463;85.001541;44.282993;, + -23.027826;71.019249;46.561157;, + -21.556767;69.493790;46.926170;, + -23.674259;69.104668;47.675011;, + -22.533089;73.345596;50.339439;, + -21.038176;75.381149;55.902035;, + -21.679085;72.997261;52.478176;, + -19.307541;61.902699;35.872772;, + -18.916523;58.344765;35.077782;, + -19.290819;59.542400;38.422955;, + -8.277215;99.647781;59.143467;, + -2.250754;97.063629;60.111290;, + -1.262086;99.482384;60.521812;, + -4.202026;99.742661;59.680969;, + -1.779861;73.225479;71.214066;, + -17.854918;48.596111;35.240131;, + -17.187716;41.811371;40.273598;, + 15.159414;50.197842;49.912075;, + 13.584708;92.920013;60.063766;, + 11.577548;93.826927;46.940403;, + 8.534353;86.102859;35.841724;, + 2.297937;64.795692;35.886501;, + 13.771247;74.702049;67.510803;, + 16.454370;73.054062;51.038074;, + 7.487527;73.847633;69.711700;, + 4.609814;83.274292;70.169548;, + 13.213199;71.430748;40.778584;, + 13.379013;61.285336;39.593838;, + 13.980994;81.275604;65.186821;, + 4.518579;95.093262;63.828449;, + 14.783904;94.575356;62.197353;, + 6.533874;97.562218;66.945374;, + 6.519572;85.831749;72.998459;, + 3.020661;98.340385;68.672066;, + 3.211765;86.564301;74.622665;, + 15.825153;82.386459;66.627968;, + 14.354607;86.733635;61.588871;, + 15.932613;87.518616;62.681839;, + 11.634122;84.699326;70.485474;, + 8.751598;82.575844;67.678185;, + 10.891089;96.597122;64.803986;, + 7.968627;94.312172;61.946106;, + 16.454536;66.013954;51.296288;, + 14.833782;68.331589;44.645512;, + 15.900160;69.911873;57.321053;, + 15.644074;63.130802;45.068886;, + 14.791316;70.832016;46.772766;, + 15.463116;57.616409;47.193058;, + 7.265521;52.817856;41.486317;, + 7.696074;47.204636;47.215710;, + 3.470914;56.332371;40.007046;, + 14.825865;77.561653;59.569633;, + 12.358559;104.272034;59.466625;, + 13.986689;106.867241;51.713676;, + 6.671424;100.376198;26.176455;, + 10.446442;93.744308;22.167315;, + 25.507429;66.042480;44.113369;, + 20.487219;85.581749;31.614416;, + 3.624719;68.824097;16.563112;, + 17.037205;68.428406;22.861071;, + 23.399378;91.554054;44.497189;, + 22.428192;78.019226;58.252476;, + 5.470715;81.806320;13.441270;, + 6.974050;107.464165;38.205128;, + 1.746141;58.319656;15.177998;, + 19.555288;55.002464;25.954828;, + 14.279436;71.116005;45.658489;, + 16.454964;34.462788;24.538301;, + 3.315424;106.311531;63.356800;, + 7.400875;105.334877;61.411713;, + 20.027678;74.556313;27.957836;, + 23.118135;68.454033;35.866280;, + 24.110319;83.695297;38.363724;, + 21.803848;63.338444;39.264874;, + 22.110600;54.244255;32.219749;, + 11.377394;52.068913;45.952110;, + 6.668766;49.986835;18.220219;, + 13.698833;45.560303;22.582418;, + 3.620190;39.875320;20.493166;, + 24.531303;69.041245;50.481827;, + 15.217685;82.440125;58.401062;, + 4.344084;103.816078;53.739082;, + 10.907048;101.190048;49.992683;, + 11.443875;101.622627;54.213688;, + 2.158219;104.242516;48.194424;, + 2.583643;102.354828;41.462799;, + 5.696916;102.438309;43.389084;, + 2.218256;101.711769;35.092808;, + 5.473281;98.838608;34.631802;, + 2.691255;97.464630;31.897514;, + 9.624962;96.133217;33.318790;, + 6.489170;96.717354;29.011164;, + 8.725192;92.094917;28.785583;, + 1.077032;89.876480;22.612808;, + 3.866392;87.223274;24.470808;, + 1.409221;83.343231;22.908096;, + 7.591025;76.444283;20.933500;, + 7.271590;71.146484;21.280985;, + 4.136305;75.279213;22.110722;, + 1.302485;66.427330;20.374010;, + 1.166007;61.116470;21.804775;, + 3.236684;63.629890;20.392683;, + 6.351754;57.664822;24.799372;, + 3.407399;57.533966;22.859617;, + 4.547181;55.146961;25.181421;, + 2.631130;47.986980;22.845200;, + 2.363323;45.361992;27.063856;, + 3.573997;46.185818;25.952394;, + 15.658466;91.786743;39.028736;, + 15.214065;89.391930;35.078747;, + 16.798271;85.833199;39.137646;, + 16.075884;80.988068;32.730686;, + 17.566702;78.322830;36.557224;, + 16.980387;74.552986;34.352123;, + 13.777815;75.346954;26.811104;, + 13.215570;69.581734;27.209919;, + 14.591493;72.210419;29.167706;, + 16.164656;64.284309;32.004520;, + 14.536543;61.870514;29.131302;, + 16.336891;60.286003;31.238237;, + 14.650260;44.794735;26.116779;, + 14.964485;44.863644;29.381424;, + 13.715221;41.942635;29.015915;, + 10.736776;54.617321;25.569170;, + 9.112289;52.321831;27.760847;, + 10.305203;51.242924;27.917196;, + 17.950161;94.101349;53.041599;, + 17.634029;94.489967;48.203121;, + 19.408695;90.274719;49.298183;, + 20.061501;88.506752;43.413734;, + 18.678795;84.403915;43.736874;, + 21.149149;85.001541;44.282993;, + 23.143513;71.019249;46.561157;, + 21.672453;69.493790;46.926170;, + 23.789946;69.104668;47.675011;, + 22.648775;73.345596;50.339439;, + 21.153862;75.381149;55.902035;, + 21.794771;72.997261;52.478176;, + 19.423227;61.902699;35.872772;, + 19.032209;58.344765;35.077782;, + 19.406506;59.542400;38.422955;, + 8.392901;99.647781;59.143467;, + 2.366440;97.063629;60.111290;, + 1.377773;99.482384;60.521812;, + 4.317712;99.742661;59.680969;, + 1.895548;73.225479;71.214066;, + 17.970604;48.596111;35.240131;, + 17.303402;41.811371;40.273598;, + 0.438559;57.282112;73.561638;, + 0.736964;56.934887;73.321701;, + 0.356253;56.468140;73.264908;, + -0.240559;56.468140;73.264908;, + -0.621271;56.934887;73.321701;, + -0.322864;57.282112;73.561638;, + -0.248436;71.854645;70.729988;, + 0.364132;71.854645;70.729988;, + 0.758169;70.963852;70.525764;, + 0.451886;70.057053;70.373367;, + -0.336191;70.057053;70.373360;, + -0.642476;70.963852;70.525764;, + 0.364132;73.351379;70.952026;, + -0.248436;73.351379;70.952026;, + 0.455698;61.693325;71.893539;, + 0.836409;60.952618;72.164238;, + 0.438559;60.724323;72.609840;, + -0.322864;60.724323;72.609840;, + -0.720715;60.952618;72.164238;, + -0.340003;61.693325;71.893539;, + -0.322864;59.615437;73.646515;, + 0.438559;59.615437;73.646515;, + 0.438559;58.736450;73.878487;, + -0.322864;58.736450;73.878487;, + -0.945781;48.617813;70.123962;, + -2.236765;48.914082;70.144196;, + -1.083371;49.222790;70.673294;, + -0.230488;49.179218;70.678032;, + 0.346183;49.179218;70.678032;, + 1.199065;49.222790;70.673294;, + 2.352458;48.914082;70.144196;, + 1.061476;48.617813;70.123962;, + 1.061476;46.043205;70.763565;, + 1.061476;45.315922;70.631477;, + -0.945781;45.315922;70.631477;, + -0.945781;46.043205;70.763565;, + -0.230488;50.744427;71.911613;, + 0.346183;50.744427;71.911613;, + 0.346183;50.290668;71.732040;, + -0.230488;50.290668;71.732040;, + 0.681346;41.262371;69.549492;, + 1.304843;39.983742;69.127930;, + 0.681345;39.288811;68.917770;, + -0.565651;39.288811;68.917770;, + -1.189150;39.983742;69.127930;, + -0.565651;41.262371;69.549492;, + -1.460927;43.933510;69.011917;, + -1.841057;44.861637;69.288826;, + -0.945781;45.001892;69.606239;, + 1.061476;45.001892;69.606239;, + 1.956750;44.861637;69.288826;, + 1.576620;43.933510;69.011917;, + 0.681346;43.309490;69.095680;, + -0.565651;43.309490;69.095680;, + 0.346183;51.987255;71.326790;, + 0.346183;51.362129;71.498451;, + -0.230488;51.362129;71.498451;, + -0.230488;51.987255;71.326790;, + -0.230488;53.243740;71.207901;, + -0.693861;53.723915;71.140991;, + -0.405525;54.361668;71.150101;, + 0.521220;54.361668;71.150101;, + 0.809554;53.723915;71.140991;, + 0.346183;53.243740;71.207901;, + -1.009302;55.219082;71.714081;, + -1.025449;55.481266;71.933746;, + -0.720078;55.895855;72.229713;, + -0.240559;56.053364;72.471550;, + 0.356253;56.053364;72.471550;, + 0.835771;55.895855;72.229713;, + 1.141142;55.481266;71.933746;, + 1.124995;55.219086;71.714081;, + 0.521220;55.117058;71.726410;, + -0.405525;55.117058;71.726410;, + -0.565651;38.742027;59.643063;, + 0.681345;38.742027;59.643063;, + 2.217954;38.776661;57.910744;, + 2.867495;39.371185;54.783699;, + 1.330886;37.590916;54.064663;, + -1.215191;37.590916;54.064663;, + -2.751802;39.371185;54.783699;, + -2.102260;38.776661;57.910744;, + -0.510998;50.219196;39.523888;, + 0.626693;50.219196;39.523888;, + -1.873620;26.054764;52.140381;, + -1.215191;29.188606;52.544262;, + 1.330886;29.188606;52.544262;, + 1.989312;26.054764;52.140381;, + 2.234568;33.522697;35.402046;, + 0.565745;37.216824;36.971302;, + -0.450050;37.216824;36.971302;, + -2.118875;33.522697;35.402046;, + -0.565651;37.436687;67.317482;, + 0.681345;37.436687;67.317482;, + 0.681345;37.195446;65.010315;, + -0.565651;37.195446;65.010315;, + -2.538574;41.449165;68.624062;, + -2.951183;40.302361;68.035011;, + -4.628216;39.976799;65.832298;, + -5.649843;41.666725;65.621597;, + -4.822110;42.776821;67.453926;, + -3.387875;42.233704;68.253677;, + -15.066837;51.644341;50.761562;, + -13.959147;50.054565;53.477966;, + -13.171544;47.816036;53.537487;, + -12.819518;47.844864;50.501919;, + -14.464008;51.746117;48.798912;, + -15.310171;52.496346;49.328674;, + -14.314348;64.191902;63.807819;, + -13.928720;63.485863;64.339012;, + -13.572276;62.304844;64.865723;, + -13.167170;61.067101;65.229462;, + -12.962619;58.564976;64.792267;, + -13.533698;58.152863;63.610909;, + -14.547876;60.533600;62.358631;, + -14.767531;62.889500;62.645046;, + -16.389227;56.612152;48.529644;, + -16.521999;56.337196;48.919449;, + -16.561354;57.052597;49.445042;, + -16.542124;57.916912;49.540932;, + -16.326410;58.083145;50.780964;, + -15.837441;56.684170;51.706242;, + -15.670477;54.844639;50.363594;, + -16.045902;55.654251;48.952625;, + -13.866287;76.274246;65.799950;, + -12.180278;74.145042;67.802490;, + -13.091559;73.365410;66.984734;, + -13.743665;72.909081;66.356583;, + -14.234488;73.032753;65.109230;, + -14.186148;74.380287;64.488983;, + -16.565777;71.776100;50.947868;, + -16.808704;72.864502;50.189095;, + -16.304464;72.598770;49.611454;, + -12.345559;69.888283;65.738831;, + -12.326240;69.568321;65.742271;, + -12.347851;69.289749;65.733955;, + -12.479330;68.737000;65.669327;, + -12.625326;68.411827;65.535583;, + -12.699836;68.129967;65.442223;, + -13.074884;67.260254;64.888390;, + -13.514962;67.960876;64.396080;, + -13.290691;70.147194;64.970589;, + -12.663944;70.601143;65.617447;, + -3.217402;61.792000;69.916451;, + -2.825095;61.031200;70.194847;, + -3.213592;59.684910;70.235397;, + -3.662069;58.804951;70.155693;, + -3.857313;58.498222;70.159554;, + -4.142841;58.239128;70.071960;, + -4.253828;58.105072;69.919785;, + -3.673181;58.191391;69.761742;, + -4.503674;59.898464;69.912605;, + -3.921128;61.008068;69.727730;, + -3.192633;55.084583;70.448547;, + -3.111558;54.744785;70.582428;, + -2.385719;54.680038;70.815506;, + -1.792563;54.532791;70.915924;, + -2.092454;53.903660;70.912537;, + -2.919086;53.404095;70.938629;, + -3.321806;54.305473;70.619545;, + -6.250182;49.317669;69.504501;, + -6.446180;48.549271;69.168564;, + -8.014235;48.270035;68.304420;, + -8.714692;50.122650;68.182167;, + -7.801420;51.763470;68.922615;, + -6.904962;50.679249;69.380814;, + -5.370491;51.804302;70.890030;, + -4.524282;52.698963;71.277252;, + -4.071008;51.834652;71.563766;, + -3.656876;50.892254;71.572784;, + -4.722633;50.442741;71.028595;, + -6.934566;47.145229;68.633385;, + -5.329893;47.425457;69.456062;, + -3.966182;46.793549;69.870453;, + -3.938172;46.091690;69.693321;, + -4.855957;46.051064;69.184097;, + -6.488640;46.472694;68.538559;, + -1.098645;50.973583;71.694138;, + -1.950218;51.124405;71.635803;, + -2.407137;52.052967;71.641159;, + -1.563598;52.530037;71.605721;, + -1.096965;52.051891;71.685753;, + -1.088933;51.424000;71.779518;, + -13.021915;53.488663;61.239902;, + -14.041900;55.868359;59.989929;, + -14.138645;57.389984;61.303249;, + -13.118661;55.010292;62.553223;, + -9.482656;49.163662;66.510292;, + -8.739838;47.333950;66.631050;, + -8.364165;46.637093;66.527420;, + -8.016644;45.674202;66.296745;, + -8.580020;44.714546;64.299896;, + -10.489306;46.236229;61.293800;, + -11.341558;48.442810;61.255726;, + -11.017628;49.345627;63.166481;, + -11.104903;50.871937;64.476662;, + -10.609887;51.240044;65.681923;, + -1.474512;58.398350;72.686012;, + -1.812058;58.122028;72.386444;, + -2.271988;58.206673;72.014107;, + -2.493294;58.257072;71.856972;, + -2.453580;58.564266;71.700531;, + -2.337840;58.869293;71.594749;, + -1.884961;59.340534;71.866264;, + -1.441849;59.261425;72.428749;, + -1.509435;57.558842;72.547653;, + -1.134018;57.032932;72.596863;, + -1.626426;56.943577;72.311104;, + -2.118178;57.221329;72.202080;, + -2.053061;57.660461;72.258942;, + -2.506476;58.943634;70.957291;, + -2.665209;58.656223;71.097099;, + -2.901366;58.531845;70.941536;, + -3.059159;58.630623;70.641769;, + -2.838635;58.924690;70.598763;, + -5.702873;55.781525;69.312447;, + -5.801723;57.970192;69.387802;, + -5.111734;58.670830;69.693558;, + -3.983715;58.045750;69.612915;, + -4.088572;57.287357;69.743599;, + -4.068023;56.821293;69.814964;, + -3.812485;56.347786;69.903954;, + -3.917183;55.572304;70.041840;, + -4.834018;54.668350;69.775490;, + -4.255816;56.976295;70.144569;, + -4.259132;57.438969;70.049438;, + -4.196453;57.593311;70.295357;, + -4.135692;57.244923;70.552475;, + -4.206871;56.894928;70.444580;, + -3.591207;57.666695;71.185127;, + -3.783044;57.561813;70.960518;, + -3.836649;57.893749;70.692024;, + -3.568345;58.165226;70.788643;, + -3.408157;58.065258;71.087090;, + -3.712499;55.370281;70.761353;, + -3.470078;55.416473;71.000565;, + -2.839330;55.237701;71.154488;, + -2.822697;54.988895;70.923553;, + -3.522735;55.051468;70.611397;, + -4.155221;56.153671;70.536667;, + -4.015416;55.782383;70.614700;, + -3.834426;55.439445;70.483299;, + -3.917668;55.755974;70.291489;, + -4.162768;56.246273;70.237022;, + -3.360456;57.598080;71.641861;, + -3.439125;57.720852;71.496246;, + -3.251950;58.117050;71.396477;, + -3.021049;58.246376;71.555511;, + -3.085086;57.947788;71.731819;, + -2.968136;57.499275;71.833702;, + -2.706439;57.428493;71.961281;, + -2.801483;56.969940;71.952415;, + -3.146882;56.789368;71.787590;, + -3.226831;57.136875;71.731987;, + -2.680634;56.379002;72.014671;, + -2.158215;56.120026;72.073334;, + -2.463775;55.692970;71.788239;, + -3.104754;55.851723;71.649239;, + -3.019568;56.201847;71.837547;, + -3.854640;56.847206;71.126411;, + -3.682065;56.967865;71.362190;, + -3.578869;56.835163;71.491699;, + -3.497496;56.487053;71.543762;, + -3.592218;56.139133;71.357254;, + -3.813043;56.122169;71.094490;, + -3.932611;56.500839;71.012955;, + -2.244552;60.233025;70.703400;, + -1.543128;60.758423;71.142464;, + -1.905732;59.838963;71.250046;, + -2.362187;59.370174;70.980934;, + -2.702353;59.358711;70.627777;, + -5.869700;72.868355;69.812210;, + -6.693674;72.552437;69.361465;, + -7.883108;73.155823;69.069405;, + -9.038418;73.717834;68.902939;, + -8.692574;68.018349;68.671463;, + -8.338293;68.821220;68.766014;, + -7.113932;68.489220;68.942162;, + -6.934299;67.847763;68.938004;, + -7.729776;67.687729;68.801422;, + -6.369604;71.293625;68.760429;, + -6.266792;70.787079;68.649055;, + -7.456227;71.390457;68.356995;, + -7.559039;71.897003;68.468361;, + -8.883052;64.549225;67.816406;, + -7.739773;64.507843;68.125893;, + -6.938856;64.740326;68.286102;, + -6.703542;64.155365;68.361183;, + -6.983939;63.322628;68.406448;, + -7.766936;63.148247;68.257492;, + -8.915951;63.725613;67.823822;, + -9.511546;64.526329;67.588211;, + -5.015405;68.108635;68.910416;, + -4.548992;67.765022;68.960190;, + -3.810864;67.410515;69.067841;, + -3.841677;66.485794;69.114601;, + -4.796024;65.666992;68.895134;, + -5.041750;66.255524;68.850845;, + -4.661049;66.762360;68.945168;, + -5.034431;67.060791;68.905960;, + -5.210155;67.702225;68.891853;, + -13.971161;79.561020;64.637955;, + -16.624105;67.403618;50.887012;, + -16.565861;68.256042;51.076977;, + -16.246441;65.836792;52.110813;, + -16.461342;64.238647;50.971241;, + -16.518333;64.809113;50.940807;, + -16.347895;65.639847;50.705421;, + -16.240040;66.024963;50.538170;, + -16.346189;66.463646;50.675999;, + -15.224072;69.450462;45.349747;, + -15.760094;69.213470;44.900475;, + -15.382089;67.644539;44.621346;, + -15.250605;71.985199;59.394108;, + -15.298944;70.637657;60.014355;, + -15.658424;68.405617;58.417435;, + -15.881517;67.001724;56.228691;, + -15.969252;67.785751;55.123196;, + -15.787234;65.044144;44.833035;, + -16.311890;64.137360;44.826756;, + -15.985520;62.777939;45.304832;, + -15.565753;61.898857;45.735703;, + -17.476997;71.515564;49.979080;, + -17.666685;72.283302;49.454979;, + -17.496593;72.551018;49.791622;, + -17.235834;71.461693;50.544392;, + -17.321030;70.610649;50.363503;, + -17.721493;64.826424;44.666374;, + -17.617994;63.963326;44.954117;, + -17.641233;62.991528;45.373825;, + -17.702808;62.384628;45.580582;, + -17.503719;62.235477;45.405041;, + -17.214645;62.635960;45.039047;, + -17.454624;64.026939;44.611488;, + -17.486305;67.273705;44.342857;, + -16.981884;68.189659;44.315788;, + -17.319111;69.740105;44.662109;, + -17.795025;70.146683;45.105915;, + -17.665180;69.380302;44.897526;, + -17.693687;68.057755;44.480789;, + -17.367353;55.732864;49.276451;, + -17.603033;56.078396;49.090916;, + -17.605160;56.805744;49.610336;, + -17.369478;56.460213;49.795868;, + -15.472936;71.487747;47.478798;, + -15.202838;70.700668;46.413372;, + -17.537380;72.607475;48.042797;, + -17.718521;72.353806;47.703808;, + -17.632210;72.075851;47.314693;, + -17.704372;71.657677;46.520592;, + -17.298006;71.305359;45.955624;, + -16.765556;71.583923;46.387459;, + -17.031307;72.320404;47.474106;, + -17.602358;59.477318;47.236622;, + -17.394125;59.880875;47.002865;, + -17.477081;61.053162;46.572697;, + -17.674273;61.202515;46.749283;, + -17.736586;60.467724;47.270435;, + -16.183525;61.853733;46.266216;, + -16.565636;61.401821;46.549980;, + -16.432093;60.244560;47.006794;, + -16.018494;59.781609;47.083752;, + -15.774214;60.941624;46.644413;, + -17.282442;56.325546;47.880959;, + -17.057690;55.958496;48.038124;, + -16.647417;56.352184;47.652000;, + -16.585321;57.122021;47.273716;, + -17.001896;57.588127;47.207531;, + -17.288742;57.185337;47.428646;, + -15.462021;56.205631;47.969166;, + -14.615860;55.455399;47.439404;, + -15.475274;59.141663;46.797791;, + -15.730730;57.946342;47.180832;, + -15.798254;57.165806;47.545010;, + -8.445348;40.588070;59.654636;, + -7.278510;39.094028;59.898464;, + -6.654146;38.770531;57.926445;, + -7.458086;40.307079;54.648247;, + -9.828319;42.345741;53.625164;, + -10.191217;42.303234;56.659534;, + -4.566577;37.981155;65.199509;, + -3.095984;38.031998;67.529678;, + -2.411773;37.506966;67.308975;, + -2.439468;37.185844;65.011452;, + -3.987151;37.529453;63.242748;, + -7.714421;47.308811;43.157204;, + -8.049258;44.606380;41.254444;, + -6.923997;49.765636;40.291908;, + -7.906905;51.757496;43.185513;, + -5.034308;41.098293;49.664669;, + -5.924514;37.964451;49.232517;, + -7.618621;39.077587;48.033279;, + -7.929698;44.502201;46.021900;, + -8.122182;48.950886;46.050209;, + -9.087849;46.348259;49.153736;, + -6.570920;44.494156;50.192978;, + -9.377964;32.507309;43.848045;, + -8.752393;35.209740;45.489132;, + -7.924005;29.785124;47.506119;, + -6.942506;32.835922;36.246323;, + -7.997331;36.389206;37.566708;, + -9.269050;31.085709;38.438145;, + -5.026693;51.522896;39.552273;, + -3.825413;48.113850;38.322987;, + -2.217535;51.807980;39.149200;, + -5.770691;27.953976;51.289192;, + -4.258096;26.840841;52.409973;, + -14.393597;77.704041;61.829361;, + -14.713458;75.810089;60.518398;, + -9.962842;51.383026;45.418407;, + -12.572998;52.681652;46.818928;, + -11.410388;71.412788;66.828568;, + -11.823878;72.111282;66.787140;, + -10.865562;72.920639;67.524742;, + -9.757876;72.328529;67.772369;, + -9.662718;71.817146;67.674042;, + -10.356916;71.710754;67.467834;, + -12.698816;64.099892;66.268402;, + -13.037525;65.302979;65.766319;, + -12.597655;66.151749;66.249695;, + -11.851852;65.260712;66.830208;, + -11.350214;64.474258;67.163437;, + -11.757308;64.162216;67.085007;, + -6.766061;66.263695;68.781013;, + -6.216946;66.492447;68.869522;, + -5.420580;66.654190;68.999702;, + -5.795310;66.145882;68.879105;, + -6.606440;65.917046;68.748558;, + -3.320212;69.375824;69.355331;, + -3.709178;68.309135;68.969109;, + -4.438835;68.674232;68.849876;, + -4.890217;69.410423;68.822868;, + -4.989970;69.919693;68.927238;, + -4.149621;70.250198;69.340469;, + -10.614668;69.347672;67.888069;, + -10.116972;69.031830;68.220833;, + -10.474522;68.229591;68.132561;, + -11.167147;67.985580;67.780556;, + -11.836740;68.545883;67.245644;, + -11.641810;69.105743;67.264893;, + -6.151947;45.663696;67.791992;, + -4.526884;45.235153;68.449783;, + -4.146754;44.288376;68.208298;, + -5.771818;44.716919;67.550507;, + -10.450169;70.821953;67.907776;, + -9.765457;70.555244;68.220161;, + -10.446616;70.475075;67.861671;, + -11.461811;70.225883;67.223770;, + -11.484657;70.544380;67.228043;, + -7.470517;71.123924;68.610703;, + -6.279786;70.515015;68.889984;, + -5.857738;69.792030;69.041931;, + -6.325098;70.114395;68.970451;, + -7.503110;70.711578;68.750259;, + -8.226480;70.998123;68.542450;, + -11.757306;66.061752;67.182938;, + -12.601673;66.949631;66.694183;, + -12.539265;67.224754;66.799522;, + -11.842525;66.625931;67.309013;, + -11.209784;66.065163;67.525764;, + -8.280282;65.338531;68.297150;, + -9.418466;65.381676;67.974045;, + -10.128361;65.908348;67.834045;, + -9.527828;65.743866;67.987259;, + -8.435413;65.687355;68.321404;, + -5.819896;67.066292;68.770218;, + -5.441578;66.767700;68.786415;, + -6.236395;66.607925;68.646599;, + -6.614712;66.906517;68.630394;, + -11.348783;70.134789;66.847923;, + -10.339741;70.382629;67.493866;, + -10.382211;70.102104;67.500931;, + -11.391253;69.854263;66.854988;, + -6.542440;69.634361;68.798340;, + -7.746741;69.958893;68.556709;, + -8.281987;70.288345;68.319221;, + -8.238889;70.568634;68.310120;, + -7.507647;70.645966;68.558647;, + -6.346445;70.041153;68.809387;, + -11.501963;67.061974;67.315300;, + -11.152501;66.503914;67.438225;, + -11.688239;66.665207;67.208046;, + -12.363090;67.291313;66.688377;, + -12.188178;67.618729;66.799240;, + -8.220766;66.419502;68.373581;, + -7.848414;66.116623;68.406441;, + -8.381545;65.898521;68.278526;, + -9.477689;65.951813;67.955978;, + -9.894917;66.509720;67.920815;, + -9.171124;66.759315;68.210503;, + -17.429979;70.690262;47.136501;, + -17.300325;71.068329;47.941162;, + -17.023735;70.899750;48.289326;, + -16.861496;70.700005;48.118645;, + -16.944355;70.155487;47.524551;, + -17.236248;69.977158;46.890572;, + -17.226145;68.629349;45.660595;, + -16.823431;68.867996;46.195717;, + -16.729546;68.371811;45.875668;, + -16.873161;67.340813;45.524662;, + -17.105501;66.543564;45.306343;, + -17.364603;67.335907;45.122231;, + -17.210119;64.694969;45.653248;, + -16.824369;65.503990;45.698051;, + -16.693214;64.944427;45.835949;, + -16.865488;63.931744;46.212234;, + -17.217360;63.707901;46.045494;, + -17.257675;62.592293;47.044037;, + -16.951664;62.847736;47.248653;, + -16.837200;62.523624;47.585892;, + -16.968355;61.957218;48.121510;, + -17.261364;61.378471;48.161098;, + -17.422873;61.297504;47.813133;, + -17.417713;61.989571;47.233940;, + -17.641174;59.537712;47.829380;, + -17.572170;59.655956;48.204098;, + -17.551355;59.356380;48.625698;, + -17.610889;58.393185;48.722862;, + -17.640314;57.667088;48.205170;, + -17.649786;58.512043;47.733288;, + -17.048664;58.888443;50.137520;, + -17.266785;59.234547;49.939693;, + -17.237478;60.194298;49.885609;, + -17.031002;61.167274;50.192562;, + -16.847815;61.964878;50.507847;, + -16.794952;61.394268;50.541176;, + -16.881783;59.817486;50.241066;, + -16.520054;67.426628;49.977383;, + -16.340061;67.565254;49.576904;, + -16.329565;67.737488;49.665955;, + -16.615074;68.525681;49.726234;, + -16.931223;69.285706;49.834728;, + -16.825703;68.358887;50.174931;, + -17.551683;71.775742;48.843681;, + -17.362616;71.012024;49.371750;, + -16.936705;70.317307;49.319000;, + -16.958307;70.820000;49.096962;, + -17.196766;71.293510;48.824539;, + -17.364233;71.554535;48.518509;, + -16.104570;66.411118;49.371330;, + -15.935796;66.244766;48.838696;, + -15.850468;66.336823;48.616936;, + -15.866637;66.633751;48.735458;, + -16.035194;66.980598;49.101681;, + -16.187799;66.850029;49.515789;, + -16.126511;65.664818;49.415100;, + -16.190468;65.289612;49.597702;, + -16.041357;65.036949;49.353294;, + -15.899192;65.163132;49.153240;, + -15.851497;65.262131;48.876595;, + -15.929707;65.511154;48.894043;, + -16.490780;64.863365;50.058357;, + -16.720278;64.048309;50.266247;, + -16.791843;63.235886;49.945076;, + -16.568014;63.725044;49.778568;, + -16.373796;64.287704;49.843987;, + -16.368130;64.613602;49.802601;, + -17.217245;60.928139;48.799614;, + -16.907705;61.495392;48.765743;, + -16.815966;61.430393;48.922810;, + -16.765753;61.620747;49.208321;, + -16.750641;62.064793;49.391998;, + -17.015625;61.599758;49.547829;, + -17.299763;60.700314;49.200974;, + -15.614582;65.022964;47.637421;, + -15.567803;65.459961;48.141235;, + -15.567249;65.398903;48.325111;, + -15.481506;65.150154;48.319054;, + -15.194538;65.020020;48.325905;, + -14.993324;64.845505;48.207409;, + -15.239534;64.746971;48.103077;, + -15.478746;64.410210;48.011654;, + -15.595269;64.437210;47.602276;, + -15.577514;66.367973;47.512394;, + -15.587451;66.170380;48.126865;, + -15.597684;65.873161;48.000294;, + -15.594285;65.462585;47.465916;, + -15.623907;65.954384;47.004478;, + -16.163324;69.702736;47.006084;, + -16.325090;70.179176;47.432697;, + -16.250225;70.720009;48.027470;, + -15.931003;70.309883;48.304401;, + -15.873635;69.724388;47.707878;, + -15.683133;67.779671;46.594791;, + -15.731870;67.422462;46.281384;, + -15.854837;66.999779;45.793983;, + -16.054199;66.752342;45.468372;, + -16.222563;67.364136;45.404732;, + -16.119137;68.397461;45.749371;, + -15.815002;68.405243;46.444931;, + -16.121750;63.590012;46.468613;, + -16.268213;63.939720;46.142395;, + -16.091532;64.937843;45.725086;, + -15.811086;65.184181;46.013538;, + -15.725762;64.678902;46.459305;, + -15.859744;64.082863;46.497070;, + -15.926024;62.989491;47.503284;, + -15.843936;62.895470;47.927868;, + -15.889503;62.652355;48.086254;, + -15.987683;62.236328;48.207397;, + -16.216883;61.851406;48.240868;, + -16.364000;61.953060;48.036350;, + -16.214388;62.510639;47.489380;, + -15.595205;68.402351;48.685631;, + -15.764951;68.966614;49.253052;, + -15.941114;69.119171;49.475651;, + -15.975425;68.539047;49.658321;, + -15.736507;67.748260;49.593555;, + -15.532450;67.764122;48.843464;, + -16.346699;71.171959;48.547527;, + -16.586071;71.314072;48.751896;, + -16.308315;70.874519;49.045010;, + -16.068941;70.732407;48.840641;, + -15.518588;67.185043;48.375042;, + -15.668723;67.181129;49.142185;, + -15.708892;66.982887;49.023090;, + -15.584141;66.642441;48.652946;, + -15.499434;66.834618;48.047215;, + -15.092333;64.988647;49.170685;, + -14.719754;65.032219;48.968830;, + -15.088419;65.204224;48.722855;, + -15.558498;65.271629;48.793575;, + -15.560716;65.164146;49.081577;, + -15.725241;64.271202;49.771698;, + -15.177734;64.013451;49.696068;, + -14.787019;64.137657;49.657894;, + -15.119205;64.553688;49.607170;, + -15.572768;64.774559;49.574314;, + -15.788092;64.616272;49.700668;, + -15.866501;61.957813;49.102505;, + -16.104591;61.579231;49.139591;, + -16.162405;61.394108;48.852608;, + -15.924313;61.772690;48.815525;, + -15.717142;63.853062;48.277557;, + -15.248356;64.229958;48.236816;, + -14.928309;64.044220;48.320805;, + -15.315211;63.808681;48.458256;, + -15.750184;63.597157;48.425735;, + -15.838925;62.957794;48.812828;, + -15.734231;63.319706;48.668522;, + -15.316200;63.570396;48.738605;, + -15.018495;63.530445;48.836395;, + -15.316642;63.369987;49.007088;, + -15.719042;63.048027;49.053600;, + -15.980401;62.618446;49.327629;, + -15.722883;62.949089;49.349140;, + -15.299875;63.228001;49.333504;, + -14.944921;63.170467;49.313648;, + -15.276262;63.393970;49.504761;, + -15.797068;63.623280;49.678589;, + -16.084009;63.113098;49.537724;, + -13.713379;64.330490;47.964046;, + -14.052535;64.570992;47.942337;, + -13.642416;64.727051;47.977783;, + -13.303260;64.486542;47.999493;, + -13.622803;64.867424;48.405872;, + -13.966632;65.018639;48.594540;, + -13.617676;64.821175;48.841949;, + -13.268164;64.565086;48.723537;, + -13.279479;64.634613;48.428219;, + -13.639128;64.418907;49.285206;, + -13.985892;64.368164;49.509857;, + -13.685705;63.932621;49.534199;, + -13.345568;63.706188;49.357521;, + -13.317171;63.849289;49.209923;, + -13.310544;64.126472;49.161942;, + -13.407900;63.991501;48.212700;, + -13.378046;63.842590;48.457138;, + -13.448744;63.599464;48.515327;, + -13.854336;63.502201;48.416882;, + -14.191032;63.583447;48.318527;, + -13.815295;63.829620;48.172535;, + -13.448471;63.334648;48.762100;, + -13.445812;63.215389;48.942604;, + -13.849804;63.106457;48.948494;, + -14.219306;63.163155;48.878448;, + -13.859849;63.274899;48.680103;, + -13.760653;63.319157;49.397713;, + -14.160416;63.179287;49.390675;, + -13.826283;62.948902;49.207973;, + -13.426521;63.088772;49.215008;, + -14.635970;54.643333;55.040348;, + -14.147105;54.452450;57.104122;, + -13.158237;52.062576;58.359673;, + -13.383351;51.207062;56.417542;, + -14.475186;52.802021;53.698296;, + -15.304926;68.186958;61.412601;, + -14.881803;70.420540;62.992817;, + -14.420024;70.296165;64.247795;, + -14.572822;68.117760;63.612282;, + -15.007770;66.809219;62.450409;, + -15.942458;60.483253;55.162083;, + -15.911017;62.698605;56.534737;, + -15.702338;64.100548;58.725273;, + -15.429958;62.728092;59.776882;, + -15.204959;60.373241;59.487785;, + -15.173355;58.842800;58.182579;, + -15.579103;59.052357;56.106335;, + -16.138069;62.572739;52.645168;, + -16.264805;60.348454;51.283993;, + -16.459799;60.184284;50.041332;, + -16.446999;61.758488;50.400814;, + -16.268988;63.355892;51.544556;, + -10.984770;59.171497;67.685600;, + -10.020209;59.249851;68.473320;, + -8.955151;58.376186;68.852272;, + -8.749995;56.214470;68.792267;, + -9.638556;54.576092;68.034088;, + -10.808270;56.659454;67.306381;, + -2.919356;66.059219;69.545708;, + -2.935508;67.427605;69.470802;, + -2.918927;68.351173;69.428009;, + -2.480527;69.424149;69.710426;, + -1.804423;69.821587;69.985138;, + -1.545340;68.905617;69.955627;, + -2.229242;66.840546;69.764442;, + -0.336191;68.430237;70.273201;, + 0.451886;68.430237;70.273201;, + 1.170602;66.378647;70.287239;, + 0.776565;65.605095;70.453270;, + -0.660870;65.605095;70.453270;, + -1.054910;66.378647;70.287239;, + -0.340003;62.900276;71.266731;, + -1.058722;62.556232;71.091965;, + -0.660870;63.757217;70.827621;, + 0.776565;63.757217;70.827621;, + 1.174414;62.556232;71.091965;, + 0.455698;62.900276;71.266731;, + -1.167291;72.975906;71.066788;, + -1.561331;72.093285;70.835541;, + -2.229468;71.696121;70.544289;, + -3.073710;72.557281;70.563393;, + -4.494940;62.101410;69.479050;, + -5.105907;62.962933;69.143433;, + -4.820986;63.796482;69.076340;, + -3.863764;64.606781;69.322395;, + -3.894372;63.243977;69.496239;, + -5.328853;60.484348;69.611397;, + -6.107750;61.054867;69.396408;, + -6.771271;62.188259;69.118797;, + -5.982145;62.362251;69.253105;, + -5.354429;61.491180;69.538467;, + -8.287384;62.278648;68.682831;, + -7.628970;61.197292;69.140694;, + -8.336544;60.522438;69.069862;, + -9.515740;61.319351;68.567192;, + -9.953496;62.560196;68.243744;, + -9.432715;62.866348;68.253067;, + -11.047081;62.546486;67.962914;, + -10.617968;61.313049;68.317123;, + -11.533367;61.247047;67.476128;, + -11.962482;62.480480;67.121918;, + 2.654264;41.449165;68.624062;, + 3.503563;42.233704;68.253677;, + 4.937797;42.776821;67.453926;, + 5.765529;41.666725;65.621597;, + 4.743902;39.976799;65.832298;, + 3.066870;40.302361;68.035011;, + 14.579695;51.746113;48.798912;, + 12.935205;47.844864;50.501919;, + 13.287230;47.816036;53.537487;, + 14.074833;50.054565;53.477966;, + 15.182524;51.644341;50.761562;, + 15.425858;52.496346;49.328674;, + 14.663563;60.533600;62.358627;, + 13.649384;58.152863;63.610909;, + 13.078305;58.564976;64.792267;, + 13.282856;61.067101;65.229462;, + 13.687963;62.304844;64.865723;, + 14.044406;63.485863;64.339012;, + 14.430035;64.191902;63.807819;, + 14.883218;62.889500;62.645046;, + 15.786164;54.844639;50.363594;, + 15.953128;56.684170;51.706242;, + 16.442099;58.083145;50.780964;, + 16.657810;57.916912;49.540932;, + 16.677040;57.052597;49.445042;, + 16.637686;56.337196;48.919449;, + 16.504915;56.612152;48.529644;, + 16.161591;55.654251;48.952625;, + 14.350174;73.032753;65.109230;, + 13.859351;72.909081;66.356583;, + 13.207247;73.365410;66.984734;, + 12.295963;74.145042;67.802490;, + 13.981975;76.274246;65.799950;, + 14.301835;74.380287;64.488983;, + 16.420151;72.598770;49.611454;, + 16.924391;72.864502;50.189095;, + 16.681463;71.776100;50.947868;, + 13.406377;70.147194;64.970589;, + 13.630649;67.960876;64.396080;, + 13.190571;67.260254;64.888390;, + 12.815522;68.129967;65.442223;, + 12.741013;68.411827;65.535583;, + 12.595016;68.737000;65.669327;, + 12.463537;69.289749;65.733955;, + 12.441926;69.568321;65.742271;, + 12.461246;69.888283;65.738831;, + 12.779631;70.601143;65.617447;, + 4.619360;59.898464;69.912605;, + 3.914352;58.191391;69.761742;, + 4.369514;58.105072;69.919785;, + 4.258527;58.239124;70.071960;, + 3.973000;58.498222;70.159554;, + 3.777756;58.804951;70.155693;, + 3.329280;59.684910;70.235397;, + 2.940784;61.031204;70.194847;, + 3.333090;61.791996;69.916451;, + 4.036814;61.008068;69.727730;, + 3.034772;53.404091;70.938629;, + 2.208143;53.903660;70.912537;, + 1.908253;54.532791;70.915924;, + 2.501408;54.680038;70.815506;, + 3.227245;54.744785;70.582428;, + 3.308319;55.084583;70.448547;, + 3.437492;54.305473;70.619545;, + 7.917106;51.763470;68.922615;, + 8.830380;50.122650;68.182167;, + 8.129922;48.270035;68.304428;, + 6.561869;48.549271;69.168564;, + 6.365870;49.317665;69.504501;, + 7.020649;50.679249;69.380814;, + 5.486177;51.804302;70.890030;, + 4.838321;50.442738;71.028595;, + 3.772563;50.892250;71.572784;, + 4.186694;51.834652;71.563766;, + 4.639969;52.698963;71.277252;, + 4.971645;46.051064;69.184097;, + 4.053861;46.091690;69.693321;, + 4.081872;46.793549;69.870453;, + 5.445580;47.425457;69.456062;, + 7.050251;47.145229;68.633385;, + 6.604327;46.472694;68.538559;, + 1.214336;50.973583;71.694138;, + 1.204623;51.423996;71.779518;, + 1.212656;52.051891;71.685745;, + 1.679286;52.530037;71.605721;, + 2.522823;52.052967;71.641159;, + 2.065906;51.124401;71.635803;, + 13.137602;53.488663;61.239902;, + 13.234347;55.010292;62.553223;, + 14.254332;57.389984;61.303249;, + 14.157586;55.868359;59.989929;, + 11.220590;50.871937;64.476662;, + 11.133315;49.345627;63.166481;, + 11.457245;48.442810;61.255726;, + 10.604994;46.236229;61.293800;, + 8.695706;44.714546;64.299896;, + 8.132330;45.674198;66.296745;, + 8.479852;46.637093;66.527420;, + 8.855523;47.333950;66.631050;, + 9.598343;49.163662;66.510292;, + 10.725574;51.240044;65.681923;, + 1.590202;58.398350;72.686012;, + 1.557539;59.261425;72.428749;, + 2.000650;59.340534;71.866264;, + 2.453526;58.869293;71.594749;, + 2.569266;58.564266;71.700531;, + 2.608980;58.257072;71.856972;, + 2.387675;58.206673;72.014107;, + 1.927747;58.122028;72.386436;, + 1.625123;57.558842;72.547653;, + 2.168747;57.660461;72.258942;, + 2.233865;57.221329;72.202080;, + 1.742114;56.943577;72.311104;, + 1.249707;57.032932;72.596863;, + 3.174846;58.630623;70.641769;, + 3.017052;58.531845;70.941544;, + 2.780896;58.656223;71.097099;, + 2.622163;58.943634;70.957291;, + 2.954322;58.924690;70.598763;, + 4.032869;55.572304;70.041840;, + 3.928171;56.347786;69.903954;, + 4.183709;56.821293;69.814964;, + 4.204257;57.287357;69.743599;, + 4.099401;58.045750;69.612915;, + 5.227420;58.717506;69.747047;, + 5.917409;57.970192;69.387802;, + 5.818560;55.781525;69.312447;, + 4.949705;54.668350;69.775490;, + 4.251379;57.244923;70.552475;, + 4.312139;57.593311;70.295357;, + 4.374818;57.438969;70.049438;, + 4.371503;56.976295;70.144569;, + 4.322558;56.894928;70.444588;, + 3.706894;57.666695;71.185127;, + 3.523844;58.065258;71.087090;, + 3.684032;58.165226;70.788643;, + 3.952336;57.893749;70.692024;, + 3.898730;57.561813;70.960518;, + 3.828186;55.370281;70.761353;, + 3.638421;55.051468;70.611397;, + 2.938384;54.988895;70.923553;, + 2.955018;55.237701;71.154488;, + 3.585764;55.416473;71.000565;, + 4.270908;56.153671;70.536667;, + 4.278454;56.246273;70.237022;, + 4.033355;55.755974;70.291489;, + 3.950112;55.439445;70.483299;, + 4.131103;55.782383;70.614700;, + 3.476142;57.598080;71.641861;, + 3.200772;57.947784;71.731819;, + 3.136734;58.246376;71.555511;, + 3.367636;58.117046;71.396477;, + 3.554811;57.720852;71.496246;, + 3.262567;56.789368;71.787590;, + 2.917169;56.969940;71.952415;, + 2.822125;57.428493;71.961281;, + 3.083823;57.499275;71.833702;, + 3.342518;57.136875;71.731987;, + 3.220440;55.851723;71.649239;, + 2.579464;55.692970;71.788246;, + 2.273904;56.120026;72.073334;, + 2.796321;56.379002;72.014671;, + 3.135255;56.201847;71.837547;, + 3.928730;56.122169;71.094490;, + 3.707905;56.139133;71.357254;, + 3.613183;56.487053;71.543762;, + 3.694555;56.835163;71.491699;, + 3.797751;56.967865;71.362190;, + 3.970327;56.847206;71.126411;, + 4.048297;56.500839;71.012955;, + 2.477874;59.370174;70.980934;, + 2.021420;59.838963;71.250046;, + 1.658818;60.758423;71.142464;, + 2.360240;60.233025;70.703400;, + 2.818039;59.358707;70.627777;, + 5.985386;72.868355;69.812210;, + 9.154104;73.717827;68.902939;, + 7.998795;73.155823;69.069405;, + 6.809360;72.552437;69.361465;, + 7.049986;67.847763;68.938004;, + 7.229618;68.489220;68.942162;, + 8.453979;68.821220;68.766014;, + 8.808260;68.018349;68.671463;, + 7.845464;67.687729;68.801422;, + 6.485291;71.293625;68.760429;, + 7.674726;71.897003;68.468361;, + 7.571912;71.390457;68.356995;, + 6.382478;70.787079;68.649055;, + 9.031637;63.725613;67.823822;, + 7.882623;63.148247;68.257492;, + 7.099626;63.322628;68.406448;, + 6.819228;64.155365;68.361183;, + 7.054543;64.740326;68.286102;, + 7.855459;64.507843;68.125900;, + 8.998738;64.549225;67.816406;, + 9.627233;64.526329;67.588211;, + 5.131092;68.108627;68.910416;, + 5.325842;67.702225;68.891853;, + 5.150118;67.060791;68.905960;, + 4.776736;66.762360;68.945175;, + 5.157436;66.255524;68.850845;, + 4.911710;65.666992;68.895134;, + 3.957364;66.485794;69.114601;, + 3.926550;67.410515;69.067841;, + 4.664679;67.765022;68.960190;, + 14.086849;79.561020;64.637955;, + 16.739792;67.403618;50.887012;, + 16.461876;66.463646;50.675999;, + 16.355726;66.024963;50.538170;, + 16.463581;65.639847;50.705421;, + 16.634022;64.809120;50.940807;, + 16.577030;64.238647;50.971241;, + 16.362127;65.836792;52.110813;, + 16.681547;68.256050;51.076977;, + 15.875778;69.213470;44.900475;, + 15.339758;69.450462;45.349747;, + 14.734314;69.212395;45.168884;, + 15.497775;67.644539;44.621346;, + 15.366291;71.985199;59.394108;, + 16.084938;67.785751;55.123196;, + 15.997204;67.001724;56.228691;, + 15.774111;68.405617;58.417435;, + 15.414630;70.637657;60.014355;, + 15.681439;61.898857;45.735703;, + 16.101208;62.777939;45.304836;, + 16.427576;64.137360;44.826752;, + 15.902921;65.044144;44.833035;, + 17.351522;71.461693;50.544392;, + 17.612280;72.551018;49.791622;, + 17.782373;72.283302;49.454979;, + 17.592686;71.515564;49.979080;, + 17.436718;70.610649;50.363503;, + 17.837181;64.826424;44.666374;, + 17.570311;64.026939;44.611488;, + 17.330330;62.635960;45.039047;, + 17.619406;62.235477;45.405041;, + 17.818495;62.384628;45.580582;, + 17.756922;62.991528;45.373825;, + 17.733683;63.963326;44.954117;, + 17.780867;69.380302;44.897526;, + 17.910711;70.146683;45.105915;, + 17.434797;69.740105;44.662109;, + 17.097572;68.189659;44.315792;, + 17.601992;67.273705;44.342861;, + 17.809376;68.057755;44.480789;, + 17.720846;56.805744;49.610336;, + 17.718719;56.078396;49.090916;, + 17.483042;55.732864;49.276451;, + 17.485168;56.460213;49.795868;, + 14.713079;70.462608;46.232510;, + 15.318524;70.700668;46.413372;, + 15.588622;71.487747;47.478798;, + 17.653069;72.607475;48.042797;, + 17.146994;72.320404;47.474106;, + 16.881243;71.583923;46.387459;, + 17.413694;71.305359;45.955624;, + 17.820061;71.657677;46.520592;, + 17.747896;72.075859;47.314693;, + 17.834208;72.353806;47.703804;, + 17.718044;59.477318;47.236622;, + 17.852270;60.467724;47.270435;, + 17.789957;61.202515;46.749283;, + 17.592766;61.053162;46.572697;, + 17.509811;59.880875;47.002865;, + 16.299212;61.853733;46.266216;, + 15.889900;60.941624;46.644413;, + 16.134180;59.781609;47.083752;, + 16.547779;60.244560;47.006794;, + 16.681320;61.401821;46.549984;, + 17.117582;57.588127;47.207531;, + 16.701010;57.122021;47.273716;, + 16.763103;56.352184;47.652000;, + 17.173376;55.958496;48.038124;, + 17.398129;56.325546;47.880959;, + 17.404427;57.185337;47.428650;, + 15.577708;56.205627;47.969166;, + 15.913940;57.165806;47.545010;, + 15.846416;57.946342;47.180832;, + 15.590961;59.141663;46.797791;, + 14.731544;55.455399;47.439404;, + 9.944007;42.345741;53.625164;, + 7.573774;40.307079;54.648247;, + 6.769834;38.770535;57.926445;, + 7.394196;39.094028;59.898464;, + 8.561033;40.588070;59.654636;, + 10.306905;42.303234;56.659534;, + 2.555157;37.185844;65.011452;, + 2.527462;37.506966;67.308975;, + 3.211673;38.031998;67.529678;, + 4.682263;37.981155;65.199509;, + 4.102839;37.529453;63.242748;, + 7.830108;47.308811;43.157204;, + 8.022593;51.757496;43.185513;, + 7.039683;49.765636;40.291908;, + 8.164946;44.606380;41.254444;, + 9.203535;46.348259;49.153736;, + 8.237869;48.950886;46.050209;, + 8.045384;44.502201;46.021900;, + 7.734308;39.077587;48.033279;, + 6.040202;37.964451;49.232517;, + 5.149999;41.098293;49.664669;, + 6.686608;44.494156;50.192978;, + 8.039693;29.785124;47.506119;, + 8.868079;35.209740;45.489132;, + 9.493651;32.507309;43.848045;, + 9.384735;31.085709;38.438145;, + 8.113016;36.389206;37.566708;, + 7.058194;32.835922;36.246323;, + 5.142379;51.522896;39.552273;, + 2.333225;51.807980;39.149200;, + 3.941101;48.113850;38.322987;, + 4.373784;26.840841;52.409973;, + 5.886379;27.953976;51.289192;, + 14.509283;77.704041;61.829361;, + 14.829144;75.810089;60.518398;, + 14.457141;70.604607;45.675373;, + 12.688684;52.681652;46.818928;, + 10.078528;51.383022;45.418407;, + 9.778404;71.817146;67.674042;, + 9.873562;72.328529;67.772369;, + 10.981249;72.920631;67.524742;, + 11.939566;72.111282;66.787140;, + 11.526075;71.412788;66.828560;, + 10.472603;71.710754;67.467834;, + 12.814504;64.099892;66.268402;, + 11.872994;64.162216;67.085007;, + 11.465900;64.474258;67.163437;, + 11.967539;65.260712;66.830208;, + 12.713342;66.151749;66.249695;, + 13.153212;65.302979;65.766319;, + 5.910997;66.145882;68.879105;, + 5.536267;66.654190;68.999702;, + 6.332633;66.492447;68.869522;, + 6.881747;66.263695;68.781013;, + 6.722126;65.917046;68.748558;, + 5.105657;69.919693;68.927238;, + 5.005903;69.410423;68.822868;, + 4.554521;68.674232;68.849876;, + 3.824864;68.309135;68.969109;, + 3.435898;69.375824;69.355331;, + 4.265308;70.250198;69.340469;, + 11.952425;68.545883;67.245644;, + 11.282833;67.985580;67.780556;, + 10.590207;68.229599;68.132561;, + 10.232657;69.031830;68.220833;, + 10.730354;69.347672;67.888069;, + 11.757496;69.105743;67.264893;, + 6.267634;45.663696;67.791992;, + 5.887505;44.716919;67.550507;, + 4.262442;44.288372;68.208298;, + 4.642571;45.235153;68.449783;, + 10.565856;70.821953;67.907776;, + 11.600344;70.544380;67.228043;, + 11.577497;70.225883;67.223770;, + 10.562302;70.475075;67.861671;, + 9.881144;70.555244;68.220161;, + 7.618796;70.711578;68.750259;, + 6.440785;70.114388;68.970451;, + 5.973425;69.792030;69.041931;, + 6.395473;70.515007;68.889984;, + 7.586203;71.123924;68.610703;, + 8.342167;70.998123;68.542450;, + 11.872992;66.061752;67.182938;, + 11.325470;66.065163;67.525764;, + 11.958210;66.625931;67.309013;, + 12.654950;67.224754;66.799522;, + 12.717360;66.949631;66.694183;, + 8.395967;65.338531;68.297150;, + 8.551100;65.687355;68.321404;, + 9.643514;65.743866;67.987259;, + 10.244047;65.908348;67.834045;, + 9.534150;65.381676;67.974045;, + 6.352082;66.607925;68.646599;, + 5.557265;66.767700;68.786423;, + 5.935583;67.066292;68.770218;, + 6.730400;66.906517;68.630394;, + 10.497897;70.102104;67.500931;, + 10.455427;70.382629;67.493866;, + 11.464467;70.134789;66.847923;, + 11.506937;69.854263;66.854988;, + 7.623333;70.645973;68.558647;, + 8.354575;70.568634;68.310120;, + 8.397674;70.288345;68.319221;, + 7.862427;69.958893;68.556709;, + 6.658127;69.634361;68.798340;, + 6.462132;70.041153;68.809387;, + 12.478778;67.291313;66.688377;, + 11.803926;66.665207;67.208046;, + 11.268188;66.503914;67.438225;, + 11.617651;67.061974;67.315300;, + 12.303864;67.618729;66.799240;, + 8.336453;66.419510;68.373581;, + 9.286811;66.759315;68.210503;, + 10.010603;66.509720;67.920815;, + 9.593375;65.951813;67.955978;, + 8.497231;65.898521;68.278526;, + 7.964100;66.116623;68.406441;, + 17.060043;70.155487;47.524548;, + 16.977182;70.700005;48.118645;, + 17.139421;70.899750;48.289326;, + 17.416012;71.068329;47.941158;, + 17.545664;70.690262;47.136501;, + 17.351934;69.977158;46.890572;, + 17.221189;66.543564;45.306343;, + 16.988846;67.340813;45.524662;, + 16.845232;68.371811;45.875668;, + 16.939117;68.867996;46.195717;, + 17.341833;68.629349;45.660599;, + 17.480291;67.335907;45.122231;, + 16.981171;63.931744;46.212234;, + 16.808901;64.944427;45.835949;, + 16.940056;65.503990;45.698055;, + 17.325806;64.694969;45.653248;, + 17.333046;63.707901;46.045494;, + 17.373362;62.592293;47.044037;, + 17.533400;61.989571;47.233940;, + 17.538557;61.297504;47.813133;, + 17.377050;61.378471;48.161098;, + 17.084042;61.957218;48.121510;, + 16.952885;62.523624;47.585892;, + 17.067348;62.847736;47.248653;, + 17.756001;57.667091;48.205170;, + 17.726576;58.393188;48.722862;, + 17.667044;59.356384;48.625698;, + 17.687859;59.655956;48.204098;, + 17.756863;59.537712;47.829380;, + 17.765472;58.512043;47.733288;, + 17.164349;58.888443;50.137520;, + 16.997469;59.817486;50.241066;, + 16.910639;61.394268;50.541176;, + 16.963501;61.964878;50.507847;, + 17.146688;61.167274;50.192562;, + 17.353167;60.194298;49.885605;, + 17.382475;59.234547;49.939693;, + 17.046909;69.285706;49.834724;, + 16.730762;68.525681;49.726234;, + 16.445251;67.737488;49.665955;, + 16.455748;67.565254;49.576904;, + 16.635740;67.426628;49.977383;, + 16.941389;68.358887;50.174927;, + 17.667368;71.775742;48.843681;, + 17.479918;71.554535;48.518509;, + 17.312452;71.293510;48.824539;, + 17.073994;70.820007;49.096962;, + 17.052391;70.317307;49.319000;, + 17.478302;71.012024;49.371750;, + 16.150881;66.980598;49.101681;, + 15.982324;66.633751;48.735458;, + 15.966154;66.336823;48.616936;, + 16.051481;66.244766;48.838696;, + 16.220257;66.411118;49.371330;, + 16.303486;66.850029;49.515789;, + 16.242199;65.664818;49.415100;, + 16.045393;65.511154;48.894043;, + 15.967184;65.262131;48.876595;, + 16.014877;65.163132;49.153240;, + 16.157045;65.036949;49.353294;, + 16.306154;65.289612;49.597702;, + 16.606468;64.863365;50.058353;, + 16.483816;64.613602;49.802601;, + 16.489483;64.287704;49.843987;, + 16.683701;63.725044;49.778568;, + 16.907532;63.235886;49.945076;, + 16.835964;64.048317;50.266247;, + 17.332932;60.928143;48.799614;, + 17.415449;60.700314;49.200974;, + 17.131311;61.599758;49.547829;, + 16.866329;62.064793;49.391998;, + 16.881441;61.620750;49.208321;, + 16.931652;61.430393;48.922810;, + 17.023394;61.495392;48.765743;, + 15.594433;64.410210;48.011654;, + 15.355221;64.746971;48.103077;, + 15.109011;64.845505;48.207409;, + 15.310225;65.020020;48.325905;, + 15.597193;65.150154;48.319054;, + 15.682936;65.398903;48.325111;, + 15.683491;65.459961;48.141235;, + 15.730268;65.022964;47.637424;, + 15.710956;64.437210;47.602276;, + 15.693200;66.367973;47.512394;, + 15.739593;65.954384;47.004478;, + 15.709971;65.462585;47.465916;, + 15.713370;65.873161;48.000294;, + 15.703137;66.170380;48.126865;, + 16.046690;70.309875;48.304401;, + 16.365913;70.720009;48.027470;, + 16.440777;70.179176;47.432697;, + 16.279011;69.702744;47.006084;, + 15.989321;69.724388;47.707878;, + 16.234823;68.397461;45.749371;, + 16.338247;67.364136;45.404732;, + 16.169886;66.752342;45.468372;, + 15.970524;66.999779;45.793983;, + 15.847556;67.422462;46.281384;, + 15.798820;67.779671;46.594791;, + 15.930688;68.405243;46.444931;, + 15.841449;64.678902;46.459305;, + 15.926772;65.184181;46.013538;, + 16.207218;64.937843;45.725086;, + 16.383900;63.939720;46.142395;, + 16.237436;63.590012;46.468613;, + 15.975430;64.082863;46.497070;, + 16.041712;62.989491;47.503284;, + 16.330074;62.510639;47.489380;, + 16.479687;61.953060;48.036350;, + 16.332567;61.851406;48.240868;, + 16.103371;62.236324;48.207397;, + 16.005190;62.652355;48.086254;, + 15.959622;62.895470;47.927872;, + 15.710892;68.402351;48.685627;, + 15.648136;67.764122;48.843464;, + 15.852196;67.748260;49.593555;, + 16.091112;68.539047;49.658321;, + 16.056801;69.119179;49.475651;, + 15.880638;68.966606;49.253052;, + 16.424000;70.874527;49.045010;, + 16.701757;71.314072;48.751896;, + 16.462385;71.171959;48.547527;, + 16.184629;70.732407;48.840641;, + 15.699827;66.642441;48.652946;, + 15.824578;66.982887;49.023090;, + 15.784410;67.181129;49.142185;, + 15.634274;67.185043;48.375042;, + 15.615120;66.834618;48.047215;, + 15.674185;65.271629;48.793575;, + 15.204105;65.204224;48.722855;, + 14.835443;65.032219;48.968830;, + 15.208019;64.988647;49.170685;, + 15.676402;65.164146;49.081577;, + 15.688455;64.774559;49.574314;, + 15.234891;64.553688;49.607170;, + 14.902706;64.137657;49.657894;, + 15.293420;64.013451;49.696068;, + 15.840926;64.271202;49.771698;, + 15.903778;64.616272;49.700668;, + 16.278091;61.394108;48.852608;, + 16.220278;61.579231;49.139591;, + 15.982187;61.957813;49.102505;, + 16.039999;61.772690;48.815525;, + 15.430898;63.808681;48.458256;, + 15.043995;64.044220;48.320808;, + 15.364042;64.229958;48.236816;, + 15.832829;63.853062;48.277557;, + 15.865870;63.597157;48.425735;, + 15.954613;62.957794;48.812828;, + 15.834729;63.048027;49.053604;, + 15.432328;63.369987;49.007088;, + 15.134183;63.530445;48.836395;, + 15.431887;63.570396;48.738605;, + 15.849918;63.319706;48.668522;, + 16.096088;62.618446;49.327629;, + 16.199696;63.113098;49.537724;, + 15.912754;63.623280;49.678589;, + 15.391949;63.393970;49.504761;, + 15.060607;63.170467;49.313648;, + 15.415560;63.228004;49.333504;, + 15.838570;62.949089;49.349140;, + 13.758102;64.727051;47.977783;, + 14.168221;64.570992;47.942337;, + 13.829064;64.330490;47.964046;, + 13.418945;64.486542;47.999493;, + 13.383851;64.565086;48.723537;, + 13.733362;64.821175;48.841949;, + 14.082317;65.018639;48.594540;, + 13.738489;64.867424;48.405872;, + 13.395164;64.634613;48.428219;, + 13.432858;63.849289;49.209923;, + 13.461254;63.706188;49.357521;, + 13.801391;63.932621;49.534199;, + 14.101580;64.368164;49.509857;, + 13.754813;64.418907;49.285202;, + 13.426229;64.126465;49.161942;, + 13.523585;63.991501;48.212700;, + 13.930980;63.829620;48.172535;, + 14.306720;63.583447;48.318527;, + 13.970022;63.502201;48.416882;, + 13.564429;63.599464;48.515327;, + 13.493731;63.842590;48.457138;, + 13.564157;63.334648;48.762100;, + 13.975533;63.274899;48.680103;, + 14.334991;63.163155;48.878448;, + 13.965490;63.106457;48.948494;, + 13.561500;63.215389;48.942604;, + 13.941969;62.948902;49.207970;, + 14.276101;63.179287;49.390675;, + 13.876339;63.319157;49.397709;, + 13.542208;63.088772;49.215008;, + 14.751657;54.643333;55.040348;, + 14.590873;52.802021;53.698296;, + 13.499039;51.207058;56.417542;, + 13.273923;52.062576;58.359673;, + 14.262792;54.452450;57.104122;, + 14.688508;68.117760;63.612282;, + 14.535710;70.296165;64.247795;, + 14.997487;70.420540;62.992817;, + 15.420611;68.186958;61.412601;, + 15.123456;66.809219;62.450409;, + 15.289042;58.842800;58.182579;, + 15.320647;60.373241;59.487785;, + 15.545645;62.728092;59.776886;, + 15.818025;64.100548;58.725273;, + 16.026705;62.698605;56.534737;, + 16.058146;60.483253;55.162083;, + 15.694791;59.052357;56.106335;, + 16.253756;62.572739;52.645172;, + 16.384674;63.355892;51.544556;, + 16.562685;61.758488;50.400814;, + 16.575487;60.184284;50.041332;, + 16.380493;60.348454;51.283993;, + 9.754243;54.576092;68.034088;, + 8.865682;56.214470;68.792267;, + 9.070836;58.376186;68.852272;, + 10.135895;59.249851;68.473312;, + 11.100456;59.171497;67.685600;, + 10.923957;56.659454;67.306381;, + 3.035042;66.059219;69.545708;, + 2.344930;66.840546;69.764442;, + 1.661030;68.905617;69.955627;, + 1.920111;69.821587;69.985138;, + 2.596213;69.424149;69.710426;, + 3.034613;68.351173;69.428009;, + 3.051194;67.427612;69.470802;, + 2.345155;71.696121;70.544289;, + 1.677019;72.093285;70.835541;, + 1.282981;72.975906;71.066788;, + 3.189397;72.557281;70.563393;, + 3.979451;64.606781;69.322395;, + 4.936673;63.796482;69.076340;, + 5.221594;62.962933;69.143433;, + 4.610626;62.101410;69.479050;, + 4.010058;63.243977;69.496239;, + 6.097832;62.362251;69.253105;, + 6.886958;62.188259;69.118797;, + 6.223436;61.054867;69.396408;, + 5.444539;60.484348;69.611397;, + 5.470115;61.491180;69.538467;, + 10.069182;62.560196;68.243744;, + 9.631428;61.319351;68.567192;, + 8.452230;60.522438;69.069862;, + 7.744656;61.197292;69.140694;, + 8.403069;62.278648;68.682831;, + 9.548402;62.866348;68.253067;, + 11.649054;61.247047;67.476128;, + 10.733654;61.313049;68.317123;, + 11.162767;62.546486;67.962914;, + 12.078169;62.480480;67.121918;, + -11.134334;90.849747;67.548500;, + 11.278329;90.396461;67.764954;, + 30.643127;-31.721945;45.652527;, + -30.350075;-31.719879;45.630089;, + -25.565304;-9.924385;26.239328;, + -30.142681;-11.598551;37.311020;, + -17.647087;-15.421692;74.962234;, + -17.647087;-15.421692;74.962234;, + 0.141491;-9.487318;27.256748;, + -16.966074;-26.227253;76.131516;, + -33.277031;-27.463528;63.505905;, + -34.720058;-12.484819;48.088928;, + -31.930122;-26.942392;51.688797;, + -34.720058;-12.484819;48.088928;, + -24.287395;-54.514771;54.652374;, + -24.509207;-50.845016;55.877068;, + -25.494289;-63.762321;51.551601;, + -29.140186;-40.740757;54.994888;, + -17.688755;-53.253067;77.227638;, + -26.760902;-31.939959;72.082443;, + -16.966076;-27.937576;75.155312;, + -24.332394;-52.295708;66.403946;, + -32.183464;-29.173838;63.505913;, + -32.056793;-28.913269;57.597359;, + -22.127073;-50.465675;31.947027;, + -20.920321;-28.152065;33.507904;, + -26.425222;-28.402384;42.598354;, + -31.930124;-28.652702;51.688805;, + 0.141491;-50.060425;24.873173;, + -11.193696;-29.430769;30.196033;, + -16.966074;-26.227253;76.131516;, + -30.976030;-51.338348;55.580246;, + -26.551552;-50.902012;43.763638;, + -34.720058;-12.484819;48.088928;, + -26.551552;-50.902012;43.763638;, + -31.930124;-28.652702;51.688805;, + -23.021046;22.545492;38.817097;, + -34.612175;17.843525;39.827816;, + -34.612186;-1.674418;34.789925;, + -34.666122;-7.473567;40.417480;, + -34.612183;9.271671;35.005108;, + 0.141491;-28.374607;32.989838;, + -16.294899;25.090145;38.449425;, + -9.139874;26.594124;45.452682;, + -14.724298;0.438756;65.826607;, + -19.722260;-1.585354;65.224693;, + -13.398946;24.794630;34.246376;, + -16.294899;25.090145;38.449425;, + -18.686239;24.355274;46.119999;, + -19.918121;19.050785;53.541157;, + -9.748887;22.893982;32.226307;, + 0.141491;22.863007;31.002354;, + -6.363874;23.153360;30.623175;, + -10.778057;22.307632;52.895199;, + -11.429913;16.434713;56.577648;, + -11.545969;16.822830;57.059074;, + -20.110298;5.311386;60.448208;, + -21.278301;13.060091;57.191551;, + -15.815639;16.328318;56.204815;, + -30.997221;-35.165527;63.780437;, + -32.118473;-39.484562;59.515316;, + -29.846169;-43.697968;61.553284;, + -29.388227;-40.601273;63.974194;, + -27.854467;-30.229647;72.082443;, + -29.736418;-23.496841;70.352409;, + -30.377008;-28.942865;68.092697;, + 25.849533;-9.924379;26.239330;, + 30.426910;-11.598546;37.311020;, + 17.931316;-15.421690;74.962234;, + 17.931316;-15.421690;74.962234;, + 17.250303;-26.227251;76.131516;, + 33.561260;-27.463524;63.505905;, + 32.214352;-26.942389;51.688797;, + 35.004288;-12.484816;48.088928;, + 24.793436;-50.845009;55.877064;, + 24.562241;-54.514763;54.652370;, + 25.705898;-63.638660;51.490501;, + 29.424416;-40.740753;54.994888;, + 17.972984;-53.253063;77.227638;, + 17.250305;-27.937574;75.155312;, + 27.045132;-31.939955;72.082443;, + 24.616623;-52.295704;66.403946;, + 32.467693;-29.173834;63.505913;, + 32.341022;-28.913265;57.597359;, + 21.204550;-28.152060;33.507904;, + 22.411303;-50.465668;31.947027;, + 26.709452;-28.402378;42.598354;, + 32.214352;-28.652699;51.688805;, + 11.477925;-29.430763;30.196033;, + 17.250303;-26.227251;76.131516;, + 31.260260;-51.338341;55.580242;, + 26.835781;-50.902004;43.763638;, + 35.004288;-12.484816;48.088928;, + 35.004288;-12.484816;48.088928;, + 26.835781;-50.902004;43.763638;, + 32.214352;-28.652699;51.688805;, + 23.305275;22.545494;38.817101;, + 34.896404;17.843529;39.827820;, + 34.896416;-1.674414;34.789925;, + 34.950352;-7.473563;40.417480;, + 34.896412;9.271675;35.005108;, + 16.579128;25.090147;38.449429;, + 15.005043;0.438756;66.317261;, + 20.006489;-1.585352;65.224693;, + 13.683175;24.794634;34.246380;, + 16.579128;25.090147;38.449429;, + 18.970469;24.355276;46.119999;, + 20.202351;19.050787;53.541157;, + 10.033116;22.893986;32.226311;, + 6.648103;23.153364;30.623177;, + 11.062286;22.307634;52.895199;, + 11.714142;16.434715;57.068302;, + 11.825384;16.819580;57.419716;, + 20.394527;5.311388;60.448208;, + 21.562531;13.060093;57.191551;, + 16.099869;16.328320;56.204815;, + 31.281450;-35.165524;63.780437;, + 32.402702;-39.484558;59.515316;, + 30.130398;-43.697964;61.553280;, + 29.672457;-40.601269;63.974190;, + 28.138697;-30.229643;72.082443;, + 30.020647;-23.496838;70.352409;, + 30.661238;-28.942862;68.092697;, + -29.135050;-70.748413;50.137466;, + -37.889961;-84.783730;46.673920;, + -41.760616;-103.151527;46.673916;, + -43.113548;-194.904678;46.172501;, + -8.177140;-173.738678;44.589825;, + -11.967894;-201.991714;48.101704;, + -35.253540;-336.022400;70.615288;, + -37.752792;-344.579865;81.882141;, + -36.447479;-347.590393;81.989037;, + -32.971939;-348.840668;75.068268;, + -30.483822;-349.513580;64.542366;, + -30.277090;-349.285034;45.291451;, + -30.731056;-349.140869;32.597919;, + -44.998409;-349.114563;30.769142;, + -47.579365;-349.201599;38.020824;, + -49.480873;-349.253357;42.813530;, + -53.720398;-349.475220;61.544106;, + -54.063526;-348.805878;72.346741;, + -50.995792;-347.566376;80.111809;, + -50.995792;-347.566376;80.111809;, + -36.447479;-347.590393;81.989037;, + -50.401588;-344.387238;80.484764;, + -30.811893;-349.229279;40.184383;, + -25.375702;-326.803925;43.166012;, + -25.361750;-319.393433;40.717945;, + -48.911896;-319.507538;43.118351;, + -53.350098;-311.978485;48.287319;, + -17.516390;-311.220673;43.257233;, + -4.658672;-143.854736;42.160900;, + 0.100870;-118.350113;30.024460;, + -21.858656;-301.316620;40.265823;, + -48.634773;-301.610474;45.850082;, + -15.366711;-254.579529;44.539597;, + -42.656788;-120.929993;49.355263;, + -12.445428;-224.292206;47.498665;, + -47.093388;-334.957916;67.363968;, + -46.985233;-330.924652;60.877213;, + -52.006966;-325.347748;41.525673;, + -32.159611;-328.701721;61.163334;, + -37.431126;-348.022339;28.784142;, + -37.431126;-348.022339;28.784142;, + -36.497189;-333.552704;31.073109;, + -43.124073;-327.569916;63.163582;, + -37.508007;-327.823730;63.943375;, + -32.027699;-330.586823;57.891068;, + -30.829683;-335.353180;51.935188;, + -30.289175;-336.679779;37.674358;, + -30.290890;-334.903290;34.539791;, + -46.926067;-335.870056;46.077358;, + -48.218380;-333.043976;53.745155;, + -33.346500;-333.002716;32.172970;, + -36.497189;-333.552704;31.073109;, + -32.159611;-328.701721;61.163334;, + -47.738998;-332.348511;57.905354;, + -46.985233;-330.924652;60.877213;, + -39.092888;-333.629852;32.004887;, + -42.781075;-334.302216;33.467194;, + -30.620396;-337.228912;46.045479;, + -44.659866;-335.766113;36.478382;, + -46.011299;-336.928101;39.876133;, + -30.907063;-337.423279;41.478359;, + -11.541974;-184.862228;45.883656;, + -41.620197;-179.552460;46.748608;, + -30.082495;-176.538712;60.086678;, + -26.290127;-159.034851;62.359310;, + -22.042976;-120.057648;62.105083;, + -35.127117;-120.041656;57.534679;, + -24.386381;-143.741119;62.231689;, + -37.002441;-178.638748;55.923828;, + -41.142269;-130.155960;39.554146;, + -41.240711;-158.109726;38.305466;, + -42.656788;-120.929993;49.355263;, + -41.014412;-121.305328;41.175835;, + -41.620197;-179.552460;46.748608;, + -39.826946;-174.615158;38.212673;, + -52.006966;-325.347748;41.525673;, + -25.375702;-326.803925;43.166012;, + -27.052189;-63.743755;51.457161;, + -30.899126;-70.822411;49.935226;, + -3.998070;-70.562149;67.711349;, + -14.078679;-70.624992;36.359470;, + -20.407236;-70.663857;37.704983;, + -25.309130;-70.709183;43.680515;, + -25.333038;-70.735931;56.047955;, + -20.123388;-70.712914;61.395264;, + -29.135050;-70.748413;50.137466;, + -29.135050;-70.748413;50.137466;, + -10.657997;-70.656097;64.141533;, + -18.580341;-63.659996;42.089684;, + 0.102538;-63.638348;37.841175;, + -3.877978;-63.520813;66.895554;, + -18.598015;-63.628139;61.096786;, + -25.494289;-63.762321;51.551601;, + -25.494289;-63.762321;51.551601;, + 0.102538;-63.445549;68.379417;, + -3.877978;-63.520813;66.895554;, + -4.034785;-63.594818;67.636086;, + -3.998070;-70.562149;67.711349;, + 0.100870;-70.535385;69.452461;, + -3.855402;-70.482147;66.867348;, + 0.100870;-80.880516;69.142647;, + 0.100870;-105.710800;64.621178;, + 0.100870;-105.624802;63.766800;, + -15.278575;-278.076538;41.723305;, + -47.843460;-278.215302;43.605659;, + -47.021446;-254.582092;45.376308;, + -44.766525;-223.910660;41.391571;, + -11.671675;-229.887054;44.415508;, + -13.444867;-241.724686;43.812698;, + -12.848580;-215.346298;46.368130;, + -42.281010;-210.077301;42.464180;, + 0.100870;-70.522980;34.969410;, + 38.087563;-84.783722;46.673916;, + 29.332651;-70.748413;50.137463;, + 41.958218;-103.151527;46.673912;, + 43.311150;-194.904678;46.172497;, + 8.374740;-173.738678;44.589821;, + 12.165494;-201.991699;48.101700;, + 35.451141;-336.022369;70.615288;, + 37.950394;-344.579834;81.882141;, + 36.645081;-347.590363;81.989037;, + 33.169540;-348.840668;75.068268;, + 30.681425;-349.513580;64.542366;, + 30.474693;-349.285034;45.291451;, + 30.928658;-349.140839;32.597916;, + 45.196014;-349.114563;30.769142;, + 47.776966;-349.201569;38.020821;, + 49.678474;-349.253357;42.813526;, + 53.918003;-349.475220;61.544106;, + 54.261131;-348.805878;72.346741;, + 51.193394;-347.566376;80.111809;, + 51.193394;-347.566376;80.111809;, + 36.645081;-347.590363;81.989037;, + 50.599190;-344.387238;80.484764;, + 31.009497;-349.229279;40.184380;, + 25.573301;-326.803894;43.166008;, + 25.559353;-319.393433;40.717941;, + 53.547699;-311.978485;48.287315;, + 49.109501;-319.507538;43.118351;, + 17.713989;-311.220673;43.257229;, + 4.856273;-143.854736;42.160900;, + 22.056257;-301.316620;40.265823;, + 48.832378;-301.610474;45.850079;, + 15.564311;-254.579514;44.539597;, + 42.854393;-120.929985;49.355259;, + 12.643028;-224.292191;47.498661;, + 47.290989;-334.957916;67.363968;, + 47.182835;-330.924622;60.877216;, + 52.204571;-325.347748;41.525669;, + 37.628727;-348.022308;28.784140;, + 37.628727;-348.022308;28.784140;, + 36.694790;-333.552673;31.073109;, + 43.321674;-327.569916;63.163586;, + 37.705608;-327.823700;63.943378;, + 32.225300;-330.586823;57.891064;, + 31.027285;-335.353180;51.935184;, + 30.486776;-336.679749;37.674358;, + 30.488491;-334.903290;34.539787;, + 47.123669;-335.870056;46.077354;, + 48.415981;-333.043976;53.745152;, + 33.544102;-333.002716;32.172966;, + 36.694790;-333.552673;31.073109;, + 32.357216;-328.701721;61.163334;, + 47.936604;-332.348511;57.905350;, + 47.182835;-330.924622;60.877216;, + 39.290493;-333.629852;32.004887;, + 42.978680;-334.302216;33.467194;, + 30.817997;-337.228882;46.045475;, + 44.857464;-335.766083;36.478382;, + 46.208900;-336.928101;39.876129;, + 31.104664;-337.423279;41.478355;, + 11.739574;-184.862213;45.883652;, + 41.817802;-179.552460;46.748608;, + 30.280094;-176.538696;60.086674;, + 26.487728;-159.034851;62.359303;, + 22.240578;-120.057648;62.105080;, + 35.324718;-120.041656;57.534676;, + 24.583982;-143.741119;62.231686;, + 37.200043;-178.638748;55.923824;, + 41.339870;-130.155960;39.554138;, + 41.438313;-158.109711;38.305462;, + 42.854393;-120.929985;49.355259;, + 41.212013;-121.305321;41.175831;, + 41.817802;-179.552460;46.748608;, + 40.024551;-174.615143;38.212673;, + 52.204571;-325.347748;41.525669;, + 25.573301;-326.803894;43.166008;, + 32.357216;-328.701721;61.163334;, + 31.096729;-70.822411;49.935223;, + 27.249788;-63.743755;51.457157;, + 4.195670;-70.562141;67.711349;, + 14.276281;-70.624985;36.359463;, + 20.604836;-70.663849;37.704975;, + 25.506731;-70.709175;43.680508;, + 25.530638;-70.735931;56.047947;, + 20.320988;-70.712906;61.395260;, + 29.332651;-70.748413;50.137463;, + 29.332651;-70.748413;50.137463;, + 10.855597;-70.656097;64.141525;, + 18.773201;-63.677704;42.028572;, + 4.075578;-63.520775;66.895554;, + 18.770283;-63.633057;61.106705;, + 25.705898;-63.638660;51.490501;, + 25.705898;-63.638660;51.490501;, + 4.232385;-63.594814;67.636078;, + 4.075578;-63.520775;66.895554;, + 4.195670;-70.562141;67.711349;, + 4.053002;-70.482147;66.867340;, + 15.476175;-278.076508;41.723305;, + 48.041061;-278.215271;43.605659;, + 47.219048;-254.582077;45.376305;, + 44.964127;-223.910675;41.391571;, + 11.869275;-229.887054;44.415504;, + 13.642469;-241.724686;43.812695;, + 13.046181;-215.346298;46.368130;, + 42.478611;-210.077286;42.464176;, + 9.646603;26.610264;45.446602;, + 33.395126;-1.314395;35.941048;, + 42.876431;-10.391958;41.524540;, + 61.100998;-12.097787;52.234310;, + 33.931534;-10.798729;47.691635;, + 33.395126;-1.314395;35.941048;, + 78.460449;-9.570584;65.570358;, + 73.386116;1.385114;82.625687;, + 78.295067;-4.036124;86.370949;, + 81.882507;-19.600512;68.102516;, + 87.136154;-19.603304;74.055412;, + 86.196594;-18.624458;77.084518;, + 80.318741;-7.420647;85.493256;, + 67.389786;-1.205821;78.118034;, + 70.006081;2.367340;76.967026;, + 77.780144;-0.616348;69.076759;, + 78.460449;-9.570584;65.570358;, + 75.694405;-15.631040;66.051804;, + 71.219742;-15.793794;69.989906;, + 68.045258;-14.292754;73.173157;, + 66.651627;-8.248512;76.491966;, + 73.890327;2.056242;73.440269;, + 70.006081;2.367340;76.967026;, + 69.084702;6.252669;77.456337;, + 75.694405;-15.631040;66.051804;, + 75.774590;-18.309954;63.527412;, + 66.651627;-8.248512;76.491966;, + 86.261154;-12.489821;78.381943;, + 82.521919;-17.837069;80.497223;, + 114.749481;-29.371605;104.351402;, + 79.183868;-11.467402;85.242088;, + 79.655968;-17.333593;83.765129;, + 110.916962;-20.728716;110.111130;, + 80.318741;-7.420647;85.493256;, + 86.196594;-18.624458;77.084518;, + 82.789978;-6.610463;83.296829;, + 80.318741;-7.420647;85.493256;, + 84.665817;-9.600757;93.965752;, + 105.883774;-28.288433;93.625610;, + 100.601974;-16.327637;102.138657;, + 93.242905;-25.622953;81.159538;, + 86.196594;-18.624458;77.084518;, + 86.199554;-6.060757;79.316513;, + 51.500221;-7.577340;65.697365;, + 33.477127;16.479158;40.343475;, + 33.578400;13.114620;48.755165;, + 33.569466;8.843540;35.935562;, + 114.749481;-29.371605;104.351402;, + 116.328888;-21.406776;103.886078;, + 114.749481;-29.371605;104.351402;, + 110.432236;-25.897305;108.404945;, + 114.547729;-31.794006;101.703148;, + 110.916962;-20.728716;110.111130;, + 110.916962;-20.728716;110.111130;, + 117.792206;-32.974083;105.142754;, + 120.240417;-32.382523;107.405258;, + 120.240417;-32.382523;107.405258;, + 119.345352;-28.410704;105.006744;, + 120.240417;-32.382523;107.405258;, + 115.310875;-21.371449;114.672195;, + 120.625252;-22.188108;107.598892;, + 128.789810;-29.466074;108.954926;, + 115.310875;-21.371449;114.672195;, + 114.274811;-23.003649;117.528297;, + 117.859741;-27.379353;126.710335;, + 120.613640;-25.185886;123.257240;, + 121.760422;-25.243605;123.489906;, + 114.847473;-23.354944;126.325142;, + 115.773735;-23.653730;128.726898;, + 120.118660;-28.808155;129.262100;, + 118.315994;-26.222034;131.904175;, + 120.118660;-28.808155;129.262100;, + 117.369904;-31.079527;128.957718;, + 118.686279;-31.174704;132.509644;, + 120.607414;-29.430899;132.556305;, + 119.351463;-27.770924;134.521164;, + 120.230301;-29.213165;134.837173;, + 137.268311;-36.747177;118.004539;, + 130.886734;-24.224178;128.467072;, + 129.463760;-23.354002;127.461098;, + 132.345215;-26.909451;126.571350;, + 131.403183;-26.611431;125.127594;, + 132.198166;-25.013567;129.446793;, + 133.363693;-27.150629;127.933983;, + 133.465668;-25.219961;130.170334;, + 134.645630;-27.372400;128.641541;, + 134.095200;-25.443157;131.157074;, + 135.557129;-28.123676;129.259583;, + 135.087219;-26.605450;132.444199;, + 136.416260;-29.042286;130.719208;, + 136.310669;-27.313053;133.104141;, + 137.309525;-29.130545;131.811081;, + 136.930222;-27.776287;134.007202;, + 138.067566;-29.848610;132.534195;, + 137.163391;-28.031139;134.882431;, + 138.629425;-30.705997;132.982819;, + 138.097382;-29.210182;136.039948;, + 139.375854;-31.531094;134.386230;, + 139.425034;-29.698851;136.370346;, + 140.178970;-31.048899;135.399673;, + 140.258026;-30.001667;136.269287;, + 140.513062;-30.455763;135.941559;, + 133.326996;-27.869246;126.520409;, + 134.998978;-30.947582;124.347214;, + 133.524338;-30.337019;122.600365;, + 135.090698;-28.901239;127.885551;, + 136.426865;-31.351122;126.151329;, + 136.754562;-29.240726;128.910980;, + 138.107239;-31.708241;127.158394;, + 137.655624;-29.584154;130.208908;, + 139.331543;-32.657040;128.033676;, + 139.067566;-31.050646;131.939789;, + 140.591125;-33.844181;129.962296;, + 140.683243;-31.965866;132.894485;, + 141.828308;-34.049400;131.412170;, + 141.569046;-32.582588;134.092957;, + 142.872879;-34.958260;132.404327;, + 141.965546;-32.937801;135.216400;, + 143.646179;-36.004208;133.038742;, + 143.291046;-34.413788;136.780243;, + 144.756668;-37.074436;134.884445;, + 144.992767;-35.061703;137.326050;, + 145.857040;-36.609371;136.213287;, + 146.025253;-35.446705;137.282303;, + 146.317627;-35.967274;136.906616;, + 135.283035;-31.410269;123.908699;, + 136.889267;-34.388729;121.786079;, + 135.487198;-33.834320;120.160095;, + 136.918472;-32.390182;125.135963;, + 138.202103;-34.760567;123.442123;, + 138.471878;-32.702595;126.052612;, + 139.771439;-35.090023;124.340836;, + 139.296295;-33.022293;127.247002;, + 140.906357;-35.995464;125.122398;, + 140.587006;-34.422878;128.824356;, + 142.050705;-37.125763;126.892921;, + 142.091629;-35.292908;129.670227;, + 143.191742;-37.308819;128.222427;, + 142.901459;-35.877598;130.768753;, + 144.154083;-38.176163;129.119446;, + 143.251007;-36.212845;131.812622;, + 144.865631;-39.179722;129.685654;, + 144.463196;-37.624027;133.234940;, + 145.871307;-40.198315;131.383316;, + 146.060104;-38.237057;133.695831;, + 146.890518;-39.734459;132.609009;, + 147.036926;-38.603104;133.622391;, + 147.317841;-39.106766;133.255463;, + 136.857193;-34.692177;121.075745;, + 138.085999;-37.138863;119.175186;, + 138.106750;-35.513153;121.891022;, + 139.088989;-37.460236;120.374466;, + 139.315872;-35.774200;122.489632;, + 140.310577;-37.735165;120.957130;, + 139.940460;-36.049793;123.361938;, + 141.172485;-38.492016;121.459724;, + 140.897690;-37.228283;124.465363;, + 142.017715;-39.448486;122.736076;, + 142.053253;-37.953835;124.992500;, + 142.895447;-39.609592;123.696373;, + 142.660355;-38.449345;125.780983;, + 143.619232;-40.337288;124.304420;, + 142.909821;-38.739342;126.569069;, + 144.145706;-41.176258;124.664856;, + 145.379715;-40.473606;125.913101;, + 143.807114;-39.925308;127.555336;, + 144.885223;-42.039631;125.897728;, + 145.050308;-40.431152;127.779945;, + 145.686615;-41.660812;126.807167;, + 145.817383;-40.728752;127.636574;, + 146.032715;-41.142326;127.308174;, + 124.282539;-24.769093;125.526192;, + 108.661095;-18.210699;110.956673;, + 113.002747;-28.165403;111.418968;, + 115.310875;-21.371449;114.672195;, + 111.886719;-19.639212;113.723465;, + 128.789810;-29.466074;108.954926;, + 41.310238;-5.151076;57.811226;, + 33.733215;8.483885;56.324486;, + 33.266479;-1.659648;55.141335;, + 33.266479;-1.659648;55.141335;, + -33.285355;-1.230055;35.845985;, + -60.913422;-12.097776;52.234310;, + -42.688854;-10.391947;41.524540;, + -33.422455;-6.066209;41.124596;, + -33.602604;-10.886051;47.766304;, + -78.272881;-9.570575;65.570358;, + -73.198547;1.385122;82.625679;, + -78.107506;-4.036117;86.370941;, + -86.948593;-19.603292;74.055412;, + -81.694946;-19.600500;68.102516;, + -86.009033;-18.624449;77.084511;, + -80.131180;-7.420639;85.493248;, + -67.202217;-1.205813;78.118034;, + -69.818512;2.367348;76.967026;, + -77.592583;-0.616339;69.076759;, + -78.272881;-9.570575;65.570358;, + -75.506836;-15.631029;66.051804;, + -71.032173;-15.793784;69.989906;, + -67.857689;-14.292745;73.173157;, + -66.464066;-8.248504;76.491966;, + -73.702766;2.056248;73.440269;, + -68.897133;6.252676;77.456337;, + -69.818512;2.367348;76.967026;, + -75.587021;-18.309942;63.527412;, + -75.506836;-15.631029;66.051804;, + -66.464066;-8.248504;76.491966;, + -86.073555;-12.696040;78.345314;, + -82.334358;-17.837059;80.497215;, + -114.561913;-29.371595;104.351395;, + -78.996300;-11.467393;85.242081;, + -79.468399;-17.333584;83.765121;, + -80.131180;-7.420639;85.493248;, + -85.469383;-14.398664;96.109703;, + -78.996300;-11.467393;85.242081;, + -86.009033;-18.624449;77.084511;, + -82.859459;-6.312282;83.425949;, + -99.563057;-17.848322;102.450645;, + -110.729401;-20.728708;110.111122;, + -105.696213;-28.288424;93.625603;, + -93.055344;-25.622944;81.159531;, + -86.009033;-18.624449;77.084511;, + -86.011993;-6.060749;79.316505;, + -51.312645;-7.577330;65.697365;, + -33.326355;16.538502;40.337154;, + -33.377022;12.971798;48.765106;, + -33.380333;8.824398;35.941063;, + -114.561913;-29.371595;104.351395;, + -116.141319;-21.406767;103.886070;, + -114.561913;-29.371595;104.351395;, + -110.244675;-25.897297;108.404938;, + -114.360168;-31.793995;101.703140;, + -110.729401;-20.728708;110.111122;, + -110.729401;-20.728708;110.111122;, + -118.763100;-32.416569;106.890343;, + -117.604637;-32.974075;105.142746;, + -119.195221;-22.221508;107.119102;, + -118.763100;-32.416569;106.890343;, + -118.763100;-32.416569;106.890343;, + -115.208687;-21.985653;115.587814;, + -128.864243;-29.984035;109.850922;, + -115.208687;-21.985653;115.587814;, + -114.103012;-23.569595;118.313278;, + -117.563560;-27.690514;126.991264;, + -120.423470;-25.533827;123.678185;, + -121.581490;-25.569689;123.884338;, + -114.556931;-23.727386;126.708763;, + -115.458870;-23.961578;128.988220;, + -119.802361;-29.029490;129.383438;, + -117.964737;-26.420248;131.961685;, + -120.245399;-29.574646;132.518158;, + -118.961952;-27.895647;134.431473;, + -119.833649;-29.315147;134.705521;, + -137.255630;-36.934776;118.303642;, + -131.314377;-26.758501;125.303482;, + -133.322495;-24.425945;126.440849;, + -129.349152;-23.487917;127.596153;, + -130.768127;-24.314178;128.528564;, + -132.245651;-27.011766;126.667183;, + -132.075287;-25.062017;129.438324;, + -133.256104;-27.208897;127.952965;, + -133.347275;-25.234171;130.110321;, + -134.542770;-27.396519;128.609299;, + -133.969086;-25.426950;131.042328;, + -135.450180;-28.119780;129.179245;, + -134.944672;-26.545113;132.246048;, + -136.291122;-28.993143;130.552338;, + -136.167953;-27.219339;132.852280;, + -137.179993;-29.045206;131.582748;, + -136.778458;-27.653521;133.701782;, + -137.930786;-29.735388;132.255539;, + -136.999939;-27.886042;134.532242;, + -138.485275;-30.573214;132.667130;, + -137.918381;-29.024487;135.612717;, + -139.213760;-31.356102;133.989075;, + -139.254013;-29.485641;135.905014;, + -140.018036;-30.841948;134.952103;, + -140.096344;-29.777664;135.793762;, + -140.354813;-30.233871;135.472046;, + -133.231537;-27.956072;126.594505;, + -134.925339;-31.048527;124.460655;, + -133.461777;-30.497587;122.817970;, + -134.989136;-28.931255;127.863777;, + -136.342789;-31.392393;126.160988;, + -136.657150;-29.224060;128.817413;, + -138.027634;-31.702929;127.096672;, + -137.548523;-29.526291;130.041809;, + -139.246399;-32.613304;127.906013;, + -138.940323;-30.932508;131.660553;, + -140.483856;-33.738888;129.718903;, + -140.554810;-31.801954;132.540863;, + -141.714996;-33.895096;131.085495;, + -141.429428;-32.379189;133.667358;, + -142.750443;-34.765797;132.009415;, + -141.811935;-32.704250;134.731705;, + -143.514694;-35.784763;132.593597;, + -143.118393;-34.124710;136.191864;, + -144.603409;-36.797626;134.330566;, + -144.828415;-34.734749;136.683197;, + -145.704269;-36.289589;135.590790;, + -145.871262;-35.104645;136.623108;, + -146.167557;-35.627628;136.254303;, + -135.214676;-31.515200;124.032562;, + -136.842163;-34.507912;121.949051;, + -135.449875;-34.009403;120.420280;, + -136.844757;-32.443195;125.172371;, + -138.145432;-34.824940;123.509781;, + -138.402664;-32.712887;126.023872;, + -139.719559;-35.111778;124.343742;, + -139.218048;-32.994740;127.150612;, + -140.849487;-35.982155;125.065216;, + -140.489838;-34.340195;128.625000;, + -141.972977;-37.056030;126.729210;, + -141.993790;-35.168465;129.403305;, + -143.108612;-37.194061;127.982307;, + -142.793137;-35.716938;130.435669;, + -144.062485;-38.026543;128.816864;, + -143.129379;-36.024429;131.424835;, + -144.765549;-39.005554;129.337189;, + -144.323669;-37.384869;132.751999;, + -145.750641;-39.971535;130.934662;, + -145.929031;-37.963417;133.163986;, + -146.770706;-39.468060;132.097397;, + -146.916077;-38.315838;133.076492;, + -147.200821;-38.821938;132.716400;, + -136.816589;-34.826042;121.267235;, + -138.063828;-37.289051;119.406982;, + -138.063034;-35.609749;122.020325;, + -139.060074;-37.569843;120.535957;, + -139.277069;-35.839912;122.573105;, + -140.286835;-37.814011;121.073189;, + -139.894958;-36.087437;123.395241;, + -141.145554;-38.545986;121.533401;, + -140.837692;-37.226124;124.423691;, + -141.974594;-39.461166;122.731110;, + -141.993881;-37.922039;124.903725;, + -142.848846;-39.588902;123.635170;, + -142.593063;-38.391006;125.643524;, + -143.566452;-40.291603;124.198372;, + -142.831924;-38.660183;126.390099;, + -144.086502;-41.113419;124.526360;, + -143.715500;-39.809662;127.307304;, + -144.809982;-41.938175;125.684982;, + -144.966858;-40.291412;127.499474;, + -145.612946;-41.529369;126.547478;, + -145.743073;-40.580086;127.348747;, + -145.961716;-40.996456;127.027367;, + -124.112961;-25.016518;125.801498;, + -108.473534;-18.210691;110.956665;, + -112.815208;-28.165394;111.418961;, + -111.699158;-19.639204;113.723457;, + -115.208687;-21.985653;115.587814;, + -41.122662;-5.151066;57.811222;, + -33.454399;8.516764;56.378914;, + -33.245544;-1.592087;55.511299;, + -33.245544;-1.592087;55.511299;, + 33.827938;10.960120;51.807289;, + 33.696419;-6.417687;40.866890;, + -33.285355;-1.230055;35.845985;, + -33.640362;10.960128;51.807285;, + -6.262792;13.473364;58.013275;, + -11.429913;16.434713;56.577648;, + 6.173337;13.337016;58.607582;, + 0.141490;12.205804;59.792637;, + 11.714142;16.434715;57.068302;, + -11.461862;93.826927;46.940403;, + -8.418667;86.102859;35.841724;, + -11.461862;93.826927;46.940403;, + -2.182251;64.795692;35.886501;, + -8.418667;86.102859;35.841724;, + -11.461862;93.826927;46.940403;, + -11.461862;93.826927;46.940403;, + -2.182251;64.795692;35.886501;, + -2.182251;64.795692;35.886501;, + -13.263326;61.285336;39.593838;, + -7.852941;94.312172;61.946106;, + -6.418187;97.562218;66.945374;, + -4.402893;95.093262;63.828449;, + -10.775403;96.597122;64.803986;, + -13.469022;92.920013;60.063766;, + 0.057848;95.886368;65.707542;, + -3.096079;86.564301;74.622665;, + 0.057848;84.042374;71.322975;, + -2.904975;98.340385;68.672066;, + -6.403885;85.831749;72.998459;, + -4.494127;83.274292;70.169548;, + -8.635912;82.575844;67.678185;, + -15.709467;82.386459;66.627968;, + -13.865308;81.275604;65.186821;, + -15.816927;87.518616;62.681839;, + -11.518435;84.699326;70.485474;, + -13.865308;81.275604;65.186821;, + -8.635912;82.575844;67.678185;, + -14.668218;94.575356;62.197353;, + -4.402893;95.093262;63.828449;, + -7.852941;94.312172;61.946106;, + -13.097512;71.430748;40.778584;, + -8.418667;86.102859;35.841724;, + -14.186148;74.380287;64.488983;, + -13.097512;71.430748;40.778584;, + -14.675630;70.832016;46.772766;, + -11.461862;93.826927;46.940403;, + -13.097512;71.430748;40.778584;, + -15.347429;57.616409;47.193058;, + -13.263326;61.285336;39.593838;, + 0.057848;63.606403;31.055357;, + -2.182251;64.795692;35.886501;, + -2.182251;64.795692;35.886501;, + 0.057848;63.606403;31.055357;, + -15.784473;69.911873;57.321053;, + -16.338684;73.054062;51.038074;, + -13.469022;92.920013;60.063766;, + 0.057848;90.668213;33.607914;, + -14.675630;70.832016;46.772766;, + -13.097512;71.430748;40.778584;, + -16.338684;73.054062;51.038074;, + 0.057848;75.714500;30.620197;, + -14.163750;71.116005;45.658489;, + -14.675630;70.832016;46.772766;, + -14.163750;71.116005;45.658489;, + -14.718096;68.331589;44.645512;, + 0.057848;99.177589;56.123409;, + -2.250754;97.063629;60.111290;, + 0.057848;99.177589;56.123409;, + -14.675630;70.832016;46.772766;, + -16.338684;73.054062;51.038074;, + -15.528388;63.130802;45.068886;, + -3.355227;56.332371;40.007046;, + -7.149835;52.817856;41.486317;, + -3.355227;56.332371;40.007046;, + -14.710178;77.561653;59.569633;, + -16.338684;73.054062;51.038074;, + -14.238920;86.733635;61.588871;, + -13.469022;92.920013;60.063766;, + -15.101998;82.440125;58.401062;, + -13.865308;81.275604;65.186821;, + 0.057848;99.177589;56.123409;, + 0.057848;97.662560;43.454536;, + -11.461862;93.826927;46.940403;, + 0.057848;75.714500;30.620197;, + 0.057848;90.668213;33.607914;, + -8.418667;86.102859;35.841724;, + -8.418667;86.102859;35.841724;, + -13.097512;71.430748;40.778584;, + -2.182251;64.795692;35.886501;, + -13.469022;92.920013;60.063766;, + -16.338684;73.054062;51.038074;, + -13.097512;71.430748;40.778584;, + 0.057848;99.177589;56.123409;, + -7.149835;52.817856;41.486317;, + -13.263326;61.285336;39.593838;, + -15.347429;57.616409;47.193058;, + -11.261707;52.068916;45.952110;, + 0.057848;99.177589;56.123409;, + 11.577548;93.826927;46.940403;, + 0.057848;90.668213;33.607914;, + 8.534353;86.102859;35.841724;, + 11.577548;93.826927;46.940403;, + 2.297937;64.795692;35.886501;, + 8.534353;86.102859;35.841724;, + 11.577548;93.826927;46.940403;, + 11.577548;93.826927;46.940403;, + 0.057848;97.662560;43.454536;, + 2.297937;64.795692;35.886501;, + 0.057848;63.606403;31.055357;, + 2.297937;64.795692;35.886501;, + 13.379013;61.285336;39.593838;, + 7.968627;94.312172;61.946106;, + 4.518579;95.093262;63.828449;, + 6.533874;97.562218;66.945374;, + 14.783904;94.575356;62.197353;, + 13.584708;92.920013;60.063766;, + 3.211765;86.564301;74.622665;, + 3.020661;98.340385;68.672066;, + 4.609814;83.274292;70.169548;, + 6.519572;85.831749;72.998459;, + 8.751598;82.575844;67.678185;, + 13.980994;81.275604;65.186821;, + 15.932613;87.518616;62.681839;, + 15.825153;82.386459;66.627968;, + 10.891089;96.597122;64.803986;, + 4.518579;95.093262;63.828449;, + 7.968627;94.312172;61.946106;, + 13.213199;71.430748;40.778584;, + 8.534353;86.102859;35.841724;, + 13.213199;71.430748;40.778584;, + 14.791316;70.832016;46.772766;, + 11.577548;93.826927;46.940403;, + 13.213199;71.430748;40.778584;, + 15.463116;57.616409;47.193058;, + 13.379013;61.285336;39.593838;, + 0.057848;63.606403;31.055357;, + 2.297937;64.795692;35.886501;, + 2.297937;64.795692;35.886501;, + 0.057848;53.154804;40.756420;, + 0.057848;63.606403;31.055357;, + 15.900160;69.911873;57.321053;, + 16.454370;73.054062;51.038074;, + 13.981975;76.274246;65.799950;, + 13.584708;92.920013;60.063766;, + 0.057848;90.668213;33.607914;, + 14.791316;70.832016;46.772766;, + 0.057848;75.714500;30.620197;, + 13.213199;71.430748;40.778584;, + 16.454370;73.054062;51.038074;, + 0.057848;75.714500;30.620197;, + 14.279436;71.116005;45.658489;, + 2.366440;97.063629;60.111290;, + 14.791316;70.832016;46.772766;, + 16.454370;73.054062;51.038074;, + 15.644074;63.130802;45.068886;, + 3.470914;56.332371;40.007046;, + 7.265521;52.817856;41.486317;, + 3.470914;56.332371;40.007046;, + 14.825865;77.561653;59.569633;, + 16.454370;73.054062;51.038074;, + 13.584708;92.920013;60.063766;, + 14.354607;86.733635;61.588871;, + 15.217685;82.440125;58.401062;, + 13.980994;81.275604;65.186821;, + 0.057848;99.177589;56.123409;, + 0.057848;97.662560;43.454536;, + 11.577548;93.826927;46.940403;, + 0.057848;75.714500;30.620197;, + 0.057848;90.668213;33.607914;, + 8.534353;86.102859;35.841724;, + 8.534353;86.102859;35.841724;, + 13.213199;71.430748;40.778584;, + 2.297937;64.795692;35.886501;, + 13.584708;92.920013;60.063766;, + 20.061501;88.506752;43.413734;, + 18.678795;84.403915;43.736874;, + 16.454370;73.054062;51.038074;, + 13.213199;71.430748;40.778584;, + 0.057848;99.177589;56.123409;, + 7.265521;52.817856;41.486317;, + 13.379013;61.285336;39.593838;, + 15.463116;57.616409;47.193058;, + 11.377394;52.068913;45.952110;, + 15.463116;57.616409;47.193058;, + 7.265521;52.817856;41.486317;, + 2.867495;39.371185;54.783699;, + 7.573774;40.307079;54.648247;, + 1.330886;37.590916;54.064663;, + 5.149999;41.098293;49.664669;, + -5.034308;41.098293;49.664669;, + -1.215191;37.590916;54.064663;, + -7.458086;40.307079;54.648247;, + -2.751802;39.371185;54.783699;, + 2.217954;38.776661;57.910744;, + -2.102260;38.776661;57.910744;, + -3.355227;56.332371;40.007046;, + 0.057848;53.154804;40.756420;, + 3.470914;56.332371;40.007046;, + 9.931857;27.639982;38.133949;, + 0.077734;27.263643;33.720470;, + -9.608727;27.597115;38.148296;, + -0.565651;37.436687;67.317482;, + -2.411773;37.506966;67.308975;, + 2.527462;37.506966;67.308975;, + 0.681345;37.436687;67.317482;, + -4.628216;39.976799;65.832298;, + -3.095984;38.031998;67.529678;, + -8.580020;44.714546;64.299896;, + -5.649843;41.666725;65.621597;, + -16.045902;55.654251;48.952625;, + -15.310171;52.496346;49.328674;, + -12.819518;47.844864;50.501919;, + -9.828319;42.345741;53.625164;, + -15.043728;50.197842;49.912075;, + -15.007770;66.809219;62.450409;, + -14.767531;62.889500;62.645046;, + -14.547876;60.533600;62.358631;, + -13.118661;55.010292;62.553223;, + -15.462021;56.205631;47.969166;, + -13.866287;76.274246;65.799950;, + -14.881803;70.420540;62.992817;, + -16.338850;66.013954;51.296288;, + -16.338684;73.054062;51.038074;, + -11.348783;70.134789;66.847923;, + -12.326240;69.568321;65.742271;, + -12.625326;68.411827;65.535583;, + -12.363090;67.291313;66.688377;, + -12.479330;68.737000;65.669327;, + -12.347851;69.289749;65.733955;, + -11.017628;49.345627;63.166481;, + -5.015405;68.108635;68.910416;, + -6.346445;70.041153;68.809387;, + -5.034431;67.060791;68.905960;, + -5.441578;66.767700;68.786415;, + -4.548992;67.765022;68.960190;, + -14.710178;77.561653;59.569633;, + -15.784473;69.911873;57.321053;, + -15.528388;63.130802;45.068886;, + -15.347429;57.616409;47.193058;, + -15.347429;57.616409;47.193058;, + -7.149835;52.817856;41.486317;, + -7.906905;51.757496;43.185513;, + -9.962842;51.383026;45.418407;, + -7.929698;44.502201;46.021900;, + -8.752393;35.209740;45.489132;, + -7.580388;47.204636;47.215710;, + -9.962842;51.383026;45.418407;, + -8.122182;48.950886;46.050209;, + -9.962842;51.383026;45.418407;, + -9.139874;26.594124;45.452682;, + -7.848414;66.116623;68.406441;, + -6.236395;66.607925;68.646599;, + -8.238889;70.568634;68.310120;, + -10.339741;70.382629;67.493866;, + -7.507647;70.645966;68.558647;, + -11.152501;66.503914;67.438225;, + -9.477689;65.951813;67.955978;, + -11.688239;66.665207;67.208046;, + -8.381545;65.898521;68.278526;, + 5.765529;41.666725;65.621597;, + 8.695706;44.714546;64.299896;, + 4.743902;39.976799;65.832298;, + 3.211673;38.031998;67.529678;, + 9.944007;42.345741;53.625164;, + 12.935205;47.844864;50.501919;, + 15.425858;52.496346;49.328674;, + 16.161591;55.654251;48.952625;, + 15.159414;50.197842;49.912075;, + 14.663563;60.533600;62.358627;, + 13.234347;55.010292;62.553223;, + 14.883218;62.889500;62.645046;, + 15.123456;66.809219;62.450409;, + 15.577708;56.205627;47.969166;, + 14.997487;70.420540;62.992817;, + 14.301835;74.380287;64.488983;, + 13.980994;81.275604;65.186821;, + 8.751598;82.575844;67.678185;, + 14.791316;70.832016;46.772766;, + 16.454370;73.054062;51.038074;, + 16.454536;66.013954;51.296288;, + 12.478778;67.291313;66.688377;, + 12.741013;68.411827;65.535583;, + 12.441926;69.568321;65.742271;, + 11.464467;70.134789;66.847923;, + 12.595016;68.737000;65.669327;, + 12.463537;69.289749;65.733955;, + 11.133315;49.345627;63.166481;, + 5.325842;67.702225;68.891853;, + 6.462132;70.041153;68.809387;, + 5.150118;67.060791;68.905960;, + 5.557265;66.767700;68.786423;, + 14.825865;77.561653;59.569633;, + 15.900160;69.911873;57.321053;, + 14.833782;68.331589;44.645512;, + 14.279436;71.116005;45.658489;, + 15.644074;63.130802;45.068886;, + 15.463116;57.616409;47.193058;, + 15.463116;57.616409;47.193058;, + 7.265521;52.817856;41.486317;, + 10.078528;51.383022;45.418407;, + 8.237869;48.950886;46.050209;, + 10.078528;51.383022;45.418407;, + 8.868079;35.209740;45.489132;, + 8.045384;44.502201;46.021900;, + 7.696074;47.204636;47.215710;, + 8.237869;48.950886;46.050209;, + 9.646603;26.610264;45.446602;, + 6.352082;66.607925;68.646599;, + 7.964100;66.116623;68.406441;, + 10.455427;70.382629;67.493866;, + 8.354575;70.568634;68.310120;, + 7.623333;70.645973;68.558647;, + 9.593375;65.951813;67.955978;, + 11.268188;66.503914;67.438225;, + 11.803926;66.665207;67.208046;, + 8.497231;65.898521;68.278526;, + 5.227813;27.441788;34.143456;, + -5.109205;27.415857;34.161194;, + 11.634122;84.699326;70.485474;, + 30.643127;-31.721945;45.652527;, + -30.350075;-31.719879;45.630089;; + 6841; + 3;28,62,1;, + 3;3,16,3420;, + 3;11,23,29;, + 3;104,69,7;, + 3;0,13,70;, + 3;9,97,96;, + 3;3421,71,2;, + 3;15,22,3;, + 3;3420,15,3;, + 3;68,4,15;, + 3;116,111,106;, + 3;3422,12,6;, + 3;6,12,1742;, + 3;24,14,12;, + 3;3423,108,119;, + 3;102,7,13;, + 3;13,30,23;, + 3;3420,2,15;, + 3;115,116,106;, + 3;100,3424,17;, + 3;100,1,3424;, + 3;1,18,19;, + 3;28,1,19;, + 3;104,94,69;, + 3;15,4,20;, + 3;98,8,97;, + 3;115,106,114;, + 3;29,23,126;, + 3;3422,24,12;, + 3;30,0,27;, + 3;26,11,29;, + 3;24,3422,3425;, + 3;27,126,23;, + 3;3426,3427,3428;, + 3;23,11,13;, + 3;13,0,30;, + 3;23,30,27;, + 3;108,107,120;, + 3;31,6,1741;, + 3;25,32,29;, + 3;32,26,29;, + 3;136,132,135;, + 3;32,25,65;, + 3;63,60,35;, + 3;3419,3429,63;, + 3;35,59,34;, + 3;58,59,16;, + 3;41,36,848;, + 3;51,53,49;, + 3;3430,55,49;, + 3;82,848,36;, + 3;24,38,14;, + 3;84,49,53;, + 3;81,82,43;, + 3;83,3431,39;, + 3;41,45,36;, + 3;40,3430,3432;, + 3;41,37,47;, + 3;24,52,48;, + 3;3430,49,84;, + 3;38,48,50;, + 3;38,24,48;, + 3;49,55,50;, + 3;50,51,49;, + 3;55,56,50;, + 3;48,51,50;, + 3;81,43,80;, + 3;67,54,3433;, + 3;39,66,44;, + 3;50,56,38;, + 3;3430,40,55;, + 3;56,57,38;, + 3;55,40,56;, + 3;56,436,57;, + 3;51,48,52;, + 3;3434,3435,3436;, + 3;3437,3438,3435;, + 3;3437,3439,3438;, + 3;33,3439,3437;, + 3;64,3440,3441;, + 3;3442,3443,33;, + 3;3440,3444,3445;, + 3;52,24,3425;, + 3;3434,3436,3446;, + 3;16,59,3420;, + 3;60,3420,59;, + 3;58,34,59;, + 3;60,3421,3420;, + 3;35,60,59;, + 3;61,27,0;, + 3;3447,61,3448;, + 3;28,3449,62;, + 3;3420,3421,2;, + 3;63,3429,3421;, + 3;3419,63,3450;, + 3;63,3421,60;, + 3;33,64,3442;, + 3;3450,63,35;, + 3;65,129,3447;, + 3;3434,3437,3435;, + 3;3444,42,3445;, + 3;3445,3441,3440;, + 3;39,3451,66;, + 3;3441,3442,64;, + 3;53,67,3433;, + 3;33,3443,3439;, + 3;2,68,15;, + 3;3452,3453,69;, + 3;70,13,7;, + 3;3421,3429,71;, + 3;0,70,73;, + 3;73,72,0;, + 3;7,69,75;, + 3;75,74,7;, + 3;3454,3455,77;, + 3;77,76,3454;, + 3;3453,3456,79;, + 3;79,78,3453;, + 3;70,7,74;, + 3;74,73,70;, + 3;69,3453,78;, + 3;78,75,69;, + 3;3456,3454,76;, + 3;76,79,3456;, + 3;3455,0,72;, + 3;72,77,3455;, + 3;80,43,3457;, + 3;43,82,44;, + 3;37,81,80;, + 3;44,82,83;, + 3;81,37,82;, + 3;44,83,39;, + 3;83,82,36;, + 3;3433,84,53;, + 3;83,36,3431;, + 3;3,22,85;, + 3;110,112,113;, + 3;22,89,85;, + 3;110,114,106;, + 3;95,118,111;, + 3;3447,128,61;, + 3;22,90,89;, + 3;110,113,114;, + 3;109,112,110;, + 3;90,22,91;, + 3;15,91,22;, + 3;15,92,91;, + 3;15,20,92;, + 3;92,20,93;, + 3;117,111,116;, + 3;3452,94,3458;, + 3;94,3452,69;, + 3;99,96,21;, + 3;111,117,95;, + 3;9,96,99;, + 3;1739,97,9;, + 3;97,8,21;, + 3;97,21,96;, + 3;10,98,97;, + 3;31,3422,6;, + 3;1741,6,1744;, + 3;88,99,845;, + 3;107,118,95;, + 3;18,100,17;, + 3;18,1,100;, + 3;101,102,13;, + 3;11,101,13;, + 3;119,108,120;, + 3;103,7,102;, + 3;107,121,120;, + 3;95,122,107;, + 3;107,123,121;, + 3;95,117,122;, + 3;107,122,123;, + 3;103,105,104;, + 3;103,104,7;, + 3;3459,5,106;, + 3;106,111,3459;, + 3;3423,3460,108;, + 3;3423,119,3461;, + 3;3462,3463,116;, + 3;116,115,3462;, + 3;3464,3465,122;, + 3;122,117,3464;, + 3;3466,3462,115;, + 3;115,114,3466;, + 3;107,108,3460;, + 3;3467,3468,113;, + 3;113,112,3467;, + 3;3469,3459,111;, + 3;111,118,3469;, + 3;3468,3466,114;, + 3;114,113,3468;, + 3;87,86,109;, + 3;109,110,87;, + 3;3463,3464,117;, + 3;117,116,3463;, + 3;3470,3469,118;, + 3;118,3471,3470;, + 3;3472,3461,119;, + 3;119,120,3472;, + 3;3473,3472,120;, + 3;120,121,3473;, + 3;3474,3473,121;, + 3;121,123,3474;, + 3;3465,3474,123;, + 3;123,122,3465;, + 3;65,25,124;, + 3;130,132,131;, + 3;127,126,27;, + 3;129,128,3447;, + 3;27,125,127;, + 3;29,126,25;, + 3;134,132,130;, + 3;130,133,134;, + 3;125,27,128;, + 3;128,27,61;, + 3;65,124,129;, + 3;131,132,136;, + 3;3475,3476,135;, + 3;135,132,3475;, + 3;3476,3477,136;, + 3;136,135,3476;, + 3;3478,3479,130;, + 3;130,131,3478;, + 3;3480,3481,134;, + 3;134,133,3480;, + 3;3481,3475,132;, + 3;132,134,3481;, + 3;3479,3480,133;, + 3;133,130,3479;, + 3;3477,3478,131;, + 3;131,136,3477;, + 3;158,138,184;, + 3;3,3482,16;, + 3;145,159,153;, + 3;221,143,191;, + 3;137,192,146;, + 3;144,214,215;, + 3;3483,139,193;, + 3;147,3,152;, + 3;3482,3,147;, + 3;190,147,140;, + 3;231,223,227;, + 3;3484,142,12;, + 3;142,1742,12;, + 3;154,12,14;, + 3;3485,234,225;, + 3;219,146,143;, + 3;146,153,160;, + 3;3482,147,139;, + 3;230,223,231;, + 3;217,17,3424;, + 3;217,3424,138;, + 3;138,149,148;, + 3;158,149,138;, + 3;221,191,212;, + 3;147,150,140;, + 3;98,215,8;, + 3;230,229,223;, + 3;159,241,153;, + 3;3484,12,154;, + 3;160,157,137;, + 3;156,159,145;, + 3;154,3486,3484;, + 3;157,153,241;, + 3;3487,3488,3489;, + 3;153,146,145;, + 3;146,160,137;, + 3;153,157,160;, + 3;225,235,224;, + 3;161,1743,142;, + 3;155,159,162;, + 3;162,159,156;, + 3;251,250,247;, + 3;162,187,155;, + 3;185,164,182;, + 3;183,3418,137;, + 3;164,34,181;, + 3;58,16,181;, + 3;168,37,847;, + 3;175,173,177;, + 3;165,173,179;, + 3;203,847,37;, + 3;154,14,38;, + 3;205,177,173;, + 3;202,169,203;, + 3;204,166,3490;, + 3;168,3491,171;, + 3;167,3492,165;, + 3;168,47,37;, + 3;154,172,176;, + 3;165,205,173;, + 3;38,174,172;, + 3;38,172,154;, + 3;173,174,179;, + 3;174,173,175;, + 3;179,174,180;, + 3;172,174,175;, + 3;202,80,169;, + 3;189,3493,178;, + 3;166,170,188;, + 3;174,38,180;, + 3;165,179,167;, + 3;180,38,57;, + 3;179,180,167;, + 3;734,57,46;, + 3;175,176,172;, + 3;3494,3495,3496;, + 3;3497,3496,3498;, + 3;3497,3498,3499;, + 3;163,3497,3499;, + 3;186,3500,3501;, + 3;3502,163,3503;, + 3;3501,3504,3444;, + 3;176,3486,154;, + 3;3494,3505,3495;, + 3;16,3482,181;, + 3;182,181,3482;, + 3;58,181,34;, + 3;182,3482,3483;, + 3;164,181,182;, + 3;183,137,157;, + 3;3506,3507,183;, + 3;158,184,3508;, + 3;3482,139,3483;, + 3;185,3483,3509;, + 3;183,3507,3418;, + 3;185,182,3483;, + 3;163,3502,186;, + 3;3510,164,185;, + 3;187,3506,244;, + 3;3494,3496,3497;, + 3;3444,3504,42;, + 3;3504,3501,3500;, + 3;166,188,3511;, + 3;3500,186,3502;, + 3;177,3493,189;, + 3;163,3499,3503;, + 3;139,147,190;, + 3;3512,191,3513;, + 3;192,143,146;, + 3;3483,193,3509;, + 3;137,195,192;, + 3;195,137,194;, + 3;143,197,191;, + 3;197,143,196;, + 3;3514,199,3515;, + 3;199,3514,198;, + 3;3513,201,3516;, + 3;201,3513,200;, + 3;192,196,143;, + 3;196,192,195;, + 3;191,200,3513;, + 3;200,191,197;, + 3;3516,198,3514;, + 3;198,3516,201;, + 3;3515,194,137;, + 3;194,3515,199;, + 3;80,3457,169;, + 3;169,170,203;, + 3;37,80,202;, + 3;170,204,203;, + 3;202,203,37;, + 3;170,166,204;, + 3;204,3491,203;, + 3;3493,177,205;, + 3;204,3490,3491;, + 3;3,85,152;, + 3;226,228,112;, + 3;152,85,89;, + 3;226,223,229;, + 3;213,227,233;, + 3;3506,183,243;, + 3;152,89,208;, + 3;226,229,228;, + 3;109,226,112;, + 3;208,209,152;, + 3;147,152,209;, + 3;147,209,210;, + 3;147,210,150;, + 3;210,211,150;, + 3;232,231,227;, + 3;3512,3517,212;, + 3;212,191,3512;, + 3;216,151,214;, + 3;227,213,232;, + 3;144,216,214;, + 3;10,1740,215;, + 3;215,151,8;, + 3;215,214,151;, + 3;10,215,98;, + 3;161,142,3484;, + 3;1745,1742,142;, + 3;846,151,216;, + 3;224,213,233;, + 3;148,17,217;, + 3;148,217,138;, + 3;218,146,219;, + 3;145,146,218;, + 3;234,235,225;, + 3;220,219,143;, + 3;224,235,236;, + 3;213,224,237;, + 3;224,236,238;, + 3;213,237,232;, + 3;224,238,237;, + 3;220,221,222;, + 3;220,143,221;, + 3;207,223,141;, + 3;223,207,227;, + 3;3485,225,3518;, + 3;3485,3519,234;, + 3;3520,231,3521;, + 3;231,3520,230;, + 3;3522,237,3523;, + 3;237,3522,232;, + 3;3524,230,3520;, + 3;230,3524,229;, + 3;224,3518,225;, + 3;3467,228,3525;, + 3;228,3467,112;, + 3;141,223,206;, + 3;226,206,223;, + 3;3526,227,207;, + 3;227,3526,233;, + 3;3525,229,3524;, + 3;229,3525,228;, + 3;206,109,86;, + 3;109,206,226;, + 3;3521,232,3522;, + 3;232,3521,231;, + 3;3527,233,3526;, + 3;233,3528,224;, + 3;3529,234,3519;, + 3;234,3529,235;, + 3;3530,235,3529;, + 3;235,3530,236;, + 3;3531,236,3530;, + 3;236,3531,238;, + 3;3523,238,3531;, + 3;238,3523,237;, + 3;187,239,155;, + 3;245,246,247;, + 3;242,157,241;, + 3;244,3506,243;, + 3;157,242,240;, + 3;159,155,241;, + 3;249,245,247;, + 3;245,249,248;, + 3;240,243,157;, + 3;243,183,157;, + 3;187,244,239;, + 3;246,251,247;, + 3;3532,250,3533;, + 3;250,3532,247;, + 3;3533,251,3534;, + 3;251,3533,250;, + 3;3535,245,3536;, + 3;245,3535,246;, + 3;3537,249,3538;, + 3;249,3537,248;, + 3;3538,247,3532;, + 3;247,3538,249;, + 3;3536,248,3537;, + 3;248,3536,245;, + 3;3534,246,3535;, + 3;246,3534,251;, + 3;255,472,550;, + 3;257,258,551;, + 3;252,467,554;, + 3;453,462,446;, + 3;439,447,448;, + 3;265,262,255;, + 3;462,463,460;, + 3;449,438,450;, + 3;439,443,447;, + 3;469,313,465;, + 3;254,289,466;, + 3;466,483,484;, + 3;260,435,432;, + 3;465,468,469;, + 3;260,473,474;, + 3;434,3539,3540;, + 3;259,465,474;, + 3;266,3541,262;, + 3;313,255,262;, + 3;438,449,445;, + 3;459,258,264;, + 3;265,266,262;, + 3;345,287,343;, + 3;486,485,271;, + 3;344,274,275;, + 3;335,534,535;, + 3;273,3542,340;, + 3;279,337,282;, + 3;393,333,269;, + 3;279,333,280;, + 3;3543,476,475;, + 3;397,400,417;, + 3;398,284,402;, + 3;388,284,405;, + 3;342,285,3544;, + 3;399,407,338;, + 3;394,392,3542;, + 3;480,479,285;, + 3;3542,392,342;, + 3;288,340,3542;, + 3;287,333,282;, + 3;344,334,274;, + 3;333,287,345;, + 3;343,275,270;, + 3;3544,285,552;, + 3;340,288,3544;, + 3;399,389,404;, + 3;290,295,296;, + 3;296,291,290;, + 3;291,296,297;, + 3;297,292,291;, + 3;292,297,298;, + 3;298,293,292;, + 3;309,310,299;, + 3;299,294,309;, + 3;300,301,424;, + 3;3545,422,3546;, + 3;301,302,424;, + 3;347,349,422;, + 3;305,423,306;, + 3;271,368,367;, + 3;3547,3548,301;, + 3;301,300,3547;, + 3;301,3549,426;, + 3;3549,301,3548;, + 3;358,426,359;, + 3;3550,359,426;, + 3;360,3551,364;, + 3;272,303,379;, + 3;374,276,277;, + 3;3552,3553,354;, + 3;3554,3555,306;, + 3;425,353,3553;, + 3;3555,3556,305;, + 3;305,306,3555;, + 3;305,3557,304;, + 3;3557,305,3556;, + 3;3558,3559,3546;, + 3;3546,3560,3558;, + 3;380,277,272;, + 3;294,299,308;, + 3;380,384,277;, + 3;3561,362,3550;, + 3;309,293,310;, + 3;310,293,298;, + 3;425,3553,3554;, + 3;518,517,330;, + 3;376,377,3562;, + 3;3543,477,476;, + 3;286,265,478;, + 3;487,277,488;, + 3;324,273,536;, + 3;313,470,255;, + 3;465,313,262;, + 3;502,501,314;, + 3;489,3562,490;, + 3;3563,491,317;, + 3;533,547,537;, + 3;318,492,493;, + 3;494,485,315;, + 3;330,503,504;, + 3;491,272,495;, + 3;495,487,319;, + 3;506,505,320;, + 3;488,277,496;, + 3;496,497,320;, + 3;519,312,520;, + 3;498,346,499;, + 3;499,489,316;, + 3;497,276,500;, + 3;500,3564,3565;, + 3;507,312,508;, + 3;510,509,319;, + 3;323,268,322;, + 3;512,511,3566;, + 3;466,3540,254;, + 3;550,478,255;, + 3;286,478,479;, + 3;410,387,411;, + 3;390,265,286;, + 3;332,289,254;, + 3;289,256,466;, + 3;281,256,289;, + 3;281,258,256;, + 3;279,548,391;, + 3;279,280,549;, + 3;549,280,261;, + 3;311,472,475;, + 3;3567,472,3568;, + 3;335,340,3544;, + 3;519,323,521;, + 3;513,511,325;, + 3;318,503,514;, + 3;3569,509,327;, + 3;515,505,328;, + 3;516,318,514;, + 3;506,3570,329;, + 3;504,501,330;, + 3;522,518,330;, + 3;267,538,539;, + 3;540,275,541;, + 3;526,278,527;, + 3;525,526,329;, + 3;507,321,515;, + 3;528,322,529;, + 3;521,528,331;, + 3;529,322,530;, + 3;502,513,325;, + 3;510,319,508;, + 3;531,328,527;, + 3;324,532,531;, + 3;325,3571,523;, + 3;420,400,418;, + 3;266,3572,3541;, + 3;279,282,333;, + 3;267,269,553;, + 3;414,409,416;, + 3;287,282,334;, + 3;536,544,336;, + 3;268,534,3573;, + 3;520,312,532;, + 3;548,281,391;, + 3;284,398,403;, + 3;410,416,409;, + 3;338,389,399;, + 3;288,341,3544;, + 3;3542,341,288;, + 3;273,340,543;, + 3;3542,339,341;, + 3;341,339,3544;, + 3;339,342,3544;, + 3;3542,342,339;, + 3;343,344,275;, + 3;267,343,270;, + 3;287,344,343;, + 3;287,334,344;, + 3;267,345,343;, + 3;553,345,267;, + 3;486,498,314;, + 3;347,3545,357;, + 3;271,367,346;, + 3;348,368,271;, + 3;493,348,494;, + 3;370,348,371;, + 3;350,3574,349;, + 3;422,3574,3560;, + 3;348,369,368;, + 3;3575,351,306;, + 3;369,348,370;, + 3;348,307,371;, + 3;306,425,3554;, + 3;351,352,306;, + 3;371,307,372;, + 3;354,3553,353;, + 3;384,374,277;, + 3;3576,276,375;, + 3;374,375,276;, + 3;346,376,3562;, + 3;367,376,346;, + 3;3577,302,358;, + 3;3550,426,3549;, + 3;359,3550,362;, + 3;3562,377,378;, + 3;385,373,3576;, + 3;3576,375,385;, + 3;355,3552,356;, + 3;3578,3552,355;, + 3;379,303,382;, + 3;3561,3551,360;, + 3;3551,361,364;, + 3;3551,3579,361;, + 3;378,381,3562;, + 3;3561,363,362;, + 3;360,363,3561;, + 3;383,380,272;, + 3;379,383,272;, + 3;361,3579,365;, + 3;3578,355,3580;, + 3;366,356,3552;, + 3;3552,354,366;, + 3;3581,3582,367;, + 3;367,368,3581;, + 3;3583,3584,378;, + 3;378,377,3583;, + 3;3585,3586,383;, + 3;383,379,3585;, + 3;3587,3588,371;, + 3;371,372,3587;, + 3;3589,3590,384;, + 3;384,380,3589;, + 3;3591,3583,377;, + 3;377,376,3591;, + 3;3582,3591,376;, + 3;376,367,3582;, + 3;3588,3592,370;, + 3;370,371,3588;, + 3;3593,3581,368;, + 3;368,369,3593;, + 3;3592,3593,369;, + 3;369,370,3592;, + 3;3590,3594,374;, + 3;374,384,3590;, + 3;3594,3595,375;, + 3;375,374,3594;, + 3;3584,3596,381;, + 3;381,378,3584;, + 3;3597,3598,373;, + 3;373,385,3597;, + 3;3595,3597,385;, + 3;385,375,3595;, + 3;3599,3585,379;, + 3;379,382,3599;, + 3;3586,3589,380;, + 3;380,383,3586;, + 3;338,386,389;, + 3;409,387,410;, + 3;418,400,401;, + 3;418,401,419;, + 3;409,412,387;, + 3;284,403,405;, + 3;419,401,413;, + 3;413,401,396;, + 3;415,413,396;, + 3;266,265,390;, + 3;405,408,388;, + 3;279,391,337;, + 3;395,479,480;, + 3;392,285,342;, + 3;393,280,333;, + 3;477,3543,3600;, + 3;338,407,406;, + 3;3601,274,334;, + 3;480,285,392;, + 3;395,392,394;, + 3;3602,3603,403;, + 3;403,398,3602;, + 3;3604,3605,400;, + 3;400,397,3604;, + 3;3606,3604,397;, + 3;397,408,3606;, + 3;3607,3602,398;, + 3;398,402,3607;, + 3;3603,3606,405;, + 3;405,403,3603;, + 3;3608,3609,399;, + 3;399,404,3608;, + 3;3605,3610,401;, + 3;401,400,3605;, + 3;3610,3611,396;, + 3;396,401,3610;, + 3;3612,3607,402;, + 3;402,406,3612;, + 3;3611,3608,404;, + 3;404,396,3611;, + 3;3609,3613,407;, + 3;407,399,3609;, + 3;3613,3612,406;, + 3;406,407,3613;, + 3;417,400,420;, + 3;408,405,3606;, + 3;397,417,408;, + 3;402,284,409;, + 3;409,414,402;, + 3;338,406,416;, + 3;416,410,338;, + 3;404,389,413;, + 3;413,415,404;, + 3;386,338,410;, + 3;410,411,386;, + 3;406,402,414;, + 3;414,416,406;, + 3;389,386,411;, + 3;411,413,389;, + 3;284,388,412;, + 3;412,409,284;, + 3;396,404,415;, + 3;388,408,417;, + 3;417,412,388;, + 3;411,387,418;, + 3;418,419,411;, + 3;387,412,420;, + 3;420,418,387;, + 3;413,411,419;, + 3;417,420,412;, + 3;258,421,264;, + 3;421,258,257;, + 3;3598,3576,373;, + 3;354,353,3614;, + 3;3587,372,307;, + 3;362,363,3615;, + 3;3599,382,303;, + 3;381,3596,3562;, + 3;422,349,3574;, + 3;422,3560,3546;, + 3;3575,306,423;, + 3;423,305,304;, + 3;424,302,3577;, + 3;422,3545,347;, + 3;306,352,425;, + 3;352,353,425;, + 3;358,302,426;, + 3;301,426,302;, + 3;444,443,442;, + 3;443,439,442;, + 3;454,457,455;, + 3;438,445,452;, + 3;432,431,464;, + 3;432,473,260;, + 3;263,433,434;, + 3;482,434,3540;, + 3;431,427,464;, + 3;464,427,556;, + 3;448,451,440;, + 3;448,440,439;, + 3;450,3616,3617;, + 3;438,3616,450;, + 3;429,433,263;, + 3;458,481,459;, + 3;452,445,3618;, + 3;454,456,457;, + 3;462,460,446;, + 3;428,3619,443;, + 3;443,444,428;, + 3;3620,3621,448;, + 3;448,447,3620;, + 3;3622,3623,449;, + 3;449,450,3622;, + 3;3619,3620,447;, + 3;447,443,3619;, + 3;3621,3624,451;, + 3;451,448,3621;, + 3;3625,3622,450;, + 3;450,3617,3625;, + 3;3623,3626,445;, + 3;445,449,3623;, + 3;3627,3628,442;, + 3;442,439,3627;, + 3;3629,3630,438;, + 3;438,452,3629;, + 3;3631,3627,439;, + 3;439,440,3631;, + 3;3630,3632,3616;, + 3;3616,438,3630;, + 3;3626,437,3618;, + 3;3618,445,3626;, + 3;3633,3634,3635;, + 3;3635,441,3633;, + 3;3636,3637,455;, + 3;455,457,3636;, + 3;3635,3636,457;, + 3;457,456,3635;, + 3;441,3635,456;, + 3;456,454,441;, + 3;429,458,3638;, + 3;429,481,458;, + 3;256,258,459;, + 3;463,461,460;, + 3;3638,458,462;, + 3;462,453,3638;, + 3;458,459,463;, + 3;463,462,458;, + 3;459,264,461;, + 3;461,463,459;, + 3;253,430,446;, + 3;446,460,253;, + 3;264,253,460;, + 3;3639,3640,3641;, + 3;556,427,554;, + 3;473,259,474;, + 3;3541,474,262;, + 3;259,468,465;, + 3;466,256,483;, + 3;3540,466,482;, + 3;259,467,468;, + 3;464,467,259;, + 3;467,252,468;, + 3;469,555,3568;, + 3;469,468,252;, + 3;470,313,469;, + 3;3568,470,469;, + 3;470,3568,471;, + 3;472,255,471;, + 3;470,471,255;, + 3;3568,472,471;, + 3;311,283,472;, + 3;432,464,473;, + 3;464,259,473;, + 3;474,465,262;, + 3;260,474,3541;, + 3;475,472,3567;, + 3;3543,475,3567;, + 3;476,477,311;, + 3;476,311,475;, + 3;3544,552,3600;, + 3;477,285,311;, + 3;265,255,478;, + 3;478,283,311;, + 3;479,478,311;, + 3;479,311,285;, + 3;395,480,392;, + 3;286,479,395;, + 3;429,263,481;, + 3;481,263,484;, + 3;482,466,484;, + 3;263,434,482;, + 3;483,256,459;, + 3;483,459,484;, + 3;484,459,481;, + 3;482,484,263;, + 3;486,315,485;, + 3;314,315,486;, + 3;319,487,488;, + 3;319,488,321;, + 3;316,489,490;, + 3;316,490,3566;, + 3;3563,272,491;, + 3;303,272,3563;, + 3;493,492,348;, + 3;492,307,348;, + 3;494,271,485;, + 3;348,271,494;, + 3;317,491,495;, + 3;317,495,319;, + 3;495,277,487;, + 3;272,277,495;, + 3;321,488,496;, + 3;321,496,320;, + 3;496,276,497;, + 3;277,276,496;, + 3;314,498,499;, + 3;314,499,316;, + 3;499,3562,489;, + 3;346,3562,499;, + 3;320,497,500;, + 3;320,500,3565;, + 3;500,3576,3564;, + 3;276,3576,500;, + 3;486,346,498;, + 3;271,346,486;, + 3;318,493,494;, + 3;318,494,315;, + 3;502,325,501;, + 3;325,545,501;, + 3;504,503,315;, + 3;503,318,315;, + 3;506,328,505;, + 3;329,328,506;, + 3;321,507,508;, + 3;321,508,319;, + 3;510,331,509;, + 3;331,327,509;, + 3;512,325,511;, + 3;3642,325,512;, + 3;513,3566,511;, + 3;316,3566,513;, + 3;514,503,326;, + 3;503,330,326;, + 3;3569,319,509;, + 3;317,319,3569;, + 3;515,320,505;, + 3;321,320,515;, + 3;3643,516,514;, + 3;3643,514,326;, + 3;506,3565,3570;, + 3;320,3565,506;, + 3;504,314,501;, + 3;315,314,504;, + 3;312,507,515;, + 3;312,515,328;, + 3;502,316,513;, + 3;314,316,502;, + 3;331,510,508;, + 3;331,508,312;, + 3;542,540,517;, + 3;336,519,520;, + 3;323,519,336;, + 3;331,519,521;, + 3;312,519,331;, + 3;538,542,522;, + 3;523,522,325;, + 3;522,545,325;, + 3;326,517,524;, + 3;330,517,326;, + 3;524,3644,326;, + 3;3644,3643,326;, + 3;329,526,527;, + 3;329,527,328;, + 3;525,278,526;, + 3;275,3645,541;, + 3;327,528,529;, + 3;331,528,327;, + 3;521,323,528;, + 3;323,322,528;, + 3;327,529,530;, + 3;3642,3571,325;, + 3;324,531,527;, + 3;324,527,278;, + 3;531,532,328;, + 3;532,312,328;, + 3;539,537,267;, + 3;336,520,532;, + 3;336,532,324;, + 3;267,537,547;, + 3;535,534,323;, + 3;534,268,323;, + 3;546,275,274;, + 3;278,273,324;, + 3;3646,533,537;, + 3;3646,537,3647;, + 3;536,336,324;, + 3;539,538,523;, + 3;538,522,523;, + 3;517,540,541;, + 3;517,541,524;, + 3;541,3644,524;, + 3;536,543,544;, + 3;273,543,536;, + 3;3573,534,335;, + 3;3573,335,3648;, + 3;535,323,336;, + 3;3542,273,3649;, + 3;518,542,517;, + 3;542,275,540;, + 3;270,275,542;, + 3;522,542,518;, + 3;538,267,542;, + 3;267,270,542;, + 3;541,3645,3644;, + 3;539,523,537;, + 3;523,3571,537;, + 3;3571,3647,537;, + 3;543,340,335;, + 3;543,335,535;, + 3;544,543,535;, + 3;544,535,336;, + 3;522,330,545;, + 3;545,330,501;, + 3;3649,273,278;, + 3;3645,275,546;, + 3;3648,335,3544;, + 3;547,269,267;, + 3;279,258,548;, + 3;258,281,548;, + 3;258,549,551;, + 3;279,549,258;, + 3;550,472,283;, + 3;283,478,550;, + 3;551,549,261;, + 3;257,551,261;, + 3;552,285,477;, + 3;552,477,3600;, + 3;553,269,333;, + 3;333,345,553;, + 3;554,427,3650;, + 3;469,252,555;, + 3;467,556,554;, + 3;464,556,467;, + 3;558,840,762;, + 3;257,841,560;, + 3;252,554,757;, + 3;747,446,752;, + 3;737,742,741;, + 3;566,558,564;, + 3;752,460,753;, + 3;743,744,736;, + 3;737,741,739;, + 3;759,755,614;, + 3;557,756,590;, + 3;756,774,773;, + 3;562,730,733;, + 3;755,759,758;, + 3;562,764,763;, + 3;732,3651,3652;, + 3;561,764,755;, + 3;567,564,3653;, + 3;614,564,558;, + 3;736,740,743;, + 3;751,264,560;, + 3;566,564,567;, + 3;646,644,588;, + 3;776,572,775;, + 3;645,576,575;, + 3;636,825,824;, + 3;574,641,3654;, + 3;580,583,638;, + 3;694,570,634;, + 3;580,581,634;, + 3;3655,765,766;, + 3;698,718,701;, + 3;699,703,585;, + 3;689,706,585;, + 3;643,3656,586;, + 3;700,639,708;, + 3;695,3654,693;, + 3;770,586,769;, + 3;3654,643,693;, + 3;589,3654,641;, + 3;588,583,634;, + 3;645,575,635;, + 3;634,646,588;, + 3;644,571,576;, + 3;3656,842,586;, + 3;641,3656,589;, + 3;700,705,690;, + 3;591,597,596;, + 3;597,591,592;, + 3;592,598,597;, + 3;598,592,593;, + 3;593,599,598;, + 3;599,593,594;, + 3;610,600,611;, + 3;600,610,595;, + 3;601,724,602;, + 3;3657,3658,722;, + 3;602,724,603;, + 3;648,722,650;, + 3;606,607,723;, + 3;572,668,669;, + 3;3659,602,3660;, + 3;602,3659,601;, + 3;602,726,3661;, + 3;3661,3660,602;, + 3;659,660,726;, + 3;3662,726,660;, + 3;661,665,3663;, + 3;573,680,604;, + 3;675,578,577;, + 3;3664,655,3665;, + 3;3666,607,3667;, + 3;725,3665,654;, + 3;3667,606,3668;, + 3;606,3667,607;, + 3;606,605,3669;, + 3;3669,3668,606;, + 3;3670,3658,3671;, + 3;3658,3670,3672;, + 3;681,573,578;, + 3;595,609,600;, + 3;681,578,685;, + 3;3673,3662,663;, + 3;610,611,594;, + 3;611,599,594;, + 3;725,3666,3665;, + 3;808,631,807;, + 3;677,3674,678;, + 3;3655,766,767;, + 3;587,768,566;, + 3;777,778,578;, + 3;625,826,574;, + 3;614,558,760;, + 3;755,564,614;, + 3;792,615,791;, + 3;779,780,3674;, + 3;3675,618,781;, + 3;823,827,837;, + 3;619,783,782;, + 3;784,616,775;, + 3;631,794,793;, + 3;781,785,573;, + 3;785,620,777;, + 3;796,621,795;, + 3;778,786,578;, + 3;786,621,787;, + 3;809,810,613;, + 3;788,789,647;, + 3;789,617,779;, + 3;787,790,577;, + 3;790,3676,3677;, + 3;797,798,613;, + 3;800,620,799;, + 3;624,623,569;, + 3;802,3678,801;, + 3;756,557,3651;, + 3;840,558,768;, + 3;587,769,768;, + 3;711,712,688;, + 3;691,587,566;, + 3;633,557,590;, + 3;590,756,559;, + 3;582,590,559;, + 3;582,559,560;, + 3;580,692,838;, + 3;580,839,581;, + 3;839,563,581;, + 3;612,765,762;, + 3;3679,3568,762;, + 3;636,3656,641;, + 3;809,811,624;, + 3;803,626,801;, + 3;619,804,793;, + 3;3680,628,799;, + 3;805,629,795;, + 3;806,804,619;, + 3;796,630,3681;, + 3;794,631,791;, + 3;812,631,808;, + 3;568,829,828;, + 3;830,831,576;, + 3;816,817,579;, + 3;815,630,816;, + 3;797,805,622;, + 3;818,819,623;, + 3;811,632,818;, + 3;819,820,623;, + 3;792,626,803;, + 3;800,798,620;, + 3;821,817,629;, + 3;625,821,822;, + 3;626,813,3682;, + 3;721,719,701;, + 3;567,3653,3683;, + 3;580,634,583;, + 3;568,843,570;, + 3;715,717,710;, + 3;588,635,583;, + 3;826,637,834;, + 3;569,3684,824;, + 3;810,822,613;, + 3;838,692,582;, + 3;585,704,699;, + 3;711,710,717;, + 3;639,700,690;, + 3;589,3656,642;, + 3;3654,589,642;, + 3;574,833,641;, + 3;3654,642,640;, + 3;642,3656,640;, + 3;640,3656,643;, + 3;3654,640,643;, + 3;644,576,645;, + 3;568,571,644;, + 3;588,644,645;, + 3;588,645,635;, + 3;568,644,646;, + 3;843,568,646;, + 3;776,615,788;, + 3;724,658,603;, + 3;572,647,668;, + 3;649,572,669;, + 3;783,784,649;, + 3;671,672,649;, + 3;651,650,3685;, + 3;722,3672,3685;, + 3;649,669,670;, + 3;3686,607,652;, + 3;670,671,649;, + 3;649,672,608;, + 3;607,3666,725;, + 3;652,607,653;, + 3;672,673,608;, + 3;655,654,3665;, + 3;685,578,675;, + 3;3687,676,577;, + 3;675,577,676;, + 3;647,3674,677;, + 3;668,647,677;, + 3;658,659,603;, + 3;3662,3661,726;, + 3;660,663,3662;, + 3;3674,679,678;, + 3;686,3687,674;, + 3;3687,686,676;, + 3;656,657,3664;, + 3;3688,656,3664;, + 3;680,683,604;, + 3;3673,661,3663;, + 3;3663,665,662;, + 3;3663,662,3689;, + 3;679,3674,682;, + 3;3673,663,664;, + 3;661,3673,664;, + 3;684,573,681;, + 3;680,573,684;, + 3;662,666,3689;, + 3;3688,3690,656;, + 3;667,3664,657;, + 3;3664,667,655;, + 3;3691,668,3692;, + 3;668,3691,669;, + 3;3693,679,3694;, + 3;679,3693,678;, + 3;3695,684,3696;, + 3;684,3695,680;, + 3;3697,672,3698;, + 3;672,3697,673;, + 3;3699,685,3700;, + 3;685,3699,681;, + 3;3701,678,3693;, + 3;678,3701,677;, + 3;3692,677,3701;, + 3;677,3692,668;, + 3;3698,671,3702;, + 3;671,3698,672;, + 3;3703,669,3691;, + 3;669,3703,670;, + 3;3702,670,3703;, + 3;670,3702,671;, + 3;3700,675,3704;, + 3;675,3700,685;, + 3;3704,676,3705;, + 3;676,3704,675;, + 3;3694,682,3706;, + 3;682,3694,679;, + 3;3707,674,3708;, + 3;674,3707,686;, + 3;3705,686,3707;, + 3;686,3705,676;, + 3;3709,680,3695;, + 3;680,3709,683;, + 3;3696,681,3699;, + 3;681,3696,684;, + 3;639,690,687;, + 3;710,711,688;, + 3;719,702,701;, + 3;719,720,702;, + 3;710,688,713;, + 3;585,706,704;, + 3;720,714,702;, + 3;714,697,702;, + 3;716,697,714;, + 3;567,691,566;, + 3;706,689,709;, + 3;580,638,692;, + 3;696,770,769;, + 3;693,643,586;, + 3;694,634,581;, + 3;767,3710,3655;, + 3;639,707,708;, + 3;3711,635,575;, + 3;770,693,586;, + 3;696,695,693;, + 3;3712,704,3713;, + 3;704,3712,699;, + 3;3714,701,3715;, + 3;701,3714,698;, + 3;3716,698,3714;, + 3;698,3716,709;, + 3;3717,699,3712;, + 3;699,3717,703;, + 3;3713,706,3716;, + 3;706,3713,704;, + 3;3718,700,3719;, + 3;700,3718,705;, + 3;3715,702,3720;, + 3;702,3715,701;, + 3;3720,697,3721;, + 3;697,3720,702;, + 3;3722,703,3717;, + 3;703,3722,707;, + 3;3721,705,3718;, + 3;705,3721,697;, + 3;3719,708,3723;, + 3;708,3719,700;, + 3;3723,707,3722;, + 3;707,3723,708;, + 3;718,721,701;, + 3;709,3716,706;, + 3;698,709,718;, + 3;703,710,585;, + 3;710,703,715;, + 3;639,717,707;, + 3;717,639,711;, + 3;705,714,690;, + 3;714,705,716;, + 3;687,711,639;, + 3;711,687,712;, + 3;707,715,703;, + 3;715,707,717;, + 3;690,712,687;, + 3;712,690,714;, + 3;585,713,689;, + 3;713,585,710;, + 3;697,716,705;, + 3;689,718,709;, + 3;718,689,713;, + 3;712,719,688;, + 3;719,712,720;, + 3;688,721,713;, + 3;721,688,719;, + 3;714,720,712;, + 3;718,713,721;, + 3;560,264,421;, + 3;421,257,560;, + 3;3708,674,3687;, + 3;655,3724,654;, + 3;3697,608,673;, + 3;663,3725,664;, + 3;3709,604,683;, + 3;682,3674,3706;, + 3;722,3685,650;, + 3;722,3658,3672;, + 3;3686,723,607;, + 3;723,605,606;, + 3;3657,648,3726;, + 3;722,648,3657;, + 3;607,725,653;, + 3;653,725,654;, + 3;659,726,603;, + 3;602,603,726;, + 3;444,442,739;, + 3;739,442,737;, + 3;454,455,749;, + 3;736,746,740;, + 3;730,754,729;, + 3;730,562,763;, + 3;565,732,731;, + 3;772,3651,732;, + 3;729,754,727;, + 3;754,844,727;, + 3;742,738,745;, + 3;742,737,738;, + 3;744,3727,3728;, + 3;736,744,3728;, + 3;728,565,731;, + 3;750,751,771;, + 3;746,3729,740;, + 3;454,749,748;, + 3;752,446,460;, + 3;428,739,3730;, + 3;739,428,444;, + 3;3731,742,3732;, + 3;742,3731,741;, + 3;3733,743,3734;, + 3;743,3733,744;, + 3;3730,741,3731;, + 3;741,3730,739;, + 3;3732,745,3735;, + 3;745,3732,742;, + 3;3736,744,3733;, + 3;744,3736,3727;, + 3;3734,740,3737;, + 3;740,3734,743;, + 3;3738,442,3628;, + 3;442,3738,737;, + 3;3739,736,3740;, + 3;736,3739,746;, + 3;3741,737,3738;, + 3;737,3741,738;, + 3;3740,3728,3742;, + 3;3728,3740,736;, + 3;3737,3729,735;, + 3;3729,3737,740;, + 3;3633,3743,3744;, + 3;3743,3633,441;, + 3;3745,455,3637;, + 3;455,3745,749;, + 3;3743,749,3745;, + 3;749,3743,748;, + 3;441,748,3743;, + 3;748,441,454;, + 3;728,3746,750;, + 3;728,750,771;, + 3;559,751,560;, + 3;753,460,461;, + 3;3746,752,750;, + 3;752,3746,747;, + 3;750,753,751;, + 3;753,750,752;, + 3;751,461,264;, + 3;461,751,753;, + 3;253,446,430;, + 3;446,253,460;, + 3;264,460,253;, + 3;460,264,461;, + 3;844,554,727;, + 3;763,764,561;, + 3;3653,564,764;, + 3;561,755,758;, + 3;756,773,559;, + 3;3651,772,756;, + 3;561,758,757;, + 3;754,561,757;, + 3;757,758,252;, + 3;759,3568,555;, + 3;759,252,758;, + 3;760,759,614;, + 3;3568,759,760;, + 3;760,761,3568;, + 3;762,761,558;, + 3;760,558,761;, + 3;3568,761,762;, + 3;612,762,584;, + 3;730,763,754;, + 3;754,763,561;, + 3;764,564,755;, + 3;562,3653,764;, + 3;765,3679,762;, + 3;3655,3679,765;, + 3;766,612,767;, + 3;766,765,612;, + 3;3656,3710,842;, + 3;767,612,586;, + 3;566,768,558;, + 3;768,612,584;, + 3;769,612,768;, + 3;769,586,612;, + 3;696,693,770;, + 3;587,696,769;, + 3;728,771,565;, + 3;771,774,565;, + 3;772,774,756;, + 3;565,772,732;, + 3;773,751,559;, + 3;773,774,751;, + 3;774,771,751;, + 3;772,565,774;, + 3;776,775,616;, + 3;615,776,616;, + 3;620,778,777;, + 3;620,622,778;, + 3;617,780,779;, + 3;617,3678,780;, + 3;3675,781,573;, + 3;604,3675,573;, + 3;783,649,782;, + 3;782,649,608;, + 3;784,775,572;, + 3;649,784,572;, + 3;618,785,781;, + 3;618,620,785;, + 3;785,777,578;, + 3;573,785,578;, + 3;622,786,778;, + 3;622,621,786;, + 3;786,787,577;, + 3;578,786,577;, + 3;615,789,788;, + 3;615,617,789;, + 3;789,779,3674;, + 3;647,789,3674;, + 3;621,790,787;, + 3;621,3676,790;, + 3;790,3677,3687;, + 3;577,790,3687;, + 3;776,788,647;, + 3;572,776,647;, + 3;619,784,783;, + 3;619,616,784;, + 3;792,791,626;, + 3;626,791,835;, + 3;794,616,793;, + 3;793,616,619;, + 3;796,795,629;, + 3;630,796,629;, + 3;622,798,797;, + 3;622,620,798;, + 3;800,799,632;, + 3;632,799,628;, + 3;802,801,626;, + 3;3747,802,626;, + 3;803,801,3678;, + 3;617,803,3678;, + 3;804,627,793;, + 3;793,627,631;, + 3;3680,799,620;, + 3;618,3680,620;, + 3;805,795,621;, + 3;622,805,621;, + 3;3748,804,806;, + 3;3748,627,804;, + 3;796,3681,3676;, + 3;621,796,3676;, + 3;794,791,615;, + 3;616,794,615;, + 3;613,805,797;, + 3;613,629,805;, + 3;792,803,617;, + 3;615,792,617;, + 3;632,798,800;, + 3;632,613,798;, + 3;832,807,830;, + 3;637,810,809;, + 3;624,637,809;, + 3;632,811,809;, + 3;613,632,809;, + 3;828,812,832;, + 3;813,626,812;, + 3;812,626,835;, + 3;627,814,807;, + 3;631,627,807;, + 3;814,627,3749;, + 3;3749,627,3748;, + 3;630,817,816;, + 3;630,629,817;, + 3;815,816,579;, + 3;576,831,3750;, + 3;628,819,818;, + 3;632,628,818;, + 3;811,818,624;, + 3;624,818,623;, + 3;628,820,819;, + 3;3747,626,3682;, + 3;625,817,821;, + 3;625,579,817;, + 3;821,629,822;, + 3;822,629,613;, + 3;829,568,827;, + 3;637,822,810;, + 3;637,625,822;, + 3;568,837,827;, + 3;825,624,824;, + 3;824,624,569;, + 3;836,575,576;, + 3;579,625,574;, + 3;3751,827,823;, + 3;3751,3752,827;, + 3;826,625,637;, + 3;829,813,828;, + 3;828,813,812;, + 3;807,831,830;, + 3;807,814,831;, + 3;831,814,3749;, + 3;826,834,833;, + 3;574,826,833;, + 3;3684,636,824;, + 3;3684,3753,636;, + 3;825,637,624;, + 3;3654,3754,574;, + 3;808,807,832;, + 3;832,830,576;, + 3;571,832,576;, + 3;812,808,832;, + 3;828,832,568;, + 3;568,832,571;, + 3;831,3749,3750;, + 3;829,827,813;, + 3;813,827,3682;, + 3;3682,827,3752;, + 3;833,636,641;, + 3;833,825,636;, + 3;834,825,833;, + 3;834,637,825;, + 3;812,835,631;, + 3;835,791,631;, + 3;3754,579,574;, + 3;3750,836,576;, + 3;3753,3656,636;, + 3;837,568,570;, + 3;580,838,560;, + 3;560,838,582;, + 3;560,841,839;, + 3;580,560,839;, + 3;840,584,762;, + 3;584,840,768;, + 3;841,563,839;, + 3;257,563,841;, + 3;842,767,586;, + 3;842,3710,767;, + 3;843,634,570;, + 3;634,843,646;, + 3;554,3650,727;, + 3;759,555,252;, + 3;757,554,844;, + 3;754,757,844;, + 3;845,99,21;, + 3;3755,846,216;, + 3;180,734,167;, + 3;180,57,734;, + 3;46,57,436;, + 3;436,56,40;, + 3;203,3491,847;, + 3;168,847,3491;, + 3;82,37,848;, + 3;41,848,37;, + 3;849,1291,850;, + 3;943,852,851;, + 3;849,1290,944;, + 3;1289,854,1293;, + 3;854,1289,944;, + 3;859,888,945;, + 3;855,861,887;, + 3;946,856,3756;, + 3;1292,3757,3758;, + 3;3757,3759,3760;, + 3;852,946,851;, + 3;857,889,849;, + 3;858,857,850;, + 3;850,857,849;, + 3;853,860,1290;, + 3;3761,861,3758;, + 3;3758,861,855;, + 3;887,859,945;, + 3;875,891,890;, + 3;893,892,862;, + 3;894,869,895;, + 3;897,896,863;, + 3;898,876,899;, + 3;900,862,892;, + 3;902,901,874;, + 3;898,877,903;, + 3;868,904,890;, + 3;894,864,905;, + 3;905,864,904;, + 3;896,872,895;, + 3;867,902,906;, + 3;3762,3763,891;, + 3;899,906,865;, + 3;903,3764,3765;, + 3;901,900,874;, + 3;3763,880,868;, + 3;880,3763,879;, + 3;867,882,878;, + 3;882,867,881;, + 3;3765,884,876;, + 3;884,3765,883;, + 3;866,886,869;, + 3;886,866,885;, + 3;868,880,866;, + 3;885,866,880;, + 3;869,3766,863;, + 3;3766,869,886;, + 3;876,881,867;, + 3;881,876,884;, + 3;878,3767,862;, + 3;3767,878,882;, + 3;870,3768,871;, + 3;3768,870,3769;, + 3;872,3770,864;, + 3;3770,872,3771;, + 3;873,3771,872;, + 3;3771,873,3772;, + 3;865,3773,877;, + 3;3773,865,3774;, + 3;871,3775,874;, + 3;3775,871,3768;, + 3;864,3776,875;, + 3;3776,864,3770;, + 3;874,3774,865;, + 3;3774,874,3775;, + 3;875,3777,3778;, + 3;3777,875,3776;, + 3;877,3779,3780;, + 3;3779,877,3773;, + 3;890,891,868;, + 3;868,891,3763;, + 3;892,893,871;, + 3;871,893,870;, + 3;894,895,864;, + 3;864,895,872;, + 3;896,897,872;, + 3;872,897,873;, + 3;898,899,877;, + 3;877,899,865;, + 3;900,892,874;, + 3;874,892,871;, + 3;901,902,878;, + 3;878,902,867;, + 3;898,903,876;, + 3;876,903,3765;, + 3;890,904,875;, + 3;875,904,864;, + 3;894,905,869;, + 3;869,905,866;, + 3;905,904,866;, + 3;866,904,868;, + 3;896,895,863;, + 3;863,895,869;, + 3;906,902,865;, + 3;865,902,874;, + 3;3762,891,3778;, + 3;3778,891,875;, + 3;906,899,867;, + 3;867,899,876;, + 3;3764,903,3780;, + 3;3780,903,877;, + 3;900,901,862;, + 3;862,901,878;, + 3;889,1290,849;, + 3;3781,858,850;, + 3;855,887,945;, + 3;921,939,908;, + 3;942,922,3782;, + 3;923,910,924;, + 3;907,926,925;, + 3;926,927,911;, + 3;929,928,915;, + 3;3783,919,913;, + 3;931,930,913;, + 3;941,920,908;, + 3;931,932,3784;, + 3;929,933,908;, + 3;916,918,3785;, + 3;917,3786,913;, + 3;935,934,914;, + 3;916,935,936;, + 3;937,3787,938;, + 3;3788,3785,918;, + 3;3789,909,919;, + 3;912,3790,3791;, + 3;916,3786,917;, + 3;934,930,914;, + 3;918,3792,3788;, + 3;936,3787,937;, + 3;3783,913,3786;, + 3;932,3793,3784;, + 3;928,3794,915;, + 3;940,908,939;, + 3;907,942,940;, + 3;927,933,911;, + 3;922,3795,3782;, + 3;925,910,923;, + 3;923,924,922;, + 3;922,924,3795;, + 3;925,926,910;, + 3;910,926,911;, + 3;927,926,921;, + 3;921,926,907;, + 3;928,929,920;, + 3;920,929,908;, + 3;930,931,914;, + 3;914,931,3784;, + 3;932,931,919;, + 3;919,931,913;, + 3;933,929,911;, + 3;911,929,915;, + 3;934,935,917;, + 3;917,935,916;, + 3;936,935,3787;, + 3;3787,935,914;, + 3;937,938,918;, + 3;918,938,3792;, + 3;930,934,913;, + 3;913,934,917;, + 3;936,937,916;, + 3;916,937,918;, + 3;3793,932,909;, + 3;909,932,919;, + 3;3794,928,912;, + 3;912,928,920;, + 3;933,927,908;, + 3;908,927,921;, + 3;925,923,907;, + 3;907,923,922;, + 3;912,920,3790;, + 3;3782,3795,3796;, + 3;940,3782,3797;, + 3;941,940,3790;, + 3;907,939,921;, + 3;939,907,940;, + 3;940,3797,3790;, + 3;3790,920,941;, + 3;908,940,941;, + 3;907,922,942;, + 3;942,3782,940;, + 3;3789,919,3783;, + 3;3785,3786,916;, + 3;1289,852,943;, + 3;849,944,1289;, + 3;854,944,1290;, + 3;3798,3781,850;, + 3;3799,3800,851;, + 3;852,856,946;, + 3;946,3801,3799;, + 3;1271,947,3802;, + 3;3802,3803,1271;, + 3;3804,949,3805;, + 3;1273,3804,3806;, + 3;3807,948,3803;, + 3;948,3807,1272;, + 3;1274,950,3808;, + 3;1274,3805,949;, + 3;1275,1276,1274;, + 3;1278,952,1277;, + 3;1279,1280,954;, + 3;1282,951,1281;, + 3;1283,1284,1273;, + 3;1283,3809,3810;, + 3;1008,1270,956;, + 3;955,3811,3812;, + 3;981,957,1267;, + 3;970,1009,973;, + 3;3813,959,953;, + 3;1268,963,988;, + 3;3814,1263,3815;, + 3;959,3813,982;, + 3;973,958,970;, + 3;959,984,953;, + 3;3816,962,957;, + 3;1011,955,974;, + 3;984,3817,953;, + 3;984,965,3817;, + 3;991,961,964;, + 3;1263,963,1012;, + 3;963,3814,3818;, + 3;989,990,964;, + 3;3819,3820,966;, + 3;991,967,992;, + 3;992,965,991;, + 3;3818,966,963;, + 3;966,3818,968;, + 3;961,986,964;, + 3;964,986,3821;, + 3;976,974,1008;, + 3;1009,956,973;, + 3;969,1008,971;, + 3;975,974,972;, + 3;1263,1012,973;, + 3;1270,1263,956;, + 3;955,3815,1270;, + 3;969,976,1008;, + 3;1011,974,975;, + 3;1010,974,976;, + 3;3816,981,982;, + 3;980,1267,957;, + 3;959,982,981;, + 3;3816,982,3813;, + 3;961,991,984;, + 3;959,983,984;, + 3;983,961,984;, + 3;1012,963,985;, + 3;963,1268,985;, + 3;983,986,961;, + 3;983,987,986;, + 3;3820,988,963;, + 3;963,966,3820;, + 3;964,3821,989;, + 3;967,964,990;, + 3;965,984,991;, + 3;964,967,991;, + 3;965,992,3822;, + 3;992,995,3822;, + 3;995,992,994;, + 3;966,993,3819;, + 3;993,966,996;, + 3;967,994,992;, + 3;994,967,997;, + 3;968,996,966;, + 3;996,968,3823;, + 3;990,997,967;, + 3;997,990,3824;, + 3;994,1000,995;, + 3;1000,994,999;, + 3;996,998,993;, + 3;998,996,1001;, + 3;3823,1001,996;, + 3;1001,3823,3825;, + 3;3826,1002,3827;, + 3;3828,3824,3829;, + 3;997,999,994;, + 3;999,997,3828;, + 3;999,1005,1000;, + 3;1005,999,1004;, + 3;1001,1003,998;, + 3;1003,1001,1006;, + 3;3825,1006,1001;, + 3;1006,3825,3830;, + 3;3829,1007,3828;, + 3;1007,3829,3831;, + 3;3828,1004,999;, + 3;1004,3828,1007;, + 3;1007,1005,1004;, + 3;3830,1003,1006;, + 3;3831,1005,1007;, + 3;974,955,1270;, + 3;971,1008,956;, + 3;971,956,1009;, + 3;972,974,1010;, + 3;3832,955,1011;, + 3;958,973,1012;, + 3;1016,1015,970;, + 3;958,1016,970;, + 3;1017,1016,958;, + 3;1012,1017,958;, + 3;1018,1017,1012;, + 3;985,1018,1012;, + 3;1019,3833,3834;, + 3;960,1019,3834;, + 3;1020,1019,960;, + 3;979,1020,960;, + 3;3835,1020,979;, + 3;3836,3835,979;, + 3;1022,1021,1015;, + 3;1016,1022,1015;, + 3;1023,1022,1016;, + 3;1017,1023,1016;, + 3;1024,1023,1017;, + 3;1018,1024,1017;, + 3;1025,3837,3833;, + 3;1019,1025,3833;, + 3;1026,1025,1019;, + 3;1020,1026,1019;, + 3;3838,1026,1020;, + 3;3835,3838,1020;, + 3;1028,1027,1021;, + 3;1022,1028,1021;, + 3;1029,1028,1022;, + 3;1023,1029,1022;, + 3;1030,1029,1023;, + 3;1024,1030,1023;, + 3;1031,3839,3837;, + 3;1025,1031,3837;, + 3;1032,1031,1025;, + 3;1026,1032,1025;, + 3;3840,1032,1026;, + 3;3838,3840,1026;, + 3;1034,1033,1027;, + 3;1028,1034,1027;, + 3;1035,1034,1028;, + 3;1029,1035,1028;, + 3;1036,1035,1029;, + 3;1030,1036,1029;, + 3;1037,3841,3839;, + 3;1031,1037,3839;, + 3;1038,1037,1031;, + 3;1032,1038,1031;, + 3;3842,1038,1032;, + 3;3840,3842,1032;, + 3;1040,1039,1033;, + 3;1034,1040,1033;, + 3;1041,1040,1034;, + 3;1035,1041,1034;, + 3;1042,1041,1035;, + 3;1036,1042,1035;, + 3;1043,3843,3841;, + 3;1037,1043,3841;, + 3;1044,1043,1037;, + 3;1038,1044,1037;, + 3;3844,1044,1038;, + 3;3842,3844,1038;, + 3;1046,1045,1039;, + 3;1040,1046,1039;, + 3;1047,1046,1040;, + 3;1041,1047,1040;, + 3;1048,1047,1041;, + 3;1042,1048,1041;, + 3;1049,3845,3843;, + 3;1043,1049,3843;, + 3;1050,1049,1043;, + 3;1044,1050,1043;, + 3;3846,1050,1044;, + 3;3844,3846,1044;, + 3;1052,1051,1045;, + 3;1046,1052,1045;, + 3;1053,1052,1046;, + 3;1047,1053,1046;, + 3;1054,1053,1047;, + 3;1048,1054,1047;, + 3;1055,3847,3845;, + 3;1049,1055,3845;, + 3;1056,1055,1049;, + 3;1050,1056,1049;, + 3;3848,1056,1050;, + 3;3846,3848,1050;, + 3;1058,1057,1051;, + 3;1052,1058,1051;, + 3;1059,1058,1052;, + 3;1053,1059,1052;, + 3;1060,1059,1053;, + 3;1054,1060,1053;, + 3;1061,3849,3847;, + 3;1055,1061,3847;, + 3;1062,1061,1055;, + 3;1056,1062,1055;, + 3;3850,1062,1056;, + 3;3848,3850,1056;, + 3;1064,1063,1057;, + 3;1058,1064,1057;, + 3;1065,1064,1058;, + 3;1059,1065,1058;, + 3;1066,1065,1059;, + 3;1060,1066,1059;, + 3;1067,3851,3849;, + 3;1061,1067,3849;, + 3;1068,1067,1061;, + 3;1062,1068,1061;, + 3;3852,1068,1062;, + 3;3850,3852,1062;, + 3;1070,1069,1063;, + 3;1064,1070,1063;, + 3;1071,1070,1064;, + 3;1065,1071,1064;, + 3;1072,1071,1065;, + 3;1066,1072,1065;, + 3;1073,3853,3851;, + 3;1067,1073,3851;, + 3;1074,1073,1067;, + 3;1068,1074,1067;, + 3;3854,1074,1068;, + 3;3852,3854,1068;, + 3;1070,1075,1069;, + 3;1071,1076,1070;, + 3;1075,1070,1076;, + 3;1072,1076,1071;, + 3;1073,3855,3853;, + 3;1074,3856,1073;, + 3;3855,1073,3856;, + 3;3854,3856,1074;, + 3;1078,1077,969;, + 3;971,1078,969;, + 3;1079,1078,971;, + 3;1009,1079,971;, + 3;1080,1079,1009;, + 3;970,1080,1009;, + 3;1081,3857,3836;, + 3;978,1081,3836;, + 3;1082,1081,978;, + 3;1013,1082,978;, + 3;3858,1082,1013;, + 3;3859,3858,1013;, + 3;1084,1083,1077;, + 3;1078,1084,1077;, + 3;1085,1084,1078;, + 3;1079,1085,1078;, + 3;1086,1085,1079;, + 3;1080,1086,1079;, + 3;1087,3860,3857;, + 3;1081,1087,3857;, + 3;1088,1087,1081;, + 3;1082,1088,1081;, + 3;3861,1088,1082;, + 3;3858,3861,1082;, + 3;1090,1089,1083;, + 3;1084,1090,1083;, + 3;1091,1090,1084;, + 3;1085,1091,1084;, + 3;1092,1091,1085;, + 3;1086,1092,1085;, + 3;1093,3862,3860;, + 3;1087,1093,3860;, + 3;1094,1093,1087;, + 3;1088,1094,1087;, + 3;3863,1094,1088;, + 3;3861,3863,1088;, + 3;1096,1095,1089;, + 3;1090,1096,1089;, + 3;1097,1096,1090;, + 3;1091,1097,1090;, + 3;1098,1097,1091;, + 3;1092,1098,1091;, + 3;1099,3864,3862;, + 3;1093,1099,3862;, + 3;1100,1099,1093;, + 3;1094,1100,1093;, + 3;3865,1100,1094;, + 3;3863,3865,1094;, + 3;1102,1101,1095;, + 3;1096,1102,1095;, + 3;1103,1102,1096;, + 3;1097,1103,1096;, + 3;1104,1103,1097;, + 3;1098,1104,1097;, + 3;1105,3866,3864;, + 3;1099,1105,3864;, + 3;1106,1105,1099;, + 3;1100,1106,1099;, + 3;3867,1106,1100;, + 3;3865,3867,1100;, + 3;1108,1107,1101;, + 3;1102,1108,1101;, + 3;1109,1108,1102;, + 3;1103,1109,1102;, + 3;1110,1109,1103;, + 3;1104,1110,1103;, + 3;1111,3868,3866;, + 3;1105,1111,3866;, + 3;1112,1111,1105;, + 3;1106,1112,1105;, + 3;3869,1112,1106;, + 3;3867,3869,1106;, + 3;1114,1113,1107;, + 3;1108,1114,1107;, + 3;1115,1114,1108;, + 3;1109,1115,1108;, + 3;1116,1115,1109;, + 3;1110,1116,1109;, + 3;1117,3870,3868;, + 3;1111,1117,3868;, + 3;1118,1117,1111;, + 3;1112,1118,1111;, + 3;3871,1118,1112;, + 3;3869,3871,1112;, + 3;1120,1119,1113;, + 3;1114,1120,1113;, + 3;1121,1120,1114;, + 3;1115,1121,1114;, + 3;1122,1121,1115;, + 3;1116,1122,1115;, + 3;1123,3872,3870;, + 3;1117,1123,3870;, + 3;1124,1123,1117;, + 3;1118,1124,1117;, + 3;3873,1124,1118;, + 3;3871,3873,1118;, + 3;1126,1125,1119;, + 3;1120,1126,1119;, + 3;1127,1126,1120;, + 3;1121,1127,1120;, + 3;1128,1127,1121;, + 3;1122,1128,1121;, + 3;1129,3874,3872;, + 3;1123,1129,3872;, + 3;1130,1129,1123;, + 3;1124,1130,1123;, + 3;3875,1130,1124;, + 3;3873,3875,1124;, + 3;1132,1131,1125;, + 3;1126,1132,1125;, + 3;1133,1132,1126;, + 3;1127,1133,1126;, + 3;1134,1133,1127;, + 3;1128,1134,1127;, + 3;1135,3876,3874;, + 3;1129,1135,3874;, + 3;1136,1135,1129;, + 3;1130,1136,1129;, + 3;3877,1136,1130;, + 3;3875,3877,1130;, + 3;1132,1137,1131;, + 3;1133,1138,1132;, + 3;1137,1132,1138;, + 3;1134,1138,1133;, + 3;1135,3878,3876;, + 3;1136,3879,1135;, + 3;3878,1135,3879;, + 3;3877,3879,1136;, + 3;1140,1139,972;, + 3;1010,1140,972;, + 3;1141,1140,1010;, + 3;976,1141,1010;, + 3;1142,1141,976;, + 3;969,1142,976;, + 3;1143,3880,3859;, + 3;1014,1143,3859;, + 3;1144,1143,1014;, + 3;977,1144,1014;, + 3;3881,1144,977;, + 3;3882,3881,977;, + 3;1146,1145,1139;, + 3;1140,1146,1139;, + 3;1147,1146,1140;, + 3;1141,1147,1140;, + 3;1148,1147,1141;, + 3;1142,1148,1141;, + 3;1149,3883,3880;, + 3;1143,1149,3880;, + 3;1150,1149,1143;, + 3;1144,1150,1143;, + 3;3884,1150,1144;, + 3;3881,3884,1144;, + 3;1152,1151,1145;, + 3;1146,1152,1145;, + 3;1153,1152,1146;, + 3;1147,1153,1146;, + 3;1154,1153,1147;, + 3;1148,1154,1147;, + 3;1155,3885,3883;, + 3;1149,1155,3883;, + 3;1156,1155,1149;, + 3;1150,1156,1149;, + 3;3886,1156,1150;, + 3;3884,3886,1150;, + 3;1158,1157,1151;, + 3;1152,1158,1151;, + 3;1159,1158,1152;, + 3;1153,1159,1152;, + 3;1160,1159,1153;, + 3;1154,1160,1153;, + 3;1161,3887,3885;, + 3;1155,1161,3885;, + 3;1162,1161,1155;, + 3;1156,1162,1155;, + 3;3888,1162,1156;, + 3;3886,3888,1156;, + 3;1164,1163,1157;, + 3;1158,1164,1157;, + 3;1165,1164,1158;, + 3;1159,1165,1158;, + 3;1166,1165,1159;, + 3;1160,1166,1159;, + 3;1167,3889,3887;, + 3;1161,1167,3887;, + 3;1168,1167,1161;, + 3;1162,1168,1161;, + 3;3890,1168,1162;, + 3;3888,3890,1162;, + 3;1170,1169,1163;, + 3;1164,1170,1163;, + 3;1171,1170,1164;, + 3;1165,1171,1164;, + 3;1172,1171,1165;, + 3;1166,1172,1165;, + 3;1173,3891,3889;, + 3;1167,1173,3889;, + 3;1174,1173,1167;, + 3;1168,1174,1167;, + 3;3892,1174,1168;, + 3;3890,3892,1168;, + 3;1176,1175,1169;, + 3;1170,1176,1169;, + 3;1177,1176,1170;, + 3;1171,1177,1170;, + 3;1178,1177,1171;, + 3;1172,1178,1171;, + 3;1179,3893,3891;, + 3;1173,1179,3891;, + 3;1180,1179,1173;, + 3;1174,1180,1173;, + 3;3894,1180,1174;, + 3;3892,3894,1174;, + 3;1182,1181,1175;, + 3;1176,1182,1175;, + 3;1183,1182,1176;, + 3;1177,1183,1176;, + 3;1184,1183,1177;, + 3;1178,1184,1177;, + 3;1185,3895,3893;, + 3;1179,1185,3893;, + 3;1186,1185,1179;, + 3;1180,1186,1179;, + 3;3896,1186,1180;, + 3;3894,3896,1180;, + 3;1188,1187,1181;, + 3;1182,1188,1181;, + 3;1189,1188,1182;, + 3;1183,1189,1182;, + 3;1190,1189,1183;, + 3;1184,1190,1183;, + 3;1191,3897,3895;, + 3;1185,1191,3895;, + 3;1192,1191,1185;, + 3;1186,1192,1185;, + 3;3898,1192,1186;, + 3;3896,3898,1186;, + 3;1194,1193,1187;, + 3;1188,1194,1187;, + 3;1195,1194,1188;, + 3;1189,1195,1188;, + 3;1196,1195,1189;, + 3;1190,1196,1189;, + 3;1197,3899,3897;, + 3;1191,1197,3897;, + 3;1198,1197,1191;, + 3;1192,1198,1191;, + 3;3900,1198,1192;, + 3;3898,3900,1192;, + 3;1194,1199,1193;, + 3;1195,1200,1194;, + 3;1199,1194,1200;, + 3;1196,1200,1195;, + 3;1197,3901,3899;, + 3;1198,3902,1197;, + 3;3901,1197,3902;, + 3;3900,3902,1198;, + 3;1202,1201,3832;, + 3;1011,1202,3832;, + 3;1203,1202,1011;, + 3;975,1203,1011;, + 3;1204,1203,975;, + 3;972,1204,975;, + 3;1205,3903,3882;, + 3;980,1205,3882;, + 3;1206,1205,980;, + 3;957,1206,980;, + 3;3904,1206,957;, + 3;962,3904,957;, + 3;1208,1207,1201;, + 3;1202,1208,1201;, + 3;1209,1208,1202;, + 3;1203,1209,1202;, + 3;1210,1209,1203;, + 3;1204,1210,1203;, + 3;1211,3905,3903;, + 3;1205,1211,3903;, + 3;1212,1211,1205;, + 3;1206,1212,1205;, + 3;3906,1212,1206;, + 3;3904,3906,1206;, + 3;1214,1213,1207;, + 3;1208,1214,1207;, + 3;1215,1214,1208;, + 3;1209,1215,1208;, + 3;1216,1215,1209;, + 3;1210,1216,1209;, + 3;1217,3907,3905;, + 3;1211,1217,3905;, + 3;1218,1217,1211;, + 3;1212,1218,1211;, + 3;3908,1218,1212;, + 3;3906,3908,1212;, + 3;1220,1219,1213;, + 3;1214,1220,1213;, + 3;1221,1220,1214;, + 3;1215,1221,1214;, + 3;1222,1221,1215;, + 3;1216,1222,1215;, + 3;1223,3909,3907;, + 3;1217,1223,3907;, + 3;1224,1223,1217;, + 3;1218,1224,1217;, + 3;3910,1224,1218;, + 3;3908,3910,1218;, + 3;1226,1225,1219;, + 3;1220,1226,1219;, + 3;1227,1226,1220;, + 3;1221,1227,1220;, + 3;1228,1227,1221;, + 3;1222,1228,1221;, + 3;1229,3911,3909;, + 3;1223,1229,3909;, + 3;1230,1229,1223;, + 3;1224,1230,1223;, + 3;3912,1230,1224;, + 3;3910,3912,1224;, + 3;1232,1231,1225;, + 3;1226,1232,1225;, + 3;1233,1232,1226;, + 3;1227,1233,1226;, + 3;1234,1233,1227;, + 3;1228,1234,1227;, + 3;1235,3913,3911;, + 3;1229,1235,3911;, + 3;1236,1235,1229;, + 3;1230,1236,1229;, + 3;3914,1236,1230;, + 3;3912,3914,1230;, + 3;1238,1237,1231;, + 3;1232,1238,1231;, + 3;1239,1238,1232;, + 3;1233,1239,1232;, + 3;1240,1239,1233;, + 3;1234,1240,1233;, + 3;1241,3915,3913;, + 3;1235,1241,3913;, + 3;1242,1241,1235;, + 3;1236,1242,1235;, + 3;3916,1242,1236;, + 3;3914,3916,1236;, + 3;1244,1243,1237;, + 3;1238,1244,1237;, + 3;1245,1244,1238;, + 3;1239,1245,1238;, + 3;1246,1245,1239;, + 3;1240,1246,1239;, + 3;1247,3917,3915;, + 3;1241,1247,3915;, + 3;1248,1247,1241;, + 3;1242,1248,1241;, + 3;3918,1248,1242;, + 3;3916,3918,1242;, + 3;1250,1249,3918;, + 3;1244,3919,1243;, + 3;1251,3919,1244;, + 3;1245,1251,1244;, + 3;1252,1251,1245;, + 3;1246,1252,1245;, + 3;1253,3920,3917;, + 3;1247,1253,3917;, + 3;1254,1253,1247;, + 3;1248,1254,1247;, + 3;1249,1254,1248;, + 3;3918,1249,1248;, + 3;1256,1255,3921;, + 3;3919,1256,3921;, + 3;1257,1256,3919;, + 3;1251,1257,3919;, + 3;1258,1257,1251;, + 3;1252,1258,1251;, + 3;1259,3922,3920;, + 3;1253,1259,3920;, + 3;1260,1259,1253;, + 3;1254,1260,1253;, + 3;3923,1260,1254;, + 3;1249,3923,1254;, + 3;1256,1261,1255;, + 3;1257,1262,1256;, + 3;1261,1256,1262;, + 3;1258,1262,1257;, + 3;1259,3924,3922;, + 3;1260,3925,1259;, + 3;3924,1259,3925;, + 3;3923,3925,1260;, + 3;3814,963,1263;, + 3;1263,973,956;, + 3;981,983,959;, + 3;983,981,1269;, + 3;3859,1264,1014;, + 3;1264,3859,1013;, + 3;3836,1265,978;, + 3;3836,979,1265;, + 3;3882,1266,980;, + 3;1266,3882,977;, + 3;1013,1265,1264;, + 3;1265,1013,978;, + 3;1014,1266,977;, + 3;1266,1014,1264;, + 3;1265,979,960;, + 3;957,981,3816;, + 3;3926,960,3834;, + 3;980,1266,1267;, + 3;1266,1269,1267;, + 3;983,1269,987;, + 3;1267,1269,981;, + 3;1269,1264,987;, + 3;1264,1269,1266;, + 3;1264,1265,987;, + 3;1265,986,987;, + 3;986,1265,960;, + 3;986,960,3926;, + 3;986,3926,3821;, + 3;1270,3815,1263;, + 3;974,1270,1008;, + 3;1277,1282,1271;, + 3;1271,3803,948;, + 3;1279,1278,1272;, + 3;1272,3807,3927;, + 3;949,3804,1273;, + 3;1284,3928,1275;, + 3;3808,3805,1274;, + 3;1276,3929,3930;, + 3;3928,1276,1275;, + 3;3928,3929,1276;, + 3;1274,949,1275;, + 3;1278,1277,948;, + 3;1272,1278,948;, + 3;1272,1280,1279;, + 3;1272,3927,1280;, + 3;1282,1281,947;, + 3;1271,1282,947;, + 3;1271,948,1277;, + 3;3810,1284,1283;, + 3;3810,3928,1284;, + 3;3806,3809,1283;, + 3;1273,3806,1283;, + 3;952,1282,1277;, + 3;952,3931,1282;, + 3;954,1278,1279;, + 3;954,952,1278;, + 3;1284,1275,949;, + 3;1273,1284,949;, + 3;1276,3930,950;, + 3;1274,1276,950;, + 3;1286,943,1285;, + 3;1286,850,1291;, + 3;1287,3759,3757;, + 3;1292,1287,3757;, + 3;1288,3798,1286;, + 3;1286,3798,850;, + 3;855,3932,1287;, + 3;855,945,3932;, + 3;849,1289,943;, + 3;1293,852,1289;, + 3;854,1290,860;, + 3;889,853,1290;, + 3;1286,1291,943;, + 3;849,943,1291;, + 3;855,1287,1292;, + 3;855,1292,3758;, + 3;856,852,1293;, + 3;1293,854,856;, + 3;3933,1286,1285;, + 3;946,3799,851;, + 3;946,3756,3801;, + 3;851,3800,943;, + 3;943,3800,1285;, + 3;3934,1286,3933;, + 3;3934,1288,1286;, + 3;1287,3932,3935;, + 3;1287,3935,3759;, + 3;1294,1295,1736;, + 3;1388,1296,1297;, + 3;1294,1389,1735;, + 3;1734,1738,1299;, + 3;1299,1389,1734;, + 3;1304,1390,1333;, + 3;1300,1332,1306;, + 3;1391,3936,1301;, + 3;1737,3937,3938;, + 3;3938,3939,3940;, + 3;1297,1296,1391;, + 3;1302,1294,1334;, + 3;1303,1295,1302;, + 3;1295,1294,1302;, + 3;1298,1735,1305;, + 3;3941,3937,1306;, + 3;3937,1300,1306;, + 3;1332,1390,1304;, + 3;1320,1335,1336;, + 3;1338,1307,1337;, + 3;1339,1340,1314;, + 3;1342,1308,1341;, + 3;1343,1344,1321;, + 3;1345,1337,1307;, + 3;1347,1319,1346;, + 3;1343,1348,1322;, + 3;1313,1335,1349;, + 3;1339,1350,1309;, + 3;1350,1349,1309;, + 3;1341,1340,1317;, + 3;1312,1351,1347;, + 3;3942,1336,3943;, + 3;1344,1310,1351;, + 3;1348,3944,3945;, + 3;1346,1319,1345;, + 3;3943,1313,1325;, + 3;1325,1324,3943;, + 3;1312,1323,1327;, + 3;1327,1326,1312;, + 3;3944,1321,1329;, + 3;1329,1328,3944;, + 3;1311,1314,1331;, + 3;1331,1330,1311;, + 3;1313,1311,1325;, + 3;1330,1325,1311;, + 3;1314,1308,3946;, + 3;3946,1331,1314;, + 3;1321,1312,1326;, + 3;1326,1329,1321;, + 3;1323,1307,3947;, + 3;3947,1327,1323;, + 3;1315,1316,3948;, + 3;3948,3949,1315;, + 3;1317,1309,3950;, + 3;3950,3951,1317;, + 3;1318,1317,3951;, + 3;3951,3952,1318;, + 3;1310,1322,3953;, + 3;3953,3954,1310;, + 3;1316,1319,3955;, + 3;3955,3948,1316;, + 3;1309,1320,3956;, + 3;3956,3950,1309;, + 3;1319,1310,3954;, + 3;3954,3955,1319;, + 3;1320,3957,3958;, + 3;3958,3956,1320;, + 3;1322,3959,3960;, + 3;3960,3953,1322;, + 3;1335,1313,1336;, + 3;1313,3943,1336;, + 3;1337,1316,1338;, + 3;1316,1315,1338;, + 3;1339,1309,1340;, + 3;1309,1317,1340;, + 3;1341,1317,1342;, + 3;1317,1318,1342;, + 3;1343,1322,1344;, + 3;1322,1310,1344;, + 3;1345,1319,1337;, + 3;1319,1316,1337;, + 3;1346,1323,1347;, + 3;1323,1312,1347;, + 3;1343,1321,1348;, + 3;1321,3944,1348;, + 3;1335,1320,1349;, + 3;1320,1309,1349;, + 3;1339,1314,1350;, + 3;1314,1311,1350;, + 3;1350,1311,1349;, + 3;1311,1313,1349;, + 3;1341,1308,1340;, + 3;1308,1314,1340;, + 3;1351,1310,1347;, + 3;1310,1319,1347;, + 3;3942,3957,1336;, + 3;3957,1320,1336;, + 3;1351,1312,1344;, + 3;1312,1321,1344;, + 3;3945,3959,1348;, + 3;3959,1322,1348;, + 3;1345,1307,1346;, + 3;1307,1323,1346;, + 3;1334,1294,1735;, + 3;3961,1295,1303;, + 3;1300,1390,1332;, + 3;1366,1353,1384;, + 3;1387,3962,1367;, + 3;1368,1369,1355;, + 3;1352,1370,1371;, + 3;1371,1356,1372;, + 3;1374,1360,1373;, + 3;3963,1358,1364;, + 3;1376,1358,1375;, + 3;1386,1353,1365;, + 3;1376,3964,1377;, + 3;1374,1353,1378;, + 3;1361,3965,1363;, + 3;1362,1358,3966;, + 3;1380,1359,1379;, + 3;1361,1381,1380;, + 3;1382,1383,1360;, + 3;3967,3968,3969;, + 3;3970,1364,1354;, + 3;1357,3967,3971;, + 3;1361,1362,3966;, + 3;1379,1359,1375;, + 3;3968,3967,1357;, + 3;1381,3972,3973;, + 3;3963,3966,1358;, + 3;1377,3964,3974;, + 3;1373,1360,1383;, + 3;1385,1384,1353;, + 3;1352,1385,1387;, + 3;1372,1356,1378;, + 3;1367,3962,3975;, + 3;1370,1368,1355;, + 3;1368,1367,1369;, + 3;1367,3975,1369;, + 3;1370,1355,1371;, + 3;1355,1356,1371;, + 3;1372,1366,1371;, + 3;1366,1352,1371;, + 3;1373,1365,1374;, + 3;1365,1353,1374;, + 3;1375,1359,1376;, + 3;1359,3964,1376;, + 3;1377,1364,1376;, + 3;1364,1358,1376;, + 3;1378,1356,1374;, + 3;1356,1360,1374;, + 3;1379,1362,1380;, + 3;1362,1361,1380;, + 3;1381,3973,1380;, + 3;3973,1359,1380;, + 3;1382,3968,1383;, + 3;3968,1357,1383;, + 3;1375,1358,1379;, + 3;1358,1362,1379;, + 3;1381,1361,3972;, + 3;1361,1363,3972;, + 3;3974,1354,1377;, + 3;1354,1364,1377;, + 3;1383,1357,1373;, + 3;1357,1365,1373;, + 3;1378,1353,1372;, + 3;1353,1366,1372;, + 3;1370,1352,1368;, + 3;1352,1367,1368;, + 3;1357,3971,1365;, + 3;1325,1324,1330;, + 3;3962,3976,3975;, + 3;1385,3977,3962;, + 3;1386,3971,1385;, + 3;1352,1366,1384;, + 3;1384,1385,1352;, + 3;1385,3971,3977;, + 3;3971,1386,1365;, + 3;1353,1386,1385;, + 3;1352,1387,1367;, + 3;1387,1385,3962;, + 3;3970,3963,1364;, + 3;3965,1361,3966;, + 3;1734,1388,1297;, + 3;1294,1734,1389;, + 3;1299,1735,1389;, + 3;3978,1295,3961;, + 3;3979,1296,3980;, + 3;1297,1391,1301;, + 3;1391,3979,3981;, + 3;1716,3982,1392;, + 3;3982,1716,3983;, + 3;3984,3985,1394;, + 3;1718,3986,3984;, + 3;3987,3983,1393;, + 3;1393,1717,3987;, + 3;1719,3988,1395;, + 3;1719,1394,3985;, + 3;1720,1719,1721;, + 3;1723,1722,1397;, + 3;1724,1399,1725;, + 3;1727,1726,1396;, + 3;1728,1718,1729;, + 3;1728,3989,3990;, + 3;1453,1401,1715;, + 3;1400,3991,3992;, + 3;1426,1712,1402;, + 3;1415,1418,1454;, + 3;3993,1398,1404;, + 3;1713,1433,1408;, + 3;3994,3991,1708;, + 3;1404,1427,3993;, + 3;1418,1415,1403;, + 3;1404,1398,1429;, + 3;3995,1402,1407;, + 3;1456,1419,1400;, + 3;1429,1398,3996;, + 3;1429,3996,1410;, + 3;1436,1409,1406;, + 3;1708,1457,1408;, + 3;1408,3997,3994;, + 3;1434,1409,1435;, + 3;3998,1411,3999;, + 3;1436,1437,1412;, + 3;1437,1436,1410;, + 3;3997,1408,1411;, + 3;1411,1413,3997;, + 3;1406,1409,1431;, + 3;1409,4000,1431;, + 3;1421,1453,1419;, + 3;1454,1418,1401;, + 3;1414,1416,1453;, + 3;1420,1417,1419;, + 3;1708,1418,1457;, + 3;1715,1401,1708;, + 3;1400,1715,3991;, + 3;1414,1453,1421;, + 3;1456,1420,1419;, + 3;1455,1421,1419;, + 3;3995,1427,1426;, + 3;1425,1402,1712;, + 3;1404,1426,1427;, + 3;3995,3993,1427;, + 3;1406,1429,1436;, + 3;1404,1429,1428;, + 3;1428,1429,1406;, + 3;1457,1430,1408;, + 3;1408,1430,1713;, + 3;1428,1406,1431;, + 3;1428,1431,1432;, + 3;3999,1408,1433;, + 3;1408,3999,1411;, + 3;1409,1434,4000;, + 3;1412,1435,1409;, + 3;1410,1436,1429;, + 3;1409,1436,1412;, + 3;1410,4001,1437;, + 3;1437,4001,1440;, + 3;1440,1439,1437;, + 3;1411,3998,1438;, + 3;1438,1441,1411;, + 3;1412,1437,1439;, + 3;1439,1442,1412;, + 3;1413,1411,1441;, + 3;1441,4002,1413;, + 3;1435,1412,1442;, + 3;1442,4003,1435;, + 3;1439,1440,1445;, + 3;1445,1444,1439;, + 3;1441,1438,1443;, + 3;1443,1446,1441;, + 3;4002,1441,1446;, + 3;1446,4004,4002;, + 3;4003,1442,1447;, + 3;1447,4005,4003;, + 3;1442,1439,1444;, + 3;1444,1447,1442;, + 3;1444,1445,1450;, + 3;1450,1449,1444;, + 3;1446,1443,1448;, + 3;1448,1451,1446;, + 3;4004,1446,1451;, + 3;1451,4006,4004;, + 3;4005,1447,1452;, + 3;1452,4007,4005;, + 3;1447,1444,1449;, + 3;1449,1452,1447;, + 3;1452,1449,1450;, + 3;4006,1451,1448;, + 3;4007,1452,1450;, + 3;1419,1715,1400;, + 3;1416,1401,1453;, + 3;1416,1454,1401;, + 3;1417,1455,1419;, + 3;4008,1456,1400;, + 3;1403,1457,1418;, + 3;1461,4009,1460;, + 3;1403,1415,4010;, + 3;1462,1403,4010;, + 3;1457,1403,1462;, + 3;1463,1457,1462;, + 3;1430,1457,1463;, + 3;1464,4011,4012;, + 3;1405,4011,1464;, + 3;1465,1405,1464;, + 3;1424,1405,1465;, + 3;1460,1424,1465;, + 3;4009,1424,1460;, + 3;1467,4013,1466;, + 3;4010,4013,1467;, + 3;1468,4010,1467;, + 3;1462,4010,1468;, + 3;1469,1462,1468;, + 3;1463,1462,1469;, + 3;1470,4012,4014;, + 3;1464,4012,1470;, + 3;1471,1464,1470;, + 3;1465,1464,1471;, + 3;4015,1465,1471;, + 3;1460,1465,4015;, + 3;1473,1466,1472;, + 3;1467,1466,1473;, + 3;1474,1467,1473;, + 3;1468,1467,1474;, + 3;1475,1468,1474;, + 3;1469,1468,1475;, + 3;1476,4014,4016;, + 3;1470,4014,1476;, + 3;1477,1470,1476;, + 3;1471,1470,1477;, + 3;4017,1471,1477;, + 3;4015,1471,4017;, + 3;1479,1472,1478;, + 3;1473,1472,1479;, + 3;1480,1473,1479;, + 3;1474,1473,1480;, + 3;1481,1474,1480;, + 3;1475,1474,1481;, + 3;1482,4016,4018;, + 3;1476,4016,1482;, + 3;1483,1476,1482;, + 3;1477,1476,1483;, + 3;4019,1477,1483;, + 3;4017,1477,4019;, + 3;1485,1478,1484;, + 3;1479,1478,1485;, + 3;1486,1479,1485;, + 3;1480,1479,1486;, + 3;1487,1480,1486;, + 3;1481,1480,1487;, + 3;1488,4018,4020;, + 3;1482,4018,1488;, + 3;1489,1482,1488;, + 3;1483,1482,1489;, + 3;4021,1483,1489;, + 3;4019,1483,4021;, + 3;1491,1484,1490;, + 3;1485,1484,1491;, + 3;1492,1485,1491;, + 3;1486,1485,1492;, + 3;1493,1486,1492;, + 3;1487,1486,1493;, + 3;1494,4020,4022;, + 3;1488,4020,1494;, + 3;1495,1488,1494;, + 3;1489,1488,1495;, + 3;4023,1489,1495;, + 3;4021,1489,4023;, + 3;1497,1490,1496;, + 3;1491,1490,1497;, + 3;1498,1491,1497;, + 3;1492,1491,1498;, + 3;1499,1492,1498;, + 3;1493,1492,1499;, + 3;1500,4022,4024;, + 3;1494,4022,1500;, + 3;1501,1494,1500;, + 3;1495,1494,1501;, + 3;4025,1495,1501;, + 3;4023,1495,4025;, + 3;1503,1496,1502;, + 3;1497,1496,1503;, + 3;1504,1497,1503;, + 3;1498,1497,1504;, + 3;1505,1498,1504;, + 3;1499,1498,1505;, + 3;1506,4024,4026;, + 3;1500,4024,1506;, + 3;1507,1500,1506;, + 3;1501,1500,1507;, + 3;4027,1501,1507;, + 3;4025,1501,4027;, + 3;1509,1502,1508;, + 3;1503,1502,1509;, + 3;1510,1503,1509;, + 3;1504,1503,1510;, + 3;1511,1504,1510;, + 3;1505,1504,1511;, + 3;1512,4026,4028;, + 3;1506,4026,1512;, + 3;1513,1506,1512;, + 3;1507,1506,1513;, + 3;4029,1507,1513;, + 3;4027,1507,4029;, + 3;1515,1508,1514;, + 3;1509,1508,1515;, + 3;1516,1509,1515;, + 3;1510,1509,1516;, + 3;1517,1510,1516;, + 3;1511,1510,1517;, + 3;1518,4028,4030;, + 3;1512,4028,1518;, + 3;1519,1512,1518;, + 3;1513,1512,1519;, + 3;4031,1513,1519;, + 3;4029,1513,4031;, + 3;1515,1514,1520;, + 3;1516,1515,1521;, + 3;1520,1521,1515;, + 3;1517,1516,1521;, + 3;1518,4030,4032;, + 3;1519,1518,4033;, + 3;4032,4033,1518;, + 3;4031,1519,4033;, + 3;1523,1414,1522;, + 3;1416,1414,1523;, + 3;1524,1416,1523;, + 3;1454,1416,1524;, + 3;1525,1454,1524;, + 3;1415,1454,1525;, + 3;1526,4009,4034;, + 3;1423,4009,1526;, + 3;1527,1423,1526;, + 3;1458,1423,1527;, + 3;4035,1458,1527;, + 3;4036,1458,4035;, + 3;1529,1522,1528;, + 3;1523,1522,1529;, + 3;1530,1523,1529;, + 3;1524,1523,1530;, + 3;1531,1524,1530;, + 3;1525,1524,1531;, + 3;1532,4034,4037;, + 3;1526,4034,1532;, + 3;1533,1526,1532;, + 3;1527,1526,1533;, + 3;4038,1527,1533;, + 3;4035,1527,4038;, + 3;1535,1528,1534;, + 3;1529,1528,1535;, + 3;1536,1529,1535;, + 3;1530,1529,1536;, + 3;1537,1530,1536;, + 3;1531,1530,1537;, + 3;1538,4037,4039;, + 3;1532,4037,1538;, + 3;1539,1532,1538;, + 3;1533,1532,1539;, + 3;4040,1533,1539;, + 3;4038,1533,4040;, + 3;1541,1534,1540;, + 3;1535,1534,1541;, + 3;1542,1535,1541;, + 3;1536,1535,1542;, + 3;1543,1536,1542;, + 3;1537,1536,1543;, + 3;1544,4039,4041;, + 3;1538,4039,1544;, + 3;1545,1538,1544;, + 3;1539,1538,1545;, + 3;4042,1539,1545;, + 3;4040,1539,4042;, + 3;1547,1540,1546;, + 3;1541,1540,1547;, + 3;1548,1541,1547;, + 3;1542,1541,1548;, + 3;1549,1542,1548;, + 3;1543,1542,1549;, + 3;1550,4041,4043;, + 3;1544,4041,1550;, + 3;1551,1544,1550;, + 3;1545,1544,1551;, + 3;4044,1545,1551;, + 3;4042,1545,4044;, + 3;1553,1546,1552;, + 3;1547,1546,1553;, + 3;1554,1547,1553;, + 3;1548,1547,1554;, + 3;1555,1548,1554;, + 3;1549,1548,1555;, + 3;1556,4043,4045;, + 3;1550,4043,1556;, + 3;1557,1550,1556;, + 3;1551,1550,1557;, + 3;4046,1551,1557;, + 3;4044,1551,4046;, + 3;1559,1552,1558;, + 3;1553,1552,1559;, + 3;1560,1553,1559;, + 3;1554,1553,1560;, + 3;1561,1554,1560;, + 3;1555,1554,1561;, + 3;1562,4045,4047;, + 3;1556,4045,1562;, + 3;1563,1556,1562;, + 3;1557,1556,1563;, + 3;4048,1557,1563;, + 3;4046,1557,4048;, + 3;1565,1558,1564;, + 3;1559,1558,1565;, + 3;1566,1559,1565;, + 3;1560,1559,1566;, + 3;1567,1560,1566;, + 3;1561,1560,1567;, + 3;1568,4047,4049;, + 3;1562,4047,1568;, + 3;1569,1562,1568;, + 3;1563,1562,1569;, + 3;4050,1563,1569;, + 3;4048,1563,4050;, + 3;1571,1564,1570;, + 3;1565,1564,1571;, + 3;1572,1565,1571;, + 3;1566,1565,1572;, + 3;1573,1566,1572;, + 3;1567,1566,1573;, + 3;1574,4049,4051;, + 3;1568,4049,1574;, + 3;1575,1568,1574;, + 3;1569,1568,1575;, + 3;4052,1569,1575;, + 3;4050,1569,4052;, + 3;1577,1570,1576;, + 3;1571,1570,1577;, + 3;1578,1571,1577;, + 3;1572,1571,1578;, + 3;1579,1572,1578;, + 3;1573,1572,1579;, + 3;1580,4051,4053;, + 3;1574,4051,1580;, + 3;1581,1574,1580;, + 3;1575,1574,1581;, + 3;4054,1575,1581;, + 3;4052,1575,4054;, + 3;1577,1576,1582;, + 3;1578,1577,1583;, + 3;1582,1583,1577;, + 3;1579,1578,1583;, + 3;1580,4053,4055;, + 3;1581,1580,4056;, + 3;4055,4056,1580;, + 3;4054,1581,4056;, + 3;1585,1417,1584;, + 3;1455,1417,1585;, + 3;1586,1455,1585;, + 3;1421,1455,1586;, + 3;1587,1421,1586;, + 3;1414,1421,1587;, + 3;1588,4036,4057;, + 3;1459,4036,1588;, + 3;1589,1459,1588;, + 3;1422,1459,1589;, + 3;4058,1422,1589;, + 3;4059,1422,4058;, + 3;1591,1584,1590;, + 3;1585,1584,1591;, + 3;1592,1585,1591;, + 3;1586,1585,1592;, + 3;1593,1586,1592;, + 3;1587,1586,1593;, + 3;1594,4057,4060;, + 3;1588,4057,1594;, + 3;1595,1588,1594;, + 3;1589,1588,1595;, + 3;4061,1589,1595;, + 3;4058,1589,4061;, + 3;1597,1590,1596;, + 3;1591,1590,1597;, + 3;1598,1591,1597;, + 3;1592,1591,1598;, + 3;1599,1592,1598;, + 3;1593,1592,1599;, + 3;1600,4060,4062;, + 3;1594,4060,1600;, + 3;1601,1594,1600;, + 3;1595,1594,1601;, + 3;4063,1595,1601;, + 3;4061,1595,4063;, + 3;1603,1596,1602;, + 3;1597,1596,1603;, + 3;1604,1597,1603;, + 3;1598,1597,1604;, + 3;1605,1598,1604;, + 3;1599,1598,1605;, + 3;1606,4062,4064;, + 3;1600,4062,1606;, + 3;1607,1600,1606;, + 3;1601,1600,1607;, + 3;4065,1601,1607;, + 3;4063,1601,4065;, + 3;1609,1602,1608;, + 3;1603,1602,1609;, + 3;1610,1603,1609;, + 3;1604,1603,1610;, + 3;1611,1604,1610;, + 3;1605,1604,1611;, + 3;1612,4064,4066;, + 3;1606,4064,1612;, + 3;1613,1606,1612;, + 3;1607,1606,1613;, + 3;4067,1607,1613;, + 3;4065,1607,4067;, + 3;1615,1608,1614;, + 3;1609,1608,1615;, + 3;1616,1609,1615;, + 3;1610,1609,1616;, + 3;1617,1610,1616;, + 3;1611,1610,1617;, + 3;1618,4066,4068;, + 3;1612,4066,1618;, + 3;1619,1612,1618;, + 3;1613,1612,1619;, + 3;4069,1613,1619;, + 3;4067,1613,4069;, + 3;1621,1614,1620;, + 3;1615,1614,1621;, + 3;1622,1615,1621;, + 3;1616,1615,1622;, + 3;1623,1616,1622;, + 3;1617,1616,1623;, + 3;1624,4068,4070;, + 3;1618,4068,1624;, + 3;1625,1618,1624;, + 3;1619,1618,1625;, + 3;4071,1619,1625;, + 3;4069,1619,4071;, + 3;1627,1620,1626;, + 3;1621,1620,1627;, + 3;1628,1621,1627;, + 3;1622,1621,1628;, + 3;1629,1622,1628;, + 3;1623,1622,1629;, + 3;1630,4070,4072;, + 3;1624,4070,1630;, + 3;1631,1624,1630;, + 3;1625,1624,1631;, + 3;4073,1625,1631;, + 3;4071,1625,4073;, + 3;1633,1626,1632;, + 3;1627,1626,1633;, + 3;1634,1627,1633;, + 3;1628,1627,1634;, + 3;1635,1628,1634;, + 3;1629,1628,1635;, + 3;1636,4072,4074;, + 3;1630,4072,1636;, + 3;1637,1630,1636;, + 3;1631,1630,1637;, + 3;4075,1631,1637;, + 3;4073,1631,4075;, + 3;1639,1632,1638;, + 3;1633,1632,1639;, + 3;1640,1633,1639;, + 3;1634,1633,1640;, + 3;1641,1634,1640;, + 3;1635,1634,1641;, + 3;1642,4074,4076;, + 3;1636,4074,1642;, + 3;1643,1636,1642;, + 3;1637,1636,1643;, + 3;4077,1637,1643;, + 3;4075,1637,4077;, + 3;1639,1638,1644;, + 3;1640,1639,1645;, + 3;1644,1645,1639;, + 3;1641,1640,1645;, + 3;1642,4076,4078;, + 3;1643,1642,4079;, + 3;4078,4079,1642;, + 3;4077,1643,4079;, + 3;1647,4008,1646;, + 3;1456,4008,1647;, + 3;1648,1456,1647;, + 3;1420,1456,1648;, + 3;1649,1420,1648;, + 3;1417,1420,1649;, + 3;1650,4059,4080;, + 3;1425,4059,1650;, + 3;1651,1425,1650;, + 3;1402,1425,1651;, + 3;4081,1402,1651;, + 3;1407,1402,4081;, + 3;1653,1646,1652;, + 3;1647,1646,1653;, + 3;1654,1647,1653;, + 3;1648,1647,1654;, + 3;1655,1648,1654;, + 3;1649,1648,1655;, + 3;1656,4080,4082;, + 3;1650,4080,1656;, + 3;1657,1650,1656;, + 3;1651,1650,1657;, + 3;4083,1651,1657;, + 3;4081,1651,4083;, + 3;1659,1652,1658;, + 3;1653,1652,1659;, + 3;1660,1653,1659;, + 3;1654,1653,1660;, + 3;1661,1654,1660;, + 3;1655,1654,1661;, + 3;1662,4082,4084;, + 3;1656,4082,1662;, + 3;1663,1656,1662;, + 3;1657,1656,1663;, + 3;4085,1657,1663;, + 3;4083,1657,4085;, + 3;1665,1658,1664;, + 3;1659,1658,1665;, + 3;1666,1659,1665;, + 3;1660,1659,1666;, + 3;1667,1660,1666;, + 3;1661,1660,1667;, + 3;1668,4084,4086;, + 3;1662,4084,1668;, + 3;1669,1662,1668;, + 3;1663,1662,1669;, + 3;4087,1663,1669;, + 3;4085,1663,4087;, + 3;1671,1664,1670;, + 3;1665,1664,1671;, + 3;1672,1665,1671;, + 3;1666,1665,1672;, + 3;1673,1666,1672;, + 3;1667,1666,1673;, + 3;1674,4086,4088;, + 3;1668,4086,1674;, + 3;1675,1668,1674;, + 3;1669,1668,1675;, + 3;4089,1669,1675;, + 3;4087,1669,4089;, + 3;1677,1670,1676;, + 3;1671,1670,1677;, + 3;1678,1671,1677;, + 3;1672,1671,1678;, + 3;1679,1672,1678;, + 3;1673,1672,1679;, + 3;1680,4088,4090;, + 3;1674,4088,1680;, + 3;1681,1674,1680;, + 3;1675,1674,1681;, + 3;4091,1675,1681;, + 3;4089,1675,4091;, + 3;1683,1676,1682;, + 3;1677,1676,1683;, + 3;1684,1677,1683;, + 3;1678,1677,1684;, + 3;1685,1678,1684;, + 3;1679,1678,1685;, + 3;1686,4090,4092;, + 3;1680,4090,1686;, + 3;1687,1680,1686;, + 3;1681,1680,1687;, + 3;4093,1681,1687;, + 3;4091,1681,4093;, + 3;1689,1682,1688;, + 3;1683,1682,1689;, + 3;1690,1683,1689;, + 3;1684,1683,1690;, + 3;1691,1684,1690;, + 3;1685,1684,1691;, + 3;1692,4092,4094;, + 3;1686,4092,1692;, + 3;1693,1686,1692;, + 3;1687,1686,1693;, + 3;4095,1687,1693;, + 3;4093,1687,4095;, + 3;1695,1688,1694;, + 3;1689,1688,1695;, + 3;1696,1689,1695;, + 3;1690,1689,1696;, + 3;1697,1690,1696;, + 3;1691,1690,1697;, + 3;1698,4094,4096;, + 3;1692,4094,1698;, + 3;1699,1692,1698;, + 3;1693,1692,1699;, + 3;4097,1693,1699;, + 3;4095,1693,4097;, + 3;1701,1694,1700;, + 3;1695,1694,1701;, + 3;1702,1695,1701;, + 3;1696,1695,1702;, + 3;1703,1696,1702;, + 3;1697,1696,1703;, + 3;1704,4096,4098;, + 3;1698,4096,1704;, + 3;1705,1698,1704;, + 3;1699,1698,1705;, + 3;4099,1699,1705;, + 3;4097,1699,4099;, + 3;1701,1700,1706;, + 3;1702,1701,1707;, + 3;1706,1707,1701;, + 3;1703,1702,1707;, + 3;1704,4098,4100;, + 3;1705,1704,4101;, + 3;4100,4101,1704;, + 3;4099,1705,4101;, + 3;3994,1708,1408;, + 3;1708,1401,1418;, + 3;1426,1404,1428;, + 3;1428,1714,1426;, + 3;4036,1459,1709;, + 3;1709,1458,4036;, + 3;4009,1423,1710;, + 3;4009,1710,1424;, + 3;4059,1425,1711;, + 3;1711,1422,4059;, + 3;1458,1709,1710;, + 3;1710,1423,1458;, + 3;1459,1422,1711;, + 3;1711,1709,1459;, + 3;1710,1405,1424;, + 3;1402,3995,1426;, + 3;4102,4011,1405;, + 3;1425,1712,1711;, + 3;1711,1712,1714;, + 3;1428,1432,1714;, + 3;1712,1426,1714;, + 3;1714,1432,1709;, + 3;1709,1711,1714;, + 3;1709,1432,1710;, + 3;1710,1432,1431;, + 3;1431,1405,1710;, + 3;1431,4102,1405;, + 3;1431,4000,4102;, + 3;1715,1708,3991;, + 3;1419,1453,1715;, + 3;1722,1716,1727;, + 3;1716,1393,3983;, + 3;1724,1717,1723;, + 3;1717,4103,3987;, + 3;1394,1718,3984;, + 3;1729,1720,4104;, + 3;3988,1719,3985;, + 3;1721,4105,4106;, + 3;4104,1720,1721;, + 3;4104,1721,4106;, + 3;1719,1720,1394;, + 3;1723,1393,1722;, + 3;1717,1393,1723;, + 3;1717,1724,1725;, + 3;1717,1725,4103;, + 3;1727,1392,1726;, + 3;1716,1392,1727;, + 3;1716,1722,1393;, + 3;3989,1728,1729;, + 3;3989,1729,4104;, + 3;3986,1728,3990;, + 3;1718,1728,3986;, + 3;1397,1722,1727;, + 3;1397,1727,1396;, + 3;1399,1724,1723;, + 3;1399,1723,1397;, + 3;1729,1394,1720;, + 3;1718,1394,1729;, + 3;1721,1395,4105;, + 3;1719,1395,1721;, + 3;1731,1730,1388;, + 3;1731,1736,1295;, + 3;1732,3938,3940;, + 3;1737,3938,1732;, + 3;1733,1731,3978;, + 3;1731,1295,3978;, + 3;1300,1732,4107;, + 3;1300,4107,1390;, + 3;1294,1388,1734;, + 3;1738,1734,1297;, + 3;1299,1305,1735;, + 3;1334,1735,1298;, + 3;1731,1388,1736;, + 3;1294,1736,1388;, + 3;1300,1737,1732;, + 3;1300,3937,1737;, + 3;1301,1738,1297;, + 3;1738,1301,1299;, + 3;4108,1730,1731;, + 3;1391,1296,3979;, + 3;1391,3981,3936;, + 3;1296,1388,3980;, + 3;1388,1730,3980;, + 3;4109,4108,1731;, + 3;4109,1731,1733;, + 3;1732,4110,4107;, + 3;1732,3940,4110;, + 3;196,4111,197;, + 3;3759,4112,3760;, + 3;3938,4113,3939;, + 3;74,75,4114;, + 3;1744,6,1742;, + 3;10,97,1739;, + 3;1743,1745,142;, + 3;1740,144,215;, + 3;4115,4116,1741;, + 3;1741,1744,4115;, + 3;4117,4118,1742;, + 3;1742,1745,4117;, + 3;4118,4115,1744;, + 3;1744,1742,4118;, + 3;4119,4117,1745;, + 3;1745,1743,4119;, + 3;118,107,3471;, + 3;3460,3471,107;, + 3;233,3527,3528;, + 3;3528,3518,224;, + 3;106,5,87;, + 3;106,87,110;, + 3;1779,1790,1756;, + 3;1757,1819,1751;, + 3;1825,1826,4120;, + 3;1758,1829,1748;, + 3;2386,2124,2140;, + 3;2330,2146,2425;, + 3;1870,1872,1782;, + 3;4121,1846,4122;, + 3;1834,1835,1759;, + 3;2183,2240,2182;, + 3;2698,2714,2138;, + 3;2344,2518,2356;, + 3;4123,1852,4124;, + 3;1761,1865,4125;, + 3;1818,1799,1766;, + 3;2711,2132,2707;, + 3;2288,2450,2748;, + 3;2129,2213,2725;, + 3;2726,2753,2169;, + 3;2461,2471,2433;, + 3;1762,1763,1760;, + 3;1770,1772,1771;, + 3;2214,2022,2040;, + 3;2457,2193,2206;, + 3;2749,2758,2168;, + 3;2184,2176,2239;, + 3;2041,2190,2052;, + 3;2163,2231,2287;, + 3;2739,2284,2036;, + 3;2724,2204,2180;, + 3;2194,2044,2056;, + 3;2185,2196,2175;, + 3;2186,2043,2195;, + 3;2189,2042,2178;, + 3;2205,2188,2179;, + 3;2113,2062,2070;, + 3;2192,2458,2064;, + 3;2075,2198,2074;, + 3;2177,2042,2187;, + 3;2199,2053,2073;, + 3;2191,2065,2051;, + 3;2174,2197,2076;, + 3;2200,2700,2211;, + 3;2712,2202,2131;, + 3;2121,2396,2209;, + 3;2203,2212,2130;, + 3;1833,1800,1831;, + 3;2222,2021,2215;, + 3;2173,2077,2090;, + 3;2221,2037,2034;, + 3;2084,2020,2223;, + 3;2285,2220,2035;, + 3;2723,2181,2232;, + 3;2256,2282,2245;, + 3;2261,2278,2270;, + 3;2251,2281,2257;, + 3;2246,2277,2262;, + 3;2269,2279,2275;, + 3;2164,2249,2230;, + 3;2248,2165,2243;, + 3;2170,2259,2238;, + 3;2258,2171,2255;, + 3;2216,2267,2226;, + 3;2266,2217,2265;, + 3;2081,2254,2172;, + 3;2253,2082,2273;, + 3;2224,2272,2083;, + 3;2271,2225,2268;, + 3;2228,2264,2218;, + 3;2263,2229,2250;, + 3;2236,2242,2166;, + 3;2241,2237,2260;, + 3;2280,2252,2274;, + 3;2276,2247,2244;, + 3;2160,2738,2732;, + 3;2227,2219,2286;, + 3;2143,2159,2429;, + 3;2297,2449,2289;, + 3;2142,2430,2291;, + 3;2309,2469,2495;, + 3;2434,2127,2768;, + 3;2472,2437,2308;, + 3;2477,2302,2444;, + 3;2730,2028,2746;, + 3;4126,1823,1747;, + 3;1769,1778,3416;, + 3;4127,1838,1750;, + 3;1883,1763,1762;, + 3;1765,1856,4128;, + 3;1764,1804,1784;, + 3;1858,1859,4129;, + 3;1777,1760,1763;, + 3;1749,1752,1763;, + 3;1746,1806,1767;, + 3;1773,3416,1775;, + 3;1771,1769,1770;, + 3;4130,4131,4132;, + 3;4133,4134,1768;, + 3;4135,4136,4137;, + 3;4136,4135,4138;, + 3;4137,4139,4140;, + 3;4139,4137,4136;, + 3;4141,4142,4143;, + 3;1776,4140,4139;, + 3;1774,1768,4134;, + 3;4144,4143,4142;, + 3;4132,4138,4135;, + 3;4138,4132,4131;, + 3;4143,4144,1774;, + 3;3416,1773,4145;, + 3;1768,1774,4144;, + 3;4142,4141,1776;, + 3;3416,4145,1770;, + 3;4146,2141,4147;, + 3;4140,1776,4141;, + 3;3416,4148,1775;, + 3;4131,4130,4133;, + 3;4149,1807,4150;, + 3;4134,4133,4130;, + 3;2715,2709,2333;, + 3;2319,2343,2549;, + 3;4151,1849,4152;, + 3;2145,4153,2704;, + 3;2710,2703,2332;, + 3;2524,2523,2346;, + 3;1783,1809,4154;, + 3;2320,2147,2342;, + 3;2335,2352,2329;, + 3;2351,2336,2350;, + 3;2363,2341,2148;, + 3;2367,2328,2353;, + 3;2375,2349,2337;, + 3;2370,2385,2536;, + 3;2537,2360,2135;, + 3;4155,1867,4156;, + 3;2327,2368,2362;, + 3;2513,2512,2355;, + 3;2149,2361,2369;, + 3;2531,2529,2374;, + 3;2348,2376,2372;, + 3;1785,1811,4157;, + 3;2389,2383,2378;, + 3;2381,2134,2357;, + 3;2384,2371,2377;, + 3;2133,2382,2390;, + 3;4158,1877,4159;, + 3;2338,2388,2379;, + 3;2393,2098,2401;, + 3;2392,2397,2115;, + 3;2109,2060,2399;, + 3;2394,2412,2097;, + 3;2411,2395,2122;, + 3;1755,1813,1787;, + 3;2407,2423,2101;, + 3;2422,2408,2415;, + 3;2402,2414,2409;, + 3;2413,2403,2418;, + 3;2419,2417,2404;, + 3;2416,2420,2108;, + 3;2099,2107,2421;, + 3;4160,1840,4161;, + 3;1788,1861,4162;, + 3;1754,1843,4163;, + 3;2102,2096,2406;, + 3;2114,2398,2061;, + 3;2112,2400,2091;, + 3;4164,1873,4165;, + 3;2424,2141,2318;, + 3;1779,1879,1790;, + 3;1756,1790,1879;, + 3;1757,4166,1820;, + 3;1751,1819,4166;, + 3;1825,4167,1827;, + 3;4120,1826,4167;, + 3;1758,1828,1830;, + 3;1748,1829,1828;, + 3;1870,1871,1794;, + 3;1782,1872,1871;, + 3;4121,4168,1847;, + 3;4122,1846,4168;, + 3;1834,1836,1796;, + 3;1759,1835,1753;, + 3;4123,4169,1853;, + 3;4124,1852,4169;, + 3;1761,1864,1866;, + 3;4125,1865,1864;, + 3;4170,1789,1799;, + 3;1766,1799,1789;, + 3;1833,1832,1800;, + 3;1831,1800,1832;, + 3;1824,1822,1801;, + 3;1747,1823,1822;, + 3;4127,4171,1837;, + 3;1750,1837,4171;, + 3;1857,1855,1803;, + 3;4128,1856,1855;, + 3;4154,1781,4172;, + 3;4173,4174,4175;, + 3;1858,1860,1805;, + 3;4129,1859,1786;, + 3;1746,4176,1881;, + 3;1767,1806,1880;, + 3;4149,4177,1807;, + 3;4150,1882,4178;, + 3;4151,1850,1851;, + 3;4152,1849,4179;, + 3;1783,1781,1809;, + 3;4154,1809,1781;, + 3;4155,4180,1868;, + 3;4156,1867,4180;, + 3;1785,4181,1811;, + 3;4157,1811,4181;, + 3;1878,1876,1812;, + 3;4159,1877,1876;, + 3;2410,2426,2405;, + 3;4160,4182,1841;, + 3;4161,1840,4182;, + 3;1788,4183,1862;, + 3;4162,1861,4183;, + 3;1754,4184,1844;, + 3;4163,1843,4184;, + 3;4164,1874,1875;, + 3;4165,1873,4185;, + 3;4186,4187,4188;, + 3;4187,4186,4189;, + 3;4170,1799,1818;, + 3;4187,4189,4190;, + 3;2152,2456,2489;, + 3;2431,2300,2290;, + 3;2156,2126,2435;, + 3;2476,2301,2478;, + 3;2438,2764,2307;, + 3;2501,2485,2296;, + 3;2446,2311,2728;, + 3;2310,2447,2468;, + 3;2155,2436,2473;, + 3;2452,2293,2491;, + 3;2459,2118,2063;, + 3;2150,2465,2428;, + 3;2432,2466,2299;, + 3;2451,2492,2488;, + 3;2467,2448,2298;, + 3;2153,2500,2455;, + 3;2454,2496,2505;, + 3;2453,2506,2292;, + 3;2295,2482,2316;, + 3;2462,2494,2470;, + 3;2493,2463,2487;, + 3;2315,2483,2442;, + 3;2440,2503,2481;, + 3;2502,2441,2484;, + 3;2151,2486,2464;, + 3;2479,2498,2475;, + 3;2497,2480,2504;, + 3;2154,2474,2499;, + 3;2317,2490,2294;, + 3;2507,2366,2354;, + 3;2550,2340,2364;, + 3;2326,2544,2561;, + 3;2345,2519,2517;, + 3;2562,2325,2556;, + 3;2373,2530,2347;, + 3;2568,2324,2563;, + 3;2359,2538,2534;, + 3;2323,2569,2541;, + 3;2535,2380,2358;, + 3;2574,2528,2532;, + 3;2717,2543,2136;, + 3;2620,2599,2606;, + 3;2548,2339,2551;, + 3;2621,2629,2598;, + 3;2508,2555,2365;, + 3;2590,2634,2601;, + 3;2630,2625,2600;, + 3;2613,2589,2612;, + 3;2592,2582,2558;, + 3;2655,2616,2649;, + 3;2615,2656,2654;, + 3;2570,2579,2540;, + 3;2539,2580,2533;, + 3;2583,2567,2557;, + 3;2614,2650,2588;, + 3;2611,2581,2593;, + 3;2610,2594,2602;, + 3;2525,2608,2522;, + 3;2607,2526,2619;, + 3;2514,2596,2511;, + 3;2595,2515,2605;, + 3;2545,2632,2560;, + 3;2631,2546,2624;, + 3;2520,2604,2516;, + 3;2603,2521,2609;, + 3;2564,2645,2573;, + 3;2644,2565,2639;, + 3;2575,2618,2527;, + 3;2617,2576,2648;, + 3;2552,2623,2547;, + 3;2622,2553,2628;, + 3;2509,2627,2554;, + 3;2626,2510,2597;, + 3;2591,2559,2633;, + 3;2661,2647,2577;, + 3;2666,2572,2640;, + 3;2584,2638,2566;, + 3;2683,2676,2671;, + 3;2684,2682,2675;, + 3;2689,2681,2685;, + 3;2680,2690,2697;, + 3;2578,2571,2667;, + 3;2662,2660,2646;, + 3;2657,2687,2653;, + 3;2686,2658,2693;, + 3;2651,2669,2587;, + 3;2668,2652,2688;, + 3;2635,2678,2643;, + 3;2677,2636,2674;, + 3;2641,2695,2665;, + 3;2694,2642,2679;, + 3;2585,2673,2637;, + 3;2672,2586,2670;, + 3;2663,2692,2659;, + 3;2691,2664,2696;, + 3;1819,1791,1821;, + 3;1757,1820,1819;, + 3;2701,2120,2210;, + 3;2119,2702,2139;, + 3;1820,1791,1819;, + 3;1820,1821,1791;, + 3;1819,1821,4166;, + 3;1820,4166,1821;, + 3;1747,1822,4191;, + 3;4126,4191,1822;, + 3;1823,1801,1822;, + 3;1824,1801,1823;, + 3;4126,1822,1824;, + 3;4126,1824,1823;, + 3;4192,4167,1825;, + 3;4192,1825,4120;, + 3;1826,1827,4167;, + 3;1825,1792,1826;, + 3;1825,1827,1792;, + 3;1826,1792,1827;, + 3;1748,1828,4193;, + 3;1758,4193,1828;, + 3;1829,1793,1828;, + 3;1758,1830,1829;, + 3;1830,1793,1829;, + 3;1830,1828,1793;, + 3;4194,1831,4195;, + 3;4195,1831,4196;, + 3;1831,1832,4196;, + 3;4194,4196,1832;, + 3;4194,1832,1833;, + 3;4194,1833,1831;, + 3;4197,1753,1834;, + 3;4197,1834,1759;, + 3;1835,1796,1836;, + 3;1834,1796,1835;, + 3;1835,1836,1753;, + 3;1834,1753,1836;, + 3;1839,1837,1802;, + 3;1750,1838,1837;, + 3;1838,1802,1837;, + 3;1839,1802,1838;, + 3;4127,1837,1839;, + 3;4127,1839,1838;, + 3;1840,1814,1842;, + 3;4160,1841,1840;, + 3;1841,1814,1840;, + 3;1841,1842,1814;, + 3;1840,1842,4182;, + 3;1841,4182,1842;, + 3;1843,1845,4184;, + 3;1754,1844,1843;, + 3;1844,1816,1843;, + 3;1844,4184,1845;, + 3;1844,1845,1816;, + 3;1843,1816,1845;, + 3;1846,1848,4168;, + 3;4121,1847,1846;, + 3;1847,1795,1846;, + 3;1847,4168,1848;, + 3;1847,1848,1795;, + 3;1846,1795,1848;, + 3;1849,1808,1850;, + 3;4151,1851,1849;, + 3;1849,1850,4179;, + 3;4151,4179,1850;, + 3;1851,1808,1849;, + 3;1851,1850,1808;, + 3;1852,1854,4169;, + 3;4123,1853,1852;, + 3;1853,1797,1852;, + 3;1853,4169,1854;, + 3;1853,1854,1797;, + 3;1852,1797,1854;, + 3;4128,1855,4198;, + 3;1765,4198,1855;, + 3;1856,1803,1855;, + 3;1857,1803,1856;, + 3;1765,1855,1857;, + 3;1765,1857,1856;, + 3;4199,1786,1858;, + 3;4199,1858,4129;, + 3;1859,1805,1860;, + 3;1858,1805,1859;, + 3;1859,1860,1786;, + 3;1858,1786,1860;, + 3;1861,1815,1863;, + 3;1788,1862,1861;, + 3;1862,1815,1861;, + 3;1862,1863,1815;, + 3;1861,1863,4183;, + 3;1862,4183,1863;, + 3;4125,1864,4200;, + 3;1761,4200,1864;, + 3;1865,1798,1864;, + 3;1761,1866,1865;, + 3;1866,1798,1865;, + 3;1866,1864,1798;, + 3;1867,1869,4180;, + 3;4155,1868,1867;, + 3;1868,1810,1867;, + 3;1868,4180,1869;, + 3;1868,1869,1810;, + 3;1867,1810,1869;, + 3;4201,1780,1870;, + 3;4201,1870,1782;, + 3;1782,1871,1780;, + 3;1870,1780,1871;, + 3;1872,1794,1871;, + 3;1870,1794,1872;, + 3;1873,1817,1874;, + 3;4164,1875,1873;, + 3;1873,1874,4185;, + 3;4164,4185,1874;, + 3;1875,1817,1873;, + 3;1875,1874,1817;, + 3;4159,1876,4202;, + 3;4158,4202,1876;, + 3;1877,1812,1876;, + 3;1878,1812,1877;, + 3;4158,1876,1878;, + 3;4158,1878,1877;, + 3;1756,1879,4203;, + 3;1779,4203,1879;, + 3;4177,4178,1882;, + 3;1880,1881,4176;, + 3;1746,1881,1806;, + 3;1880,1806,1881;, + 3;4177,1882,1807;, + 3;4150,1807,1882;, + 3;2144,2705,2158;, + 3;2706,2125,2157;, + 3;2699,2201,2713;, + 3;2137,2708,2716;, + 3;2322,2542,2718;, + 3;2321,2719,2334;, + 3;2117,2460,2207;, + 3;2116,2208,2391;, + 3;2306,2759,2756;, + 3;2303,2314,2443;, + 3;2168,2235,2167;, + 3;2445,2729,2747;, + 3;2027,2731,2733;, + 3;2161,2741,2737;, + 3;2162,2283,2740;, + 3;1749,1763,1883;, + 3;2745,2023,2030;, + 3;2313,2304,2751;, + 3;2727,2312,2752;, + 3;2750,2305,2757;, + 3;2761,2722,2233;, + 3;2760,2234,2755;, + 3;2439,2765,2763;, + 3;2766,2721,2762;, + 3;2767,2128,2720;, + 3;4204,1884,4205;, + 3;4206,1885,4207;, + 3;2387,2427,2123;, + 3;1884,4206,4205;, + 3;4204,4206,1884;, + 3;1885,4204,4207;, + 3;4206,4204,1885;, + 3;1910,1887,1921;, + 3;1888,4208,1950;, + 3;1956,4209,1957;, + 3;1889,4210,1960;, + 3;3044,2796,2780;, + 3;2987,3083,2802;, + 3;2001,1913,2003;, + 3;4211,4212,1977;, + 3;1965,1890,1966;, + 3;2839,2838,2896;, + 3;3357,2790,3373;, + 3;3001,3013,3177;, + 3;4213,4214,1983;, + 3;1892,4215,1996;, + 3;1949,1897,1930;, + 3;3369,3366,2788;, + 3;2944,3395,3109;, + 3;2783,3384,2869;, + 3;3385,2825,3400;, + 3;3120,3092,3130;, + 3;1893,1891,1894;, + 3;1901,1902,1903;, + 3;2870,2039,2017;, + 3;3116,2866,2849;, + 3;3399,2816,3405;, + 3;2843,2888,2832;, + 3;2048,2049,2846;, + 3;2821,2943,2887;, + 3;2744,2031,2941;, + 3;3379,2834,2868;, + 3;2850,2055,2045;, + 3;2842,2826,2854;, + 3;2841,2855,2046;, + 3;2847,2836,2047;, + 3;2867,2835,2848;, + 3;2769,2069,2057;, + 3;2844,2067,3119;, + 3;2080,2071,2852;, + 3;2837,2840,2047;, + 3;2851,2072,2054;, + 3;2845,2050,2066;, + 3;2827,2079,2853;, + 3;2856,2861,3360;, + 3;3368,2781,2858;, + 3;2777,2863,3054;, + 3;2857,2782,2860;, + 3;1964,1962,1931;, + 3;2878,2877,2018;, + 3;2828,2089,2078;, + 3;2871,2033,2038;, + 3;2085,2882,2019;, + 3;2940,2032,2872;, + 3;3380,2895,2833;, + 3;2912,2901,2938;, + 3;2917,2926,2935;, + 3;2907,2916,2932;, + 3;2902,2921,2936;, + 3;2922,2931,2934;, + 3;2820,2883,2904;, + 3;2905,2898,2819;, + 3;2831,2889,2914;, + 3;2915,2908,2830;, + 3;2876,2879,2924;, + 3;2925,2918,2875;, + 3;2088,2829,2909;, + 3;2910,2928,2087;, + 3;2881,2086,2929;, + 3;2930,2923,2880;, + 3;2885,2874,2919;, + 3;2920,2903,2884;, + 3;2891,2818,2899;, + 3;2900,2913,2890;, + 3;2933,2927,2911;, + 3;2937,2897,2906;, + 3;2824,3386,2735;, + 3;2886,2939,2873;, + 3;2799,3090,2815;, + 3;2953,2947,3104;, + 3;2800,2945,3089;, + 3;2965,3154,3126;, + 3;3093,3415,2785;, + 3;3131,2964,3096;, + 3;3136,3103,2962;, + 3;3388,3393,2025;, + 3;4216,4217,1954;, + 3;1900,1901,3417;, + 3;4218,4219,1969;, + 3;2014,1893,1894;, + 3;1896,4220,1987;, + 3;1895,1915,1935;, + 3;1989,4221,1990;, + 3;1908,1894,1891;, + 3;1749,1894,1752;, + 3;1746,1898,1937;, + 3;3417,1906,1899;, + 3;1902,1901,1900;, + 3;4222,4223,4224;, + 3;1909,4225,4226;, + 3;4135,4137,4227;, + 3;4227,4228,4135;, + 3;4137,4229,4230;, + 3;4230,4227,4137;, + 3;4231,4232,1904;, + 3;1907,4230,4229;, + 3;1905,4226,4225;, + 3;4233,1904,4232;, + 3;4223,4135,4228;, + 3;4228,4224,4223;, + 3;4232,1905,4233;, + 3;1906,3417,4234;, + 3;4225,4233,1905;, + 3;1904,1907,4231;, + 3;4235,1900,3417;, + 3;2801,1908,1891;, + 3;4229,4231,1907;, + 3;4235,3417,1899;, + 3;4224,1909,4222;, + 3;4236,4237,1938;, + 3;4226,4222,1909;, + 3;3374,2989,3371;, + 3;2975,3208,3000;, + 3;4238,4239,1980;, + 3;2802,3364,2991;, + 3;3370,2990,3365;, + 3;3183,3006,3182;, + 3;1914,4240,1940;, + 3;2982,2996,2805;, + 3;2995,2986,3011;, + 3;3012,3002,2994;, + 3;3021,2804,2997;, + 3;3024,3010,2983;, + 3;3033,2993,3003;, + 3;3028,3195,3043;, + 3;3196,2793,3017;, + 3;4241,4242,1998;, + 3;2984,3019,3023;, + 3;3176,3008,3171;, + 3;2803,3022,3020;, + 3;3194,3029,3185;, + 3;3004,3031,3037;, + 3;1916,4243,1942;, + 3;3046,3035,3039;, + 3;3041,3016,2794;, + 3;3038,3036,3032;, + 3;2795,3045,3040;, + 3;4244,4245,2008;, + 3;2992,3034,3047;, + 3;3051,3059,2093;, + 3;3052,2773,3058;, + 3;2110,3056,2059;, + 3;3050,2094,3070;, + 3;3064,2776,3049;, + 3;1886,1918,1944;, + 3;3068,2104,3080;, + 3;3081,3071,3067;, + 3;3060,3066,3072;, + 3;3073,3074,3063;, + 3;3077,3062,3075;, + 3;3076,2105,3079;, + 3;2100,3078,2106;, + 3;4246,4247,1971;, + 3;1919,4248,1992;, + 3;4249,4250,1974;, + 3;2103,3069,2095;, + 3;2774,2058,3057;, + 3;2111,2092,3055;, + 3;4251,4252,2004;, + 3;3082,2974,4253;, + 3;1910,1921,2010;, + 3;1887,2010,1921;, + 3;1888,1951,4254;, + 3;4208,4254,1950;, + 3;1956,1958,4255;, + 3;4209,4255,1957;, + 3;1889,1961,1959;, + 3;4210,1959,1960;, + 3;2001,1925,2002;, + 3;1913,2002,2003;, + 3;4211,1978,4256;, + 3;4212,4256,1977;, + 3;1965,1927,1967;, + 3;1890,4257,1966;, + 3;4213,1984,4258;, + 3;4214,4258,1983;, + 3;1892,1997,1995;, + 3;4215,1995,1996;, + 3;4259,1930,1920;, + 3;1897,1920,1930;, + 3;1964,1931,1963;, + 3;1962,1963,1931;, + 3;1955,1932,1953;, + 3;4217,1953,1954;, + 3;4218,1968,4260;, + 3;4219,4260,1968;, + 3;1988,1934,1986;, + 3;4220,1986,1987;, + 3;4240,4261,1912;, + 3;3018,2985,3084;, + 3;1989,1936,1991;, + 3;4221,1917,1990;, + 3;1746,2012,4176;, + 3;1898,2011,1937;, + 3;4236,1938,4262;, + 3;4237,4178,2013;, + 3;4238,1982,1981;, + 3;4239,4263,1980;, + 3;1914,1940,1912;, + 3;4240,1912,1940;, + 3;4241,1999,4264;, + 3;4242,4264,1998;, + 3;1916,1942,4265;, + 3;4243,4265,1942;, + 3;2009,1943,2007;, + 3;4245,2007,2008;, + 3;3065,3061,3086;, + 3;4246,1972,4266;, + 3;4247,4266,1971;, + 3;1919,1993,4267;, + 3;4248,4267,1992;, + 3;4249,1975,4268;, + 3;4250,4268,1974;, + 3;4251,2006,2005;, + 3;4252,4269,2004;, + 3;4270,4271,4272;, + 3;4272,4273,4270;, + 3;4259,1949,1930;, + 3;4272,4274,4273;, + 3;2812,3148,3115;, + 3;3088,2946,2954;, + 3;2808,3098,2786;, + 3;3132,3140,2963;, + 3;3095,2957,3411;, + 3;3160,2952,3144;, + 3;3107,3390,2972;, + 3;2973,3127,3106;, + 3;2809,3135,3097;, + 3;3113,3152,2950;, + 3;3118,2068,2770;, + 3;2814,3091,3121;, + 3;3087,2955,3129;, + 3;3114,3145,3151;, + 3;3128,2956,3105;, + 3;2811,3110,3159;, + 3;3111,3162,3158;, + 3;3112,2951,3161;, + 3;2948,2967,3143;, + 3;3124,3125,3149;, + 3;3150,3146,3123;, + 3;2968,3100,3142;, + 3;3102,3137,3164;, + 3;3165,3141,3101;, + 3;2813,3122,3147;, + 3;3139,3133,3156;, + 3;3157,3163,3138;, + 3;2810,3155,3134;, + 3;2966,2949,3153;, + 3;3170,3009,3025;, + 3;3209,3027,2998;, + 3;2976,3220,3207;, + 3;3007,3172,3181;, + 3;3221,3219,2977;, + 3;3030,3005,3184;, + 3;3227,3226,2978;, + 3;3014,3191,3202;, + 3;2979,3199,3232;, + 3;3190,3015,3042;, + 3;3233,3193,3186;, + 3;3377,2792,3197;, + 3;3279,3265,3258;, + 3;3203,3214,2999;, + 3;3284,3254,3288;, + 3;3169,3026,3210;, + 3;3249,3263,3293;, + 3;3292,3264,3280;, + 3;3272,3271,3248;, + 3;3252,3217,3246;, + 3;3314,3308,3276;, + 3;3277,3313,3319;, + 3;3231,3200,3235;, + 3;3201,3192,3234;, + 3;3245,3218,3222;, + 3;3278,3240,3312;, + 3;3266,3251,3247;, + 3;3267,3262,3250;, + 3;3189,3178,3269;, + 3;3270,3273,3188;, + 3;3175,3166,3256;, + 3;3257,3259,3174;, + 3;3206,3215,3290;, + 3;3291,3281,3205;, + 3;3180,3173,3260;, + 3;3261,3268,3179;, + 3;3225,3228,3304;, + 3;3299,3298,3224;, + 3;3239,3187,3274;, + 3;3275,3305,3238;, + 3;3213,3204,3282;, + 3;3283,3285,3212;, + 3;3168,3211,3286;, + 3;3287,3255,3167;, + 3;3253,3289,3216;, + 3;3320,3237,3306;, + 3;3322,3303,3229;, + 3;3244,3223,3294;, + 3;3342,3330,3335;, + 3;3347,3331,3341;, + 3;3348,3346,3336;, + 3;3337,3356,3352;, + 3;3236,3321,3230;, + 3;3326,3307,3315;, + 3;3318,3309,3344;, + 3;3345,3349,3317;, + 3;3311,3241,3328;, + 3;3329,3343,3310;, + 3;3297,3300,3339;, + 3;3340,3332,3296;, + 3;3302,3323,3354;, + 3;3355,3338,3301;, + 3;3243,3295,3333;, + 3;3334,3327,3242;, + 3;3325,3316,3350;, + 3;3351,3353,3324;, + 3;1950,1952,1922;, + 3;1888,1950,1951;, + 3;3359,2862,2778;, + 3;2779,2789,3358;, + 3;1951,1950,1922;, + 3;1951,1922,1952;, + 3;1950,4254,1952;, + 3;1951,1952,4254;, + 3;4217,4275,1953;, + 3;4216,1953,4275;, + 3;1954,1953,1932;, + 3;1955,1954,1932;, + 3;4216,1955,1953;, + 3;4216,1954,1955;, + 3;4276,1956,4255;, + 3;4276,4209,1956;, + 3;1957,4255,1958;, + 3;1956,1957,1923;, + 3;1956,1923,1958;, + 3;1957,1958,1923;, + 3;4210,4277,1959;, + 3;1889,1959,4277;, + 3;1960,1959,1924;, + 3;1889,1960,1961;, + 3;1961,1960,1924;, + 3;1961,1924,1959;, + 3;4278,4279,1962;, + 3;4279,4280,1962;, + 3;1962,4280,1963;, + 3;4278,1963,4280;, + 3;4278,1964,1963;, + 3;4278,1962,1964;, + 3;4281,1965,4257;, + 3;4281,1890,1965;, + 3;1966,1967,1927;, + 3;1965,1966,1927;, + 3;1966,4257,1967;, + 3;1965,1967,4257;, + 3;1970,1933,1968;, + 3;4219,1968,1969;, + 3;1969,1968,1933;, + 3;1970,1969,1933;, + 3;4218,1970,1968;, + 3;4218,1969,1970;, + 3;1971,1973,1945;, + 3;4246,1971,1972;, + 3;1972,1971,1945;, + 3;1972,1945,1973;, + 3;1971,4266,1973;, + 3;1972,1973,4266;, + 3;1974,4268,1976;, + 3;4249,1974,1975;, + 3;1975,1974,1947;, + 3;1975,1976,4268;, + 3;1975,1947,1976;, + 3;1974,1976,1947;, + 3;1977,4256,1979;, + 3;4211,1977,1978;, + 3;1978,1977,1926;, + 3;1978,1979,4256;, + 3;1978,1926,1979;, + 3;1977,1979,1926;, + 3;1980,1981,1939;, + 3;4238,1980,1982;, + 3;1980,4263,1981;, + 3;4238,1981,4263;, + 3;1982,1980,1939;, + 3;1982,1939,1981;, + 3;1983,4258,1985;, + 3;4213,1983,1984;, + 3;1984,1983,1928;, + 3;1984,1985,4258;, + 3;1984,1928,1985;, + 3;1983,1985,1928;, + 3;4220,4282,1986;, + 3;1896,1986,4282;, + 3;1987,1986,1934;, + 3;1988,1987,1934;, + 3;1896,1988,1986;, + 3;1896,1987,1988;, + 3;4283,1989,1917;, + 3;4283,4221,1989;, + 3;1990,1991,1936;, + 3;1989,1990,1936;, + 3;1990,1917,1991;, + 3;1989,1991,1917;, + 3;1992,1994,1946;, + 3;1919,1992,1993;, + 3;1993,1992,1946;, + 3;1993,1946,1994;, + 3;1992,4267,1994;, + 3;1993,1994,4267;, + 3;4215,4284,1995;, + 3;1892,1995,4284;, + 3;1996,1995,1929;, + 3;1892,1996,1997;, + 3;1997,1996,1929;, + 3;1997,1929,1995;, + 3;1998,4264,2000;, + 3;1915,4285,4286;, + 3;1999,1998,1941;, + 3;1999,2000,4264;, + 3;1999,1941,2000;, + 3;1998,2000,1941;, + 3;4287,2001,1911;, + 3;4287,1913,2001;, + 3;1913,1911,2002;, + 3;2001,2002,1911;, + 3;2003,2002,1925;, + 3;2001,2003,1925;, + 3;2004,2005,1948;, + 3;4251,2004,2006;, + 3;2004,4269,2005;, + 3;4251,2005,4269;, + 3;2006,2004,1948;, + 3;2006,1948,2005;, + 3;4245,4288,2007;, + 3;4244,2007,4288;, + 3;2008,2007,1943;, + 3;2009,2008,1943;, + 3;4244,2009,2007;, + 3;4244,2008,2009;, + 3;1887,4289,2010;, + 3;1910,2010,4289;, + 3;4262,2013,4178;, + 3;2011,4176,2012;, + 3;1746,1937,2012;, + 3;2011,2012,1937;, + 3;4262,1938,2013;, + 3;4237,2013,1938;, + 3;2798,2806,3363;, + 3;3362,2807,2787;, + 3;3361,3367,2859;, + 3;2791,3378,3372;, + 3;2980,3376,3198;, + 3;2981,2988,3375;, + 3;2771,2865,3117;, + 3;2772,3053,2864;, + 3;2958,3402,3410;, + 3;2961,3099,2969;, + 3;2893,2817,2892;, + 3;3108,3392,3389;, + 3;2026,2734,3387;, + 3;2823,2736,2742;, + 3;2822,2743,2942;, + 3;1749,2014,1894;, + 3;3394,2029,2024;, + 3;2970,3397,2960;, + 3;3391,3396,2971;, + 3;3398,3401,2959;, + 3;3408,2894,3381;, + 3;3409,3403,2893;, + 3;3094,3406,3414;, + 3;3413,3407,3382;, + 3;3412,3383,2784;, + 3;4290,4291,2015;, + 3;4292,4293,2016;, + 3;3048,2775,3085;, + 3;2015,4291,4294;, + 3;4290,2015,4294;, + 3;2016,4293,4295;, + 3;4292,2016,4295;, + 3;2017,2040,2022;, + 3;2017,2039,2040;, + 3;2018,2870,2017;, + 3;2018,2877,2870;, + 3;2019,2878,2018;, + 3;2019,2882,2878;, + 3;2020,2085,2019;, + 3;2020,2084,2085;, + 3;2021,2223,2020;, + 3;2021,2222,2223;, + 3;2022,2215,2021;, + 3;2022,2214,2215;, + 3;2019,2017,2020;, + 3;2020,2017,2022;, + 3;2020,2022,2021;, + 3;2017,2019,2018;, + 3;2023,2746,2028;, + 3;2023,2745,2746;, + 3;2024,2030,2023;, + 3;2024,2029,2030;, + 3;2025,3394,2024;, + 3;2025,3393,3394;, + 3;2026,3388,2025;, + 3;2026,3387,3388;, + 3;2027,2734,2026;, + 3;2027,2733,2734;, + 3;2028,2731,2027;, + 3;2028,2730,2731;, + 3;2025,2028,2026;, + 3;2026,2028,2027;, + 3;2028,2025,2024;, + 3;2028,2024,2023;, + 3;2029,2014,1749;, + 3;2029,3394,2014;, + 3;1749,2745,2030;, + 3;1749,1883,2745;, + 3;1749,2030,2029;, + 3;2031,2739,2036;, + 3;2031,2744,2739;, + 3;2032,2941,2031;, + 3;2032,2940,2941;, + 3;2033,2872,2032;, + 3;2033,2871,2872;, + 3;2034,2038,2033;, + 3;2034,2037,2038;, + 3;2035,2221,2034;, + 3;2035,2220,2221;, + 3;2036,2285,2035;, + 3;2036,2284,2285;, + 3;2031,2036,2034;, + 3;2031,2034,2033;, + 3;2031,2033,2032;, + 3;2034,2036,2035;, + 3;2037,2214,2040;, + 3;2037,2221,2214;, + 3;2039,2871,2038;, + 3;2039,2870,2871;, + 3;2039,2038,2040;, + 3;2040,2038,2037;, + 3;2041,2049,2048;, + 3;2041,2052,2049;, + 3;2042,2190,2041;, + 3;2042,2189,2190;, + 3;2042,2177,2178;, + 3;2043,2187,2042;, + 3;2043,2186,2187;, + 3;2044,2195,2043;, + 3;2044,2194,2195;, + 3;2045,2056,2044;, + 3;2045,2055,2056;, + 3;2046,2850,2045;, + 3;2046,2855,2850;, + 3;2047,2841,2046;, + 3;2047,2840,2841;, + 3;2047,2836,2837;, + 3;2048,2847,2047;, + 3;2048,2846,2847;, + 3;2045,2044,2048;, + 3;2045,2048,2046;, + 3;2046,2048,2047;, + 3;2048,2044,2041;, + 3;2041,2044,2043;, + 3;2041,2043,2042;, + 3;2050,2846,2049;, + 3;2050,2845,2846;, + 3;2051,2066,2050;, + 3;2051,2065,2066;, + 3;2052,2191,2051;, + 3;2052,2190,2191;, + 3;2050,2049,2051;, + 3;2051,2049,2052;, + 3;2053,2194,2056;, + 3;2053,2199,2194;, + 3;2054,2073,2053;, + 3;2054,2072,2073;, + 3;2055,2851,2054;, + 3;2055,2850,2851;, + 3;2055,2054,2056;, + 3;2056,2054,2053;, + 3;2057,2070,2062;, + 3;2057,2069,2070;, + 3;2058,2769,2057;, + 3;2058,2774,2769;, + 3;2059,3057,2058;, + 3;2059,3056,3057;, + 3;2060,2110,2059;, + 3;2060,2109,2110;, + 3;2061,2399,2060;, + 3;2061,2398,2399;, + 3;2062,2114,2061;, + 3;2062,2113,2114;, + 3;2057,2062,2058;, + 3;2058,2062,2061;, + 3;2058,2061,2059;, + 3;2059,2061,2060;, + 3;2063,2113,2070;, + 3;2063,2118,2113;, + 3;2064,2459,2063;, + 3;2064,2458,2459;, + 3;2065,2192,2064;, + 3;2065,2191,2192;, + 3;2067,2845,2066;, + 3;2067,2844,2845;, + 3;2068,3119,2067;, + 3;2068,3118,3119;, + 3;2069,2770,2068;, + 3;2069,2769,2770;, + 3;2066,2065,2069;, + 3;2066,2069,2068;, + 3;2066,2068,2067;, + 3;2069,2065,2070;, + 3;2070,2065,2063;, + 3;2063,2065,2064;, + 3;2071,2075,2074;, + 3;2071,2080,2075;, + 3;2072,2852,2071;, + 3;2072,2851,2852;, + 3;2074,2199,2073;, + 3;2074,2198,2199;, + 3;2072,2071,2073;, + 3;2073,2071,2074;, + 3;2076,2198,2075;, + 3;2076,2197,2198;, + 3;2077,2174,2076;, + 3;2077,2173,2174;, + 3;2078,2090,2077;, + 3;2078,2089,2090;, + 3;2079,2828,2078;, + 3;2079,2827,2828;, + 3;2080,2853,2079;, + 3;2080,2852,2853;, + 3;2078,2077,2079;, + 3;2079,2077,2076;, + 3;2079,2076,2080;, + 3;2080,2076,2075;, + 3;2081,2173,2090;, + 3;2081,2172,2173;, + 3;2082,2254,2081;, + 3;2082,2253,2254;, + 3;2083,2273,2082;, + 3;2083,2272,2273;, + 3;2084,2224,2083;, + 3;2084,2223,2224;, + 3;2086,2882,2085;, + 3;2086,2881,2882;, + 3;2087,2929,2086;, + 3;2087,2928,2929;, + 3;2088,2910,2087;, + 3;2088,2909,2910;, + 3;2089,2829,2088;, + 3;2089,2828,2829;, + 3;2085,2084,2090;, + 3;2085,2090,2089;, + 3;2085,2089,2086;, + 3;2086,2089,2087;, + 3;2087,2089,2088;, + 3;2090,2084,2083;, + 3;2090,2083,2082;, + 3;2090,2082,2081;, + 3;2091,2401,2098;, + 3;2091,2400,2401;, + 3;2092,2112,2091;, + 3;2092,2111,2112;, + 3;2093,3055,2092;, + 3;2093,3059,3055;, + 3;4296,3051,2093;, + 3;4296,4297,3051;, + 3;4298,3070,2094;, + 3;4298,4299,3070;, + 3;2096,2103,2095;, + 3;2096,2102,2103;, + 3;2097,4300,4301;, + 3;2097,2412,4300;, + 3;2098,4302,4303;, + 3;2098,2393,4302;, + 3;4304,4305,4298;, + 3;4304,4298,2094;, + 3;4298,4305,4301;, + 3;4301,4305,2097;, + 3;2098,2093,2092;, + 3;2098,2092,2091;, + 3;2099,4306,4307;, + 3;2099,2421,4306;, + 3;2100,2107,2099;, + 3;2100,2106,2107;, + 3;4307,3078,2100;, + 3;4307,4308,3078;, + 3;4307,2100,2099;, + 3;2101,21,8;, + 3;2101,2423,21;, + 3;2102,2407,2101;, + 3;2102,2406,2407;, + 3;2104,3069,2103;, + 3;2104,3068,3069;, + 3;8,3080,2104;, + 3;8,151,3080;, + 3;8,2102,2101;, + 3;8,2103,2102;, + 3;8,2104,2103;, + 3;2105,4309,4310;, + 3;2105,3076,4309;, + 3;2106,3079,2105;, + 3;2106,3078,3079;, + 3;2108,2421,2107;, + 3;2108,2420,2421;, + 3;4310,2416,2108;, + 3;4310,4311,2416;, + 3;4310,2106,2105;, + 3;4310,2107,2106;, + 3;4310,2108,2107;, + 3;4312,2400,2112;, + 3;4312,4313,2400;, + 3;2111,4314,4315;, + 3;2111,3055,4314;, + 3;4315,4312,2111;, + 3;2111,4312,2112;, + 3;4316,2398,2114;, + 3;2115,2397,4317;, + 3;2116,2392,2115;, + 3;2116,2391,2392;, + 3;2117,4318,4319;, + 3;2117,2207,4318;, + 3;2118,2460,2117;, + 3;2118,2459,2460;, + 3;2114,2118,2117;, + 3;2114,2117,4316;, + 3;4316,2117,4319;, + 3;2118,2114,2113;, + 3;2119,4320,4321;, + 3;2119,2139,4320;, + 3;2120,2702,2119;, + 3;2120,2701,2702;, + 3;2121,2210,2120;, + 3;2121,2209,2210;, + 3;4322,2396,2121;, + 3;4322,4323,2396;, + 3;1755,2411,2122;, + 3;1755,1787,2411;, + 3;2123,1813,1755;, + 3;2123,2427,1813;, + 3;2124,2387,2123;, + 3;2124,2386,2387;, + 3;1755,2124,2123;, + 3;4324,2119,4321;, + 3;4324,2120,2119;, + 3;4324,2121,2120;, + 3;4324,4322,2121;, + 3;2125,4325,4326;, + 3;2125,2706,4325;, + 3;2126,2157,2125;, + 3;2126,2156,2157;, + 3;2127,2435,2126;, + 3;2127,2434,2435;, + 3;2128,2768,2127;, + 3;2128,2767,2768;, + 3;2129,2720,2128;, + 3;2129,2725,2720;, + 3;2130,2213,2129;, + 3;2130,2212,2213;, + 3;4327,2203,2130;, + 3;2131,2202,4328;, + 3;2132,2712,2131;, + 3;2132,2711,2712;, + 3;4326,2127,2126;, + 3;4326,2126,2125;, + 3;2127,4326,4327;, + 3;2127,4327,2128;, + 3;2128,4327,2130;, + 3;2128,2130,2129;, + 3;2133,4329,4320;, + 3;2133,2390,4329;, + 3;2134,2382,2133;, + 3;2134,2381,2382;, + 3;2135,2357,2134;, + 3;2135,2360,2357;, + 3;2136,2537,2135;, + 3;2136,2543,2537;, + 3;2137,2717,2136;, + 3;2137,2716,2717;, + 3;2138,2708,2137;, + 3;2138,2714,2708;, + 3;2139,2698,2138;, + 3;2139,2702,2698;, + 3;2134,2133,2135;, + 3;2135,2133,4320;, + 3;2135,4320,2136;, + 3;2136,4320,2139;, + 3;2136,2139,2137;, + 3;2137,2139,2138;, + 3;2141,2425,2146;, + 3;2141,2424,2425;, + 3;2141,4146,2318;, + 3;4330,1760,1777;, + 3;2142,1762,1760;, + 3;2142,2291,1762;, + 3;2143,2430,2142;, + 3;2143,2429,2430;, + 3;2144,2159,2143;, + 3;2144,2158,2159;, + 3;2145,2705,2144;, + 3;2145,2704,2705;, + 3;2146,2331,4331;, + 3;2146,2330,2331;, + 3;1760,2143,2142;, + 3;1760,2144,2143;, + 3;1760,2145,2144;, + 3;1760,4330,2145;, + 3;2145,4330,4153;, + 3;2147,4332,4333;, + 3;2147,2320,4332;, + 3;2148,2342,2147;, + 3;2148,2341,2342;, + 3;2149,2363,2148;, + 3;2149,2369,2363;, + 3;4333,2361,2149;, + 3;4333,4173,2361;, + 3;4333,2148,2147;, + 3;4333,2149,2148;, + 3;2150,2429,2159;, + 3;2150,2428,2429;, + 3;2151,2465,2150;, + 3;2151,2464,2465;, + 3;2152,4334,4335;, + 3;2152,2489,4334;, + 3;2153,2456,2152;, + 3;2153,2455,2456;, + 3;4336,2500,2153;, + 3;4336,4337,2500;, + 3;2155,2474,2154;, + 3;2155,2473,2474;, + 3;2156,2436,2155;, + 3;2156,2435,2436;, + 3;2158,2706,2157;, + 3;2158,2705,2706;, + 3;2158,2154,4338;, + 3;2158,4338,4339;, + 3;2158,4339,2151;, + 3;2158,2151,2150;, + 3;2158,2150,2159;, + 3;2154,2158,2155;, + 3;2155,2158,2157;, + 3;2155,2157,2156;, + 3;2160,2726,2169;, + 3;2160,2732,2726;, + 3;2161,2738,2160;, + 3;2161,2737,2738;, + 3;2162,2741,2161;, + 3;2162,2740,2741;, + 3;2163,2283,2162;, + 3;2163,2287,2283;, + 3;2164,2231,2163;, + 3;2164,2230,2231;, + 3;2165,2249,2164;, + 3;2165,2248,2249;, + 3;2166,2243,2165;, + 3;2166,2242,2243;, + 3;2167,2236,2166;, + 3;2167,2235,2236;, + 3;2168,2754,2235;, + 3;2168,2758,2754;, + 3;2169,2749,2168;, + 3;2169,2753,2749;, + 3;2167,2165,2164;, + 3;2167,2164,2163;, + 3;2167,2163,2168;, + 3;2168,2163,2162;, + 3;2168,2162,2169;, + 3;2169,2162,2161;, + 3;2169,2161,2160;, + 3;2165,2167,2166;, + 3;2170,2239,2176;, + 3;2170,2238,2239;, + 3;2171,2259,2170;, + 3;2171,2258,2259;, + 3;2172,2255,2171;, + 3;2172,2254,2255;, + 3;2175,2197,2174;, + 3;2175,2196,2197;, + 3;2176,2185,2175;, + 3;2176,2184,2185;, + 3;2171,2176,2172;, + 3;2172,2176,2174;, + 3;2172,2174,2173;, + 3;2174,2176,2175;, + 3;2176,2171,2170;, + 3;2177,2183,2182;, + 3;2177,2187,2183;, + 3;2179,2189,2178;, + 3;2179,2188,2189;, + 3;2180,2205,2179;, + 3;2180,2204,2205;, + 3;2181,2724,2180;, + 3;2181,2723,2724;, + 3;2182,2232,2181;, + 3;2182,2240,2232;, + 3;2179,2178,2180;, + 3;2180,2178,2177;, + 3;2180,2177,2182;, + 3;2180,2182,2181;, + 3;2184,2240,2183;, + 3;2184,2239,2240;, + 3;2186,2196,2185;, + 3;2186,2195,2196;, + 3;2185,2187,2186;, + 3;2187,2185,2183;, + 3;2183,2185,2184;, + 3;2188,2206,2193;, + 3;2188,2205,2206;, + 3;2193,2458,2192;, + 3;2193,2457,2458;, + 3;2189,2193,2192;, + 3;2189,2192,2190;, + 3;2190,2192,2191;, + 3;2193,2189,2188;, + 3;2199,2195,2194;, + 3;2195,2199,2198;, + 3;2195,2198,2197;, + 3;2195,2197,2196;, + 3;2200,2211,4328;, + 3;2203,4340,2212;, + 3;2201,2700,2200;, + 3;2201,2699,2700;, + 3;2202,2713,2201;, + 3;2202,2712,2713;, + 3;4328,2201,2200;, + 3;2201,4328,2202;, + 3;2204,2725,2213;, + 3;2204,2724,2725;, + 3;2207,2457,2206;, + 3;2207,2460,2457;, + 3;2209,2391,2208;, + 3;2209,2396,2391;, + 3;2211,2701,2210;, + 3;2211,2700,2701;, + 3;2205,2207,2206;, + 3;2207,2205,2204;, + 3;2207,2204,4318;, + 3;4318,2204,4340;, + 3;2208,2211,2209;, + 3;2209,2211,2210;, + 3;4340,2204,2212;, + 3;2212,2204,2213;, + 3;2216,2222,2215;, + 3;2216,2226,2222;, + 3;2217,2267,2216;, + 3;2217,2266,2267;, + 3;2218,2265,2217;, + 3;2218,2264,2265;, + 3;2219,2228,2218;, + 3;2219,2227,2228;, + 3;2220,2286,2219;, + 3;2220,2285,2286;, + 3;2218,2216,2219;, + 3;2219,2216,2220;, + 3;2220,2216,2215;, + 3;2220,2215,2221;, + 3;2221,2215,2214;, + 3;2216,2218,2217;, + 3;2225,2272,2224;, + 3;2225,2271,2272;, + 3;2226,2268,2225;, + 3;2226,2267,2268;, + 3;2222,2226,2225;, + 3;2222,2225,2224;, + 3;2222,2224,2223;, + 3;2227,2287,2231;, + 3;2227,2286,2287;, + 3;2229,2264,2228;, + 3;2229,2263,2264;, + 3;2230,2250,2229;, + 3;2230,2249,2250;, + 3;2227,2231,2228;, + 3;2228,2231,2229;, + 3;2229,2231,2230;, + 3;2233,2723,2232;, + 3;2233,2722,2723;, + 3;2234,2761,2233;, + 3;2234,2760,2761;, + 3;2235,2754,2234;, + 3;2234,2754,2755;, + 3;2237,2242,2236;, + 3;2237,2241,2242;, + 3;2238,2260,2237;, + 3;2238,2259,2260;, + 3;2237,2236,2238;, + 3;2238,2236,2235;, + 3;2238,2235,2239;, + 3;2239,2235,2234;, + 3;2239,2234,2232;, + 3;2239,2232,2240;, + 3;2232,2234,2233;, + 3;2241,2256,2245;, + 3;2241,2260,2256;, + 3;2244,2248,2243;, + 3;2244,2247,2248;, + 3;2245,2276,2244;, + 3;2245,2282,2276;, + 3;2242,2241,2243;, + 3;2243,2241,2244;, + 3;2244,2241,2245;, + 3;2246,2263,2250;, + 3;2246,2262,2263;, + 3;2247,2277,2246;, + 3;2247,2276,2277;, + 3;2246,2250,2247;, + 3;2247,2250,2249;, + 3;2247,2249,2248;, + 3;2251,2258,2255;, + 3;2251,2257,2258;, + 3;2252,2281,2251;, + 3;2252,2280,2281;, + 3;2253,2274,2252;, + 3;2253,2273,2274;, + 3;2255,2252,2251;, + 3;2252,2255,2254;, + 3;2252,2254,2253;, + 3;2257,2282,2256;, + 3;2257,2281,2282;, + 3;2257,2259,2258;, + 3;2259,2257,2256;, + 3;2259,2256,2260;, + 3;2261,2266,2265;, + 3;2261,2270,2266;, + 3;2262,2278,2261;, + 3;2262,2277,2278;, + 3;2265,2263,2262;, + 3;2265,2262,2261;, + 3;2263,2265,2264;, + 3;2269,2271,2268;, + 3;2269,2275,2271;, + 3;2270,2279,2269;, + 3;2270,2278,2279;, + 3;2270,2269,2268;, + 3;2270,2268,2266;, + 3;2266,2268,2267;, + 3;2275,2280,2274;, + 3;2275,2279,2280;, + 3;2275,2273,2271;, + 3;2271,2273,2272;, + 3;2273,2275,2274;, + 3;2279,2278,2280;, + 3;2280,2278,2282;, + 3;2280,2282,2281;, + 3;2282,2278,2276;, + 3;2276,2278,2277;, + 3;2284,2740,2283;, + 3;2284,2739,2740;, + 3;2286,2283,2287;, + 3;2283,2286,2285;, + 3;2283,2285,2284;, + 3;2288,1883,1762;, + 3;2288,2748,1883;, + 3;2289,2450,2288;, + 3;2289,2449,2450;, + 3;2290,2297,2289;, + 3;2290,2300,2297;, + 3;2291,2431,2290;, + 3;2291,2430,2431;, + 3;1762,2289,2288;, + 3;1762,2290,2289;, + 3;1762,2291,2290;, + 3;2292,2501,2296;, + 3;2292,2506,2501;, + 3;2293,2453,2292;, + 3;2293,2452,2453;, + 3;2294,2491,2293;, + 3;2294,2490,2491;, + 3;2295,2317,2294;, + 3;2295,2316,2317;, + 3;2296,2482,2295;, + 3;2296,2485,2482;, + 3;2293,2296,2294;, + 3;2294,2296,2295;, + 3;2296,2293,2292;, + 3;2298,2449,2297;, + 3;2298,2448,2449;, + 3;2299,2467,2298;, + 3;2299,2466,2467;, + 3;2300,2432,2299;, + 3;2300,2431,2432;, + 3;2297,2299,2298;, + 3;2299,2297,2300;, + 3;2301,2472,2308;, + 3;2301,2476,2472;, + 3;2302,2478,2301;, + 3;2302,2477,2478;, + 3;2303,2444,2302;, + 3;2303,2443,2444;, + 3;2304,2314,2303;, + 3;2304,2313,2314;, + 3;2305,2751,2304;, + 3;2305,2750,2751;, + 3;2306,2757,2305;, + 3;2306,2756,2757;, + 3;2307,2759,2306;, + 3;2307,2764,2759;, + 3;2308,2438,2307;, + 3;2308,2437,2438;, + 3;2306,2302,2307;, + 3;2307,2302,2301;, + 3;2307,2301,2308;, + 3;2302,2306,2305;, + 3;2302,2305,2304;, + 3;2302,2304,2303;, + 3;4341,2490,2317;, + 3;4341,4342,2490;, + 3;2310,2469,2309;, + 3;2310,2468,2469;, + 3;2311,2447,2310;, + 3;2311,2446,2447;, + 3;2312,2728,2311;, + 3;2312,2727,2728;, + 3;2313,2752,2312;, + 3;2313,2751,2752;, + 3;2315,2443,2314;, + 3;2315,2442,2443;, + 3;4343,2483,2315;, + 3;2316,2482,4344;, + 3;2312,2315,2314;, + 3;2312,2314,2313;, + 3;2315,2312,2311;, + 3;2315,2311,4343;, + 3;4343,2311,2310;, + 3;2316,4345,2317;, + 3;2317,4345,4341;, + 3;4146,2424,2318;, + 3;4146,4346,2424;, + 3;2319,2544,2326;, + 3;2319,2549,2544;, + 3;2320,2343,2319;, + 3;2320,2342,2343;, + 3;2321,4347,4332;, + 3;2321,2334,4347;, + 3;2322,2719,2321;, + 3;2322,2718,2719;, + 3;2323,2542,2322;, + 3;2323,2541,2542;, + 3;2324,2569,2323;, + 3;2324,2568,2569;, + 3;2325,2563,2324;, + 3;2325,2562,2563;, + 3;2326,2556,2325;, + 3;2326,2561,2556;, + 3;4332,2322,2321;, + 3;4332,2323,2322;, + 3;4332,2324,2323;, + 3;4332,2325,2324;, + 3;4332,2326,2325;, + 3;4332,2319,2326;, + 3;4332,2320,2319;, + 3;4175,2335,2329;, + 3;4175,4348,2335;, + 3;2327,4173,4175;, + 3;2327,2362,4173;, + 3;2328,2368,2327;, + 3;2328,2367,2368;, + 3;2329,2353,2328;, + 3;2329,2352,2353;, + 3;4175,2328,2327;, + 3;4175,2329,2328;, + 3;2330,4346,4347;, + 3;2330,2425,4346;, + 3;2332,4331,2331;, + 3;2332,2703,4331;, + 3;2333,2710,2332;, + 3;2333,2709,2710;, + 3;2334,2715,2333;, + 3;2334,2719,2715;, + 3;4347,2331,2330;, + 3;4347,2332,2331;, + 3;4347,2333,2332;, + 3;4347,2334,2333;, + 3;2336,2352,2335;, + 3;2336,2351,2352;, + 3;2337,2350,2336;, + 3;2337,2349,2350;, + 3;2338,2375,2337;, + 3;2338,2379,2375;, + 3;4348,2388,2338;, + 3;4348,4349,2388;, + 3;4348,2336,2335;, + 3;4348,2337,2336;, + 3;4348,2338,2337;, + 3;2339,2549,2343;, + 3;2339,2548,2549;, + 3;2340,2551,2339;, + 3;2340,2550,2551;, + 3;2341,2364,2340;, + 3;2341,2363,2364;, + 3;2341,2340,2339;, + 3;2341,2339,2342;, + 3;2342,2339,2343;, + 3;2344,2351,2350;, + 3;2344,2356,2351;, + 3;2345,2518,2344;, + 3;2345,2517,2518;, + 3;2346,2519,2345;, + 3;2346,2523,2519;, + 3;2347,2524,2346;, + 3;2347,2530,2524;, + 3;2348,2373,2347;, + 3;2348,2372,2373;, + 3;2349,2376,2348;, + 3;2349,2375,2376;, + 3;2349,2346,2345;, + 3;2349,2345,2350;, + 3;2350,2345,2344;, + 3;2346,2349,2348;, + 3;2346,2348,2347;, + 3;2354,2367,2353;, + 3;2354,2366,2367;, + 3;2355,2507,2354;, + 3;2355,2512,2507;, + 3;2356,2513,2355;, + 3;2356,2518,2513;, + 3;2353,2355,2354;, + 3;2355,2353,2356;, + 3;2356,2353,2352;, + 3;2356,2352,2351;, + 3;2358,2381,2357;, + 3;2358,2380,2381;, + 3;2359,2535,2358;, + 3;2359,2534,2535;, + 3;2360,2538,2359;, + 3;2360,2537,2538;, + 3;2357,2360,2358;, + 3;2358,2360,2359;, + 3;2362,2369,2361;, + 3;2362,2368,2369;, + 3;4173,2362,2361;, + 3;2365,2550,2364;, + 3;2365,2555,2550;, + 3;2366,2508,2365;, + 3;2366,2507,2508;, + 3;2365,2364,2366;, + 3;2366,2364,2369;, + 3;2366,2369,2368;, + 3;2366,2368,2367;, + 3;2369,2364,2363;, + 3;2370,2531,2374;, + 3;2370,2536,2531;, + 3;2371,2385,2370;, + 3;2371,2384,2385;, + 3;2372,2377,2371;, + 3;2372,2376,2377;, + 3;2374,2530,2373;, + 3;2374,2529,2530;, + 3;2374,2373,2372;, + 3;2374,2372,2371;, + 3;2374,2371,2370;, + 3;2378,2384,2377;, + 3;2378,2383,2384;, + 3;2379,2389,2378;, + 3;2379,2388,2389;, + 3;2379,2376,2375;, + 3;2376,2379,2377;, + 3;2377,2379,2378;, + 3;2380,2536,2385;, + 3;2380,2535,2536;, + 3;2383,2390,2382;, + 3;2383,2389,2390;, + 3;2382,2380,2385;, + 3;2382,2385,2383;, + 3;2383,2385,2384;, + 3;2380,2382,2381;, + 3;4350,2427,2387;, + 3;4350,1813,2427;, + 3;4349,2389,2388;, + 3;4349,2390,2389;, + 3;4349,4329,2390;, + 3;4350,2387,2386;, + 3;2393,2397,2392;, + 3;2393,2401,2397;, + 3;2395,2412,2394;, + 3;2395,2411,2412;, + 3;4302,2396,4323;, + 3;2396,4302,2393;, + 3;2396,2393,2391;, + 3;2391,2393,2392;, + 3;4317,2397,4313;, + 3;4313,2397,2400;, + 3;2400,2397,2401;, + 3;2402,2410,2405;, + 3;2402,2409,2410;, + 3;2403,2414,2402;, + 3;2403,2413,2414;, + 3;2404,2418,2403;, + 3;2404,2417,2418;, + 3;4351,2419,2404;, + 3;4351,4306,2419;, + 3;4352,4207,4204;, + 3;4352,4353,4207;, + 3;4351,2402,2405;, + 3;4351,2403,2402;, + 3;4351,2404,2403;, + 3;2408,2423,2407;, + 3;2408,2422,2423;, + 3;4354,2415,2408;, + 3;4354,4355,2415;, + 3;4356,4357,4358;, + 3;1787,1813,4359;, + 3;1787,2412,2411;, + 3;1787,4300,2412;, + 3;4356,2407,2406;, + 3;4356,2408,2407;, + 3;4356,4354,2408;, + 3;4356,4358,4354;, + 3;2413,4311,4360;, + 3;2413,2418,4311;, + 3;88,2422,2415;, + 3;88,21,2422;, + 3;4360,2414,2413;, + 3;88,2415,4355;, + 3;2417,2420,2416;, + 3;2417,2419,2420;, + 3;4311,2418,2416;, + 3;2416,2418,2417;, + 3;4306,2420,2419;, + 3;4306,2421,2420;, + 3;21,2423,2422;, + 3;4346,2425,2424;, + 3;2428,2461,2433;, + 3;2428,2465,2461;, + 3;2433,2466,2432;, + 3;2433,2471,2466;, + 3;2429,2428,2430;, + 3;2430,2428,2433;, + 3;2430,2433,2431;, + 3;2431,2433,2432;, + 3;2434,2765,2439;, + 3;2434,2768,2765;, + 3;2437,2473,2436;, + 3;2437,2472,2473;, + 3;2439,2764,2438;, + 3;2439,2763,2764;, + 3;2436,2435,2437;, + 3;2437,2435,2434;, + 3;2437,2434,2439;, + 3;2437,2439,2438;, + 3;2440,2477,2444;, + 3;2440,2481,2477;, + 3;2441,2503,2440;, + 3;2441,2502,2503;, + 3;2442,2484,2441;, + 3;2442,2483,2484;, + 3;2442,2441,2443;, + 3;2443,2441,2444;, + 3;2444,2441,2440;, + 3;2445,2748,2450;, + 3;2445,2747,2748;, + 3;2446,2729,2445;, + 3;2446,2728,2729;, + 3;2448,2468,2447;, + 3;2448,2467,2468;, + 3;2446,2445,2447;, + 3;2447,2445,2448;, + 3;2448,2445,2449;, + 3;2449,2445,2450;, + 3;2451,2489,2456;, + 3;2451,2488,2489;, + 3;2452,2492,2451;, + 3;2452,2491,2492;, + 3;2454,2506,2453;, + 3;2454,2505,2506;, + 3;2455,2496,2454;, + 3;2455,2500,2496;, + 3;2456,2454,2451;, + 3;2451,2454,2453;, + 3;2451,2453,2452;, + 3;2454,2456,2455;, + 3;2460,2458,2457;, + 3;2458,2460,2459;, + 3;2462,2471,2461;, + 3;2462,2470,2471;, + 3;2463,2494,2462;, + 3;2463,2493,2494;, + 3;2464,2487,2463;, + 3;2464,2486,2487;, + 3;2465,2463,2461;, + 3;2461,2463,2462;, + 3;2463,2465,2464;, + 3;2470,2495,2469;, + 3;2470,2494,2495;, + 3;2467,2469,2468;, + 3;2469,2467,2470;, + 3;2470,2467,2466;, + 3;2470,2466,2471;, + 3;2475,2499,2474;, + 3;2475,2498,2499;, + 3;2476,2479,2475;, + 3;2476,2478,2479;, + 3;2474,2473,2475;, + 3;2475,2473,2472;, + 3;2475,2472,2476;, + 3;2480,2498,2479;, + 3;2480,2497,2498;, + 3;2481,2504,2480;, + 3;2481,2503,2504;, + 3;2478,2480,2479;, + 3;2480,2478,2481;, + 3;2481,2478,2477;, + 3;2485,4361,4362;, + 3;2485,2501,4361;, + 3;2482,4362,4344;, + 3;4362,2482,2485;, + 3;2488,4363,4364;, + 3;2488,2492,4363;, + 3;4334,2489,2488;, + 3;4334,2488,4364;, + 3;4342,4365,2490;, + 3;2490,4365,2491;, + 3;2491,4365,4363;, + 3;2491,4363,2492;, + 3;4366,2505,2496;, + 3;4366,4367,2505;, + 3;4337,4368,2500;, + 3;2500,4368,2496;, + 3;2496,4368,4366;, + 3;4369,2506,4367;, + 3;4367,2506,2505;, + 3;2506,4369,2501;, + 3;2501,4369,4361;, + 3;2509,2555,2508;, + 3;2509,2554,2555;, + 3;2510,2627,2509;, + 3;2510,2626,2627;, + 3;2511,2597,2510;, + 3;2511,2596,2597;, + 3;2512,2514,2511;, + 3;2512,2513,2514;, + 3;2510,2508,2511;, + 3;2511,2508,2507;, + 3;2511,2507,2512;, + 3;2508,2510,2509;, + 3;2515,2596,2514;, + 3;2515,2595,2596;, + 3;2516,2605,2515;, + 3;2516,2604,2605;, + 3;2517,2520,2516;, + 3;2517,2519,2520;, + 3;2516,2513,2518;, + 3;2516,2518,2517;, + 3;2513,2516,2515;, + 3;2513,2515,2514;, + 3;2521,2604,2520;, + 3;2521,2603,2604;, + 3;2522,2609,2521;, + 3;2522,2608,2609;, + 3;2523,2525,2522;, + 3;2523,2524,2525;, + 3;2519,2522,2521;, + 3;2519,2521,2520;, + 3;2522,2519,2523;, + 3;2526,2608,2525;, + 3;2526,2607,2608;, + 3;2527,2619,2526;, + 3;2527,2618,2619;, + 3;2528,2575,2527;, + 3;2528,2574,2575;, + 3;2529,2532,2528;, + 3;2529,2531,2532;, + 3;2527,2526,2528;, + 3;2528,2526,2529;, + 3;2529,2526,2530;, + 3;2530,2526,2525;, + 3;2530,2525,2524;, + 3;2533,2574,2532;, + 3;2533,2580,2574;, + 3;2534,2539,2533;, + 3;2534,2538,2539;, + 3;2536,2534,2531;, + 3;2531,2534,2532;, + 3;2532,2534,2533;, + 3;2534,2536,2535;, + 3;2540,2580,2539;, + 3;2540,2579,2580;, + 3;2541,2570,2540;, + 3;2541,2569,2570;, + 3;2543,2718,2542;, + 3;2543,2717,2718;, + 3;2543,2539,2538;, + 3;2543,2538,2537;, + 3;2539,2543,2540;, + 3;2540,2543,2542;, + 3;2540,2542,2541;, + 3;2545,2561,2544;, + 3;2545,2560,2561;, + 3;2546,2632,2545;, + 3;2546,2631,2632;, + 3;2547,2624,2546;, + 3;2547,2623,2624;, + 3;2548,2552,2547;, + 3;2548,2551,2552;, + 3;2546,2544,2549;, + 3;2546,2549,2547;, + 3;2547,2549,2548;, + 3;2544,2546,2545;, + 3;2553,2623,2552;, + 3;2553,2622,2623;, + 3;2554,2628,2553;, + 3;2554,2627,2628;, + 3;2554,2550,2555;, + 3;2550,2554,2551;, + 3;2551,2554,2553;, + 3;2551,2553,2552;, + 3;2557,2562,2556;, + 3;2557,2567,2562;, + 3;2558,2583,2557;, + 3;2558,2582,2583;, + 3;2559,2592,2558;, + 3;2559,2591,2592;, + 3;2560,2633,2559;, + 3;2560,2632,2633;, + 3;2560,2559,2557;, + 3;2560,2557,2556;, + 3;2560,2556,2561;, + 3;2557,2559,2558;, + 3;2564,2568,2563;, + 3;2564,2573,2568;, + 3;2565,2645,2564;, + 3;2565,2644,2645;, + 3;2566,2639,2565;, + 3;2566,2638,2639;, + 3;2567,2584,2566;, + 3;2567,2583,2584;, + 3;2565,2567,2566;, + 3;2567,2565,2564;, + 3;2567,2564,2562;, + 3;2562,2564,2563;, + 3;2571,2579,2570;, + 3;2571,2578,2579;, + 3;2572,2667,2571;, + 3;2572,2666,2667;, + 3;2573,2640,2572;, + 3;2573,2645,2640;, + 3;2572,2568,2573;, + 3;2568,2572,2569;, + 3;2569,2572,2571;, + 3;2569,2571,2570;, + 3;2576,2618,2575;, + 3;2576,2617,2618;, + 3;2577,2648,2576;, + 3;2577,2647,2648;, + 3;2578,2661,2577;, + 3;2578,2667,2661;, + 3;2576,2580,2577;, + 3;2577,2580,2579;, + 3;2577,2579,2578;, + 3;2580,2576,2574;, + 3;2574,2576,2575;, + 3;2581,2612,2589;, + 3;2581,2611,2612;, + 3;2582,2593,2581;, + 3;2582,2592,2593;, + 3;2585,2638,2584;, + 3;2585,2637,2638;, + 3;2586,2673,2585;, + 3;2586,2672,2673;, + 3;2587,2670,2586;, + 3;2587,2669,2670;, + 3;2588,2651,2587;, + 3;2588,2650,2651;, + 3;2589,2614,2588;, + 3;2589,2613,2614;, + 3;2584,2587,2585;, + 3;2585,2587,2586;, + 3;2587,2584,2582;, + 3;2587,2582,2581;, + 3;2587,2581,2588;, + 3;2588,2581,2589;, + 3;2582,2584,2583;, + 3;2590,2602,2594;, + 3;2590,2601,2602;, + 3;2591,2634,2590;, + 3;2591,2633,2634;, + 3;2594,2611,2593;, + 3;2594,2610,2611;, + 3;2592,2591,2593;, + 3;2593,2591,2590;, + 3;2593,2590,2594;, + 3;2595,2606,2599;, + 3;2595,2605,2606;, + 3;2598,2626,2597;, + 3;2598,2629,2626;, + 3;2599,2621,2598;, + 3;2599,2620,2621;, + 3;2597,2596,2598;, + 3;2598,2596,2599;, + 3;2599,2596,2595;, + 3;2600,2620,2606;, + 3;2600,2625,2620;, + 3;2601,2630,2600;, + 3;2601,2634,2630;, + 3;2603,2610,2602;, + 3;2603,2609,2610;, + 3;2604,2602,2605;, + 3;2605,2602,2601;, + 3;2605,2601,2606;, + 3;2606,2601,2600;, + 3;2602,2604,2603;, + 3;2607,2613,2612;, + 3;2607,2619,2613;, + 3;2609,2608,2610;, + 3;2610,2608,2612;, + 3;2610,2612,2611;, + 3;2612,2608,2607;, + 3;2615,2650,2614;, + 3;2615,2654,2650;, + 3;2616,2656,2615;, + 3;2616,2655,2656;, + 3;2617,2649,2616;, + 3;2617,2648,2649;, + 3;2618,2616,2619;, + 3;2619,2616,2615;, + 3;2619,2615,2614;, + 3;2619,2614,2613;, + 3;2616,2618,2617;, + 3;2622,2629,2621;, + 3;2622,2628,2629;, + 3;2625,2631,2624;, + 3;2625,2630,2631;, + 3;2624,2623,2625;, + 3;2625,2623,2621;, + 3;2625,2621,2620;, + 3;2621,2623,2622;, + 3;2627,2626,2628;, + 3;2628,2626,2629;, + 3;2633,2632,2631;, + 3;2633,2631,2630;, + 3;2633,2630,2634;, + 3;2635,2644,2639;, + 3;2635,2643,2644;, + 3;2636,2678,2635;, + 3;2636,2677,2678;, + 3;2637,2674,2636;, + 3;2637,2673,2674;, + 3;2638,2637,2639;, + 3;2639,2637,2635;, + 3;2635,2637,2636;, + 3;2641,2666,2640;, + 3;2641,2665,2666;, + 3;2642,2695,2641;, + 3;2642,2694,2695;, + 3;2643,2679,2642;, + 3;2643,2678,2679;, + 3;2640,2645,2644;, + 3;2640,2644,2643;, + 3;2640,2643,2641;, + 3;2641,2643,2642;, + 3;2646,2655,2649;, + 3;2646,2660,2655;, + 3;2647,2662,2646;, + 3;2647,2661,2662;, + 3;2648,2647,2649;, + 3;2649,2647,2646;, + 3;2652,2669,2651;, + 3;2652,2668,2669;, + 3;2653,2688,2652;, + 3;2653,2687,2688;, + 3;2654,2657,2653;, + 3;2654,2656,2657;, + 3;2650,2654,2653;, + 3;2650,2653,2651;, + 3;2651,2653,2652;, + 3;2658,2687,2657;, + 3;2658,2686,2687;, + 3;2659,2693,2658;, + 3;2659,2692,2693;, + 3;2660,2663,2659;, + 3;2660,2662,2663;, + 3;2656,2659,2657;, + 3;2657,2659,2658;, + 3;2659,2656,2660;, + 3;2660,2656,2655;, + 3;2664,2692,2663;, + 3;2664,2691,2692;, + 3;2665,2696,2664;, + 3;2665,2695,2696;, + 3;2662,2666,2665;, + 3;2662,2665,2663;, + 3;2663,2665,2664;, + 3;2666,2662,2667;, + 3;2667,2662,2661;, + 3;2668,2683,2671;, + 3;2668,2688,2683;, + 3;2671,2672,2670;, + 3;2671,2676,2672;, + 3;2671,2670,2668;, + 3;2668,2670,2669;, + 3;2675,2677,2674;, + 3;2675,2682,2677;, + 3;2676,2684,2675;, + 3;2676,2683,2684;, + 3;2675,2674,2676;, + 3;2676,2674,2672;, + 3;2672,2674,2673;, + 3;2680,2694,2679;, + 3;2680,2697,2694;, + 3;2681,2690,2680;, + 3;2681,2689,2690;, + 3;2682,2685,2681;, + 3;2682,2684,2685;, + 3;2680,2679,2681;, + 3;2681,2679,2682;, + 3;2682,2679,2677;, + 3;2677,2679,2678;, + 3;2686,2689,2685;, + 3;2686,2693,2689;, + 3;2685,2683,2688;, + 3;2685,2688,2686;, + 3;2686,2688,2687;, + 3;2683,2685,2684;, + 3;2691,2697,2690;, + 3;2691,2696,2697;, + 3;2689,2693,2690;, + 3;2690,2693,2691;, + 3;2691,2693,2692;, + 3;2697,2696,2694;, + 3;2694,2696,2695;, + 3;2699,2714,2698;, + 3;2699,2713,2714;, + 3;2701,2698,2702;, + 3;2698,2701,2699;, + 3;2699,2701,2700;, + 3;2703,2711,2707;, + 3;2703,2710,2711;, + 3;2704,2706,2705;, + 3;2707,4331,2703;, + 3;2706,2704,4325;, + 3;2709,2716,2708;, + 3;2709,2715,2716;, + 3;2709,2712,2711;, + 3;2709,2711,2710;, + 3;2712,2709,2713;, + 3;2713,2709,2714;, + 3;2714,2709,2708;, + 3;2718,2717,2716;, + 3;2718,2716,2719;, + 3;2719,2716,2715;, + 3;2721,2767,2720;, + 3;2721,2766,2767;, + 3;2722,2761,2721;, + 3;2721,2761,2762;, + 3;2722,2721,2720;, + 3;2722,2720,2725;, + 3;2722,2725,2723;, + 3;2723,2725,2724;, + 3;2727,2753,2726;, + 3;2727,2752,2753;, + 3;2730,2747,2729;, + 3;2730,2746,2747;, + 3;2732,2733,2731;, + 3;2732,2738,2733;, + 3;2728,2731,2729;, + 3;2729,2731,2730;, + 3;2731,2728,2727;, + 3;2731,2727,2732;, + 3;2732,2727,2726;, + 3;2735,3387,2734;, + 3;2735,3386,3387;, + 3;2736,2824,2735;, + 3;2736,2823,2824;, + 3;2737,2742,2736;, + 3;2737,2741,2742;, + 3;2734,2733,2735;, + 3;2735,2733,2738;, + 3;2735,2738,2736;, + 3;2736,2738,2737;, + 3;2743,2823,2742;, + 3;2743,2822,2823;, + 3;2744,2942,2743;, + 3;2744,2941,2942;, + 3;2742,2741,2744;, + 3;2742,2744,2743;, + 3;2744,2741,2739;, + 3;2739,2741,2740;, + 3;1883,2746,2745;, + 3;1883,2747,2746;, + 3;1883,2748,2747;, + 3;2750,2758,2749;, + 3;2750,2757,2758;, + 3;2753,2750,2749;, + 3;2750,2753,2751;, + 3;2751,2753,2752;, + 3;2756,2760,2755;, + 3;2756,2759,2760;, + 3;2757,2755,2758;, + 3;2758,2755,2754;, + 3;2755,2757,2756;, + 3;2763,2766,2762;, + 3;2763,2765,2766;, + 3;2759,2762,2761;, + 3;2759,2761,2760;, + 3;2762,2759,2764;, + 3;2762,2764,2763;, + 3;2765,2767,2766;, + 3;2767,2765,2768;, + 3;2771,3118,2770;, + 3;2771,3117,3118;, + 3;4370,2865,2771;, + 3;4370,4371,2865;, + 3;2773,3053,2772;, + 3;2773,3052,3053;, + 3;2774,3057,4372;, + 3;2773,4373,3058;, + 3;2774,2770,2769;, + 3;2770,2774,2771;, + 3;2771,2774,4372;, + 3;2771,4372,4370;, + 3;2775,3044,2780;, + 3;2775,3048,3044;, + 3;1886,3085,2775;, + 3;1886,1944,3085;, + 3;2776,1918,1886;, + 3;2776,3064,1918;, + 3;2777,4374,4375;, + 3;2777,3054,4374;, + 3;2778,2863,2777;, + 3;2778,2862,2863;, + 3;2779,3359,2778;, + 3;2779,3358,3359;, + 3;4376,2789,2779;, + 3;4376,4377,2789;, + 3;4378,2777,4375;, + 3;4378,2778,2777;, + 3;4378,2779,2778;, + 3;4378,4376,2779;, + 3;1886,2775,2780;, + 3;2781,3369,2788;, + 3;2781,3368,3369;, + 3;2782,2857,4379;, + 3;2781,4380,2858;, + 3;2783,2860,2782;, + 3;2783,2869,2860;, + 3;2784,3384,2783;, + 3;2784,3383,3384;, + 3;2785,3412,2784;, + 3;2785,3415,3412;, + 3;2786,3093,2785;, + 3;2786,3098,3093;, + 3;2787,2808,2786;, + 3;2787,2807,2808;, + 3;4381,3362,2787;, + 3;4381,4382,3362;, + 3;4381,2785,4379;, + 3;4379,2785,2784;, + 3;4379,2784,2782;, + 3;2782,2784,2783;, + 3;2785,4381,2786;, + 3;2786,4381,2787;, + 3;2790,3358,2789;, + 3;2790,3357,3358;, + 3;2791,3373,2790;, + 3;2791,3372,3373;, + 3;2792,3378,2791;, + 3;2792,3377,3378;, + 3;2793,3197,2792;, + 3;2793,3196,3197;, + 3;2794,3017,2793;, + 3;2794,3016,3017;, + 3;2795,3041,2794;, + 3;2795,3040,3041;, + 3;4377,3045,2795;, + 3;4377,4383,3045;, + 3;2794,2793,2795;, + 3;2795,2793,4377;, + 3;4377,2793,2792;, + 3;4377,2792,2789;, + 3;2789,2792,2791;, + 3;2789,2791,2790;, + 3;2797,4384,4385;, + 3;2802,2991,2987;, + 3;2798,4384,2797;, + 3;2798,3363,4384;, + 3;2799,2806,2798;, + 3;2799,2815,2806;, + 3;2800,3090,2799;, + 3;2800,3089,3090;, + 3;1891,2945,2800;, + 3;1891,1893,2945;, + 3;4253,4386,4387;, + 3;4253,2974,4386;, + 3;2802,3082,4253;, + 3;2802,3083,3082;, + 3;1891,4385,2801;, + 3;1891,2797,4385;, + 3;1891,2798,2797;, + 3;1891,2799,2798;, + 3;1891,2800,2799;, + 3;2803,4388,4389;, + 3;2803,3020,4388;, + 3;2804,3022,2803;, + 3;2804,3021,3022;, + 3;2805,2997,2804;, + 3;2805,2996,2997;, + 3;4389,2982,2805;, + 3;4389,4390,2982;, + 3;4389,2804,2803;, + 3;4389,2805,2804;, + 3;2807,3363,2806;, + 3;2807,3362,3363;, + 3;2809,3098,2808;, + 3;2809,3097,3098;, + 3;2810,3135,2809;, + 3;2810,3134,3135;, + 3;2811,4391,4392;, + 3;2811,3159,4391;, + 3;2812,3110,2811;, + 3;2812,3115,3110;, + 3;4393,3148,2812;, + 3;4393,4394,3148;, + 3;2814,3122,2813;, + 3;2814,3121,3122;, + 3;2815,3091,2814;, + 3;2815,3090,3091;, + 3;2806,2810,2809;, + 3;2806,2809,2807;, + 3;2807,2809,2808;, + 3;2810,2806,4395;, + 3;4395,2806,4396;, + 3;4396,2806,2813;, + 3;2813,2806,2814;, + 3;2814,2806,2815;, + 3;2816,3400,2825;, + 3;2816,3399,3400;, + 3;2817,3404,2816;, + 3;2816,3404,3405;, + 3;2818,2892,2817;, + 3;2818,2891,2892;, + 3;2819,2899,2818;, + 3;2819,2898,2899;, + 3;2820,2905,2819;, + 3;2820,2904,2905;, + 3;2821,2883,2820;, + 3;2821,2887,2883;, + 3;2822,2943,2821;, + 3;2822,2942,2943;, + 3;2825,3386,2824;, + 3;2825,3385,3386;, + 3;2817,2819,2818;, + 3;2819,2817,2820;, + 3;2820,2817,2821;, + 3;2821,2817,2816;, + 3;2821,2816,2822;, + 3;2822,2816,2825;, + 3;2822,2825,2823;, + 3;2823,2825,2824;, + 3;2826,2843,2832;, + 3;2826,2842,2843;, + 3;2827,2854,2826;, + 3;2827,2853,2854;, + 3;2830,2909,2829;, + 3;2830,2908,2909;, + 3;2831,2915,2830;, + 3;2831,2914,2915;, + 3;2832,2889,2831;, + 3;2832,2888,2889;, + 3;2830,2829,2832;, + 3;2830,2832,2831;, + 3;2832,2829,2827;, + 3;2832,2827,2826;, + 3;2827,2829,2828;, + 3;2833,2896,2838;, + 3;2833,2895,2896;, + 3;2834,3380,2833;, + 3;2834,3379,3380;, + 3;2835,2868,2834;, + 3;2835,2867,2868;, + 3;2836,2848,2835;, + 3;2836,2847,2848;, + 3;2838,2840,2837;, + 3;2838,2839,2840;, + 3;2835,2834,2836;, + 3;2836,2834,2837;, + 3;2837,2834,2838;, + 3;2838,2834,2833;, + 3;2839,2888,2843;, + 3;2839,2896,2888;, + 3;2842,2855,2841;, + 3;2842,2854,2855;, + 3;2842,2840,2839;, + 3;2842,2839,2843;, + 3;2840,2842,2841;, + 3;2844,3116,2849;, + 3;2844,3119,3116;, + 3;2849,2867,2848;, + 3;2849,2866,2867;, + 3;2847,2849,2848;, + 3;2849,2847,2844;, + 3;2844,2847,2846;, + 3;2844,2846,2845;, + 3;2851,2855,2852;, + 3;2852,2855,2853;, + 3;2853,2855,2854;, + 3;2855,2851,2850;, + 3;2856,3361,2859;, + 3;2856,3360,3361;, + 3;4380,2861,2856;, + 3;2857,2860,4397;, + 3;2859,3368,2858;, + 3;2859,3367,3368;, + 3;4380,2856,2859;, + 3;4380,2859,2858;, + 3;2862,3360,2861;, + 3;2862,3359,3360;, + 3;2864,3054,2863;, + 3;2864,3053,3054;, + 3;2866,3117,2865;, + 3;2866,3116,3117;, + 3;2869,3379,2868;, + 3;2869,3384,3379;, + 3;2867,2866,2865;, + 3;2867,2865,2868;, + 3;2868,2865,4371;, + 3;2868,4371,4397;, + 3;2868,4397,2860;, + 3;2868,2860,2869;, + 3;2861,2864,2863;, + 3;2861,2863,2862;, + 3;2873,2940,2872;, + 3;2873,2939,2940;, + 3;2874,2886,2873;, + 3;2874,2885,2886;, + 3;2875,2919,2874;, + 3;2875,2918,2919;, + 3;2876,2925,2875;, + 3;2876,2924,2925;, + 3;2877,2879,2876;, + 3;2877,2878,2879;, + 3;2874,2876,2875;, + 3;2876,2874,2873;, + 3;2876,2873,2872;, + 3;2876,2872,2877;, + 3;2877,2872,2871;, + 3;2877,2871,2870;, + 3;2880,2924,2879;, + 3;2880,2923,2924;, + 3;2881,2930,2880;, + 3;2881,2929,2930;, + 3;2878,2880,2879;, + 3;2880,2878,2881;, + 3;2881,2878,2882;, + 3;2884,2904,2883;, + 3;2884,2903,2904;, + 3;2885,2920,2884;, + 3;2885,2919,2920;, + 3;2887,2939,2886;, + 3;2887,2943,2939;, + 3;2886,2885,2887;, + 3;2887,2885,2884;, + 3;2887,2884,2883;, + 3;2890,2914,2889;, + 3;2890,2913,2914;, + 3;2891,2900,2890;, + 3;2891,2899,2900;, + 3;2893,3404,2817;, + 3;2893,3403,3404;, + 3;2894,3409,2893;, + 3;2894,3408,3409;, + 3;2895,3381,2894;, + 3;2895,3380,3381;, + 3;2890,2889,2891;, + 3;2891,2889,2892;, + 3;2892,2889,2888;, + 3;2892,2888,2893;, + 3;2893,2888,2895;, + 3;2893,2895,2894;, + 3;2895,2888,2896;, + 3;2897,2938,2901;, + 3;2897,2937,2938;, + 3;2898,2906,2897;, + 3;2898,2905,2906;, + 3;2901,2913,2900;, + 3;2901,2912,2913;, + 3;2899,2898,2900;, + 3;2900,2898,2897;, + 3;2900,2897,2901;, + 3;2902,2937,2906;, + 3;2902,2936,2937;, + 3;2903,2921,2902;, + 3;2903,2920,2921;, + 3;2902,2906,2903;, + 3;2903,2906,2904;, + 3;2904,2906,2905;, + 3;2907,2933,2911;, + 3;2907,2932,2933;, + 3;2908,2916,2907;, + 3;2908,2915,2916;, + 3;2911,2928,2910;, + 3;2911,2927,2928;, + 3;2908,2907,2911;, + 3;2908,2911,2909;, + 3;2909,2911,2910;, + 3;2912,2932,2916;, + 3;2912,2938,2932;, + 3;2916,2914,2912;, + 3;2912,2914,2913;, + 3;2914,2916,2915;, + 3;2917,2936,2921;, + 3;2917,2935,2936;, + 3;2918,2926,2917;, + 3;2918,2925,2926;, + 3;2918,2920,2919;, + 3;2920,2918,2921;, + 3;2921,2918,2917;, + 3;2922,2935,2926;, + 3;2922,2934,2935;, + 3;2923,2931,2922;, + 3;2923,2930,2931;, + 3;2926,2923,2922;, + 3;2923,2926,2925;, + 3;2923,2925,2924;, + 3;2927,2934,2931;, + 3;2927,2933,2934;, + 3;2931,2928,2927;, + 3;2928,2931,2930;, + 3;2928,2930,2929;, + 3;2934,2933,2935;, + 3;2935,2933,2938;, + 3;2935,2938,2937;, + 3;2935,2937,2936;, + 3;2938,2933,2932;, + 3;2939,2943,2942;, + 3;2939,2942,2940;, + 3;2940,2942,2941;, + 3;2944,3104,2947;, + 3;2944,3109,3104;, + 3;1893,3395,2944;, + 3;1893,2014,3395;, + 3;2946,3089,2945;, + 3;2946,3088,3089;, + 3;2947,2954,2946;, + 3;2947,2953,2954;, + 3;1893,2946,2945;, + 3;1893,2947,2946;, + 3;1893,2944,2947;, + 3;2948,3144,2952;, + 3;2948,3143,3144;, + 3;2949,2967,2948;, + 3;2949,2966,2967;, + 3;2950,3153,2949;, + 3;2950,3152,3153;, + 3;2951,3113,2950;, + 3;2951,3112,3113;, + 3;2952,3161,2951;, + 3;2952,3160,3161;, + 3;2950,2952,2951;, + 3;2952,2950,2949;, + 3;2952,2949,2948;, + 3;2953,3105,2956;, + 3;2953,3104,3105;, + 3;2955,3088,2954;, + 3;2955,3087,3088;, + 3;2956,3129,2955;, + 3;2956,3128,3129;, + 3;2953,2956,2955;, + 3;2953,2955,2954;, + 3;2957,3096,2964;, + 3;2957,3095,3096;, + 3;2958,3411,2957;, + 3;2958,3410,3411;, + 3;2959,3402,2958;, + 3;2959,3401,3402;, + 3;2960,3398,2959;, + 3;2960,3397,3398;, + 3;2961,2970,2960;, + 3;2961,2969,2970;, + 3;2962,3099,2961;, + 3;2962,3103,3099;, + 3;2963,3136,2962;, + 3;2963,3140,3136;, + 3;2964,3132,2963;, + 3;2964,3131,3132;, + 3;2958,2962,2959;, + 3;2959,2962,2960;, + 3;2960,2962,2961;, + 3;2962,2958,2957;, + 3;2962,2957,2963;, + 3;2963,2957,2964;, + 3;2965,3127,2973;, + 3;2965,3126,3127;, + 3;4398,3154,2965;, + 3;2966,3153,4399;, + 3;2968,3142,4400;, + 3;2967,4401,3143;, + 3;2969,3100,2968;, + 3;2969,3099,3100;, + 3;2971,3397,2970;, + 3;2971,3396,3397;, + 3;2972,3391,2971;, + 3;2972,3390,3391;, + 3;2973,3107,2972;, + 3;2973,3106,3107;, + 3;2971,2968,2972;, + 3;2972,2968,4400;, + 3;2972,4400,2973;, + 3;2973,4400,4398;, + 3;2973,4398,2965;, + 3;2968,2971,2969;, + 3;2969,2971,2970;, + 3;2974,4402,4386;, + 3;2974,3082,4402;, + 3;2975,2996,2982;, + 3;2975,3000,2996;, + 3;2976,3208,2975;, + 3;2976,3207,3208;, + 3;2977,3220,2976;, + 3;2977,3219,3220;, + 3;2978,3221,2977;, + 3;2978,3226,3221;, + 3;2979,3227,2978;, + 3;2979,3232,3227;, + 3;2980,3199,2979;, + 3;2980,3198,3199;, + 3;2981,3376,2980;, + 3;2981,3375,3376;, + 3;4390,2988,2981;, + 3;4390,4403,2988;, + 3;4390,2975,2982;, + 3;4390,2976,2975;, + 3;4390,2977,2976;, + 3;4390,2978,2977;, + 3;4390,2979,2978;, + 3;4390,2980,2979;, + 3;4390,2981,2980;, + 3;2983,3011,2986;, + 3;2983,3010,3011;, + 3;2984,3024,2983;, + 3;2984,3023,3024;, + 3;2985,3019,2984;, + 3;2985,3018,3019;, + 3;4404,3084,2985;, + 3;4404,4405,3084;, + 3;2986,4406,4404;, + 3;2986,2995,4406;, + 3;4404,2983,2986;, + 3;4404,2984,2983;, + 3;4404,2985,2984;, + 3;4403,3083,2987;, + 3;4403,4402,3083;, + 3;2989,3375,2988;, + 3;2989,3374,3375;, + 3;2990,3371,2989;, + 3;2990,3370,3371;, + 3;2991,3365,2990;, + 3;2991,3364,3365;, + 3;4403,2989,2988;, + 3;4403,2990,2989;, + 3;4403,2991,2990;, + 3;4403,2987,2991;, + 3;2992,4407,4406;, + 3;2992,3047,4407;, + 3;2993,3034,2992;, + 3;2993,3033,3034;, + 3;2994,3003,2993;, + 3;2994,3002,3003;, + 3;2995,3012,2994;, + 3;2995,3011,3012;, + 3;4406,2993,2992;, + 3;4406,2994,2993;, + 3;4406,2995,2994;, + 3;2998,3021,2997;, + 3;2998,3027,3021;, + 3;2999,3209,2998;, + 3;2999,3214,3209;, + 3;3000,3203,2999;, + 3;3000,3208,3203;, + 3;2997,2999,2998;, + 3;2999,2997,2996;, + 3;2999,2996,3000;, + 3;3001,3172,3007;, + 3;3001,3177,3172;, + 3;3002,3013,3001;, + 3;3002,3012,3013;, + 3;3004,3033,3003;, + 3;3004,3037,3033;, + 3;3005,3031,3004;, + 3;3005,3030,3031;, + 3;3006,3184,3005;, + 3;3006,3183,3184;, + 3;3007,3182,3006;, + 3;3007,3181,3182;, + 3;3003,3006,3004;, + 3;3004,3006,3005;, + 3;3006,3003,3007;, + 3;3007,3003,3002;, + 3;3007,3002,3001;, + 3;3008,3177,3013;, + 3;3008,3176,3177;, + 3;3009,3171,3008;, + 3;3009,3170,3171;, + 3;3010,3025,3009;, + 3;3010,3024,3025;, + 3;3010,3008,3013;, + 3;3010,3013,3011;, + 3;3011,3013,3012;, + 3;3008,3010,3009;, + 3;3014,3196,3017;, + 3;3014,3202,3196;, + 3;3015,3191,3014;, + 3;3015,3190,3191;, + 3;3016,3042,3015;, + 3;3016,3041,3042;, + 3;3016,3015,3017;, + 3;3017,3015,3014;, + 3;3018,4405,4388;, + 3;3018,3084,4405;, + 3;3020,3023,3019;, + 3;3020,3022,3023;, + 3;4388,3019,3018;, + 3;4388,3020,3019;, + 3;3026,3170,3025;, + 3;3026,3169,3170;, + 3;3027,3210,3026;, + 3;3027,3209,3210;, + 3;3026,3025,3027;, + 3;3027,3025,3022;, + 3;3027,3022,3021;, + 3;3022,3025,3023;, + 3;3023,3025,3024;, + 3;3028,3038,3032;, + 3;3028,3043,3038;, + 3;3029,3195,3028;, + 3;3029,3194,3195;, + 3;3030,3185,3029;, + 3;3030,3184,3185;, + 3;3032,3037,3031;, + 3;3032,3036,3037;, + 3;3029,3031,3030;, + 3;3031,3029,3032;, + 3;3032,3029,3028;, + 3;3035,3047,3034;, + 3;3035,3046,3047;, + 3;3036,3039,3035;, + 3;3036,3038,3039;, + 3;3034,3037,3036;, + 3;3034,3036,3035;, + 3;3037,3034,3033;, + 3;3040,3046,3039;, + 3;3040,3045,3046;, + 3;3043,3190,3042;, + 3;3043,3195,3190;, + 3;3040,3042,3041;, + 3;3042,3040,3043;, + 3;3043,3040,3039;, + 3;3043,3039,3038;, + 3;3048,1944,4408;, + 3;3048,3085,1944;, + 3;4408,3044,3048;, + 3;4407,3045,4383;, + 3;4407,3046,3045;, + 3;4407,3047,3046;, + 3;3050,3064,3049;, + 3;3050,3070,3064;, + 3;3052,3059,3051;, + 3;3052,3058,3059;, + 3;4297,3054,3051;, + 3;3051,3054,3053;, + 3;3051,3053,3052;, + 3;3054,4297,4374;, + 3;4373,4314,3058;, + 3;3058,4314,3055;, + 3;3058,3055,3059;, + 3;3060,3073,3063;, + 3;3060,3072,3073;, + 3;3061,3066,3060;, + 3;3061,3065,3066;, + 3;4409,3086,3061;, + 3;4295,4293,4410;, + 3;3062,4308,4409;, + 3;3062,3077,4308;, + 3;3063,3075,3062;, + 3;3063,3074,3075;, + 3;4409,3063,3062;, + 3;4409,3060,3063;, + 3;4409,3061,3060;, + 3;4411,1944,1918;, + 3;4411,4412,1944;, + 3;3067,4413,4414;, + 3;3067,3071,4413;, + 3;3068,3081,3067;, + 3;3068,3080,3081;, + 3;4415,4414,4416;, + 3;4415,3067,4414;, + 3;4415,3068,3067;, + 3;4415,3069,3068;, + 3;1918,3070,4299;, + 3;1918,3064,3070;, + 3;3071,151,3755;, + 3;3071,3081,151;, + 3;4417,3074,3073;, + 3;4417,4309,3074;, + 3;3755,4413,3071;, + 3;4417,3073,3072;, + 3;3076,3077,3075;, + 3;3076,3079,3077;, + 3;4309,3076,3074;, + 3;3074,3076,3075;, + 3;4308,3079,3078;, + 3;4308,3077,3079;, + 3;151,3081,3080;, + 3;4402,3082,3083;, + 3;3087,3130,3092;, + 3;3087,3129,3130;, + 3;3092,3121,3091;, + 3;3092,3120,3121;, + 3;3090,3089,3091;, + 3;3091,3089,3092;, + 3;3092,3089,3088;, + 3;3092,3088,3087;, + 3;3094,3415,3093;, + 3;3094,3414,3415;, + 3;3095,3406,3094;, + 3;3095,3411,3406;, + 3;3097,3131,3096;, + 3;3097,3135,3131;, + 3;3097,3096,3098;, + 3;3098,3096,3093;, + 3;3093,3096,3094;, + 3;3094,3096,3095;, + 3;3101,3142,3100;, + 3;3101,3141,3142;, + 3;3102,3165,3101;, + 3;3102,3164,3165;, + 3;3103,3137,3102;, + 3;3103,3136,3137;, + 3;3100,3099,3101;, + 3;3101,3099,3103;, + 3;3101,3103,3102;, + 3;3106,3128,3105;, + 3;3106,3127,3128;, + 3;3108,3390,3107;, + 3;3108,3389,3390;, + 3;3109,3392,3108;, + 3;3109,3395,3392;, + 3;3107,3106,3108;, + 3;3108,3106,3105;, + 3;3108,3105,3104;, + 3;3108,3104,3109;, + 3;3111,3159,3110;, + 3;3111,3158,3159;, + 3;3112,3162,3111;, + 3;3112,3161,3162;, + 3;3114,3152,3113;, + 3;3114,3151,3152;, + 3;3115,3145,3114;, + 3;3115,3148,3145;, + 3;3115,3111,3110;, + 3;3111,3115,3114;, + 3;3111,3114,3112;, + 3;3112,3114,3113;, + 3;3117,3119,3118;, + 3;3119,3117,3116;, + 3;3120,3125,3124;, + 3;3120,3130,3125;, + 3;3123,3147,3122;, + 3;3123,3146,3147;, + 3;3124,3150,3123;, + 3;3124,3149,3150;, + 3;3121,3123,3122;, + 3;3123,3121,3120;, + 3;3123,3120,3124;, + 3;3126,3149,3125;, + 3;3126,3154,3149;, + 3;3128,3126,3125;, + 3;3128,3125,3129;, + 3;3129,3125,3130;, + 3;3126,3128,3127;, + 3;3133,3140,3132;, + 3;3133,3139,3140;, + 3;3134,3156,3133;, + 3;3134,3155,3156;, + 3;3134,3133,3135;, + 3;3135,3133,3131;, + 3;3131,3133,3132;, + 3;3138,3164,3137;, + 3;3138,3163,3164;, + 3;3139,3157,3138;, + 3;3139,3156,3157;, + 3;3140,3138,3137;, + 3;3140,3137,3136;, + 3;3138,3140,3139;, + 3;4418,3160,3144;, + 3;4418,4419,3160;, + 3;3143,4401,4418;, + 3;3143,4418,3144;, + 3;4420,3151,3145;, + 3;4420,4421,3151;, + 3;4394,3145,3148;, + 3;3145,4394,4420;, + 3;4399,3153,4422;, + 3;4422,3153,3152;, + 3;4422,3152,4421;, + 3;4421,3152,3151;, + 3;3158,4423,4424;, + 3;3158,3162,4423;, + 3;4391,3159,4425;, + 3;4425,3159,3158;, + 3;4425,3158,4424;, + 3;4426,4423,3161;, + 3;4426,3161,3160;, + 3;4426,3160,4419;, + 3;3161,4423,3162;, + 3;3166,3176,3171;, + 3;3166,3175,3176;, + 3;3167,3256,3166;, + 3;3167,3255,3256;, + 3;3168,3287,3167;, + 3;3168,3286,3287;, + 3;3169,3211,3168;, + 3;3169,3210,3211;, + 3;3167,3169,3168;, + 3;3169,3167,3166;, + 3;3169,3166,3170;, + 3;3170,3166,3171;, + 3;3173,3181,3172;, + 3;3173,3180,3181;, + 3;3174,3260,3173;, + 3;3174,3259,3260;, + 3;3175,3257,3174;, + 3;3175,3256,3257;, + 3;3173,3176,3174;, + 3;3174,3176,3175;, + 3;3176,3173,3177;, + 3;3177,3173,3172;, + 3;3178,3183,3182;, + 3;3178,3189,3183;, + 3;3179,3269,3178;, + 3;3179,3268,3269;, + 3;3180,3261,3179;, + 3;3180,3260,3261;, + 3;3181,3178,3182;, + 3;3178,3181,3179;, + 3;3179,3181,3180;, + 3;3186,3194,3185;, + 3;3186,3193,3194;, + 3;3187,3233,3186;, + 3;3187,3239,3233;, + 3;3188,3274,3187;, + 3;3188,3273,3274;, + 3;3189,3270,3188;, + 3;3189,3269,3270;, + 3;3187,3186,3188;, + 3;3188,3186,3185;, + 3;3188,3185,3184;, + 3;3188,3184,3189;, + 3;3189,3184,3183;, + 3;3192,3202,3191;, + 3;3192,3201,3202;, + 3;3193,3234,3192;, + 3;3193,3233,3234;, + 3;3195,3191,3190;, + 3;3191,3195,3194;, + 3;3191,3194,3193;, + 3;3191,3193,3192;, + 3;3198,3377,3197;, + 3;3198,3376,3377;, + 3;3200,3232,3199;, + 3;3200,3231,3232;, + 3;3201,3235,3200;, + 3;3201,3234,3235;, + 3;3197,3201,3200;, + 3;3197,3200,3198;, + 3;3198,3200,3199;, + 3;3201,3197,3202;, + 3;3202,3197,3196;, + 3;3204,3214,3203;, + 3;3204,3213,3214;, + 3;3205,3282,3204;, + 3;3205,3281,3282;, + 3;3206,3291,3205;, + 3;3206,3290,3291;, + 3;3207,3215,3206;, + 3;3207,3220,3215;, + 3;3205,3207,3206;, + 3;3207,3205,3208;, + 3;3208,3205,3204;, + 3;3208,3204,3203;, + 3;3212,3286,3211;, + 3;3212,3285,3286;, + 3;3213,3283,3212;, + 3;3213,3282,3283;, + 3;3211,3209,3214;, + 3;3211,3214,3212;, + 3;3212,3214,3213;, + 3;3209,3211,3210;, + 3;3216,3290,3215;, + 3;3216,3289,3290;, + 3;3217,3253,3216;, + 3;3217,3252,3253;, + 3;3218,3246,3217;, + 3;3218,3245,3246;, + 3;3219,3222,3218;, + 3;3219,3221,3222;, + 3;3215,3218,3216;, + 3;3216,3218,3217;, + 3;3218,3215,3219;, + 3;3219,3215,3220;, + 3;3223,3245,3222;, + 3;3223,3244,3245;, + 3;3224,3294,3223;, + 3;3224,3298,3294;, + 3;3225,3299,3224;, + 3;3225,3304,3299;, + 3;3226,3228,3225;, + 3;3226,3227,3228;, + 3;3224,3222,3225;, + 3;3225,3222,3221;, + 3;3225,3221,3226;, + 3;3222,3224,3223;, + 3;3229,3304,3228;, + 3;3229,3303,3304;, + 3;3230,3322,3229;, + 3;3230,3321,3322;, + 3;3231,3236,3230;, + 3;3231,3235,3236;, + 3;3229,3228,3227;, + 3;3229,3227,3232;, + 3;3229,3232,3230;, + 3;3230,3232,3231;, + 3;3237,3321,3236;, + 3;3237,3320,3321;, + 3;3238,3306,3237;, + 3;3238,3305,3306;, + 3;3239,3275,3238;, + 3;3239,3274,3275;, + 3;3238,3237,3234;, + 3;3238,3234,3233;, + 3;3238,3233,3239;, + 3;3234,3237,3235;, + 3;3235,3237,3236;, + 3;3240,3272,3248;, + 3;3240,3278,3272;, + 3;3241,3312,3240;, + 3;3241,3311,3312;, + 3;3242,3328,3241;, + 3;3242,3327,3328;, + 3;3243,3334,3242;, + 3;3243,3333,3334;, + 3;3244,3295,3243;, + 3;3244,3294,3295;, + 3;3247,3252,3246;, + 3;3247,3251,3252;, + 3;3248,3266,3247;, + 3;3248,3271,3266;, + 3;3244,3241,3246;, + 3;3244,3246,3245;, + 3;3246,3241,3247;, + 3;3247,3241,3240;, + 3;3247,3240,3248;, + 3;3241,3244,3243;, + 3;3241,3243,3242;, + 3;3249,3289,3253;, + 3;3249,3293,3289;, + 3;3250,3263,3249;, + 3;3250,3262,3263;, + 3;3251,3267,3250;, + 3;3251,3266,3267;, + 3;3252,3251,3253;, + 3;3253,3251,3249;, + 3;3249,3251,3250;, + 3;3254,3279,3258;, + 3;3254,3284,3279;, + 3;3255,3288,3254;, + 3;3255,3287,3288;, + 3;3258,3259,3257;, + 3;3258,3265,3259;, + 3;3255,3254,3256;, + 3;3256,3254,3258;, + 3;3256,3258,3257;, + 3;3262,3268,3261;, + 3;3262,3267,3268;, + 3;3264,3293,3263;, + 3;3264,3292,3293;, + 3;3265,3280,3264;, + 3;3265,3279,3280;, + 3;3260,3259,3262;, + 3;3260,3262,3261;, + 3;3262,3259,3263;, + 3;3263,3259,3265;, + 3;3263,3265,3264;, + 3;3271,3273,3270;, + 3;3271,3272,3273;, + 3;3268,3267,3269;, + 3;3269,3267,3271;, + 3;3269,3271,3270;, + 3;3271,3267,3266;, + 3;3276,3305,3275;, + 3;3276,3308,3305;, + 3;3277,3314,3276;, + 3;3277,3319,3314;, + 3;3278,3313,3277;, + 3;3278,3312,3313;, + 3;3274,3276,3275;, + 3;3276,3274,3273;, + 3;3276,3273,3277;, + 3;3277,3273,3278;, + 3;3278,3273,3272;, + 3;3281,3292,3280;, + 3;3281,3291,3292;, + 3;3284,3285,3283;, + 3;3284,3288,3285;, + 3;3281,3280,3282;, + 3;3282,3280,3284;, + 3;3282,3284,3283;, + 3;3284,3280,3279;, + 3;3286,3285,3287;, + 3;3287,3285,3288;, + 3;3289,3291,3290;, + 3;3291,3289,3292;, + 3;3292,3289,3293;, + 3;3296,3333,3295;, + 3;3296,3332,3333;, + 3;3297,3340,3296;, + 3;3297,3339,3340;, + 3;3298,3300,3297;, + 3;3298,3299,3300;, + 3;3294,3298,3295;, + 3;3295,3298,3297;, + 3;3295,3297,3296;, + 3;3301,3339,3300;, + 3;3301,3338,3339;, + 3;3302,3355,3301;, + 3;3302,3354,3355;, + 3;3303,3323,3302;, + 3;3303,3322,3323;, + 3;3303,3299,3304;, + 3;3299,3303,3300;, + 3;3300,3303,3302;, + 3;3300,3302,3301;, + 3;3307,3320,3306;, + 3;3307,3326,3320;, + 3;3308,3315,3307;, + 3;3308,3314,3315;, + 3;3305,3308,3306;, + 3;3306,3308,3307;, + 3;3309,3319,3313;, + 3;3309,3318,3319;, + 3;3310,3344,3309;, + 3;3310,3343,3344;, + 3;3311,3329,3310;, + 3;3311,3328,3329;, + 3;3312,3309,3313;, + 3;3309,3312,3311;, + 3;3309,3311,3310;, + 3;3316,3326,3315;, + 3;3316,3325,3326;, + 3;3317,3350,3316;, + 3;3317,3349,3350;, + 3;3318,3345,3317;, + 3;3318,3344,3345;, + 3;3319,3316,3315;, + 3;3319,3315,3314;, + 3;3316,3319,3318;, + 3;3316,3318,3317;, + 3;3324,3354,3323;, + 3;3324,3353,3354;, + 3;3325,3351,3324;, + 3;3325,3350,3351;, + 3;3326,3322,3321;, + 3;3326,3321,3320;, + 3;3322,3326,3323;, + 3;3323,3326,3325;, + 3;3323,3325,3324;, + 3;3327,3335,3330;, + 3;3327,3334,3335;, + 3;3330,3343,3329;, + 3;3330,3342,3343;, + 3;3330,3329,3327;, + 3;3327,3329,3328;, + 3;3331,3342,3335;, + 3;3331,3347,3342;, + 3;3332,3341,3331;, + 3;3332,3340,3341;, + 3;3331,3335,3332;, + 3;3332,3335,3334;, + 3;3332,3334,3333;, + 3;3336,3347,3341;, + 3;3336,3346,3347;, + 3;3337,3348,3336;, + 3;3337,3352,3348;, + 3;3338,3356,3337;, + 3;3338,3355,3356;, + 3;3337,3336,3338;, + 3;3338,3336,3341;, + 3;3338,3341,3340;, + 3;3338,3340,3339;, + 3;3346,3349,3345;, + 3;3346,3348,3349;, + 3;3346,3342,3347;, + 3;3342,3346,3343;, + 3;3343,3346,3345;, + 3;3343,3345,3344;, + 3;3352,3353,3351;, + 3;3352,3356,3353;, + 3;3348,3352,3349;, + 3;3349,3352,3351;, + 3;3349,3351,3350;, + 3;3356,3355,3353;, + 3;3353,3355,3354;, + 3;3357,3367,3361;, + 3;3357,3373,3367;, + 3;3359,3357,3361;, + 3;3359,3361,3360;, + 3;3357,3359,3358;, + 3;3366,3370,3365;, + 3;3366,3369,3370;, + 3;4384,3362,4382;, + 3;3365,3364,3366;, + 3;3362,4384,3363;, + 3;3372,3374,3371;, + 3;3372,3378,3374;, + 3;3371,3368,3367;, + 3;3371,3367,3373;, + 3;3371,3373,3372;, + 3;3368,3371,3369;, + 3;3369,3371,3370;, + 3;3376,3378,3377;, + 3;3378,3376,3375;, + 3;3378,3375,3374;, + 3;3382,3408,3381;, + 3;3382,3407,3408;, + 3;3383,3413,3382;, + 3;3383,3412,3413;, + 3;3381,3383,3382;, + 3;3383,3381,3384;, + 3;3384,3381,3380;, + 3;3384,3380,3379;, + 3;3385,3396,3391;, + 3;3385,3400,3396;, + 3;3389,3393,3388;, + 3;3389,3392,3393;, + 3;3390,3389,3387;, + 3;3390,3387,3391;, + 3;3391,3387,3386;, + 3;3391,3386,3385;, + 3;3387,3389,3388;, + 3;2014,3392,3395;, + 3;2014,3393,3392;, + 3;2014,3394,3393;, + 3;3399,3401,3398;, + 3;3399,3405,3401;, + 3;3400,3399,3398;, + 3;3400,3398,3397;, + 3;3400,3397,3396;, + 3;3403,3410,3402;, + 3;3403,3409,3410;, + 3;3401,3405,3403;, + 3;3401,3403,3402;, + 3;3403,3405,3404;, + 3;3407,3414,3406;, + 3;3407,3413,3414;, + 3;3410,3407,3411;, + 3;3411,3407,3406;, + 3;3407,3410,3408;, + 3;3408,3410,3409;, + 3;3414,3413,3412;, + 3;3414,3412,3415;, + 3;21,88,845;, + 3;151,846,3755;, + 3;4310,4309,4427;, + 3;4310,4428,4311;, + 3;1769,3416,1770;, + 3;3416,1778,4148;, + 3;3417,1901,4429;, + 3;4429,4234,3417;, + 3;4430,3510,185;, + 3;4430,185,3509;, + 3;61,4431,3448;, + 3;61,0,4431;; + + MeshNormals { + 4432; + -0.989571;-0.011953;-0.143551;, + -0.433214;-0.193876;-0.880192;, + -0.984781;0.061328;-0.162622;, + -0.000005;0.123093;-0.992395;, + -0.989261;0.138490;-0.046722;, + -0.588256;0.730768;-0.346313;, + 0.077792;0.437259;0.895965;, + -0.812611;0.166144;0.558622;, + -0.008181;0.252116;0.967663;, + 0.485631;0.575618;0.657895;, + 0.055097;0.933688;0.353823;, + -0.093634;0.341116;0.935346;, + -0.006241;0.260589;0.965430;, + -0.649875;0.280683;0.706314;, + 0.000025;-0.011554;0.999933;, + -0.338437;0.350328;-0.873345;, + 0.000004;-0.093947;-0.995577;, + 0.000016;-0.316597;-0.948560;, + -0.015033;-0.328905;-0.944243;, + -0.576566;-0.459455;-0.675627;, + -0.434273;0.868349;-0.239535;, + -0.151234;0.506148;0.849083;, + -0.164626;0.337297;-0.926892;, + -0.802913;0.231146;0.549456;, + 0.210760;-0.136730;0.967928;, + -0.336341;-0.108795;0.935435;, + 0.244564;-0.065106;0.967445;, + -0.963334;-0.094433;0.251137;, + -0.885448;-0.301099;-0.354007;, + -0.495937;0.082114;0.864467;, + -0.957644;0.220431;0.185280;, + 0.693967;0.242883;0.677803;, + 0.527840;-0.168309;0.832500;, + 0.026768;-0.438717;0.898227;, + -0.000016;-0.990834;-0.135089;, + -0.701247;-0.651828;-0.288743;, + -0.982778;-0.084744;-0.164211;, + -0.001279;-0.024600;-0.999697;, + 0.000009;-0.204621;0.978841;, + -0.895650;-0.343271;-0.282799;, + -0.559206;0.508717;0.654596;, + -0.314707;0.781987;-0.538011;, + 0.000005;-0.999974;0.007152;, + 0.114825;-0.948131;-0.296416;, + -0.145665;-0.919602;-0.364848;, + -0.449270;0.893379;-0.005605;, + 0.000168;0.854980;0.518661;, + -0.000538;0.773627;-0.633641;, + -0.027645;-0.423869;0.905301;, + -0.705970;-0.446329;0.549906;, + -0.273835;-0.400153;0.874581;, + 0.233305;-0.886660;0.399253;, + 0.513833;-0.494239;0.701216;, + -0.790963;-0.525076;0.314122;, + 0.174039;-0.984266;0.030518;, + -0.591766;-0.268191;0.760188;, + -0.187456;-0.160792;0.969023;, + 0.000101;-0.114170;0.993461;, + 0.000002;0.058647;-0.998279;, + -0.131625;-0.050608;-0.990007;, + -0.731235;-0.158649;-0.663420;, + -0.974460;-0.127344;-0.184962;, + -0.859652;-0.309116;-0.406751;, + -0.916036;-0.145104;-0.373928;, + -0.817874;-0.539381;-0.200374;, + 0.278233;-0.273728;0.920684;, + 0.854774;-0.403493;0.326429;, + 0.853727;-0.007027;-0.520673;, + -0.977952;0.018441;0.208015;, + -0.951874;0.289606;0.100323;, + -0.979629;0.019166;-0.199899;, + -0.986179;0.140164;0.088351;, + -0.871225;-0.451441;0.192789;, + -0.529409;-0.220751;0.819143;, + -0.944779;0.327439;0.013305;, + -0.881035;0.426148;0.205365;, + -0.957604;-0.179816;-0.225078;, + -0.994196;0.051821;0.094280;, + -0.964421;0.191784;-0.181966;, + -0.980241;-0.139652;0.140090;, + 0.000023;-0.244851;-0.969561;, + -0.048245;-0.332029;-0.942035;, + -0.432334;-0.434648;-0.790043;, + -0.722354;-0.365988;-0.586734;, + -0.957758;-0.287242;0.013841;, + -0.000013;0.370748;-0.928733;, + -0.040453;0.710290;-0.702746;, + 0.313062;0.614710;0.723964;, + -0.460194;0.616751;0.638623;, + 0.000001;0.024616;-0.999697;, + -0.226499;-0.140193;-0.963869;, + -0.457101;-0.023022;-0.889117;, + -0.664851;0.117356;-0.737700;, + -0.897582;0.211412;-0.386848;, + -0.903847;0.420928;-0.076682;, + -0.135198;0.773486;0.619226;, + -0.141004;0.621292;0.770788;, + 0.124490;0.581568;0.803916;, + 0.000876;0.616105;0.787664;, + 0.387797;0.626448;0.676148;, + 0.149512;-0.247279;-0.957340;, + -0.905288;0.176534;0.386380;, + -0.867052;0.137579;0.478846;, + -0.829671;0.408671;0.380308;, + -0.701860;0.270507;0.658953;, + -0.892567;0.378889;-0.244475;, + 0.351384;0.936193;-0.008488;, + 0.237101;0.465138;0.852895;, + 0.221316;0.433286;0.873660;, + 0.000301;0.766126;0.642690;, + -0.037085;0.936295;-0.349251;, + 0.413738;0.852881;0.318456;, + 0.000002;0.301740;-0.953390;, + -0.138062;0.039474;-0.989637;, + -0.439435;0.173212;-0.881416;, + -0.632058;0.089542;-0.769730;, + -0.851652;0.387173;-0.353250;, + -0.886195;0.463152;-0.012222;, + 0.766299;0.388719;0.511550;, + -0.968326;0.059868;0.242406;, + -0.892378;0.166006;0.419647;, + -0.818963;0.564690;-0.102099;, + -0.830607;0.230508;0.506910;, + -0.758821;0.117889;0.640541;, + -0.044908;-0.611148;0.790241;, + -0.886549;0.392710;-0.244562;, + -0.899773;0.187812;0.393873;, + -0.898020;0.299543;-0.322233;, + -0.947696;-0.212901;-0.237792;, + -0.502434;-0.677413;0.537282;, + -0.291292;-0.349896;0.890349;, + -0.057118;-0.609638;0.790619;, + -0.987507;0.156917;-0.014374;, + -0.323785;0.508980;0.797560;, + -0.901688;0.259664;-0.345736;, + -0.805182;0.220087;-0.550676;, + -0.645712;-0.763581;-0.000279;, + 0.990082;-0.015546;-0.139630;, + 0.433214;-0.193877;-0.880192;, + 0.987185;0.081535;-0.137175;, + 0.990910;0.129582;-0.036136;, + 0.260508;0.727642;-0.634565;, + -0.091231;0.428920;0.898724;, + 0.811080;0.164853;0.561224;, + -0.559324;0.693597;0.453961;, + 0.100417;0.338390;0.935633;, + 0.649875;0.280683;0.706314;, + 0.338436;0.350327;-0.873346;, + 0.015042;-0.328899;-0.944245;, + 0.576566;-0.459455;-0.675627;, + 0.434273;0.868349;-0.239535;, + 0.306690;0.520580;0.796830;, + 0.164619;0.337297;-0.926893;, + 0.802913;0.231146;0.549456;, + -0.210733;-0.136750;0.967931;, + 0.336341;-0.108795;0.935435;, + -0.244564;-0.065106;0.967445;, + 0.963334;-0.094433;0.251137;, + 0.885448;-0.301099;-0.354007;, + 0.495937;0.082114;0.864467;, + 0.957644;0.220431;0.185280;, + -0.602846;0.290303;0.743169;, + -0.527840;-0.168309;0.832500;, + -0.026768;-0.438717;0.898227;, + 0.701248;-0.651828;-0.288742;, + 0.982279;-0.089104;-0.164890;, + 0.895650;-0.343271;-0.282799;, + 0.566570;0.495981;0.658028;, + 0.309521;0.783229;-0.539212;, + -0.114791;-0.948135;-0.296417;, + 0.145665;-0.919602;-0.364848;, + 0.481298;0.876550;-0.003471;, + 0.027647;-0.423868;0.905302;, + 0.705254;-0.446887;0.550372;, + 0.273873;-0.400246;0.874527;, + -0.233305;-0.886660;0.399253;, + -0.513833;-0.494239;0.701216;, + 0.790963;-0.525076;0.314122;, + -0.174039;-0.984266;0.030518;, + 0.591063;-0.270370;0.759963;, + 0.187382;-0.161599;0.968903;, + 0.131624;-0.050609;-0.990007;, + 0.731235;-0.158649;-0.663420;, + 0.974460;-0.127344;-0.184962;, + 0.859652;-0.309116;-0.406751;, + 0.916036;-0.145104;-0.373928;, + 0.817874;-0.539381;-0.200374;, + -0.278232;-0.273728;0.920684;, + -0.854773;-0.403493;0.326429;, + -0.853727;-0.007027;-0.520673;, + 0.972307;0.015440;0.233196;, + 0.956394;0.275771;0.096231;, + 0.981505;0.019792;-0.190410;, + 0.972924;0.196620;0.121487;, + 0.955178;-0.252865;0.153929;, + 0.506951;-0.238596;0.828295;, + 0.964289;0.264843;-0.002032;, + 0.916931;0.363083;0.165554;, + 0.987197;-0.118160;-0.107142;, + 0.774218;0.487454;0.403702;, + 0.963480;0.174780;-0.202875;, + 0.970183;-0.159926;0.182121;, + 0.048272;-0.332044;-0.942028;, + 0.430577;-0.435479;-0.790545;, + 0.722112;-0.366391;-0.586781;, + 0.957347;-0.288570;0.014659;, + -0.305307;0.626286;0.717324;, + 0.448693;0.679150;0.580886;, + 0.226504;-0.140193;-0.963868;, + 0.457101;-0.023022;-0.889117;, + 0.664851;0.117356;-0.737700;, + 0.897582;0.211412;-0.386848;, + 0.903847;0.420928;-0.076682;, + 0.135198;0.773486;0.619226;, + 0.122893;0.649057;0.750748;, + -0.142710;0.597235;0.789268;, + -0.439283;0.626634;0.643708;, + -0.149496;-0.247276;-0.957343;, + 0.905288;0.176534;0.386380;, + 0.867052;0.137579;0.478846;, + 0.829671;0.408671;0.380308;, + 0.701860;0.270507;0.658953;, + 0.892567;0.378889;-0.244475;, + -0.362258;0.932010;-0.011212;, + -0.188184;0.477638;0.858166;, + -0.167233;0.445019;0.879768;, + 0.042064;0.935662;-0.350382;, + -0.453111;0.835822;0.309986;, + 0.138068;0.039474;-0.989636;, + 0.439435;0.173212;-0.881416;, + 0.632058;0.089542;-0.769730;, + 0.851652;0.387173;-0.353250;, + 0.886195;0.463152;-0.012222;, + -0.740748;0.411825;0.530746;, + 0.968326;0.059868;0.242406;, + 0.892378;0.166006;0.419647;, + 0.818963;0.564690;-0.102099;, + 0.830607;0.230508;0.506910;, + 0.758821;0.117889;0.640541;, + 0.044907;-0.611148;0.790241;, + 0.886549;0.392710;-0.244561;, + 0.899773;0.187812;0.393873;, + 0.898020;0.299543;-0.322233;, + 0.947696;-0.212901;-0.237792;, + 0.502434;-0.677413;0.537282;, + 0.291292;-0.349896;0.890349;, + 0.057117;-0.609638;0.790619;, + 0.987507;0.156917;-0.014374;, + 0.323785;0.508980;0.797560;, + 0.901688;0.259664;-0.345736;, + 0.805182;0.220087;-0.550676;, + 0.645712;-0.763581;-0.000280;, + -0.000035;0.202257;-0.979333;, + 0.000000;-0.152057;-0.988372;, + -0.986678;0.148934;0.065464;, + -0.248728;-0.201732;-0.947332;, + -0.091949;-0.099791;0.990751;, + -0.000076;-0.461661;-0.887057;, + 0.675377;-0.238040;0.698000;, + -0.372066;0.352850;-0.858524;, + -0.920508;0.371208;0.121944;, + 0.954651;-0.166315;-0.246941;, + -0.770854;-0.091830;-0.630358;, + -0.522907;0.552336;0.649225;, + -0.269360;-0.762341;0.588456;, + -0.705008;-0.050622;-0.707390;, + -0.421748;0.283560;-0.861233;, + 0.643644;-0.015506;0.765168;, + 0.992661;-0.000187;-0.120932;, + 0.935445;-0.035033;-0.351732;, + -0.263483;-0.085234;0.960891;, + -0.344264;0.023341;0.938583;, + 0.887402;-0.082890;-0.453484;, + -0.649836;0.205407;-0.731793;, + -0.872109;0.095397;-0.479922;, + -0.894885;0.082610;0.438584;, + -0.554738;0.084178;-0.827756;, + 0.054057;-0.076987;-0.995566;, + -0.908432;0.107750;-0.403908;, + 0.495001;-0.126597;0.859620;, + 0.968704;-0.213268;-0.126998;, + 0.313056;0.378120;0.871219;, + 0.365426;-0.280297;0.887636;, + 0.067345;-0.084014;-0.994186;, + -0.012682;-0.010483;0.999865;, + 0.064836;-0.191491;-0.979351;, + -0.289534;0.030294;-0.956688;, + -0.200942;0.148449;0.968290;, + 0.020471;-0.061478;-0.997899;, + -0.400237;0.683181;0.610798;, + 0.453303;-0.497746;0.739435;, + 0.521055;-0.809078;0.271835;, + 0.735182;-0.666684;0.122637;, + 0.821914;-0.569537;-0.009215;, + 0.759558;-0.443873;-0.475446;, + -0.572197;-0.246884;0.782073;, + -0.565959;-0.798793;0.204013;, + -0.757874;-0.650275;-0.052618;, + -0.707861;-0.682627;-0.181530;, + -0.657196;-0.390140;-0.644891;, + 0.215407;0.452689;0.865259;, + 0.845085;0.295788;0.445355;, + 0.869444;0.325743;0.371427;, + 0.954242;-0.257523;0.152001;, + -0.520474;0.526586;0.672171;, + -0.936897;0.300664;0.178397;, + -0.940651;0.338859;-0.018731;, + -0.960352;-0.063982;-0.271348;, + 0.059122;-0.098574;-0.993372;, + 0.798460;-0.602012;-0.006594;, + -0.809310;-0.499093;-0.309716;, + 0.179068;-0.150961;-0.972186;, + -0.113992;0.003257;-0.993476;, + -0.245507;-0.085870;-0.965584;, + 0.381448;-0.090026;0.919996;, + -0.473877;0.315534;0.822119;, + 0.834619;-0.338308;0.434694;, + 0.968707;-0.002938;-0.248189;, + -0.984728;-0.003402;0.174069;, + 0.518085;0.053826;-0.853634;, + -0.717724;0.062444;-0.693523;, + -0.172176;-0.025937;-0.984725;, + 0.990528;-0.094784;-0.099347;, + 0.716933;-0.028565;-0.696556;, + -0.638618;0.047039;-0.768085;, + 0.860708;-0.108316;0.497444;, + -0.837234;0.055243;0.544046;, + 0.955485;-0.120740;-0.269203;, + -0.670236;0.022528;-0.741806;, + -0.945620;0.026607;-0.324184;, + -0.472020;0.096403;0.876301;, + 0.537901;-0.058446;-0.840980;, + -0.381353;0.920775;0.082119;, + 0.682106;-0.030649;0.730611;, + -0.557613;-0.562556;0.610408;, + 0.846805;0.072950;-0.526877;, + 0.049962;-0.004893;-0.998739;, + 0.666223;-0.143179;0.731879;, + -0.861291;-0.041597;-0.506406;, + 0.034482;-0.052609;-0.998020;, + 0.068707;0.488169;-0.870040;, + 0.007891;-0.135395;-0.990760;, + -0.145988;-0.211055;-0.966511;, + -0.279880;-0.147467;0.948641;, + -0.762165;0.039662;0.646167;, + 0.389810;-0.013375;0.920798;, + 0.757187;-0.049995;0.651282;, + 0.181561;-0.108135;0.977416;, + -0.887763;0.274320;0.369629;, + -0.354476;-0.066564;0.932693;, + -0.705742;-0.122863;0.697734;, + -0.804425;-0.481755;0.347580;, + -0.911357;-0.405828;0.068791;, + -0.868967;-0.391802;-0.302304;, + -0.955392;-0.286491;-0.071754;, + -0.212265;-0.554761;-0.804478;, + -0.300497;-0.671647;-0.677194;, + 0.566503;-0.333624;0.753505;, + 0.705192;-0.523353;0.478336;, + 0.734833;-0.590132;0.334314;, + 0.703206;-0.672001;-0.232197;, + 0.353830;-0.592859;-0.723410;, + 0.909177;-0.368835;-0.193282;, + 0.738914;-0.651028;0.173689;, + 0.318223;-0.742396;-0.589561;, + 0.039464;-0.745272;-0.665591;, + -0.507519;-0.687744;-0.519069;, + 0.143708;-0.090742;0.985451;, + -0.325692;0.036226;0.944782;, + -0.642110;-0.406225;0.650135;, + -0.726668;-0.619543;0.296850;, + -0.754218;-0.609442;0.244407;, + -0.480671;-0.816061;-0.320936;, + -0.438781;-0.895636;-0.072854;, + -0.216241;-0.550378;-0.806427;, + -0.375817;-0.659247;-0.651272;, + 0.524041;-0.621420;0.582424;, + 0.478543;-0.696415;0.534792;, + 0.479492;-0.729402;0.487915;, + 0.552158;-0.818101;-0.160724;, + 0.216081;-0.555173;-0.803176;, + 0.390037;-0.917415;-0.078869;, + 0.462565;-0.763825;0.450117;, + 0.298517;-0.762623;-0.573840;, + 0.099219;-0.723576;-0.683077;, + -0.363985;-0.781659;-0.506482;, + -0.687634;-0.340006;-0.641526;, + -0.554595;-0.700435;0.449238;, + 0.007793;-0.618390;0.785832;, + -0.700055;-0.676002;-0.230094;, + 0.152980;0.089858;-0.984136;, + 0.639689;-0.061333;0.766183;, + -0.671801;-0.148929;-0.725605;, + 0.982818;-0.144272;-0.115132;, + -0.539943;-0.790977;-0.287777;, + -0.425702;-0.452816;-0.783413;, + -0.120435;0.764300;-0.633515;, + 0.634155;0.239730;0.735103;, + 0.100998;-0.684788;0.721710;, + -0.373807;-0.009779;-0.927455;, + -0.400118;0.694772;0.597660;, + -0.642458;0.753052;0.141985;, + 0.220397;-0.805586;0.549959;, + 0.474612;-0.157723;0.865949;, + 0.286302;-0.330049;-0.899499;, + 0.364402;-0.047676;0.930020;, + -0.153579;-0.916119;-0.370324;, + -0.360583;-0.309427;-0.879906;, + 0.603621;-0.355989;0.713382;, + -0.339341;-0.048326;0.939421;, + -0.969969;-0.035649;-0.240603;, + -0.299431;-0.946414;-0.120998;, + 0.164304;-0.789581;0.591242;, + -0.678182;-0.699706;-0.224678;, + -0.069164;-0.822330;0.564792;, + -0.245535;-0.396112;-0.884764;, + -0.891450;-0.383892;-0.240717;, + 0.072762;-0.780842;0.620477;, + -0.595632;-0.621882;0.508414;, + -0.752466;-0.638225;0.162674;, + -0.299599;-0.795145;0.527243;, + -0.000137;-0.920182;0.391491;, + -0.114339;0.740537;0.662217;, + -0.673865;0.641908;0.365869;, + 0.368870;0.664338;0.650069;, + -0.929837;0.223510;-0.292314;, + 0.987497;0.100828;0.121175;, + -0.037200;-0.353239;-0.934793;, + 0.000005;-0.908853;-0.417117;, + -0.275159;-0.572461;0.772383;, + 1.000000;0.000000;0.000000;, + -0.311030;-0.795975;-0.519312;, + -0.790481;-0.221084;-0.571194;, + -0.264462;-0.862138;0.432178;, + -0.597714;-0.523944;0.606812;, + -0.550598;-0.834581;0.017782;, + -0.162744;0.615741;0.770959;, + -0.877145;-0.439089;0.194469;, + -0.415729;0.666519;0.618807;, + -0.278425;0.851658;-0.444026;, + -0.537797;0.842499;0.031136;, + 0.000014;0.999890;-0.014824;, + -0.000345;0.842160;-0.539228;, + -0.136592;-0.525506;-0.839754;, + 0.000010;-0.577151;-0.816638;, + -0.226785;-0.723353;0.652173;, + 0.000147;-0.426759;0.904366;, + -0.312156;-0.802806;-0.507998;, + -0.702614;-0.504599;-0.501711;, + -0.270629;-0.843099;0.464697;, + -0.618679;-0.620211;0.482259;, + -0.545698;-0.837393;0.031400;, + -0.530614;0.817949;0.222282;, + -0.520441;-0.817752;0.245812;, + 0.000135;0.503934;0.863742;, + 0.000081;-0.865374;0.501127;, + -0.494858;0.862986;0.101841;, + -0.877073;-0.347968;0.331150;, + -0.848954;-0.000633;0.528467;, + -0.435124;-0.365516;0.822840;, + -0.171310;-0.101103;0.980016;, + -0.280330;-0.874167;0.396545;, + -0.857649;-0.059936;0.510730;, + -0.851056;-0.296513;0.433340;, + -0.292987;0.538921;-0.789761;, + -0.385669;0.149737;-0.910405;, + -0.498102;0.070627;0.864237;, + 0.072329;0.379525;-0.922350;, + 0.076379;0.219461;-0.972627;, + 0.202960;-0.006085;-0.979168;, + 0.224477;-0.161615;-0.960984;, + 0.287531;-0.313110;-0.905145;, + 0.508736;-0.187881;-0.840171;, + -0.692298;0.454233;-0.560710;, + -0.793609;0.199236;-0.574882;, + 0.696581;-0.112033;-0.708677;, + 0.671521;-0.145121;-0.726636;, + 0.672596;-0.215313;-0.707993;, + -0.558239;-0.020619;-0.829424;, + -0.534769;-0.089005;-0.840298;, + -0.513705;-0.196613;-0.835135;, + -0.349154;0.242462;0.905154;, + -0.631346;0.402228;0.663035;, + -0.146145;-0.055401;0.987711;, + -0.321667;0.474266;0.819514;, + -0.592931;-0.025934;0.804835;, + 0.232003;0.000577;0.972715;, + 0.340346;0.050732;-0.938931;, + -0.044769;0.183553;-0.981990;, + 0.908812;-0.397053;0.128099;, + 0.918662;-0.341700;0.198244;, + 0.938847;-0.129908;-0.318889;, + -0.995822;0.066694;-0.062372;, + -0.913711;-0.184581;0.362025;, + -0.773515;-0.042525;0.632350;, + 0.562379;0.010758;-0.826809;, + -0.346217;0.118076;-0.930694;, + -0.716207;0.131762;-0.685336;, + 0.723032;0.009740;0.690746;, + 0.936260;-0.073710;0.343489;, + -0.899016;0.099518;-0.426458;, + 0.016111;-0.054691;0.998373;, + 0.652732;-0.056214;0.755500;, + -0.677075;0.091018;0.730264;, + -0.550517;-0.135376;0.823775;, + -0.748083;0.060359;-0.660855;, + -0.891510;0.146220;-0.428753;, + -0.200461;-0.141215;-0.969471;, + 0.229795;-0.207572;-0.950846;, + 0.832397;-0.148190;-0.534000;, + 0.583371;-0.208319;-0.785036;, + 0.980272;0.130639;0.148327;, + 0.965909;-0.084351;-0.244754;, + 0.951984;0.131127;0.276644;, + -0.935643;0.156818;0.316197;, + -0.559482;-0.050274;-0.827317;, + -0.972281;0.214777;-0.092415;, + -0.532795;-0.071842;0.843189;, + -0.476940;-0.083345;0.874975;, + 0.274845;-0.070215;-0.958921;, + 0.028471;-0.057604;-0.997933;, + 0.574856;-0.080803;-0.814255;, + 0.144145;-0.089235;0.985525;, + 0.827608;-0.099104;0.552489;, + -0.876485;-0.009071;0.481344;, + -0.995610;0.037774;-0.085641;, + -0.905860;0.032618;-0.422319;, + -0.808523;0.001652;-0.588462;, + 0.845060;-0.044480;-0.532817;, + 0.979465;-0.039533;-0.197703;, + 0.956895;-0.080204;0.279139;, + -0.691297;-0.047071;-0.721036;, + -0.412896;-0.055933;-0.909059;, + 0.999321;0.028755;-0.023042;, + 0.912214;-0.035085;-0.408209;, + 0.563445;-0.089914;-0.821246;, + -0.351468;0.039937;-0.935348;, + 0.956673;-0.049558;0.286915;, + 0.269123;0.056572;0.961443;, + 0.740501;-0.038151;0.670971;, + -0.562631;0.056481;0.824776;, + -0.925797;0.040436;0.375851;, + -0.315953;0.018351;0.948597;, + 0.056900;0.108101;-0.992510;, + 0.090328;-0.066382;-0.993697;, + 0.226044;-0.018716;0.973937;, + -0.906954;0.117975;-0.404371;, + 0.992970;-0.002293;0.118346;, + 0.263526;0.009804;0.964602;, + 0.960000;-0.111524;0.256830;, + 0.046754;-0.041359;-0.998050;, + 0.975814;-0.094575;0.197085;, + 0.713467;-0.239290;-0.658563;, + 0.796247;0.046297;0.603198;, + -0.000011;0.371222;-0.928544;, + -0.000042;-0.118764;-0.992922;, + 0.045742;0.462090;-0.885653;, + 0.986678;0.148934;0.065464;, + 0.248728;-0.201732;-0.947332;, + 0.091949;-0.099791;0.990751;, + -0.675428;-0.237979;0.697971;, + 0.372066;0.352850;-0.858524;, + 0.920508;0.371208;0.121944;, + -0.954652;-0.166280;-0.246961;, + 0.770854;-0.091830;-0.630359;, + 0.522907;0.552336;0.649225;, + 0.705008;-0.050621;-0.707390;, + 0.421748;0.283560;-0.861233;, + -0.643644;-0.015506;0.765168;, + -0.992661;-0.000187;-0.120933;, + -0.935445;-0.035034;-0.351733;, + 0.263483;-0.085234;0.960891;, + 0.344265;0.023340;0.938582;, + -0.887402;-0.082890;-0.453483;, + 0.649836;0.205407;-0.731793;, + 0.872109;0.095396;-0.479922;, + 0.894885;0.082610;0.438585;, + 0.554737;0.084178;-0.827756;, + -0.054057;-0.076987;-0.995566;, + 0.908432;0.107750;-0.403908;, + -0.495001;-0.126597;0.859620;, + -0.968704;-0.213269;-0.126998;, + -0.313056;0.378120;0.871218;, + -0.365426;-0.280297;0.887636;, + -0.067345;-0.084014;-0.994186;, + 0.012681;-0.010483;0.999865;, + -0.064836;-0.191491;-0.979351;, + 0.289534;0.030294;-0.956688;, + 0.200942;0.148449;0.968290;, + -0.020470;-0.061480;-0.997898;, + 0.400237;0.683181;0.610797;, + -0.453304;-0.497746;0.739435;, + -0.521055;-0.809078;0.271836;, + -0.735182;-0.666684;0.122637;, + -0.821914;-0.569537;-0.009216;, + -0.759558;-0.443871;-0.475447;, + 0.572196;-0.246884;0.782074;, + 0.565958;-0.798793;0.204014;, + 0.757874;-0.650275;-0.052618;, + 0.707861;-0.682627;-0.181531;, + 0.657196;-0.390140;-0.644891;, + -0.215408;0.452689;0.865258;, + -0.845086;0.295787;0.445354;, + -0.869444;0.325743;0.371427;, + -0.954242;-0.257523;0.152001;, + 0.520473;0.526586;0.672172;, + 0.936897;0.300664;0.178397;, + 0.940651;0.338859;-0.018732;, + 0.960352;-0.063982;-0.271348;, + -0.059122;-0.098573;-0.993372;, + -0.798459;-0.602012;-0.006595;, + 0.809310;-0.499092;-0.309716;, + -0.179068;-0.150961;-0.972186;, + 0.113992;0.003257;-0.993476;, + 0.245507;-0.085870;-0.965584;, + -0.381448;-0.090025;0.919996;, + 0.473877;0.315534;0.822118;, + -0.834619;-0.338308;0.434694;, + -0.968707;-0.002938;-0.248190;, + 0.984728;-0.003402;0.174069;, + -0.518085;0.053827;-0.853634;, + 0.717724;0.062444;-0.693523;, + 0.172176;-0.025937;-0.984725;, + -0.990528;-0.094784;-0.099347;, + -0.716933;-0.028565;-0.696556;, + 0.638618;0.047039;-0.768085;, + -0.860708;-0.108316;0.497444;, + 0.837234;0.055243;0.544047;, + -0.955485;-0.120740;-0.269203;, + 0.670236;0.022528;-0.741806;, + 0.945620;0.026607;-0.324184;, + 0.472020;0.096403;0.876301;, + -0.537901;-0.058446;-0.840980;, + 0.381356;0.920774;0.082120;, + -0.682106;-0.030649;0.730611;, + 0.557614;-0.562555;0.610409;, + -0.846805;0.072950;-0.526877;, + -0.049962;-0.004893;-0.998739;, + -0.666223;-0.143179;0.731879;, + 0.861291;-0.041597;-0.506406;, + -0.034481;-0.052611;-0.998020;, + -0.068707;0.488169;-0.870040;, + -0.007891;-0.135398;-0.990760;, + 0.145989;-0.211055;-0.966511;, + 0.279880;-0.147467;0.948642;, + 0.762165;0.039663;0.646167;, + -0.389810;-0.013375;0.920798;, + -0.757187;-0.049996;0.651282;, + -0.181560;-0.108135;0.977416;, + 0.887763;0.274319;0.369629;, + 0.354475;-0.066564;0.932693;, + 0.705738;-0.122868;0.697737;, + 0.804429;-0.481751;0.347578;, + 0.911362;-0.405818;0.068789;, + 0.868969;-0.391799;-0.302303;, + 0.955392;-0.286490;-0.071755;, + 0.212267;-0.554751;-0.804484;, + 0.300504;-0.671641;-0.677197;, + -0.566507;-0.333623;0.753502;, + -0.705199;-0.523347;0.478333;, + -0.734835;-0.590129;0.334313;, + -0.703206;-0.672002;-0.232196;, + -0.353826;-0.592860;-0.723412;, + -0.909176;-0.368837;-0.193284;, + -0.738915;-0.651028;0.173686;, + -0.318224;-0.742397;-0.589560;, + -0.039462;-0.745268;-0.665596;, + 0.507518;-0.687743;-0.519071;, + -0.143709;-0.090742;0.985451;, + 0.325692;0.036224;0.944782;, + 0.642109;-0.406228;0.650135;, + 0.726679;-0.619532;0.296847;, + 0.754223;-0.609436;0.244406;, + 0.480673;-0.816061;-0.320933;, + 0.438780;-0.895636;-0.072859;, + 0.216240;-0.550371;-0.806432;, + 0.375822;-0.659238;-0.651277;, + -0.524041;-0.621421;0.582424;, + -0.478550;-0.696413;0.534789;, + -0.479503;-0.729395;0.487914;, + -0.552157;-0.818101;-0.160725;, + -0.216079;-0.555173;-0.803177;, + -0.390036;-0.917416;-0.078869;, + -0.462568;-0.763826;0.450113;, + -0.298518;-0.762626;-0.573837;, + -0.099215;-0.723576;-0.683077;, + 0.363989;-0.781657;-0.506483;, + 0.687634;-0.340007;-0.641526;, + 0.554595;-0.700435;0.449238;, + -0.007792;-0.618390;0.785833;, + 0.700058;-0.676000;-0.230095;, + -0.152979;0.089859;-0.984136;, + -0.639690;-0.061333;0.766182;, + 0.671802;-0.148929;-0.725605;, + -0.982818;-0.144272;-0.115132;, + 0.539944;-0.790977;-0.287776;, + 0.425700;-0.452817;-0.783413;, + 0.120436;0.764300;-0.633515;, + -0.634158;0.239730;0.735101;, + -0.100997;-0.684786;0.721711;, + 0.373807;-0.009780;-0.927455;, + 0.400118;0.694773;0.597659;, + 0.642459;0.753051;0.141986;, + -0.220398;-0.805586;0.549960;, + -0.474612;-0.157723;0.865949;, + -0.286301;-0.330049;-0.899500;, + -0.364402;-0.047676;0.930020;, + 0.153577;-0.916119;-0.370323;, + 0.360580;-0.309427;-0.879907;, + -0.603625;-0.355989;0.713378;, + 0.339341;-0.048326;0.939421;, + 0.969969;-0.035649;-0.240603;, + 0.299429;-0.946415;-0.121000;, + -0.164303;-0.789579;0.591244;, + 0.678182;-0.699706;-0.224678;, + 0.069165;-0.822329;0.564792;, + 0.245531;-0.396115;-0.884764;, + 0.891451;-0.383891;-0.240714;, + -0.072761;-0.780841;0.620478;, + 0.595631;-0.621884;0.508413;, + 0.752462;-0.638231;0.162672;, + 0.299598;-0.795145;0.527243;, + 0.114341;0.740537;0.662217;, + 0.673864;0.641909;0.365870;, + -0.368870;0.664338;0.650069;, + 0.929837;0.223510;-0.292314;, + -0.987497;0.100827;0.121175;, + 0.037200;-0.353240;-0.934793;, + 0.275160;-0.572458;0.772385;, + 0.311029;-0.795977;-0.519309;, + 0.790480;-0.221084;-0.571194;, + 0.264462;-0.862137;0.432180;, + 0.597714;-0.523943;0.606812;, + 0.550599;-0.834580;0.017784;, + 0.162598;0.616218;0.770608;, + 0.877144;-0.439088;0.194473;, + 0.415142;0.667643;0.617989;, + 0.286302;0.846489;-0.448874;, + 0.557573;0.829476;0.032896;, + 0.136611;-0.525509;-0.839749;, + 0.226786;-0.723350;0.652175;, + 0.312154;-0.802808;-0.507996;, + 0.702613;-0.504600;-0.501711;, + 0.270630;-0.843098;0.464698;, + 0.618680;-0.620209;0.482260;, + 0.545698;-0.837393;0.031400;, + 0.530646;0.817913;0.222337;, + 0.520501;-0.817725;0.245773;, + 0.494932;0.862948;0.101798;, + 0.877148;-0.347914;0.331008;, + 0.848954;-0.000633;0.528467;, + 0.435262;-0.365357;0.822837;, + 0.857736;-0.059938;0.510585;, + 0.851169;-0.296328;0.433244;, + 0.292987;0.538920;-0.789761;, + 0.385669;0.149737;-0.910405;, + 0.498102;0.070626;0.864237;, + -0.072353;0.379524;-0.922348;, + -0.076406;0.219458;-0.972625;, + -0.203011;-0.006085;-0.979158;, + -0.224521;-0.161613;-0.960974;, + -0.287588;-0.313105;-0.905129;, + -0.508756;-0.187868;-0.840163;, + 0.692298;0.454233;-0.560710;, + 0.793609;0.199236;-0.574882;, + -0.696581;-0.112033;-0.708677;, + -0.671520;-0.145121;-0.726636;, + -0.672596;-0.215313;-0.707993;, + 0.558239;-0.020619;-0.829424;, + 0.534769;-0.089005;-0.840298;, + 0.513705;-0.196613;-0.835135;, + 0.349154;0.242462;0.905154;, + 0.631346;0.402228;0.663035;, + 0.146145;-0.055401;0.987711;, + 0.321667;0.474265;0.819514;, + 0.592932;-0.025934;0.804835;, + -0.232003;0.000577;0.972715;, + -0.340346;0.050732;-0.938931;, + 0.044769;0.183553;-0.981990;, + -0.908812;-0.397053;0.128100;, + -0.918662;-0.341700;0.198244;, + -0.938847;-0.129909;-0.318890;, + 0.995822;0.066694;-0.062372;, + 0.913711;-0.184581;0.362025;, + 0.773514;-0.042525;0.632351;, + -0.562379;0.010758;-0.826810;, + 0.346217;0.118076;-0.930694;, + 0.716207;0.131762;-0.685337;, + -0.723032;0.009739;0.690746;, + -0.936259;-0.073710;0.343490;, + 0.899016;0.099517;-0.426458;, + -0.016111;-0.054691;0.998373;, + -0.652733;-0.056213;0.755500;, + 0.677075;0.091018;0.730264;, + 0.550517;-0.135376;0.823775;, + 0.748083;0.060359;-0.660855;, + 0.891510;0.146220;-0.428753;, + 0.200461;-0.141215;-0.969471;, + -0.229795;-0.207571;-0.950846;, + -0.832396;-0.148190;-0.534000;, + -0.583371;-0.208318;-0.785036;, + -0.980272;0.130639;0.148328;, + -0.965909;-0.084351;-0.244754;, + -0.951984;0.131127;0.276643;, + 0.935643;0.156818;0.316197;, + 0.559482;-0.050274;-0.827317;, + 0.972281;0.214776;-0.092415;, + 0.532795;-0.071842;0.843189;, + 0.476940;-0.083345;0.874975;, + -0.274846;-0.070215;-0.958921;, + -0.028471;-0.057604;-0.997933;, + -0.574856;-0.080803;-0.814255;, + -0.144145;-0.089235;0.985525;, + -0.827608;-0.099104;0.552489;, + 0.876485;-0.009071;0.481343;, + 0.995610;0.037774;-0.085641;, + 0.905860;0.032618;-0.422319;, + 0.808523;0.001652;-0.588462;, + -0.845060;-0.044480;-0.532817;, + -0.979465;-0.039533;-0.197703;, + -0.956895;-0.080204;0.279139;, + 0.691297;-0.047071;-0.721036;, + 0.412896;-0.055933;-0.909059;, + -0.999321;0.028755;-0.023042;, + -0.912214;-0.035085;-0.408209;, + -0.563445;-0.089914;-0.821246;, + 0.351468;0.039937;-0.935348;, + -0.956673;-0.049558;0.286915;, + -0.269123;0.056572;0.961443;, + -0.740501;-0.038151;0.670971;, + 0.562631;0.056481;0.824777;, + 0.925797;0.040436;0.375851;, + 0.315953;0.018351;0.948597;, + -0.056900;0.108101;-0.992510;, + -0.090328;-0.066382;-0.993697;, + -0.226043;-0.018716;0.973937;, + 0.906954;0.117975;-0.404371;, + -0.992970;-0.002293;0.118346;, + -0.263526;0.009803;0.964602;, + -0.960000;-0.111524;0.256830;, + -0.046754;-0.041359;-0.998050;, + -0.975831;-0.094528;0.197025;, + -0.713467;-0.239291;-0.658563;, + -0.796247;0.046297;0.603198;, + -0.045755;0.462090;-0.885652;, + -0.120567;0.889102;0.441544;, + 0.089110;0.886500;0.454068;, + 0.495887;0.107622;-0.861692;, + -0.501661;0.110800;-0.857939;, + 0.381150;0.923821;0.035779;, + -0.392218;0.560751;0.729194;, + 0.186388;0.976894;0.104581;, + 0.567905;0.521114;-0.637122;, + -0.473718;0.414055;-0.777271;, + 0.529914;-0.324726;-0.783418;, + -0.226517;-0.970474;0.082885;, + 0.207701;-0.604118;-0.769351;, + -0.527039;0.781296;-0.334374;, + -0.834983;0.264476;-0.482552;, + -0.675963;0.077412;-0.732858;, + -0.160126;0.190092;-0.968620;, + -0.228376;-0.127237;-0.965223;, + 0.068168;0.237165;0.969075;, + 0.657416;-0.744773;-0.114531;, + 0.274099;0.701037;-0.658344;, + -0.876642;-0.442049;-0.189978;, + 0.779259;0.312381;0.543299;, + -0.327724;-0.696016;0.638873;, + 0.594374;0.647132;0.477430;, + 0.984981;0.135781;-0.106662;, + -0.422834;0.836078;-0.349551;, + -0.828790;0.540637;-0.144288;, + 0.034244;0.095893;-0.994802;, + -0.641365;-0.305210;-0.703916;, + -0.923773;-0.052793;0.379284;, + 0.076548;0.939750;-0.333181;, + 0.119540;-0.960477;0.251383;, + -0.669596;-0.615981;-0.414980;, + -0.303029;-0.186091;0.934635;, + -0.234676;0.256475;0.937629;, + 0.295362;0.740439;0.603748;, + -0.353633;-0.752104;0.556133;, + -0.520041;-0.156983;0.839592;, + 0.509538;-0.839165;-0.190193;, + -0.146089;-0.981553;0.123336;, + 0.914801;0.309243;0.259824;, + 0.897041;0.033289;-0.440692;, + -0.839542;-0.269781;-0.471581;, + -0.963227;0.157435;-0.217736;, + -0.259132;0.699308;-0.666197;, + 0.604434;0.762690;0.230139;, + 0.423330;0.778916;0.462689;, + -0.434554;0.075723;0.897457;, + 0.006566;0.677354;0.735628;, + 0.749936;0.407739;-0.520908;, + 0.822491;0.188949;-0.536477;, + 0.756906;-0.145054;-0.637223;, + 0.423190;-0.716621;-0.554404;, + -0.227209;-0.966292;0.121064;, + -0.317550;-0.933835;0.164662;, + -0.496371;-0.182434;0.848725;, + -0.533776;-0.178235;0.826629;, + -0.604641;-0.410889;0.682334;, + -0.097373;-0.993304;-0.062171;, + 0.544150;0.817947;0.186717;, + 0.671652;0.718204;-0.181845;, + -0.520633;-0.800173;0.297766;, + 0.610984;0.085141;-0.787051;, + 0.315955;0.940947;0.121620;, + 0.450770;-0.364624;-0.814773;, + 0.034059;-0.236374;-0.971065;, + 0.126855;0.710394;-0.692277;, + -0.318398;0.686232;0.653995;, + -0.509804;-0.823253;0.249710;, + -0.828231;-0.560343;0.007058;, + -0.898012;0.382182;0.217971;, + -0.638411;-0.335141;0.692901;, + -0.521920;-0.736948;0.429543;, + -0.653621;0.114522;0.748107;, + -0.219228;-0.910600;-0.350351;, + -0.117938;0.862199;0.492649;, + 0.701914;0.653797;-0.282606;, + 0.566939;-0.044140;-0.822576;, + 0.698404;-0.196958;-0.688069;, + 0.634338;-0.406257;-0.657701;, + 0.726870;-0.133185;-0.673737;, + 0.790864;0.239727;-0.563086;, + 0.657555;0.711316;-0.248296;, + -0.154310;0.679156;0.717590;, + 0.231918;0.882106;0.410004;, + -0.412377;-0.755835;0.508585;, + -0.140943;-0.970084;0.197668;, + 0.311225;-0.875510;-0.369624;, + 0.597394;0.775849;-0.202927;, + -0.489055;-0.692585;0.530237;, + -0.491338;-0.534968;0.687311;, + -0.489758;-0.036774;0.871083;, + -0.438815;0.143442;0.887054;, + -0.286418;0.500490;0.816991;, + 0.627373;0.683168;-0.373745;, + 0.326963;0.774904;-0.540942;, + -0.154464;0.954555;0.254884;, + 0.414311;0.073885;-0.907131;, + 0.104101;0.966242;0.235666;, + 0.755011;0.321454;-0.571512;, + -0.578072;-0.401336;0.710466;, + 0.308722;0.426939;-0.849949;, + -0.156866;-0.502085;-0.850473;, + -0.244364;0.495312;-0.833638;, + -0.891274;-0.244321;-0.382017;, + -0.886836;0.434833;0.156336;, + 0.396048;-0.852920;0.340107;, + 0.958459;-0.005318;0.285179;, + -0.727155;-0.559204;0.398166;, + 0.313446;0.294967;0.902633;, + 0.568943;-0.193580;-0.799269;, + 0.540259;0.790932;-0.287309;, + -0.190782;-0.966119;-0.173828;, + 0.699601;0.319552;-0.639097;, + -0.461959;-0.866725;0.188099;, + -0.593538;-0.430185;0.680187;, + -0.129662;-0.954140;0.269823;, + 0.507759;-0.548313;-0.664480;, + -0.102172;0.911919;0.397447;, + 0.280146;-0.794859;0.538254;, + -0.896153;0.443634;0.009920;, + 0.604915;0.795184;0.041942;, + -0.370304;-0.909123;-0.190710;, + -0.469045;0.851012;0.236169;, + 0.715283;-0.213463;0.665435;, + 0.725324;-0.198324;0.659221;, + 0.906461;0.267020;-0.327153;, + 0.730965;-0.293094;0.616268;, + 0.426783;0.803078;-0.415839;, + 0.656180;0.614047;-0.438605;, + 0.414340;0.787894;0.455572;, + 0.387641;0.909810;0.148256;, + 0.067928;-0.995530;0.065615;, + -0.546062;-0.385173;0.743947;, + 0.023950;-0.995082;0.096118;, + -0.517968;-0.562667;0.644294;, + -0.214003;-0.959327;0.184103;, + 0.088411;-0.867050;-0.490314;, + -0.168195;-0.803638;0.570856;, + -0.761202;-0.602561;0.239776;, + -0.362576;0.544444;0.756386;, + -0.135361;-0.825017;0.548656;, + -0.403113;-0.761478;0.507594;, + -0.205138;-0.005818;0.978716;, + 0.500952;0.279713;0.819029;, + 0.826841;-0.523263;-0.206226;, + -0.600234;-0.799045;0.035307;, + -0.970404;-0.229202;0.076040;, + 0.780352;-0.359300;-0.511814;, + -0.914460;-0.230698;0.332477;, + -0.502437;0.667098;0.550034;, + 0.719999;0.682490;-0.125735;, + -0.268806;-0.896766;-0.351502;, + 0.915472;-0.398064;-0.058788;, + -0.888214;-0.136248;0.438762;, + -0.506181;0.569758;0.647422;, + 0.756777;0.576678;0.307785;, + -0.129004;-0.984436;0.119344;, + 0.777616;-0.116615;0.617830;, + -0.770465;-0.143678;0.621080;, + -0.343908;0.401841;0.848676;, + 0.264638;0.646667;0.715394;, + 0.216767;-0.499110;0.838989;, + 0.807418;0.487228;-0.332693;, + 0.374558;0.861007;0.344055;, + 0.808068;0.254617;-0.531221;, + 0.818120;0.339082;-0.464439;, + 0.221900;0.974980;0.013185;, + -0.108706;-0.976161;0.187863;, + -0.368776;-0.455644;0.810181;, + 0.538295;-0.631424;-0.558159;, + 0.867721;0.146537;-0.474959;, + 0.452458;0.832414;0.319950;, + -0.257983;0.544602;0.798031;, + -0.597196;-0.209677;0.774204;, + -0.171970;-0.985088;-0.005321;, + 0.456380;-0.580050;-0.674729;, + 0.769932;0.170761;-0.614854;, + 0.382238;0.901984;0.200798;, + -0.276717;0.544754;0.791625;, + -0.379263;-0.183823;0.906845;, + -0.068508;-0.994742;0.076127;, + 0.314063;-0.536259;-0.783448;, + 0.579129;0.233663;-0.781032;, + 0.240758;0.970584;-0.001211;, + -0.464359;0.605477;0.646350;, + -0.699843;-0.168934;0.694032;, + -0.205561;-0.977861;-0.039144;, + 0.329202;-0.554979;-0.763953;, + 0.738986;0.202412;-0.642596;, + 0.334240;0.935996;0.110429;, + -0.470908;0.619311;0.628251;, + -0.896664;-0.131474;0.422738;, + -0.491550;-0.803875;-0.334908;, + 0.488072;-0.623641;-0.610621;, + 0.885331;0.131251;-0.446051;, + 0.509708;0.786985;0.347638;, + -0.242430;0.521770;0.817914;, + -0.613783;-0.209259;0.761236;, + -0.262272;-0.961626;-0.080548;, + 0.450906;-0.603711;-0.657432;, + 0.828994;0.160795;-0.535644;, + 0.441803;0.858053;0.261828;, + -0.339070;0.554869;0.759705;, + -0.677756;-0.206419;0.705719;, + -0.259052;-0.964613;-0.049126;, + 0.229922;-0.482476;-0.845194;, + 0.778129;0.185891;-0.599966;, + 0.358173;0.924866;0.127809;, + -0.560979;0.636505;0.529305;, + -0.921070;-0.106291;0.374610;, + -0.585179;-0.715104;-0.382351;, + 0.327893;-0.527492;-0.783734;, + 0.868350;0.160550;-0.469245;, + 0.532377;0.790350;0.303185;, + -0.480825;0.612885;0.627040;, + -0.898116;-0.162902;0.408473;, + -0.523134;-0.798786;-0.297106;, + 0.582448;-0.641920;-0.498692;, + 0.908436;0.168554;-0.382535;, + 0.589372;0.731411;0.343042;, + -0.130859;0.472769;0.871416;, + -0.448382;-0.259742;0.855271;, + -0.122373;-0.962341;0.242745;, + 0.738199;-0.672946;-0.046963;, + 0.954319;0.143966;-0.261819;, + 0.684008;0.694622;0.222786;, + 0.114891;0.475550;0.872154;, + 0.045777;-0.249705;0.967239;, + 0.271381;-0.699800;0.660782;, + 0.788837;-0.361752;0.496862;, + 0.654098;0.265568;0.708258;, + 0.497233;-0.613394;-0.613602;, + 0.827960;0.156360;-0.538548;, + 0.441440;0.854796;0.272864;, + -0.263126;0.546005;0.795389;, + -0.560849;-0.216898;0.799002;, + -0.170563;-0.985283;0.011240;, + 0.446317;-0.594873;-0.668526;, + 0.761715;0.172975;-0.624396;, + 0.374777;0.907354;0.190397;, + -0.306469;0.543138;0.781715;, + -0.462053;-0.212056;0.861127;, + -0.101970;-0.991153;0.084961;, + 0.308543;-0.543003;-0.780992;, + 0.601734;0.229221;-0.765097;, + 0.257610;0.966081;0.018033;, + -0.452795;0.600684;0.658905;, + -0.728428;-0.184026;0.659945;, + -0.306842;-0.947200;-0.093060;, + 0.335867;-0.559796;-0.757510;, + 0.736062;0.204405;-0.645315;, + 0.336864;0.934902;0.111722;, + -0.456215;0.614991;0.643159;, + -0.874861;-0.145367;0.462046;, + -0.474606;-0.826156;-0.303671;, + 0.471488;-0.618541;-0.628574;, + 0.864110;0.144078;-0.482240;, + 0.488532;0.813107;0.316535;, + -0.263346;0.532405;0.804484;, + -0.629310;-0.211268;0.747886;, + -0.275179;-0.957479;-0.086667;, + 0.439782;-0.600782;-0.667573;, + 0.813245;0.167489;-0.557296;, + 0.428662;0.870727;0.241007;, + -0.345261;0.558515;0.754225;, + -0.683079;-0.206987;0.700399;, + -0.272796;-0.960329;-0.057884;, + 0.252684;-0.497453;-0.829875;, + 0.769539;0.190134;-0.609638;, + 0.357894;0.925399;0.124696;, + -0.537976;0.628508;0.561747;, + -0.898785;-0.123848;0.420531;, + -0.560059;-0.751673;-0.348312;, + 0.333904;-0.534319;-0.776538;, + 0.850206;0.173471;-0.497050;, + 0.514423;0.813291;0.271896;, + -0.467237;0.607846;0.642038;, + -0.877223;-0.172768;0.447918;, + -0.507195;-0.819398;-0.267097;, + 0.554845;-0.638321;-0.533566;, + 0.886565;0.182189;-0.425217;, + 0.568559;0.763899;0.305283;, + -0.165833;0.490715;0.855393;, + -0.481870;-0.264147;0.835480;, + -0.153896;-0.966580;0.205035;, + 0.701497;-0.701342;-0.126576;, + 0.933336;0.163949;-0.319380;, + 0.662234;0.725654;0.186743;, + 0.068015;0.505465;0.860162;, + -0.023671;-0.259197;0.965534;, + 0.209331;-0.750697;0.626605;, + 0.782976;-0.407275;0.470186;, + 0.636095;0.307826;0.707549;, + 0.501872;-0.611244;-0.611969;, + 0.840103;0.146832;-0.522176;, + 0.462884;0.829633;0.312165;, + -0.265565;0.544402;0.795677;, + -0.559285;-0.215968;0.800349;, + -0.160805;-0.986764;0.020920;, + 0.440673;-0.592878;-0.674020;, + 0.759649;0.173641;-0.626724;, + 0.382754;0.902313;0.198317;, + -0.292472;0.536722;0.791448;, + -0.440960;-0.214732;0.871461;, + -0.091558;-0.991696;0.090310;, + 0.294817;-0.536769;-0.790545;, + 0.589764;0.232855;-0.773277;, + 0.257798;0.966021;0.018516;, + -0.447421;0.598812;0.664258;, + -0.724551;-0.183967;0.664215;, + -0.309688;-0.945740;-0.098333;, + 0.324769;-0.553847;-0.766667;, + 0.732523;0.205397;-0.649017;, + 0.341567;0.932610;0.116491;, + -0.451790;0.613142;0.648030;, + -0.878402;-0.141688;0.456437;, + -0.485264;-0.815031;-0.316611;, + 0.467816;-0.617010;-0.632809;, + 0.867241;0.140845;-0.477553;, + 0.500477;0.800802;0.328997;, + -0.247760;0.524381;0.814641;, + -0.619273;-0.212829;0.755781;, + -0.276709;-0.956627;-0.091087;, + 0.434085;-0.598441;-0.673379;, + 0.814055;0.166484;-0.556415;, + 0.438174;0.862994;0.251485;, + -0.334234;0.553031;0.763180;, + -0.676607;-0.208759;0.706132;, + -0.274057;-0.959798;-0.060661;, + 0.236650;-0.488015;-0.840142;, + 0.767921;0.190323;-0.611616;, + 0.363214;0.922428;0.131159;, + -0.537145;0.628597;0.562442;, + -0.902882;-0.118846;0.413135;, + -0.572783;-0.736091;-0.360680;, + 0.323287;-0.527601;-0.785571;, + 0.852535;0.170393;-0.494115;, + 0.524892;0.802194;0.284559;, + -0.462849;0.606173;0.646780;, + -0.880811;-0.169994;0.441898;, + -0.517099;-0.808991;-0.279539;, + 0.555697;-0.637603;-0.533538;, + 0.890633;0.178263;-0.418325;, + 0.579718;0.749722;0.319132;, + -0.146317;0.479991;0.864985;, + -0.465888;-0.265274;0.844143;, + -0.147113;-0.966458;0.210517;, + 0.709732;-0.695413;-0.112611;, + 0.938240;0.157523;-0.308047;, + 0.672570;0.712761;0.199049;, + 0.090407;0.490418;0.866785;, + 0.003757;-0.259574;0.965716;, + 0.230207;-0.738918;0.633249;, + 0.787167;-0.396002;0.472811;, + 0.646355;0.289593;0.705947;, + 0.516966;-0.608447;-0.602112;, + 0.874128;0.114718;-0.471953;, + 0.517818;0.767923;0.377039;, + -0.212404;0.516342;0.829624;, + -0.588810;-0.221694;0.777274;, + -0.185391;-0.982309;-0.026433;, + 0.400936;-0.557240;-0.727141;, + 0.742127;0.178734;-0.645989;, + 0.419212;0.878727;0.228253;, + -0.215861;0.514387;0.829946;, + -0.329958;-0.208178;0.920755;, + -0.091396;-0.995301;0.031967;, + 0.255763;-0.507343;-0.822915;, + 0.544399;0.251635;-0.800193;, + 0.270805;0.961926;0.036910;, + -0.409694;0.584477;0.700383;, + -0.665604;-0.180080;0.724253;, + -0.229438;-0.970608;-0.072654;, + 0.271222;-0.525963;-0.806102;, + 0.711132;0.211599;-0.670461;, + 0.367730;0.919170;0.141072;, + -0.416769;0.599193;0.683573;, + -0.878049;-0.128957;0.460869;, + -0.529271;-0.771744;-0.352540;, + 0.434921;-0.604440;-0.667455;, + 0.865473;0.129965;-0.483804;, + 0.547625;0.754213;0.362311;, + -0.182521;0.489258;0.852827;, + -0.578412;-0.225413;0.783982;, + -0.294771;-0.948174;-0.118642;, + 0.395442;-0.582473;-0.710176;, + 0.805338;0.164263;-0.569604;, + 0.478885;0.830388;0.284824;, + -0.280896;0.526446;0.802466;, + -0.646450;-0.219247;0.730776;, + -0.290151;-0.953341;-0.083390;, + 0.170371;-0.449244;-0.877014;, + 0.752258;0.192773;-0.630037;, + 0.391734;0.906032;0.160159;, + -0.512610;0.622446;0.591432;, + -0.904174;-0.101462;0.414939;, + -0.620865;-0.680541;-0.389089;, + 0.271016;-0.497964;-0.823761;, + 0.848604;0.160114;-0.504217;, + 0.567325;0.759364;0.318604;, + -0.427834;0.592777;0.682329;, + -0.881165;-0.159727;0.445011;, + -0.558070;-0.768267;-0.313567;, + 0.535967;-0.630109;-0.561873;, + 0.892887;0.164047;-0.419335;, + 0.623516;0.698005;0.352159;, + -0.071795;0.436064;0.897047;, + -0.409232;-0.281070;0.868060;, + -0.136787;-0.970094;0.200516;, + 0.717370;-0.686582;-0.118260;, + 0.944105;0.133893;-0.301228;, + 0.711039;0.665994;0.225558;, + 0.170183;0.433298;0.885037;, + 0.089845;-0.282505;0.955049;, + 0.288287;-0.730355;0.619251;, + 0.804020;-0.394183;0.445166;, + 0.689840;0.223648;0.688551;, + 0.361674;0.913139;-0.188064;, + -0.306548;-0.658610;0.687213;, + -0.365602;-0.684685;0.630508;, + -0.220903;-0.824258;0.521346;, + -0.581318;-0.745933;0.325044;, + -0.588806;0.000143;0.808275;, + -0.496007;-0.714259;0.493772;, + 0.593600;0.707690;-0.383162;, + -0.196206;0.085242;-0.976851;, + -0.140780;0.989203;-0.040729;, + -0.715299;-0.614274;-0.333189;, + -0.975349;0.164237;-0.147377;, + -0.212301;-0.514564;0.830754;, + -0.297653;-0.114959;0.947727;, + 0.980593;0.188926;-0.052382;, + 0.665653;0.649226;0.367983;, + 0.302101;0.824457;0.478545;, + -0.123513;0.634708;0.762817;, + 0.426128;-0.774572;-0.467389;, + 0.781451;-0.186179;-0.595543;, + -0.113738;-0.981032;0.156973;, + -0.125935;-0.756333;0.641950;, + 0.214009;0.839435;0.499548;, + -0.315118;0.517253;0.795707;, + -0.459333;-0.851040;0.254447;, + -0.557305;-0.389761;0.733143;, + 0.644141;0.420432;-0.638999;, + 0.740902;0.430944;-0.515123;, + -0.149490;0.928257;0.340575;, + -0.077287;-0.823913;-0.561422;, + 0.511461;-0.189138;-0.838233;, + -0.381149;0.923821;0.035779;, + 0.392217;0.560751;0.729194;, + -0.184282;0.976156;0.114712;, + -0.567905;0.521114;-0.637122;, + 0.473718;0.414055;-0.777271;, + -0.529914;-0.324726;-0.783418;, + 0.226517;-0.970474;0.082885;, + -0.148924;-0.632604;-0.760022;, + 0.527039;0.781296;-0.334374;, + 0.834983;0.264476;-0.482552;, + 0.675963;0.077412;-0.732859;, + 0.160126;0.190092;-0.968620;, + 0.228376;-0.127237;-0.965223;, + -0.057386;0.245516;0.967692;, + -0.657416;-0.744773;-0.114531;, + -0.274099;0.701037;-0.658344;, + 0.876642;-0.442049;-0.189978;, + -0.779526;0.329121;0.532934;, + 0.327724;-0.696016;0.638873;, + -0.578535;0.674540;0.458576;, + -0.984941;0.135767;-0.107045;, + 0.422834;0.836078;-0.349550;, + 0.828789;0.540638;-0.144288;, + -0.034244;0.095893;-0.994802;, + 0.641365;-0.305210;-0.703916;, + 0.923772;-0.052794;0.379286;, + -0.076548;0.939750;-0.333181;, + -0.119540;-0.960478;0.251382;, + 0.669596;-0.615981;-0.414980;, + 0.303030;-0.186090;0.934635;, + 0.391442;0.389355;0.833772;, + -0.190416;0.835663;0.515178;, + 0.353633;-0.752104;0.556133;, + 0.520040;-0.156982;0.839592;, + -0.509830;-0.838926;-0.190465;, + 0.146090;-0.981553;0.123336;, + -0.607672;0.793048;-0.042537;, + -0.897162;0.033159;-0.440455;, + 0.839542;-0.269781;-0.471581;, + 0.963227;0.157435;-0.217736;, + 0.259132;0.699308;-0.666198;, + -0.604433;0.762690;0.230140;, + -0.423330;0.778916;0.462689;, + 0.434554;0.075722;0.897457;, + -0.006566;0.677353;0.735628;, + -0.749936;0.407739;-0.520908;, + -0.822491;0.188949;-0.536477;, + -0.756906;-0.145054;-0.637223;, + -0.423190;-0.716621;-0.554404;, + 0.227209;-0.966292;0.121063;, + 0.317550;-0.933835;0.164662;, + 0.496370;-0.182435;0.848725;, + 0.533776;-0.178235;0.826629;, + 0.604641;-0.410889;0.682334;, + 0.097373;-0.993304;-0.062171;, + -0.544149;0.817947;0.186718;, + -0.671652;0.718204;-0.181845;, + 0.520633;-0.800173;0.297766;, + -0.610984;0.085141;-0.787051;, + -0.315955;0.940947;0.121620;, + -0.451041;-0.364729;-0.814576;, + -0.034059;-0.236375;-0.971065;, + -0.126856;0.710394;-0.692277;, + 0.329848;0.675467;0.659503;, + 0.509804;-0.823253;0.249710;, + 0.828231;-0.560342;0.007058;, + 0.898012;0.382183;0.217970;, + 0.638411;-0.335141;0.692901;, + 0.521920;-0.736948;0.429544;, + 0.653620;0.114523;0.748107;, + 0.219228;-0.910600;-0.350351;, + 0.106711;0.863012;0.493785;, + -0.701914;0.653797;-0.282606;, + -0.566975;-0.044447;-0.822535;, + -0.698404;-0.196958;-0.688069;, + -0.634338;-0.406257;-0.657701;, + -0.726870;-0.133185;-0.673737;, + -0.790864;0.239728;-0.563085;, + -0.657555;0.711316;-0.248296;, + 0.154310;0.679156;0.717590;, + -0.231918;0.882106;0.410004;, + 0.412377;-0.755835;0.508585;, + 0.140943;-0.970084;0.197668;, + -0.311225;-0.875510;-0.369624;, + -0.597394;0.775849;-0.202926;, + 0.489055;-0.692585;0.530237;, + 0.491338;-0.534968;0.687311;, + 0.489758;-0.036774;0.871083;, + 0.438815;0.143443;0.887054;, + 0.286417;0.500491;0.816991;, + -0.627373;0.683167;-0.373744;, + -0.335799;0.770037;-0.542478;, + 0.129022;0.958535;0.254096;, + -0.414688;0.073903;-0.906958;, + -0.101432;0.966761;0.234701;, + -0.755011;0.321454;-0.571512;, + 0.578072;-0.401336;0.710466;, + -0.311908;0.427644;-0.848430;, + 0.156866;-0.502085;-0.850473;, + 0.197343;0.520839;-0.830532;, + 0.891275;-0.244321;-0.382017;, + 0.886836;0.434833;0.156336;, + -0.667053;-0.649082;0.365696;, + -0.890395;-0.035250;0.453822;, + 0.773169;-0.532910;0.343826;, + -0.301252;0.328615;0.895131;, + -0.552096;-0.122315;-0.824760;, + -0.523265;0.793302;-0.311232;, + 0.178067;-0.970384;-0.163240;, + -0.685065;0.319620;-0.654621;, + 0.472466;-0.858796;0.198106;, + 0.564413;-0.431202;0.703920;, + 0.113817;-0.948975;0.294097;, + -0.499148;-0.545190;-0.673512;, + 0.108599;0.911995;0.395565;, + -0.283846;-0.779062;0.559012;, + 0.894433;0.447026;-0.012553;, + -0.593050;0.804457;0.033773;, + 0.369368;-0.910324;-0.186757;, + 0.475166;0.851493;0.221757;, + -0.703251;-0.226621;0.673855;, + -0.714900;-0.212902;0.666026;, + -0.901123;0.269970;-0.339253;, + -0.721934;-0.308194;0.619538;, + -0.406662;0.800438;-0.440369;, + -0.636644;0.614134;-0.466395;, + -0.410648;0.785543;0.462915;, + -0.378074;0.914236;0.145713;, + -0.082476;-0.992964;0.084972;, + 0.519481;-0.388496;0.761059;, + -0.037907;-0.992141;0.119241;, + 0.491463;-0.565202;0.662579;, + 0.194400;-0.959689;0.202992;, + -0.096513;-0.870901;-0.481889;, + 0.146372;-0.791374;0.593551;, + 0.771799;-0.600975;0.207740;, + 0.351827;0.537583;0.766305;, + 0.117570;-0.811190;0.572842;, + 0.382914;-0.755359;0.531799;, + 0.188469;-0.005536;0.982064;, + -0.489616;0.263036;0.831317;, + -0.823845;-0.530391;-0.199912;, + 0.593325;-0.803737;0.044415;, + 0.971456;-0.226261;0.071272;, + -0.774625;-0.362944;-0.517907;, + 0.910154;-0.232627;0.342788;, + 0.500593;0.666086;0.552935;, + -0.712383;0.688225;-0.137322;, + 0.268876;-0.898540;-0.346889;, + -0.913491;-0.404743;-0.041435;, + 0.880171;-0.136698;0.454546;, + 0.498824;0.566633;0.655822;, + -0.755600;0.570720;0.321476;, + 0.122431;-0.981567;0.146753;, + -0.765877;-0.131961;0.629300;, + 0.760728;-0.149787;0.631552;, + 0.338248;0.393374;0.854895;, + -0.264307;0.634389;0.726424;, + -0.213763;-0.497719;0.840584;, + -0.797886;0.487994;-0.353892;, + -0.371167;0.862227;0.344672;, + -0.796796;0.254304;-0.548129;, + -0.806062;0.342622;-0.482571;, + -0.211446;0.977387;0.002139;, + 0.091470;-0.973373;0.210186;, + 0.342640;-0.450430;0.824445;, + -0.533434;-0.631638;-0.562567;, + -0.857968;0.149295;-0.491531;, + -0.449701;0.833860;0.320073;, + 0.247538;0.533303;0.808896;, + 0.568264;-0.213516;0.794661;, + 0.155037;-0.987820;0.013252;, + -0.447982;-0.577196;-0.682757;, + -0.751659;0.174053;-0.636172;, + -0.374900;0.906643;0.193515;, + 0.266062;0.534893;0.801936;, + 0.351269;-0.182121;0.918391;, + 0.050535;-0.994436;0.092426;, + -0.302952;-0.528059;-0.793330;, + -0.549673;0.237349;-0.800952;, + -0.224332;0.974321;-0.019323;, + 0.457685;0.602796;0.653575;, + 0.684758;-0.171791;0.708233;, + 0.194642;-0.980191;-0.036613;, + -0.320375;-0.545709;-0.774314;, + -0.721049;0.208194;-0.660866;, + -0.322509;0.941211;0.100551;, + 0.464637;0.616931;0.635224;, + 0.890129;-0.133886;0.435598;, + 0.489652;-0.803849;-0.337738;, + -0.482310;-0.621551;-0.617294;, + -0.877595;0.134138;-0.460255;, + -0.508349;0.786638;0.350401;, + 0.231555;0.510140;0.828335;, + 0.589307;-0.209611;0.780244;, + 0.252160;-0.965191;-0.069438;, + -0.443595;-0.600833;-0.664998;, + -0.815942;0.164862;-0.554130;, + -0.437536;0.861083;0.259033;, + 0.330057;0.546220;0.769874;, + 0.657713;-0.211590;0.722941;, + 0.245100;-0.968694;-0.039466;, + -0.218196;-0.468925;-0.855862;, + -0.762091;0.193297;-0.617943;, + -0.349430;0.929707;0.116373;, + 0.557674;0.637189;0.531969;, + 0.917107;-0.107418;0.383895;, + 0.584169;-0.712581;-0.388554;, + -0.320194;-0.517249;-0.793681;, + -0.861337;0.165443;-0.480341;, + -0.529397;0.791179;0.306226;, + 0.475036;0.610817;0.633438;, + 0.891719;-0.164077;0.421801;, + 0.519657;-0.799974;-0.299996;, + -0.579460;-0.642332;-0.501632;, + -0.902703;0.169362;-0.395530;, + -0.586870;0.729783;0.350716;, + 0.120529;0.460012;0.879694;, + 0.424021;-0.257028;0.868414;, + 0.109887;-0.957719;0.265895;, + -0.737915;-0.674242;-0.029655;, + -0.953246;0.142139;-0.266682;, + -0.681447;0.696126;0.225917;, + -0.117801;0.461501;0.879284;, + -0.057760;-0.247480;0.967170;, + -0.276840;-0.682651;0.676274;, + -0.783249;-0.356084;0.509632;, + -0.649761;0.259288;0.714549;, + -0.490701;-0.611734;-0.620479;, + -0.814477;0.160417;-0.557578;, + -0.437465;0.857775;0.269901;, + 0.252546;0.535085;0.806166;, + 0.530851;-0.218848;0.818720;, + 0.153105;-0.987769;0.029507;, + -0.438220;-0.592052;-0.676341;, + -0.742663;0.176560;-0.645971;, + -0.366910;0.912208;0.182358;, + 0.295401;0.533999;0.792201;, + 0.430440;-0.211071;0.877593;, + 0.080883;-0.991491;0.101995;, + -0.297424;-0.534529;-0.791086;, + -0.573038;0.233183;-0.785654;, + -0.241843;0.970315;0.000870;, + 0.445511;0.597421;0.666789;, + 0.711169;-0.187864;0.677455;, + 0.294543;-0.951626;-0.087479;, + -0.326742;-0.550893;-0.767956;, + -0.717174;0.210252;-0.664422;, + -0.325128;0.940226;0.101326;, + 0.449368;0.612043;0.650747;, + 0.866118;-0.148627;0.477232;, + 0.471883;-0.827537;-0.304152;, + -0.465089;-0.615834;-0.635956;, + -0.854249;0.147700;-0.498441;, + -0.486239;0.814255;0.317113;, + 0.252472;0.521534;0.815021;, + 0.604359;-0.212396;0.767879;, + 0.264549;-0.961449;-0.075028;, + -0.432019;-0.597419;-0.675611;, + -0.798667;0.171837;-0.576717;, + -0.423554;0.874399;0.236705;, + 0.335949;0.550139;0.764517;, + 0.662056;-0.212295;0.718758;, + 0.258679;-0.964803;-0.047336;, + -0.240978;-0.484831;-0.840755;, + -0.752439;0.197302;-0.628417;, + -0.348656;0.930401;0.113105;, + 0.533739;0.628202;0.566114;, + 0.892616;-0.126233;0.432784;, + 0.558454;-0.751040;-0.352235;, + -0.325458;-0.524380;-0.786831;, + -0.841062;0.178988;-0.510468;, + -0.510649;0.815434;0.272590;, + 0.460786;0.605148;0.649209;, + 0.868674;-0.174616;0.463589;, + 0.503088;-0.821745;-0.267651;, + -0.550996;-0.638131;-0.537766;, + -0.878623;0.183950;-0.440663;, + -0.565503;0.764222;0.310116;, + 0.154787;0.478816;0.864162;, + 0.455817;-0.261788;0.850704;, + 0.139459;-0.963610;0.228052;, + -0.702169;-0.703184;-0.111764;, + -0.930325;0.163693;-0.328175;, + -0.658831;0.728629;0.187194;, + -0.072427;0.492303;0.867406;, + 0.007565;-0.256091;0.966623;, + -0.219306;-0.733148;0.643738;, + -0.780241;-0.399104;0.481601;, + -0.633977;0.303269;0.711408;, + -0.495277;-0.609732;-0.618812;, + -0.827977;0.150869;-0.540085;, + -0.460415;0.831003;0.312174;, + 0.254891;0.533546;0.806448;, + 0.529349;-0.217483;0.820055;, + 0.143045;-0.988931;0.039412;, + -0.432483;-0.589889;-0.681901;, + -0.740510;0.177313;-0.648232;, + -0.375236;0.907074;0.190826;, + 0.281251;0.527055;0.801942;, + 0.409295;-0.213533;0.887063;, + 0.070334;-0.991770;0.106986;, + -0.283571;-0.527836;-0.800610;, + -0.560679;0.236847;-0.793437;, + -0.241981;0.970280;0.001457;, + 0.440073;0.595333;0.672246;, + 0.707551;-0.187802;0.681250;, + 0.297766;-0.950032;-0.093671;, + -0.315564;-0.544433;-0.777182;, + -0.713702;0.211367;-0.667797;, + -0.330019;0.937937;0.106587;, + 0.444854;0.609993;0.655754;, + 0.870079;-0.144889;0.471136;, + 0.482938;-0.815853;-0.318049;, + -0.461342;-0.614098;-0.640349;, + -0.857754;0.144449;-0.493348;, + -0.498612;0.801373;0.330434;, + 0.236801;0.512915;0.825133;, + 0.594213;-0.213844;0.775359;, + 0.266370;-0.960543;-0.080021;, + -0.426219;-0.594861;-0.681526;, + -0.799637;0.170933;-0.575641;, + -0.433484;0.866383;0.247934;, + 0.324837;0.544170;0.773537;, + 0.655674;-0.214147;0.724039;, + 0.260147;-0.964238;-0.050689;, + -0.224869;-0.474782;-0.850891;, + -0.750921;0.197735;-0.630094;, + -0.354271;0.927410;0.120013;, + 0.532960;0.628250;0.566794;, + 0.897185;-0.121051;0.424742;, + 0.571470;-0.734766;-0.365432;, + -0.314900;-0.517199;-0.795828;, + -0.843867;0.175890;-0.506904;, + -0.521492;0.803821;0.286214;, + 0.456355;0.603310;0.654031;, + 0.872676;-0.171770;0.457090;, + 0.513321;-0.810862;-0.281077;, + -0.551857;-0.637341;-0.537819;, + -0.883114;0.179896;-0.433297;, + -0.576959;0.749316;0.325029;, + 0.135489;0.467543;0.873525;, + 0.440209;-0.262810;0.858573;, + 0.133199;-0.963203;0.233450;, + -0.710203;-0.697232;-0.097362;, + -0.935703;0.156918;-0.315970;, + -0.669545;0.715214;0.200446;, + -0.094199;0.476771;0.873966;, + -0.018339;-0.256626;0.966337;, + -0.238806;-0.721445;0.649991;, + -0.783588;-0.388614;0.484736;, + -0.643422;0.284541;0.710665;, + -0.510465;-0.607468;-0.608611;, + -0.865352;0.117258;-0.487255;, + -0.517106;0.766062;0.381772;, + 0.201577;0.503110;0.840385;, + 0.559705;-0.225972;0.797288;, + 0.169147;-0.985551;-0.008917;, + -0.391192;-0.551987;-0.736396;, + -0.722016;0.183057;-0.667221;, + -0.413059;0.883017;0.222853;, + 0.204883;0.502219;0.840119;, + 0.302341;-0.206622;0.930536;, + 0.074487;-0.996148;0.046270;, + -0.244152;-0.497096;-0.832638;, + -0.514194;0.255863;-0.818620;, + -0.255335;0.966621;0.021159;, + 0.401612;0.579399;0.709228;, + 0.649553;-0.183473;0.737847;, + 0.220057;-0.972841;-0.071803;, + -0.261639;-0.514291;-0.816731;, + -0.692069;0.218095;-0.688095;, + -0.357168;0.924491;0.133220;, + 0.408987;0.594527;0.692291;, + 0.870070;-0.132357;0.474826;, + 0.528108;-0.770628;-0.356699;, + -0.427611;-0.599957;-0.676166;, + -0.856204;0.133913;-0.498980;, + -0.546962;0.752871;0.366086;, + 0.171512;0.475490;0.862840;, + 0.552739;-0.226309;0.802037;, + 0.285690;-0.951981;-0.110058;, + -0.386791;-0.577398;-0.719030;, + -0.790608;0.169376;-0.588431;, + -0.475563;0.832664;0.283745;, + 0.271095;0.515384;0.812949;, + 0.625528;-0.224964;0.747065;, + 0.277394;-0.957771;-0.075676;, + -0.158619;-0.433804;-0.886935;, + -0.735093;0.201108;-0.647452;, + -0.383943;0.910904;0.151136;, + 0.507899;0.621019;0.596970;, + 0.898964;-0.103555;0.425605;, + 0.620222;-0.677171;-0.395935;, + -0.262650;-0.485562;-0.833813;, + -0.840648;0.165742;-0.515597;, + -0.564993;0.759241;0.323012;, + 0.420631;0.588517;0.690447;, + 0.873310;-0.161587;0.459587;, + 0.555273;-0.768494;-0.317946;, + -0.531432;-0.628929;-0.567476;, + -0.885679;0.165648;-0.433744;, + -0.621552;0.695340;0.360798;, + 0.062071;0.421776;0.904573;, + 0.384608;-0.278152;0.880175;, + 0.124293;-0.966893;0.222865;, + -0.717453;-0.688923;-0.103178;, + -0.942100;0.132658;-0.307975;, + -0.709039;0.666859;0.229265;, + -0.171508;0.418312;0.891964;, + -0.099615;-0.279056;0.955094;, + -0.293476;-0.713393;0.636351;, + -0.798889;-0.388529;0.459153;, + -0.684430;0.217897;0.695756;, + -0.341059;0.917128;-0.206289;, + 0.285530;-0.650577;0.703720;, + 0.340151;-0.678735;0.650858;, + 0.201228;-0.818516;0.538087;, + 0.561306;-0.750896;0.347982;, + 0.563755;-0.000870;0.825942;, + 0.476551;-0.712046;0.515644;, + -0.572616;0.710735;-0.408614;, + 0.160884;0.118423;-0.979843;, + 0.092128;0.995149;-0.034495;, + 0.715299;-0.614274;-0.333189;, + 0.975349;0.164237;-0.147377;, + 0.212302;-0.514565;0.830753;, + 0.364121;-0.117457;0.923915;, + -0.972391;0.228560;0.047083;, + -0.721943;0.609310;0.327933;, + -0.355783;0.818541;0.451009;, + 0.166307;0.647301;0.743870;, + -0.492298;-0.784288;-0.377538;, + -0.924095;-0.209976;-0.319310;, + 0.079861;-0.979451;0.185195;, + 0.091672;-0.754828;0.649485;, + -0.169599;0.852875;0.493802;, + 0.305489;0.522454;0.796064;, + 0.451821;-0.854320;0.256893;, + 0.549353;-0.390720;0.738613;, + -0.644141;0.420432;-0.638999;, + -0.740902;0.430944;-0.515123;, + 0.149490;0.928257;0.340575;, + 0.077287;-0.823913;-0.561422;, + -0.511461;-0.189138;-0.838233;, + 0.343698;0.922858;0.173795;, + -0.260653;0.953967;0.148347;, + 0.783381;0.503370;0.364599;, + -0.066996;0.879109;0.471889;, + -0.710934;0.444973;0.544584;, + 0.289636;0.949061;0.124075;, + -0.362112;0.926712;0.100395;, + -0.000001;0.818760;0.574136;, + -0.000000;0.868934;-0.494927;, + -0.000000;0.630324;-0.776332;, + 0.022686;-0.036383;0.999080;, + -0.000000;0.298174;-0.954511;, + -0.000000;0.998500;0.054759;, + -0.000000;-0.444151;0.895952;, + -0.000000;-0.029730;-0.999558;, + -0.142878;-0.121955;-0.982198;, + -0.808123;-0.461550;-0.365936;, + -0.793812;0.600245;-0.097818;, + -0.540286;0.724558;-0.427911;, + -0.496164;0.335976;-0.800588;, + -0.654263;-0.049613;-0.754638;, + -0.660157;-0.104107;0.743878;, + -0.861728;0.431543;-0.266824;, + -0.338650;-0.330283;0.881039;, + -0.231714;-0.275342;0.933003;, + -0.899678;-0.251384;-0.356911;, + -0.563708;-0.395781;-0.724976;, + -0.944986;-0.217661;0.244183;, + -0.232970;0.970399;0.063643;, + -0.886311;0.419497;-0.196151;, + -0.284112;0.944212;0.166567;, + -0.394637;-0.137254;0.908528;, + 0.012819;0.940525;0.339483;, + 0.382016;0.040071;0.923286;, + -0.733140;-0.437535;0.520643;, + -0.879018;0.070016;-0.471619;, + -0.965289;-0.090055;-0.245168;, + -0.404283;-0.450662;0.795902;, + -0.432713;-0.354931;0.828724;, + -0.302341;0.947980;-0.099615;, + -0.235609;0.971832;-0.005539;, + -0.978433;-0.005143;0.206502;, + -0.422789;0.519154;-0.742784;, + -0.929825;-0.231328;0.286203;, + -0.699443;-0.209423;-0.683316;, + -0.534104;0.546724;-0.644846;, + -0.806852;-0.393759;-0.440389;, + -0.691836;-0.542995;-0.475940;, + -0.877724;-0.460197;-0.133489;, + -0.178300;-0.323577;-0.929251;, + -0.937849;0.041613;0.344540;, + 0.109013;0.571900;0.813048;, + -0.863890;0.503678;-0.001488;, + -0.683696;0.235194;-0.690828;, + -0.778100;0.232231;-0.583635;, + -0.438702;-0.571900;-0.693160;, + -0.650020;0.481538;-0.587874;, + 0.244916;-0.017761;-0.969382;, + -0.903353;-0.418768;0.092664;, + -0.958406;0.281953;-0.044275;, + -0.880526;-0.190072;0.434220;, + -0.935327;-0.048151;-0.350493;, + -0.760323;0.281570;-0.585344;, + -0.722182;-0.107325;-0.683326;, + -0.967430;-0.242896;0.071282;, + -0.927251;-0.170149;-0.333550;, + -0.812213;-0.330990;0.480369;, + -0.587234;0.666265;-0.459617;, + 0.466081;0.838695;0.281709;, + -0.994998;-0.099822;0.003920;, + -0.742055;0.487282;0.460338;, + -0.638869;-0.759326;-0.123572;, + -0.715743;0.327208;0.616966;, + 0.371066;-0.555663;-0.744008;, + -0.559606;-0.645175;-0.520183;, + -0.649884;-0.689957;-0.318763;, + 0.681463;-0.724191;0.105620;, + -0.880620;-0.412930;0.232375;, + 0.709052;-0.704833;0.021360;, + -0.701635;0.645253;-0.302255;, + 0.427690;0.903455;0.029168;, + -0.710107;0.193070;-0.677105;, + -0.778125;0.252214;0.575248;, + 0.148716;0.940575;0.305291;, + 0.238521;-0.062437;-0.969128;, + -0.963144;0.085488;-0.255042;, + 0.369513;0.922029;-0.115428;, + -0.958565;-0.067036;-0.276873;, + 0.270983;-0.447194;-0.852400;, + -0.772474;0.623053;0.122835;, + 0.815356;0.157407;-0.557151;, + -0.138796;-0.893977;-0.426076;, + 0.364772;0.804729;-0.468352;, + -0.981550;-0.062615;-0.180661;, + 0.260027;-0.887566;-0.380279;, + -0.491771;0.675224;-0.549758;, + 0.216661;-0.945949;-0.241328;, + 0.945124;0.201537;-0.257146;, + 0.329095;0.723521;-0.606806;, + 0.194660;-0.960634;0.198216;, + -0.996307;-0.033233;-0.079173;, + -0.909493;0.374402;-0.180680;, + 0.854421;0.045584;-0.517577;, + 0.133919;-0.936841;0.323101;, + 0.090562;0.392235;-0.915396;, + -0.081213;-0.839344;0.537500;, + -0.974141;-0.162751;0.156724;, + -0.567495;0.823354;0.006191;, + 0.012874;0.004539;-0.999907;, + -0.920422;-0.390245;0.023083;, + 0.556206;0.718401;-0.417774;, + -0.948091;-0.001386;0.317996;, + -0.050023;-0.977498;-0.204928;, + -0.311902;0.571486;-0.759026;, + -0.196380;-0.929366;-0.312591;, + -0.949563;-0.144224;0.278441;, + -0.792912;0.574314;-0.203603;, + 0.639171;-0.463937;-0.613370;, + -0.225631;-0.823775;0.520082;, + 0.170996;0.152764;-0.973357;, + -0.879432;-0.156838;0.449446;, + 0.524143;-0.666593;0.530026;, + -0.269195;0.577034;-0.771081;, + 0.852228;-0.478675;-0.211134;, + -0.343783;-0.770945;0.536151;, + -0.679363;0.590395;0.435775;, + -0.069213;0.427125;-0.901540;, + -0.757904;-0.558344;-0.337392;, + 0.136274;0.884818;0.445562;, + 0.102555;-0.767205;-0.633151;, + -0.844716;-0.397357;0.358555;, + -0.146612;0.912426;-0.382077;, + 0.511756;-0.836540;-0.195723;, + -0.619780;-0.487134;0.615283;, + -0.387513;0.049103;-0.920555;, + -0.707902;-0.012374;0.706203;, + 0.139613;-0.971369;0.192223;, + -0.431272;0.675463;-0.598125;, + 0.565995;-0.635897;-0.524676;, + -0.798576;-0.307164;0.517617;, + 0.372732;0.864234;-0.337891;, + 0.014166;0.945681;-0.324786;, + 0.287479;0.796616;-0.531751;, + 0.136032;0.650716;-0.747037;, + -0.122359;-0.207776;0.970493;, + -0.744782;-0.430097;-0.510212;, + 0.065371;-0.737389;0.672298;, + 0.825383;-0.420119;-0.377152;, + 0.793812;0.600245;-0.097818;, + 0.540286;0.724558;-0.427911;, + 0.496164;0.335976;-0.800588;, + 0.654263;-0.049613;-0.754638;, + 0.690046;-0.132524;0.711529;, + 0.945515;0.306078;-0.110984;, + 0.329239;-0.308298;0.892499;, + 0.231714;-0.275342;0.933003;, + 0.899678;-0.251384;-0.356911;, + 0.563708;-0.395781;-0.724976;, + 0.930868;-0.256053;0.260617;, + 0.232970;0.970399;0.063643;, + 0.886230;0.418543;-0.198540;, + 0.284111;0.944212;0.166568;, + 0.394636;-0.137254;0.908528;, + -0.012819;0.940525;0.339483;, + -0.382017;0.040070;0.923286;, + 0.732571;-0.437022;0.521873;, + 0.879018;0.070016;-0.471619;, + 0.965023;-0.089095;-0.246563;, + 0.404283;-0.450662;0.795902;, + 0.432713;-0.354931;0.828724;, + 0.302341;0.947980;-0.099615;, + 0.235609;0.971832;-0.005539;, + 0.993793;-0.011471;0.110653;, + 0.629863;0.520365;-0.576622;, + 0.930521;-0.221376;0.291758;, + 0.490285;-0.201883;-0.847858;, + 0.553016;0.656553;-0.512944;, + 0.836668;-0.377812;-0.396542;, + 0.642185;-0.647026;-0.411043;, + 0.872770;-0.467932;-0.138969;, + 0.366430;-0.311048;-0.876914;, + 0.940115;0.027121;0.339777;, + -0.109013;0.571900;0.813048;, + 0.863890;0.503678;-0.001488;, + 0.683696;0.235194;-0.690828;, + 0.778100;0.232231;-0.583635;, + 0.438702;-0.571900;-0.693160;, + 0.650020;0.481538;-0.587874;, + -0.244916;-0.017761;-0.969382;, + 0.903353;-0.418768;0.092664;, + 0.958406;0.281953;-0.044275;, + 0.880526;-0.190072;0.434220;, + 0.935327;-0.048151;-0.350493;, + 0.760323;0.281570;-0.585344;, + 0.722182;-0.107325;-0.683326;, + 0.967430;-0.242896;0.071282;, + 0.932085;0.115972;-0.343175;, + 0.812213;-0.330991;0.480370;, + 0.587234;0.666265;-0.459616;, + -0.466081;0.838695;0.281709;, + 0.994998;-0.099822;0.003920;, + 0.742055;0.487282;0.460338;, + 0.638869;-0.759326;-0.123572;, + 0.715743;0.327208;0.616966;, + -0.371067;-0.555662;-0.744008;, + 0.559606;-0.645176;-0.520182;, + 0.649884;-0.689957;-0.318763;, + -0.681463;-0.724191;0.105620;, + 0.880620;-0.412930;0.232375;, + -0.709052;-0.704833;0.021360;, + 0.701635;0.645253;-0.302255;, + -0.427690;0.903455;0.029168;, + 0.710107;0.193070;-0.677105;, + 0.778125;0.252214;0.575248;, + -0.148717;0.940575;0.305291;, + -0.238521;-0.062437;-0.969128;, + 0.963144;0.085488;-0.255042;, + -0.369513;0.922029;-0.115427;, + 0.958565;-0.067035;-0.276873;, + -0.270983;-0.447194;-0.852400;, + 0.772474;0.623053;0.122835;, + -0.815356;0.157406;-0.557151;, + 0.138796;-0.893977;-0.426076;, + -0.364772;0.804729;-0.468351;, + 0.981550;-0.062615;-0.180662;, + -0.260027;-0.887566;-0.380279;, + 0.491771;0.675224;-0.549757;, + -0.216662;-0.945949;-0.241327;, + -0.945124;0.201537;-0.257145;, + -0.329095;0.723521;-0.606806;, + -0.194660;-0.960634;0.198216;, + 0.996307;-0.033233;-0.079173;, + 0.909493;0.374402;-0.180680;, + -0.854421;0.045584;-0.517577;, + -0.133919;-0.936841;0.323101;, + -0.090562;0.392236;-0.915396;, + 0.081214;-0.839343;0.537501;, + 0.974141;-0.162751;0.156724;, + 0.567495;0.823354;0.006191;, + -0.012874;0.004539;-0.999907;, + 0.920422;-0.390245;0.023083;, + -0.556206;0.718401;-0.417774;, + 0.948091;-0.001386;0.317996;, + 0.050023;-0.977498;-0.204928;, + 0.311902;0.571486;-0.759026;, + 0.196380;-0.929366;-0.312591;, + 0.949563;-0.144224;0.278441;, + 0.792912;0.574314;-0.203603;, + -0.639171;-0.463937;-0.613370;, + 0.225631;-0.823775;0.520082;, + -0.170996;0.152764;-0.973357;, + 0.879431;-0.156838;0.449446;, + -0.524143;-0.666593;0.530026;, + 0.269195;0.577035;-0.771081;, + -0.852228;-0.478675;-0.211134;, + 0.343783;-0.770945;0.536151;, + 0.679363;0.590395;0.435775;, + 0.069213;0.427125;-0.901540;, + 0.757904;-0.558344;-0.337392;, + -0.136274;0.884818;0.445562;, + -0.102555;-0.767205;-0.633151;, + 0.844716;-0.397357;0.358555;, + 0.146612;0.912426;-0.382077;, + -0.511756;-0.836540;-0.195723;, + 0.619780;-0.487134;0.615283;, + 0.387513;0.049103;-0.920555;, + 0.707902;-0.012374;0.706203;, + -0.139613;-0.971369;0.192223;, + 0.431272;0.675463;-0.598125;, + -0.565995;-0.635897;-0.524676;, + 0.798576;-0.307164;0.517617;, + -0.372732;0.864234;-0.337891;, + -0.014166;0.945682;-0.324786;, + -0.287480;0.796615;-0.531751;, + -0.136031;0.650716;-0.747037;, + 0.063281;-0.182379;0.981190;, + 0.744782;-0.430097;-0.510212;, + -0.065371;-0.737389;0.672297;, + 0.242215;-0.246754;0.938320;, + 0.635245;-0.260985;0.726877;, + 0.443696;-0.614785;0.652053;, + -0.265295;-0.652176;0.710130;, + -0.648919;-0.348867;0.676163;, + -0.397813;-0.198937;0.895639;, + 0.049073;-0.204317;0.977674;, + -0.039297;-0.189054;0.981180;, + 0.042148;-0.245267;0.968539;, + 0.122612;-0.131708;0.983676;, + -0.082911;-0.112202;0.990220;, + -0.065750;-0.212323;0.974985;, + -0.107811;-0.124346;0.986365;, + 0.072040;-0.126121;0.989396;, + 0.286232;0.533920;0.795614;, + 0.681710;0.448230;0.578240;, + 0.442638;0.535858;0.718977;, + -0.272537;0.592573;0.758011;, + -0.678219;0.463836;0.569978;, + -0.469139;0.498329;0.729093;, + -0.486813;0.401144;0.775949;, + 0.270328;0.467343;0.841733;, + 0.481839;0.061419;0.874105;, + -0.260992;0.019086;0.965152;, + -0.066960;-0.234819;0.969730;, + -0.176247;-0.368579;0.912736;, + -0.079517;-0.598520;0.797152;, + -0.104641;-0.637894;0.762982;, + 0.096455;-0.656739;0.747924;, + 0.084066;-0.581895;0.808907;, + 0.160432;-0.493238;0.854973;, + 0.092826;-0.336818;0.936983;, + 0.092734;0.032753;0.995152;, + 0.229366;-0.570134;0.788884;, + -0.129323;-0.659103;0.740850;, + -0.183671;-0.023684;0.982702;, + -0.067661;0.044691;0.996707;, + 0.019304;0.109444;0.993806;, + 0.226330;-0.455250;0.861117;, + -0.140511;-0.530214;0.836140;, + 0.173978;0.048446;0.983557;, + 0.259238;-0.273146;0.926384;, + 0.073201;-0.495418;0.865565;, + -0.058649;-0.557668;0.827990;, + -0.219771;-0.310915;0.924680;, + -0.239988;-0.091534;0.966451;, + -0.291412;-0.211959;0.932820;, + -0.286618;-0.466882;0.836583;, + -0.190235;-0.605085;0.773099;, + 0.172409;-0.697401;0.695634;, + 0.280972;-0.565349;0.775523;, + 0.289547;-0.289019;0.912486;, + 0.186923;-0.086989;0.978516;, + -0.151991;-0.014575;0.988274;, + -0.131683;0.178611;0.975068;, + -0.206562;0.358665;0.910325;, + 0.105053;0.413601;0.904377;, + 0.222869;0.170993;0.959735;, + 0.108320;0.139524;0.984276;, + 0.003378;0.187304;0.982296;, + -0.090953;-0.194377;0.976701;, + 0.077236;-0.374250;0.924106;, + 0.038429;0.134035;0.990231;, + -0.111070;0.170840;0.979018;, + -0.204097;-0.632222;0.747422;, + -0.161637;-0.628760;0.760614;, + -0.175808;-0.446894;0.877142;, + -0.281966;-0.632869;0.721091;, + 0.179888;-0.708343;0.682562;, + 0.214505;-0.445287;0.869314;, + 0.152468;-0.594574;0.789453;, + 0.193876;-0.662157;0.723851;, + 0.123846;-0.611873;0.781200;, + -0.079249;-0.616369;0.783460;, + 0.049874;-0.978437;-0.200432;, + -0.035951;-0.982834;-0.180953;, + 0.077777;-0.993666;-0.081114;, + 0.403086;-0.867962;-0.290108;, + 0.558443;-0.699105;0.446535;, + -0.488240;-0.590800;0.642322;, + -0.607999;-0.786791;-0.106285;, + -0.091466;-0.994758;-0.045715;, + 0.256995;0.268178;-0.928458;, + -0.166142;0.251406;-0.953516;, + -0.095345;0.037239;0.994747;, + -0.370667;-0.065770;0.926434;, + 0.280533;-0.103181;0.954282;, + 0.207488;0.068228;0.975855;, + 0.038993;0.114275;-0.992684;, + -0.175719;0.233559;-0.956333;, + 0.165697;0.233366;-0.958167;, + 0.053631;0.218456;-0.974372;, + -0.010918;-0.937228;0.348545;, + 0.014300;-0.847026;0.531360;, + 0.004816;-0.999834;-0.017554;, + 0.002019;-0.991929;-0.126778;, + -0.393237;-0.075695;0.916316;, + -0.593252;-0.198602;0.780134;, + -0.801728;-0.276819;0.529721;, + -0.745782;-0.452954;0.488509;, + -0.649090;-0.376567;0.660969;, + -0.458591;-0.157315;0.874612;, + -0.968072;-0.167164;0.186798;, + -0.934333;-0.238125;0.265177;, + -0.890013;-0.434949;0.136735;, + -0.707919;-0.624087;-0.330705;, + -0.639626;-0.282386;-0.714938;, + -0.856324;-0.247040;-0.453521;, + -0.832452;-0.027354;0.553421;, + -0.841263;0.012869;0.540474;, + -0.853170;-0.076223;0.516034;, + -0.834930;-0.138418;0.532666;, + -0.827207;-0.174679;0.534056;, + -0.881766;-0.204181;0.425205;, + -0.920811;-0.172908;0.349584;, + -0.930713;-0.092278;0.353918;, + 0.122342;-0.917267;-0.379018;, + 0.795254;-0.584691;0.160333;, + 0.561923;-0.336734;0.755548;, + -0.150071;-0.273204;0.950178;, + -0.980461;-0.107800;0.164548;, + -0.960272;-0.212083;0.181378;, + -0.960078;-0.207732;0.187344;, + -0.932337;-0.361278;-0.015029;, + -0.945731;0.117071;0.303128;, + -0.334038;-0.502642;0.797352;, + -0.350540;-0.465852;0.812468;, + -0.651677;-0.366116;0.664286;, + -0.967035;-0.000199;0.254642;, + -0.984181;0.095585;0.149171;, + -0.626720;0.119837;0.769975;, + -0.469079;0.821207;0.324936;, + 0.328196;0.910764;-0.250592;, + -0.727588;-0.072780;0.682143;, + -0.689076;-0.199468;0.696697;, + -0.759279;0.153427;0.632421;, + -0.823955;0.147553;0.547108;, + -0.741015;0.256716;0.620479;, + -0.905729;0.033236;0.422553;, + -0.846614;0.094112;0.523821;, + -0.711348;-0.027696;0.702294;, + -0.628541;-0.139705;0.765127;, + -0.517895;-0.349245;0.780905;, + -0.389382;0.113081;0.914108;, + -0.398643;0.133025;0.907407;, + -0.438066;0.181809;0.880366;, + -0.630900;0.151210;0.760987;, + -0.683144;0.666444;0.298609;, + -0.765711;0.612011;0.197811;, + -0.885977;0.311352;-0.343665;, + -0.882389;0.457062;-0.111735;, + -0.312289;-0.020978;0.949755;, + -0.282556;0.149017;0.947605;, + -0.841467;-0.090092;0.532745;, + -0.788033;-0.596961;0.150471;, + -0.281499;-0.319000;0.904985;, + -0.196716;-0.369433;0.908197;, + -0.161057;0.188926;0.968694;, + -0.117921;0.367554;0.922496;, + -0.165544;0.271340;0.948140;, + -0.448479;-0.324300;0.832884;, + -0.373171;-0.182007;0.909735;, + -0.585369;-0.257475;0.768797;, + -0.646693;-0.180851;0.741000;, + -0.433896;-0.034239;0.900312;, + -0.544015;0.013208;0.838971;, + -0.625281;0.038322;0.779458;, + -0.369810;0.339166;0.864990;, + -0.204468;0.130905;0.970081;, + -0.120885;-0.263543;0.957043;, + -0.337644;-0.437144;0.833607;, + -0.578208;-0.404603;0.708500;, + -0.370647;-0.182064;0.910754;, + -0.290198;-0.101172;0.951603;, + -0.376940;-0.512489;0.771538;, + -0.368633;-0.522608;0.768759;, + -0.486995;-0.560041;0.670216;, + -0.278178;-0.381573;0.881487;, + -0.075087;-0.187485;0.979393;, + -0.067375;0.165266;0.983945;, + -0.074430;0.262323;0.962105;, + 0.123594;0.167946;0.978018;, + 0.073851;0.127234;0.989120;, + -0.922972;-0.305031;0.234690;, + -0.940045;-0.272592;0.204959;, + -0.942479;-0.228737;0.243746;, + -0.916339;-0.265300;0.299899;, + -0.855199;-0.298439;0.423756;, + -0.762216;-0.394376;0.513317;, + -0.591911;-0.483389;0.644962;, + -0.696085;-0.423324;0.579881;, + -0.793967;-0.433457;0.426300;, + -0.881668;-0.367645;0.295802;, + -0.919076;-0.289884;0.266959;, + -0.896238;-0.324230;0.302709;, + -0.875589;-0.290272;0.386116;, + -0.837502;-0.227848;0.496665;, + -0.720126;0.080544;0.689153;, + -0.681826;0.051070;0.729729;, + -0.541528;0.261668;0.798923;, + -0.412827;0.304371;0.858448;, + -0.544132;0.538485;0.643393;, + -0.766691;0.438289;0.469135;, + -0.727958;0.390427;0.563599;, + -0.713113;0.317666;0.624947;, + -0.568038;-0.171249;0.804989;, + -0.614593;-0.512301;0.599852;, + -0.324992;-0.273417;0.905330;, + -0.325078;-0.097406;0.940657;, + -0.427217;0.076319;0.900922;, + -0.776082;0.381416;0.502213;, + -0.672565;0.634444;0.380968;, + -0.608698;0.697609;0.377927;, + -0.527897;0.632893;0.566367;, + -0.603113;0.411655;0.683224;, + -0.313344;0.022068;0.949383;, + -0.231524;-0.066876;0.970528;, + -0.168915;0.015046;0.985516;, + -0.221507;-0.014091;0.975057;, + -0.641279;-0.037093;-0.766410;, + -0.703969;-0.213682;-0.677324;, + -0.536901;-0.391985;-0.747051;, + -0.249177;0.220454;0.943033;, + -0.581291;0.278155;0.764677;, + -0.999289;-0.036353;-0.009963;, + -0.980048;-0.042446;-0.194177;, + -0.915136;0.144087;0.376517;, + -0.891750;0.158913;0.423707;, + -0.938708;0.033166;0.343115;, + -0.828350;0.374825;0.416345;, + -0.780750;0.319185;0.537169;, + -0.755930;0.332141;0.564138;, + -0.617201;0.537677;0.574427;, + -0.677696;0.597263;0.428958;, + -0.719767;-0.501742;0.479782;, + -0.506828;-0.552613;0.661622;, + -0.280970;-0.686116;0.671044;, + -0.292440;-0.656510;0.695323;, + -0.545799;-0.705691;0.451778;, + -0.967562;-0.216680;0.129901;, + -0.902540;-0.358906;0.237926;, + -0.767894;-0.587008;-0.256438;, + -0.649296;-0.476465;-0.592786;, + -0.838696;-0.334311;-0.429913;, + -0.596950;0.129505;0.791757;, + -0.784941;0.297168;0.543653;, + -0.720007;0.579195;0.382260;, + -0.583842;0.689444;0.428713;, + -0.529134;0.371967;0.762664;, + -0.395432;0.106411;0.912310;, + -0.447528;0.159246;0.879977;, + -0.407621;0.029059;0.912689;, + -0.490926;-0.004529;0.871189;, + -0.502973;0.024472;0.863955;, + -0.333013;-0.145713;0.931595;, + -0.207654;-0.252851;0.944958;, + -0.240287;-0.513231;0.823927;, + -0.450979;-0.500707;0.738857;, + -0.471005;-0.228916;0.851911;, + -0.842645;0.074691;0.533264;, + -0.816604;0.149701;0.557447;, + -0.737941;-0.003814;0.674855;, + -0.624475;-0.079418;0.776996;, + -0.702800;-0.238155;0.670339;, + -0.742410;-0.287823;0.604968;, + -0.834300;-0.079963;0.545482;, + -0.604495;0.234318;0.761367;, + -0.597482;0.269303;0.755308;, + -0.733246;0.420582;0.534286;, + -0.770729;0.354878;0.529187;, + -0.633754;0.199721;0.747307;, + -0.297362;-0.358005;0.885104;, + -0.394508;-0.419178;0.817712;, + -0.387859;-0.471158;0.792196;, + -0.360382;-0.488667;0.794563;, + -0.242655;-0.150104;0.958430;, + -0.204607;0.076638;0.975839;, + -0.075224;0.067895;0.994853;, + -0.072401;-0.157753;0.984821;, + -0.133760;-0.197065;0.971223;, + -0.421526;-0.376333;0.825039;, + -0.113815;0.102436;0.988207;, + -0.159036;0.237863;0.958190;, + -0.363394;-0.347889;0.864244;, + -0.340875;-0.250973;0.905990;, + -0.219814;-0.109322;0.969397;, + -0.110721;-0.227332;0.967502;, + -0.265841;0.064822;0.961835;, + -0.260969;0.257763;0.930297;, + -0.225523;0.367916;0.902096;, + -0.204636;0.250687;0.946192;, + -0.308536;-0.035566;0.950548;, + -0.280865;-0.155167;0.947121;, + -0.110123;-0.025715;0.993585;, + -0.225990;0.073774;0.971332;, + -0.317850;0.048584;0.946896;, + -0.286787;0.050884;0.956642;, + -0.135234;-0.128575;0.982436;, + -0.098581;0.034918;0.994516;, + -0.124352;-0.098909;0.987296;, + -0.027583;0.019128;0.999436;, + -0.990331;0.017071;0.137667;, + -0.973450;-0.198124;0.114640;, + -0.717508;-0.023630;0.696149;, + -0.990362;-0.013131;0.137880;, + -0.815899;-0.068843;0.574082;, + -0.919591;0.065600;0.387362;, + -0.964646;0.236442;-0.116421;, + -0.989021;0.026042;-0.145459;, + -0.960207;-0.224177;-0.166577;, + 0.341914;0.604075;-0.719853;, + 0.241749;0.480642;-0.842935;, + 0.136048;0.087503;-0.986830;, + -0.982644;0.096174;0.158626;, + -0.984714;0.084891;0.152090;, + -0.991473;0.037463;0.124814;, + -0.996531;0.005498;0.083044;, + -0.995489;-0.011539;0.094178;, + 0.157896;-0.099878;-0.982391;, + 0.117619;-0.172655;-0.977935;, + -0.023180;-0.471546;-0.881537;, + -0.642136;-0.415229;-0.644396;, + -0.985193;-0.114772;0.127367;, + -0.993842;-0.033310;0.105682;, + -0.840599;0.446641;0.306441;, + -0.751975;0.132709;0.645695;, + -0.940162;-0.115533;0.320542;, + -0.950011;-0.074948;-0.303088;, + -0.993523;-0.078642;0.082022;, + -0.991151;0.039768;-0.126645;, + -0.994943;0.013556;-0.099526;, + -0.485395;-0.513452;-0.707643;, + -0.229693;-0.529630;-0.816537;, + -0.295188;-0.242851;-0.924060;, + -0.210467;-0.041045;-0.976739;, + 0.040312;0.039373;-0.998411;, + -0.151436;0.353247;-0.923192;, + -0.835409;0.275429;-0.475637;, + -0.991667;-0.120179;-0.046409;, + -0.908512;0.062801;-0.413114;, + 0.083516;-0.876226;0.474609;, + -0.924920;-0.380144;0.003835;, + -0.947722;-0.049450;0.315243;, + -0.412440;-0.292679;0.862689;, + 0.402210;0.838808;-0.366918;, + 0.353181;0.729221;-0.586089;, + -0.198901;0.958333;-0.205027;, + -0.944823;0.308675;-0.109675;, + -0.884493;-0.444527;0.141662;, + -0.862185;0.430269;-0.267406;, + 0.013499;0.694024;-0.719825;, + 0.243556;0.731189;-0.637214;, + 0.197513;0.873282;-0.445384;, + -0.894910;-0.105076;-0.433700;, + -0.436112;-0.188372;-0.879956;, + -0.364055;-0.473683;-0.801928;, + -0.948565;-0.199078;-0.246157;, + -0.983673;-0.040697;-0.175301;, + -0.146382;-0.629542;-0.763052;, + 0.096478;-0.559529;-0.823176;, + 0.011927;-0.262782;-0.964781;, + -0.155590;-0.145800;-0.977003;, + -0.465377;-0.324842;-0.823348;, + -0.755154;-0.384266;-0.531113;, + -0.133038;-0.902773;-0.409025;, + 0.312386;-0.697431;-0.644985;, + 0.031574;-0.305537;-0.951657;, + -0.104452;-0.154902;-0.982393;, + -0.562599;-0.284042;-0.776403;, + -0.604821;-0.388772;-0.695017;, + -0.655051;-0.290024;-0.697707;, + -0.745770;-0.205337;-0.633769;, + -0.250413;-0.254174;-0.934178;, + 0.041562;-0.583144;-0.811305;, + -0.805809;-0.543792;0.234439;, + -0.782100;-0.570279;0.251199;, + -0.467073;-0.873594;-0.136662;, + -0.337534;-0.853552;-0.396886;, + -0.531094;-0.706015;-0.468489;, + -0.807521;-0.589785;0.008036;, + -0.602368;-0.756955;0.253322;, + -0.615086;-0.386827;0.687047;, + -0.238496;-0.799571;0.551186;, + -0.108202;-0.994107;-0.006522;, + -0.125377;-0.986922;-0.101321;, + -0.994704;0.028536;-0.098745;, + -0.987761;0.119054;-0.100772;, + -0.795270;0.185639;-0.577134;, + -0.767636;-0.389543;-0.508912;, + -0.833821;-0.284781;0.472909;, + -0.441591;0.115885;0.889701;, + -0.780037;0.083871;0.620087;, + -0.979289;0.016954;0.201754;, + -0.923625;-0.293416;-0.246623;, + -0.398686;-0.661959;-0.634713;, + -0.527934;-0.707186;-0.470290;, + -0.993981;0.072042;0.082538;, + -0.966193;0.076246;0.246286;, + -0.900595;0.023678;0.434013;, + -0.459569;0.109067;-0.881420;, + -0.609266;0.169694;-0.774596;, + -0.918178;0.118657;-0.377982;, + -0.473589;0.230470;-0.850057;, + -0.211760;0.199717;-0.956698;, + 0.270304;0.211165;-0.939332;, + -0.757123;0.021836;0.652907;, + -0.275522;0.128453;0.952674;, + -0.989453;0.037270;0.139976;, + -0.985345;0.075214;0.153095;, + -0.551796;-0.574616;-0.604431;, + -0.618692;-0.292564;-0.729127;, + -0.619769;0.060159;0.782475;, + -0.464479;-0.316670;0.827030;, + -0.372076;-0.368062;0.852109;, + -0.335690;-0.341328;0.877957;, + -0.285852;0.046274;0.957156;, + -0.355919;0.171383;0.918667;, + -0.723480;0.060884;0.687656;, + -0.814232;0.061779;0.577242;, + -0.886198;-0.021061;0.462827;, + -0.574120;-0.035273;0.818011;, + -0.243173;0.255052;0.935850;, + -0.418313;0.238912;0.876319;, + -0.255998;0.077691;0.963550;, + -0.261345;0.340963;0.903019;, + -0.153140;0.531302;0.833226;, + -0.004476;-0.270980;0.962575;, + -0.119564;-0.240178;0.963337;, + -0.327186;-0.256872;0.909377;, + -0.359013;-0.037721;0.932570;, + -0.047590;0.027451;0.998490;, + 0.022833;0.095235;0.995193;, + -0.377306;-0.316942;0.870166;, + -0.316548;-0.333267;0.888105;, + -0.477778;0.346040;0.807456;, + -0.323246;0.228712;0.918261;, + -0.376991;-0.033966;0.925594;, + -0.487857;-0.060488;0.870825;, + -0.761142;0.077824;0.643899;, + -0.720495;0.311094;0.619764;, + -0.524578;-0.521170;0.673201;, + -0.394926;-0.548853;0.736746;, + -0.356540;-0.270657;0.894217;, + -0.495468;-0.323313;0.806213;, + -0.463451;0.231939;0.855229;, + -0.256676;-0.425986;0.867556;, + -0.257064;-0.717534;0.647351;, + -0.264882;-0.777358;0.570571;, + -0.736052;0.062723;0.674013;, + -0.102010;0.499266;0.860423;, + 0.150316;0.449108;0.880743;, + 0.111995;0.138436;0.984019;, + -0.367057;-0.255284;0.894483;, + -0.278556;-0.296929;0.913367;, + -0.225628;0.375599;0.898898;, + -0.508485;-0.316227;0.800902;, + -0.840384;-0.146036;0.521946;, + -0.606247;0.434214;0.666275;, + -0.283006;0.307167;0.908601;, + -0.385943;-0.260360;0.885020;, + -0.221460;-0.237371;0.945839;, + -0.291186;-0.238537;0.926451;, + -0.160623;0.266772;0.950280;, + -0.283084;0.054206;0.957562;, + -0.282781;0.044475;0.958153;, + -0.135725;-0.254987;0.957371;, + -0.205252;0.312404;0.927510;, + -0.246128;0.432303;0.867488;, + -0.112957;-0.187289;0.975789;, + -0.531997;-0.340199;0.775399;, + -0.207669;-0.717728;0.664635;, + -0.470701;0.239290;0.849224;, + -0.660192;0.366644;0.655530;, + -0.098482;0.067836;0.992824;, + -0.227864;0.179884;0.956933;, + -0.333711;0.277181;0.901004;, + -0.304277;-0.311038;0.900372;, + -0.223441;-0.620814;0.751442;, + -0.478361;-0.492783;0.726868;, + -0.524366;-0.091050;0.846611;, + -0.371514;-0.104033;0.922580;, + -0.291101;0.296117;0.909711;, + -0.216517;0.601928;0.768637;, + -0.765717;0.109372;0.633811;, + -0.176319;-0.181296;0.967493;, + -0.237549;0.171176;0.956174;, + -0.290228;0.134824;0.947413;, + -0.292418;0.016174;0.956154;, + -0.352538;-0.172693;0.919725;, + -0.290964;-0.200100;0.935575;, + -0.909284;-0.286981;0.301404;, + -0.860343;-0.416762;0.293459;, + -0.527449;-0.725822;0.441566;, + -0.192717;-0.752991;0.629178;, + -0.413665;-0.662196;0.624803;, + -0.782661;-0.436604;0.443643;, + -0.739736;-0.304424;0.600097;, + -0.419309;-0.612197;0.670369;, + -0.178542;-0.532663;0.827280;, + -0.307625;-0.164296;0.937216;, + -0.692050;0.067912;0.718648;, + -0.773362;-0.044449;0.632405;, + -0.701142;0.222645;0.677370;, + -0.343154;0.141029;0.928631;, + -0.086339;0.227970;0.969832;, + -0.233405;0.474742;0.848612;, + -0.772564;0.372095;0.514481;, + -0.862219;0.333573;0.381192;, + -0.487320;0.574617;0.657522;, + -0.404061;0.641958;0.651632;, + -0.313427;0.711856;0.628510;, + -0.874726;0.363852;0.320104;, + -0.908715;0.258689;0.327593;, + -0.872452;0.309571;0.378146;, + -0.994626;0.037375;0.096552;, + -0.971560;0.138241;0.192251;, + -0.984564;0.133388;0.113322;, + -0.990615;0.053638;0.125719;, + -0.992423;-0.070546;-0.100601;, + -0.981912;-0.082005;-0.170656;, + 0.108071;-0.116143;0.987336;, + -0.797789;0.037538;0.601767;, + -0.920796;0.066458;0.384342;, + -0.928255;0.072027;0.364903;, + -0.930240;0.046030;0.364053;, + -0.415124;-0.114103;0.902581;, + -0.106608;-0.130975;0.985637;, + -0.933404;-0.160810;-0.320776;, + -0.736619;0.210971;-0.642560;, + -0.542357;0.242229;-0.804471;, + -0.523618;-0.179358;-0.832859;, + -0.870587;-0.276500;-0.406972;, + -0.922853;-0.232871;-0.306778;, + -0.901311;-0.421112;-0.101504;, + -0.851667;-0.383724;-0.356959;, + -0.545095;-0.326982;-0.771981;, + -0.333063;-0.417249;-0.845560;, + -0.554572;-0.744477;-0.371758;, + -0.863997;-0.496842;0.081586;, + -0.969478;-0.059688;-0.237801;, + -0.923894;-0.017241;-0.382259;, + -0.945693;-0.072099;-0.316964;, + -0.728538;0.351876;-0.587721;, + -0.723866;0.286506;-0.627640;, + -0.930880;-0.167827;-0.324496;, + -0.959100;-0.011290;-0.282843;, + -0.938731;0.123199;-0.321879;, + -0.709700;-0.318460;-0.628417;, + -0.330597;-0.726300;-0.602656;, + -0.452113;-0.839250;-0.302082;, + -0.857815;-0.222583;-0.463260;, + -0.902102;0.133251;-0.410435;, + -0.961728;0.190595;-0.196857;, + -0.978222;0.168444;-0.121282;, + -0.662740;0.264455;-0.700599;, + -0.476309;0.136397;-0.868634;, + -0.504309;-0.221320;-0.834679;, + -0.901494;0.354920;0.247672;, + -0.525457;0.668071;0.526854;, + -0.431549;0.860523;0.270676;, + -0.461883;0.559990;-0.687804;, + -0.494105;0.296706;-0.817206;, + -0.898829;0.268320;-0.346570;, + -0.941727;0.336079;-0.014200;, + -0.963121;0.021678;0.268195;, + -0.973111;-0.228118;-0.031884;, + -0.919379;-0.216115;-0.328690;, + -0.744589;-0.666942;-0.027853;, + -0.190314;-0.795142;0.575786;, + -0.060500;-0.787818;0.612930;, + -0.441276;-0.350415;0.826126;, + -0.840007;0.268555;0.471451;, + -0.964913;0.106253;0.240112;, + -0.995174;0.032352;0.092644;, + -0.934966;0.248566;-0.253088;, + -0.961037;0.049848;-0.271888;, + -0.998822;0.028759;0.039091;, + -0.990336;-0.002167;0.138672;, + -0.519203;-0.619776;0.588478;, + -0.391770;-0.654128;0.647018;, + -0.304486;-0.716860;0.627216;, + -0.910280;-0.362455;0.200043;, + -0.920418;-0.334077;0.203034;, + -0.988204;-0.086301;0.126514;, + -0.971693;-0.063695;0.227500;, + -0.923098;-0.057285;0.380275;, + -0.488334;0.063730;0.870327;, + -0.231105;-0.031755;0.972411;, + -0.512220;-0.385547;0.767453;, + -0.933438;-0.231048;0.274427;, + -0.473499;0.583805;0.659523;, + -0.308586;0.551748;0.774822;, + -0.255754;0.295329;0.920527;, + -0.877571;0.152218;0.454641;, + -0.979923;0.112462;0.164628;, + -0.889948;0.248106;0.382669;, + -0.883469;0.360672;0.298994;, + -0.946941;0.292536;0.133139;, + -0.962565;0.225045;0.151073;, + -0.879996;0.362170;0.307310;, + -0.453901;0.679771;0.576094;, + -0.231858;0.768436;0.596446;, + -0.521367;0.619633;0.586713;, + -0.987626;-0.156503;0.010098;, + -0.950732;-0.158522;-0.266418;, + -0.559545;-0.268517;-0.784097;, + -0.547278;-0.203637;-0.811799;, + -0.555973;0.130853;-0.820836;, + -0.983075;-0.050169;-0.176203;, + -0.589184;-0.777856;0.218638;, + -0.173867;-0.956818;0.232956;, + -0.412436;-0.546600;-0.728783;, + -0.867346;-0.396857;-0.300360;, + -0.999127;0.006755;-0.041222;, + -0.737443;0.369253;-0.565534;, + -0.294691;0.557341;-0.776227;, + -0.702347;0.471707;-0.533105;, + -0.999253;0.038278;0.005340;, + -0.208681;-0.785150;-0.583088;, + -0.214903;-0.821849;-0.527618;, + -0.174480;-0.970501;-0.166386;, + -0.133487;-0.990413;0.035549;, + -0.146752;-0.878664;-0.454328;, + -0.159714;-0.112935;-0.980682;, + -0.114641;0.109429;-0.987361;, + -0.097975;0.047333;-0.994063;, + -0.155868;-0.350626;-0.923454;, + -0.161498;-0.608488;-0.776956;, + -0.174065;-0.534580;-0.826998;, + -0.963396;0.255594;-0.080872;, + -0.495971;0.499732;-0.710127;, + -0.391198;0.918452;-0.058392;, + -0.910511;0.383051;0.155695;, + -0.801319;0.421929;0.424102;, + -0.173816;0.424341;0.888663;, + 0.132056;0.386729;0.912689;, + -0.059642;0.521187;0.851356;, + -0.717995;0.461191;0.521331;, + -0.963654;0.185646;0.192113;, + -0.826151;0.456218;0.330667;, + -0.202592;0.794997;0.571784;, + 0.122156;0.828715;0.546178;, + -0.156667;0.773674;0.613909;, + -0.783959;0.522880;0.334672;, + -0.247328;0.278644;-0.928001;, + -0.514676;0.484402;-0.707434;, + -0.221209;0.975219;-0.003702;, + 0.152157;0.982339;-0.108898;, + -0.086863;0.565088;-0.820445;, + -0.120370;0.286062;-0.950621;, + -0.217075;0.288626;-0.932509;, + -0.046481;0.258131;0.964991;, + 0.086883;0.146423;0.985399;, + -0.126526;-0.572079;0.810381;, + -0.678205;-0.266807;0.684728;, + -0.390094;-0.893060;0.224213;, + -0.215648;-0.938949;0.268088;, + -0.426159;-0.836851;-0.343610;, + -0.891225;-0.365388;-0.268717;, + -0.922702;-0.380591;0.061411;, + -0.479805;-0.561201;-0.674419;, + -0.263961;-0.572476;-0.776271;, + -0.401044;-0.160466;-0.901895;, + -0.812645;0.076717;-0.577688;, + -0.985268;-0.013185;-0.170509;, + -0.929545;-0.091642;-0.357137;, + -0.706692;0.408356;0.577781;, + -0.971905;0.201947;0.120901;, + -0.780984;0.429796;0.453144;, + -0.101385;0.740749;0.664088;, + 0.112055;0.771742;0.625986;, + -0.063776;0.461704;0.884738;, + -0.644377;0.580936;0.497285;, + -0.726201;0.594292;0.345614;, + -0.064509;0.887130;0.456988;, + 0.151722;0.889454;0.431106;, + 0.004774;0.752502;0.658573;, + -0.180513;0.319591;-0.930202;, + -0.071812;0.376860;-0.923482;, + -0.055318;0.875614;-0.479834;, + -0.604713;0.765248;-0.220720;, + -0.947576;-0.246188;0.203695;, + -0.945100;-0.267159;0.188180;, + -0.929894;-0.301728;0.210374;, + -0.938122;-0.247356;0.242367;, + -0.948037;-0.205364;0.243004;, + -0.982289;0.005861;0.187281;, + -0.970327;0.034796;0.239279;, + -0.821069;-0.164374;0.546650;, + -0.788342;-0.076790;0.610426;, + -0.948825;-0.033448;0.314026;, + -0.984684;-0.100876;0.142201;, + -0.990691;-0.060390;0.122001;, + -0.991477;-0.014669;0.129452;, + -0.977761;-0.074429;0.196069;, + -0.968921;-0.148629;0.197740;, + -0.963259;-0.202188;0.176785;, + -0.965124;-0.190436;0.179640;, + -0.996668;-0.000055;0.081571;, + -0.992952;-0.010172;0.118079;, + -0.653195;-0.150269;0.742129;, + -0.393828;-0.197542;0.897707;, + -0.986199;-0.027926;0.163190;, + -0.698788;-0.183747;0.691326;, + -0.477199;-0.092968;0.873864;, + -0.408888;-0.121595;0.904447;, + -0.383912;-0.053672;0.921808;, + -0.668225;-0.119696;0.734267;, + -0.707558;-0.149489;0.690662;, + -0.333263;0.082750;0.939196;, + -0.380632;0.065214;0.922424;, + -0.424222;0.027945;0.905127;, + -0.344899;-0.178549;0.921501;, + -0.228579;-0.246387;0.941831;, + -0.295296;-0.069069;0.952906;, + -0.351717;0.069372;0.933532;, + -0.150503;0.003474;0.988603;, + 0.100381;-0.018321;0.994780;, + 0.184877;0.074293;0.979949;, + 0.196102;0.167844;0.966112;, + -0.150811;0.174292;0.973077;, + -0.204636;0.123817;0.970976;, + -0.230074;0.372461;0.899077;, + -0.506615;0.220020;0.833626;, + -0.303228;0.319910;0.897613;, + 0.259931;0.297731;0.918581;, + 0.467914;0.186614;0.863847;, + 0.291782;0.351503;0.889555;, + 0.135206;-0.197296;0.970976;, + -0.056462;-0.303649;0.951110;, + -0.259365;-0.317494;0.912101;, + -0.300044;-0.323635;0.897348;, + -0.158828;0.184032;0.970003;, + -0.232666;0.262793;0.936379;, + -0.328859;0.141047;0.933787;, + -0.388761;0.111134;0.914611;, + -0.320469;0.119524;0.939688;, + -0.241856;-0.015663;0.970186;, + -0.206723;0.090179;0.974235;, + -0.214559;0.312331;0.925426;, + -0.214040;0.335101;0.917548;, + -0.175599;0.167179;0.970163;, + -0.207314;0.342570;0.916333;, + -0.204677;0.145172;0.968004;, + -0.267360;0.048646;0.962368;, + -0.242820;0.143189;0.959445;, + -0.216371;0.266677;0.939184;, + -0.191125;0.333044;0.923338;, + -0.546439;0.124024;0.828265;, + -0.421343;0.043606;0.905852;, + -0.710324;-0.088882;0.698241;, + -0.759262;-0.042020;0.649427;, + 0.457664;-0.046073;0.887931;, + 0.415472;-0.131980;0.899980;, + 0.601990;-0.320637;0.731300;, + 0.732447;-0.463382;0.498797;, + 0.796203;-0.311752;0.518528;, + 0.618889;-0.216199;0.755138;, + 0.650858;-0.279521;-0.705870;, + 0.627769;-0.641265;-0.441233;, + 0.881339;-0.465948;0.078326;, + 0.928462;-0.263842;0.261431;, + 0.964094;-0.165413;0.207751;, + 0.924341;-0.229764;-0.304633;, + 0.927430;-0.166498;0.334890;, + 0.883252;-0.199217;0.424473;, + 0.843025;-0.193507;0.501860;, + 0.834563;-0.142862;0.532067;, + 0.847343;-0.090185;0.523332;, + 0.859241;0.003695;0.511557;, + 0.786163;-0.008241;0.617964;, + 0.922761;-0.080766;0.376814;, + 0.964606;-0.206993;0.163368;, + 0.954750;-0.229736;0.188876;, + 0.977642;-0.134009;0.162042;, + 0.556167;-0.235673;0.796955;, + -0.566294;-0.282990;0.774098;, + -0.779621;-0.549588;0.300240;, + -0.453973;-0.875337;-0.166413;, + 0.885166;-0.437540;-0.158241;, + 0.965433;-0.004688;0.260610;, + 0.745205;-0.297817;0.596636;, + 0.383889;-0.464132;0.798255;, + 0.323830;-0.489051;0.809916;, + 0.924672;0.127786;0.358681;, + 0.983531;0.088214;0.157748;, + -0.363776;0.894300;-0.260567;, + 0.270665;0.955941;0.113652;, + 0.641266;0.188129;0.743899;, + 0.616460;-0.165561;0.769783;, + 0.677762;-0.074270;0.731521;, + 0.829313;0.074463;0.553800;, + 0.887257;0.039798;0.459556;, + 0.781695;0.234974;0.577703;, + 0.819624;0.148430;0.553340;, + 0.781224;0.181945;0.597148;, + 0.679518;-0.160347;0.715922;, + 0.771375;-0.034845;0.635426;, + 0.535532;-0.307662;0.786480;, + 0.285775;0.030248;0.957819;, + 0.817277;0.454475;0.354275;, + 0.810140;0.435116;-0.392871;, + 0.839666;0.520528;0.154955;, + 0.709256;0.641012;0.293361;, + 0.614890;0.217033;0.758160;, + 0.420168;0.159950;0.893238;, + 0.483411;0.190762;0.854356;, + 0.360033;0.104427;0.927077;, + 0.286110;0.137586;0.948268;, + 0.070070;0.358867;0.930755;, + 0.165214;0.238175;0.957067;, + 0.196627;-0.192079;0.961480;, + 0.247128;-0.341305;0.906884;, + 0.643177;-0.541832;0.541056;, + 0.809334;-0.483823;-0.333007;, + 0.218364;0.254619;0.942065;, + 0.396152;0.003364;0.918179;, + 0.609373;-0.153995;0.777786;, + 0.663145;-0.277587;0.695115;, + 0.382906;-0.177032;0.906666;, + 0.413901;-0.346606;0.841754;, + 0.585242;-0.040809;0.809831;, + 0.626492;0.149889;0.764880;, + 0.412419;-0.359405;0.837102;, + 0.144547;-0.399892;0.905093;, + 0.214707;0.074209;0.973855;, + 0.235312;0.330449;0.914019;, + 0.402156;-0.544015;0.736423;, + 0.349444;-0.577169;0.738081;, + 0.335755;-0.089838;0.937655;, + 0.309502;-0.188143;0.932100;, + 0.531786;-0.357341;0.767796;, + 0.532413;-0.519111;0.668625;, + 0.198806;-0.407566;0.891272;, + 0.050237;0.021161;0.998513;, + -0.154151;0.164731;0.974218;, + 0.014259;0.242570;0.970029;, + 0.101190;0.244238;0.964421;, + 0.075895;-0.122424;0.989572;, + 0.926394;-0.303016;0.223553;, + 0.916339;-0.265300;0.299899;, + 0.941193;-0.231274;0.246311;, + 0.942736;-0.258883;0.210308;, + 0.872017;-0.277751;0.403040;, + 0.891387;-0.329329;0.311403;, + 0.920623;-0.287190;0.264530;, + 0.888242;-0.359291;0.286246;, + 0.823502;-0.420165;0.381189;, + 0.712448;-0.424274;0.558935;, + 0.572964;-0.461769;0.677112;, + 0.734110;-0.436861;0.519842;, + 0.859424;-0.304858;0.410430;, + 0.820103;-0.223413;0.526800;, + 0.694020;0.045381;0.718524;, + 0.732903;0.294085;0.613487;, + 0.704924;0.372480;0.603606;, + 0.767741;0.423284;0.481046;, + 0.610611;0.550799;0.569012;, + 0.428564;0.378854;0.820246;, + 0.528841;0.287979;0.798370;, + 0.657818;0.087537;0.748073;, + 0.585630;-0.275362;0.762373;, + 0.487759;0.040891;0.872020;, + 0.366793;-0.058552;0.928458;, + 0.300364;-0.225631;0.926754;, + 0.529462;-0.449192;0.719651;, + 0.530125;0.561389;0.635461;, + 0.592261;0.685382;0.423648;, + 0.622463;0.688709;0.371779;, + 0.792469;0.431830;0.430715;, + 0.631199;0.391605;0.669503;, + 0.299096;0.239203;0.923755;, + 0.820659;-0.346212;-0.454594;, + 0.626383;-0.271076;-0.730864;, + 0.638572;-0.117365;-0.760560;, + 0.788158;0.351005;0.505571;, + 0.200084;-0.052108;0.978392;, + 0.246747;-0.051308;0.967721;, + 0.295036;-0.000370;0.955486;, + 0.509111;0.214011;0.833670;, + 0.902799;0.118400;0.413443;, + 0.910089;0.167693;0.378969;, + 0.999735;0.022967;0.001488;, + 0.996072;-0.042387;-0.077740;, + 0.968689;-0.002135;0.248269;, + 0.832590;0.320635;0.451650;, + 0.730488;0.555207;0.397659;, + 0.597202;0.573938;0.560308;, + 0.720968;0.387938;0.574203;, + 0.775558;0.322202;0.542858;, + 0.694246;-0.474535;0.541146;, + 0.644048;-0.677994;0.354297;, + 0.306835;-0.637411;0.706795;, + 0.266653;-0.673114;0.689793;, + 0.448030;-0.595143;0.667138;, + 0.953942;-0.228941;0.193855;, + 0.938814;-0.254695;-0.231861;, + 0.681733;-0.472937;-0.558184;, + 0.645724;-0.571945;-0.505885;, + 0.884756;-0.428469;0.183360;, + 0.649040;0.135351;0.748617;, + 0.529791;0.315074;0.787432;, + 0.553748;0.630029;0.544451;, + 0.678128;0.634870;0.370248;, + 0.796340;0.360973;0.485325;, + 0.510516;-0.005648;0.859850;, + 0.416079;0.034303;0.908681;, + 0.410099;0.086002;0.907977;, + 0.420062;0.136052;0.897239;, + 0.478583;0.042049;0.877035;, + 0.504686;-0.416381;0.756253;, + 0.267406;-0.542263;0.796520;, + 0.189664;-0.341747;0.920454;, + 0.305752;-0.160267;0.938525;, + 0.443105;-0.186385;0.876880;, + 0.785203;-0.238678;0.571392;, + 0.702825;-0.257963;0.662942;, + 0.632744;-0.132306;0.762974;, + 0.707627;-0.023756;0.706187;, + 0.823076;0.132453;0.552270;, + 0.827196;0.109153;0.551210;, + 0.840927;-0.044262;0.539336;, + 0.764042;0.302636;0.569781;, + 0.742909;0.415406;0.524903;, + 0.699619;0.385348;0.601698;, + 0.578906;0.224993;0.783739;, + 0.590168;0.194655;0.783461;, + 0.302061;-0.359334;0.882971;, + 0.349642;-0.508600;0.786814;, + 0.384855;-0.464307;0.797688;, + 0.416260;-0.438975;0.796259;, + 0.099726;-0.233237;0.967293;, + 0.048634;0.031907;0.998307;, + 0.180176;0.105444;0.977966;, + 0.252687;-0.100086;0.962358;, + 0.155669;-0.183842;0.970551;, + 0.411002;-0.338944;0.846282;, + 0.383695;-0.396116;0.834188;, + 0.249542;0.061763;0.966392;, + -0.016457;0.327055;0.944862;, + 0.224850;0.215443;0.950277;, + 0.196803;0.368723;0.908467;, + 0.250180;0.310646;0.917011;, + 0.277343;0.101996;0.955342;, + 0.152847;-0.155989;0.975861;, + 0.195391;-0.110401;0.974492;, + 0.305812;-0.230212;0.923841;, + 0.368641;-0.213324;0.904763;, + 0.330326;-0.205628;0.921196;, + 0.041593;0.020366;0.998927;, + 0.105429;-0.086429;0.990664;, + 0.129328;0.092742;0.987255;, + 0.068386;-0.183487;0.980641;, + 0.278092;0.030516;0.960070;, + 0.303773;0.055120;0.951149;, + 0.271522;0.061913;0.960439;, + 0.081953;0.023311;0.996364;, + 0.990331;0.017071;0.137667;, + 0.953548;-0.160770;0.254755;, + 0.955059;-0.249767;-0.159623;, + 0.989051;-0.010385;-0.147209;, + 0.968564;0.208434;-0.135792;, + 0.962753;0.114072;0.245141;, + 0.744378;-0.064698;0.664617;, + 0.986376;-0.020071;0.163278;, + 0.669899;-0.004795;0.742437;, + -0.235778;0.425628;-0.873642;, + -0.220215;0.603569;-0.766296;, + 0.417851;0.563338;-0.712777;, + -0.117525;0.013779;-0.992974;, + 0.982667;0.097694;0.157550;, + 0.995367;-0.011631;0.095439;, + 0.996248;-0.000196;0.086542;, + 0.993018;0.025522;0.115170;, + 0.985216;0.087350;0.147373;, + 0.723129;-0.344431;-0.598709;, + 0.154335;-0.521647;-0.839086;, + -0.133014;-0.196421;-0.971456;, + -0.156278;-0.099901;-0.982648;, + 0.783722;0.054151;0.618747;, + 0.800117;0.416289;0.431874;, + 0.984353;0.134697;0.113601;, + 0.979461;-0.119954;0.162070;, + 0.979140;-0.146299;0.141004;, + 0.991670;-0.062397;0.112684;, + 0.457966;-0.192146;-0.867956;, + 0.237393;-0.461566;-0.854752;, + 0.286927;-0.568203;-0.771244;, + 0.948440;-0.169360;-0.267917;, + 0.986431;0.066300;-0.150194;, + 0.998816;-0.041285;0.025724;, + 0.997505;-0.067738;-0.019863;, + 0.977410;0.022278;-0.210173;, + 0.251890;0.415533;-0.874004;, + -0.049975;0.093433;-0.994371;, + 0.097770;-0.050793;-0.993912;, + 0.766098;0.059984;-0.639918;, + 0.884732;-0.053391;0.463033;, + 0.961439;-0.267549;0.063666;, + 0.356172;-0.920978;0.157925;, + 0.137541;-0.415914;0.898943;, + 0.601662;0.572761;-0.556730;, + -0.202958;0.734881;-0.647115;, + -0.398591;0.825562;-0.399465;, + 0.467679;0.871282;-0.148809;, + -0.170588;0.897489;-0.406710;, + -0.258260;0.761324;-0.594717;, + -0.103593;0.680661;-0.725237;, + 0.665282;0.581928;-0.467718;, + 0.906891;-0.362904;0.214125;, + 0.986874;0.076429;-0.142259;, + 0.748399;-0.135655;-0.649228;, + 0.972144;-0.068447;-0.224170;, + 0.994963;-0.047062;-0.088507;, + 0.528323;-0.487037;-0.695464;, + 0.335614;-0.233313;-0.912649;, + 0.007851;-0.660221;-0.751031;, + 0.455960;-0.390419;-0.799796;, + 0.279711;-0.160851;-0.946514;, + -0.004749;-0.220237;-0.975435;, + -0.084670;-0.487141;-0.869209;, + 0.247045;-0.169890;-0.953995;, + 0.006335;-0.246126;-0.969217;, + -0.214712;-0.642232;-0.735824;, + -0.275438;-0.893885;-0.353699;, + 0.710787;-0.466778;-0.526214;, + 0.633158;-0.292738;-0.716530;, + 0.618095;-0.351774;-0.703004;, + 0.147006;-0.604143;-0.783199;, + 0.088495;-0.303567;-0.948692;, + 0.682342;-0.196035;-0.704258;, + 0.643874;-0.292915;-0.706843;, + 0.663539;-0.666241;-0.340352;, + 0.373002;-0.795669;-0.477263;, + 0.420448;-0.891526;-0.168539;, + 0.723608;-0.669946;0.166023;, + 0.799573;-0.544703;0.252945;, + 0.813432;-0.577021;0.073316;, + 0.073674;-0.995832;-0.053775;, + 0.193201;-0.890421;0.412097;, + 0.557281;-0.410177;0.721937;, + 0.626008;-0.721638;0.295555;, + 0.253351;-0.965876;-0.053822;, + 0.996795;0.059173;-0.053828;, + 0.870487;-0.276909;-0.406907;, + 0.718742;0.207815;-0.663493;, + 0.972577;0.124346;-0.196549;, + 0.360242;-0.674562;-0.644354;, + 0.831536;-0.420486;-0.362960;, + 0.992970;0.009011;0.118019;, + 0.832630;0.062414;0.550302;, + 0.429350;0.141609;0.891967;, + 0.772381;-0.152248;0.616642;, + 0.619530;-0.709222;-0.336434;, + 0.868190;-0.002769;0.496225;, + 0.955968;0.074254;0.283920;, + 0.993664;0.087718;0.070268;, + 0.944767;0.116170;-0.306464;, + 0.737612;0.161042;-0.655740;, + 0.449994;0.091497;-0.888332;, + 0.445506;0.217708;-0.868405;, + -0.291086;0.220952;-0.930833;, + 0.064085;0.200510;-0.977593;, + 0.166541;0.103506;0.980587;, + 0.694153;0.049571;0.718118;, + 0.988650;0.046011;0.143017;, + 0.984565;0.081079;0.155104;, + 0.893652;0.299498;-0.334196;, + 0.618693;-0.292564;-0.729127;, + 0.551796;-0.574616;-0.604431;, + 0.251449;0.254655;0.933769;, + 0.329189;-0.298075;0.895983;, + 0.374162;-0.369333;0.850644;, + 0.394027;-0.385974;0.834126;, + 0.629716;-0.045172;0.775511;, + 0.414482;0.150122;0.897590;, + 0.752482;0.042277;0.657254;, + 0.497044;0.192697;0.846059;, + 0.233967;0.315946;0.919477;, + 0.509045;0.023685;0.860414;, + 0.837737;-0.103276;0.536219;, + 0.825693;0.084952;0.557686;, + 0.037052;-0.285163;0.957763;, + 0.072545;0.261091;0.962584;, + 0.254955;0.442961;0.859525;, + 0.279810;0.168723;0.945113;, + 0.138900;-0.213260;0.967071;, + 0.368508;-0.334070;0.867525;, + 0.140609;-0.045717;0.989009;, + -0.019079;0.066742;0.997588;, + 0.299362;0.006168;0.954120;, + 0.352172;-0.219694;0.909785;, + 0.309812;-0.324424;0.893737;, + 0.805112;0.138732;0.576669;, + 0.538357;-0.045396;0.841493;, + 0.380736;-0.067302;0.922231;, + 0.328487;0.183332;0.926545;, + 0.432615;0.307403;0.847554;, + 0.653253;0.367666;0.661878;, + 0.492323;-0.585442;0.644108;, + 0.502064;-0.355000;0.788610;, + 0.401739;-0.251939;0.880416;, + 0.376888;-0.493204;0.784032;, + 0.408002;0.182946;0.894464;, + 0.686633;0.144018;0.712597;, + 0.519245;-0.551574;0.652803;, + 0.241814;-0.736624;0.631594;, + 0.189975;-0.684424;0.703898;, + 0.231331;-0.089643;0.968736;, + 0.437328;-0.396663;0.807095;, + -0.019958;0.064292;0.997732;, + -0.162579;0.374547;0.912843;, + 0.021642;0.552809;0.833027;, + 0.240174;0.350884;0.905095;, + 0.590551;-0.317529;0.741907;, + 0.378809;-0.263028;0.887310;, + 0.356270;0.140360;0.923781;, + 0.292827;0.581198;0.759250;, + 0.887962;-0.080435;0.452829;, + 0.232714;-0.268412;0.934772;, + 0.270973;-0.021494;0.962347;, + 0.249117;0.137702;0.958634;, + 0.240587;0.147886;0.959295;, + 0.297294;-0.186777;0.936339;, + 0.218225;0.244375;0.944806;, + 0.222570;0.434020;0.872977;, + 0.144213;-0.238035;0.960491;, + 0.105285;-0.243661;0.964129;, + 0.499498;0.317571;0.806009;, + 0.323872;-0.438181;0.838513;, + 0.358587;-0.591042;0.722554;, + 0.709020;0.269606;0.651616;, + 0.298672;-0.579421;0.758332;, + 0.236939;-0.570878;0.786103;, + 0.348584;0.203164;0.914994;, + 0.260867;0.212941;0.941597;, + 0.097898;0.105821;0.989554;, + 0.377267;-0.289994;0.879530;, + 0.479423;0.478311;0.735780;, + 0.249071;0.370670;0.894744;, + 0.302334;0.087757;0.949154;, + 0.470067;-0.109278;0.875840;, + 0.727706;0.050030;0.684063;, + 0.159681;-0.153441;0.975171;, + 0.267587;-0.200427;0.942457;, + 0.365349;-0.233476;0.901116;, + 0.305557;-0.031119;0.951665;, + 0.278707;0.095201;0.955646;, + 0.291626;0.332066;0.897043;, + 0.501613;-0.618956;0.604382;, + 0.178903;-0.749707;0.637129;, + 0.274708;-0.796173;0.539115;, + 0.841050;-0.462941;0.279859;, + 0.915403;-0.281528;0.287713;, + 0.874537;-0.332222;0.353288;, + 0.799068;0.056915;0.598541;, + 0.406283;-0.083515;0.909923;, + 0.131733;-0.475879;0.869589;, + 0.238303;-0.649785;0.721797;, + 0.701135;-0.368935;0.610161;, + 0.788343;-0.078957;0.610149;, + 0.396116;0.496106;0.772638;, + 0.080690;0.269931;0.959493;, + 0.097838;0.136147;0.985846;, + 0.673078;0.201405;0.711620;, + 0.814615;0.305380;0.493097;, + 0.791616;0.414216;0.449188;, + 0.871315;0.302480;0.386414;, + 0.904561;0.262540;0.335921;, + 0.910079;0.308658;0.276563;, + 0.525509;0.655009;0.542957;, + 0.397477;0.642652;0.654989;, + 0.369469;0.615521;0.696152;, + 0.980166;-0.106355;-0.167220;, + 0.993832;0.046691;0.100592;, + 0.981920;0.086298;0.168479;, + 0.981368;0.156012;0.112144;, + 0.974808;0.085085;0.206180;, + 0.988089;-0.076583;-0.133471;, + 0.233487;-0.090126;0.968174;, + 0.078736;-0.116167;0.990104;, + 0.160509;-0.156800;0.974500;, + 0.853642;0.016690;0.520593;, + 0.939670;0.050263;0.338368;, + 0.923190;0.094626;0.372514;, + 0.862014;0.056065;0.503774;, + 0.936010;-0.253687;-0.243985;, + 0.608655;-0.245946;-0.754353;, + 0.523086;0.163014;-0.836545;, + 0.568395;0.375488;-0.732077;, + 0.917980;-0.141801;-0.370411;, + 0.923300;-0.237465;-0.301874;, + 0.909875;-0.400036;-0.109997;, + 0.906412;-0.421235;0.031280;, + 0.675045;-0.722669;-0.148538;, + 0.309013;-0.470378;-0.826593;, + 0.372917;-0.313993;-0.873122;, + 0.818454;-0.384125;-0.427295;, + 0.810462;0.143367;-0.567977;, + 0.626725;0.447627;-0.637844;, + 0.910464;0.049229;-0.410649;, + 0.935713;-0.058966;-0.347798;, + 0.964018;-0.036088;-0.263376;, + 0.945373;-0.182223;-0.270306;, + 0.963343;0.024740;-0.267130;, + 0.880786;-0.181630;-0.437296;, + 0.650930;-0.680013;-0.337449;, + 0.335037;-0.782036;-0.525518;, + 0.563778;-0.458869;-0.686727;, + 0.913321;0.104053;-0.393723;, + 0.937081;0.163116;-0.308662;, + 0.668251;-0.161916;-0.726102;, + 0.486568;0.053293;-0.872016;, + 0.533594;0.277429;-0.798943;, + 0.928577;0.194671;-0.315987;, + 0.969092;0.183829;-0.164523;, + 0.866079;0.407632;0.289384;, + 0.941173;0.337920;-0.002044;, + 0.938375;0.259917;-0.227806;, + 0.624232;0.279202;-0.729644;, + 0.502694;0.464741;-0.728913;, + 0.436435;0.894881;0.093339;, + 0.353823;0.758467;0.547299;, + 0.933666;0.245227;0.261020;, + 0.535134;-0.219852;0.815657;, + 0.024104;-0.703755;0.710034;, + 0.178308;-0.751297;0.635421;, + 0.602066;-0.782297;0.159777;, + 0.901219;-0.248765;-0.354853;, + 0.961986;-0.258591;-0.087825;, + 0.968198;-0.019433;0.249429;, + 0.974126;0.109867;0.197503;, + 0.998120;0.046379;0.040070;, + 0.989245;0.018948;0.145036;, + 0.998196;0.033204;0.050015;, + 0.987221;0.030678;-0.156373;, + 0.915666;0.230725;-0.329122;, + 0.929875;-0.332924;0.156510;, + 0.548129;-0.661438;0.511912;, + 0.328608;-0.695385;0.639105;, + 0.393459;-0.640623;0.659388;, + 0.887822;-0.363940;0.281637;, + 0.667999;-0.377721;0.641174;, + 0.176666;-0.140491;0.974193;, + 0.341914;0.096830;0.934729;, + 0.887877;-0.038319;0.458482;, + 0.969393;-0.056384;0.238953;, + 0.987385;-0.098273;0.124147;, + 0.957678;-0.180684;0.224067;, + 0.978399;0.092216;0.185021;, + 0.903224;0.146776;0.403292;, + 0.492552;0.233622;0.838340;, + 0.283857;0.492640;0.822637;, + 0.297955;0.637549;0.710460;, + 0.848610;0.319927;0.421318;, + 0.905296;0.318015;0.281611;, + 0.636969;0.566446;0.522885;, + 0.186839;0.733572;0.653424;, + 0.320731;0.757519;0.568591;, + 0.837352;0.395678;0.377200;, + 0.959055;0.246703;0.139112;, + 0.955218;0.282513;0.088003;, + 0.990080;-0.140504;-0.000454;, + 0.987431;-0.083124;-0.134427;, + 0.770556;0.153218;-0.618683;, + 0.514955;-0.136927;-0.846211;, + 0.487689;-0.291792;-0.822810;, + 0.911993;-0.179968;-0.368620;, + 0.554420;-0.498946;-0.666086;, + 0.175684;-0.958552;-0.224307;, + 0.440194;-0.833213;0.334641;, + 0.883002;-0.445236;-0.148568;, + 0.833256;0.378313;-0.403191;, + 0.280903;0.598074;-0.750601;, + 0.607836;0.418934;-0.674559;, + 0.994040;0.019054;-0.107342;, + 0.998649;0.042991;0.029202;, + 0.067520;-0.991070;-0.114981;, + 0.206828;-0.976295;-0.063794;, + 0.201725;-0.842948;-0.498745;, + 0.199110;-0.789128;-0.581061;, + 0.182351;-0.838223;-0.513937;, + 0.179619;-0.612115;-0.770099;, + 0.161976;-0.446886;-0.879805;, + 0.103521;-0.032143;-0.994108;, + 0.083882;0.118846;-0.989363;, + 0.162750;-0.049292;-0.985435;, + 0.155187;-0.395059;-0.905453;, + 0.567095;0.799478;0.198086;, + 0.449374;0.616302;-0.646711;, + 0.849927;0.303096;-0.430996;, + 0.936005;0.320009;0.146594;, + 0.155449;0.563615;0.811279;, + -0.138213;0.387227;0.911566;, + -0.004277;0.391231;0.920283;, + 0.721355;0.437806;0.536631;, + 0.852050;0.350687;0.388626;, + 0.964763;0.203925;0.166276;, + 0.871839;0.392583;0.292873;, + 0.274136;0.799417;0.534586;, + -0.141042;0.765026;0.628365;, + 0.116728;0.857063;0.501815;, + 0.732098;0.530474;0.427353;, + 0.288643;0.263589;-0.920438;, + 0.254733;0.326813;-0.910112;, + 0.156678;0.269554;-0.950154;, + 0.107469;0.490481;-0.864800;, + -0.142335;0.937356;-0.317971;, + 0.076965;0.997000;-0.008263;, + 0.564368;0.602211;-0.564651;, + 0.240721;-0.608347;0.756285;, + -0.073068;-0.148548;0.986202;, + -0.009780;0.272046;0.962235;, + 0.570934;0.068021;0.818174;, + 0.970937;-0.213567;-0.108028;, + 0.499315;-0.779570;-0.378095;, + 0.230800;-0.972814;0.019097;, + 0.323398;-0.895943;0.304467;, + 0.834135;-0.545842;0.079219;, + 0.981707;0.015920;-0.189730;, + 0.949298;0.051192;-0.310183;, + 0.429925;-0.097791;-0.897553;, + 0.244202;-0.464371;-0.851308;, + 0.420516;-0.601479;-0.679256;, + 0.847608;-0.252333;-0.466786;, + 0.842275;0.348065;0.411611;, + 0.123801;0.481601;0.867602;, + -0.131402;0.605188;0.785163;, + 0.049951;0.809325;0.585234;, + 0.649010;0.538182;0.537723;, + 0.974070;0.179720;0.137432;, + 0.810052;0.462959;0.359841;, + 0.071975;0.766775;0.637868;, + -0.167942;0.811266;0.560038;, + -0.017901;0.898223;0.439175;, + 0.575245;0.693252;0.434161;, + 0.126094;0.962221;-0.241310;, + 0.028226;0.494821;-0.868536;, + 0.153941;0.305601;-0.939633;, + 0.584262;0.539674;-0.606128;, + 0.947656;-0.251190;0.197106;, + 0.949985;-0.211068;0.230172;, + 0.940140;-0.240408;0.241536;, + 0.930866;-0.286260;0.227033;, + 0.941418;-0.276414;0.193203;, + 0.845017;-0.054953;0.531908;, + 0.750383;-0.181846;0.635498;, + 0.962843;0.019373;0.269367;, + 0.984408;0.024365;0.174202;, + 0.959207;-0.033141;0.280754;, + 0.962017;-0.206528;0.178519;, + 0.966498;-0.168546;0.193582;, + 0.976406;-0.086182;0.198001;, + 0.987549;-0.026149;0.155126;, + 0.990651;-0.059208;0.122906;, + 0.991572;-0.052289;0.118536;, + 0.967265;-0.179678;0.179202;, + 0.996580;-0.008069;0.082235;, + 0.991472;-0.016919;0.129214;, + 0.747666;-0.139847;0.649183;, + 0.119081;-0.211793;0.970033;, + 0.990935;-0.007248;0.134150;, + 0.721351;-0.142669;0.677715;, + 0.443972;-0.060466;0.893998;, + 0.376067;-0.110373;0.919995;, + 0.434429;-0.090333;0.896165;, + 0.672873;-0.178482;0.717903;, + 0.709868;-0.146248;0.688984;, + 0.362721;0.087395;0.927791;, + 0.374887;0.073105;0.924183;, + 0.312884;-0.023254;0.949507;, + 0.212041;-0.224883;0.951034;, + 0.297241;-0.210499;0.931310;, + 0.417830;-0.014675;0.908406;, + 0.383091;0.055913;0.922017;, + 0.285816;-0.314551;0.905189;, + 0.097390;-0.315817;0.943809;, + -0.106431;-0.217381;0.970267;, + 0.289110;-0.330505;0.898433;, + 0.368538;0.102287;0.923968;, + 0.324933;0.131935;0.936489;, + 0.269458;0.248871;0.930299;, + 0.190265;0.215570;0.957773;, + 0.284323;0.139703;0.948496;, + 0.190706;0.300576;0.934497;, + 0.242287;0.344618;0.906937;, + 0.209863;0.120826;0.970236;, + 0.253672;-0.005589;0.967274;, + 0.192077;0.138798;0.971515;, + 0.242108;0.270614;0.931746;, + 0.243379;0.149539;0.958335;, + 0.258802;0.073888;0.963100;, + 0.212004;0.101858;0.971946;, + 0.216250;0.294970;0.930714;, + 0.145512;0.372407;0.916591;, + 0.741126;-0.084012;0.666089;, + 0.498990;-0.008124;0.866570;, + 0.473728;0.138060;0.869782;, + 0.731146;-0.000413;0.682221;, + -0.631357;0.354670;0.689636;, + 0.632039;0.355130;0.688773;, + 0.914875;-0.152402;-0.373869;, + -0.914875;-0.152402;-0.373869;, + -0.433214;-0.193876;-0.880192;, + -0.859652;-0.309116;-0.406751;, + -0.093634;0.341116;0.935346;, + -0.093634;0.341116;0.935346;, + 0.000004;-0.093947;-0.995577;, + 0.244564;-0.065106;0.967445;, + -0.963334;-0.094433;0.251137;, + -0.989571;-0.011953;-0.143551;, + -0.885448;-0.301099;-0.354007;, + -0.989571;-0.011953;-0.143551;, + -0.982778;-0.084744;-0.164211;, + -0.957758;-0.287242;0.013841;, + -0.449270;0.893379;-0.005605;, + -0.895650;-0.343271;-0.282799;, + 0.527840;-0.168309;0.832500;, + 0.233305;-0.886660;0.399253;, + 0.513833;-0.494239;0.701216;, + 0.278233;-0.273728;0.920684;, + -0.790963;-0.525076;0.314122;, + 0.853727;-0.007027;-0.520673;, + -0.701247;-0.651828;-0.288743;, + -0.145665;-0.919602;-0.364848;, + 0.854774;-0.403493;0.326429;, + 0.174039;-0.984266;0.030518;, + -0.000016;-0.990834;-0.135089;, + 0.114825;-0.948131;-0.296416;, + 0.244564;-0.065106;0.967445;, + 0.026768;-0.438717;0.898227;, + -0.817874;-0.539381;-0.200374;, + -0.989571;-0.011953;-0.143551;, + -0.817874;-0.539381;-0.200374;, + 0.174039;-0.984266;0.030518;, + -0.434273;0.868349;-0.239535;, + -0.989261;0.138490;-0.046722;, + -0.984781;0.061328;-0.162622;, + -0.986179;0.140164;0.088351;, + -0.977952;0.018441;0.208015;, + 0.000005;-0.999974;0.007152;, + -0.897582;0.211412;-0.386848;, + -0.460194;0.616751;0.638623;, + 0.693967;0.242883;0.677803;, + -0.905288;0.176534;0.386380;, + -0.664851;0.117356;-0.737700;, + -0.897582;0.211412;-0.386848;, + -0.903847;0.420928;-0.076682;, + -0.701860;0.270507;0.658953;, + -0.457101;-0.023022;-0.889117;, + 0.000001;0.024616;-0.999697;, + -0.226499;-0.140193;-0.963869;, + 0.387797;0.626448;0.676148;, + 0.485631;0.575618;0.657895;, + 0.783381;0.503370;0.364599;, + -0.867052;0.137579;0.478846;, + -0.829671;0.408671;0.380308;, + -0.892567;0.378889;-0.244475;, + -0.886549;0.392710;-0.244562;, + -0.947696;-0.212901;-0.237792;, + -0.502434;-0.677413;0.537282;, + -0.044908;-0.611148;0.790241;, + -0.336341;-0.108795;0.935435;, + -0.899773;0.187812;0.393873;, + -0.898020;0.299543;-0.322233;, + 0.433214;-0.193877;-0.880192;, + 0.859652;-0.309116;-0.406751;, + 0.100417;0.338390;0.935633;, + 0.100417;0.338390;0.935633;, + -0.244564;-0.065106;0.967445;, + 0.963334;-0.094433;0.251137;, + 0.885448;-0.301099;-0.354007;, + 0.990082;-0.015546;-0.139630;, + 0.957347;-0.288570;0.014659;, + 0.982279;-0.089104;-0.164890;, + 0.481298;0.876550;-0.003471;, + 0.895650;-0.343271;-0.282799;, + -0.527840;-0.168309;0.832500;, + -0.513833;-0.494239;0.701216;, + -0.233305;-0.886660;0.399253;, + -0.278232;-0.273728;0.920684;, + 0.790963;-0.525076;0.314122;, + -0.853727;-0.007027;-0.520673;, + 0.145665;-0.919602;-0.364848;, + 0.701248;-0.651828;-0.288742;, + -0.854773;-0.403493;0.326429;, + -0.174039;-0.984266;0.030518;, + -0.114791;-0.948135;-0.296417;, + -0.244564;-0.065106;0.967445;, + -0.026768;-0.438717;0.898227;, + 0.817874;-0.539381;-0.200374;, + 0.990082;-0.015546;-0.139630;, + 0.990082;-0.015546;-0.139630;, + 0.817874;-0.539381;-0.200374;, + -0.174039;-0.984266;0.030518;, + 0.434273;0.868349;-0.239535;, + 0.990910;0.129582;-0.036136;, + 0.987185;0.081535;-0.137175;, + 0.972924;0.196620;0.121487;, + 0.972307;0.015440;0.233196;, + 0.897582;0.211412;-0.386848;, + -0.602846;0.290303;0.743169;, + 0.905288;0.176534;0.386380;, + 0.664851;0.117356;-0.737700;, + 0.897582;0.211412;-0.386848;, + 0.903847;0.420928;-0.076682;, + 0.701860;0.270507;0.658953;, + 0.457101;-0.023022;-0.889117;, + 0.226504;-0.140193;-0.963868;, + -0.439283;0.626634;0.643708;, + -0.559324;0.693597;0.453961;, + -0.710934;0.444973;0.544584;, + 0.867052;0.137579;0.478846;, + 0.829671;0.408671;0.380308;, + 0.892567;0.378889;-0.244475;, + 0.886549;0.392710;-0.244561;, + 0.947696;-0.212901;-0.237792;, + 0.502434;-0.677413;0.537282;, + 0.044907;-0.611148;0.790241;, + 0.336341;-0.108795;0.935435;, + 0.899773;0.187812;0.393873;, + 0.898020;0.299543;-0.322233;, + -0.550598;-0.834581;0.017782;, + -0.920508;0.371208;0.121944;, + -0.986678;0.148934;0.065464;, + -0.872109;0.095397;-0.479922;, + 0.968704;-0.213268;-0.126998;, + 0.935445;-0.035033;-0.351732;, + 0.368870;0.664338;0.650069;, + 0.215407;0.452689;0.865259;, + 0.453303;-0.497746;0.739435;, + 0.521055;-0.809078;0.271835;, + 0.735182;-0.666684;0.122637;, + 0.821914;-0.569537;-0.009215;, + 0.759558;-0.443873;-0.475446;, + -0.657196;-0.390140;-0.644891;, + -0.809310;-0.499093;-0.309716;, + -0.707861;-0.682627;-0.181530;, + -0.757874;-0.650275;-0.052618;, + -0.565959;-0.798793;0.204013;, + -0.572197;-0.246884;0.782073;, + -0.572197;-0.246884;0.782073;, + 0.453303;-0.497746;0.739435;, + -0.520474;0.526586;0.672171;, + 0.798460;-0.602012;-0.006594;, + 0.954242;-0.257523;0.152001;, + 0.918662;-0.341700;0.198244;, + -0.995822;0.066694;-0.062372;, + -0.984728;-0.003402;0.174069;, + 0.968707;-0.002938;-0.248189;, + 0.954651;-0.166315;-0.246941;, + -0.000076;-0.461661;-0.887057;, + 0.965909;-0.084351;-0.244754;, + -0.972281;0.214777;-0.092415;, + 0.956895;-0.080204;0.279139;, + -0.381353;0.920775;0.082119;, + 0.999321;0.028755;-0.023042;, + -0.673865;0.641908;0.365869;, + -0.705742;-0.122863;0.697734;, + -0.960352;-0.063982;-0.271348;, + 0.566503;-0.333624;0.753505;, + 0.059122;-0.098574;-0.993372;, + 0.059122;-0.098574;-0.993372;, + 0.039464;-0.745272;-0.665591;, + -0.354476;-0.066564;0.932693;, + 0.181561;-0.108135;0.977416;, + 0.705192;-0.523353;0.478336;, + 0.734833;-0.590132;0.334314;, + 0.703206;-0.672001;-0.232197;, + 0.318223;-0.742396;-0.589561;, + -0.868967;-0.391802;-0.302304;, + -0.911357;-0.405828;0.068791;, + 0.353830;-0.592859;-0.723410;, + 0.039464;-0.745272;-0.665591;, + 0.566503;-0.333624;0.753505;, + -0.804425;-0.481755;0.347580;, + -0.705742;-0.122863;0.697734;, + -0.212265;-0.554761;-0.804478;, + -0.300497;-0.671647;-0.677194;, + 0.909177;-0.368835;-0.193282;, + -0.507519;-0.687744;-0.519069;, + -0.955392;-0.286491;-0.071754;, + 0.738914;-0.651028;0.173689;, + 0.982818;-0.144272;-0.115132;, + -0.539943;-0.790977;-0.287777;, + 0.365426;-0.280297;0.887636;, + 0.666223;-0.143179;0.731879;, + 0.313056;0.378120;0.871219;, + -0.400237;0.683181;0.610798;, + 0.639689;-0.061333;0.766183;, + -0.557613;-0.562556;0.610408;, + 0.152980;0.089858;-0.984136;, + -0.289534;0.030294;-0.956688;, + -0.381353;0.920775;0.082119;, + -0.421748;0.283560;-0.861233;, + -0.539943;-0.790977;-0.287777;, + -0.425702;-0.452816;-0.783413;, + -0.960352;-0.063982;-0.271348;, + 0.954242;-0.257523;0.152001;, + -0.537797;0.842499;0.031136;, + -0.545698;-0.837393;0.031400;, + -0.520441;-0.817752;0.245812;, + -0.037200;-0.353239;-0.934793;, + -0.311030;-0.795975;-0.519312;, + -0.790481;-0.221084;-0.571194;, + -0.597714;-0.523944;0.606812;, + -0.264462;-0.862138;0.432178;, + -0.550598;-0.834581;0.017782;, + -0.550598;-0.834581;0.017782;, + -0.275159;-0.572461;0.772383;, + -0.314707;0.781987;-0.538011;, + -0.000538;0.773627;-0.633641;, + -0.162744;0.615741;0.770959;, + -0.559206;0.508717;0.654596;, + -0.449270;0.893379;-0.005605;, + -0.449270;0.893379;-0.005605;, + 0.000168;0.854980;0.518661;, + -0.162744;0.615741;0.770959;, + -0.530614;0.817949;0.222282;, + -0.520441;-0.817752;0.245812;, + 0.000147;-0.426759;0.904366;, + -0.877145;-0.439089;0.194469;, + 1.000000;-0.000000;0.000000;, + 1.000000;-0.000000;0.000000;, + 1.000000;-0.000000;0.000000;, + 0.955485;-0.120740;-0.269203;, + -0.945620;0.026607;-0.324184;, + -0.995610;0.037774;-0.085641;, + -0.908432;0.107750;-0.403908;, + 0.992661;-0.000187;-0.120932;, + 0.990528;-0.094784;-0.099347;, + 0.992970;-0.002293;0.118346;, + -0.906954;0.117975;-0.404371;, + 0.000005;-0.908853;-0.417117;, + 0.920508;0.371208;0.121944;, + 0.550599;-0.834580;0.017784;, + 0.986678;0.148934;0.065464;, + 0.872109;0.095396;-0.479922;, + -0.968704;-0.213269;-0.126998;, + -0.935445;-0.035034;-0.351733;, + -0.368870;0.664338;0.650069;, + -0.215408;0.452689;0.865258;, + -0.453304;-0.497746;0.739435;, + -0.521055;-0.809078;0.271836;, + -0.735182;-0.666684;0.122637;, + -0.821914;-0.569537;-0.009216;, + -0.759558;-0.443871;-0.475447;, + 0.657196;-0.390140;-0.644891;, + 0.809310;-0.499092;-0.309716;, + 0.707861;-0.682627;-0.181531;, + 0.757874;-0.650275;-0.052618;, + 0.565958;-0.798793;0.204014;, + 0.572196;-0.246884;0.782074;, + 0.572196;-0.246884;0.782074;, + -0.453304;-0.497746;0.739435;, + 0.520473;0.526586;0.672172;, + -0.798459;-0.602012;-0.006595;, + -0.954242;-0.257523;0.152001;, + -0.918662;-0.341700;0.198244;, + 0.984728;-0.003402;0.174069;, + 0.995822;0.066694;-0.062372;, + -0.968707;-0.002938;-0.248190;, + -0.954652;-0.166280;-0.246961;, + -0.965909;-0.084351;-0.244754;, + 0.972281;0.214776;-0.092415;, + -0.956895;-0.080204;0.279139;, + 0.381356;0.920774;0.082120;, + -0.999321;0.028755;-0.023042;, + 0.673864;0.641909;0.365870;, + 0.705738;-0.122868;0.697737;, + 0.960352;-0.063982;-0.271348;, + -0.059122;-0.098573;-0.993372;, + -0.059122;-0.098573;-0.993372;, + -0.039462;-0.745268;-0.665596;, + 0.354475;-0.066564;0.932693;, + -0.181560;-0.108135;0.977416;, + -0.705199;-0.523347;0.478333;, + -0.734835;-0.590129;0.334313;, + -0.703206;-0.672002;-0.232196;, + -0.318224;-0.742397;-0.589560;, + 0.868969;-0.391799;-0.302303;, + 0.911362;-0.405818;0.068789;, + -0.353826;-0.592860;-0.723412;, + -0.039462;-0.745268;-0.665596;, + -0.566507;-0.333623;0.753502;, + 0.804429;-0.481751;0.347578;, + 0.705738;-0.122868;0.697737;, + 0.212267;-0.554751;-0.804484;, + 0.300504;-0.671641;-0.677197;, + -0.909176;-0.368837;-0.193284;, + 0.507518;-0.687743;-0.519071;, + 0.955392;-0.286490;-0.071755;, + -0.738915;-0.651028;0.173686;, + -0.982818;-0.144272;-0.115132;, + 0.539944;-0.790977;-0.287776;, + -0.365426;-0.280297;0.887636;, + -0.666223;-0.143179;0.731879;, + -0.313056;0.378120;0.871218;, + 0.400237;0.683181;0.610797;, + -0.639690;-0.061333;0.766182;, + 0.557614;-0.562555;0.610409;, + -0.152979;0.089859;-0.984136;, + 0.289534;0.030294;-0.956688;, + 0.381356;0.920774;0.082120;, + 0.421748;0.283560;-0.861233;, + 0.539944;-0.790977;-0.287776;, + 0.425700;-0.452817;-0.783413;, + 0.960352;-0.063982;-0.271348;, + -0.954242;-0.257523;0.152001;, + -0.566507;-0.333623;0.753502;, + 0.545698;-0.837393;0.031400;, + 0.557573;0.829476;0.032896;, + 0.520501;-0.817725;0.245773;, + 0.037200;-0.353240;-0.934793;, + 0.311029;-0.795977;-0.519309;, + 0.790480;-0.221084;-0.571194;, + 0.597714;-0.523943;0.606812;, + 0.264462;-0.862137;0.432180;, + 0.550599;-0.834580;0.017784;, + 0.550599;-0.834580;0.017784;, + 0.275160;-0.572458;0.772385;, + 0.309521;0.783229;-0.539212;, + 0.162598;0.616218;0.770608;, + 0.566570;0.495981;0.658028;, + 0.481298;0.876550;-0.003471;, + 0.481298;0.876550;-0.003471;, + 0.530646;0.817913;0.222337;, + 0.162598;0.616218;0.770608;, + 0.520501;-0.817725;0.245773;, + 0.877144;-0.439088;0.194473;, + -0.955485;-0.120740;-0.269203;, + 0.945620;0.026607;-0.324184;, + 0.995610;0.037774;-0.085641;, + 0.908432;0.107750;-0.403908;, + -0.992661;-0.000187;-0.120933;, + -0.990528;-0.094784;-0.099347;, + -0.992970;-0.002293;0.118346;, + 0.906954;0.117975;-0.404371;, + 0.448693;0.679150;0.580886;, + 0.987197;-0.118160;-0.107142;, + 0.207701;-0.604118;-0.769351;, + 0.529914;-0.324726;-0.783418;, + 0.955178;-0.252865;0.153929;, + 0.987197;-0.118160;-0.107142;, + -0.160126;0.190092;-0.968620;, + 0.006566;0.677354;0.735628;, + 0.068168;0.237165;0.969075;, + 0.423190;-0.716621;-0.554404;, + 0.657416;-0.744773;-0.114531;, + 0.509538;-0.839165;-0.190193;, + -0.234676;0.256475;0.937629;, + -0.834983;0.264476;-0.482552;, + -0.527039;0.781296;-0.334374;, + -0.473718;0.414055;-0.777271;, + -0.160126;0.190092;-0.968620;, + -0.228376;-0.127237;-0.965223;, + -0.839542;-0.269781;-0.471581;, + -0.675963;0.077412;-0.732858;, + -0.963227;0.157435;-0.217736;, + -0.259132;0.699308;-0.666197;, + -0.527039;0.781296;-0.334374;, + -0.422834;0.836078;-0.349551;, + -0.228376;-0.127237;-0.965223;, + -0.641365;-0.305210;-0.703916;, + -0.963227;0.157435;-0.217736;, + 0.897041;0.033289;-0.440692;, + -0.146089;-0.981553;0.123336;, + 0.034059;-0.236374;-0.971065;, + -0.520041;-0.156983;0.839592;, + -0.353633;-0.752104;0.556133;, + -0.898012;0.382182;0.217971;, + -0.234676;0.256475;0.937629;, + 0.509538;-0.839165;-0.190193;, + 0.295362;0.740439;0.603748;, + -0.234676;0.256475;0.937629;, + -0.318398;0.686232;0.653995;, + 0.634338;-0.406257;-0.657701;, + -0.286418;0.500490;0.816991;, + 0.450770;-0.364624;-0.814773;, + 0.509538;-0.839165;-0.190193;, + 0.914801;0.309243;0.259824;, + -0.578072;-0.401336;0.710466;, + 0.963480;0.174780;-0.202875;, + 0.916931;0.363083;0.165554;, + 0.970183;-0.159926;0.182121;, + 0.034059;-0.236374;-0.971065;, + 0.126855;0.710394;-0.692277;, + 0.034059;-0.236374;-0.971065;, + -0.828231;-0.560343;0.007058;, + -0.156866;-0.502085;-0.850473;, + -0.898012;0.382182;0.217971;, + -0.898012;0.382182;0.217971;, + 0.426128;-0.774572;-0.467389;, + 0.396048;-0.852920;0.340107;, + -0.039929;-0.807710;-0.588227;, + 0.303641;-0.441458;-0.844344;, + -0.039929;-0.807710;-0.588227;, + -0.472468;0.843730;0.254742;, + 0.489036;0.859909;-0.146290;, + 0.568943;-0.193580;-0.799269;, + -0.472468;0.843730;0.254742;, + -0.896153;0.443634;0.009920;, + 0.826841;-0.523263;-0.206226;, + 0.500952;0.279713;0.819029;, + -0.205138;-0.005818;0.978716;, + -0.469045;0.851012;0.236169;, + -0.502437;0.667098;0.550034;, + 0.780352;-0.359300;-0.511814;, + -0.506181;0.569758;0.647422;, + 0.780352;-0.359300;-0.511814;, + -0.268806;-0.896766;-0.351502;, + -0.129004;-0.984436;0.119344;, + 0.915472;-0.398064;-0.058788;, + -0.343908;0.401841;0.848676;, + 0.777616;-0.116615;0.617830;, + 0.507759;-0.548313;-0.664480;, + -0.257983;0.544602;0.798031;, + -0.362576;0.544444;0.756386;, + 0.538295;-0.631424;-0.558159;, + 0.725324;-0.198324;0.659221;, + -0.276717;0.544754;0.791625;, + 0.456380;-0.580050;-0.674729;, + -0.464359;0.605477;0.646350;, + 0.314063;-0.536259;-0.783448;, + -0.470908;0.619311;0.628251;, + 0.329202;-0.554979;-0.763953;, + -0.242430;0.521770;0.817914;, + 0.488072;-0.623641;-0.610621;, + -0.339070;0.554869;0.759705;, + 0.450906;-0.603711;-0.657432;, + -0.560979;0.636505;0.529305;, + 0.229922;-0.482476;-0.845194;, + -0.480825;0.612885;0.627040;, + 0.327893;-0.527492;-0.783734;, + -0.130859;0.472769;0.871416;, + 0.582448;-0.641920;-0.498692;, + 0.114891;0.475550;0.872154;, + 0.738199;-0.672946;-0.046963;, + 0.654098;0.265568;0.708258;, + 0.788837;-0.361752;0.496862;, + -0.263126;0.546005;0.795389;, + 0.497233;-0.613394;-0.613602;, + 0.715283;-0.213463;0.665435;, + -0.306469;0.543138;0.781715;, + 0.446317;-0.594873;-0.668526;, + -0.452795;0.600684;0.658905;, + 0.308543;-0.543003;-0.780992;, + -0.456215;0.614991;0.643159;, + 0.335867;-0.559796;-0.757510;, + -0.263346;0.532405;0.804484;, + 0.471488;-0.618541;-0.628574;, + -0.345261;0.558515;0.754225;, + 0.439782;-0.600782;-0.667573;, + -0.537976;0.628508;0.561747;, + 0.252684;-0.497453;-0.829875;, + -0.467237;0.607846;0.642038;, + 0.333904;-0.534319;-0.776538;, + -0.165833;0.490715;0.855393;, + 0.554845;-0.638321;-0.533566;, + 0.068015;0.505465;0.860162;, + 0.701497;-0.701342;-0.126576;, + 0.636095;0.307826;0.707549;, + 0.782976;-0.407275;0.470186;, + -0.265565;0.544402;0.795677;, + 0.501872;-0.611244;-0.611969;, + 0.730965;-0.293094;0.616268;, + -0.292472;0.536722;0.791448;, + 0.440673;-0.592878;-0.674020;, + -0.447421;0.598812;0.664258;, + 0.294817;-0.536769;-0.790545;, + -0.451790;0.613142;0.648030;, + 0.324769;-0.553847;-0.766667;, + -0.247760;0.524381;0.814641;, + 0.467816;-0.617010;-0.632809;, + -0.334234;0.553031;0.763180;, + 0.434085;-0.598441;-0.673379;, + -0.537145;0.628597;0.562442;, + 0.236650;-0.488015;-0.840142;, + -0.462849;0.606173;0.646780;, + 0.323287;-0.527601;-0.785571;, + -0.146317;0.479991;0.864985;, + 0.555697;-0.637603;-0.533538;, + 0.090407;0.490418;0.866785;, + 0.709732;-0.695413;-0.112611;, + 0.646355;0.289593;0.705947;, + 0.787167;-0.396002;0.472811;, + -0.212404;0.516342;0.829624;, + 0.516966;-0.608447;-0.602112;, + -0.215861;0.514387;0.829946;, + 0.400936;-0.557240;-0.727141;, + -0.409694;0.584477;0.700383;, + 0.255763;-0.507343;-0.822915;, + -0.416769;0.599193;0.683573;, + 0.271222;-0.525963;-0.806102;, + -0.182521;0.489258;0.852827;, + 0.434921;-0.604440;-0.667455;, + -0.280896;0.526446;0.802466;, + 0.395442;-0.582473;-0.710176;, + -0.512610;0.622446;0.591432;, + 0.170371;-0.449244;-0.877014;, + -0.427834;0.592777;0.682329;, + 0.271016;-0.497964;-0.823761;, + 0.892887;0.164047;-0.419335;, + -0.071795;0.436064;0.897047;, + 0.535967;-0.630109;-0.561873;, + 0.170183;0.433298;0.885037;, + 0.717370;-0.686582;-0.118260;, + 0.689840;0.223648;0.688551;, + 0.804020;-0.394183;0.445166;, + -0.588806;0.000143;0.808275;, + -0.886836;0.434833;0.156336;, + 0.226188;-0.397375;0.889344;, + 0.313446;0.294967;0.902633;, + -0.123513;0.634708;0.762817;, + 0.396692;0.282270;-0.873475;, + -0.557305;-0.389761;0.733143;, + 0.964289;0.264843;-0.002032;, + 0.506951;-0.238596;0.828295;, + 0.506951;-0.238596;0.828295;, + -0.957604;-0.179816;-0.225078;, + -0.529914;-0.324726;-0.783418;, + -0.148924;-0.632604;-0.760022;, + -0.994196;0.051821;0.094280;, + -0.871225;-0.451441;0.192789;, + 0.160126;0.190092;-0.968620;, + -0.006566;0.677353;0.735628;, + -0.057386;0.245516;0.967692;, + -0.657416;-0.744773;-0.114531;, + -0.423190;-0.716621;-0.554404;, + -0.509830;-0.838926;-0.190465;, + 0.391442;0.389355;0.833772;, + 0.834983;0.264476;-0.482552;, + 0.527039;0.781296;-0.334374;, + 0.473718;0.414055;-0.777271;, + 0.160126;0.190092;-0.968620;, + 0.228376;-0.127237;-0.965223;, + 0.839542;-0.269781;-0.471581;, + 0.675963;0.077412;-0.732859;, + 0.963227;0.157435;-0.217736;, + 0.259132;0.699308;-0.666198;, + 0.422834;0.836078;-0.349550;, + 0.527039;0.781296;-0.334374;, + 0.641365;-0.305210;-0.703916;, + 0.228376;-0.127237;-0.965223;, + 0.963227;0.157435;-0.217736;, + -0.897162;0.033159;-0.440455;, + 0.146090;-0.981553;0.123336;, + -0.034059;-0.236375;-0.971065;, + 0.520040;-0.156982;0.839592;, + 0.353633;-0.752104;0.556133;, + 0.391442;0.389355;0.833772;, + 0.653620;0.114523;0.748107;, + 0.520040;-0.156982;0.839592;, + -0.509830;-0.838926;-0.190465;, + -0.190416;0.835663;0.515178;, + 0.438815;0.143443;0.887054;, + 0.898012;0.382183;0.217970;, + -0.634338;-0.406257;-0.657701;, + -0.451041;-0.364729;-0.814576;, + -0.509830;-0.838926;-0.190465;, + -0.607672;0.793048;-0.042537;, + 0.578072;-0.401336;0.710466;, + -0.964421;0.191784;-0.181966;, + -0.881035;0.426148;0.205365;, + -0.980241;-0.139652;0.140090;, + -0.034059;-0.236375;-0.971065;, + -0.126856;0.710394;-0.692277;, + -0.034059;-0.236375;-0.971065;, + 0.828231;-0.560342;0.007058;, + 0.156866;-0.502085;-0.850473;, + 0.898012;0.382183;0.217970;, + 0.898012;0.382183;0.217970;, + -0.667053;-0.649082;0.365696;, + -0.492298;-0.784288;-0.377538;, + -0.494156;0.758623;-0.424618;, + 0.063298;-0.757803;-0.649405;, + 0.063298;-0.757803;-0.649405;, + 0.505009;0.836271;0.213581;, + -0.552096;-0.122315;-0.824760;, + 0.505009;0.836271;0.213581;, + 0.894433;0.447026;-0.012553;, + -0.823845;-0.530391;-0.199912;, + -0.489616;0.263036;0.831317;, + 0.188469;-0.005536;0.982064;, + 0.475166;0.851493;0.221757;, + 0.500593;0.666086;0.552935;, + -0.774625;-0.362944;-0.517907;, + 0.498824;0.566633;0.655822;, + -0.913491;-0.404743;-0.041435;, + 0.338248;0.393374;0.854895;, + -0.765877;-0.131961;0.629300;, + -0.499148;-0.545190;-0.673512;, + -0.714900;-0.212902;0.666026;, + -0.857968;0.149295;-0.491531;, + 0.351827;0.537583;0.766305;, + 0.247538;0.533303;0.808896;, + -0.533434;-0.631638;-0.562567;, + 0.266062;0.534893;0.801936;, + -0.447982;-0.577196;-0.682757;, + 0.457685;0.602796;0.653575;, + -0.302952;-0.528059;-0.793330;, + 0.464637;0.616931;0.635224;, + -0.320375;-0.545709;-0.774314;, + 0.231555;0.510140;0.828335;, + -0.482310;-0.621551;-0.617294;, + 0.330057;0.546220;0.769874;, + -0.443595;-0.600833;-0.664998;, + 0.557674;0.637189;0.531969;, + -0.218196;-0.468925;-0.855862;, + 0.475036;0.610817;0.633438;, + -0.320194;-0.517249;-0.793681;, + 0.120529;0.460012;0.879694;, + -0.579460;-0.642332;-0.501632;, + -0.117801;0.461501;0.879284;, + -0.737915;-0.674242;-0.029655;, + -0.649761;0.259288;0.714549;, + -0.783249;-0.356084;0.509632;, + 0.252546;0.535085;0.806166;, + -0.490701;-0.611734;-0.620479;, + -0.703251;-0.226621;0.673855;, + 0.295401;0.533999;0.792201;, + -0.438220;-0.592052;-0.676341;, + 0.445511;0.597421;0.666789;, + -0.297424;-0.534529;-0.791086;, + 0.449368;0.612043;0.650747;, + -0.326742;-0.550893;-0.767956;, + 0.252472;0.521534;0.815021;, + -0.465089;-0.615834;-0.635956;, + 0.335949;0.550139;0.764517;, + -0.432019;-0.597419;-0.675611;, + 0.533739;0.628202;0.566114;, + -0.240978;-0.484831;-0.840755;, + 0.460786;0.605148;0.649209;, + -0.325458;-0.524380;-0.786831;, + 0.154787;0.478816;0.864162;, + -0.550996;-0.638131;-0.537766;, + -0.072427;0.492303;0.867406;, + -0.702169;-0.703184;-0.111764;, + -0.633977;0.303269;0.711408;, + -0.780241;-0.399104;0.481601;, + 0.254891;0.533546;0.806448;, + -0.495277;-0.609732;-0.618812;, + -0.721934;-0.308194;0.619538;, + 0.281251;0.527055;0.801942;, + -0.432483;-0.589889;-0.681901;, + 0.440073;0.595333;0.672246;, + -0.283571;-0.527836;-0.800610;, + 0.444854;0.609993;0.655754;, + -0.315564;-0.544433;-0.777182;, + 0.236801;0.512915;0.825133;, + -0.461342;-0.614098;-0.640349;, + 0.324837;0.544170;0.773537;, + -0.426219;-0.594861;-0.681526;, + 0.532960;0.628250;0.566794;, + -0.224869;-0.474782;-0.850891;, + 0.456355;0.603310;0.654031;, + -0.314900;-0.517199;-0.795828;, + 0.135489;0.467543;0.873525;, + -0.551857;-0.637341;-0.537819;, + -0.094199;0.476771;0.873966;, + -0.710203;-0.697232;-0.097362;, + -0.643422;0.284541;0.710665;, + -0.783588;-0.388614;0.484736;, + 0.201577;0.503110;0.840385;, + -0.510465;-0.607468;-0.608611;, + 0.204883;0.502219;0.840119;, + -0.391192;-0.551987;-0.736396;, + 0.401612;0.579399;0.709228;, + -0.244152;-0.497096;-0.832638;, + 0.408987;0.594527;0.692291;, + -0.261639;-0.514291;-0.816731;, + 0.171512;0.475490;0.862840;, + -0.427611;-0.599957;-0.676166;, + 0.271095;0.515384;0.812949;, + -0.386791;-0.577398;-0.719030;, + 0.507899;0.621019;0.596970;, + -0.158619;-0.433804;-0.886935;, + 0.420631;0.588517;0.690447;, + -0.262650;-0.485562;-0.833813;, + 0.062071;0.421776;0.904573;, + -0.531432;-0.628929;-0.567476;, + -0.171508;0.418312;0.891964;, + -0.717453;-0.688923;-0.103178;, + -0.684430;0.217897;0.695756;, + -0.798889;-0.388529;0.459153;, + 0.563755;-0.000870;0.825942;, + 0.886836;0.434833;0.156336;, + -0.202243;-0.425807;0.881922;, + 0.166307;0.647301;0.743870;, + -0.301252;0.328615;0.895131;, + 0.549353;-0.390720;0.738613;, + -0.944779;0.327439;0.013305;, + -0.529409;-0.220751;0.819143;, + -0.529409;-0.220751;0.819143;, + 0.214009;0.839435;0.499548;, + 0.774218;0.487454;0.403702;, + -0.957604;-0.179816;-0.225078;, + -0.169599;0.852875;0.493802;, + 0.343698;0.922858;0.173795;, + 0.485631;0.575618;0.657895;, + -0.260653;0.953967;0.148347;, + 0.055097;0.933688;0.353823;, + -0.559324;0.693597;0.453961;, + -0.540286;0.724558;-0.427911;, + -0.496164;0.335976;-0.800588;, + -0.540286;0.724558;-0.427911;, + -0.654263;-0.049613;-0.754638;, + -0.496164;0.335976;-0.800588;, + -0.540286;0.724558;-0.427911;, + -0.540286;0.724558;-0.427911;, + -0.654263;-0.049613;-0.754638;, + -0.654263;-0.049613;-0.754638;, + -0.563708;-0.395781;-0.724976;, + -0.235609;0.971832;-0.005539;, + -0.284112;0.944212;0.166567;, + -0.232970;0.970399;0.063643;, + -0.302341;0.947980;-0.099615;, + -0.793812;0.600245;-0.097818;, + -0.000001;0.818760;0.574136;, + 0.382016;0.040071;0.923286;, + -0.000000;-0.444151;0.895952;, + 0.012819;0.940525;0.339483;, + -0.394637;-0.137254;0.908528;, + -0.231714;-0.275342;0.933003;, + -0.432713;-0.354931;0.828724;, + -0.733140;-0.437535;0.520643;, + -0.944986;-0.217661;0.244183;, + -0.965289;-0.090055;-0.245168;, + -0.404283;-0.450662;0.795902;, + -0.944986;-0.217661;0.244183;, + -0.432713;-0.354931;0.828724;, + -0.886311;0.419497;-0.196151;, + -0.232970;0.970399;0.063643;, + -0.235609;0.971832;-0.005539;, + -0.899678;-0.251384;-0.356911;, + -0.496164;0.335976;-0.800588;, + -0.984181;0.095585;0.149171;, + -0.899678;-0.251384;-0.356911;, + -0.534104;0.546724;-0.644846;, + -0.540286;0.724558;-0.427911;, + -0.899678;-0.251384;-0.356911;, + -0.806852;-0.393759;-0.440389;, + -0.563708;-0.395781;-0.724976;, + -0.000000;0.298174;-0.954511;, + -0.654263;-0.049613;-0.754638;, + -0.654263;-0.049613;-0.754638;, + -0.000000;0.298174;-0.954511;, + -0.929825;-0.231328;0.286203;, + -0.861728;0.431543;-0.266824;, + -0.793812;0.600245;-0.097818;, + -0.000000;0.630324;-0.776332;, + -0.534104;0.546724;-0.644846;, + -0.899678;-0.251384;-0.356911;, + -0.861728;0.431543;-0.266824;, + -0.000000;-0.029730;-0.999558;, + -0.927251;-0.170149;-0.333550;, + -0.534104;0.546724;-0.644846;, + -0.927251;-0.170149;-0.333550;, + -0.422789;0.519154;-0.742784;, + -0.000000;0.998500;0.054759;, + 0.014166;0.945681;-0.324786;, + -0.000000;0.998500;0.054759;, + -0.534104;0.546724;-0.644846;, + -0.861728;0.431543;-0.266824;, + -0.699443;-0.209423;-0.683316;, + -0.178300;-0.323577;-0.929251;, + -0.691836;-0.542995;-0.475940;, + -0.178300;-0.323577;-0.929251;, + -0.937849;0.041613;0.344540;, + -0.861728;0.431543;-0.266824;, + -0.879018;0.070016;-0.471619;, + -0.793812;0.600245;-0.097818;, + -0.701635;0.645253;-0.302255;, + -0.944986;-0.217661;0.244183;, + -0.000000;0.998500;0.054759;, + -0.000000;0.868934;-0.494927;, + -0.540286;0.724558;-0.427911;, + -0.000000;-0.029730;-0.999558;, + -0.000000;0.630324;-0.776332;, + -0.496164;0.335976;-0.800588;, + -0.496164;0.335976;-0.800588;, + -0.899678;-0.251384;-0.356911;, + -0.654263;-0.049613;-0.754638;, + -0.793812;0.600245;-0.097818;, + -0.861728;0.431543;-0.266824;, + -0.899678;-0.251384;-0.356911;, + -0.000000;0.998500;0.054759;, + -0.691836;-0.542995;-0.475940;, + -0.563708;-0.395781;-0.724976;, + -0.806852;-0.393759;-0.440389;, + -0.559606;-0.645175;-0.520183;, + -0.000000;0.998500;0.054759;, + 0.540286;0.724558;-0.427911;, + -0.000000;0.630324;-0.776332;, + 0.496164;0.335976;-0.800588;, + 0.540286;0.724558;-0.427911;, + 0.654263;-0.049613;-0.754638;, + 0.496164;0.335976;-0.800588;, + 0.540286;0.724558;-0.427911;, + 0.540286;0.724558;-0.427911;, + -0.000000;0.868934;-0.494927;, + 0.654263;-0.049613;-0.754638;, + -0.000000;0.298174;-0.954511;, + 0.654263;-0.049613;-0.754638;, + 0.563708;-0.395781;-0.724976;, + 0.235609;0.971832;-0.005539;, + 0.232970;0.970399;0.063643;, + 0.284111;0.944212;0.166568;, + 0.886230;0.418543;-0.198540;, + 0.793812;0.600245;-0.097818;, + -0.382017;0.040070;0.923286;, + -0.012819;0.940525;0.339483;, + 0.231714;-0.275342;0.933003;, + 0.394636;-0.137254;0.908528;, + 0.432713;-0.354931;0.828724;, + 0.930868;-0.256053;0.260617;, + 0.965023;-0.089095;-0.246563;, + 0.732571;-0.437022;0.521873;, + 0.302341;0.947980;-0.099615;, + 0.232970;0.970399;0.063643;, + 0.235609;0.971832;-0.005539;, + 0.899678;-0.251384;-0.356911;, + 0.496164;0.335976;-0.800588;, + 0.899678;-0.251384;-0.356911;, + 0.553016;0.656553;-0.512944;, + 0.540286;0.724558;-0.427911;, + 0.899678;-0.251384;-0.356911;, + 0.836668;-0.377812;-0.396542;, + 0.563708;-0.395781;-0.724976;, + -0.000000;0.298174;-0.954511;, + 0.654263;-0.049613;-0.754638;, + 0.654263;-0.049613;-0.754638;, + -0.142878;-0.121955;-0.982198;, + -0.000000;0.298174;-0.954511;, + 0.930521;-0.221376;0.291758;, + 0.945515;0.306078;-0.110984;, + 0.924672;0.127786;0.358681;, + 0.793812;0.600245;-0.097818;, + -0.000000;0.630324;-0.776332;, + 0.553016;0.656553;-0.512944;, + -0.000000;-0.029730;-0.999558;, + 0.899678;-0.251384;-0.356911;, + 0.945515;0.306078;-0.110984;, + -0.000000;-0.029730;-0.999558;, + 0.932085;0.115972;-0.343175;, + -0.014166;0.945682;-0.324786;, + 0.553016;0.656553;-0.512944;, + 0.945515;0.306078;-0.110984;, + 0.490285;-0.201883;-0.847858;, + 0.366430;-0.311048;-0.876914;, + 0.642185;-0.647026;-0.411043;, + 0.366430;-0.311048;-0.876914;, + 0.940115;0.027121;0.339777;, + 0.945515;0.306078;-0.110984;, + 0.793812;0.600245;-0.097818;, + 0.879018;0.070016;-0.471619;, + 0.701635;0.645253;-0.302255;, + 0.930868;-0.256053;0.260617;, + -0.000000;0.998500;0.054759;, + -0.000000;0.868934;-0.494927;, + 0.540286;0.724558;-0.427911;, + -0.000000;-0.029730;-0.999558;, + -0.000000;0.630324;-0.776332;, + 0.496164;0.335976;-0.800588;, + 0.496164;0.335976;-0.800588;, + 0.899678;-0.251384;-0.356911;, + 0.654263;-0.049613;-0.754638;, + 0.793812;0.600245;-0.097818;, + -0.136274;0.884818;0.445562;, + -0.102555;-0.767205;-0.633151;, + 0.945515;0.306078;-0.110984;, + 0.899678;-0.251384;-0.356911;, + -0.000000;0.998500;0.054759;, + 0.642185;-0.647026;-0.411043;, + 0.563708;-0.395781;-0.724976;, + 0.836668;-0.377812;-0.396542;, + 0.559606;-0.645176;-0.520182;, + 0.836668;-0.377812;-0.396542;, + 0.642185;-0.647026;-0.411043;, + 0.403086;-0.867962;-0.290108;, + 0.373002;-0.795669;-0.477263;, + 0.558443;-0.699105;0.446535;, + 0.772381;-0.152248;0.616642;, + -0.833821;-0.284781;0.472909;, + -0.488240;-0.590800;0.642322;, + -0.337534;-0.853552;-0.396886;, + -0.607999;-0.786791;-0.106285;, + 0.077777;-0.993666;-0.081114;, + -0.091466;-0.994758;-0.045715;, + -0.178300;-0.323577;-0.929251;, + -0.142878;-0.121955;-0.982198;, + 0.366430;-0.311048;-0.876914;, + 0.260508;0.727642;-0.634565;, + -0.040453;0.710290;-0.702746;, + -0.588256;0.730768;-0.346313;, + -0.010918;-0.937228;0.348545;, + -0.238496;-0.799571;0.551186;, + 0.193201;-0.890421;0.412097;, + 0.014300;-0.847026;0.531360;, + -0.801728;-0.276819;0.529721;, + -0.615086;-0.386827;0.687047;, + -0.793967;-0.433457;0.426300;, + -0.745782;-0.452954;0.488509;, + -0.932337;-0.361278;-0.015029;, + -0.856324;-0.247040;-0.453521;, + -0.707919;-0.624087;-0.330705;, + -0.531094;-0.706015;-0.468489;, + -0.808123;-0.461550;-0.365936;, + -0.948825;-0.033448;0.314026;, + -0.930713;-0.092278;0.353918;, + -0.920811;-0.172908;0.349584;, + -0.916339;-0.265300;0.299899;, + -0.604821;-0.388772;-0.695017;, + -0.945731;0.117071;0.303128;, + -0.970327;0.034796;0.239279;, + -0.978433;-0.005143;0.206502;, + -0.861728;0.431543;-0.266824;, + -0.531997;-0.340199;0.775399;, + -0.689076;-0.199468;0.696697;, + -0.741015;0.256716;0.620479;, + -0.216517;0.601928;0.768637;, + -0.823955;0.147553;0.547108;, + -0.759279;0.153427;0.632421;, + -0.896238;-0.324230;0.302709;, + -0.280865;-0.155167;0.947121;, + -0.478361;-0.492783;0.726868;, + -0.124352;-0.098909;0.987296;, + -0.205252;0.312404;0.927510;, + -0.110123;-0.025715;0.993585;, + -0.937849;0.041613;0.344540;, + -0.929825;-0.231328;0.286203;, + -0.699443;-0.209423;-0.683316;, + -0.806852;-0.393759;-0.440389;, + -0.806852;-0.393759;-0.440389;, + -0.691836;-0.542995;-0.475940;, + -0.767636;-0.389543;-0.508912;, + -0.551796;-0.574616;-0.604431;, + -0.979289;0.016954;0.201754;, + -0.966193;0.076246;0.246286;, + -0.877724;-0.460197;-0.133489;, + -0.551796;-0.574616;-0.604431;, + -0.923625;-0.293416;-0.246623;, + -0.551796;-0.574616;-0.604431;, + -0.460194;0.616751;0.638623;, + -0.237549;0.171176;0.956174;, + -0.246128;0.432303;0.867488;, + -0.304277;-0.311038;0.900372;, + -0.207669;-0.717728;0.664635;, + -0.223441;-0.620814;0.751442;, + -0.371514;-0.104033;0.922580;, + -0.292418;0.016174;0.956154;, + -0.291101;0.296117;0.909711;, + -0.290228;0.134824;0.947413;, + 0.732447;-0.463382;0.498797;, + 0.823502;-0.420165;0.381189;, + 0.796203;-0.311752;0.518528;, + 0.557281;-0.410177;0.721937;, + 0.663539;-0.666241;-0.340352;, + 0.627769;-0.641265;-0.441233;, + 0.924341;-0.229764;-0.304633;, + 0.885166;-0.437540;-0.158241;, + 0.825383;-0.420119;-0.377152;, + 0.927430;-0.166498;0.334890;, + 0.916339;-0.265300;0.299899;, + 0.922761;-0.080766;0.376814;, + 0.959207;-0.033141;0.280754;, + 0.618095;-0.351774;-0.703004;, + 0.962843;0.019373;0.269367;, + 0.983531;0.088214;0.157748;, + 0.930868;-0.256053;0.260617;, + 0.432713;-0.354931;0.828724;, + 0.553016;0.656553;-0.512944;, + 0.945515;0.306078;-0.110984;, + 0.993793;-0.011471;0.110653;, + 0.479423;0.478311;0.735780;, + 0.781695;0.234974;0.577703;, + 0.679518;-0.160347;0.715922;, + 0.358587;-0.591042;0.722554;, + 0.819624;0.148430;0.553340;, + 0.781224;0.181945;0.597148;, + 0.891387;-0.329329;0.311403;, + 0.041593;0.020366;0.998927;, + 0.377267;-0.289994;0.879530;, + 0.105429;-0.086429;0.990664;, + 0.222570;0.434020;0.872977;, + 0.940115;0.027121;0.339777;, + 0.930521;-0.221376;0.291758;, + 0.629863;0.520365;-0.576622;, + 0.932085;0.115972;-0.343175;, + 0.490285;-0.201883;-0.847858;, + 0.836668;-0.377812;-0.396542;, + 0.836668;-0.377812;-0.396542;, + 0.642185;-0.647026;-0.411043;, + 0.551796;-0.574616;-0.604431;, + 0.831536;-0.420486;-0.362960;, + 0.551796;-0.574616;-0.604431;, + 0.955968;0.074254;0.283920;, + 0.992970;0.009011;0.118019;, + 0.872770;-0.467932;-0.138969;, + 0.831536;-0.420486;-0.362960;, + 0.448693;0.679150;0.580886;, + 0.218225;0.244375;0.944806;, + 0.291626;0.332066;0.897043;, + 0.323872;-0.438181;0.838513;, + 0.236939;-0.570878;0.786103;, + 0.298672;-0.579421;0.758332;, + 0.305557;-0.031119;0.951665;, + 0.302334;0.087757;0.949154;, + 0.249071;0.370670;0.894744;, + 0.278707;0.095201;0.955646;, + -0.305307;0.626286;0.717324;, + 0.313062;0.614710;0.723964;, + 0.404283;-0.450662;0.795902;, + 0.914875;-0.152402;-0.373869;, + -0.914875;-0.152402;-0.373869;; + 6841; + 3;28,62,1;, + 3;3,16,3420;, + 3;11,23,29;, + 3;104,69,7;, + 3;0,13,70;, + 3;9,97,96;, + 3;3421,71,2;, + 3;15,22,3;, + 3;3420,15,3;, + 3;68,4,15;, + 3;116,111,106;, + 3;3422,12,6;, + 3;6,12,1742;, + 3;24,14,12;, + 3;3423,108,119;, + 3;102,7,13;, + 3;13,30,23;, + 3;3420,2,15;, + 3;115,116,106;, + 3;100,3424,17;, + 3;100,1,3424;, + 3;1,18,19;, + 3;28,1,19;, + 3;104,94,69;, + 3;15,4,20;, + 3;98,8,97;, + 3;115,106,114;, + 3;29,23,126;, + 3;3422,24,12;, + 3;30,0,27;, + 3;26,11,29;, + 3;24,3422,3425;, + 3;27,126,23;, + 3;3426,3427,3428;, + 3;23,11,13;, + 3;13,0,30;, + 3;23,30,27;, + 3;108,107,120;, + 3;31,6,1741;, + 3;25,32,29;, + 3;32,26,29;, + 3;136,132,135;, + 3;32,25,65;, + 3;63,60,35;, + 3;3419,3429,63;, + 3;35,59,34;, + 3;58,59,16;, + 3;41,36,848;, + 3;51,53,49;, + 3;3430,55,49;, + 3;82,848,36;, + 3;24,38,14;, + 3;84,49,53;, + 3;81,82,43;, + 3;83,3431,39;, + 3;41,45,36;, + 3;40,3430,3432;, + 3;41,37,47;, + 3;24,52,48;, + 3;3430,49,84;, + 3;38,48,50;, + 3;38,24,48;, + 3;49,55,50;, + 3;50,51,49;, + 3;55,56,50;, + 3;48,51,50;, + 3;81,43,80;, + 3;67,54,3433;, + 3;39,66,44;, + 3;50,56,38;, + 3;3430,40,55;, + 3;56,57,38;, + 3;55,40,56;, + 3;56,436,57;, + 3;51,48,52;, + 3;3434,3435,3436;, + 3;3437,3438,3435;, + 3;3437,3439,3438;, + 3;33,3439,3437;, + 3;64,3440,3441;, + 3;3442,3443,33;, + 3;3440,3444,3445;, + 3;52,24,3425;, + 3;3434,3436,3446;, + 3;16,59,3420;, + 3;60,3420,59;, + 3;58,34,59;, + 3;60,3421,3420;, + 3;35,60,59;, + 3;61,27,0;, + 3;3447,61,3448;, + 3;28,3449,62;, + 3;3420,3421,2;, + 3;63,3429,3421;, + 3;3419,63,3450;, + 3;63,3421,60;, + 3;33,64,3442;, + 3;3450,63,35;, + 3;65,129,3447;, + 3;3434,3437,3435;, + 3;3444,42,3445;, + 3;3445,3441,3440;, + 3;39,3451,66;, + 3;3441,3442,64;, + 3;53,67,3433;, + 3;33,3443,3439;, + 3;2,68,15;, + 3;3452,3453,69;, + 3;70,13,7;, + 3;3421,3429,71;, + 3;0,70,73;, + 3;73,72,0;, + 3;7,69,75;, + 3;75,74,7;, + 3;3454,3455,77;, + 3;77,76,3454;, + 3;3453,3456,79;, + 3;79,78,3453;, + 3;70,7,74;, + 3;74,73,70;, + 3;69,3453,78;, + 3;78,75,69;, + 3;3456,3454,76;, + 3;76,79,3456;, + 3;3455,0,72;, + 3;72,77,3455;, + 3;80,43,3457;, + 3;43,82,44;, + 3;37,81,80;, + 3;44,82,83;, + 3;81,37,82;, + 3;44,83,39;, + 3;83,82,36;, + 3;3433,84,53;, + 3;83,36,3431;, + 3;3,22,85;, + 3;110,112,113;, + 3;22,89,85;, + 3;110,114,106;, + 3;95,118,111;, + 3;3447,128,61;, + 3;22,90,89;, + 3;110,113,114;, + 3;109,112,110;, + 3;90,22,91;, + 3;15,91,22;, + 3;15,92,91;, + 3;15,20,92;, + 3;92,20,93;, + 3;117,111,116;, + 3;3452,94,3458;, + 3;94,3452,69;, + 3;99,96,21;, + 3;111,117,95;, + 3;9,96,99;, + 3;1739,97,9;, + 3;97,8,21;, + 3;97,21,96;, + 3;10,98,97;, + 3;31,3422,6;, + 3;1741,6,1744;, + 3;88,99,845;, + 3;107,118,95;, + 3;18,100,17;, + 3;18,1,100;, + 3;101,102,13;, + 3;11,101,13;, + 3;119,108,120;, + 3;103,7,102;, + 3;107,121,120;, + 3;95,122,107;, + 3;107,123,121;, + 3;95,117,122;, + 3;107,122,123;, + 3;103,105,104;, + 3;103,104,7;, + 3;3459,5,106;, + 3;106,111,3459;, + 3;3423,3460,108;, + 3;3423,119,3461;, + 3;3462,3463,116;, + 3;116,115,3462;, + 3;3464,3465,122;, + 3;122,117,3464;, + 3;3466,3462,115;, + 3;115,114,3466;, + 3;107,108,3460;, + 3;3467,3468,113;, + 3;113,112,3467;, + 3;3469,3459,111;, + 3;111,118,3469;, + 3;3468,3466,114;, + 3;114,113,3468;, + 3;87,86,109;, + 3;109,110,87;, + 3;3463,3464,117;, + 3;117,116,3463;, + 3;3470,3469,118;, + 3;118,3471,3470;, + 3;3472,3461,119;, + 3;119,120,3472;, + 3;3473,3472,120;, + 3;120,121,3473;, + 3;3474,3473,121;, + 3;121,123,3474;, + 3;3465,3474,123;, + 3;123,122,3465;, + 3;65,25,124;, + 3;130,132,131;, + 3;127,126,27;, + 3;129,128,3447;, + 3;27,125,127;, + 3;29,126,25;, + 3;134,132,130;, + 3;130,133,134;, + 3;125,27,128;, + 3;128,27,61;, + 3;65,124,129;, + 3;131,132,136;, + 3;3475,3476,135;, + 3;135,132,3475;, + 3;3476,3477,136;, + 3;136,135,3476;, + 3;3478,3479,130;, + 3;130,131,3478;, + 3;3480,3481,134;, + 3;134,133,3480;, + 3;3481,3475,132;, + 3;132,134,3481;, + 3;3479,3480,133;, + 3;133,130,3479;, + 3;3477,3478,131;, + 3;131,136,3477;, + 3;158,138,184;, + 3;3,3482,16;, + 3;145,159,153;, + 3;221,143,191;, + 3;137,192,146;, + 3;144,214,215;, + 3;3483,139,193;, + 3;147,3,152;, + 3;3482,3,147;, + 3;190,147,140;, + 3;231,223,227;, + 3;3484,142,12;, + 3;142,1742,12;, + 3;154,12,14;, + 3;3485,234,225;, + 3;219,146,143;, + 3;146,153,160;, + 3;3482,147,139;, + 3;230,223,231;, + 3;217,17,3424;, + 3;217,3424,138;, + 3;138,149,148;, + 3;158,149,138;, + 3;221,191,212;, + 3;147,150,140;, + 3;98,215,8;, + 3;230,229,223;, + 3;159,241,153;, + 3;3484,12,154;, + 3;160,157,137;, + 3;156,159,145;, + 3;154,3486,3484;, + 3;157,153,241;, + 3;3487,3488,3489;, + 3;153,146,145;, + 3;146,160,137;, + 3;153,157,160;, + 3;225,235,224;, + 3;161,1743,142;, + 3;155,159,162;, + 3;162,159,156;, + 3;251,250,247;, + 3;162,187,155;, + 3;185,164,182;, + 3;183,3418,137;, + 3;164,34,181;, + 3;58,16,181;, + 3;168,37,847;, + 3;175,173,177;, + 3;165,173,179;, + 3;203,847,37;, + 3;154,14,38;, + 3;205,177,173;, + 3;202,169,203;, + 3;204,166,3490;, + 3;168,3491,171;, + 3;167,3492,165;, + 3;168,47,37;, + 3;154,172,176;, + 3;165,205,173;, + 3;38,174,172;, + 3;38,172,154;, + 3;173,174,179;, + 3;174,173,175;, + 3;179,174,180;, + 3;172,174,175;, + 3;202,80,169;, + 3;189,3493,178;, + 3;166,170,188;, + 3;174,38,180;, + 3;165,179,167;, + 3;180,38,57;, + 3;179,180,167;, + 3;734,57,46;, + 3;175,176,172;, + 3;3494,3495,3496;, + 3;3497,3496,3498;, + 3;3497,3498,3499;, + 3;163,3497,3499;, + 3;186,3500,3501;, + 3;3502,163,3503;, + 3;3501,3504,3444;, + 3;176,3486,154;, + 3;3494,3505,3495;, + 3;16,3482,181;, + 3;182,181,3482;, + 3;58,181,34;, + 3;182,3482,3483;, + 3;164,181,182;, + 3;183,137,157;, + 3;3506,3507,183;, + 3;158,184,3508;, + 3;3482,139,3483;, + 3;185,3483,3509;, + 3;183,3507,3418;, + 3;185,182,3483;, + 3;163,3502,186;, + 3;3510,164,185;, + 3;187,3506,244;, + 3;3494,3496,3497;, + 3;3444,3504,42;, + 3;3504,3501,3500;, + 3;166,188,3511;, + 3;3500,186,3502;, + 3;177,3493,189;, + 3;163,3499,3503;, + 3;139,147,190;, + 3;3512,191,3513;, + 3;192,143,146;, + 3;3483,193,3509;, + 3;137,195,192;, + 3;195,137,194;, + 3;143,197,191;, + 3;197,143,196;, + 3;3514,199,3515;, + 3;199,3514,198;, + 3;3513,201,3516;, + 3;201,3513,200;, + 3;192,196,143;, + 3;196,192,195;, + 3;191,200,3513;, + 3;200,191,197;, + 3;3516,198,3514;, + 3;198,3516,201;, + 3;3515,194,137;, + 3;194,3515,199;, + 3;80,3457,169;, + 3;169,170,203;, + 3;37,80,202;, + 3;170,204,203;, + 3;202,203,37;, + 3;170,166,204;, + 3;204,3491,203;, + 3;3493,177,205;, + 3;204,3490,3491;, + 3;3,85,152;, + 3;226,228,112;, + 3;152,85,89;, + 3;226,223,229;, + 3;213,227,233;, + 3;3506,183,243;, + 3;152,89,208;, + 3;226,229,228;, + 3;109,226,112;, + 3;208,209,152;, + 3;147,152,209;, + 3;147,209,210;, + 3;147,210,150;, + 3;210,211,150;, + 3;232,231,227;, + 3;3512,3517,212;, + 3;212,191,3512;, + 3;216,151,214;, + 3;227,213,232;, + 3;144,216,214;, + 3;10,1740,215;, + 3;215,151,8;, + 3;215,214,151;, + 3;10,215,98;, + 3;161,142,3484;, + 3;1745,1742,142;, + 3;846,151,216;, + 3;224,213,233;, + 3;148,17,217;, + 3;148,217,138;, + 3;218,146,219;, + 3;145,146,218;, + 3;234,235,225;, + 3;220,219,143;, + 3;224,235,236;, + 3;213,224,237;, + 3;224,236,238;, + 3;213,237,232;, + 3;224,238,237;, + 3;220,221,222;, + 3;220,143,221;, + 3;207,223,141;, + 3;223,207,227;, + 3;3485,225,3518;, + 3;3485,3519,234;, + 3;3520,231,3521;, + 3;231,3520,230;, + 3;3522,237,3523;, + 3;237,3522,232;, + 3;3524,230,3520;, + 3;230,3524,229;, + 3;224,3518,225;, + 3;3467,228,3525;, + 3;228,3467,112;, + 3;141,223,206;, + 3;226,206,223;, + 3;3526,227,207;, + 3;227,3526,233;, + 3;3525,229,3524;, + 3;229,3525,228;, + 3;206,109,86;, + 3;109,206,226;, + 3;3521,232,3522;, + 3;232,3521,231;, + 3;3527,233,3526;, + 3;233,3528,224;, + 3;3529,234,3519;, + 3;234,3529,235;, + 3;3530,235,3529;, + 3;235,3530,236;, + 3;3531,236,3530;, + 3;236,3531,238;, + 3;3523,238,3531;, + 3;238,3523,237;, + 3;187,239,155;, + 3;245,246,247;, + 3;242,157,241;, + 3;244,3506,243;, + 3;157,242,240;, + 3;159,155,241;, + 3;249,245,247;, + 3;245,249,248;, + 3;240,243,157;, + 3;243,183,157;, + 3;187,244,239;, + 3;246,251,247;, + 3;3532,250,3533;, + 3;250,3532,247;, + 3;3533,251,3534;, + 3;251,3533,250;, + 3;3535,245,3536;, + 3;245,3535,246;, + 3;3537,249,3538;, + 3;249,3537,248;, + 3;3538,247,3532;, + 3;247,3538,249;, + 3;3536,248,3537;, + 3;248,3536,245;, + 3;3534,246,3535;, + 3;246,3534,251;, + 3;255,472,550;, + 3;257,258,551;, + 3;252,467,554;, + 3;453,462,446;, + 3;439,447,448;, + 3;265,262,255;, + 3;462,463,460;, + 3;449,438,450;, + 3;439,443,447;, + 3;469,313,465;, + 3;254,289,466;, + 3;466,483,484;, + 3;260,435,432;, + 3;465,468,469;, + 3;260,473,474;, + 3;434,3539,3540;, + 3;259,465,474;, + 3;266,3541,262;, + 3;313,255,262;, + 3;438,449,445;, + 3;459,258,264;, + 3;265,266,262;, + 3;345,287,343;, + 3;486,485,271;, + 3;344,274,275;, + 3;335,534,535;, + 3;273,3542,340;, + 3;279,337,282;, + 3;393,333,269;, + 3;279,333,280;, + 3;3543,476,475;, + 3;397,400,417;, + 3;398,284,402;, + 3;388,284,405;, + 3;342,285,3544;, + 3;399,407,338;, + 3;394,392,3542;, + 3;480,479,285;, + 3;3542,392,342;, + 3;288,340,3542;, + 3;287,333,282;, + 3;344,334,274;, + 3;333,287,345;, + 3;343,275,270;, + 3;3544,285,552;, + 3;340,288,3544;, + 3;399,389,404;, + 3;290,295,296;, + 3;296,291,290;, + 3;291,296,297;, + 3;297,292,291;, + 3;292,297,298;, + 3;298,293,292;, + 3;309,310,299;, + 3;299,294,309;, + 3;300,301,424;, + 3;3545,422,3546;, + 3;301,302,424;, + 3;347,349,422;, + 3;305,423,306;, + 3;271,368,367;, + 3;3547,3548,301;, + 3;301,300,3547;, + 3;301,3549,426;, + 3;3549,301,3548;, + 3;358,426,359;, + 3;3550,359,426;, + 3;360,3551,364;, + 3;272,303,379;, + 3;374,276,277;, + 3;3552,3553,354;, + 3;3554,3555,306;, + 3;425,353,3553;, + 3;3555,3556,305;, + 3;305,306,3555;, + 3;305,3557,304;, + 3;3557,305,3556;, + 3;3558,3559,3546;, + 3;3546,3560,3558;, + 3;380,277,272;, + 3;294,299,308;, + 3;380,384,277;, + 3;3561,362,3550;, + 3;309,293,310;, + 3;310,293,298;, + 3;425,3553,3554;, + 3;518,517,330;, + 3;376,377,3562;, + 3;3543,477,476;, + 3;286,265,478;, + 3;487,277,488;, + 3;324,273,536;, + 3;313,470,255;, + 3;465,313,262;, + 3;502,501,314;, + 3;489,3562,490;, + 3;3563,491,317;, + 3;533,547,537;, + 3;318,492,493;, + 3;494,485,315;, + 3;330,503,504;, + 3;491,272,495;, + 3;495,487,319;, + 3;506,505,320;, + 3;488,277,496;, + 3;496,497,320;, + 3;519,312,520;, + 3;498,346,499;, + 3;499,489,316;, + 3;497,276,500;, + 3;500,3564,3565;, + 3;507,312,508;, + 3;510,509,319;, + 3;323,268,322;, + 3;512,511,3566;, + 3;466,3540,254;, + 3;550,478,255;, + 3;286,478,479;, + 3;410,387,411;, + 3;390,265,286;, + 3;332,289,254;, + 3;289,256,466;, + 3;281,256,289;, + 3;281,258,256;, + 3;279,548,391;, + 3;279,280,549;, + 3;549,280,261;, + 3;311,472,475;, + 3;3567,472,3568;, + 3;335,340,3544;, + 3;519,323,521;, + 3;513,511,325;, + 3;318,503,514;, + 3;3569,509,327;, + 3;515,505,328;, + 3;516,318,514;, + 3;506,3570,329;, + 3;504,501,330;, + 3;522,518,330;, + 3;267,538,539;, + 3;540,275,541;, + 3;526,278,527;, + 3;525,526,329;, + 3;507,321,515;, + 3;528,322,529;, + 3;521,528,331;, + 3;529,322,530;, + 3;502,513,325;, + 3;510,319,508;, + 3;531,328,527;, + 3;324,532,531;, + 3;325,3571,523;, + 3;420,400,418;, + 3;266,3572,3541;, + 3;279,282,333;, + 3;267,269,553;, + 3;414,409,416;, + 3;287,282,334;, + 3;536,544,336;, + 3;268,534,3573;, + 3;520,312,532;, + 3;548,281,391;, + 3;284,398,403;, + 3;410,416,409;, + 3;338,389,399;, + 3;288,341,3544;, + 3;3542,341,288;, + 3;273,340,543;, + 3;3542,339,341;, + 3;341,339,3544;, + 3;339,342,3544;, + 3;3542,342,339;, + 3;343,344,275;, + 3;267,343,270;, + 3;287,344,343;, + 3;287,334,344;, + 3;267,345,343;, + 3;553,345,267;, + 3;486,498,314;, + 3;347,3545,357;, + 3;271,367,346;, + 3;348,368,271;, + 3;493,348,494;, + 3;370,348,371;, + 3;350,3574,349;, + 3;422,3574,3560;, + 3;348,369,368;, + 3;3575,351,306;, + 3;369,348,370;, + 3;348,307,371;, + 3;306,425,3554;, + 3;351,352,306;, + 3;371,307,372;, + 3;354,3553,353;, + 3;384,374,277;, + 3;3576,276,375;, + 3;374,375,276;, + 3;346,376,3562;, + 3;367,376,346;, + 3;3577,302,358;, + 3;3550,426,3549;, + 3;359,3550,362;, + 3;3562,377,378;, + 3;385,373,3576;, + 3;3576,375,385;, + 3;355,3552,356;, + 3;3578,3552,355;, + 3;379,303,382;, + 3;3561,3551,360;, + 3;3551,361,364;, + 3;3551,3579,361;, + 3;378,381,3562;, + 3;3561,363,362;, + 3;360,363,3561;, + 3;383,380,272;, + 3;379,383,272;, + 3;361,3579,365;, + 3;3578,355,3580;, + 3;366,356,3552;, + 3;3552,354,366;, + 3;3581,3582,367;, + 3;367,368,3581;, + 3;3583,3584,378;, + 3;378,377,3583;, + 3;3585,3586,383;, + 3;383,379,3585;, + 3;3587,3588,371;, + 3;371,372,3587;, + 3;3589,3590,384;, + 3;384,380,3589;, + 3;3591,3583,377;, + 3;377,376,3591;, + 3;3582,3591,376;, + 3;376,367,3582;, + 3;3588,3592,370;, + 3;370,371,3588;, + 3;3593,3581,368;, + 3;368,369,3593;, + 3;3592,3593,369;, + 3;369,370,3592;, + 3;3590,3594,374;, + 3;374,384,3590;, + 3;3594,3595,375;, + 3;375,374,3594;, + 3;3584,3596,381;, + 3;381,378,3584;, + 3;3597,3598,373;, + 3;373,385,3597;, + 3;3595,3597,385;, + 3;385,375,3595;, + 3;3599,3585,379;, + 3;379,382,3599;, + 3;3586,3589,380;, + 3;380,383,3586;, + 3;338,386,389;, + 3;409,387,410;, + 3;418,400,401;, + 3;418,401,419;, + 3;409,412,387;, + 3;284,403,405;, + 3;419,401,413;, + 3;413,401,396;, + 3;415,413,396;, + 3;266,265,390;, + 3;405,408,388;, + 3;279,391,337;, + 3;395,479,480;, + 3;392,285,342;, + 3;393,280,333;, + 3;477,3543,3600;, + 3;338,407,406;, + 3;3601,274,334;, + 3;480,285,392;, + 3;395,392,394;, + 3;3602,3603,403;, + 3;403,398,3602;, + 3;3604,3605,400;, + 3;400,397,3604;, + 3;3606,3604,397;, + 3;397,408,3606;, + 3;3607,3602,398;, + 3;398,402,3607;, + 3;3603,3606,405;, + 3;405,403,3603;, + 3;3608,3609,399;, + 3;399,404,3608;, + 3;3605,3610,401;, + 3;401,400,3605;, + 3;3610,3611,396;, + 3;396,401,3610;, + 3;3612,3607,402;, + 3;402,406,3612;, + 3;3611,3608,404;, + 3;404,396,3611;, + 3;3609,3613,407;, + 3;407,399,3609;, + 3;3613,3612,406;, + 3;406,407,3613;, + 3;417,400,420;, + 3;408,405,3606;, + 3;397,417,408;, + 3;402,284,409;, + 3;409,414,402;, + 3;338,406,416;, + 3;416,410,338;, + 3;404,389,413;, + 3;413,415,404;, + 3;386,338,410;, + 3;410,411,386;, + 3;406,402,414;, + 3;414,416,406;, + 3;389,386,411;, + 3;411,413,389;, + 3;284,388,412;, + 3;412,409,284;, + 3;396,404,415;, + 3;388,408,417;, + 3;417,412,388;, + 3;411,387,418;, + 3;418,419,411;, + 3;387,412,420;, + 3;420,418,387;, + 3;413,411,419;, + 3;417,420,412;, + 3;258,421,264;, + 3;421,258,257;, + 3;3598,3576,373;, + 3;354,353,3614;, + 3;3587,372,307;, + 3;362,363,3615;, + 3;3599,382,303;, + 3;381,3596,3562;, + 3;422,349,3574;, + 3;422,3560,3546;, + 3;3575,306,423;, + 3;423,305,304;, + 3;424,302,3577;, + 3;422,3545,347;, + 3;306,352,425;, + 3;352,353,425;, + 3;358,302,426;, + 3;301,426,302;, + 3;444,443,442;, + 3;443,439,442;, + 3;454,457,455;, + 3;438,445,452;, + 3;432,431,464;, + 3;432,473,260;, + 3;263,433,434;, + 3;482,434,3540;, + 3;431,427,464;, + 3;464,427,556;, + 3;448,451,440;, + 3;448,440,439;, + 3;450,3616,3617;, + 3;438,3616,450;, + 3;429,433,263;, + 3;458,481,459;, + 3;452,445,3618;, + 3;454,456,457;, + 3;462,460,446;, + 3;428,3619,443;, + 3;443,444,428;, + 3;3620,3621,448;, + 3;448,447,3620;, + 3;3622,3623,449;, + 3;449,450,3622;, + 3;3619,3620,447;, + 3;447,443,3619;, + 3;3621,3624,451;, + 3;451,448,3621;, + 3;3625,3622,450;, + 3;450,3617,3625;, + 3;3623,3626,445;, + 3;445,449,3623;, + 3;3627,3628,442;, + 3;442,439,3627;, + 3;3629,3630,438;, + 3;438,452,3629;, + 3;3631,3627,439;, + 3;439,440,3631;, + 3;3630,3632,3616;, + 3;3616,438,3630;, + 3;3626,437,3618;, + 3;3618,445,3626;, + 3;3633,3634,3635;, + 3;3635,441,3633;, + 3;3636,3637,455;, + 3;455,457,3636;, + 3;3635,3636,457;, + 3;457,456,3635;, + 3;441,3635,456;, + 3;456,454,441;, + 3;429,458,3638;, + 3;429,481,458;, + 3;256,258,459;, + 3;463,461,460;, + 3;3638,458,462;, + 3;462,453,3638;, + 3;458,459,463;, + 3;463,462,458;, + 3;459,264,461;, + 3;461,463,459;, + 3;253,430,446;, + 3;446,460,253;, + 3;264,253,460;, + 3;3639,3640,3641;, + 3;556,427,554;, + 3;473,259,474;, + 3;3541,474,262;, + 3;259,468,465;, + 3;466,256,483;, + 3;3540,466,482;, + 3;259,467,468;, + 3;464,467,259;, + 3;467,252,468;, + 3;469,555,3568;, + 3;469,468,252;, + 3;470,313,469;, + 3;3568,470,469;, + 3;470,3568,471;, + 3;472,255,471;, + 3;470,471,255;, + 3;3568,472,471;, + 3;311,283,472;, + 3;432,464,473;, + 3;464,259,473;, + 3;474,465,262;, + 3;260,474,3541;, + 3;475,472,3567;, + 3;3543,475,3567;, + 3;476,477,311;, + 3;476,311,475;, + 3;3544,552,3600;, + 3;477,285,311;, + 3;265,255,478;, + 3;478,283,311;, + 3;479,478,311;, + 3;479,311,285;, + 3;395,480,392;, + 3;286,479,395;, + 3;429,263,481;, + 3;481,263,484;, + 3;482,466,484;, + 3;263,434,482;, + 3;483,256,459;, + 3;483,459,484;, + 3;484,459,481;, + 3;482,484,263;, + 3;486,315,485;, + 3;314,315,486;, + 3;319,487,488;, + 3;319,488,321;, + 3;316,489,490;, + 3;316,490,3566;, + 3;3563,272,491;, + 3;303,272,3563;, + 3;493,492,348;, + 3;492,307,348;, + 3;494,271,485;, + 3;348,271,494;, + 3;317,491,495;, + 3;317,495,319;, + 3;495,277,487;, + 3;272,277,495;, + 3;321,488,496;, + 3;321,496,320;, + 3;496,276,497;, + 3;277,276,496;, + 3;314,498,499;, + 3;314,499,316;, + 3;499,3562,489;, + 3;346,3562,499;, + 3;320,497,500;, + 3;320,500,3565;, + 3;500,3576,3564;, + 3;276,3576,500;, + 3;486,346,498;, + 3;271,346,486;, + 3;318,493,494;, + 3;318,494,315;, + 3;502,325,501;, + 3;325,545,501;, + 3;504,503,315;, + 3;503,318,315;, + 3;506,328,505;, + 3;329,328,506;, + 3;321,507,508;, + 3;321,508,319;, + 3;510,331,509;, + 3;331,327,509;, + 3;512,325,511;, + 3;3642,325,512;, + 3;513,3566,511;, + 3;316,3566,513;, + 3;514,503,326;, + 3;503,330,326;, + 3;3569,319,509;, + 3;317,319,3569;, + 3;515,320,505;, + 3;321,320,515;, + 3;3643,516,514;, + 3;3643,514,326;, + 3;506,3565,3570;, + 3;320,3565,506;, + 3;504,314,501;, + 3;315,314,504;, + 3;312,507,515;, + 3;312,515,328;, + 3;502,316,513;, + 3;314,316,502;, + 3;331,510,508;, + 3;331,508,312;, + 3;542,540,517;, + 3;336,519,520;, + 3;323,519,336;, + 3;331,519,521;, + 3;312,519,331;, + 3;538,542,522;, + 3;523,522,325;, + 3;522,545,325;, + 3;326,517,524;, + 3;330,517,326;, + 3;524,3644,326;, + 3;3644,3643,326;, + 3;329,526,527;, + 3;329,527,328;, + 3;525,278,526;, + 3;275,3645,541;, + 3;327,528,529;, + 3;331,528,327;, + 3;521,323,528;, + 3;323,322,528;, + 3;327,529,530;, + 3;3642,3571,325;, + 3;324,531,527;, + 3;324,527,278;, + 3;531,532,328;, + 3;532,312,328;, + 3;539,537,267;, + 3;336,520,532;, + 3;336,532,324;, + 3;267,537,547;, + 3;535,534,323;, + 3;534,268,323;, + 3;546,275,274;, + 3;278,273,324;, + 3;3646,533,537;, + 3;3646,537,3647;, + 3;536,336,324;, + 3;539,538,523;, + 3;538,522,523;, + 3;517,540,541;, + 3;517,541,524;, + 3;541,3644,524;, + 3;536,543,544;, + 3;273,543,536;, + 3;3573,534,335;, + 3;3573,335,3648;, + 3;535,323,336;, + 3;3542,273,3649;, + 3;518,542,517;, + 3;542,275,540;, + 3;270,275,542;, + 3;522,542,518;, + 3;538,267,542;, + 3;267,270,542;, + 3;541,3645,3644;, + 3;539,523,537;, + 3;523,3571,537;, + 3;3571,3647,537;, + 3;543,340,335;, + 3;543,335,535;, + 3;544,543,535;, + 3;544,535,336;, + 3;522,330,545;, + 3;545,330,501;, + 3;3649,273,278;, + 3;3645,275,546;, + 3;3648,335,3544;, + 3;547,269,267;, + 3;279,258,548;, + 3;258,281,548;, + 3;258,549,551;, + 3;279,549,258;, + 3;550,472,283;, + 3;283,478,550;, + 3;551,549,261;, + 3;257,551,261;, + 3;552,285,477;, + 3;552,477,3600;, + 3;553,269,333;, + 3;333,345,553;, + 3;554,427,3650;, + 3;469,252,555;, + 3;467,556,554;, + 3;464,556,467;, + 3;558,840,762;, + 3;257,841,560;, + 3;252,554,757;, + 3;747,446,752;, + 3;737,742,741;, + 3;566,558,564;, + 3;752,460,753;, + 3;743,744,736;, + 3;737,741,739;, + 3;759,755,614;, + 3;557,756,590;, + 3;756,774,773;, + 3;562,730,733;, + 3;755,759,758;, + 3;562,764,763;, + 3;732,3651,3652;, + 3;561,764,755;, + 3;567,564,3653;, + 3;614,564,558;, + 3;736,740,743;, + 3;751,264,560;, + 3;566,564,567;, + 3;646,644,588;, + 3;776,572,775;, + 3;645,576,575;, + 3;636,825,824;, + 3;574,641,3654;, + 3;580,583,638;, + 3;694,570,634;, + 3;580,581,634;, + 3;3655,765,766;, + 3;698,718,701;, + 3;699,703,585;, + 3;689,706,585;, + 3;643,3656,586;, + 3;700,639,708;, + 3;695,3654,693;, + 3;770,586,769;, + 3;3654,643,693;, + 3;589,3654,641;, + 3;588,583,634;, + 3;645,575,635;, + 3;634,646,588;, + 3;644,571,576;, + 3;3656,842,586;, + 3;641,3656,589;, + 3;700,705,690;, + 3;591,597,596;, + 3;597,591,592;, + 3;592,598,597;, + 3;598,592,593;, + 3;593,599,598;, + 3;599,593,594;, + 3;610,600,611;, + 3;600,610,595;, + 3;601,724,602;, + 3;3657,3658,722;, + 3;602,724,603;, + 3;648,722,650;, + 3;606,607,723;, + 3;572,668,669;, + 3;3659,602,3660;, + 3;602,3659,601;, + 3;602,726,3661;, + 3;3661,3660,602;, + 3;659,660,726;, + 3;3662,726,660;, + 3;661,665,3663;, + 3;573,680,604;, + 3;675,578,577;, + 3;3664,655,3665;, + 3;3666,607,3667;, + 3;725,3665,654;, + 3;3667,606,3668;, + 3;606,3667,607;, + 3;606,605,3669;, + 3;3669,3668,606;, + 3;3670,3658,3671;, + 3;3658,3670,3672;, + 3;681,573,578;, + 3;595,609,600;, + 3;681,578,685;, + 3;3673,3662,663;, + 3;610,611,594;, + 3;611,599,594;, + 3;725,3666,3665;, + 3;808,631,807;, + 3;677,3674,678;, + 3;3655,766,767;, + 3;587,768,566;, + 3;777,778,578;, + 3;625,826,574;, + 3;614,558,760;, + 3;755,564,614;, + 3;792,615,791;, + 3;779,780,3674;, + 3;3675,618,781;, + 3;823,827,837;, + 3;619,783,782;, + 3;784,616,775;, + 3;631,794,793;, + 3;781,785,573;, + 3;785,620,777;, + 3;796,621,795;, + 3;778,786,578;, + 3;786,621,787;, + 3;809,810,613;, + 3;788,789,647;, + 3;789,617,779;, + 3;787,790,577;, + 3;790,3676,3677;, + 3;797,798,613;, + 3;800,620,799;, + 3;624,623,569;, + 3;802,3678,801;, + 3;756,557,3651;, + 3;840,558,768;, + 3;587,769,768;, + 3;711,712,688;, + 3;691,587,566;, + 3;633,557,590;, + 3;590,756,559;, + 3;582,590,559;, + 3;582,559,560;, + 3;580,692,838;, + 3;580,839,581;, + 3;839,563,581;, + 3;612,765,762;, + 3;3679,3568,762;, + 3;636,3656,641;, + 3;809,811,624;, + 3;803,626,801;, + 3;619,804,793;, + 3;3680,628,799;, + 3;805,629,795;, + 3;806,804,619;, + 3;796,630,3681;, + 3;794,631,791;, + 3;812,631,808;, + 3;568,829,828;, + 3;830,831,576;, + 3;816,817,579;, + 3;815,630,816;, + 3;797,805,622;, + 3;818,819,623;, + 3;811,632,818;, + 3;819,820,623;, + 3;792,626,803;, + 3;800,798,620;, + 3;821,817,629;, + 3;625,821,822;, + 3;626,813,3682;, + 3;721,719,701;, + 3;567,3653,3683;, + 3;580,634,583;, + 3;568,843,570;, + 3;715,717,710;, + 3;588,635,583;, + 3;826,637,834;, + 3;569,3684,824;, + 3;810,822,613;, + 3;838,692,582;, + 3;585,704,699;, + 3;711,710,717;, + 3;639,700,690;, + 3;589,3656,642;, + 3;3654,589,642;, + 3;574,833,641;, + 3;3654,642,640;, + 3;642,3656,640;, + 3;640,3656,643;, + 3;3654,640,643;, + 3;644,576,645;, + 3;568,571,644;, + 3;588,644,645;, + 3;588,645,635;, + 3;568,644,646;, + 3;843,568,646;, + 3;776,615,788;, + 3;724,658,603;, + 3;572,647,668;, + 3;649,572,669;, + 3;783,784,649;, + 3;671,672,649;, + 3;651,650,3685;, + 3;722,3672,3685;, + 3;649,669,670;, + 3;3686,607,652;, + 3;670,671,649;, + 3;649,672,608;, + 3;607,3666,725;, + 3;652,607,653;, + 3;672,673,608;, + 3;655,654,3665;, + 3;685,578,675;, + 3;3687,676,577;, + 3;675,577,676;, + 3;647,3674,677;, + 3;668,647,677;, + 3;658,659,603;, + 3;3662,3661,726;, + 3;660,663,3662;, + 3;3674,679,678;, + 3;686,3687,674;, + 3;3687,686,676;, + 3;656,657,3664;, + 3;3688,656,3664;, + 3;680,683,604;, + 3;3673,661,3663;, + 3;3663,665,662;, + 3;3663,662,3689;, + 3;679,3674,682;, + 3;3673,663,664;, + 3;661,3673,664;, + 3;684,573,681;, + 3;680,573,684;, + 3;662,666,3689;, + 3;3688,3690,656;, + 3;667,3664,657;, + 3;3664,667,655;, + 3;3691,668,3692;, + 3;668,3691,669;, + 3;3693,679,3694;, + 3;679,3693,678;, + 3;3695,684,3696;, + 3;684,3695,680;, + 3;3697,672,3698;, + 3;672,3697,673;, + 3;3699,685,3700;, + 3;685,3699,681;, + 3;3701,678,3693;, + 3;678,3701,677;, + 3;3692,677,3701;, + 3;677,3692,668;, + 3;3698,671,3702;, + 3;671,3698,672;, + 3;3703,669,3691;, + 3;669,3703,670;, + 3;3702,670,3703;, + 3;670,3702,671;, + 3;3700,675,3704;, + 3;675,3700,685;, + 3;3704,676,3705;, + 3;676,3704,675;, + 3;3694,682,3706;, + 3;682,3694,679;, + 3;3707,674,3708;, + 3;674,3707,686;, + 3;3705,686,3707;, + 3;686,3705,676;, + 3;3709,680,3695;, + 3;680,3709,683;, + 3;3696,681,3699;, + 3;681,3696,684;, + 3;639,690,687;, + 3;710,711,688;, + 3;719,702,701;, + 3;719,720,702;, + 3;710,688,713;, + 3;585,706,704;, + 3;720,714,702;, + 3;714,697,702;, + 3;716,697,714;, + 3;567,691,566;, + 3;706,689,709;, + 3;580,638,692;, + 3;696,770,769;, + 3;693,643,586;, + 3;694,634,581;, + 3;767,3710,3655;, + 3;639,707,708;, + 3;3711,635,575;, + 3;770,693,586;, + 3;696,695,693;, + 3;3712,704,3713;, + 3;704,3712,699;, + 3;3714,701,3715;, + 3;701,3714,698;, + 3;3716,698,3714;, + 3;698,3716,709;, + 3;3717,699,3712;, + 3;699,3717,703;, + 3;3713,706,3716;, + 3;706,3713,704;, + 3;3718,700,3719;, + 3;700,3718,705;, + 3;3715,702,3720;, + 3;702,3715,701;, + 3;3720,697,3721;, + 3;697,3720,702;, + 3;3722,703,3717;, + 3;703,3722,707;, + 3;3721,705,3718;, + 3;705,3721,697;, + 3;3719,708,3723;, + 3;708,3719,700;, + 3;3723,707,3722;, + 3;707,3723,708;, + 3;718,721,701;, + 3;709,3716,706;, + 3;698,709,718;, + 3;703,710,585;, + 3;710,703,715;, + 3;639,717,707;, + 3;717,639,711;, + 3;705,714,690;, + 3;714,705,716;, + 3;687,711,639;, + 3;711,687,712;, + 3;707,715,703;, + 3;715,707,717;, + 3;690,712,687;, + 3;712,690,714;, + 3;585,713,689;, + 3;713,585,710;, + 3;697,716,705;, + 3;689,718,709;, + 3;718,689,713;, + 3;712,719,688;, + 3;719,712,720;, + 3;688,721,713;, + 3;721,688,719;, + 3;714,720,712;, + 3;718,713,721;, + 3;560,264,421;, + 3;421,257,560;, + 3;3708,674,3687;, + 3;655,3724,654;, + 3;3697,608,673;, + 3;663,3725,664;, + 3;3709,604,683;, + 3;682,3674,3706;, + 3;722,3685,650;, + 3;722,3658,3672;, + 3;3686,723,607;, + 3;723,605,606;, + 3;3657,648,3726;, + 3;722,648,3657;, + 3;607,725,653;, + 3;653,725,654;, + 3;659,726,603;, + 3;602,603,726;, + 3;444,442,739;, + 3;739,442,737;, + 3;454,455,749;, + 3;736,746,740;, + 3;730,754,729;, + 3;730,562,763;, + 3;565,732,731;, + 3;772,3651,732;, + 3;729,754,727;, + 3;754,844,727;, + 3;742,738,745;, + 3;742,737,738;, + 3;744,3727,3728;, + 3;736,744,3728;, + 3;728,565,731;, + 3;750,751,771;, + 3;746,3729,740;, + 3;454,749,748;, + 3;752,446,460;, + 3;428,739,3730;, + 3;739,428,444;, + 3;3731,742,3732;, + 3;742,3731,741;, + 3;3733,743,3734;, + 3;743,3733,744;, + 3;3730,741,3731;, + 3;741,3730,739;, + 3;3732,745,3735;, + 3;745,3732,742;, + 3;3736,744,3733;, + 3;744,3736,3727;, + 3;3734,740,3737;, + 3;740,3734,743;, + 3;3738,442,3628;, + 3;442,3738,737;, + 3;3739,736,3740;, + 3;736,3739,746;, + 3;3741,737,3738;, + 3;737,3741,738;, + 3;3740,3728,3742;, + 3;3728,3740,736;, + 3;3737,3729,735;, + 3;3729,3737,740;, + 3;3633,3743,3744;, + 3;3743,3633,441;, + 3;3745,455,3637;, + 3;455,3745,749;, + 3;3743,749,3745;, + 3;749,3743,748;, + 3;441,748,3743;, + 3;748,441,454;, + 3;728,3746,750;, + 3;728,750,771;, + 3;559,751,560;, + 3;753,460,461;, + 3;3746,752,750;, + 3;752,3746,747;, + 3;750,753,751;, + 3;753,750,752;, + 3;751,461,264;, + 3;461,751,753;, + 3;253,446,430;, + 3;446,253,460;, + 3;264,460,253;, + 3;460,264,461;, + 3;844,554,727;, + 3;763,764,561;, + 3;3653,564,764;, + 3;561,755,758;, + 3;756,773,559;, + 3;3651,772,756;, + 3;561,758,757;, + 3;754,561,757;, + 3;757,758,252;, + 3;759,3568,555;, + 3;759,252,758;, + 3;760,759,614;, + 3;3568,759,760;, + 3;760,761,3568;, + 3;762,761,558;, + 3;760,558,761;, + 3;3568,761,762;, + 3;612,762,584;, + 3;730,763,754;, + 3;754,763,561;, + 3;764,564,755;, + 3;562,3653,764;, + 3;765,3679,762;, + 3;3655,3679,765;, + 3;766,612,767;, + 3;766,765,612;, + 3;3656,3710,842;, + 3;767,612,586;, + 3;566,768,558;, + 3;768,612,584;, + 3;769,612,768;, + 3;769,586,612;, + 3;696,693,770;, + 3;587,696,769;, + 3;728,771,565;, + 3;771,774,565;, + 3;772,774,756;, + 3;565,772,732;, + 3;773,751,559;, + 3;773,774,751;, + 3;774,771,751;, + 3;772,565,774;, + 3;776,775,616;, + 3;615,776,616;, + 3;620,778,777;, + 3;620,622,778;, + 3;617,780,779;, + 3;617,3678,780;, + 3;3675,781,573;, + 3;604,3675,573;, + 3;783,649,782;, + 3;782,649,608;, + 3;784,775,572;, + 3;649,784,572;, + 3;618,785,781;, + 3;618,620,785;, + 3;785,777,578;, + 3;573,785,578;, + 3;622,786,778;, + 3;622,621,786;, + 3;786,787,577;, + 3;578,786,577;, + 3;615,789,788;, + 3;615,617,789;, + 3;789,779,3674;, + 3;647,789,3674;, + 3;621,790,787;, + 3;621,3676,790;, + 3;790,3677,3687;, + 3;577,790,3687;, + 3;776,788,647;, + 3;572,776,647;, + 3;619,784,783;, + 3;619,616,784;, + 3;792,791,626;, + 3;626,791,835;, + 3;794,616,793;, + 3;793,616,619;, + 3;796,795,629;, + 3;630,796,629;, + 3;622,798,797;, + 3;622,620,798;, + 3;800,799,632;, + 3;632,799,628;, + 3;802,801,626;, + 3;3747,802,626;, + 3;803,801,3678;, + 3;617,803,3678;, + 3;804,627,793;, + 3;793,627,631;, + 3;3680,799,620;, + 3;618,3680,620;, + 3;805,795,621;, + 3;622,805,621;, + 3;3748,804,806;, + 3;3748,627,804;, + 3;796,3681,3676;, + 3;621,796,3676;, + 3;794,791,615;, + 3;616,794,615;, + 3;613,805,797;, + 3;613,629,805;, + 3;792,803,617;, + 3;615,792,617;, + 3;632,798,800;, + 3;632,613,798;, + 3;832,807,830;, + 3;637,810,809;, + 3;624,637,809;, + 3;632,811,809;, + 3;613,632,809;, + 3;828,812,832;, + 3;813,626,812;, + 3;812,626,835;, + 3;627,814,807;, + 3;631,627,807;, + 3;814,627,3749;, + 3;3749,627,3748;, + 3;630,817,816;, + 3;630,629,817;, + 3;815,816,579;, + 3;576,831,3750;, + 3;628,819,818;, + 3;632,628,818;, + 3;811,818,624;, + 3;624,818,623;, + 3;628,820,819;, + 3;3747,626,3682;, + 3;625,817,821;, + 3;625,579,817;, + 3;821,629,822;, + 3;822,629,613;, + 3;829,568,827;, + 3;637,822,810;, + 3;637,625,822;, + 3;568,837,827;, + 3;825,624,824;, + 3;824,624,569;, + 3;836,575,576;, + 3;579,625,574;, + 3;3751,827,823;, + 3;3751,3752,827;, + 3;826,625,637;, + 3;829,813,828;, + 3;828,813,812;, + 3;807,831,830;, + 3;807,814,831;, + 3;831,814,3749;, + 3;826,834,833;, + 3;574,826,833;, + 3;3684,636,824;, + 3;3684,3753,636;, + 3;825,637,624;, + 3;3654,3754,574;, + 3;808,807,832;, + 3;832,830,576;, + 3;571,832,576;, + 3;812,808,832;, + 3;828,832,568;, + 3;568,832,571;, + 3;831,3749,3750;, + 3;829,827,813;, + 3;813,827,3682;, + 3;3682,827,3752;, + 3;833,636,641;, + 3;833,825,636;, + 3;834,825,833;, + 3;834,637,825;, + 3;812,835,631;, + 3;835,791,631;, + 3;3754,579,574;, + 3;3750,836,576;, + 3;3753,3656,636;, + 3;837,568,570;, + 3;580,838,560;, + 3;560,838,582;, + 3;560,841,839;, + 3;580,560,839;, + 3;840,584,762;, + 3;584,840,768;, + 3;841,563,839;, + 3;257,563,841;, + 3;842,767,586;, + 3;842,3710,767;, + 3;843,634,570;, + 3;634,843,646;, + 3;554,3650,727;, + 3;759,555,252;, + 3;757,554,844;, + 3;754,757,844;, + 3;845,99,21;, + 3;3755,846,216;, + 3;180,734,167;, + 3;180,57,734;, + 3;46,57,436;, + 3;436,56,40;, + 3;203,3491,847;, + 3;168,847,3491;, + 3;82,37,848;, + 3;41,848,37;, + 3;849,1291,850;, + 3;943,852,851;, + 3;849,1290,944;, + 3;1289,854,1293;, + 3;854,1289,944;, + 3;859,888,945;, + 3;855,861,887;, + 3;946,856,3756;, + 3;1292,3757,3758;, + 3;3757,3759,3760;, + 3;852,946,851;, + 3;857,889,849;, + 3;858,857,850;, + 3;850,857,849;, + 3;853,860,1290;, + 3;3761,861,3758;, + 3;3758,861,855;, + 3;887,859,945;, + 3;875,891,890;, + 3;893,892,862;, + 3;894,869,895;, + 3;897,896,863;, + 3;898,876,899;, + 3;900,862,892;, + 3;902,901,874;, + 3;898,877,903;, + 3;868,904,890;, + 3;894,864,905;, + 3;905,864,904;, + 3;896,872,895;, + 3;867,902,906;, + 3;3762,3763,891;, + 3;899,906,865;, + 3;903,3764,3765;, + 3;901,900,874;, + 3;3763,880,868;, + 3;880,3763,879;, + 3;867,882,878;, + 3;882,867,881;, + 3;3765,884,876;, + 3;884,3765,883;, + 3;866,886,869;, + 3;886,866,885;, + 3;868,880,866;, + 3;885,866,880;, + 3;869,3766,863;, + 3;3766,869,886;, + 3;876,881,867;, + 3;881,876,884;, + 3;878,3767,862;, + 3;3767,878,882;, + 3;870,3768,871;, + 3;3768,870,3769;, + 3;872,3770,864;, + 3;3770,872,3771;, + 3;873,3771,872;, + 3;3771,873,3772;, + 3;865,3773,877;, + 3;3773,865,3774;, + 3;871,3775,874;, + 3;3775,871,3768;, + 3;864,3776,875;, + 3;3776,864,3770;, + 3;874,3774,865;, + 3;3774,874,3775;, + 3;875,3777,3778;, + 3;3777,875,3776;, + 3;877,3779,3780;, + 3;3779,877,3773;, + 3;890,891,868;, + 3;868,891,3763;, + 3;892,893,871;, + 3;871,893,870;, + 3;894,895,864;, + 3;864,895,872;, + 3;896,897,872;, + 3;872,897,873;, + 3;898,899,877;, + 3;877,899,865;, + 3;900,892,874;, + 3;874,892,871;, + 3;901,902,878;, + 3;878,902,867;, + 3;898,903,876;, + 3;876,903,3765;, + 3;890,904,875;, + 3;875,904,864;, + 3;894,905,869;, + 3;869,905,866;, + 3;905,904,866;, + 3;866,904,868;, + 3;896,895,863;, + 3;863,895,869;, + 3;906,902,865;, + 3;865,902,874;, + 3;3762,891,3778;, + 3;3778,891,875;, + 3;906,899,867;, + 3;867,899,876;, + 3;3764,903,3780;, + 3;3780,903,877;, + 3;900,901,862;, + 3;862,901,878;, + 3;889,1290,849;, + 3;3781,858,850;, + 3;855,887,945;, + 3;921,939,908;, + 3;942,922,3782;, + 3;923,910,924;, + 3;907,926,925;, + 3;926,927,911;, + 3;929,928,915;, + 3;3783,919,913;, + 3;931,930,913;, + 3;941,920,908;, + 3;931,932,3784;, + 3;929,933,908;, + 3;916,918,3785;, + 3;917,3786,913;, + 3;935,934,914;, + 3;916,935,936;, + 3;937,3787,938;, + 3;3788,3785,918;, + 3;3789,909,919;, + 3;912,3790,3791;, + 3;916,3786,917;, + 3;934,930,914;, + 3;918,3792,3788;, + 3;936,3787,937;, + 3;3783,913,3786;, + 3;932,3793,3784;, + 3;928,3794,915;, + 3;940,908,939;, + 3;907,942,940;, + 3;927,933,911;, + 3;922,3795,3782;, + 3;925,910,923;, + 3;923,924,922;, + 3;922,924,3795;, + 3;925,926,910;, + 3;910,926,911;, + 3;927,926,921;, + 3;921,926,907;, + 3;928,929,920;, + 3;920,929,908;, + 3;930,931,914;, + 3;914,931,3784;, + 3;932,931,919;, + 3;919,931,913;, + 3;933,929,911;, + 3;911,929,915;, + 3;934,935,917;, + 3;917,935,916;, + 3;936,935,3787;, + 3;3787,935,914;, + 3;937,938,918;, + 3;918,938,3792;, + 3;930,934,913;, + 3;913,934,917;, + 3;936,937,916;, + 3;916,937,918;, + 3;3793,932,909;, + 3;909,932,919;, + 3;3794,928,912;, + 3;912,928,920;, + 3;933,927,908;, + 3;908,927,921;, + 3;925,923,907;, + 3;907,923,922;, + 3;912,920,3790;, + 3;3782,3795,3796;, + 3;940,3782,3797;, + 3;941,940,3790;, + 3;907,939,921;, + 3;939,907,940;, + 3;940,3797,3790;, + 3;3790,920,941;, + 3;908,940,941;, + 3;907,922,942;, + 3;942,3782,940;, + 3;3789,919,3783;, + 3;3785,3786,916;, + 3;1289,852,943;, + 3;849,944,1289;, + 3;854,944,1290;, + 3;3798,3781,850;, + 3;3799,3800,851;, + 3;852,856,946;, + 3;946,3801,3799;, + 3;1271,947,3802;, + 3;3802,3803,1271;, + 3;3804,949,3805;, + 3;1273,3804,3806;, + 3;3807,948,3803;, + 3;948,3807,1272;, + 3;1274,950,3808;, + 3;1274,3805,949;, + 3;1275,1276,1274;, + 3;1278,952,1277;, + 3;1279,1280,954;, + 3;1282,951,1281;, + 3;1283,1284,1273;, + 3;1283,3809,3810;, + 3;1008,1270,956;, + 3;955,3811,3812;, + 3;981,957,1267;, + 3;970,1009,973;, + 3;3813,959,953;, + 3;1268,963,988;, + 3;3814,1263,3815;, + 3;959,3813,982;, + 3;973,958,970;, + 3;959,984,953;, + 3;3816,962,957;, + 3;1011,955,974;, + 3;984,3817,953;, + 3;984,965,3817;, + 3;991,961,964;, + 3;1263,963,1012;, + 3;963,3814,3818;, + 3;989,990,964;, + 3;3819,3820,966;, + 3;991,967,992;, + 3;992,965,991;, + 3;3818,966,963;, + 3;966,3818,968;, + 3;961,986,964;, + 3;964,986,3821;, + 3;976,974,1008;, + 3;1009,956,973;, + 3;969,1008,971;, + 3;975,974,972;, + 3;1263,1012,973;, + 3;1270,1263,956;, + 3;955,3815,1270;, + 3;969,976,1008;, + 3;1011,974,975;, + 3;1010,974,976;, + 3;3816,981,982;, + 3;980,1267,957;, + 3;959,982,981;, + 3;3816,982,3813;, + 3;961,991,984;, + 3;959,983,984;, + 3;983,961,984;, + 3;1012,963,985;, + 3;963,1268,985;, + 3;983,986,961;, + 3;983,987,986;, + 3;3820,988,963;, + 3;963,966,3820;, + 3;964,3821,989;, + 3;967,964,990;, + 3;965,984,991;, + 3;964,967,991;, + 3;965,992,3822;, + 3;992,995,3822;, + 3;995,992,994;, + 3;966,993,3819;, + 3;993,966,996;, + 3;967,994,992;, + 3;994,967,997;, + 3;968,996,966;, + 3;996,968,3823;, + 3;990,997,967;, + 3;997,990,3824;, + 3;994,1000,995;, + 3;1000,994,999;, + 3;996,998,993;, + 3;998,996,1001;, + 3;3823,1001,996;, + 3;1001,3823,3825;, + 3;3826,1002,3827;, + 3;3828,3824,3829;, + 3;997,999,994;, + 3;999,997,3828;, + 3;999,1005,1000;, + 3;1005,999,1004;, + 3;1001,1003,998;, + 3;1003,1001,1006;, + 3;3825,1006,1001;, + 3;1006,3825,3830;, + 3;3829,1007,3828;, + 3;1007,3829,3831;, + 3;3828,1004,999;, + 3;1004,3828,1007;, + 3;1007,1005,1004;, + 3;3830,1003,1006;, + 3;3831,1005,1007;, + 3;974,955,1270;, + 3;971,1008,956;, + 3;971,956,1009;, + 3;972,974,1010;, + 3;3832,955,1011;, + 3;958,973,1012;, + 3;1016,1015,970;, + 3;958,1016,970;, + 3;1017,1016,958;, + 3;1012,1017,958;, + 3;1018,1017,1012;, + 3;985,1018,1012;, + 3;1019,3833,3834;, + 3;960,1019,3834;, + 3;1020,1019,960;, + 3;979,1020,960;, + 3;3835,1020,979;, + 3;3836,3835,979;, + 3;1022,1021,1015;, + 3;1016,1022,1015;, + 3;1023,1022,1016;, + 3;1017,1023,1016;, + 3;1024,1023,1017;, + 3;1018,1024,1017;, + 3;1025,3837,3833;, + 3;1019,1025,3833;, + 3;1026,1025,1019;, + 3;1020,1026,1019;, + 3;3838,1026,1020;, + 3;3835,3838,1020;, + 3;1028,1027,1021;, + 3;1022,1028,1021;, + 3;1029,1028,1022;, + 3;1023,1029,1022;, + 3;1030,1029,1023;, + 3;1024,1030,1023;, + 3;1031,3839,3837;, + 3;1025,1031,3837;, + 3;1032,1031,1025;, + 3;1026,1032,1025;, + 3;3840,1032,1026;, + 3;3838,3840,1026;, + 3;1034,1033,1027;, + 3;1028,1034,1027;, + 3;1035,1034,1028;, + 3;1029,1035,1028;, + 3;1036,1035,1029;, + 3;1030,1036,1029;, + 3;1037,3841,3839;, + 3;1031,1037,3839;, + 3;1038,1037,1031;, + 3;1032,1038,1031;, + 3;3842,1038,1032;, + 3;3840,3842,1032;, + 3;1040,1039,1033;, + 3;1034,1040,1033;, + 3;1041,1040,1034;, + 3;1035,1041,1034;, + 3;1042,1041,1035;, + 3;1036,1042,1035;, + 3;1043,3843,3841;, + 3;1037,1043,3841;, + 3;1044,1043,1037;, + 3;1038,1044,1037;, + 3;3844,1044,1038;, + 3;3842,3844,1038;, + 3;1046,1045,1039;, + 3;1040,1046,1039;, + 3;1047,1046,1040;, + 3;1041,1047,1040;, + 3;1048,1047,1041;, + 3;1042,1048,1041;, + 3;1049,3845,3843;, + 3;1043,1049,3843;, + 3;1050,1049,1043;, + 3;1044,1050,1043;, + 3;3846,1050,1044;, + 3;3844,3846,1044;, + 3;1052,1051,1045;, + 3;1046,1052,1045;, + 3;1053,1052,1046;, + 3;1047,1053,1046;, + 3;1054,1053,1047;, + 3;1048,1054,1047;, + 3;1055,3847,3845;, + 3;1049,1055,3845;, + 3;1056,1055,1049;, + 3;1050,1056,1049;, + 3;3848,1056,1050;, + 3;3846,3848,1050;, + 3;1058,1057,1051;, + 3;1052,1058,1051;, + 3;1059,1058,1052;, + 3;1053,1059,1052;, + 3;1060,1059,1053;, + 3;1054,1060,1053;, + 3;1061,3849,3847;, + 3;1055,1061,3847;, + 3;1062,1061,1055;, + 3;1056,1062,1055;, + 3;3850,1062,1056;, + 3;3848,3850,1056;, + 3;1064,1063,1057;, + 3;1058,1064,1057;, + 3;1065,1064,1058;, + 3;1059,1065,1058;, + 3;1066,1065,1059;, + 3;1060,1066,1059;, + 3;1067,3851,3849;, + 3;1061,1067,3849;, + 3;1068,1067,1061;, + 3;1062,1068,1061;, + 3;3852,1068,1062;, + 3;3850,3852,1062;, + 3;1070,1069,1063;, + 3;1064,1070,1063;, + 3;1071,1070,1064;, + 3;1065,1071,1064;, + 3;1072,1071,1065;, + 3;1066,1072,1065;, + 3;1073,3853,3851;, + 3;1067,1073,3851;, + 3;1074,1073,1067;, + 3;1068,1074,1067;, + 3;3854,1074,1068;, + 3;3852,3854,1068;, + 3;1070,1075,1069;, + 3;1071,1076,1070;, + 3;1075,1070,1076;, + 3;1072,1076,1071;, + 3;1073,3855,3853;, + 3;1074,3856,1073;, + 3;3855,1073,3856;, + 3;3854,3856,1074;, + 3;1078,1077,969;, + 3;971,1078,969;, + 3;1079,1078,971;, + 3;1009,1079,971;, + 3;1080,1079,1009;, + 3;970,1080,1009;, + 3;1081,3857,3836;, + 3;978,1081,3836;, + 3;1082,1081,978;, + 3;1013,1082,978;, + 3;3858,1082,1013;, + 3;3859,3858,1013;, + 3;1084,1083,1077;, + 3;1078,1084,1077;, + 3;1085,1084,1078;, + 3;1079,1085,1078;, + 3;1086,1085,1079;, + 3;1080,1086,1079;, + 3;1087,3860,3857;, + 3;1081,1087,3857;, + 3;1088,1087,1081;, + 3;1082,1088,1081;, + 3;3861,1088,1082;, + 3;3858,3861,1082;, + 3;1090,1089,1083;, + 3;1084,1090,1083;, + 3;1091,1090,1084;, + 3;1085,1091,1084;, + 3;1092,1091,1085;, + 3;1086,1092,1085;, + 3;1093,3862,3860;, + 3;1087,1093,3860;, + 3;1094,1093,1087;, + 3;1088,1094,1087;, + 3;3863,1094,1088;, + 3;3861,3863,1088;, + 3;1096,1095,1089;, + 3;1090,1096,1089;, + 3;1097,1096,1090;, + 3;1091,1097,1090;, + 3;1098,1097,1091;, + 3;1092,1098,1091;, + 3;1099,3864,3862;, + 3;1093,1099,3862;, + 3;1100,1099,1093;, + 3;1094,1100,1093;, + 3;3865,1100,1094;, + 3;3863,3865,1094;, + 3;1102,1101,1095;, + 3;1096,1102,1095;, + 3;1103,1102,1096;, + 3;1097,1103,1096;, + 3;1104,1103,1097;, + 3;1098,1104,1097;, + 3;1105,3866,3864;, + 3;1099,1105,3864;, + 3;1106,1105,1099;, + 3;1100,1106,1099;, + 3;3867,1106,1100;, + 3;3865,3867,1100;, + 3;1108,1107,1101;, + 3;1102,1108,1101;, + 3;1109,1108,1102;, + 3;1103,1109,1102;, + 3;1110,1109,1103;, + 3;1104,1110,1103;, + 3;1111,3868,3866;, + 3;1105,1111,3866;, + 3;1112,1111,1105;, + 3;1106,1112,1105;, + 3;3869,1112,1106;, + 3;3867,3869,1106;, + 3;1114,1113,1107;, + 3;1108,1114,1107;, + 3;1115,1114,1108;, + 3;1109,1115,1108;, + 3;1116,1115,1109;, + 3;1110,1116,1109;, + 3;1117,3870,3868;, + 3;1111,1117,3868;, + 3;1118,1117,1111;, + 3;1112,1118,1111;, + 3;3871,1118,1112;, + 3;3869,3871,1112;, + 3;1120,1119,1113;, + 3;1114,1120,1113;, + 3;1121,1120,1114;, + 3;1115,1121,1114;, + 3;1122,1121,1115;, + 3;1116,1122,1115;, + 3;1123,3872,3870;, + 3;1117,1123,3870;, + 3;1124,1123,1117;, + 3;1118,1124,1117;, + 3;3873,1124,1118;, + 3;3871,3873,1118;, + 3;1126,1125,1119;, + 3;1120,1126,1119;, + 3;1127,1126,1120;, + 3;1121,1127,1120;, + 3;1128,1127,1121;, + 3;1122,1128,1121;, + 3;1129,3874,3872;, + 3;1123,1129,3872;, + 3;1130,1129,1123;, + 3;1124,1130,1123;, + 3;3875,1130,1124;, + 3;3873,3875,1124;, + 3;1132,1131,1125;, + 3;1126,1132,1125;, + 3;1133,1132,1126;, + 3;1127,1133,1126;, + 3;1134,1133,1127;, + 3;1128,1134,1127;, + 3;1135,3876,3874;, + 3;1129,1135,3874;, + 3;1136,1135,1129;, + 3;1130,1136,1129;, + 3;3877,1136,1130;, + 3;3875,3877,1130;, + 3;1132,1137,1131;, + 3;1133,1138,1132;, + 3;1137,1132,1138;, + 3;1134,1138,1133;, + 3;1135,3878,3876;, + 3;1136,3879,1135;, + 3;3878,1135,3879;, + 3;3877,3879,1136;, + 3;1140,1139,972;, + 3;1010,1140,972;, + 3;1141,1140,1010;, + 3;976,1141,1010;, + 3;1142,1141,976;, + 3;969,1142,976;, + 3;1143,3880,3859;, + 3;1014,1143,3859;, + 3;1144,1143,1014;, + 3;977,1144,1014;, + 3;3881,1144,977;, + 3;3882,3881,977;, + 3;1146,1145,1139;, + 3;1140,1146,1139;, + 3;1147,1146,1140;, + 3;1141,1147,1140;, + 3;1148,1147,1141;, + 3;1142,1148,1141;, + 3;1149,3883,3880;, + 3;1143,1149,3880;, + 3;1150,1149,1143;, + 3;1144,1150,1143;, + 3;3884,1150,1144;, + 3;3881,3884,1144;, + 3;1152,1151,1145;, + 3;1146,1152,1145;, + 3;1153,1152,1146;, + 3;1147,1153,1146;, + 3;1154,1153,1147;, + 3;1148,1154,1147;, + 3;1155,3885,3883;, + 3;1149,1155,3883;, + 3;1156,1155,1149;, + 3;1150,1156,1149;, + 3;3886,1156,1150;, + 3;3884,3886,1150;, + 3;1158,1157,1151;, + 3;1152,1158,1151;, + 3;1159,1158,1152;, + 3;1153,1159,1152;, + 3;1160,1159,1153;, + 3;1154,1160,1153;, + 3;1161,3887,3885;, + 3;1155,1161,3885;, + 3;1162,1161,1155;, + 3;1156,1162,1155;, + 3;3888,1162,1156;, + 3;3886,3888,1156;, + 3;1164,1163,1157;, + 3;1158,1164,1157;, + 3;1165,1164,1158;, + 3;1159,1165,1158;, + 3;1166,1165,1159;, + 3;1160,1166,1159;, + 3;1167,3889,3887;, + 3;1161,1167,3887;, + 3;1168,1167,1161;, + 3;1162,1168,1161;, + 3;3890,1168,1162;, + 3;3888,3890,1162;, + 3;1170,1169,1163;, + 3;1164,1170,1163;, + 3;1171,1170,1164;, + 3;1165,1171,1164;, + 3;1172,1171,1165;, + 3;1166,1172,1165;, + 3;1173,3891,3889;, + 3;1167,1173,3889;, + 3;1174,1173,1167;, + 3;1168,1174,1167;, + 3;3892,1174,1168;, + 3;3890,3892,1168;, + 3;1176,1175,1169;, + 3;1170,1176,1169;, + 3;1177,1176,1170;, + 3;1171,1177,1170;, + 3;1178,1177,1171;, + 3;1172,1178,1171;, + 3;1179,3893,3891;, + 3;1173,1179,3891;, + 3;1180,1179,1173;, + 3;1174,1180,1173;, + 3;3894,1180,1174;, + 3;3892,3894,1174;, + 3;1182,1181,1175;, + 3;1176,1182,1175;, + 3;1183,1182,1176;, + 3;1177,1183,1176;, + 3;1184,1183,1177;, + 3;1178,1184,1177;, + 3;1185,3895,3893;, + 3;1179,1185,3893;, + 3;1186,1185,1179;, + 3;1180,1186,1179;, + 3;3896,1186,1180;, + 3;3894,3896,1180;, + 3;1188,1187,1181;, + 3;1182,1188,1181;, + 3;1189,1188,1182;, + 3;1183,1189,1182;, + 3;1190,1189,1183;, + 3;1184,1190,1183;, + 3;1191,3897,3895;, + 3;1185,1191,3895;, + 3;1192,1191,1185;, + 3;1186,1192,1185;, + 3;3898,1192,1186;, + 3;3896,3898,1186;, + 3;1194,1193,1187;, + 3;1188,1194,1187;, + 3;1195,1194,1188;, + 3;1189,1195,1188;, + 3;1196,1195,1189;, + 3;1190,1196,1189;, + 3;1197,3899,3897;, + 3;1191,1197,3897;, + 3;1198,1197,1191;, + 3;1192,1198,1191;, + 3;3900,1198,1192;, + 3;3898,3900,1192;, + 3;1194,1199,1193;, + 3;1195,1200,1194;, + 3;1199,1194,1200;, + 3;1196,1200,1195;, + 3;1197,3901,3899;, + 3;1198,3902,1197;, + 3;3901,1197,3902;, + 3;3900,3902,1198;, + 3;1202,1201,3832;, + 3;1011,1202,3832;, + 3;1203,1202,1011;, + 3;975,1203,1011;, + 3;1204,1203,975;, + 3;972,1204,975;, + 3;1205,3903,3882;, + 3;980,1205,3882;, + 3;1206,1205,980;, + 3;957,1206,980;, + 3;3904,1206,957;, + 3;962,3904,957;, + 3;1208,1207,1201;, + 3;1202,1208,1201;, + 3;1209,1208,1202;, + 3;1203,1209,1202;, + 3;1210,1209,1203;, + 3;1204,1210,1203;, + 3;1211,3905,3903;, + 3;1205,1211,3903;, + 3;1212,1211,1205;, + 3;1206,1212,1205;, + 3;3906,1212,1206;, + 3;3904,3906,1206;, + 3;1214,1213,1207;, + 3;1208,1214,1207;, + 3;1215,1214,1208;, + 3;1209,1215,1208;, + 3;1216,1215,1209;, + 3;1210,1216,1209;, + 3;1217,3907,3905;, + 3;1211,1217,3905;, + 3;1218,1217,1211;, + 3;1212,1218,1211;, + 3;3908,1218,1212;, + 3;3906,3908,1212;, + 3;1220,1219,1213;, + 3;1214,1220,1213;, + 3;1221,1220,1214;, + 3;1215,1221,1214;, + 3;1222,1221,1215;, + 3;1216,1222,1215;, + 3;1223,3909,3907;, + 3;1217,1223,3907;, + 3;1224,1223,1217;, + 3;1218,1224,1217;, + 3;3910,1224,1218;, + 3;3908,3910,1218;, + 3;1226,1225,1219;, + 3;1220,1226,1219;, + 3;1227,1226,1220;, + 3;1221,1227,1220;, + 3;1228,1227,1221;, + 3;1222,1228,1221;, + 3;1229,3911,3909;, + 3;1223,1229,3909;, + 3;1230,1229,1223;, + 3;1224,1230,1223;, + 3;3912,1230,1224;, + 3;3910,3912,1224;, + 3;1232,1231,1225;, + 3;1226,1232,1225;, + 3;1233,1232,1226;, + 3;1227,1233,1226;, + 3;1234,1233,1227;, + 3;1228,1234,1227;, + 3;1235,3913,3911;, + 3;1229,1235,3911;, + 3;1236,1235,1229;, + 3;1230,1236,1229;, + 3;3914,1236,1230;, + 3;3912,3914,1230;, + 3;1238,1237,1231;, + 3;1232,1238,1231;, + 3;1239,1238,1232;, + 3;1233,1239,1232;, + 3;1240,1239,1233;, + 3;1234,1240,1233;, + 3;1241,3915,3913;, + 3;1235,1241,3913;, + 3;1242,1241,1235;, + 3;1236,1242,1235;, + 3;3916,1242,1236;, + 3;3914,3916,1236;, + 3;1244,1243,1237;, + 3;1238,1244,1237;, + 3;1245,1244,1238;, + 3;1239,1245,1238;, + 3;1246,1245,1239;, + 3;1240,1246,1239;, + 3;1247,3917,3915;, + 3;1241,1247,3915;, + 3;1248,1247,1241;, + 3;1242,1248,1241;, + 3;3918,1248,1242;, + 3;3916,3918,1242;, + 3;1250,1249,3918;, + 3;1244,3919,1243;, + 3;1251,3919,1244;, + 3;1245,1251,1244;, + 3;1252,1251,1245;, + 3;1246,1252,1245;, + 3;1253,3920,3917;, + 3;1247,1253,3917;, + 3;1254,1253,1247;, + 3;1248,1254,1247;, + 3;1249,1254,1248;, + 3;3918,1249,1248;, + 3;1256,1255,3921;, + 3;3919,1256,3921;, + 3;1257,1256,3919;, + 3;1251,1257,3919;, + 3;1258,1257,1251;, + 3;1252,1258,1251;, + 3;1259,3922,3920;, + 3;1253,1259,3920;, + 3;1260,1259,1253;, + 3;1254,1260,1253;, + 3;3923,1260,1254;, + 3;1249,3923,1254;, + 3;1256,1261,1255;, + 3;1257,1262,1256;, + 3;1261,1256,1262;, + 3;1258,1262,1257;, + 3;1259,3924,3922;, + 3;1260,3925,1259;, + 3;3924,1259,3925;, + 3;3923,3925,1260;, + 3;3814,963,1263;, + 3;1263,973,956;, + 3;981,983,959;, + 3;983,981,1269;, + 3;3859,1264,1014;, + 3;1264,3859,1013;, + 3;3836,1265,978;, + 3;3836,979,1265;, + 3;3882,1266,980;, + 3;1266,3882,977;, + 3;1013,1265,1264;, + 3;1265,1013,978;, + 3;1014,1266,977;, + 3;1266,1014,1264;, + 3;1265,979,960;, + 3;957,981,3816;, + 3;3926,960,3834;, + 3;980,1266,1267;, + 3;1266,1269,1267;, + 3;983,1269,987;, + 3;1267,1269,981;, + 3;1269,1264,987;, + 3;1264,1269,1266;, + 3;1264,1265,987;, + 3;1265,986,987;, + 3;986,1265,960;, + 3;986,960,3926;, + 3;986,3926,3821;, + 3;1270,3815,1263;, + 3;974,1270,1008;, + 3;1277,1282,1271;, + 3;1271,3803,948;, + 3;1279,1278,1272;, + 3;1272,3807,3927;, + 3;949,3804,1273;, + 3;1284,3928,1275;, + 3;3808,3805,1274;, + 3;1276,3929,3930;, + 3;3928,1276,1275;, + 3;3928,3929,1276;, + 3;1274,949,1275;, + 3;1278,1277,948;, + 3;1272,1278,948;, + 3;1272,1280,1279;, + 3;1272,3927,1280;, + 3;1282,1281,947;, + 3;1271,1282,947;, + 3;1271,948,1277;, + 3;3810,1284,1283;, + 3;3810,3928,1284;, + 3;3806,3809,1283;, + 3;1273,3806,1283;, + 3;952,1282,1277;, + 3;952,3931,1282;, + 3;954,1278,1279;, + 3;954,952,1278;, + 3;1284,1275,949;, + 3;1273,1284,949;, + 3;1276,3930,950;, + 3;1274,1276,950;, + 3;1286,943,1285;, + 3;1286,850,1291;, + 3;1287,3759,3757;, + 3;1292,1287,3757;, + 3;1288,3798,1286;, + 3;1286,3798,850;, + 3;855,3932,1287;, + 3;855,945,3932;, + 3;849,1289,943;, + 3;1293,852,1289;, + 3;854,1290,860;, + 3;889,853,1290;, + 3;1286,1291,943;, + 3;849,943,1291;, + 3;855,1287,1292;, + 3;855,1292,3758;, + 3;856,852,1293;, + 3;1293,854,856;, + 3;3933,1286,1285;, + 3;946,3799,851;, + 3;946,3756,3801;, + 3;851,3800,943;, + 3;943,3800,1285;, + 3;3934,1286,3933;, + 3;3934,1288,1286;, + 3;1287,3932,3935;, + 3;1287,3935,3759;, + 3;1294,1295,1736;, + 3;1388,1296,1297;, + 3;1294,1389,1735;, + 3;1734,1738,1299;, + 3;1299,1389,1734;, + 3;1304,1390,1333;, + 3;1300,1332,1306;, + 3;1391,3936,1301;, + 3;1737,3937,3938;, + 3;3938,3939,3940;, + 3;1297,1296,1391;, + 3;1302,1294,1334;, + 3;1303,1295,1302;, + 3;1295,1294,1302;, + 3;1298,1735,1305;, + 3;3941,3937,1306;, + 3;3937,1300,1306;, + 3;1332,1390,1304;, + 3;1320,1335,1336;, + 3;1338,1307,1337;, + 3;1339,1340,1314;, + 3;1342,1308,1341;, + 3;1343,1344,1321;, + 3;1345,1337,1307;, + 3;1347,1319,1346;, + 3;1343,1348,1322;, + 3;1313,1335,1349;, + 3;1339,1350,1309;, + 3;1350,1349,1309;, + 3;1341,1340,1317;, + 3;1312,1351,1347;, + 3;3942,1336,3943;, + 3;1344,1310,1351;, + 3;1348,3944,3945;, + 3;1346,1319,1345;, + 3;3943,1313,1325;, + 3;1325,1324,3943;, + 3;1312,1323,1327;, + 3;1327,1326,1312;, + 3;3944,1321,1329;, + 3;1329,1328,3944;, + 3;1311,1314,1331;, + 3;1331,1330,1311;, + 3;1313,1311,1325;, + 3;1330,1325,1311;, + 3;1314,1308,3946;, + 3;3946,1331,1314;, + 3;1321,1312,1326;, + 3;1326,1329,1321;, + 3;1323,1307,3947;, + 3;3947,1327,1323;, + 3;1315,1316,3948;, + 3;3948,3949,1315;, + 3;1317,1309,3950;, + 3;3950,3951,1317;, + 3;1318,1317,3951;, + 3;3951,3952,1318;, + 3;1310,1322,3953;, + 3;3953,3954,1310;, + 3;1316,1319,3955;, + 3;3955,3948,1316;, + 3;1309,1320,3956;, + 3;3956,3950,1309;, + 3;1319,1310,3954;, + 3;3954,3955,1319;, + 3;1320,3957,3958;, + 3;3958,3956,1320;, + 3;1322,3959,3960;, + 3;3960,3953,1322;, + 3;1335,1313,1336;, + 3;1313,3943,1336;, + 3;1337,1316,1338;, + 3;1316,1315,1338;, + 3;1339,1309,1340;, + 3;1309,1317,1340;, + 3;1341,1317,1342;, + 3;1317,1318,1342;, + 3;1343,1322,1344;, + 3;1322,1310,1344;, + 3;1345,1319,1337;, + 3;1319,1316,1337;, + 3;1346,1323,1347;, + 3;1323,1312,1347;, + 3;1343,1321,1348;, + 3;1321,3944,1348;, + 3;1335,1320,1349;, + 3;1320,1309,1349;, + 3;1339,1314,1350;, + 3;1314,1311,1350;, + 3;1350,1311,1349;, + 3;1311,1313,1349;, + 3;1341,1308,1340;, + 3;1308,1314,1340;, + 3;1351,1310,1347;, + 3;1310,1319,1347;, + 3;3942,3957,1336;, + 3;3957,1320,1336;, + 3;1351,1312,1344;, + 3;1312,1321,1344;, + 3;3945,3959,1348;, + 3;3959,1322,1348;, + 3;1345,1307,1346;, + 3;1307,1323,1346;, + 3;1334,1294,1735;, + 3;3961,1295,1303;, + 3;1300,1390,1332;, + 3;1366,1353,1384;, + 3;1387,3962,1367;, + 3;1368,1369,1355;, + 3;1352,1370,1371;, + 3;1371,1356,1372;, + 3;1374,1360,1373;, + 3;3963,1358,1364;, + 3;1376,1358,1375;, + 3;1386,1353,1365;, + 3;1376,3964,1377;, + 3;1374,1353,1378;, + 3;1361,3965,1363;, + 3;1362,1358,3966;, + 3;1380,1359,1379;, + 3;1361,1381,1380;, + 3;1382,1383,1360;, + 3;3967,3968,3969;, + 3;3970,1364,1354;, + 3;1357,3967,3971;, + 3;1361,1362,3966;, + 3;1379,1359,1375;, + 3;3968,3967,1357;, + 3;1381,3972,3973;, + 3;3963,3966,1358;, + 3;1377,3964,3974;, + 3;1373,1360,1383;, + 3;1385,1384,1353;, + 3;1352,1385,1387;, + 3;1372,1356,1378;, + 3;1367,3962,3975;, + 3;1370,1368,1355;, + 3;1368,1367,1369;, + 3;1367,3975,1369;, + 3;1370,1355,1371;, + 3;1355,1356,1371;, + 3;1372,1366,1371;, + 3;1366,1352,1371;, + 3;1373,1365,1374;, + 3;1365,1353,1374;, + 3;1375,1359,1376;, + 3;1359,3964,1376;, + 3;1377,1364,1376;, + 3;1364,1358,1376;, + 3;1378,1356,1374;, + 3;1356,1360,1374;, + 3;1379,1362,1380;, + 3;1362,1361,1380;, + 3;1381,3973,1380;, + 3;3973,1359,1380;, + 3;1382,3968,1383;, + 3;3968,1357,1383;, + 3;1375,1358,1379;, + 3;1358,1362,1379;, + 3;1381,1361,3972;, + 3;1361,1363,3972;, + 3;3974,1354,1377;, + 3;1354,1364,1377;, + 3;1383,1357,1373;, + 3;1357,1365,1373;, + 3;1378,1353,1372;, + 3;1353,1366,1372;, + 3;1370,1352,1368;, + 3;1352,1367,1368;, + 3;1357,3971,1365;, + 3;1325,1324,1330;, + 3;3962,3976,3975;, + 3;1385,3977,3962;, + 3;1386,3971,1385;, + 3;1352,1366,1384;, + 3;1384,1385,1352;, + 3;1385,3971,3977;, + 3;3971,1386,1365;, + 3;1353,1386,1385;, + 3;1352,1387,1367;, + 3;1387,1385,3962;, + 3;3970,3963,1364;, + 3;3965,1361,3966;, + 3;1734,1388,1297;, + 3;1294,1734,1389;, + 3;1299,1735,1389;, + 3;3978,1295,3961;, + 3;3979,1296,3980;, + 3;1297,1391,1301;, + 3;1391,3979,3981;, + 3;1716,3982,1392;, + 3;3982,1716,3983;, + 3;3984,3985,1394;, + 3;1718,3986,3984;, + 3;3987,3983,1393;, + 3;1393,1717,3987;, + 3;1719,3988,1395;, + 3;1719,1394,3985;, + 3;1720,1719,1721;, + 3;1723,1722,1397;, + 3;1724,1399,1725;, + 3;1727,1726,1396;, + 3;1728,1718,1729;, + 3;1728,3989,3990;, + 3;1453,1401,1715;, + 3;1400,3991,3992;, + 3;1426,1712,1402;, + 3;1415,1418,1454;, + 3;3993,1398,1404;, + 3;1713,1433,1408;, + 3;3994,3991,1708;, + 3;1404,1427,3993;, + 3;1418,1415,1403;, + 3;1404,1398,1429;, + 3;3995,1402,1407;, + 3;1456,1419,1400;, + 3;1429,1398,3996;, + 3;1429,3996,1410;, + 3;1436,1409,1406;, + 3;1708,1457,1408;, + 3;1408,3997,3994;, + 3;1434,1409,1435;, + 3;3998,1411,3999;, + 3;1436,1437,1412;, + 3;1437,1436,1410;, + 3;3997,1408,1411;, + 3;1411,1413,3997;, + 3;1406,1409,1431;, + 3;1409,4000,1431;, + 3;1421,1453,1419;, + 3;1454,1418,1401;, + 3;1414,1416,1453;, + 3;1420,1417,1419;, + 3;1708,1418,1457;, + 3;1715,1401,1708;, + 3;1400,1715,3991;, + 3;1414,1453,1421;, + 3;1456,1420,1419;, + 3;1455,1421,1419;, + 3;3995,1427,1426;, + 3;1425,1402,1712;, + 3;1404,1426,1427;, + 3;3995,3993,1427;, + 3;1406,1429,1436;, + 3;1404,1429,1428;, + 3;1428,1429,1406;, + 3;1457,1430,1408;, + 3;1408,1430,1713;, + 3;1428,1406,1431;, + 3;1428,1431,1432;, + 3;3999,1408,1433;, + 3;1408,3999,1411;, + 3;1409,1434,4000;, + 3;1412,1435,1409;, + 3;1410,1436,1429;, + 3;1409,1436,1412;, + 3;1410,4001,1437;, + 3;1437,4001,1440;, + 3;1440,1439,1437;, + 3;1411,3998,1438;, + 3;1438,1441,1411;, + 3;1412,1437,1439;, + 3;1439,1442,1412;, + 3;1413,1411,1441;, + 3;1441,4002,1413;, + 3;1435,1412,1442;, + 3;1442,4003,1435;, + 3;1439,1440,1445;, + 3;1445,1444,1439;, + 3;1441,1438,1443;, + 3;1443,1446,1441;, + 3;4002,1441,1446;, + 3;1446,4004,4002;, + 3;4003,1442,1447;, + 3;1447,4005,4003;, + 3;1442,1439,1444;, + 3;1444,1447,1442;, + 3;1444,1445,1450;, + 3;1450,1449,1444;, + 3;1446,1443,1448;, + 3;1448,1451,1446;, + 3;4004,1446,1451;, + 3;1451,4006,4004;, + 3;4005,1447,1452;, + 3;1452,4007,4005;, + 3;1447,1444,1449;, + 3;1449,1452,1447;, + 3;1452,1449,1450;, + 3;4006,1451,1448;, + 3;4007,1452,1450;, + 3;1419,1715,1400;, + 3;1416,1401,1453;, + 3;1416,1454,1401;, + 3;1417,1455,1419;, + 3;4008,1456,1400;, + 3;1403,1457,1418;, + 3;1461,4009,1460;, + 3;1403,1415,4010;, + 3;1462,1403,4010;, + 3;1457,1403,1462;, + 3;1463,1457,1462;, + 3;1430,1457,1463;, + 3;1464,4011,4012;, + 3;1405,4011,1464;, + 3;1465,1405,1464;, + 3;1424,1405,1465;, + 3;1460,1424,1465;, + 3;4009,1424,1460;, + 3;1467,4013,1466;, + 3;4010,4013,1467;, + 3;1468,4010,1467;, + 3;1462,4010,1468;, + 3;1469,1462,1468;, + 3;1463,1462,1469;, + 3;1470,4012,4014;, + 3;1464,4012,1470;, + 3;1471,1464,1470;, + 3;1465,1464,1471;, + 3;4015,1465,1471;, + 3;1460,1465,4015;, + 3;1473,1466,1472;, + 3;1467,1466,1473;, + 3;1474,1467,1473;, + 3;1468,1467,1474;, + 3;1475,1468,1474;, + 3;1469,1468,1475;, + 3;1476,4014,4016;, + 3;1470,4014,1476;, + 3;1477,1470,1476;, + 3;1471,1470,1477;, + 3;4017,1471,1477;, + 3;4015,1471,4017;, + 3;1479,1472,1478;, + 3;1473,1472,1479;, + 3;1480,1473,1479;, + 3;1474,1473,1480;, + 3;1481,1474,1480;, + 3;1475,1474,1481;, + 3;1482,4016,4018;, + 3;1476,4016,1482;, + 3;1483,1476,1482;, + 3;1477,1476,1483;, + 3;4019,1477,1483;, + 3;4017,1477,4019;, + 3;1485,1478,1484;, + 3;1479,1478,1485;, + 3;1486,1479,1485;, + 3;1480,1479,1486;, + 3;1487,1480,1486;, + 3;1481,1480,1487;, + 3;1488,4018,4020;, + 3;1482,4018,1488;, + 3;1489,1482,1488;, + 3;1483,1482,1489;, + 3;4021,1483,1489;, + 3;4019,1483,4021;, + 3;1491,1484,1490;, + 3;1485,1484,1491;, + 3;1492,1485,1491;, + 3;1486,1485,1492;, + 3;1493,1486,1492;, + 3;1487,1486,1493;, + 3;1494,4020,4022;, + 3;1488,4020,1494;, + 3;1495,1488,1494;, + 3;1489,1488,1495;, + 3;4023,1489,1495;, + 3;4021,1489,4023;, + 3;1497,1490,1496;, + 3;1491,1490,1497;, + 3;1498,1491,1497;, + 3;1492,1491,1498;, + 3;1499,1492,1498;, + 3;1493,1492,1499;, + 3;1500,4022,4024;, + 3;1494,4022,1500;, + 3;1501,1494,1500;, + 3;1495,1494,1501;, + 3;4025,1495,1501;, + 3;4023,1495,4025;, + 3;1503,1496,1502;, + 3;1497,1496,1503;, + 3;1504,1497,1503;, + 3;1498,1497,1504;, + 3;1505,1498,1504;, + 3;1499,1498,1505;, + 3;1506,4024,4026;, + 3;1500,4024,1506;, + 3;1507,1500,1506;, + 3;1501,1500,1507;, + 3;4027,1501,1507;, + 3;4025,1501,4027;, + 3;1509,1502,1508;, + 3;1503,1502,1509;, + 3;1510,1503,1509;, + 3;1504,1503,1510;, + 3;1511,1504,1510;, + 3;1505,1504,1511;, + 3;1512,4026,4028;, + 3;1506,4026,1512;, + 3;1513,1506,1512;, + 3;1507,1506,1513;, + 3;4029,1507,1513;, + 3;4027,1507,4029;, + 3;1515,1508,1514;, + 3;1509,1508,1515;, + 3;1516,1509,1515;, + 3;1510,1509,1516;, + 3;1517,1510,1516;, + 3;1511,1510,1517;, + 3;1518,4028,4030;, + 3;1512,4028,1518;, + 3;1519,1512,1518;, + 3;1513,1512,1519;, + 3;4031,1513,1519;, + 3;4029,1513,4031;, + 3;1515,1514,1520;, + 3;1516,1515,1521;, + 3;1520,1521,1515;, + 3;1517,1516,1521;, + 3;1518,4030,4032;, + 3;1519,1518,4033;, + 3;4032,4033,1518;, + 3;4031,1519,4033;, + 3;1523,1414,1522;, + 3;1416,1414,1523;, + 3;1524,1416,1523;, + 3;1454,1416,1524;, + 3;1525,1454,1524;, + 3;1415,1454,1525;, + 3;1526,4009,4034;, + 3;1423,4009,1526;, + 3;1527,1423,1526;, + 3;1458,1423,1527;, + 3;4035,1458,1527;, + 3;4036,1458,4035;, + 3;1529,1522,1528;, + 3;1523,1522,1529;, + 3;1530,1523,1529;, + 3;1524,1523,1530;, + 3;1531,1524,1530;, + 3;1525,1524,1531;, + 3;1532,4034,4037;, + 3;1526,4034,1532;, + 3;1533,1526,1532;, + 3;1527,1526,1533;, + 3;4038,1527,1533;, + 3;4035,1527,4038;, + 3;1535,1528,1534;, + 3;1529,1528,1535;, + 3;1536,1529,1535;, + 3;1530,1529,1536;, + 3;1537,1530,1536;, + 3;1531,1530,1537;, + 3;1538,4037,4039;, + 3;1532,4037,1538;, + 3;1539,1532,1538;, + 3;1533,1532,1539;, + 3;4040,1533,1539;, + 3;4038,1533,4040;, + 3;1541,1534,1540;, + 3;1535,1534,1541;, + 3;1542,1535,1541;, + 3;1536,1535,1542;, + 3;1543,1536,1542;, + 3;1537,1536,1543;, + 3;1544,4039,4041;, + 3;1538,4039,1544;, + 3;1545,1538,1544;, + 3;1539,1538,1545;, + 3;4042,1539,1545;, + 3;4040,1539,4042;, + 3;1547,1540,1546;, + 3;1541,1540,1547;, + 3;1548,1541,1547;, + 3;1542,1541,1548;, + 3;1549,1542,1548;, + 3;1543,1542,1549;, + 3;1550,4041,4043;, + 3;1544,4041,1550;, + 3;1551,1544,1550;, + 3;1545,1544,1551;, + 3;4044,1545,1551;, + 3;4042,1545,4044;, + 3;1553,1546,1552;, + 3;1547,1546,1553;, + 3;1554,1547,1553;, + 3;1548,1547,1554;, + 3;1555,1548,1554;, + 3;1549,1548,1555;, + 3;1556,4043,4045;, + 3;1550,4043,1556;, + 3;1557,1550,1556;, + 3;1551,1550,1557;, + 3;4046,1551,1557;, + 3;4044,1551,4046;, + 3;1559,1552,1558;, + 3;1553,1552,1559;, + 3;1560,1553,1559;, + 3;1554,1553,1560;, + 3;1561,1554,1560;, + 3;1555,1554,1561;, + 3;1562,4045,4047;, + 3;1556,4045,1562;, + 3;1563,1556,1562;, + 3;1557,1556,1563;, + 3;4048,1557,1563;, + 3;4046,1557,4048;, + 3;1565,1558,1564;, + 3;1559,1558,1565;, + 3;1566,1559,1565;, + 3;1560,1559,1566;, + 3;1567,1560,1566;, + 3;1561,1560,1567;, + 3;1568,4047,4049;, + 3;1562,4047,1568;, + 3;1569,1562,1568;, + 3;1563,1562,1569;, + 3;4050,1563,1569;, + 3;4048,1563,4050;, + 3;1571,1564,1570;, + 3;1565,1564,1571;, + 3;1572,1565,1571;, + 3;1566,1565,1572;, + 3;1573,1566,1572;, + 3;1567,1566,1573;, + 3;1574,4049,4051;, + 3;1568,4049,1574;, + 3;1575,1568,1574;, + 3;1569,1568,1575;, + 3;4052,1569,1575;, + 3;4050,1569,4052;, + 3;1577,1570,1576;, + 3;1571,1570,1577;, + 3;1578,1571,1577;, + 3;1572,1571,1578;, + 3;1579,1572,1578;, + 3;1573,1572,1579;, + 3;1580,4051,4053;, + 3;1574,4051,1580;, + 3;1581,1574,1580;, + 3;1575,1574,1581;, + 3;4054,1575,1581;, + 3;4052,1575,4054;, + 3;1577,1576,1582;, + 3;1578,1577,1583;, + 3;1582,1583,1577;, + 3;1579,1578,1583;, + 3;1580,4053,4055;, + 3;1581,1580,4056;, + 3;4055,4056,1580;, + 3;4054,1581,4056;, + 3;1585,1417,1584;, + 3;1455,1417,1585;, + 3;1586,1455,1585;, + 3;1421,1455,1586;, + 3;1587,1421,1586;, + 3;1414,1421,1587;, + 3;1588,4036,4057;, + 3;1459,4036,1588;, + 3;1589,1459,1588;, + 3;1422,1459,1589;, + 3;4058,1422,1589;, + 3;4059,1422,4058;, + 3;1591,1584,1590;, + 3;1585,1584,1591;, + 3;1592,1585,1591;, + 3;1586,1585,1592;, + 3;1593,1586,1592;, + 3;1587,1586,1593;, + 3;1594,4057,4060;, + 3;1588,4057,1594;, + 3;1595,1588,1594;, + 3;1589,1588,1595;, + 3;4061,1589,1595;, + 3;4058,1589,4061;, + 3;1597,1590,1596;, + 3;1591,1590,1597;, + 3;1598,1591,1597;, + 3;1592,1591,1598;, + 3;1599,1592,1598;, + 3;1593,1592,1599;, + 3;1600,4060,4062;, + 3;1594,4060,1600;, + 3;1601,1594,1600;, + 3;1595,1594,1601;, + 3;4063,1595,1601;, + 3;4061,1595,4063;, + 3;1603,1596,1602;, + 3;1597,1596,1603;, + 3;1604,1597,1603;, + 3;1598,1597,1604;, + 3;1605,1598,1604;, + 3;1599,1598,1605;, + 3;1606,4062,4064;, + 3;1600,4062,1606;, + 3;1607,1600,1606;, + 3;1601,1600,1607;, + 3;4065,1601,1607;, + 3;4063,1601,4065;, + 3;1609,1602,1608;, + 3;1603,1602,1609;, + 3;1610,1603,1609;, + 3;1604,1603,1610;, + 3;1611,1604,1610;, + 3;1605,1604,1611;, + 3;1612,4064,4066;, + 3;1606,4064,1612;, + 3;1613,1606,1612;, + 3;1607,1606,1613;, + 3;4067,1607,1613;, + 3;4065,1607,4067;, + 3;1615,1608,1614;, + 3;1609,1608,1615;, + 3;1616,1609,1615;, + 3;1610,1609,1616;, + 3;1617,1610,1616;, + 3;1611,1610,1617;, + 3;1618,4066,4068;, + 3;1612,4066,1618;, + 3;1619,1612,1618;, + 3;1613,1612,1619;, + 3;4069,1613,1619;, + 3;4067,1613,4069;, + 3;1621,1614,1620;, + 3;1615,1614,1621;, + 3;1622,1615,1621;, + 3;1616,1615,1622;, + 3;1623,1616,1622;, + 3;1617,1616,1623;, + 3;1624,4068,4070;, + 3;1618,4068,1624;, + 3;1625,1618,1624;, + 3;1619,1618,1625;, + 3;4071,1619,1625;, + 3;4069,1619,4071;, + 3;1627,1620,1626;, + 3;1621,1620,1627;, + 3;1628,1621,1627;, + 3;1622,1621,1628;, + 3;1629,1622,1628;, + 3;1623,1622,1629;, + 3;1630,4070,4072;, + 3;1624,4070,1630;, + 3;1631,1624,1630;, + 3;1625,1624,1631;, + 3;4073,1625,1631;, + 3;4071,1625,4073;, + 3;1633,1626,1632;, + 3;1627,1626,1633;, + 3;1634,1627,1633;, + 3;1628,1627,1634;, + 3;1635,1628,1634;, + 3;1629,1628,1635;, + 3;1636,4072,4074;, + 3;1630,4072,1636;, + 3;1637,1630,1636;, + 3;1631,1630,1637;, + 3;4075,1631,1637;, + 3;4073,1631,4075;, + 3;1639,1632,1638;, + 3;1633,1632,1639;, + 3;1640,1633,1639;, + 3;1634,1633,1640;, + 3;1641,1634,1640;, + 3;1635,1634,1641;, + 3;1642,4074,4076;, + 3;1636,4074,1642;, + 3;1643,1636,1642;, + 3;1637,1636,1643;, + 3;4077,1637,1643;, + 3;4075,1637,4077;, + 3;1639,1638,1644;, + 3;1640,1639,1645;, + 3;1644,1645,1639;, + 3;1641,1640,1645;, + 3;1642,4076,4078;, + 3;1643,1642,4079;, + 3;4078,4079,1642;, + 3;4077,1643,4079;, + 3;1647,4008,1646;, + 3;1456,4008,1647;, + 3;1648,1456,1647;, + 3;1420,1456,1648;, + 3;1649,1420,1648;, + 3;1417,1420,1649;, + 3;1650,4059,4080;, + 3;1425,4059,1650;, + 3;1651,1425,1650;, + 3;1402,1425,1651;, + 3;4081,1402,1651;, + 3;1407,1402,4081;, + 3;1653,1646,1652;, + 3;1647,1646,1653;, + 3;1654,1647,1653;, + 3;1648,1647,1654;, + 3;1655,1648,1654;, + 3;1649,1648,1655;, + 3;1656,4080,4082;, + 3;1650,4080,1656;, + 3;1657,1650,1656;, + 3;1651,1650,1657;, + 3;4083,1651,1657;, + 3;4081,1651,4083;, + 3;1659,1652,1658;, + 3;1653,1652,1659;, + 3;1660,1653,1659;, + 3;1654,1653,1660;, + 3;1661,1654,1660;, + 3;1655,1654,1661;, + 3;1662,4082,4084;, + 3;1656,4082,1662;, + 3;1663,1656,1662;, + 3;1657,1656,1663;, + 3;4085,1657,1663;, + 3;4083,1657,4085;, + 3;1665,1658,1664;, + 3;1659,1658,1665;, + 3;1666,1659,1665;, + 3;1660,1659,1666;, + 3;1667,1660,1666;, + 3;1661,1660,1667;, + 3;1668,4084,4086;, + 3;1662,4084,1668;, + 3;1669,1662,1668;, + 3;1663,1662,1669;, + 3;4087,1663,1669;, + 3;4085,1663,4087;, + 3;1671,1664,1670;, + 3;1665,1664,1671;, + 3;1672,1665,1671;, + 3;1666,1665,1672;, + 3;1673,1666,1672;, + 3;1667,1666,1673;, + 3;1674,4086,4088;, + 3;1668,4086,1674;, + 3;1675,1668,1674;, + 3;1669,1668,1675;, + 3;4089,1669,1675;, + 3;4087,1669,4089;, + 3;1677,1670,1676;, + 3;1671,1670,1677;, + 3;1678,1671,1677;, + 3;1672,1671,1678;, + 3;1679,1672,1678;, + 3;1673,1672,1679;, + 3;1680,4088,4090;, + 3;1674,4088,1680;, + 3;1681,1674,1680;, + 3;1675,1674,1681;, + 3;4091,1675,1681;, + 3;4089,1675,4091;, + 3;1683,1676,1682;, + 3;1677,1676,1683;, + 3;1684,1677,1683;, + 3;1678,1677,1684;, + 3;1685,1678,1684;, + 3;1679,1678,1685;, + 3;1686,4090,4092;, + 3;1680,4090,1686;, + 3;1687,1680,1686;, + 3;1681,1680,1687;, + 3;4093,1681,1687;, + 3;4091,1681,4093;, + 3;1689,1682,1688;, + 3;1683,1682,1689;, + 3;1690,1683,1689;, + 3;1684,1683,1690;, + 3;1691,1684,1690;, + 3;1685,1684,1691;, + 3;1692,4092,4094;, + 3;1686,4092,1692;, + 3;1693,1686,1692;, + 3;1687,1686,1693;, + 3;4095,1687,1693;, + 3;4093,1687,4095;, + 3;1695,1688,1694;, + 3;1689,1688,1695;, + 3;1696,1689,1695;, + 3;1690,1689,1696;, + 3;1697,1690,1696;, + 3;1691,1690,1697;, + 3;1698,4094,4096;, + 3;1692,4094,1698;, + 3;1699,1692,1698;, + 3;1693,1692,1699;, + 3;4097,1693,1699;, + 3;4095,1693,4097;, + 3;1701,1694,1700;, + 3;1695,1694,1701;, + 3;1702,1695,1701;, + 3;1696,1695,1702;, + 3;1703,1696,1702;, + 3;1697,1696,1703;, + 3;1704,4096,4098;, + 3;1698,4096,1704;, + 3;1705,1698,1704;, + 3;1699,1698,1705;, + 3;4099,1699,1705;, + 3;4097,1699,4099;, + 3;1701,1700,1706;, + 3;1702,1701,1707;, + 3;1706,1707,1701;, + 3;1703,1702,1707;, + 3;1704,4098,4100;, + 3;1705,1704,4101;, + 3;4100,4101,1704;, + 3;4099,1705,4101;, + 3;3994,1708,1408;, + 3;1708,1401,1418;, + 3;1426,1404,1428;, + 3;1428,1714,1426;, + 3;4036,1459,1709;, + 3;1709,1458,4036;, + 3;4009,1423,1710;, + 3;4009,1710,1424;, + 3;4059,1425,1711;, + 3;1711,1422,4059;, + 3;1458,1709,1710;, + 3;1710,1423,1458;, + 3;1459,1422,1711;, + 3;1711,1709,1459;, + 3;1710,1405,1424;, + 3;1402,3995,1426;, + 3;4102,4011,1405;, + 3;1425,1712,1711;, + 3;1711,1712,1714;, + 3;1428,1432,1714;, + 3;1712,1426,1714;, + 3;1714,1432,1709;, + 3;1709,1711,1714;, + 3;1709,1432,1710;, + 3;1710,1432,1431;, + 3;1431,1405,1710;, + 3;1431,4102,1405;, + 3;1431,4000,4102;, + 3;1715,1708,3991;, + 3;1419,1453,1715;, + 3;1722,1716,1727;, + 3;1716,1393,3983;, + 3;1724,1717,1723;, + 3;1717,4103,3987;, + 3;1394,1718,3984;, + 3;1729,1720,4104;, + 3;3988,1719,3985;, + 3;1721,4105,4106;, + 3;4104,1720,1721;, + 3;4104,1721,4106;, + 3;1719,1720,1394;, + 3;1723,1393,1722;, + 3;1717,1393,1723;, + 3;1717,1724,1725;, + 3;1717,1725,4103;, + 3;1727,1392,1726;, + 3;1716,1392,1727;, + 3;1716,1722,1393;, + 3;3989,1728,1729;, + 3;3989,1729,4104;, + 3;3986,1728,3990;, + 3;1718,1728,3986;, + 3;1397,1722,1727;, + 3;1397,1727,1396;, + 3;1399,1724,1723;, + 3;1399,1723,1397;, + 3;1729,1394,1720;, + 3;1718,1394,1729;, + 3;1721,1395,4105;, + 3;1719,1395,1721;, + 3;1731,1730,1388;, + 3;1731,1736,1295;, + 3;1732,3938,3940;, + 3;1737,3938,1732;, + 3;1733,1731,3978;, + 3;1731,1295,3978;, + 3;1300,1732,4107;, + 3;1300,4107,1390;, + 3;1294,1388,1734;, + 3;1738,1734,1297;, + 3;1299,1305,1735;, + 3;1334,1735,1298;, + 3;1731,1388,1736;, + 3;1294,1736,1388;, + 3;1300,1737,1732;, + 3;1300,3937,1737;, + 3;1301,1738,1297;, + 3;1738,1301,1299;, + 3;4108,1730,1731;, + 3;1391,1296,3979;, + 3;1391,3981,3936;, + 3;1296,1388,3980;, + 3;1388,1730,3980;, + 3;4109,4108,1731;, + 3;4109,1731,1733;, + 3;1732,4110,4107;, + 3;1732,3940,4110;, + 3;196,4111,197;, + 3;3759,4112,3760;, + 3;3938,4113,3939;, + 3;74,75,4114;, + 3;1744,6,1742;, + 3;10,97,1739;, + 3;1743,1745,142;, + 3;1740,144,215;, + 3;4115,4116,1741;, + 3;1741,1744,4115;, + 3;4117,4118,1742;, + 3;1742,1745,4117;, + 3;4118,4115,1744;, + 3;1744,1742,4118;, + 3;4119,4117,1745;, + 3;1745,1743,4119;, + 3;118,107,3471;, + 3;3460,3471,107;, + 3;233,3527,3528;, + 3;3528,3518,224;, + 3;106,5,87;, + 3;106,87,110;, + 3;1779,1790,1756;, + 3;1757,1819,1751;, + 3;1825,1826,4120;, + 3;1758,1829,1748;, + 3;2386,2124,2140;, + 3;2330,2146,2425;, + 3;1870,1872,1782;, + 3;4121,1846,4122;, + 3;1834,1835,1759;, + 3;2183,2240,2182;, + 3;2698,2714,2138;, + 3;2344,2518,2356;, + 3;4123,1852,4124;, + 3;1761,1865,4125;, + 3;1818,1799,1766;, + 3;2711,2132,2707;, + 3;2288,2450,2748;, + 3;2129,2213,2725;, + 3;2726,2753,2169;, + 3;2461,2471,2433;, + 3;1762,1763,1760;, + 3;1770,1772,1771;, + 3;2214,2022,2040;, + 3;2457,2193,2206;, + 3;2749,2758,2168;, + 3;2184,2176,2239;, + 3;2041,2190,2052;, + 3;2163,2231,2287;, + 3;2739,2284,2036;, + 3;2724,2204,2180;, + 3;2194,2044,2056;, + 3;2185,2196,2175;, + 3;2186,2043,2195;, + 3;2189,2042,2178;, + 3;2205,2188,2179;, + 3;2113,2062,2070;, + 3;2192,2458,2064;, + 3;2075,2198,2074;, + 3;2177,2042,2187;, + 3;2199,2053,2073;, + 3;2191,2065,2051;, + 3;2174,2197,2076;, + 3;2200,2700,2211;, + 3;2712,2202,2131;, + 3;2121,2396,2209;, + 3;2203,2212,2130;, + 3;1833,1800,1831;, + 3;2222,2021,2215;, + 3;2173,2077,2090;, + 3;2221,2037,2034;, + 3;2084,2020,2223;, + 3;2285,2220,2035;, + 3;2723,2181,2232;, + 3;2256,2282,2245;, + 3;2261,2278,2270;, + 3;2251,2281,2257;, + 3;2246,2277,2262;, + 3;2269,2279,2275;, + 3;2164,2249,2230;, + 3;2248,2165,2243;, + 3;2170,2259,2238;, + 3;2258,2171,2255;, + 3;2216,2267,2226;, + 3;2266,2217,2265;, + 3;2081,2254,2172;, + 3;2253,2082,2273;, + 3;2224,2272,2083;, + 3;2271,2225,2268;, + 3;2228,2264,2218;, + 3;2263,2229,2250;, + 3;2236,2242,2166;, + 3;2241,2237,2260;, + 3;2280,2252,2274;, + 3;2276,2247,2244;, + 3;2160,2738,2732;, + 3;2227,2219,2286;, + 3;2143,2159,2429;, + 3;2297,2449,2289;, + 3;2142,2430,2291;, + 3;2309,2469,2495;, + 3;2434,2127,2768;, + 3;2472,2437,2308;, + 3;2477,2302,2444;, + 3;2730,2028,2746;, + 3;4126,1823,1747;, + 3;1769,1778,3416;, + 3;4127,1838,1750;, + 3;1883,1763,1762;, + 3;1765,1856,4128;, + 3;1764,1804,1784;, + 3;1858,1859,4129;, + 3;1777,1760,1763;, + 3;1749,1752,1763;, + 3;1746,1806,1767;, + 3;1773,3416,1775;, + 3;1771,1769,1770;, + 3;4130,4131,4132;, + 3;4133,4134,1768;, + 3;4135,4136,4137;, + 3;4136,4135,4138;, + 3;4137,4139,4140;, + 3;4139,4137,4136;, + 3;4141,4142,4143;, + 3;1776,4140,4139;, + 3;1774,1768,4134;, + 3;4144,4143,4142;, + 3;4132,4138,4135;, + 3;4138,4132,4131;, + 3;4143,4144,1774;, + 3;3416,1773,4145;, + 3;1768,1774,4144;, + 3;4142,4141,1776;, + 3;3416,4145,1770;, + 3;4146,2141,4147;, + 3;4140,1776,4141;, + 3;3416,4148,1775;, + 3;4131,4130,4133;, + 3;4149,1807,4150;, + 3;4134,4133,4130;, + 3;2715,2709,2333;, + 3;2319,2343,2549;, + 3;4151,1849,4152;, + 3;2145,4153,2704;, + 3;2710,2703,2332;, + 3;2524,2523,2346;, + 3;1783,1809,4154;, + 3;2320,2147,2342;, + 3;2335,2352,2329;, + 3;2351,2336,2350;, + 3;2363,2341,2148;, + 3;2367,2328,2353;, + 3;2375,2349,2337;, + 3;2370,2385,2536;, + 3;2537,2360,2135;, + 3;4155,1867,4156;, + 3;2327,2368,2362;, + 3;2513,2512,2355;, + 3;2149,2361,2369;, + 3;2531,2529,2374;, + 3;2348,2376,2372;, + 3;1785,1811,4157;, + 3;2389,2383,2378;, + 3;2381,2134,2357;, + 3;2384,2371,2377;, + 3;2133,2382,2390;, + 3;4158,1877,4159;, + 3;2338,2388,2379;, + 3;2393,2098,2401;, + 3;2392,2397,2115;, + 3;2109,2060,2399;, + 3;2394,2412,2097;, + 3;2411,2395,2122;, + 3;1755,1813,1787;, + 3;2407,2423,2101;, + 3;2422,2408,2415;, + 3;2402,2414,2409;, + 3;2413,2403,2418;, + 3;2419,2417,2404;, + 3;2416,2420,2108;, + 3;2099,2107,2421;, + 3;4160,1840,4161;, + 3;1788,1861,4162;, + 3;1754,1843,4163;, + 3;2102,2096,2406;, + 3;2114,2398,2061;, + 3;2112,2400,2091;, + 3;4164,1873,4165;, + 3;2424,2141,2318;, + 3;1779,1879,1790;, + 3;1756,1790,1879;, + 3;1757,4166,1820;, + 3;1751,1819,4166;, + 3;1825,4167,1827;, + 3;4120,1826,4167;, + 3;1758,1828,1830;, + 3;1748,1829,1828;, + 3;1870,1871,1794;, + 3;1782,1872,1871;, + 3;4121,4168,1847;, + 3;4122,1846,4168;, + 3;1834,1836,1796;, + 3;1759,1835,1753;, + 3;4123,4169,1853;, + 3;4124,1852,4169;, + 3;1761,1864,1866;, + 3;4125,1865,1864;, + 3;4170,1789,1799;, + 3;1766,1799,1789;, + 3;1833,1832,1800;, + 3;1831,1800,1832;, + 3;1824,1822,1801;, + 3;1747,1823,1822;, + 3;4127,4171,1837;, + 3;1750,1837,4171;, + 3;1857,1855,1803;, + 3;4128,1856,1855;, + 3;4154,1781,4172;, + 3;4173,4174,4175;, + 3;1858,1860,1805;, + 3;4129,1859,1786;, + 3;1746,4176,1881;, + 3;1767,1806,1880;, + 3;4149,4177,1807;, + 3;4150,1882,4178;, + 3;4151,1850,1851;, + 3;4152,1849,4179;, + 3;1783,1781,1809;, + 3;4154,1809,1781;, + 3;4155,4180,1868;, + 3;4156,1867,4180;, + 3;1785,4181,1811;, + 3;4157,1811,4181;, + 3;1878,1876,1812;, + 3;4159,1877,1876;, + 3;2410,2426,2405;, + 3;4160,4182,1841;, + 3;4161,1840,4182;, + 3;1788,4183,1862;, + 3;4162,1861,4183;, + 3;1754,4184,1844;, + 3;4163,1843,4184;, + 3;4164,1874,1875;, + 3;4165,1873,4185;, + 3;4186,4187,4188;, + 3;4187,4186,4189;, + 3;4170,1799,1818;, + 3;4187,4189,4190;, + 3;2152,2456,2489;, + 3;2431,2300,2290;, + 3;2156,2126,2435;, + 3;2476,2301,2478;, + 3;2438,2764,2307;, + 3;2501,2485,2296;, + 3;2446,2311,2728;, + 3;2310,2447,2468;, + 3;2155,2436,2473;, + 3;2452,2293,2491;, + 3;2459,2118,2063;, + 3;2150,2465,2428;, + 3;2432,2466,2299;, + 3;2451,2492,2488;, + 3;2467,2448,2298;, + 3;2153,2500,2455;, + 3;2454,2496,2505;, + 3;2453,2506,2292;, + 3;2295,2482,2316;, + 3;2462,2494,2470;, + 3;2493,2463,2487;, + 3;2315,2483,2442;, + 3;2440,2503,2481;, + 3;2502,2441,2484;, + 3;2151,2486,2464;, + 3;2479,2498,2475;, + 3;2497,2480,2504;, + 3;2154,2474,2499;, + 3;2317,2490,2294;, + 3;2507,2366,2354;, + 3;2550,2340,2364;, + 3;2326,2544,2561;, + 3;2345,2519,2517;, + 3;2562,2325,2556;, + 3;2373,2530,2347;, + 3;2568,2324,2563;, + 3;2359,2538,2534;, + 3;2323,2569,2541;, + 3;2535,2380,2358;, + 3;2574,2528,2532;, + 3;2717,2543,2136;, + 3;2620,2599,2606;, + 3;2548,2339,2551;, + 3;2621,2629,2598;, + 3;2508,2555,2365;, + 3;2590,2634,2601;, + 3;2630,2625,2600;, + 3;2613,2589,2612;, + 3;2592,2582,2558;, + 3;2655,2616,2649;, + 3;2615,2656,2654;, + 3;2570,2579,2540;, + 3;2539,2580,2533;, + 3;2583,2567,2557;, + 3;2614,2650,2588;, + 3;2611,2581,2593;, + 3;2610,2594,2602;, + 3;2525,2608,2522;, + 3;2607,2526,2619;, + 3;2514,2596,2511;, + 3;2595,2515,2605;, + 3;2545,2632,2560;, + 3;2631,2546,2624;, + 3;2520,2604,2516;, + 3;2603,2521,2609;, + 3;2564,2645,2573;, + 3;2644,2565,2639;, + 3;2575,2618,2527;, + 3;2617,2576,2648;, + 3;2552,2623,2547;, + 3;2622,2553,2628;, + 3;2509,2627,2554;, + 3;2626,2510,2597;, + 3;2591,2559,2633;, + 3;2661,2647,2577;, + 3;2666,2572,2640;, + 3;2584,2638,2566;, + 3;2683,2676,2671;, + 3;2684,2682,2675;, + 3;2689,2681,2685;, + 3;2680,2690,2697;, + 3;2578,2571,2667;, + 3;2662,2660,2646;, + 3;2657,2687,2653;, + 3;2686,2658,2693;, + 3;2651,2669,2587;, + 3;2668,2652,2688;, + 3;2635,2678,2643;, + 3;2677,2636,2674;, + 3;2641,2695,2665;, + 3;2694,2642,2679;, + 3;2585,2673,2637;, + 3;2672,2586,2670;, + 3;2663,2692,2659;, + 3;2691,2664,2696;, + 3;1819,1791,1821;, + 3;1757,1820,1819;, + 3;2701,2120,2210;, + 3;2119,2702,2139;, + 3;1820,1791,1819;, + 3;1820,1821,1791;, + 3;1819,1821,4166;, + 3;1820,4166,1821;, + 3;1747,1822,4191;, + 3;4126,4191,1822;, + 3;1823,1801,1822;, + 3;1824,1801,1823;, + 3;4126,1822,1824;, + 3;4126,1824,1823;, + 3;4192,4167,1825;, + 3;4192,1825,4120;, + 3;1826,1827,4167;, + 3;1825,1792,1826;, + 3;1825,1827,1792;, + 3;1826,1792,1827;, + 3;1748,1828,4193;, + 3;1758,4193,1828;, + 3;1829,1793,1828;, + 3;1758,1830,1829;, + 3;1830,1793,1829;, + 3;1830,1828,1793;, + 3;4194,1831,4195;, + 3;4195,1831,4196;, + 3;1831,1832,4196;, + 3;4194,4196,1832;, + 3;4194,1832,1833;, + 3;4194,1833,1831;, + 3;4197,1753,1834;, + 3;4197,1834,1759;, + 3;1835,1796,1836;, + 3;1834,1796,1835;, + 3;1835,1836,1753;, + 3;1834,1753,1836;, + 3;1839,1837,1802;, + 3;1750,1838,1837;, + 3;1838,1802,1837;, + 3;1839,1802,1838;, + 3;4127,1837,1839;, + 3;4127,1839,1838;, + 3;1840,1814,1842;, + 3;4160,1841,1840;, + 3;1841,1814,1840;, + 3;1841,1842,1814;, + 3;1840,1842,4182;, + 3;1841,4182,1842;, + 3;1843,1845,4184;, + 3;1754,1844,1843;, + 3;1844,1816,1843;, + 3;1844,4184,1845;, + 3;1844,1845,1816;, + 3;1843,1816,1845;, + 3;1846,1848,4168;, + 3;4121,1847,1846;, + 3;1847,1795,1846;, + 3;1847,4168,1848;, + 3;1847,1848,1795;, + 3;1846,1795,1848;, + 3;1849,1808,1850;, + 3;4151,1851,1849;, + 3;1849,1850,4179;, + 3;4151,4179,1850;, + 3;1851,1808,1849;, + 3;1851,1850,1808;, + 3;1852,1854,4169;, + 3;4123,1853,1852;, + 3;1853,1797,1852;, + 3;1853,4169,1854;, + 3;1853,1854,1797;, + 3;1852,1797,1854;, + 3;4128,1855,4198;, + 3;1765,4198,1855;, + 3;1856,1803,1855;, + 3;1857,1803,1856;, + 3;1765,1855,1857;, + 3;1765,1857,1856;, + 3;4199,1786,1858;, + 3;4199,1858,4129;, + 3;1859,1805,1860;, + 3;1858,1805,1859;, + 3;1859,1860,1786;, + 3;1858,1786,1860;, + 3;1861,1815,1863;, + 3;1788,1862,1861;, + 3;1862,1815,1861;, + 3;1862,1863,1815;, + 3;1861,1863,4183;, + 3;1862,4183,1863;, + 3;4125,1864,4200;, + 3;1761,4200,1864;, + 3;1865,1798,1864;, + 3;1761,1866,1865;, + 3;1866,1798,1865;, + 3;1866,1864,1798;, + 3;1867,1869,4180;, + 3;4155,1868,1867;, + 3;1868,1810,1867;, + 3;1868,4180,1869;, + 3;1868,1869,1810;, + 3;1867,1810,1869;, + 3;4201,1780,1870;, + 3;4201,1870,1782;, + 3;1782,1871,1780;, + 3;1870,1780,1871;, + 3;1872,1794,1871;, + 3;1870,1794,1872;, + 3;1873,1817,1874;, + 3;4164,1875,1873;, + 3;1873,1874,4185;, + 3;4164,4185,1874;, + 3;1875,1817,1873;, + 3;1875,1874,1817;, + 3;4159,1876,4202;, + 3;4158,4202,1876;, + 3;1877,1812,1876;, + 3;1878,1812,1877;, + 3;4158,1876,1878;, + 3;4158,1878,1877;, + 3;1756,1879,4203;, + 3;1779,4203,1879;, + 3;4177,4178,1882;, + 3;1880,1881,4176;, + 3;1746,1881,1806;, + 3;1880,1806,1881;, + 3;4177,1882,1807;, + 3;4150,1807,1882;, + 3;2144,2705,2158;, + 3;2706,2125,2157;, + 3;2699,2201,2713;, + 3;2137,2708,2716;, + 3;2322,2542,2718;, + 3;2321,2719,2334;, + 3;2117,2460,2207;, + 3;2116,2208,2391;, + 3;2306,2759,2756;, + 3;2303,2314,2443;, + 3;2168,2235,2167;, + 3;2445,2729,2747;, + 3;2027,2731,2733;, + 3;2161,2741,2737;, + 3;2162,2283,2740;, + 3;1749,1763,1883;, + 3;2745,2023,2030;, + 3;2313,2304,2751;, + 3;2727,2312,2752;, + 3;2750,2305,2757;, + 3;2761,2722,2233;, + 3;2760,2234,2755;, + 3;2439,2765,2763;, + 3;2766,2721,2762;, + 3;2767,2128,2720;, + 3;4204,1884,4205;, + 3;4206,1885,4207;, + 3;2387,2427,2123;, + 3;1884,4206,4205;, + 3;4204,4206,1884;, + 3;1885,4204,4207;, + 3;4206,4204,1885;, + 3;1910,1887,1921;, + 3;1888,4208,1950;, + 3;1956,4209,1957;, + 3;1889,4210,1960;, + 3;3044,2796,2780;, + 3;2987,3083,2802;, + 3;2001,1913,2003;, + 3;4211,4212,1977;, + 3;1965,1890,1966;, + 3;2839,2838,2896;, + 3;3357,2790,3373;, + 3;3001,3013,3177;, + 3;4213,4214,1983;, + 3;1892,4215,1996;, + 3;1949,1897,1930;, + 3;3369,3366,2788;, + 3;2944,3395,3109;, + 3;2783,3384,2869;, + 3;3385,2825,3400;, + 3;3120,3092,3130;, + 3;1893,1891,1894;, + 3;1901,1902,1903;, + 3;2870,2039,2017;, + 3;3116,2866,2849;, + 3;3399,2816,3405;, + 3;2843,2888,2832;, + 3;2048,2049,2846;, + 3;2821,2943,2887;, + 3;2744,2031,2941;, + 3;3379,2834,2868;, + 3;2850,2055,2045;, + 3;2842,2826,2854;, + 3;2841,2855,2046;, + 3;2847,2836,2047;, + 3;2867,2835,2848;, + 3;2769,2069,2057;, + 3;2844,2067,3119;, + 3;2080,2071,2852;, + 3;2837,2840,2047;, + 3;2851,2072,2054;, + 3;2845,2050,2066;, + 3;2827,2079,2853;, + 3;2856,2861,3360;, + 3;3368,2781,2858;, + 3;2777,2863,3054;, + 3;2857,2782,2860;, + 3;1964,1962,1931;, + 3;2878,2877,2018;, + 3;2828,2089,2078;, + 3;2871,2033,2038;, + 3;2085,2882,2019;, + 3;2940,2032,2872;, + 3;3380,2895,2833;, + 3;2912,2901,2938;, + 3;2917,2926,2935;, + 3;2907,2916,2932;, + 3;2902,2921,2936;, + 3;2922,2931,2934;, + 3;2820,2883,2904;, + 3;2905,2898,2819;, + 3;2831,2889,2914;, + 3;2915,2908,2830;, + 3;2876,2879,2924;, + 3;2925,2918,2875;, + 3;2088,2829,2909;, + 3;2910,2928,2087;, + 3;2881,2086,2929;, + 3;2930,2923,2880;, + 3;2885,2874,2919;, + 3;2920,2903,2884;, + 3;2891,2818,2899;, + 3;2900,2913,2890;, + 3;2933,2927,2911;, + 3;2937,2897,2906;, + 3;2824,3386,2735;, + 3;2886,2939,2873;, + 3;2799,3090,2815;, + 3;2953,2947,3104;, + 3;2800,2945,3089;, + 3;2965,3154,3126;, + 3;3093,3415,2785;, + 3;3131,2964,3096;, + 3;3136,3103,2962;, + 3;3388,3393,2025;, + 3;4216,4217,1954;, + 3;1900,1901,3417;, + 3;4218,4219,1969;, + 3;2014,1893,1894;, + 3;1896,4220,1987;, + 3;1895,1915,1935;, + 3;1989,4221,1990;, + 3;1908,1894,1891;, + 3;1749,1894,1752;, + 3;1746,1898,1937;, + 3;3417,1906,1899;, + 3;1902,1901,1900;, + 3;4222,4223,4224;, + 3;1909,4225,4226;, + 3;4135,4137,4227;, + 3;4227,4228,4135;, + 3;4137,4229,4230;, + 3;4230,4227,4137;, + 3;4231,4232,1904;, + 3;1907,4230,4229;, + 3;1905,4226,4225;, + 3;4233,1904,4232;, + 3;4223,4135,4228;, + 3;4228,4224,4223;, + 3;4232,1905,4233;, + 3;1906,3417,4234;, + 3;4225,4233,1905;, + 3;1904,1907,4231;, + 3;4235,1900,3417;, + 3;2801,1908,1891;, + 3;4229,4231,1907;, + 3;4235,3417,1899;, + 3;4224,1909,4222;, + 3;4236,4237,1938;, + 3;4226,4222,1909;, + 3;3374,2989,3371;, + 3;2975,3208,3000;, + 3;4238,4239,1980;, + 3;2802,3364,2991;, + 3;3370,2990,3365;, + 3;3183,3006,3182;, + 3;1914,4240,1940;, + 3;2982,2996,2805;, + 3;2995,2986,3011;, + 3;3012,3002,2994;, + 3;3021,2804,2997;, + 3;3024,3010,2983;, + 3;3033,2993,3003;, + 3;3028,3195,3043;, + 3;3196,2793,3017;, + 3;4241,4242,1998;, + 3;2984,3019,3023;, + 3;3176,3008,3171;, + 3;2803,3022,3020;, + 3;3194,3029,3185;, + 3;3004,3031,3037;, + 3;1916,4243,1942;, + 3;3046,3035,3039;, + 3;3041,3016,2794;, + 3;3038,3036,3032;, + 3;2795,3045,3040;, + 3;4244,4245,2008;, + 3;2992,3034,3047;, + 3;3051,3059,2093;, + 3;3052,2773,3058;, + 3;2110,3056,2059;, + 3;3050,2094,3070;, + 3;3064,2776,3049;, + 3;1886,1918,1944;, + 3;3068,2104,3080;, + 3;3081,3071,3067;, + 3;3060,3066,3072;, + 3;3073,3074,3063;, + 3;3077,3062,3075;, + 3;3076,2105,3079;, + 3;2100,3078,2106;, + 3;4246,4247,1971;, + 3;1919,4248,1992;, + 3;4249,4250,1974;, + 3;2103,3069,2095;, + 3;2774,2058,3057;, + 3;2111,2092,3055;, + 3;4251,4252,2004;, + 3;3082,2974,4253;, + 3;1910,1921,2010;, + 3;1887,2010,1921;, + 3;1888,1951,4254;, + 3;4208,4254,1950;, + 3;1956,1958,4255;, + 3;4209,4255,1957;, + 3;1889,1961,1959;, + 3;4210,1959,1960;, + 3;2001,1925,2002;, + 3;1913,2002,2003;, + 3;4211,1978,4256;, + 3;4212,4256,1977;, + 3;1965,1927,1967;, + 3;1890,4257,1966;, + 3;4213,1984,4258;, + 3;4214,4258,1983;, + 3;1892,1997,1995;, + 3;4215,1995,1996;, + 3;4259,1930,1920;, + 3;1897,1920,1930;, + 3;1964,1931,1963;, + 3;1962,1963,1931;, + 3;1955,1932,1953;, + 3;4217,1953,1954;, + 3;4218,1968,4260;, + 3;4219,4260,1968;, + 3;1988,1934,1986;, + 3;4220,1986,1987;, + 3;4240,4261,1912;, + 3;3018,2985,3084;, + 3;1989,1936,1991;, + 3;4221,1917,1990;, + 3;1746,2012,4176;, + 3;1898,2011,1937;, + 3;4236,1938,4262;, + 3;4237,4178,2013;, + 3;4238,1982,1981;, + 3;4239,4263,1980;, + 3;1914,1940,1912;, + 3;4240,1912,1940;, + 3;4241,1999,4264;, + 3;4242,4264,1998;, + 3;1916,1942,4265;, + 3;4243,4265,1942;, + 3;2009,1943,2007;, + 3;4245,2007,2008;, + 3;3065,3061,3086;, + 3;4246,1972,4266;, + 3;4247,4266,1971;, + 3;1919,1993,4267;, + 3;4248,4267,1992;, + 3;4249,1975,4268;, + 3;4250,4268,1974;, + 3;4251,2006,2005;, + 3;4252,4269,2004;, + 3;4270,4271,4272;, + 3;4272,4273,4270;, + 3;4259,1949,1930;, + 3;4272,4274,4273;, + 3;2812,3148,3115;, + 3;3088,2946,2954;, + 3;2808,3098,2786;, + 3;3132,3140,2963;, + 3;3095,2957,3411;, + 3;3160,2952,3144;, + 3;3107,3390,2972;, + 3;2973,3127,3106;, + 3;2809,3135,3097;, + 3;3113,3152,2950;, + 3;3118,2068,2770;, + 3;2814,3091,3121;, + 3;3087,2955,3129;, + 3;3114,3145,3151;, + 3;3128,2956,3105;, + 3;2811,3110,3159;, + 3;3111,3162,3158;, + 3;3112,2951,3161;, + 3;2948,2967,3143;, + 3;3124,3125,3149;, + 3;3150,3146,3123;, + 3;2968,3100,3142;, + 3;3102,3137,3164;, + 3;3165,3141,3101;, + 3;2813,3122,3147;, + 3;3139,3133,3156;, + 3;3157,3163,3138;, + 3;2810,3155,3134;, + 3;2966,2949,3153;, + 3;3170,3009,3025;, + 3;3209,3027,2998;, + 3;2976,3220,3207;, + 3;3007,3172,3181;, + 3;3221,3219,2977;, + 3;3030,3005,3184;, + 3;3227,3226,2978;, + 3;3014,3191,3202;, + 3;2979,3199,3232;, + 3;3190,3015,3042;, + 3;3233,3193,3186;, + 3;3377,2792,3197;, + 3;3279,3265,3258;, + 3;3203,3214,2999;, + 3;3284,3254,3288;, + 3;3169,3026,3210;, + 3;3249,3263,3293;, + 3;3292,3264,3280;, + 3;3272,3271,3248;, + 3;3252,3217,3246;, + 3;3314,3308,3276;, + 3;3277,3313,3319;, + 3;3231,3200,3235;, + 3;3201,3192,3234;, + 3;3245,3218,3222;, + 3;3278,3240,3312;, + 3;3266,3251,3247;, + 3;3267,3262,3250;, + 3;3189,3178,3269;, + 3;3270,3273,3188;, + 3;3175,3166,3256;, + 3;3257,3259,3174;, + 3;3206,3215,3290;, + 3;3291,3281,3205;, + 3;3180,3173,3260;, + 3;3261,3268,3179;, + 3;3225,3228,3304;, + 3;3299,3298,3224;, + 3;3239,3187,3274;, + 3;3275,3305,3238;, + 3;3213,3204,3282;, + 3;3283,3285,3212;, + 3;3168,3211,3286;, + 3;3287,3255,3167;, + 3;3253,3289,3216;, + 3;3320,3237,3306;, + 3;3322,3303,3229;, + 3;3244,3223,3294;, + 3;3342,3330,3335;, + 3;3347,3331,3341;, + 3;3348,3346,3336;, + 3;3337,3356,3352;, + 3;3236,3321,3230;, + 3;3326,3307,3315;, + 3;3318,3309,3344;, + 3;3345,3349,3317;, + 3;3311,3241,3328;, + 3;3329,3343,3310;, + 3;3297,3300,3339;, + 3;3340,3332,3296;, + 3;3302,3323,3354;, + 3;3355,3338,3301;, + 3;3243,3295,3333;, + 3;3334,3327,3242;, + 3;3325,3316,3350;, + 3;3351,3353,3324;, + 3;1950,1952,1922;, + 3;1888,1950,1951;, + 3;3359,2862,2778;, + 3;2779,2789,3358;, + 3;1951,1950,1922;, + 3;1951,1922,1952;, + 3;1950,4254,1952;, + 3;1951,1952,4254;, + 3;4217,4275,1953;, + 3;4216,1953,4275;, + 3;1954,1953,1932;, + 3;1955,1954,1932;, + 3;4216,1955,1953;, + 3;4216,1954,1955;, + 3;4276,1956,4255;, + 3;4276,4209,1956;, + 3;1957,4255,1958;, + 3;1956,1957,1923;, + 3;1956,1923,1958;, + 3;1957,1958,1923;, + 3;4210,4277,1959;, + 3;1889,1959,4277;, + 3;1960,1959,1924;, + 3;1889,1960,1961;, + 3;1961,1960,1924;, + 3;1961,1924,1959;, + 3;4278,4279,1962;, + 3;4279,4280,1962;, + 3;1962,4280,1963;, + 3;4278,1963,4280;, + 3;4278,1964,1963;, + 3;4278,1962,1964;, + 3;4281,1965,4257;, + 3;4281,1890,1965;, + 3;1966,1967,1927;, + 3;1965,1966,1927;, + 3;1966,4257,1967;, + 3;1965,1967,4257;, + 3;1970,1933,1968;, + 3;4219,1968,1969;, + 3;1969,1968,1933;, + 3;1970,1969,1933;, + 3;4218,1970,1968;, + 3;4218,1969,1970;, + 3;1971,1973,1945;, + 3;4246,1971,1972;, + 3;1972,1971,1945;, + 3;1972,1945,1973;, + 3;1971,4266,1973;, + 3;1972,1973,4266;, + 3;1974,4268,1976;, + 3;4249,1974,1975;, + 3;1975,1974,1947;, + 3;1975,1976,4268;, + 3;1975,1947,1976;, + 3;1974,1976,1947;, + 3;1977,4256,1979;, + 3;4211,1977,1978;, + 3;1978,1977,1926;, + 3;1978,1979,4256;, + 3;1978,1926,1979;, + 3;1977,1979,1926;, + 3;1980,1981,1939;, + 3;4238,1980,1982;, + 3;1980,4263,1981;, + 3;4238,1981,4263;, + 3;1982,1980,1939;, + 3;1982,1939,1981;, + 3;1983,4258,1985;, + 3;4213,1983,1984;, + 3;1984,1983,1928;, + 3;1984,1985,4258;, + 3;1984,1928,1985;, + 3;1983,1985,1928;, + 3;4220,4282,1986;, + 3;1896,1986,4282;, + 3;1987,1986,1934;, + 3;1988,1987,1934;, + 3;1896,1988,1986;, + 3;1896,1987,1988;, + 3;4283,1989,1917;, + 3;4283,4221,1989;, + 3;1990,1991,1936;, + 3;1989,1990,1936;, + 3;1990,1917,1991;, + 3;1989,1991,1917;, + 3;1992,1994,1946;, + 3;1919,1992,1993;, + 3;1993,1992,1946;, + 3;1993,1946,1994;, + 3;1992,4267,1994;, + 3;1993,1994,4267;, + 3;4215,4284,1995;, + 3;1892,1995,4284;, + 3;1996,1995,1929;, + 3;1892,1996,1997;, + 3;1997,1996,1929;, + 3;1997,1929,1995;, + 3;1998,4264,2000;, + 3;1915,4285,4286;, + 3;1999,1998,1941;, + 3;1999,2000,4264;, + 3;1999,1941,2000;, + 3;1998,2000,1941;, + 3;4287,2001,1911;, + 3;4287,1913,2001;, + 3;1913,1911,2002;, + 3;2001,2002,1911;, + 3;2003,2002,1925;, + 3;2001,2003,1925;, + 3;2004,2005,1948;, + 3;4251,2004,2006;, + 3;2004,4269,2005;, + 3;4251,2005,4269;, + 3;2006,2004,1948;, + 3;2006,1948,2005;, + 3;4245,4288,2007;, + 3;4244,2007,4288;, + 3;2008,2007,1943;, + 3;2009,2008,1943;, + 3;4244,2009,2007;, + 3;4244,2008,2009;, + 3;1887,4289,2010;, + 3;1910,2010,4289;, + 3;4262,2013,4178;, + 3;2011,4176,2012;, + 3;1746,1937,2012;, + 3;2011,2012,1937;, + 3;4262,1938,2013;, + 3;4237,2013,1938;, + 3;2798,2806,3363;, + 3;3362,2807,2787;, + 3;3361,3367,2859;, + 3;2791,3378,3372;, + 3;2980,3376,3198;, + 3;2981,2988,3375;, + 3;2771,2865,3117;, + 3;2772,3053,2864;, + 3;2958,3402,3410;, + 3;2961,3099,2969;, + 3;2893,2817,2892;, + 3;3108,3392,3389;, + 3;2026,2734,3387;, + 3;2823,2736,2742;, + 3;2822,2743,2942;, + 3;1749,2014,1894;, + 3;3394,2029,2024;, + 3;2970,3397,2960;, + 3;3391,3396,2971;, + 3;3398,3401,2959;, + 3;3408,2894,3381;, + 3;3409,3403,2893;, + 3;3094,3406,3414;, + 3;3413,3407,3382;, + 3;3412,3383,2784;, + 3;4290,4291,2015;, + 3;4292,4293,2016;, + 3;3048,2775,3085;, + 3;2015,4291,4294;, + 3;4290,2015,4294;, + 3;2016,4293,4295;, + 3;4292,2016,4295;, + 3;2017,2040,2022;, + 3;2017,2039,2040;, + 3;2018,2870,2017;, + 3;2018,2877,2870;, + 3;2019,2878,2018;, + 3;2019,2882,2878;, + 3;2020,2085,2019;, + 3;2020,2084,2085;, + 3;2021,2223,2020;, + 3;2021,2222,2223;, + 3;2022,2215,2021;, + 3;2022,2214,2215;, + 3;2019,2017,2020;, + 3;2020,2017,2022;, + 3;2020,2022,2021;, + 3;2017,2019,2018;, + 3;2023,2746,2028;, + 3;2023,2745,2746;, + 3;2024,2030,2023;, + 3;2024,2029,2030;, + 3;2025,3394,2024;, + 3;2025,3393,3394;, + 3;2026,3388,2025;, + 3;2026,3387,3388;, + 3;2027,2734,2026;, + 3;2027,2733,2734;, + 3;2028,2731,2027;, + 3;2028,2730,2731;, + 3;2025,2028,2026;, + 3;2026,2028,2027;, + 3;2028,2025,2024;, + 3;2028,2024,2023;, + 3;2029,2014,1749;, + 3;2029,3394,2014;, + 3;1749,2745,2030;, + 3;1749,1883,2745;, + 3;1749,2030,2029;, + 3;2031,2739,2036;, + 3;2031,2744,2739;, + 3;2032,2941,2031;, + 3;2032,2940,2941;, + 3;2033,2872,2032;, + 3;2033,2871,2872;, + 3;2034,2038,2033;, + 3;2034,2037,2038;, + 3;2035,2221,2034;, + 3;2035,2220,2221;, + 3;2036,2285,2035;, + 3;2036,2284,2285;, + 3;2031,2036,2034;, + 3;2031,2034,2033;, + 3;2031,2033,2032;, + 3;2034,2036,2035;, + 3;2037,2214,2040;, + 3;2037,2221,2214;, + 3;2039,2871,2038;, + 3;2039,2870,2871;, + 3;2039,2038,2040;, + 3;2040,2038,2037;, + 3;2041,2049,2048;, + 3;2041,2052,2049;, + 3;2042,2190,2041;, + 3;2042,2189,2190;, + 3;2042,2177,2178;, + 3;2043,2187,2042;, + 3;2043,2186,2187;, + 3;2044,2195,2043;, + 3;2044,2194,2195;, + 3;2045,2056,2044;, + 3;2045,2055,2056;, + 3;2046,2850,2045;, + 3;2046,2855,2850;, + 3;2047,2841,2046;, + 3;2047,2840,2841;, + 3;2047,2836,2837;, + 3;2048,2847,2047;, + 3;2048,2846,2847;, + 3;2045,2044,2048;, + 3;2045,2048,2046;, + 3;2046,2048,2047;, + 3;2048,2044,2041;, + 3;2041,2044,2043;, + 3;2041,2043,2042;, + 3;2050,2846,2049;, + 3;2050,2845,2846;, + 3;2051,2066,2050;, + 3;2051,2065,2066;, + 3;2052,2191,2051;, + 3;2052,2190,2191;, + 3;2050,2049,2051;, + 3;2051,2049,2052;, + 3;2053,2194,2056;, + 3;2053,2199,2194;, + 3;2054,2073,2053;, + 3;2054,2072,2073;, + 3;2055,2851,2054;, + 3;2055,2850,2851;, + 3;2055,2054,2056;, + 3;2056,2054,2053;, + 3;2057,2070,2062;, + 3;2057,2069,2070;, + 3;2058,2769,2057;, + 3;2058,2774,2769;, + 3;2059,3057,2058;, + 3;2059,3056,3057;, + 3;2060,2110,2059;, + 3;2060,2109,2110;, + 3;2061,2399,2060;, + 3;2061,2398,2399;, + 3;2062,2114,2061;, + 3;2062,2113,2114;, + 3;2057,2062,2058;, + 3;2058,2062,2061;, + 3;2058,2061,2059;, + 3;2059,2061,2060;, + 3;2063,2113,2070;, + 3;2063,2118,2113;, + 3;2064,2459,2063;, + 3;2064,2458,2459;, + 3;2065,2192,2064;, + 3;2065,2191,2192;, + 3;2067,2845,2066;, + 3;2067,2844,2845;, + 3;2068,3119,2067;, + 3;2068,3118,3119;, + 3;2069,2770,2068;, + 3;2069,2769,2770;, + 3;2066,2065,2069;, + 3;2066,2069,2068;, + 3;2066,2068,2067;, + 3;2069,2065,2070;, + 3;2070,2065,2063;, + 3;2063,2065,2064;, + 3;2071,2075,2074;, + 3;2071,2080,2075;, + 3;2072,2852,2071;, + 3;2072,2851,2852;, + 3;2074,2199,2073;, + 3;2074,2198,2199;, + 3;2072,2071,2073;, + 3;2073,2071,2074;, + 3;2076,2198,2075;, + 3;2076,2197,2198;, + 3;2077,2174,2076;, + 3;2077,2173,2174;, + 3;2078,2090,2077;, + 3;2078,2089,2090;, + 3;2079,2828,2078;, + 3;2079,2827,2828;, + 3;2080,2853,2079;, + 3;2080,2852,2853;, + 3;2078,2077,2079;, + 3;2079,2077,2076;, + 3;2079,2076,2080;, + 3;2080,2076,2075;, + 3;2081,2173,2090;, + 3;2081,2172,2173;, + 3;2082,2254,2081;, + 3;2082,2253,2254;, + 3;2083,2273,2082;, + 3;2083,2272,2273;, + 3;2084,2224,2083;, + 3;2084,2223,2224;, + 3;2086,2882,2085;, + 3;2086,2881,2882;, + 3;2087,2929,2086;, + 3;2087,2928,2929;, + 3;2088,2910,2087;, + 3;2088,2909,2910;, + 3;2089,2829,2088;, + 3;2089,2828,2829;, + 3;2085,2084,2090;, + 3;2085,2090,2089;, + 3;2085,2089,2086;, + 3;2086,2089,2087;, + 3;2087,2089,2088;, + 3;2090,2084,2083;, + 3;2090,2083,2082;, + 3;2090,2082,2081;, + 3;2091,2401,2098;, + 3;2091,2400,2401;, + 3;2092,2112,2091;, + 3;2092,2111,2112;, + 3;2093,3055,2092;, + 3;2093,3059,3055;, + 3;4296,3051,2093;, + 3;4296,4297,3051;, + 3;4298,3070,2094;, + 3;4298,4299,3070;, + 3;2096,2103,2095;, + 3;2096,2102,2103;, + 3;2097,4300,4301;, + 3;2097,2412,4300;, + 3;2098,4302,4303;, + 3;2098,2393,4302;, + 3;4304,4305,4298;, + 3;4304,4298,2094;, + 3;4298,4305,4301;, + 3;4301,4305,2097;, + 3;2098,2093,2092;, + 3;2098,2092,2091;, + 3;2099,4306,4307;, + 3;2099,2421,4306;, + 3;2100,2107,2099;, + 3;2100,2106,2107;, + 3;4307,3078,2100;, + 3;4307,4308,3078;, + 3;4307,2100,2099;, + 3;2101,21,8;, + 3;2101,2423,21;, + 3;2102,2407,2101;, + 3;2102,2406,2407;, + 3;2104,3069,2103;, + 3;2104,3068,3069;, + 3;8,3080,2104;, + 3;8,151,3080;, + 3;8,2102,2101;, + 3;8,2103,2102;, + 3;8,2104,2103;, + 3;2105,4309,4310;, + 3;2105,3076,4309;, + 3;2106,3079,2105;, + 3;2106,3078,3079;, + 3;2108,2421,2107;, + 3;2108,2420,2421;, + 3;4310,2416,2108;, + 3;4310,4311,2416;, + 3;4310,2106,2105;, + 3;4310,2107,2106;, + 3;4310,2108,2107;, + 3;4312,2400,2112;, + 3;4312,4313,2400;, + 3;2111,4314,4315;, + 3;2111,3055,4314;, + 3;4315,4312,2111;, + 3;2111,4312,2112;, + 3;4316,2398,2114;, + 3;2115,2397,4317;, + 3;2116,2392,2115;, + 3;2116,2391,2392;, + 3;2117,4318,4319;, + 3;2117,2207,4318;, + 3;2118,2460,2117;, + 3;2118,2459,2460;, + 3;2114,2118,2117;, + 3;2114,2117,4316;, + 3;4316,2117,4319;, + 3;2118,2114,2113;, + 3;2119,4320,4321;, + 3;2119,2139,4320;, + 3;2120,2702,2119;, + 3;2120,2701,2702;, + 3;2121,2210,2120;, + 3;2121,2209,2210;, + 3;4322,2396,2121;, + 3;4322,4323,2396;, + 3;1755,2411,2122;, + 3;1755,1787,2411;, + 3;2123,1813,1755;, + 3;2123,2427,1813;, + 3;2124,2387,2123;, + 3;2124,2386,2387;, + 3;1755,2124,2123;, + 3;4324,2119,4321;, + 3;4324,2120,2119;, + 3;4324,2121,2120;, + 3;4324,4322,2121;, + 3;2125,4325,4326;, + 3;2125,2706,4325;, + 3;2126,2157,2125;, + 3;2126,2156,2157;, + 3;2127,2435,2126;, + 3;2127,2434,2435;, + 3;2128,2768,2127;, + 3;2128,2767,2768;, + 3;2129,2720,2128;, + 3;2129,2725,2720;, + 3;2130,2213,2129;, + 3;2130,2212,2213;, + 3;4327,2203,2130;, + 3;2131,2202,4328;, + 3;2132,2712,2131;, + 3;2132,2711,2712;, + 3;4326,2127,2126;, + 3;4326,2126,2125;, + 3;2127,4326,4327;, + 3;2127,4327,2128;, + 3;2128,4327,2130;, + 3;2128,2130,2129;, + 3;2133,4329,4320;, + 3;2133,2390,4329;, + 3;2134,2382,2133;, + 3;2134,2381,2382;, + 3;2135,2357,2134;, + 3;2135,2360,2357;, + 3;2136,2537,2135;, + 3;2136,2543,2537;, + 3;2137,2717,2136;, + 3;2137,2716,2717;, + 3;2138,2708,2137;, + 3;2138,2714,2708;, + 3;2139,2698,2138;, + 3;2139,2702,2698;, + 3;2134,2133,2135;, + 3;2135,2133,4320;, + 3;2135,4320,2136;, + 3;2136,4320,2139;, + 3;2136,2139,2137;, + 3;2137,2139,2138;, + 3;2141,2425,2146;, + 3;2141,2424,2425;, + 3;2141,4146,2318;, + 3;4330,1760,1777;, + 3;2142,1762,1760;, + 3;2142,2291,1762;, + 3;2143,2430,2142;, + 3;2143,2429,2430;, + 3;2144,2159,2143;, + 3;2144,2158,2159;, + 3;2145,2705,2144;, + 3;2145,2704,2705;, + 3;2146,2331,4331;, + 3;2146,2330,2331;, + 3;1760,2143,2142;, + 3;1760,2144,2143;, + 3;1760,2145,2144;, + 3;1760,4330,2145;, + 3;2145,4330,4153;, + 3;2147,4332,4333;, + 3;2147,2320,4332;, + 3;2148,2342,2147;, + 3;2148,2341,2342;, + 3;2149,2363,2148;, + 3;2149,2369,2363;, + 3;4333,2361,2149;, + 3;4333,4173,2361;, + 3;4333,2148,2147;, + 3;4333,2149,2148;, + 3;2150,2429,2159;, + 3;2150,2428,2429;, + 3;2151,2465,2150;, + 3;2151,2464,2465;, + 3;2152,4334,4335;, + 3;2152,2489,4334;, + 3;2153,2456,2152;, + 3;2153,2455,2456;, + 3;4336,2500,2153;, + 3;4336,4337,2500;, + 3;2155,2474,2154;, + 3;2155,2473,2474;, + 3;2156,2436,2155;, + 3;2156,2435,2436;, + 3;2158,2706,2157;, + 3;2158,2705,2706;, + 3;2158,2154,4338;, + 3;2158,4338,4339;, + 3;2158,4339,2151;, + 3;2158,2151,2150;, + 3;2158,2150,2159;, + 3;2154,2158,2155;, + 3;2155,2158,2157;, + 3;2155,2157,2156;, + 3;2160,2726,2169;, + 3;2160,2732,2726;, + 3;2161,2738,2160;, + 3;2161,2737,2738;, + 3;2162,2741,2161;, + 3;2162,2740,2741;, + 3;2163,2283,2162;, + 3;2163,2287,2283;, + 3;2164,2231,2163;, + 3;2164,2230,2231;, + 3;2165,2249,2164;, + 3;2165,2248,2249;, + 3;2166,2243,2165;, + 3;2166,2242,2243;, + 3;2167,2236,2166;, + 3;2167,2235,2236;, + 3;2168,2754,2235;, + 3;2168,2758,2754;, + 3;2169,2749,2168;, + 3;2169,2753,2749;, + 3;2167,2165,2164;, + 3;2167,2164,2163;, + 3;2167,2163,2168;, + 3;2168,2163,2162;, + 3;2168,2162,2169;, + 3;2169,2162,2161;, + 3;2169,2161,2160;, + 3;2165,2167,2166;, + 3;2170,2239,2176;, + 3;2170,2238,2239;, + 3;2171,2259,2170;, + 3;2171,2258,2259;, + 3;2172,2255,2171;, + 3;2172,2254,2255;, + 3;2175,2197,2174;, + 3;2175,2196,2197;, + 3;2176,2185,2175;, + 3;2176,2184,2185;, + 3;2171,2176,2172;, + 3;2172,2176,2174;, + 3;2172,2174,2173;, + 3;2174,2176,2175;, + 3;2176,2171,2170;, + 3;2177,2183,2182;, + 3;2177,2187,2183;, + 3;2179,2189,2178;, + 3;2179,2188,2189;, + 3;2180,2205,2179;, + 3;2180,2204,2205;, + 3;2181,2724,2180;, + 3;2181,2723,2724;, + 3;2182,2232,2181;, + 3;2182,2240,2232;, + 3;2179,2178,2180;, + 3;2180,2178,2177;, + 3;2180,2177,2182;, + 3;2180,2182,2181;, + 3;2184,2240,2183;, + 3;2184,2239,2240;, + 3;2186,2196,2185;, + 3;2186,2195,2196;, + 3;2185,2187,2186;, + 3;2187,2185,2183;, + 3;2183,2185,2184;, + 3;2188,2206,2193;, + 3;2188,2205,2206;, + 3;2193,2458,2192;, + 3;2193,2457,2458;, + 3;2189,2193,2192;, + 3;2189,2192,2190;, + 3;2190,2192,2191;, + 3;2193,2189,2188;, + 3;2199,2195,2194;, + 3;2195,2199,2198;, + 3;2195,2198,2197;, + 3;2195,2197,2196;, + 3;2200,2211,4328;, + 3;2203,4340,2212;, + 3;2201,2700,2200;, + 3;2201,2699,2700;, + 3;2202,2713,2201;, + 3;2202,2712,2713;, + 3;4328,2201,2200;, + 3;2201,4328,2202;, + 3;2204,2725,2213;, + 3;2204,2724,2725;, + 3;2207,2457,2206;, + 3;2207,2460,2457;, + 3;2209,2391,2208;, + 3;2209,2396,2391;, + 3;2211,2701,2210;, + 3;2211,2700,2701;, + 3;2205,2207,2206;, + 3;2207,2205,2204;, + 3;2207,2204,4318;, + 3;4318,2204,4340;, + 3;2208,2211,2209;, + 3;2209,2211,2210;, + 3;4340,2204,2212;, + 3;2212,2204,2213;, + 3;2216,2222,2215;, + 3;2216,2226,2222;, + 3;2217,2267,2216;, + 3;2217,2266,2267;, + 3;2218,2265,2217;, + 3;2218,2264,2265;, + 3;2219,2228,2218;, + 3;2219,2227,2228;, + 3;2220,2286,2219;, + 3;2220,2285,2286;, + 3;2218,2216,2219;, + 3;2219,2216,2220;, + 3;2220,2216,2215;, + 3;2220,2215,2221;, + 3;2221,2215,2214;, + 3;2216,2218,2217;, + 3;2225,2272,2224;, + 3;2225,2271,2272;, + 3;2226,2268,2225;, + 3;2226,2267,2268;, + 3;2222,2226,2225;, + 3;2222,2225,2224;, + 3;2222,2224,2223;, + 3;2227,2287,2231;, + 3;2227,2286,2287;, + 3;2229,2264,2228;, + 3;2229,2263,2264;, + 3;2230,2250,2229;, + 3;2230,2249,2250;, + 3;2227,2231,2228;, + 3;2228,2231,2229;, + 3;2229,2231,2230;, + 3;2233,2723,2232;, + 3;2233,2722,2723;, + 3;2234,2761,2233;, + 3;2234,2760,2761;, + 3;2235,2754,2234;, + 3;2234,2754,2755;, + 3;2237,2242,2236;, + 3;2237,2241,2242;, + 3;2238,2260,2237;, + 3;2238,2259,2260;, + 3;2237,2236,2238;, + 3;2238,2236,2235;, + 3;2238,2235,2239;, + 3;2239,2235,2234;, + 3;2239,2234,2232;, + 3;2239,2232,2240;, + 3;2232,2234,2233;, + 3;2241,2256,2245;, + 3;2241,2260,2256;, + 3;2244,2248,2243;, + 3;2244,2247,2248;, + 3;2245,2276,2244;, + 3;2245,2282,2276;, + 3;2242,2241,2243;, + 3;2243,2241,2244;, + 3;2244,2241,2245;, + 3;2246,2263,2250;, + 3;2246,2262,2263;, + 3;2247,2277,2246;, + 3;2247,2276,2277;, + 3;2246,2250,2247;, + 3;2247,2250,2249;, + 3;2247,2249,2248;, + 3;2251,2258,2255;, + 3;2251,2257,2258;, + 3;2252,2281,2251;, + 3;2252,2280,2281;, + 3;2253,2274,2252;, + 3;2253,2273,2274;, + 3;2255,2252,2251;, + 3;2252,2255,2254;, + 3;2252,2254,2253;, + 3;2257,2282,2256;, + 3;2257,2281,2282;, + 3;2257,2259,2258;, + 3;2259,2257,2256;, + 3;2259,2256,2260;, + 3;2261,2266,2265;, + 3;2261,2270,2266;, + 3;2262,2278,2261;, + 3;2262,2277,2278;, + 3;2265,2263,2262;, + 3;2265,2262,2261;, + 3;2263,2265,2264;, + 3;2269,2271,2268;, + 3;2269,2275,2271;, + 3;2270,2279,2269;, + 3;2270,2278,2279;, + 3;2270,2269,2268;, + 3;2270,2268,2266;, + 3;2266,2268,2267;, + 3;2275,2280,2274;, + 3;2275,2279,2280;, + 3;2275,2273,2271;, + 3;2271,2273,2272;, + 3;2273,2275,2274;, + 3;2279,2278,2280;, + 3;2280,2278,2282;, + 3;2280,2282,2281;, + 3;2282,2278,2276;, + 3;2276,2278,2277;, + 3;2284,2740,2283;, + 3;2284,2739,2740;, + 3;2286,2283,2287;, + 3;2283,2286,2285;, + 3;2283,2285,2284;, + 3;2288,1883,1762;, + 3;2288,2748,1883;, + 3;2289,2450,2288;, + 3;2289,2449,2450;, + 3;2290,2297,2289;, + 3;2290,2300,2297;, + 3;2291,2431,2290;, + 3;2291,2430,2431;, + 3;1762,2289,2288;, + 3;1762,2290,2289;, + 3;1762,2291,2290;, + 3;2292,2501,2296;, + 3;2292,2506,2501;, + 3;2293,2453,2292;, + 3;2293,2452,2453;, + 3;2294,2491,2293;, + 3;2294,2490,2491;, + 3;2295,2317,2294;, + 3;2295,2316,2317;, + 3;2296,2482,2295;, + 3;2296,2485,2482;, + 3;2293,2296,2294;, + 3;2294,2296,2295;, + 3;2296,2293,2292;, + 3;2298,2449,2297;, + 3;2298,2448,2449;, + 3;2299,2467,2298;, + 3;2299,2466,2467;, + 3;2300,2432,2299;, + 3;2300,2431,2432;, + 3;2297,2299,2298;, + 3;2299,2297,2300;, + 3;2301,2472,2308;, + 3;2301,2476,2472;, + 3;2302,2478,2301;, + 3;2302,2477,2478;, + 3;2303,2444,2302;, + 3;2303,2443,2444;, + 3;2304,2314,2303;, + 3;2304,2313,2314;, + 3;2305,2751,2304;, + 3;2305,2750,2751;, + 3;2306,2757,2305;, + 3;2306,2756,2757;, + 3;2307,2759,2306;, + 3;2307,2764,2759;, + 3;2308,2438,2307;, + 3;2308,2437,2438;, + 3;2306,2302,2307;, + 3;2307,2302,2301;, + 3;2307,2301,2308;, + 3;2302,2306,2305;, + 3;2302,2305,2304;, + 3;2302,2304,2303;, + 3;4341,2490,2317;, + 3;4341,4342,2490;, + 3;2310,2469,2309;, + 3;2310,2468,2469;, + 3;2311,2447,2310;, + 3;2311,2446,2447;, + 3;2312,2728,2311;, + 3;2312,2727,2728;, + 3;2313,2752,2312;, + 3;2313,2751,2752;, + 3;2315,2443,2314;, + 3;2315,2442,2443;, + 3;4343,2483,2315;, + 3;2316,2482,4344;, + 3;2312,2315,2314;, + 3;2312,2314,2313;, + 3;2315,2312,2311;, + 3;2315,2311,4343;, + 3;4343,2311,2310;, + 3;2316,4345,2317;, + 3;2317,4345,4341;, + 3;4146,2424,2318;, + 3;4146,4346,2424;, + 3;2319,2544,2326;, + 3;2319,2549,2544;, + 3;2320,2343,2319;, + 3;2320,2342,2343;, + 3;2321,4347,4332;, + 3;2321,2334,4347;, + 3;2322,2719,2321;, + 3;2322,2718,2719;, + 3;2323,2542,2322;, + 3;2323,2541,2542;, + 3;2324,2569,2323;, + 3;2324,2568,2569;, + 3;2325,2563,2324;, + 3;2325,2562,2563;, + 3;2326,2556,2325;, + 3;2326,2561,2556;, + 3;4332,2322,2321;, + 3;4332,2323,2322;, + 3;4332,2324,2323;, + 3;4332,2325,2324;, + 3;4332,2326,2325;, + 3;4332,2319,2326;, + 3;4332,2320,2319;, + 3;4175,2335,2329;, + 3;4175,4348,2335;, + 3;2327,4173,4175;, + 3;2327,2362,4173;, + 3;2328,2368,2327;, + 3;2328,2367,2368;, + 3;2329,2353,2328;, + 3;2329,2352,2353;, + 3;4175,2328,2327;, + 3;4175,2329,2328;, + 3;2330,4346,4347;, + 3;2330,2425,4346;, + 3;2332,4331,2331;, + 3;2332,2703,4331;, + 3;2333,2710,2332;, + 3;2333,2709,2710;, + 3;2334,2715,2333;, + 3;2334,2719,2715;, + 3;4347,2331,2330;, + 3;4347,2332,2331;, + 3;4347,2333,2332;, + 3;4347,2334,2333;, + 3;2336,2352,2335;, + 3;2336,2351,2352;, + 3;2337,2350,2336;, + 3;2337,2349,2350;, + 3;2338,2375,2337;, + 3;2338,2379,2375;, + 3;4348,2388,2338;, + 3;4348,4349,2388;, + 3;4348,2336,2335;, + 3;4348,2337,2336;, + 3;4348,2338,2337;, + 3;2339,2549,2343;, + 3;2339,2548,2549;, + 3;2340,2551,2339;, + 3;2340,2550,2551;, + 3;2341,2364,2340;, + 3;2341,2363,2364;, + 3;2341,2340,2339;, + 3;2341,2339,2342;, + 3;2342,2339,2343;, + 3;2344,2351,2350;, + 3;2344,2356,2351;, + 3;2345,2518,2344;, + 3;2345,2517,2518;, + 3;2346,2519,2345;, + 3;2346,2523,2519;, + 3;2347,2524,2346;, + 3;2347,2530,2524;, + 3;2348,2373,2347;, + 3;2348,2372,2373;, + 3;2349,2376,2348;, + 3;2349,2375,2376;, + 3;2349,2346,2345;, + 3;2349,2345,2350;, + 3;2350,2345,2344;, + 3;2346,2349,2348;, + 3;2346,2348,2347;, + 3;2354,2367,2353;, + 3;2354,2366,2367;, + 3;2355,2507,2354;, + 3;2355,2512,2507;, + 3;2356,2513,2355;, + 3;2356,2518,2513;, + 3;2353,2355,2354;, + 3;2355,2353,2356;, + 3;2356,2353,2352;, + 3;2356,2352,2351;, + 3;2358,2381,2357;, + 3;2358,2380,2381;, + 3;2359,2535,2358;, + 3;2359,2534,2535;, + 3;2360,2538,2359;, + 3;2360,2537,2538;, + 3;2357,2360,2358;, + 3;2358,2360,2359;, + 3;2362,2369,2361;, + 3;2362,2368,2369;, + 3;4173,2362,2361;, + 3;2365,2550,2364;, + 3;2365,2555,2550;, + 3;2366,2508,2365;, + 3;2366,2507,2508;, + 3;2365,2364,2366;, + 3;2366,2364,2369;, + 3;2366,2369,2368;, + 3;2366,2368,2367;, + 3;2369,2364,2363;, + 3;2370,2531,2374;, + 3;2370,2536,2531;, + 3;2371,2385,2370;, + 3;2371,2384,2385;, + 3;2372,2377,2371;, + 3;2372,2376,2377;, + 3;2374,2530,2373;, + 3;2374,2529,2530;, + 3;2374,2373,2372;, + 3;2374,2372,2371;, + 3;2374,2371,2370;, + 3;2378,2384,2377;, + 3;2378,2383,2384;, + 3;2379,2389,2378;, + 3;2379,2388,2389;, + 3;2379,2376,2375;, + 3;2376,2379,2377;, + 3;2377,2379,2378;, + 3;2380,2536,2385;, + 3;2380,2535,2536;, + 3;2383,2390,2382;, + 3;2383,2389,2390;, + 3;2382,2380,2385;, + 3;2382,2385,2383;, + 3;2383,2385,2384;, + 3;2380,2382,2381;, + 3;4350,2427,2387;, + 3;4350,1813,2427;, + 3;4349,2389,2388;, + 3;4349,2390,2389;, + 3;4349,4329,2390;, + 3;4350,2387,2386;, + 3;2393,2397,2392;, + 3;2393,2401,2397;, + 3;2395,2412,2394;, + 3;2395,2411,2412;, + 3;4302,2396,4323;, + 3;2396,4302,2393;, + 3;2396,2393,2391;, + 3;2391,2393,2392;, + 3;4317,2397,4313;, + 3;4313,2397,2400;, + 3;2400,2397,2401;, + 3;2402,2410,2405;, + 3;2402,2409,2410;, + 3;2403,2414,2402;, + 3;2403,2413,2414;, + 3;2404,2418,2403;, + 3;2404,2417,2418;, + 3;4351,2419,2404;, + 3;4351,4306,2419;, + 3;4352,4207,4204;, + 3;4352,4353,4207;, + 3;4351,2402,2405;, + 3;4351,2403,2402;, + 3;4351,2404,2403;, + 3;2408,2423,2407;, + 3;2408,2422,2423;, + 3;4354,2415,2408;, + 3;4354,4355,2415;, + 3;4356,4357,4358;, + 3;1787,1813,4359;, + 3;1787,2412,2411;, + 3;1787,4300,2412;, + 3;4356,2407,2406;, + 3;4356,2408,2407;, + 3;4356,4354,2408;, + 3;4356,4358,4354;, + 3;2413,4311,4360;, + 3;2413,2418,4311;, + 3;88,2422,2415;, + 3;88,21,2422;, + 3;4360,2414,2413;, + 3;88,2415,4355;, + 3;2417,2420,2416;, + 3;2417,2419,2420;, + 3;4311,2418,2416;, + 3;2416,2418,2417;, + 3;4306,2420,2419;, + 3;4306,2421,2420;, + 3;21,2423,2422;, + 3;4346,2425,2424;, + 3;2428,2461,2433;, + 3;2428,2465,2461;, + 3;2433,2466,2432;, + 3;2433,2471,2466;, + 3;2429,2428,2430;, + 3;2430,2428,2433;, + 3;2430,2433,2431;, + 3;2431,2433,2432;, + 3;2434,2765,2439;, + 3;2434,2768,2765;, + 3;2437,2473,2436;, + 3;2437,2472,2473;, + 3;2439,2764,2438;, + 3;2439,2763,2764;, + 3;2436,2435,2437;, + 3;2437,2435,2434;, + 3;2437,2434,2439;, + 3;2437,2439,2438;, + 3;2440,2477,2444;, + 3;2440,2481,2477;, + 3;2441,2503,2440;, + 3;2441,2502,2503;, + 3;2442,2484,2441;, + 3;2442,2483,2484;, + 3;2442,2441,2443;, + 3;2443,2441,2444;, + 3;2444,2441,2440;, + 3;2445,2748,2450;, + 3;2445,2747,2748;, + 3;2446,2729,2445;, + 3;2446,2728,2729;, + 3;2448,2468,2447;, + 3;2448,2467,2468;, + 3;2446,2445,2447;, + 3;2447,2445,2448;, + 3;2448,2445,2449;, + 3;2449,2445,2450;, + 3;2451,2489,2456;, + 3;2451,2488,2489;, + 3;2452,2492,2451;, + 3;2452,2491,2492;, + 3;2454,2506,2453;, + 3;2454,2505,2506;, + 3;2455,2496,2454;, + 3;2455,2500,2496;, + 3;2456,2454,2451;, + 3;2451,2454,2453;, + 3;2451,2453,2452;, + 3;2454,2456,2455;, + 3;2460,2458,2457;, + 3;2458,2460,2459;, + 3;2462,2471,2461;, + 3;2462,2470,2471;, + 3;2463,2494,2462;, + 3;2463,2493,2494;, + 3;2464,2487,2463;, + 3;2464,2486,2487;, + 3;2465,2463,2461;, + 3;2461,2463,2462;, + 3;2463,2465,2464;, + 3;2470,2495,2469;, + 3;2470,2494,2495;, + 3;2467,2469,2468;, + 3;2469,2467,2470;, + 3;2470,2467,2466;, + 3;2470,2466,2471;, + 3;2475,2499,2474;, + 3;2475,2498,2499;, + 3;2476,2479,2475;, + 3;2476,2478,2479;, + 3;2474,2473,2475;, + 3;2475,2473,2472;, + 3;2475,2472,2476;, + 3;2480,2498,2479;, + 3;2480,2497,2498;, + 3;2481,2504,2480;, + 3;2481,2503,2504;, + 3;2478,2480,2479;, + 3;2480,2478,2481;, + 3;2481,2478,2477;, + 3;2485,4361,4362;, + 3;2485,2501,4361;, + 3;2482,4362,4344;, + 3;4362,2482,2485;, + 3;2488,4363,4364;, + 3;2488,2492,4363;, + 3;4334,2489,2488;, + 3;4334,2488,4364;, + 3;4342,4365,2490;, + 3;2490,4365,2491;, + 3;2491,4365,4363;, + 3;2491,4363,2492;, + 3;4366,2505,2496;, + 3;4366,4367,2505;, + 3;4337,4368,2500;, + 3;2500,4368,2496;, + 3;2496,4368,4366;, + 3;4369,2506,4367;, + 3;4367,2506,2505;, + 3;2506,4369,2501;, + 3;2501,4369,4361;, + 3;2509,2555,2508;, + 3;2509,2554,2555;, + 3;2510,2627,2509;, + 3;2510,2626,2627;, + 3;2511,2597,2510;, + 3;2511,2596,2597;, + 3;2512,2514,2511;, + 3;2512,2513,2514;, + 3;2510,2508,2511;, + 3;2511,2508,2507;, + 3;2511,2507,2512;, + 3;2508,2510,2509;, + 3;2515,2596,2514;, + 3;2515,2595,2596;, + 3;2516,2605,2515;, + 3;2516,2604,2605;, + 3;2517,2520,2516;, + 3;2517,2519,2520;, + 3;2516,2513,2518;, + 3;2516,2518,2517;, + 3;2513,2516,2515;, + 3;2513,2515,2514;, + 3;2521,2604,2520;, + 3;2521,2603,2604;, + 3;2522,2609,2521;, + 3;2522,2608,2609;, + 3;2523,2525,2522;, + 3;2523,2524,2525;, + 3;2519,2522,2521;, + 3;2519,2521,2520;, + 3;2522,2519,2523;, + 3;2526,2608,2525;, + 3;2526,2607,2608;, + 3;2527,2619,2526;, + 3;2527,2618,2619;, + 3;2528,2575,2527;, + 3;2528,2574,2575;, + 3;2529,2532,2528;, + 3;2529,2531,2532;, + 3;2527,2526,2528;, + 3;2528,2526,2529;, + 3;2529,2526,2530;, + 3;2530,2526,2525;, + 3;2530,2525,2524;, + 3;2533,2574,2532;, + 3;2533,2580,2574;, + 3;2534,2539,2533;, + 3;2534,2538,2539;, + 3;2536,2534,2531;, + 3;2531,2534,2532;, + 3;2532,2534,2533;, + 3;2534,2536,2535;, + 3;2540,2580,2539;, + 3;2540,2579,2580;, + 3;2541,2570,2540;, + 3;2541,2569,2570;, + 3;2543,2718,2542;, + 3;2543,2717,2718;, + 3;2543,2539,2538;, + 3;2543,2538,2537;, + 3;2539,2543,2540;, + 3;2540,2543,2542;, + 3;2540,2542,2541;, + 3;2545,2561,2544;, + 3;2545,2560,2561;, + 3;2546,2632,2545;, + 3;2546,2631,2632;, + 3;2547,2624,2546;, + 3;2547,2623,2624;, + 3;2548,2552,2547;, + 3;2548,2551,2552;, + 3;2546,2544,2549;, + 3;2546,2549,2547;, + 3;2547,2549,2548;, + 3;2544,2546,2545;, + 3;2553,2623,2552;, + 3;2553,2622,2623;, + 3;2554,2628,2553;, + 3;2554,2627,2628;, + 3;2554,2550,2555;, + 3;2550,2554,2551;, + 3;2551,2554,2553;, + 3;2551,2553,2552;, + 3;2557,2562,2556;, + 3;2557,2567,2562;, + 3;2558,2583,2557;, + 3;2558,2582,2583;, + 3;2559,2592,2558;, + 3;2559,2591,2592;, + 3;2560,2633,2559;, + 3;2560,2632,2633;, + 3;2560,2559,2557;, + 3;2560,2557,2556;, + 3;2560,2556,2561;, + 3;2557,2559,2558;, + 3;2564,2568,2563;, + 3;2564,2573,2568;, + 3;2565,2645,2564;, + 3;2565,2644,2645;, + 3;2566,2639,2565;, + 3;2566,2638,2639;, + 3;2567,2584,2566;, + 3;2567,2583,2584;, + 3;2565,2567,2566;, + 3;2567,2565,2564;, + 3;2567,2564,2562;, + 3;2562,2564,2563;, + 3;2571,2579,2570;, + 3;2571,2578,2579;, + 3;2572,2667,2571;, + 3;2572,2666,2667;, + 3;2573,2640,2572;, + 3;2573,2645,2640;, + 3;2572,2568,2573;, + 3;2568,2572,2569;, + 3;2569,2572,2571;, + 3;2569,2571,2570;, + 3;2576,2618,2575;, + 3;2576,2617,2618;, + 3;2577,2648,2576;, + 3;2577,2647,2648;, + 3;2578,2661,2577;, + 3;2578,2667,2661;, + 3;2576,2580,2577;, + 3;2577,2580,2579;, + 3;2577,2579,2578;, + 3;2580,2576,2574;, + 3;2574,2576,2575;, + 3;2581,2612,2589;, + 3;2581,2611,2612;, + 3;2582,2593,2581;, + 3;2582,2592,2593;, + 3;2585,2638,2584;, + 3;2585,2637,2638;, + 3;2586,2673,2585;, + 3;2586,2672,2673;, + 3;2587,2670,2586;, + 3;2587,2669,2670;, + 3;2588,2651,2587;, + 3;2588,2650,2651;, + 3;2589,2614,2588;, + 3;2589,2613,2614;, + 3;2584,2587,2585;, + 3;2585,2587,2586;, + 3;2587,2584,2582;, + 3;2587,2582,2581;, + 3;2587,2581,2588;, + 3;2588,2581,2589;, + 3;2582,2584,2583;, + 3;2590,2602,2594;, + 3;2590,2601,2602;, + 3;2591,2634,2590;, + 3;2591,2633,2634;, + 3;2594,2611,2593;, + 3;2594,2610,2611;, + 3;2592,2591,2593;, + 3;2593,2591,2590;, + 3;2593,2590,2594;, + 3;2595,2606,2599;, + 3;2595,2605,2606;, + 3;2598,2626,2597;, + 3;2598,2629,2626;, + 3;2599,2621,2598;, + 3;2599,2620,2621;, + 3;2597,2596,2598;, + 3;2598,2596,2599;, + 3;2599,2596,2595;, + 3;2600,2620,2606;, + 3;2600,2625,2620;, + 3;2601,2630,2600;, + 3;2601,2634,2630;, + 3;2603,2610,2602;, + 3;2603,2609,2610;, + 3;2604,2602,2605;, + 3;2605,2602,2601;, + 3;2605,2601,2606;, + 3;2606,2601,2600;, + 3;2602,2604,2603;, + 3;2607,2613,2612;, + 3;2607,2619,2613;, + 3;2609,2608,2610;, + 3;2610,2608,2612;, + 3;2610,2612,2611;, + 3;2612,2608,2607;, + 3;2615,2650,2614;, + 3;2615,2654,2650;, + 3;2616,2656,2615;, + 3;2616,2655,2656;, + 3;2617,2649,2616;, + 3;2617,2648,2649;, + 3;2618,2616,2619;, + 3;2619,2616,2615;, + 3;2619,2615,2614;, + 3;2619,2614,2613;, + 3;2616,2618,2617;, + 3;2622,2629,2621;, + 3;2622,2628,2629;, + 3;2625,2631,2624;, + 3;2625,2630,2631;, + 3;2624,2623,2625;, + 3;2625,2623,2621;, + 3;2625,2621,2620;, + 3;2621,2623,2622;, + 3;2627,2626,2628;, + 3;2628,2626,2629;, + 3;2633,2632,2631;, + 3;2633,2631,2630;, + 3;2633,2630,2634;, + 3;2635,2644,2639;, + 3;2635,2643,2644;, + 3;2636,2678,2635;, + 3;2636,2677,2678;, + 3;2637,2674,2636;, + 3;2637,2673,2674;, + 3;2638,2637,2639;, + 3;2639,2637,2635;, + 3;2635,2637,2636;, + 3;2641,2666,2640;, + 3;2641,2665,2666;, + 3;2642,2695,2641;, + 3;2642,2694,2695;, + 3;2643,2679,2642;, + 3;2643,2678,2679;, + 3;2640,2645,2644;, + 3;2640,2644,2643;, + 3;2640,2643,2641;, + 3;2641,2643,2642;, + 3;2646,2655,2649;, + 3;2646,2660,2655;, + 3;2647,2662,2646;, + 3;2647,2661,2662;, + 3;2648,2647,2649;, + 3;2649,2647,2646;, + 3;2652,2669,2651;, + 3;2652,2668,2669;, + 3;2653,2688,2652;, + 3;2653,2687,2688;, + 3;2654,2657,2653;, + 3;2654,2656,2657;, + 3;2650,2654,2653;, + 3;2650,2653,2651;, + 3;2651,2653,2652;, + 3;2658,2687,2657;, + 3;2658,2686,2687;, + 3;2659,2693,2658;, + 3;2659,2692,2693;, + 3;2660,2663,2659;, + 3;2660,2662,2663;, + 3;2656,2659,2657;, + 3;2657,2659,2658;, + 3;2659,2656,2660;, + 3;2660,2656,2655;, + 3;2664,2692,2663;, + 3;2664,2691,2692;, + 3;2665,2696,2664;, + 3;2665,2695,2696;, + 3;2662,2666,2665;, + 3;2662,2665,2663;, + 3;2663,2665,2664;, + 3;2666,2662,2667;, + 3;2667,2662,2661;, + 3;2668,2683,2671;, + 3;2668,2688,2683;, + 3;2671,2672,2670;, + 3;2671,2676,2672;, + 3;2671,2670,2668;, + 3;2668,2670,2669;, + 3;2675,2677,2674;, + 3;2675,2682,2677;, + 3;2676,2684,2675;, + 3;2676,2683,2684;, + 3;2675,2674,2676;, + 3;2676,2674,2672;, + 3;2672,2674,2673;, + 3;2680,2694,2679;, + 3;2680,2697,2694;, + 3;2681,2690,2680;, + 3;2681,2689,2690;, + 3;2682,2685,2681;, + 3;2682,2684,2685;, + 3;2680,2679,2681;, + 3;2681,2679,2682;, + 3;2682,2679,2677;, + 3;2677,2679,2678;, + 3;2686,2689,2685;, + 3;2686,2693,2689;, + 3;2685,2683,2688;, + 3;2685,2688,2686;, + 3;2686,2688,2687;, + 3;2683,2685,2684;, + 3;2691,2697,2690;, + 3;2691,2696,2697;, + 3;2689,2693,2690;, + 3;2690,2693,2691;, + 3;2691,2693,2692;, + 3;2697,2696,2694;, + 3;2694,2696,2695;, + 3;2699,2714,2698;, + 3;2699,2713,2714;, + 3;2701,2698,2702;, + 3;2698,2701,2699;, + 3;2699,2701,2700;, + 3;2703,2711,2707;, + 3;2703,2710,2711;, + 3;2704,2706,2705;, + 3;2707,4331,2703;, + 3;2706,2704,4325;, + 3;2709,2716,2708;, + 3;2709,2715,2716;, + 3;2709,2712,2711;, + 3;2709,2711,2710;, + 3;2712,2709,2713;, + 3;2713,2709,2714;, + 3;2714,2709,2708;, + 3;2718,2717,2716;, + 3;2718,2716,2719;, + 3;2719,2716,2715;, + 3;2721,2767,2720;, + 3;2721,2766,2767;, + 3;2722,2761,2721;, + 3;2721,2761,2762;, + 3;2722,2721,2720;, + 3;2722,2720,2725;, + 3;2722,2725,2723;, + 3;2723,2725,2724;, + 3;2727,2753,2726;, + 3;2727,2752,2753;, + 3;2730,2747,2729;, + 3;2730,2746,2747;, + 3;2732,2733,2731;, + 3;2732,2738,2733;, + 3;2728,2731,2729;, + 3;2729,2731,2730;, + 3;2731,2728,2727;, + 3;2731,2727,2732;, + 3;2732,2727,2726;, + 3;2735,3387,2734;, + 3;2735,3386,3387;, + 3;2736,2824,2735;, + 3;2736,2823,2824;, + 3;2737,2742,2736;, + 3;2737,2741,2742;, + 3;2734,2733,2735;, + 3;2735,2733,2738;, + 3;2735,2738,2736;, + 3;2736,2738,2737;, + 3;2743,2823,2742;, + 3;2743,2822,2823;, + 3;2744,2942,2743;, + 3;2744,2941,2942;, + 3;2742,2741,2744;, + 3;2742,2744,2743;, + 3;2744,2741,2739;, + 3;2739,2741,2740;, + 3;1883,2746,2745;, + 3;1883,2747,2746;, + 3;1883,2748,2747;, + 3;2750,2758,2749;, + 3;2750,2757,2758;, + 3;2753,2750,2749;, + 3;2750,2753,2751;, + 3;2751,2753,2752;, + 3;2756,2760,2755;, + 3;2756,2759,2760;, + 3;2757,2755,2758;, + 3;2758,2755,2754;, + 3;2755,2757,2756;, + 3;2763,2766,2762;, + 3;2763,2765,2766;, + 3;2759,2762,2761;, + 3;2759,2761,2760;, + 3;2762,2759,2764;, + 3;2762,2764,2763;, + 3;2765,2767,2766;, + 3;2767,2765,2768;, + 3;2771,3118,2770;, + 3;2771,3117,3118;, + 3;4370,2865,2771;, + 3;4370,4371,2865;, + 3;2773,3053,2772;, + 3;2773,3052,3053;, + 3;2774,3057,4372;, + 3;2773,4373,3058;, + 3;2774,2770,2769;, + 3;2770,2774,2771;, + 3;2771,2774,4372;, + 3;2771,4372,4370;, + 3;2775,3044,2780;, + 3;2775,3048,3044;, + 3;1886,3085,2775;, + 3;1886,1944,3085;, + 3;2776,1918,1886;, + 3;2776,3064,1918;, + 3;2777,4374,4375;, + 3;2777,3054,4374;, + 3;2778,2863,2777;, + 3;2778,2862,2863;, + 3;2779,3359,2778;, + 3;2779,3358,3359;, + 3;4376,2789,2779;, + 3;4376,4377,2789;, + 3;4378,2777,4375;, + 3;4378,2778,2777;, + 3;4378,2779,2778;, + 3;4378,4376,2779;, + 3;1886,2775,2780;, + 3;2781,3369,2788;, + 3;2781,3368,3369;, + 3;2782,2857,4379;, + 3;2781,4380,2858;, + 3;2783,2860,2782;, + 3;2783,2869,2860;, + 3;2784,3384,2783;, + 3;2784,3383,3384;, + 3;2785,3412,2784;, + 3;2785,3415,3412;, + 3;2786,3093,2785;, + 3;2786,3098,3093;, + 3;2787,2808,2786;, + 3;2787,2807,2808;, + 3;4381,3362,2787;, + 3;4381,4382,3362;, + 3;4381,2785,4379;, + 3;4379,2785,2784;, + 3;4379,2784,2782;, + 3;2782,2784,2783;, + 3;2785,4381,2786;, + 3;2786,4381,2787;, + 3;2790,3358,2789;, + 3;2790,3357,3358;, + 3;2791,3373,2790;, + 3;2791,3372,3373;, + 3;2792,3378,2791;, + 3;2792,3377,3378;, + 3;2793,3197,2792;, + 3;2793,3196,3197;, + 3;2794,3017,2793;, + 3;2794,3016,3017;, + 3;2795,3041,2794;, + 3;2795,3040,3041;, + 3;4377,3045,2795;, + 3;4377,4383,3045;, + 3;2794,2793,2795;, + 3;2795,2793,4377;, + 3;4377,2793,2792;, + 3;4377,2792,2789;, + 3;2789,2792,2791;, + 3;2789,2791,2790;, + 3;2797,4384,4385;, + 3;2802,2991,2987;, + 3;2798,4384,2797;, + 3;2798,3363,4384;, + 3;2799,2806,2798;, + 3;2799,2815,2806;, + 3;2800,3090,2799;, + 3;2800,3089,3090;, + 3;1891,2945,2800;, + 3;1891,1893,2945;, + 3;4253,4386,4387;, + 3;4253,2974,4386;, + 3;2802,3082,4253;, + 3;2802,3083,3082;, + 3;1891,4385,2801;, + 3;1891,2797,4385;, + 3;1891,2798,2797;, + 3;1891,2799,2798;, + 3;1891,2800,2799;, + 3;2803,4388,4389;, + 3;2803,3020,4388;, + 3;2804,3022,2803;, + 3;2804,3021,3022;, + 3;2805,2997,2804;, + 3;2805,2996,2997;, + 3;4389,2982,2805;, + 3;4389,4390,2982;, + 3;4389,2804,2803;, + 3;4389,2805,2804;, + 3;2807,3363,2806;, + 3;2807,3362,3363;, + 3;2809,3098,2808;, + 3;2809,3097,3098;, + 3;2810,3135,2809;, + 3;2810,3134,3135;, + 3;2811,4391,4392;, + 3;2811,3159,4391;, + 3;2812,3110,2811;, + 3;2812,3115,3110;, + 3;4393,3148,2812;, + 3;4393,4394,3148;, + 3;2814,3122,2813;, + 3;2814,3121,3122;, + 3;2815,3091,2814;, + 3;2815,3090,3091;, + 3;2806,2810,2809;, + 3;2806,2809,2807;, + 3;2807,2809,2808;, + 3;2810,2806,4395;, + 3;4395,2806,4396;, + 3;4396,2806,2813;, + 3;2813,2806,2814;, + 3;2814,2806,2815;, + 3;2816,3400,2825;, + 3;2816,3399,3400;, + 3;2817,3404,2816;, + 3;2816,3404,3405;, + 3;2818,2892,2817;, + 3;2818,2891,2892;, + 3;2819,2899,2818;, + 3;2819,2898,2899;, + 3;2820,2905,2819;, + 3;2820,2904,2905;, + 3;2821,2883,2820;, + 3;2821,2887,2883;, + 3;2822,2943,2821;, + 3;2822,2942,2943;, + 3;2825,3386,2824;, + 3;2825,3385,3386;, + 3;2817,2819,2818;, + 3;2819,2817,2820;, + 3;2820,2817,2821;, + 3;2821,2817,2816;, + 3;2821,2816,2822;, + 3;2822,2816,2825;, + 3;2822,2825,2823;, + 3;2823,2825,2824;, + 3;2826,2843,2832;, + 3;2826,2842,2843;, + 3;2827,2854,2826;, + 3;2827,2853,2854;, + 3;2830,2909,2829;, + 3;2830,2908,2909;, + 3;2831,2915,2830;, + 3;2831,2914,2915;, + 3;2832,2889,2831;, + 3;2832,2888,2889;, + 3;2830,2829,2832;, + 3;2830,2832,2831;, + 3;2832,2829,2827;, + 3;2832,2827,2826;, + 3;2827,2829,2828;, + 3;2833,2896,2838;, + 3;2833,2895,2896;, + 3;2834,3380,2833;, + 3;2834,3379,3380;, + 3;2835,2868,2834;, + 3;2835,2867,2868;, + 3;2836,2848,2835;, + 3;2836,2847,2848;, + 3;2838,2840,2837;, + 3;2838,2839,2840;, + 3;2835,2834,2836;, + 3;2836,2834,2837;, + 3;2837,2834,2838;, + 3;2838,2834,2833;, + 3;2839,2888,2843;, + 3;2839,2896,2888;, + 3;2842,2855,2841;, + 3;2842,2854,2855;, + 3;2842,2840,2839;, + 3;2842,2839,2843;, + 3;2840,2842,2841;, + 3;2844,3116,2849;, + 3;2844,3119,3116;, + 3;2849,2867,2848;, + 3;2849,2866,2867;, + 3;2847,2849,2848;, + 3;2849,2847,2844;, + 3;2844,2847,2846;, + 3;2844,2846,2845;, + 3;2851,2855,2852;, + 3;2852,2855,2853;, + 3;2853,2855,2854;, + 3;2855,2851,2850;, + 3;2856,3361,2859;, + 3;2856,3360,3361;, + 3;4380,2861,2856;, + 3;2857,2860,4397;, + 3;2859,3368,2858;, + 3;2859,3367,3368;, + 3;4380,2856,2859;, + 3;4380,2859,2858;, + 3;2862,3360,2861;, + 3;2862,3359,3360;, + 3;2864,3054,2863;, + 3;2864,3053,3054;, + 3;2866,3117,2865;, + 3;2866,3116,3117;, + 3;2869,3379,2868;, + 3;2869,3384,3379;, + 3;2867,2866,2865;, + 3;2867,2865,2868;, + 3;2868,2865,4371;, + 3;2868,4371,4397;, + 3;2868,4397,2860;, + 3;2868,2860,2869;, + 3;2861,2864,2863;, + 3;2861,2863,2862;, + 3;2873,2940,2872;, + 3;2873,2939,2940;, + 3;2874,2886,2873;, + 3;2874,2885,2886;, + 3;2875,2919,2874;, + 3;2875,2918,2919;, + 3;2876,2925,2875;, + 3;2876,2924,2925;, + 3;2877,2879,2876;, + 3;2877,2878,2879;, + 3;2874,2876,2875;, + 3;2876,2874,2873;, + 3;2876,2873,2872;, + 3;2876,2872,2877;, + 3;2877,2872,2871;, + 3;2877,2871,2870;, + 3;2880,2924,2879;, + 3;2880,2923,2924;, + 3;2881,2930,2880;, + 3;2881,2929,2930;, + 3;2878,2880,2879;, + 3;2880,2878,2881;, + 3;2881,2878,2882;, + 3;2884,2904,2883;, + 3;2884,2903,2904;, + 3;2885,2920,2884;, + 3;2885,2919,2920;, + 3;2887,2939,2886;, + 3;2887,2943,2939;, + 3;2886,2885,2887;, + 3;2887,2885,2884;, + 3;2887,2884,2883;, + 3;2890,2914,2889;, + 3;2890,2913,2914;, + 3;2891,2900,2890;, + 3;2891,2899,2900;, + 3;2893,3404,2817;, + 3;2893,3403,3404;, + 3;2894,3409,2893;, + 3;2894,3408,3409;, + 3;2895,3381,2894;, + 3;2895,3380,3381;, + 3;2890,2889,2891;, + 3;2891,2889,2892;, + 3;2892,2889,2888;, + 3;2892,2888,2893;, + 3;2893,2888,2895;, + 3;2893,2895,2894;, + 3;2895,2888,2896;, + 3;2897,2938,2901;, + 3;2897,2937,2938;, + 3;2898,2906,2897;, + 3;2898,2905,2906;, + 3;2901,2913,2900;, + 3;2901,2912,2913;, + 3;2899,2898,2900;, + 3;2900,2898,2897;, + 3;2900,2897,2901;, + 3;2902,2937,2906;, + 3;2902,2936,2937;, + 3;2903,2921,2902;, + 3;2903,2920,2921;, + 3;2902,2906,2903;, + 3;2903,2906,2904;, + 3;2904,2906,2905;, + 3;2907,2933,2911;, + 3;2907,2932,2933;, + 3;2908,2916,2907;, + 3;2908,2915,2916;, + 3;2911,2928,2910;, + 3;2911,2927,2928;, + 3;2908,2907,2911;, + 3;2908,2911,2909;, + 3;2909,2911,2910;, + 3;2912,2932,2916;, + 3;2912,2938,2932;, + 3;2916,2914,2912;, + 3;2912,2914,2913;, + 3;2914,2916,2915;, + 3;2917,2936,2921;, + 3;2917,2935,2936;, + 3;2918,2926,2917;, + 3;2918,2925,2926;, + 3;2918,2920,2919;, + 3;2920,2918,2921;, + 3;2921,2918,2917;, + 3;2922,2935,2926;, + 3;2922,2934,2935;, + 3;2923,2931,2922;, + 3;2923,2930,2931;, + 3;2926,2923,2922;, + 3;2923,2926,2925;, + 3;2923,2925,2924;, + 3;2927,2934,2931;, + 3;2927,2933,2934;, + 3;2931,2928,2927;, + 3;2928,2931,2930;, + 3;2928,2930,2929;, + 3;2934,2933,2935;, + 3;2935,2933,2938;, + 3;2935,2938,2937;, + 3;2935,2937,2936;, + 3;2938,2933,2932;, + 3;2939,2943,2942;, + 3;2939,2942,2940;, + 3;2940,2942,2941;, + 3;2944,3104,2947;, + 3;2944,3109,3104;, + 3;1893,3395,2944;, + 3;1893,2014,3395;, + 3;2946,3089,2945;, + 3;2946,3088,3089;, + 3;2947,2954,2946;, + 3;2947,2953,2954;, + 3;1893,2946,2945;, + 3;1893,2947,2946;, + 3;1893,2944,2947;, + 3;2948,3144,2952;, + 3;2948,3143,3144;, + 3;2949,2967,2948;, + 3;2949,2966,2967;, + 3;2950,3153,2949;, + 3;2950,3152,3153;, + 3;2951,3113,2950;, + 3;2951,3112,3113;, + 3;2952,3161,2951;, + 3;2952,3160,3161;, + 3;2950,2952,2951;, + 3;2952,2950,2949;, + 3;2952,2949,2948;, + 3;2953,3105,2956;, + 3;2953,3104,3105;, + 3;2955,3088,2954;, + 3;2955,3087,3088;, + 3;2956,3129,2955;, + 3;2956,3128,3129;, + 3;2953,2956,2955;, + 3;2953,2955,2954;, + 3;2957,3096,2964;, + 3;2957,3095,3096;, + 3;2958,3411,2957;, + 3;2958,3410,3411;, + 3;2959,3402,2958;, + 3;2959,3401,3402;, + 3;2960,3398,2959;, + 3;2960,3397,3398;, + 3;2961,2970,2960;, + 3;2961,2969,2970;, + 3;2962,3099,2961;, + 3;2962,3103,3099;, + 3;2963,3136,2962;, + 3;2963,3140,3136;, + 3;2964,3132,2963;, + 3;2964,3131,3132;, + 3;2958,2962,2959;, + 3;2959,2962,2960;, + 3;2960,2962,2961;, + 3;2962,2958,2957;, + 3;2962,2957,2963;, + 3;2963,2957,2964;, + 3;2965,3127,2973;, + 3;2965,3126,3127;, + 3;4398,3154,2965;, + 3;2966,3153,4399;, + 3;2968,3142,4400;, + 3;2967,4401,3143;, + 3;2969,3100,2968;, + 3;2969,3099,3100;, + 3;2971,3397,2970;, + 3;2971,3396,3397;, + 3;2972,3391,2971;, + 3;2972,3390,3391;, + 3;2973,3107,2972;, + 3;2973,3106,3107;, + 3;2971,2968,2972;, + 3;2972,2968,4400;, + 3;2972,4400,2973;, + 3;2973,4400,4398;, + 3;2973,4398,2965;, + 3;2968,2971,2969;, + 3;2969,2971,2970;, + 3;2974,4402,4386;, + 3;2974,3082,4402;, + 3;2975,2996,2982;, + 3;2975,3000,2996;, + 3;2976,3208,2975;, + 3;2976,3207,3208;, + 3;2977,3220,2976;, + 3;2977,3219,3220;, + 3;2978,3221,2977;, + 3;2978,3226,3221;, + 3;2979,3227,2978;, + 3;2979,3232,3227;, + 3;2980,3199,2979;, + 3;2980,3198,3199;, + 3;2981,3376,2980;, + 3;2981,3375,3376;, + 3;4390,2988,2981;, + 3;4390,4403,2988;, + 3;4390,2975,2982;, + 3;4390,2976,2975;, + 3;4390,2977,2976;, + 3;4390,2978,2977;, + 3;4390,2979,2978;, + 3;4390,2980,2979;, + 3;4390,2981,2980;, + 3;2983,3011,2986;, + 3;2983,3010,3011;, + 3;2984,3024,2983;, + 3;2984,3023,3024;, + 3;2985,3019,2984;, + 3;2985,3018,3019;, + 3;4404,3084,2985;, + 3;4404,4405,3084;, + 3;2986,4406,4404;, + 3;2986,2995,4406;, + 3;4404,2983,2986;, + 3;4404,2984,2983;, + 3;4404,2985,2984;, + 3;4403,3083,2987;, + 3;4403,4402,3083;, + 3;2989,3375,2988;, + 3;2989,3374,3375;, + 3;2990,3371,2989;, + 3;2990,3370,3371;, + 3;2991,3365,2990;, + 3;2991,3364,3365;, + 3;4403,2989,2988;, + 3;4403,2990,2989;, + 3;4403,2991,2990;, + 3;4403,2987,2991;, + 3;2992,4407,4406;, + 3;2992,3047,4407;, + 3;2993,3034,2992;, + 3;2993,3033,3034;, + 3;2994,3003,2993;, + 3;2994,3002,3003;, + 3;2995,3012,2994;, + 3;2995,3011,3012;, + 3;4406,2993,2992;, + 3;4406,2994,2993;, + 3;4406,2995,2994;, + 3;2998,3021,2997;, + 3;2998,3027,3021;, + 3;2999,3209,2998;, + 3;2999,3214,3209;, + 3;3000,3203,2999;, + 3;3000,3208,3203;, + 3;2997,2999,2998;, + 3;2999,2997,2996;, + 3;2999,2996,3000;, + 3;3001,3172,3007;, + 3;3001,3177,3172;, + 3;3002,3013,3001;, + 3;3002,3012,3013;, + 3;3004,3033,3003;, + 3;3004,3037,3033;, + 3;3005,3031,3004;, + 3;3005,3030,3031;, + 3;3006,3184,3005;, + 3;3006,3183,3184;, + 3;3007,3182,3006;, + 3;3007,3181,3182;, + 3;3003,3006,3004;, + 3;3004,3006,3005;, + 3;3006,3003,3007;, + 3;3007,3003,3002;, + 3;3007,3002,3001;, + 3;3008,3177,3013;, + 3;3008,3176,3177;, + 3;3009,3171,3008;, + 3;3009,3170,3171;, + 3;3010,3025,3009;, + 3;3010,3024,3025;, + 3;3010,3008,3013;, + 3;3010,3013,3011;, + 3;3011,3013,3012;, + 3;3008,3010,3009;, + 3;3014,3196,3017;, + 3;3014,3202,3196;, + 3;3015,3191,3014;, + 3;3015,3190,3191;, + 3;3016,3042,3015;, + 3;3016,3041,3042;, + 3;3016,3015,3017;, + 3;3017,3015,3014;, + 3;3018,4405,4388;, + 3;3018,3084,4405;, + 3;3020,3023,3019;, + 3;3020,3022,3023;, + 3;4388,3019,3018;, + 3;4388,3020,3019;, + 3;3026,3170,3025;, + 3;3026,3169,3170;, + 3;3027,3210,3026;, + 3;3027,3209,3210;, + 3;3026,3025,3027;, + 3;3027,3025,3022;, + 3;3027,3022,3021;, + 3;3022,3025,3023;, + 3;3023,3025,3024;, + 3;3028,3038,3032;, + 3;3028,3043,3038;, + 3;3029,3195,3028;, + 3;3029,3194,3195;, + 3;3030,3185,3029;, + 3;3030,3184,3185;, + 3;3032,3037,3031;, + 3;3032,3036,3037;, + 3;3029,3031,3030;, + 3;3031,3029,3032;, + 3;3032,3029,3028;, + 3;3035,3047,3034;, + 3;3035,3046,3047;, + 3;3036,3039,3035;, + 3;3036,3038,3039;, + 3;3034,3037,3036;, + 3;3034,3036,3035;, + 3;3037,3034,3033;, + 3;3040,3046,3039;, + 3;3040,3045,3046;, + 3;3043,3190,3042;, + 3;3043,3195,3190;, + 3;3040,3042,3041;, + 3;3042,3040,3043;, + 3;3043,3040,3039;, + 3;3043,3039,3038;, + 3;3048,1944,4408;, + 3;3048,3085,1944;, + 3;4408,3044,3048;, + 3;4407,3045,4383;, + 3;4407,3046,3045;, + 3;4407,3047,3046;, + 3;3050,3064,3049;, + 3;3050,3070,3064;, + 3;3052,3059,3051;, + 3;3052,3058,3059;, + 3;4297,3054,3051;, + 3;3051,3054,3053;, + 3;3051,3053,3052;, + 3;3054,4297,4374;, + 3;4373,4314,3058;, + 3;3058,4314,3055;, + 3;3058,3055,3059;, + 3;3060,3073,3063;, + 3;3060,3072,3073;, + 3;3061,3066,3060;, + 3;3061,3065,3066;, + 3;4409,3086,3061;, + 3;4295,4293,4410;, + 3;3062,4308,4409;, + 3;3062,3077,4308;, + 3;3063,3075,3062;, + 3;3063,3074,3075;, + 3;4409,3063,3062;, + 3;4409,3060,3063;, + 3;4409,3061,3060;, + 3;4411,1944,1918;, + 3;4411,4412,1944;, + 3;3067,4413,4414;, + 3;3067,3071,4413;, + 3;3068,3081,3067;, + 3;3068,3080,3081;, + 3;4415,4414,4416;, + 3;4415,3067,4414;, + 3;4415,3068,3067;, + 3;4415,3069,3068;, + 3;1918,3070,4299;, + 3;1918,3064,3070;, + 3;3071,151,3755;, + 3;3071,3081,151;, + 3;4417,3074,3073;, + 3;4417,4309,3074;, + 3;3755,4413,3071;, + 3;4417,3073,3072;, + 3;3076,3077,3075;, + 3;3076,3079,3077;, + 3;4309,3076,3074;, + 3;3074,3076,3075;, + 3;4308,3079,3078;, + 3;4308,3077,3079;, + 3;151,3081,3080;, + 3;4402,3082,3083;, + 3;3087,3130,3092;, + 3;3087,3129,3130;, + 3;3092,3121,3091;, + 3;3092,3120,3121;, + 3;3090,3089,3091;, + 3;3091,3089,3092;, + 3;3092,3089,3088;, + 3;3092,3088,3087;, + 3;3094,3415,3093;, + 3;3094,3414,3415;, + 3;3095,3406,3094;, + 3;3095,3411,3406;, + 3;3097,3131,3096;, + 3;3097,3135,3131;, + 3;3097,3096,3098;, + 3;3098,3096,3093;, + 3;3093,3096,3094;, + 3;3094,3096,3095;, + 3;3101,3142,3100;, + 3;3101,3141,3142;, + 3;3102,3165,3101;, + 3;3102,3164,3165;, + 3;3103,3137,3102;, + 3;3103,3136,3137;, + 3;3100,3099,3101;, + 3;3101,3099,3103;, + 3;3101,3103,3102;, + 3;3106,3128,3105;, + 3;3106,3127,3128;, + 3;3108,3390,3107;, + 3;3108,3389,3390;, + 3;3109,3392,3108;, + 3;3109,3395,3392;, + 3;3107,3106,3108;, + 3;3108,3106,3105;, + 3;3108,3105,3104;, + 3;3108,3104,3109;, + 3;3111,3159,3110;, + 3;3111,3158,3159;, + 3;3112,3162,3111;, + 3;3112,3161,3162;, + 3;3114,3152,3113;, + 3;3114,3151,3152;, + 3;3115,3145,3114;, + 3;3115,3148,3145;, + 3;3115,3111,3110;, + 3;3111,3115,3114;, + 3;3111,3114,3112;, + 3;3112,3114,3113;, + 3;3117,3119,3118;, + 3;3119,3117,3116;, + 3;3120,3125,3124;, + 3;3120,3130,3125;, + 3;3123,3147,3122;, + 3;3123,3146,3147;, + 3;3124,3150,3123;, + 3;3124,3149,3150;, + 3;3121,3123,3122;, + 3;3123,3121,3120;, + 3;3123,3120,3124;, + 3;3126,3149,3125;, + 3;3126,3154,3149;, + 3;3128,3126,3125;, + 3;3128,3125,3129;, + 3;3129,3125,3130;, + 3;3126,3128,3127;, + 3;3133,3140,3132;, + 3;3133,3139,3140;, + 3;3134,3156,3133;, + 3;3134,3155,3156;, + 3;3134,3133,3135;, + 3;3135,3133,3131;, + 3;3131,3133,3132;, + 3;3138,3164,3137;, + 3;3138,3163,3164;, + 3;3139,3157,3138;, + 3;3139,3156,3157;, + 3;3140,3138,3137;, + 3;3140,3137,3136;, + 3;3138,3140,3139;, + 3;4418,3160,3144;, + 3;4418,4419,3160;, + 3;3143,4401,4418;, + 3;3143,4418,3144;, + 3;4420,3151,3145;, + 3;4420,4421,3151;, + 3;4394,3145,3148;, + 3;3145,4394,4420;, + 3;4399,3153,4422;, + 3;4422,3153,3152;, + 3;4422,3152,4421;, + 3;4421,3152,3151;, + 3;3158,4423,4424;, + 3;3158,3162,4423;, + 3;4391,3159,4425;, + 3;4425,3159,3158;, + 3;4425,3158,4424;, + 3;4426,4423,3161;, + 3;4426,3161,3160;, + 3;4426,3160,4419;, + 3;3161,4423,3162;, + 3;3166,3176,3171;, + 3;3166,3175,3176;, + 3;3167,3256,3166;, + 3;3167,3255,3256;, + 3;3168,3287,3167;, + 3;3168,3286,3287;, + 3;3169,3211,3168;, + 3;3169,3210,3211;, + 3;3167,3169,3168;, + 3;3169,3167,3166;, + 3;3169,3166,3170;, + 3;3170,3166,3171;, + 3;3173,3181,3172;, + 3;3173,3180,3181;, + 3;3174,3260,3173;, + 3;3174,3259,3260;, + 3;3175,3257,3174;, + 3;3175,3256,3257;, + 3;3173,3176,3174;, + 3;3174,3176,3175;, + 3;3176,3173,3177;, + 3;3177,3173,3172;, + 3;3178,3183,3182;, + 3;3178,3189,3183;, + 3;3179,3269,3178;, + 3;3179,3268,3269;, + 3;3180,3261,3179;, + 3;3180,3260,3261;, + 3;3181,3178,3182;, + 3;3178,3181,3179;, + 3;3179,3181,3180;, + 3;3186,3194,3185;, + 3;3186,3193,3194;, + 3;3187,3233,3186;, + 3;3187,3239,3233;, + 3;3188,3274,3187;, + 3;3188,3273,3274;, + 3;3189,3270,3188;, + 3;3189,3269,3270;, + 3;3187,3186,3188;, + 3;3188,3186,3185;, + 3;3188,3185,3184;, + 3;3188,3184,3189;, + 3;3189,3184,3183;, + 3;3192,3202,3191;, + 3;3192,3201,3202;, + 3;3193,3234,3192;, + 3;3193,3233,3234;, + 3;3195,3191,3190;, + 3;3191,3195,3194;, + 3;3191,3194,3193;, + 3;3191,3193,3192;, + 3;3198,3377,3197;, + 3;3198,3376,3377;, + 3;3200,3232,3199;, + 3;3200,3231,3232;, + 3;3201,3235,3200;, + 3;3201,3234,3235;, + 3;3197,3201,3200;, + 3;3197,3200,3198;, + 3;3198,3200,3199;, + 3;3201,3197,3202;, + 3;3202,3197,3196;, + 3;3204,3214,3203;, + 3;3204,3213,3214;, + 3;3205,3282,3204;, + 3;3205,3281,3282;, + 3;3206,3291,3205;, + 3;3206,3290,3291;, + 3;3207,3215,3206;, + 3;3207,3220,3215;, + 3;3205,3207,3206;, + 3;3207,3205,3208;, + 3;3208,3205,3204;, + 3;3208,3204,3203;, + 3;3212,3286,3211;, + 3;3212,3285,3286;, + 3;3213,3283,3212;, + 3;3213,3282,3283;, + 3;3211,3209,3214;, + 3;3211,3214,3212;, + 3;3212,3214,3213;, + 3;3209,3211,3210;, + 3;3216,3290,3215;, + 3;3216,3289,3290;, + 3;3217,3253,3216;, + 3;3217,3252,3253;, + 3;3218,3246,3217;, + 3;3218,3245,3246;, + 3;3219,3222,3218;, + 3;3219,3221,3222;, + 3;3215,3218,3216;, + 3;3216,3218,3217;, + 3;3218,3215,3219;, + 3;3219,3215,3220;, + 3;3223,3245,3222;, + 3;3223,3244,3245;, + 3;3224,3294,3223;, + 3;3224,3298,3294;, + 3;3225,3299,3224;, + 3;3225,3304,3299;, + 3;3226,3228,3225;, + 3;3226,3227,3228;, + 3;3224,3222,3225;, + 3;3225,3222,3221;, + 3;3225,3221,3226;, + 3;3222,3224,3223;, + 3;3229,3304,3228;, + 3;3229,3303,3304;, + 3;3230,3322,3229;, + 3;3230,3321,3322;, + 3;3231,3236,3230;, + 3;3231,3235,3236;, + 3;3229,3228,3227;, + 3;3229,3227,3232;, + 3;3229,3232,3230;, + 3;3230,3232,3231;, + 3;3237,3321,3236;, + 3;3237,3320,3321;, + 3;3238,3306,3237;, + 3;3238,3305,3306;, + 3;3239,3275,3238;, + 3;3239,3274,3275;, + 3;3238,3237,3234;, + 3;3238,3234,3233;, + 3;3238,3233,3239;, + 3;3234,3237,3235;, + 3;3235,3237,3236;, + 3;3240,3272,3248;, + 3;3240,3278,3272;, + 3;3241,3312,3240;, + 3;3241,3311,3312;, + 3;3242,3328,3241;, + 3;3242,3327,3328;, + 3;3243,3334,3242;, + 3;3243,3333,3334;, + 3;3244,3295,3243;, + 3;3244,3294,3295;, + 3;3247,3252,3246;, + 3;3247,3251,3252;, + 3;3248,3266,3247;, + 3;3248,3271,3266;, + 3;3244,3241,3246;, + 3;3244,3246,3245;, + 3;3246,3241,3247;, + 3;3247,3241,3240;, + 3;3247,3240,3248;, + 3;3241,3244,3243;, + 3;3241,3243,3242;, + 3;3249,3289,3253;, + 3;3249,3293,3289;, + 3;3250,3263,3249;, + 3;3250,3262,3263;, + 3;3251,3267,3250;, + 3;3251,3266,3267;, + 3;3252,3251,3253;, + 3;3253,3251,3249;, + 3;3249,3251,3250;, + 3;3254,3279,3258;, + 3;3254,3284,3279;, + 3;3255,3288,3254;, + 3;3255,3287,3288;, + 3;3258,3259,3257;, + 3;3258,3265,3259;, + 3;3255,3254,3256;, + 3;3256,3254,3258;, + 3;3256,3258,3257;, + 3;3262,3268,3261;, + 3;3262,3267,3268;, + 3;3264,3293,3263;, + 3;3264,3292,3293;, + 3;3265,3280,3264;, + 3;3265,3279,3280;, + 3;3260,3259,3262;, + 3;3260,3262,3261;, + 3;3262,3259,3263;, + 3;3263,3259,3265;, + 3;3263,3265,3264;, + 3;3271,3273,3270;, + 3;3271,3272,3273;, + 3;3268,3267,3269;, + 3;3269,3267,3271;, + 3;3269,3271,3270;, + 3;3271,3267,3266;, + 3;3276,3305,3275;, + 3;3276,3308,3305;, + 3;3277,3314,3276;, + 3;3277,3319,3314;, + 3;3278,3313,3277;, + 3;3278,3312,3313;, + 3;3274,3276,3275;, + 3;3276,3274,3273;, + 3;3276,3273,3277;, + 3;3277,3273,3278;, + 3;3278,3273,3272;, + 3;3281,3292,3280;, + 3;3281,3291,3292;, + 3;3284,3285,3283;, + 3;3284,3288,3285;, + 3;3281,3280,3282;, + 3;3282,3280,3284;, + 3;3282,3284,3283;, + 3;3284,3280,3279;, + 3;3286,3285,3287;, + 3;3287,3285,3288;, + 3;3289,3291,3290;, + 3;3291,3289,3292;, + 3;3292,3289,3293;, + 3;3296,3333,3295;, + 3;3296,3332,3333;, + 3;3297,3340,3296;, + 3;3297,3339,3340;, + 3;3298,3300,3297;, + 3;3298,3299,3300;, + 3;3294,3298,3295;, + 3;3295,3298,3297;, + 3;3295,3297,3296;, + 3;3301,3339,3300;, + 3;3301,3338,3339;, + 3;3302,3355,3301;, + 3;3302,3354,3355;, + 3;3303,3323,3302;, + 3;3303,3322,3323;, + 3;3303,3299,3304;, + 3;3299,3303,3300;, + 3;3300,3303,3302;, + 3;3300,3302,3301;, + 3;3307,3320,3306;, + 3;3307,3326,3320;, + 3;3308,3315,3307;, + 3;3308,3314,3315;, + 3;3305,3308,3306;, + 3;3306,3308,3307;, + 3;3309,3319,3313;, + 3;3309,3318,3319;, + 3;3310,3344,3309;, + 3;3310,3343,3344;, + 3;3311,3329,3310;, + 3;3311,3328,3329;, + 3;3312,3309,3313;, + 3;3309,3312,3311;, + 3;3309,3311,3310;, + 3;3316,3326,3315;, + 3;3316,3325,3326;, + 3;3317,3350,3316;, + 3;3317,3349,3350;, + 3;3318,3345,3317;, + 3;3318,3344,3345;, + 3;3319,3316,3315;, + 3;3319,3315,3314;, + 3;3316,3319,3318;, + 3;3316,3318,3317;, + 3;3324,3354,3323;, + 3;3324,3353,3354;, + 3;3325,3351,3324;, + 3;3325,3350,3351;, + 3;3326,3322,3321;, + 3;3326,3321,3320;, + 3;3322,3326,3323;, + 3;3323,3326,3325;, + 3;3323,3325,3324;, + 3;3327,3335,3330;, + 3;3327,3334,3335;, + 3;3330,3343,3329;, + 3;3330,3342,3343;, + 3;3330,3329,3327;, + 3;3327,3329,3328;, + 3;3331,3342,3335;, + 3;3331,3347,3342;, + 3;3332,3341,3331;, + 3;3332,3340,3341;, + 3;3331,3335,3332;, + 3;3332,3335,3334;, + 3;3332,3334,3333;, + 3;3336,3347,3341;, + 3;3336,3346,3347;, + 3;3337,3348,3336;, + 3;3337,3352,3348;, + 3;3338,3356,3337;, + 3;3338,3355,3356;, + 3;3337,3336,3338;, + 3;3338,3336,3341;, + 3;3338,3341,3340;, + 3;3338,3340,3339;, + 3;3346,3349,3345;, + 3;3346,3348,3349;, + 3;3346,3342,3347;, + 3;3342,3346,3343;, + 3;3343,3346,3345;, + 3;3343,3345,3344;, + 3;3352,3353,3351;, + 3;3352,3356,3353;, + 3;3348,3352,3349;, + 3;3349,3352,3351;, + 3;3349,3351,3350;, + 3;3356,3355,3353;, + 3;3353,3355,3354;, + 3;3357,3367,3361;, + 3;3357,3373,3367;, + 3;3359,3357,3361;, + 3;3359,3361,3360;, + 3;3357,3359,3358;, + 3;3366,3370,3365;, + 3;3366,3369,3370;, + 3;4384,3362,4382;, + 3;3365,3364,3366;, + 3;3362,4384,3363;, + 3;3372,3374,3371;, + 3;3372,3378,3374;, + 3;3371,3368,3367;, + 3;3371,3367,3373;, + 3;3371,3373,3372;, + 3;3368,3371,3369;, + 3;3369,3371,3370;, + 3;3376,3378,3377;, + 3;3378,3376,3375;, + 3;3378,3375,3374;, + 3;3382,3408,3381;, + 3;3382,3407,3408;, + 3;3383,3413,3382;, + 3;3383,3412,3413;, + 3;3381,3383,3382;, + 3;3383,3381,3384;, + 3;3384,3381,3380;, + 3;3384,3380,3379;, + 3;3385,3396,3391;, + 3;3385,3400,3396;, + 3;3389,3393,3388;, + 3;3389,3392,3393;, + 3;3390,3389,3387;, + 3;3390,3387,3391;, + 3;3391,3387,3386;, + 3;3391,3386,3385;, + 3;3387,3389,3388;, + 3;2014,3392,3395;, + 3;2014,3393,3392;, + 3;2014,3394,3393;, + 3;3399,3401,3398;, + 3;3399,3405,3401;, + 3;3400,3399,3398;, + 3;3400,3398,3397;, + 3;3400,3397,3396;, + 3;3403,3410,3402;, + 3;3403,3409,3410;, + 3;3401,3405,3403;, + 3;3401,3403,3402;, + 3;3403,3405,3404;, + 3;3407,3414,3406;, + 3;3407,3413,3414;, + 3;3410,3407,3411;, + 3;3411,3407,3406;, + 3;3407,3410,3408;, + 3;3408,3410,3409;, + 3;3414,3413,3412;, + 3;3414,3412,3415;, + 3;21,88,845;, + 3;151,846,3755;, + 3;4310,4309,4427;, + 3;4310,4428,4311;, + 3;1769,3416,1770;, + 3;3416,1778,4148;, + 3;3417,1901,4429;, + 3;4429,4234,3417;, + 3;4430,3510,185;, + 3;4430,185,3509;, + 3;61,4431,3448;, + 3;61,0,4431;; + } + + MeshTextureCoords { + 4432; + 0.551713;0.158481;, + 0.442939;0.266364;, + 0.465760;0.091118;, + 0.359428;0.057171;, + 0.465760;0.024419;, + 0.815422;0.057523;, + 0.083667;0.060652;, + 0.597076;0.069576;, + 0.920137;0.671109;, + 0.842554;0.693424;, + 0.920019;0.713969;, + 0.728562;0.172729;, + 0.118906;0.107861;, + 0.644406;0.127337;, + 0.118913;0.144835;, + 0.430296;0.052895;, + 0.359428;0.116154;, + 0.356021;0.319790;, + 0.394347;0.323160;, + 0.427233;0.319079;, + 0.430296;0.009352;, + 0.886645;0.662715;, + 0.381887;0.022695;, + 0.658351;0.174014;, + 0.092993;0.146098;, + 0.685906;0.229150;, + 0.736179;0.215636;, + 0.629846;0.219982;, + 0.464459;0.320677;, + 0.700253;0.195920;, + 0.610610;0.168595;, + 0.066200;0.058208;, + 0.733851;0.325871;, + 0.054606;0.442647;, + 0.359428;0.246170;, + 0.427560;0.247468;, + 0.438618;0.408674;, + 0.356022;0.415064;, + 0.118913;0.173767;, + 0.455026;0.364714;, + 0.052464;0.254765;, + 0.419322;0.437861;, + 0.116059;0.366961;, + 0.394347;0.328619;, + 0.427233;0.324538;, + 0.442698;0.438188;, + 0.118774;0.254205;, + 0.356153;0.437792;, + 0.059890;0.171424;, + 0.032251;0.182250;, + 0.066673;0.190119;, + 0.023519;0.157546;, + 0.058251;0.145266;, + 0.005628;0.152079;, + 0.006431;0.150480;, + 0.049446;0.218747;, + 0.095581;0.212780;, + 0.118913;0.212000;, + 0.359428;0.181162;, + 0.398753;0.181862;, + 0.432820;0.182511;, + 0.574290;0.239863;, + 0.458415;0.271707;, + 0.446591;0.185893;, + 0.065339;0.442780;, + 0.669024;0.320480;, + 0.445846;0.325337;, + 0.006030;0.151279;, + 0.465760;0.051887;, + 0.559147;0.049519;, + 0.595529;0.117266;, + 0.465925;0.109701;, + 0.549941;0.151917;, + 0.587717;0.115217;, + 0.590694;0.071521;, + 0.557217;0.052500;, + 0.495192;0.111541;, + 0.522997;0.132857;, + 0.516882;0.039315;, + 0.495714;0.070258;, + 0.356021;0.382789;, + 0.375183;0.384474;, + 0.391626;0.382434;, + 0.425472;0.376874;, + 0.031504;0.215546;, + 0.359428;0.024842;, + 0.867640;0.034178;, + 0.839678;0.036502;, + 0.857340;0.649725;, + 0.359428;0.008334;, + 0.379332;0.007404;, + 0.389688;0.008235;, + 0.400856;0.002144;, + 0.409716;0.001197;, + 0.583239;0.012330;, + 0.793406;0.132263;, + 0.861711;0.672549;, + 0.893865;0.675224;, + 0.920564;0.687001;, + 0.845283;0.668070;, + 0.385765;0.310131;, + 0.667913;0.113729;, + 0.650023;0.087602;, + 0.631536;0.052867;, + 0.617447;0.029000;, + 0.639832;0.037988;, + 0.812486;0.054699;, + 0.803245;0.160421;, + 0.785495;0.208704;, + 0.867984;0.031841;, + 0.836932;0.034143;, + 0.815334;0.099408;, + 0.867984;0.017331;, + 0.830556;0.015332;, + 0.812307;0.023785;, + 0.792631;0.034435;, + 0.777019;0.056595;, + 0.764128;0.102698;, + 0.806759;0.138419;, + 0.758543;0.203424;, + 0.756451;0.178241;, + 0.750154;0.161070;, + 0.757487;0.141824;, + 0.779602;0.155868;, + 0.644346;0.272464;, + 0.639107;0.250146;, + 0.671632;0.200776;, + 0.662200;0.223137;, + 0.613887;0.268609;, + 0.631047;0.289558;, + 0.902852;0.117289;, + 0.850579;0.117328;, + 0.858474;0.096123;, + 0.901940;0.096616;, + 0.888860;0.096164;, + 0.832815;0.095553;, + 0.833973;0.117980;, + 0.551713;0.158481;, + 0.269100;0.266364;, + 0.251153;0.091117;, + 0.251153;0.024419;, + 0.920762;0.057447;, + 0.154150;0.060652;, + 0.597076;0.069576;, + 0.999127;0.694070;, + 0.728563;0.172729;, + 0.644406;0.127337;, + 0.286617;0.052895;, + 0.317692;0.323160;, + 0.284805;0.319079;, + 0.288556;0.009352;, + 0.953569;0.662737;, + 0.336965;0.022695;, + 0.658351;0.174014;, + 0.144837;0.146098;, + 0.685906;0.229150;, + 0.736179;0.215636;, + 0.629846;0.219982;, + 0.247580;0.320677;, + 0.700253;0.195920;, + 0.610610;0.168595;, + 0.171617;0.058208;, + 0.733851;0.325871;, + 0.181585;0.442779;, + 0.289352;0.247468;, + 0.205506;0.226805;, + 0.257013;0.364714;, + 0.184968;0.254780;, + 0.293026;0.437918;, + 0.317692;0.328619;, + 0.284805;0.324538;, + 0.269586;0.437793;, + 0.177940;0.171424;, + 0.205578;0.182250;, + 0.171156;0.190119;, + 0.214310;0.157546;, + 0.179579;0.145266;, + 0.229734;0.152079;, + 0.228932;0.150480;, + 0.188350;0.218747;, + 0.142249;0.212780;, + 0.318160;0.181862;, + 0.284092;0.182511;, + 0.574290;0.239863;, + 0.253624;0.271707;, + 0.270321;0.185893;, + 0.170852;0.442780;, + 0.669025;0.320480;, + 0.266193;0.325337;, + 0.229333;0.151279;, + 0.251153;0.051887;, + 0.559147;0.049519;, + 0.595529;0.117266;, + 0.250988;0.109701;, + 0.549531;0.151558;, + 0.585685;0.115494;, + 0.590395;0.071657;, + 0.557163;0.051913;, + 0.495714;0.111887;, + 0.521581;0.134300;, + 0.516917;0.039559;, + 0.495684;0.070180;, + 0.336856;0.384474;, + 0.320412;0.382434;, + 0.286567;0.376874;, + 0.206326;0.215546;, + 0.895403;0.036408;, + 0.919225;0.096002;, + 0.339520;0.007404;, + 0.329164;0.008235;, + 0.317996;0.002144;, + 0.309135;0.001197;, + 0.583239;0.012330;, + 0.942568;0.132263;, + 0.979425;0.675217;, + 0.946726;0.677891;, + 0.996398;0.668070;, + 0.326274;0.310131;, + 0.667913;0.113729;, + 0.650023;0.087602;, + 0.631536;0.052867;, + 0.617447;0.029000;, + 0.639832;0.037988;, + 0.923488;0.054699;, + 0.932729;0.160421;, + 0.950479;0.208704;, + 0.899042;0.034144;, + 0.920641;0.099408;, + 0.905419;0.015332;, + 0.923667;0.023785;, + 0.943344;0.034435;, + 0.958955;0.056595;, + 0.971847;0.102698;, + 0.929215;0.138419;, + 0.977432;0.203424;, + 0.979524;0.178241;, + 0.985820;0.161071;, + 0.978488;0.141824;, + 0.956372;0.155868;, + 0.644346;0.272464;, + 0.639107;0.250146;, + 0.671632;0.200776;, + 0.662200;0.223137;, + 0.613887;0.268609;, + 0.631047;0.289558;, + 0.902852;0.117289;, + 0.850579;0.117328;, + 0.858475;0.096123;, + 0.901940;0.096616;, + 0.888860;0.096164;, + 0.832815;0.095553;, + 0.833973;0.117980;, + 0.362779;0.521593;, + 0.114079;0.496280;, + 0.015593;0.538621;, + 0.413067;0.590996;, + 0.071282;0.556579;, + 0.114079;0.567406;, + 0.099956;0.579574;, + 0.424300;0.515014;, + 0.462475;0.504546;, + 0.109294;0.615708;, + 0.446455;0.570659;, + 0.063583;0.507001;, + 0.114079;0.543305;, + 0.431632;0.586910;, + 0.460591;0.574244;, + 0.088110;0.748276;, + 0.375357;0.785656;, + 0.112550;0.731015;, + 0.049365;0.760989;, + 0.041062;0.962565;, + 0.410288;0.967981;, + 0.434010;0.752783;, + 0.015465;0.715644;, + 0.033054;0.737854;, + 0.457389;0.965598;, + 0.433322;0.965919;, + 0.477819;0.771756;, + 0.082704;0.664352;, + 0.114762;0.674474;, + 0.061982;0.570639;, + 0.046172;0.686846;, + 0.410308;0.618813;, + 0.788717;0.583537;, + 0.413698;0.695212;, + 0.446559;0.645880;, + 0.058540;0.706405;, + 0.418117;0.723574;, + 0.031199;0.570609;, + 0.742190;0.313064;, + 0.756779;0.321579;, + 0.783375;0.328557;, + 0.826151;0.329094;, + 0.853820;0.326370;, + 0.746033;0.275270;, + 0.762350;0.266786;, + 0.789513;0.268192;, + 0.831224;0.279205;, + 0.857563;0.289306;, + 0.724828;0.460339;, + 0.739319;0.455172;, + 0.757159;0.439798;, + 0.414408;0.971032;, + 0.728309;0.346757;, + 0.745926;0.344262;, + 0.772846;0.351868;, + 0.010735;0.967181;, + 0.861627;0.308964;, + 0.837868;0.327705;, + 0.842297;0.284145;, + 0.411091;0.651182;, + 0.428698;0.876513;, + 0.423699;0.568455;, + 0.065047;0.942678;, + 0.037106;0.942847;, + 0.079040;0.940766;, + 0.391091;0.940519;, + 0.011332;0.941808;, + 0.412732;0.940671;, + 0.462371;0.941498;, + 0.437517;0.942397;, + 0.375061;0.808473;, + 0.399631;0.794862;, + 0.442565;0.794868;, + 0.081790;0.877027;, + 0.024359;0.876663;, + 0.383056;0.878540;, + 0.449565;0.876567;, + 0.480165;0.877379;, + 0.046689;0.877006;, + 0.407005;0.875615;, + 0.013484;0.572291;, + 0.084679;0.696575;, + 0.030451;0.697677;, + 0.392449;0.753106;, + 0.421098;0.794206;, + 0.051990;0.644457;, + 0.750745;0.580656;, + 0.416248;0.711576;, + 0.418268;0.732598;, + 0.416528;0.716968;, + 0.415048;0.703811;, + 0.054057;0.740134;, + 0.043962;0.728755;, + 0.072651;0.727710;, + 0.061716;0.964870;, + 0.784783;0.408719;, + 0.023733;0.964338;, + 0.784278;0.388010;, + 0.790879;0.373359;, + 0.787672;0.372002;, + 0.799093;0.370321;, + 0.819904;0.363746;, + 0.836925;0.361193;, + 0.856879;0.367989;, + 0.852722;0.366515;, + 0.789870;0.422196;, + 0.790150;0.426709;, + 0.802645;0.438063;, + 0.841137;0.441531;, + 0.855986;0.431918;, + 0.818542;0.442967;, + 0.830870;0.443475;, + 0.849598;0.436887;, + 0.861367;0.437046;, + 0.844150;0.363301;, + 0.046193;0.968453;, + 0.034249;0.969452;, + 0.026167;0.976093;, + 0.024562;0.979040;, + 0.023590;0.980527;, + 0.021595;0.986662;, + 0.458536;0.990264;, + 0.443083;0.983817;, + 0.451432;0.985102;, + 0.054884;0.971077;, + 0.058812;0.974886;, + 0.061081;0.985310;, + 0.421917;0.990046;, + 0.429331;0.982643;, + 0.061489;0.988962;, + 0.423160;0.991430;, + 0.422049;0.986512;, + 0.437053;0.983662;, + 0.455713;0.987962;, + 0.751936;0.511608;, + 0.775565;0.511382;, + 0.790667;0.510828;, + 0.742260;0.511058;, + 0.446359;0.592000;, + 0.056469;0.615493;, + 0.429093;0.704697;, + 0.113358;0.698276;, + 0.471054;0.693874;, + 0.443694;0.677693;, + 0.732967;0.488721;, + 0.824812;0.489415;, + 0.811150;0.610036;, + 0.725246;0.572015;, + 0.797433;0.490302;, + 0.757124;0.490022;, + 0.786758;0.613931;, + 0.823818;0.573700;, + 0.726973;0.508449;, + 0.825801;0.540741;, + 0.750561;0.617018;, + 0.726834;0.606098;, + 0.821824;0.510894;, + 0.790460;0.583701;, + 0.752506;0.580815;, + 0.753155;0.511554;, + 0.793248;0.510776;, + 0.740977;0.510621;, + 0.788229;0.614117;, + 0.724265;0.508140;, + 0.752135;0.617252;, + 0.826553;0.510835;, + 0.777823;0.511251;, + 0.754149;0.511440;, + 0.805126;0.511381;, + 0.114079;0.557341;, + 0.759721;0.398421;, + 0.761054;0.366386;, + 0.752224;0.439813;, + 0.816369;0.348071;, + 0.763538;0.460181;, + 0.395296;0.477256;, + 0.359862;0.470419;, + 0.088767;0.477079;, + 0.114079;0.476699;, + 0.411840;0.477331;, + 0.424655;0.477418;, + 0.066498;0.477187;, + 0.054242;0.477230;, + 0.439588;0.477494;, + 0.104660;0.254436;, + 0.096806;0.469878;, + 0.042134;0.449763;, + 0.414949;0.445141;, + 0.445503;0.445173;, + 0.848943;0.392358;, + 0.359862;0.445094;, + 0.391297;0.471167;, + 0.359862;0.470734;, + 0.076342;0.470898;, + 0.114079;0.476851;, + 0.414326;0.471332;, + 0.432164;0.471525;, + 0.042403;0.471131;, + 0.023723;0.471226;, + 0.448021;0.471691;, + 0.096201;0.449182;, + 0.104436;0.476901;, + 0.848942;0.395254;, + 0.848943;0.414986;, + 0.838153;0.395231;, + 0.838152;0.414996;, + 0.104420;0.486605;, + 0.106000;0.540169;, + 0.114079;0.496443;, + 0.114079;0.543468;, + 0.104114;0.486767;, + 0.105694;0.540332;, + 0.418093;0.495004;, + 0.423993;0.537540;, + 0.052028;0.528907;, + 0.392382;0.518528;, + 0.393769;0.530518;, + 0.396684;0.550706;, + 0.396337;0.568785;, + 0.392230;0.581982;, + 0.393079;0.606632;, + 0.438065;0.499238;, + 0.444577;0.525255;, + 0.387594;0.633179;, + 0.392223;0.662757;, + 0.396860;0.687511;, + 0.428691;0.622255;, + 0.435371;0.647317;, + 0.432617;0.685648;, + 0.087463;0.497126;, + 0.044563;0.505211;, + 0.079294;0.533408;, + 0.064206;0.504727;, + 0.039557;0.954539;, + 0.047283;0.954585;, + 0.427587;0.955639;, + 0.436284;0.955532;, + 0.074460;0.952724;, + 0.107172;0.957531;, + 0.394046;0.960089;, + 0.011938;0.955578;, + 0.025135;0.953131;, + 0.031836;0.953763;, + 0.418250;0.955939;, + 0.445123;0.955762;, + 0.454737;0.955923;, + 0.060252;0.954128;, + 0.064395;0.953699;, + 0.468310;0.956951;, + 0.048881;0.923002;, + 0.067036;0.922724;, + 0.034866;0.922252;, + 0.041046;0.922410;, + 0.453757;0.921277;, + 0.459086;0.921847;, + 0.435977;0.920548;, + 0.429060;0.920667;, + 0.411319;0.921527;, + 0.418037;0.920760;, + 0.082849;0.921580;, + 0.105367;0.921562;, + 0.076317;0.922237;, + 0.022332;0.921620;, + 0.446710;0.921015;, + 0.009127;0.921034;, + 0.039900;0.830890;, + 0.047550;0.831189;, + 0.410351;0.830272;, + 0.423955;0.828454;, + 0.402420;0.830320;, + 0.067293;0.831602;, + 0.082288;0.830912;, + 0.028250;0.831256;, + 0.480055;0.833255;, + 0.466431;0.833260;, + 0.456669;0.830024;, + 0.393812;0.832157;, + 0.385383;0.831460;, + 0.377789;0.834202;, + 0.445359;0.830391;, + 0.437600;0.830169;, + 0.109740;0.773655;, + 0.394735;0.772286;, + 0.400492;0.771751;, + 0.434800;0.771486;, + 0.095454;0.772777;, + 0.068958;0.775796;, + 0.086328;0.774353;, + 0.039592;0.773128;, + 0.027588;0.773542;, + 0.051030;0.774597;, + 0.415238;0.750555;, + 0.418145;0.769176;, + 0.068759;0.877502;, + 0.013073;0.740827;, + 0.110236;0.754382;, + 0.078908;0.601144;, + 0.100667;0.632553;, + 0.410634;0.615525;, + 0.105165;0.597111;, + 0.392799;0.705637;, + 0.086349;0.723962;, + 0.362779;0.491146;, + 0.362779;0.547658;, + 0.394008;0.495494;, + 0.214445;0.539488;, + 0.312502;0.590996;, + 0.156867;0.556579;, + 0.127949;0.579574;, + 0.296719;0.515014;, + 0.263475;0.504546;, + 0.120939;0.615708;, + 0.274563;0.570659;, + 0.166661;0.506808;, + 0.293936;0.586910;, + 0.259858;0.571459;, + 0.148894;0.749622;, + 0.353177;0.784954;, + 0.127105;0.730907;, + 0.178784;0.760989;, + 0.194710;0.961754;, + 0.315281;0.967981;, + 0.291559;0.752783;, + 0.221894;0.714124;, + 0.202002;0.739201;, + 0.268180;0.965598;, + 0.292247;0.965919;, + 0.250861;0.773185;, + 0.148102;0.666339;, + 0.126837;0.672304;, + 0.166167;0.570639;, + 0.187128;0.679052;, + 0.315261;0.618812;, + 0.788717;0.583537;, + 0.311871;0.695212;, + 0.279010;0.645879;, + 0.176804;0.706885;, + 0.307451;0.723574;, + 0.198839;0.571476;, + 0.742190;0.312541;, + 0.756779;0.321055;, + 0.783375;0.328033;, + 0.826151;0.328571;, + 0.853820;0.325847;, + 0.746033;0.274746;, + 0.762350;0.266262;, + 0.789513;0.267668;, + 0.831224;0.278682;, + 0.857563;0.288782;, + 0.724828;0.460339;, + 0.739319;0.455172;, + 0.757159;0.439798;, + 0.319470;0.975754;, + 0.728309;0.346757;, + 0.745926;0.344262;, + 0.772846;0.351868;, + 0.227252;0.968539;, + 0.861627;0.308441;, + 0.837868;0.327181;, + 0.842297;0.283622;, + 0.314478;0.651182;, + 0.296871;0.876513;, + 0.297319;0.568455;, + 0.170740;0.942462;, + 0.198680;0.942631;, + 0.156747;0.940551;, + 0.346972;0.946444;, + 0.227556;0.941050;, + 0.312837;0.940671;, + 0.263198;0.941498;, + 0.288052;0.942397;, + 0.350771;0.806681;, + 0.325938;0.794862;, + 0.283003;0.794868;, + 0.154964;0.877145;, + 0.209435;0.877359;, + 0.350023;0.880017;, + 0.276004;0.876567;, + 0.248126;0.876903;, + 0.189592;0.877125;, + 0.327467;0.876705;, + 0.216554;0.573159;, + 0.150901;0.696187;, + 0.195986;0.685920;, + 0.333119;0.753106;, + 0.304470;0.794206;, + 0.179704;0.645000;, + 0.750745;0.580656;, + 0.309321;0.711576;, + 0.307301;0.732598;, + 0.309041;0.716968;, + 0.310520;0.703811;, + 0.179110;0.740324;, + 0.196462;0.720314;, + 0.163874;0.727025;, + 0.175639;0.964059;, + 0.784588;0.408840;, + 0.212039;0.963527;, + 0.784082;0.388131;, + 0.790683;0.373480;, + 0.787672;0.372002;, + 0.799093;0.370321;, + 0.819904;0.363746;, + 0.836925;0.361193;, + 0.856879;0.367989;, + 0.852722;0.366515;, + 0.781318;0.421781;, + 0.790151;0.426709;, + 0.802645;0.438063;, + 0.841137;0.441531;, + 0.855986;0.431918;, + 0.818542;0.442967;, + 0.830870;0.443475;, + 0.849598;0.436887;, + 0.861065;0.436308;, + 0.844150;0.363301;, + 0.188198;0.969250;, + 0.200851;0.969815;, + 0.208933;0.976456;, + 0.210538;0.979402;, + 0.211510;0.980889;, + 0.212619;0.987459;, + 0.267032;0.990264;, + 0.282486;0.983817;, + 0.274136;0.985102;, + 0.177024;0.972308;, + 0.172563;0.978070;, + 0.167812;0.984370;, + 0.311368;0.988230;, + 0.296237;0.982643;, + 0.167404;0.988023;, + 0.321700;0.992157;, + 0.303520;0.986512;, + 0.288516;0.983662;, + 0.269855;0.987962;, + 0.751936;0.511608;, + 0.775565;0.511382;, + 0.790667;0.510828;, + 0.742260;0.511058;, + 0.279210;0.591999;, + 0.172625;0.617805;, + 0.296476;0.704697;, + 0.127747;0.694998;, + 0.259571;0.683877;, + 0.281486;0.677693;, + 0.732967;0.488721;, + 0.824812;0.489415;, + 0.811150;0.610036;, + 0.725246;0.572015;, + 0.797433;0.490302;, + 0.757124;0.490022;, + 0.786758;0.613931;, + 0.823818;0.573700;, + 0.726973;0.508449;, + 0.825801;0.540741;, + 0.750561;0.617018;, + 0.726834;0.606098;, + 0.821824;0.510894;, + 0.790460;0.583701;, + 0.752506;0.580815;, + 0.753155;0.511554;, + 0.793248;0.510776;, + 0.740977;0.510621;, + 0.788229;0.614117;, + 0.724265;0.508140;, + 0.752135;0.617252;, + 0.826553;0.510835;, + 0.777823;0.511251;, + 0.754149;0.511440;, + 0.805126;0.511381;, + 0.759526;0.398542;, + 0.761054;0.366386;, + 0.752224;0.439813;, + 0.816369;0.348071;, + 0.763538;0.460181;, + 0.325722;0.477256;, + 0.139382;0.477079;, + 0.309178;0.477331;, + 0.296364;0.477418;, + 0.163540;0.478054;, + 0.175796;0.478097;, + 0.286362;0.477494;, + 0.132862;0.254436;, + 0.127918;0.469878;, + 0.186151;0.449763;, + 0.309627;0.445141;, + 0.276170;0.445173;, + 0.330860;0.471167;, + 0.152834;0.470898;, + 0.307830;0.471332;, + 0.289993;0.471525;, + 0.186773;0.471131;, + 0.205453;0.471226;, + 0.274619;0.471691;, + 0.128523;0.449182;, + 0.124295;0.476901;, + 0.858050;0.395224;, + 0.858013;0.415012;, + 0.124310;0.488385;, + 0.123749;0.539991;, + 0.124616;0.488548;, + 0.124054;0.540154;, + 0.302926;0.495004;, + 0.297025;0.537540;, + 0.178010;0.529774;, + 0.328636;0.518528;, + 0.327249;0.530518;, + 0.324335;0.550706;, + 0.324681;0.568785;, + 0.333339;0.581982;, + 0.332490;0.606632;, + 0.282953;0.499238;, + 0.276441;0.525255;, + 0.337974;0.633179;, + 0.333346;0.662757;, + 0.328709;0.687511;, + 0.296878;0.622255;, + 0.290197;0.647317;, + 0.292952;0.685648;, + 0.140893;0.496067;, + 0.185508;0.505018;, + 0.148854;0.533408;, + 0.166039;0.504534;, + 0.195019;0.954017;, + 0.187293;0.954062;, + 0.297982;0.955639;, + 0.289285;0.955532;, + 0.159912;0.950756;, + 0.134967;0.960262;, + 0.323148;0.959549;, + 0.227794;0.956682;, + 0.209442;0.952609;, + 0.202741;0.953240;, + 0.307318;0.955939;, + 0.280446;0.955762;, + 0.270832;0.955923;, + 0.174324;0.953605;, + 0.170182;0.953177;, + 0.267761;0.956475;, + 0.185260;0.923093;, + 0.166869;0.922238;, + 0.200928;0.922343;, + 0.194040;0.922790;, + 0.271812;0.921277;, + 0.266483;0.921847;, + 0.289591;0.920548;, + 0.296509;0.920667;, + 0.323153;0.922617;, + 0.307532;0.920760;, + 0.149462;0.921383;, + 0.134007;0.919990;, + 0.155182;0.922040;, + 0.211948;0.922290;, + 0.278858;0.921015;, + 0.225949;0.921414;, + 0.194927;0.831623;, + 0.186805;0.832210;, + 0.315217;0.830272;, + 0.301614;0.828454;, + 0.323149;0.830320;, + 0.167299;0.832624;, + 0.152776;0.831645;, + 0.208876;0.832250;, + 0.253050;0.830737;, + 0.267081;0.829903;, + 0.274345;0.830976;, + 0.328922;0.829025;, + 0.338526;0.829644;, + 0.351328;0.831822;, + 0.280209;0.830391;, + 0.287969;0.830169;, + 0.126361;0.773469;, + 0.330834;0.772286;, + 0.325077;0.771751;, + 0.290768;0.771486;, + 0.141975;0.768795;, + 0.164453;0.775643;, + 0.148027;0.773912;, + 0.195235;0.772686;, + 0.207004;0.772233;, + 0.179311;0.769531;, + 0.310331;0.750555;, + 0.307424;0.769176;, + 0.167049;0.878487;, + 0.222577;0.740583;, + 0.127126;0.753815;, + 0.151890;0.600774;, + 0.134216;0.634865;, + 0.314934;0.615524;, + 0.126647;0.597111;, + 0.332770;0.705637;, + 0.149467;0.725011;, + 0.327010;0.495494;, + 0.860789;0.657454;, + 0.978336;0.654931;, + 0.313267;0.411755;, + 0.400447;0.411627;, + 0.536289;0.424917;, + 0.499467;0.433281;, + 0.571290;0.353491;, + 0.590379;0.363402;, + 0.579112;0.483381;, + 0.615218;0.411951;, + 0.665610;0.410428;, + 0.615331;0.353127;, + 0.515344;0.481729;, + 0.498592;0.482057;, + 0.698075;0.478723;, + 0.614392;0.483897;, + 0.645237;0.478272;, + 0.715733;0.529411;, + 0.612983;0.524847;, + 0.523967;0.489788;, + 0.652416;0.486671;, + 0.526120;0.521423;, + 0.653761;0.532059;, + 0.495030;0.522681;, + 0.576437;0.524074;, + 0.715714;0.485627;, + 0.699421;0.485627;, + 0.577420;0.491458;, + 0.615127;0.491934;, + 0.679818;0.486289;, + 0.490235;0.487956;, + 0.635713;0.529981;, + 0.635720;0.486830;, + 0.678267;0.532636;, + 0.486373;0.534489;, + 0.494039;0.535189;, + 0.654239;0.538592;, + 0.679198;0.539289;, + 0.619681;0.536690;, + 0.636359;0.538445;, + 0.527499;0.535352;, + 0.576745;0.536475;, + 0.681707;0.479236;, + 0.716165;0.476668;, + 0.544027;0.484449;, + 0.501868;0.507433;, + 0.493455;0.506823;, + 0.697537;0.508227;, + 0.715163;0.508854;, + 0.550096;0.509441;, + 0.576243;0.509953;, + 0.593682;0.510741;, + 0.612347;0.510925;, + 0.633337;0.509019;, + 0.642214;0.509013;, + 0.687735;0.508461;, + 0.680802;0.508655;, + 0.669120;0.508902;, + 0.628648;0.508941;, + 0.520188;0.508274;, + 0.531694;0.509755;, + 0.653675;0.509091;, + 0.568360;0.596314;, + 0.521581;0.593697;, + 0.615591;0.580289;, + 0.570231;0.714150;, + 0.541700;0.715288;, + 0.505061;0.580731;, + 0.638820;0.606874;, + 0.670871;0.714940;, + 0.522733;0.717029;, + 0.693528;0.607941;, + 0.666459;0.608484;, + 0.706173;0.594310;, + 0.625995;0.593169;, + 0.512624;0.594919;, + 0.545974;0.592953;, + 0.580745;0.598731;, + 0.582736;0.661778;, + 0.592837;0.662044;, + 0.573003;0.661443;, + 0.563094;0.661023;, + 0.549894;0.660271;, + 0.517677;0.658749;, + 0.529421;0.658867;, + 0.647622;0.658026;, + 0.636012;0.658320;, + 0.623324;0.658018;, + 0.540126;0.659521;, + 0.662431;0.658703;, + 0.676303;0.658561;, + 0.685399;0.659635;, + 0.695076;0.660466;, + 0.710549;0.661174;, + 0.544941;0.576131;, + 0.541656;0.556865;, + 0.523025;0.572790;, + 0.563141;0.575307;, + 0.553866;0.374524;, + 0.579122;0.410083;, + 0.715663;0.424895;, + 0.599689;0.345884;, + 0.873230;0.274025;, + 0.898854;0.274219;, + 0.958184;0.540522;, + 0.935286;0.536674;, + 0.874609;0.301468;, + 0.894704;0.289223;, + 0.960279;0.517513;, + 0.923442;0.290776;, + 0.873524;0.323161;, + 0.908654;0.364066;, + 0.990069;0.437218;, + 0.921995;0.366162;, + 0.975391;0.495368;, + 0.936371;0.444829;, + 0.952487;0.485622;, + 0.992783;0.435764;, + 0.927528;0.325647;, + 0.939277;0.476721;, + 0.936325;0.504751;, + 0.946497;0.334246;, + 0.926817;0.477177;, + 0.949882;0.328775;, + 0.900982;0.369442;, + 0.917022;0.367144;, + 0.905700;0.368564;, + 0.885802;0.371364;, + 0.919110;0.361178;, + 0.887784;0.366305;, + 0.883099;0.371914;, + 0.897381;0.369979;, + 0.975720;0.439230;, + 0.952400;0.442506;, + 0.942930;0.443943;, + 0.983446;0.438196;, + 0.987224;0.471182;, + 0.988285;0.492297;, + 0.958862;0.483089;, + 0.957743;0.501239;, + 0.931439;0.365235;, + 0.948438;0.470833;, + 0.954353;0.469827;, + 0.927964;0.338719;, + 0.934931;0.474721;, + 0.927571;0.472571;, + 0.941879;0.487722;, + 0.921776;0.482053;, + 0.939058;0.353581;, + 0.919942;0.473511;, + 0.912300;0.476143;, + 0.946882;0.345223;, + 0.929139;0.466241;, + 0.944801;0.363381;, + 0.917960;0.459364;, + 0.913105;0.460961;, + 0.949839;0.357962;, + 1.000000;1.000000;, + 0.950983;0.367857;, + 0.913408;0.450900;, + 0.911252;0.451536;, + 0.953230;0.365413;, + 0.915244;0.449142;, + 0.900640;0.363431;, + 0.913324;0.367647;, + 0.890638;0.370774;, + 0.876313;0.372530;, + 0.928631;0.365429;, + 0.959662;0.441499;, + 0.968760;0.440024;, + 0.918587;0.373211;, + 0.921969;0.372736;, + 0.927792;0.372084;, + 0.930233;0.371906;, + 0.936779;0.438485;, + 0.942792;0.437735;, + 0.919984;0.379212;, + 0.922713;0.378822;, + 0.927354;0.378302;, + 0.929268;0.378172;, + 0.937025;0.432481;, + 0.941818;0.431883;, + 0.919581;0.384226;, + 0.922252;0.383857;, + 0.926937;0.383332;, + 0.928951;0.383176;, + 0.937170;0.427349;, + 0.942009;0.426744;, + 0.918353;0.388611;, + 0.921672;0.388155;, + 0.927494;0.387502;, + 0.929998;0.387306;, + 0.936685;0.423466;, + 0.942698;0.422715;, + 0.918796;0.395081;, + 0.921850;0.394655;, + 0.927143;0.394062;, + 0.929382;0.393895;, + 0.936942;0.417357;, + 0.942408;0.416675;, + 0.920034;0.399980;, + 0.922304;0.399663;, + 0.926264;0.399219;, + 0.927954;0.399093;, + 0.937559;0.412281;, + 0.941648;0.411769;, + 0.919307;0.404223;, + 0.921874;0.403869;, + 0.926387;0.403363;, + 0.928332;0.403212;, + 0.937409;0.408406;, + 0.942069;0.407823;, + 0.917905;0.407449;, + 0.921148;0.407016;, + 0.926970;0.406363;, + 0.929548;0.406145;, + 0.936795;0.405668;, + 0.942807;0.404917;, + 0.918548;0.413426;, + 0.921333;0.413058;, + 0.926395;0.412491;, + 0.928671;0.412292;, + 0.937141;0.399905;, + 0.942368;0.399251;, + 0.920875;0.417398;, + 0.922434;0.417195;, + 0.925394;0.416864;, + 0.926796;0.416735;, + 0.937785;0.395465;, + 0.940842;0.395081;, + 0.922919;0.418989;, + 0.924915;0.418765;, + 0.901952;0.377814;, + 0.905828;0.377270;, + 0.912504;0.376521;, + 0.915302;0.376318;, + 0.952663;0.433953;, + 0.959556;0.433094;, + 0.903532;0.386027;, + 0.906660;0.385579;, + 0.911981;0.384983;, + 0.914175;0.384834;, + 0.952869;0.425673;, + 0.958364;0.424987;, + 0.903053;0.392854;, + 0.906115;0.392431;, + 0.911486;0.391829;, + 0.913794;0.391650;, + 0.953130;0.418898;, + 0.958676;0.418205;, + 0.901631;0.398799;, + 0.905435;0.398276;, + 0.912109;0.397528;, + 0.914980;0.397303;, + 0.952576;0.413568;, + 0.959469;0.412708;, + 0.902116;0.407623;, + 0.905616;0.407134;, + 0.911684;0.406454;, + 0.914251;0.406263;, + 0.952875;0.405219;, + 0.959141;0.404437;, + 0.903517;0.414330;, + 0.906120;0.413967;, + 0.910659;0.413459;, + 0.912596;0.413313;, + 0.953585;0.398356;, + 0.958273;0.397770;, + 0.902669;0.420094;, + 0.905613;0.419688;, + 0.910786;0.419108;, + 0.913016;0.418935;, + 0.953416;0.393054;, + 0.958758;0.392386;, + 0.901052;0.424454;, + 0.904769;0.423957;, + 0.911443;0.423209;, + 0.914399;0.422959;, + 0.952714;0.389283;, + 0.959606;0.388422;, + 0.901767;0.432611;, + 0.904961;0.432189;, + 0.910763;0.431539;, + 0.913372;0.431311;, + 0.953114;0.381429;, + 0.959106;0.380679;, + 0.904421;0.438084;, + 0.906207;0.437851;, + 0.909601;0.437471;, + 0.911209;0.437325;, + 0.953855;0.375458;, + 0.957360;0.375018;, + 0.906757;0.440305;, + 0.909046;0.440049;, + 0.886697;0.379215;, + 0.890457;0.378707;, + 0.896932;0.378021;, + 0.899646;0.377844;, + 0.968718;0.432149;, + 0.975405;0.431354;, + 0.888142;0.386760;, + 0.891176;0.386342;, + 0.896337;0.385796;, + 0.898465;0.385667;, + 0.969012;0.424526;, + 0.974343;0.423891;, + 0.887606;0.393030;, + 0.890576;0.392636;, + 0.895785;0.392084;, + 0.898024;0.391927;, + 0.969344;0.418289;, + 0.974724;0.417647;, + 0.886166;0.398492;, + 0.889856;0.398005;, + 0.896330;0.397319;, + 0.899114;0.397121;, + 0.968874;0.413398;, + 0.975560;0.412602;, + 0.886544;0.406601;, + 0.889939;0.406144;, + 0.895825;0.405521;, + 0.898314;0.405354;, + 0.969265;0.405734;, + 0.975344;0.405010;, + 0.887831;0.412762;, + 0.890355;0.412423;, + 0.894759;0.411957;, + 0.896637;0.411830;, + 0.970033;0.399417;, + 0.974581;0.398875;, + 0.886950;0.418057;, + 0.889805;0.417679;, + 0.894822;0.417148;, + 0.896985;0.416995;, + 0.969934;0.394550;, + 0.975116;0.393932;, + 0.885337;0.422064;, + 0.888943;0.421602;, + 0.895416;0.420917;, + 0.898283;0.420694;, + 0.969302;0.391091;, + 0.975987;0.390294;, + 0.885945;0.429560;, + 0.889043;0.429168;, + 0.894671;0.428572;, + 0.897201;0.428368;, + 0.969784;0.383876;, + 0.975597;0.383182;, + 0.888458;0.434587;, + 0.890191;0.434371;, + 0.893483;0.434023;, + 0.895042;0.433891;, + 0.970570;0.378374;, + 0.973970;0.377966;, + 0.890699;0.436626;, + 0.892918;0.436391;, + 0.873590;0.378201;, + 0.876754;0.377927;, + 0.882197;0.377665;, + 0.884478;0.377676;, + 0.983808;0.432077;, + 0.989434;0.431709;, + 0.874466;0.383837;, + 0.877019;0.383608;, + 0.881358;0.383399;, + 0.883146;0.383419;, + 0.984483;0.426530;, + 0.988968;0.426236;, + 0.873741;0.388449;, + 0.876240;0.388241;, + 0.880620;0.388030;, + 0.882501;0.388027;, + 0.984975;0.421784;, + 0.989502;0.421487;, + 0.872297;0.392437;, + 0.875400;0.392181;, + 0.880844;0.391919;, + 0.883183;0.391913;, + 0.984828;0.418156;, + 0.990454;0.417787;, + 0.872256;0.398460;, + 0.875112;0.398216;, + 0.880061;0.397978;, + 0.882153;0.397983;, + 0.985540;0.412506;, + 0.990654;0.412170;, + 0.873061;0.403065;, + 0.875184;0.402884;, + 0.878886;0.402706;, + 0.880465;0.402709;, + 0.986482;0.407841;, + 0.990308;0.407589;, + 0.872091;0.406953;, + 0.874492;0.406754;, + 0.878711;0.406551;, + 0.880528;0.406547;, + 0.986642;0.404240;, + 0.991003;0.403953;, + 0.870567;0.409862;, + 0.873600;0.409628;, + 0.879042;0.409366;, + 0.881452;0.409338;, + 0.986290;0.401667;, + 0.991915;0.401297;, + 0.994179;0.395552;, + 0.991526;0.395405;, + 0.878083;0.415017;, + 0.880210;0.414985;, + 0.987050;0.396345;, + 0.991941;0.396022;, + 0.872625;0.419247;, + 0.874082;0.419141;, + 0.876850;0.419008;, + 0.878160;0.418981;, + 0.987960;0.392274;, + 0.990821;0.392084;, + 0.874408;0.420834;, + 0.876274;0.420745;, + 0.914444;0.330564;, + 0.962526;0.444760;, + 0.947098;0.447390;, + 0.979132;0.443610;, + 0.985271;0.454609;, + 0.930510;0.349332;, + 0.967355;0.470956;, + 0.895790;0.329672;, + 0.886980;0.274433;, + 0.919031;0.270101;, + 0.979186;0.534000;, + 0.947140;0.538822;, + 0.957002;0.521258;, + 0.942677;0.521568;, + 0.893105;0.283020;, + 0.900449;0.283372;, + 0.922519;0.283117;, + 0.928835;0.282544;, + 0.874763;0.291310;, + 0.881797;0.290567;, + 0.984320;0.517049;, + 0.965323;0.519657;, + 0.518646;0.336598;, + 0.519827;0.371410;, + 0.671119;0.374923;, + 0.486141;0.378023;, + 0.588878;0.384537;, + 0.569369;0.436791;, + 0.534201;0.395395;, + 0.634315;0.390683;, + 0.607304;0.371257;, + 0.535522;0.425621;, + 0.498701;0.433986;, + 0.570523;0.354195;, + 0.589889;0.363950;, + 0.579469;0.482740;, + 0.614731;0.411675;, + 0.665839;0.411302;, + 0.615331;0.353206;, + 0.514578;0.482433;, + 0.498517;0.482369;, + 0.698304;0.479598;, + 0.614112;0.483887;, + 0.645466;0.479147;, + 0.715264;0.526177;, + 0.613551;0.534271;, + 0.531096;0.486869;, + 0.661319;0.486708;, + 0.533898;0.532181;, + 0.661506;0.529282;, + 0.504149;0.531138;, + 0.578216;0.532151;, + 0.715484;0.485370;, + 0.707527;0.484666;, + 0.579350;0.488162;, + 0.611873;0.490245;, + 0.684034;0.484824;, + 0.499835;0.486315;, + 0.635407;0.528739;, + 0.636344;0.485738;, + 0.685374;0.525285;, + 0.485483;0.536544;, + 0.504181;0.535788;, + 0.662302;0.538686;, + 0.686436;0.536711;, + 0.619347;0.535324;, + 0.637355;0.536477;, + 0.534074;0.539453;, + 0.580776;0.536237;, + 0.681936;0.480111;, + 0.716394;0.477543;, + 0.543261;0.485154;, + 0.512380;0.507259;, + 0.504256;0.507372;, + 0.707913;0.505918;, + 0.715722;0.505571;, + 0.553334;0.507820;, + 0.578888;0.508498;, + 0.595809;0.509229;, + 0.612006;0.510097;, + 0.636064;0.506550;, + 0.642318;0.506299;, + 0.693723;0.505835;, + 0.684686;0.505729;, + 0.670350;0.505681;, + 0.629570;0.506812;, + 0.529308;0.507480;, + 0.536796;0.507313;, + 0.661416;0.507466;, + 0.517391;0.595133;, + 0.564857;0.592438;, + 0.620836;0.580957;, + 0.510599;0.715034;, + 0.533576;0.715994;, + 0.581447;0.576337;, + 0.651435;0.606044;, + 0.671670;0.716734;, + 0.561921;0.715897;, + 0.698810;0.603964;, + 0.674236;0.605860;, + 0.714006;0.590496;, + 0.634894;0.593138;, + 0.573783;0.592411;, + 0.540258;0.592834;, + 0.504639;0.596143;, + 0.509154;0.659816;, + 0.499862;0.659718;, + 0.514719;0.660512;, + 0.521908;0.660850;, + 0.535305;0.660098;, + 0.572964;0.654723;, + 0.560465;0.658285;, + 0.662012;0.654201;, + 0.650061;0.654890;, + 0.638790;0.656414;, + 0.548662;0.659348;, + 0.673319;0.653810;, + 0.686816;0.653084;, + 0.698475;0.652173;, + 0.586011;0.659448;, + 0.579484;0.655725;, + 0.541523;0.575780;, + 0.545091;0.556142;, + 0.563590;0.570593;, + 0.522875;0.573126;, + 0.553099;0.375229;, + 0.578355;0.410788;, + 0.715892;0.425770;, + 0.599584;0.345902;, + 0.869675;0.267770;, + 0.891620;0.274340;, + 0.956631;0.542084;, + 0.936131;0.537141;, + 0.875823;0.291903;, + 0.893307;0.290193;, + 0.959778;0.518762;, + 0.919671;0.294804;, + 0.874479;0.328054;, + 0.905832;0.366700;, + 0.991250;0.437386;, + 0.918895;0.367352;, + 0.973930;0.494549;, + 0.935919;0.443871;, + 0.950260;0.484642;, + 0.995481;0.435612;, + 0.924402;0.321874;, + 0.936502;0.475754;, + 0.934527;0.502788;, + 0.947699;0.339652;, + 0.925497;0.472065;, + 0.951238;0.332417;, + 0.899767;0.368320;, + 0.915033;0.365409;, + 0.903303;0.370687;, + 0.885310;0.370839;, + 0.916506;0.360664;, + 0.886275;0.368562;, + 0.881875;0.374620;, + 0.895343;0.372597;, + 0.976255;0.439156;, + 0.952245;0.441938;, + 0.942662;0.443125;, + 0.984457;0.438215;, + 0.987884;0.470638;, + 0.988977;0.491286;, + 0.957438;0.482110;, + 0.956048;0.499888;, + 0.928789;0.362833;, + 0.947826;0.469637;, + 0.954265;0.468662;, + 0.925919;0.332234;, + 0.933349;0.473352;, + 0.927207;0.467318;, + 0.938676;0.486689;, + 0.920476;0.476691;, + 0.942098;0.355717;, + 0.917880;0.468511;, + 0.911620;0.470496;, + 0.948399;0.350490;, + 0.927114;0.461639;, + 0.948339;0.363541;, + 0.915516;0.454745;, + 0.911867;0.455840;, + 0.952128;0.361098;, + 0.919864;0.450733;, + 0.954704;0.366563;, + 0.910633;0.446448;, + 0.909327;0.446777;, + 0.956207;0.366122;, + 0.912421;0.444793;, + 0.898308;0.365823;, + 0.910559;0.369492;, + 0.888924;0.373638;, + 0.875394;0.375543;, + 0.925274;0.366156;, + 0.959696;0.441092;, + 0.969126;0.439797;, + 0.946551;0.435660;, + 0.944197;0.435084;, + 0.924834;0.372188;, + 0.927874;0.369346;, + 0.936435;0.437653;, + 0.942611;0.437033;, + 0.918336;0.376837;, + 0.920307;0.378600;, + 0.924728;0.377903;, + 0.927179;0.375442;, + 0.936819;0.431756;, + 0.941743;0.431260;, + 0.918002;0.382171;, + 0.920028;0.383564;, + 0.924491;0.382858;, + 0.926928;0.380758;, + 0.937546;0.426583;, + 0.942517;0.426082;, + 0.917018;0.386350;, + 0.919551;0.388025;, + 0.925096;0.387150;, + 0.928109;0.384601;, + 0.936815;0.422845;, + 0.942991;0.422224;, + 0.917843;0.391984;, + 0.920124;0.393698;, + 0.925165;0.392903;, + 0.927926;0.390393;, + 0.936796;0.416961;, + 0.942410;0.416396;, + 0.919169;0.396797;, + 0.920867;0.398064;, + 0.924640;0.397465;, + 0.926715;0.395600;, + 0.937739;0.411927;, + 0.941942;0.411503;, + 0.918694;0.400689;, + 0.920646;0.402013;, + 0.924945;0.401331;, + 0.927293;0.399326;, + 0.937422;0.408184;, + 0.942210;0.407701;, + 0.917571;0.403505;, + 0.920137;0.404827;, + 0.925683;0.403949;, + 0.928663;0.401749;, + 0.936576;0.405558;, + 0.942753;0.404935;, + 0.918567;0.408659;, + 0.920806;0.409677;, + 0.925629;0.408910;, + 0.928213;0.407126;, + 0.936823;0.399965;, + 0.942195;0.399422;, + 0.920804;0.412883;, + 0.922075;0.413388;, + 0.924898;0.412934;, + 0.926450;0.411976;, + 0.938017;0.395490;, + 0.941162;0.395171;, + 0.922702;0.414751;, + 0.924606;0.414444;, + 0.901020;0.376297;, + 0.903892;0.378556;, + 0.910249;0.377557;, + 0.913734;0.374299;, + 0.952605;0.433562;, + 0.959684;0.432851;, + 0.902829;0.384176;, + 0.905088;0.386198;, + 0.910156;0.385399;, + 0.912966;0.382578;, + 0.953165;0.425379;, + 0.958810;0.424811;, + 0.902468;0.391336;, + 0.904790;0.392933;, + 0.909907;0.392123;, + 0.912701;0.389716;, + 0.953864;0.418645;, + 0.959563;0.418070;, + 0.901359;0.397016;, + 0.904262;0.398936;, + 0.910620;0.397933;, + 0.914074;0.395011;, + 0.953027;0.413502;, + 0.960107;0.412790;, + 0.902334;0.404835;, + 0.904949;0.406801;, + 0.910728;0.405890;, + 0.913893;0.403013;, + 0.953007;0.405443;, + 0.959443;0.404795;, + 0.903877;0.411410;, + 0.905823;0.412862;, + 0.910148;0.412176;, + 0.912527;0.410037;, + 0.954090;0.398652;, + 0.958908;0.398166;, + 0.903351;0.416741;, + 0.905589;0.418259;, + 0.910517;0.417478;, + 0.913209;0.415179;, + 0.953727;0.393522;, + 0.959217;0.392968;, + 0.902077;0.420610;, + 0.905019;0.422126;, + 0.911377;0.421119;, + 0.914793;0.418597;, + 0.952759;0.389894;, + 0.959840;0.389180;, + 0.903247;0.427782;, + 0.905813;0.428948;, + 0.911342;0.428069;, + 0.914305;0.426024;, + 0.953043;0.382263;, + 0.959202;0.381641;, + 0.905831;0.433515;, + 0.907288;0.434093;, + 0.910524;0.433573;, + 0.912302;0.432475;, + 0.954414;0.376274;, + 0.958019;0.375908;, + 0.908014;0.436040;, + 0.910197;0.435688;, + 0.886462;0.378350;, + 0.889248;0.380562;, + 0.895415;0.379631;, + 0.898797;0.376490;, + 0.969164;0.432079;, + 0.976032;0.431427;, + 0.888116;0.385590;, + 0.890308;0.387567;, + 0.895226;0.386822;, + 0.897951;0.384102;, + 0.969812;0.424541;, + 0.975288;0.424020;, + 0.887686;0.392198;, + 0.889939;0.393763;, + 0.894903;0.393008;, + 0.897614;0.390688;, + 0.970571;0.418336;, + 0.976099;0.417809;, + 0.886541;0.397415;, + 0.889358;0.399297;, + 0.895526;0.398363;, + 0.898877;0.395548;, + 0.969828;0.413622;, + 0.976697;0.412968;, + 0.887382;0.404568;, + 0.889919;0.406492;, + 0.895526;0.405643;, + 0.898596;0.402871;, + 0.969914;0.406230;, + 0.976158;0.405636;, + 0.888797;0.410616;, + 0.890686;0.412037;, + 0.894882;0.411398;, + 0.897189;0.409337;, + 0.971047;0.399978;, + 0.975720;0.399531;, + 0.888220;0.415505;, + 0.890391;0.416991;, + 0.895172;0.416264;, + 0.897783;0.414049;, + 0.970763;0.395271;, + 0.976088;0.394763;, + 0.886935;0.419043;, + 0.889789;0.420533;, + 0.895957;0.419595;, + 0.899271;0.417168;, + 0.969873;0.391947;, + 0.976742;0.391292;, + 0.887972;0.425601;, + 0.890462;0.426749;, + 0.895826;0.425931;, + 0.898700;0.423963;, + 0.970247;0.384942;, + 0.976222;0.384371;, + 0.890410;0.430892;, + 0.891823;0.431463;, + 0.894963;0.430978;, + 0.896688;0.429923;, + 0.971646;0.379415;, + 0.975143;0.379079;, + 0.892499;0.433232;, + 0.894616;0.432903;, + 0.873872;0.377973;, + 0.876220;0.379989;, + 0.881417;0.379511;, + 0.884266;0.377016;, + 0.984894;0.432226;, + 0.990673;0.431971;, + 0.874913;0.383392;, + 0.876760;0.385179;, + 0.880904;0.384796;, + 0.883200;0.382625;, + 0.985712;0.426784;, + 0.990320;0.426580;, + 0.874264;0.388323;, + 0.876163;0.389764;, + 0.880345;0.389374;, + 0.882630;0.387543;, + 0.986773;0.422001;, + 0.991425;0.421794;, + 0.873056;0.392136;, + 0.875429;0.393874;, + 0.880627;0.393393;, + 0.883450;0.391174;, + 0.986405;0.418515;, + 0.992184;0.418259;, + 0.873392;0.397396;, + 0.875529;0.399156;, + 0.880254;0.398719;, + 0.882841;0.396521;, + 0.986871;0.413082;, + 0.992125;0.412849;, + 0.874295;0.401938;, + 0.875886;0.403239;, + 0.879422;0.402908;, + 0.881366;0.401276;, + 0.988130;0.408461;, + 0.992063;0.408285;, + 0.873570;0.405513;, + 0.875399;0.406883;, + 0.879428;0.406507;, + 0.881628;0.404760;, + 0.988142;0.404988;, + 0.992623;0.404789;, + 0.872311;0.408050;, + 0.874716;0.409457;, + 0.879914;0.408973;, + 0.882707;0.407081;, + 0.987578;0.402524;, + 0.993359;0.402267;, + 0.872840;0.412876;, + 0.874937;0.413976;, + 0.879457;0.413552;, + 0.881880;0.412028;, + 0.988259;0.397367;, + 0.993286;0.397142;, + 0.874650;0.416931;, + 0.875841;0.417487;, + 0.878486;0.417234;, + 0.879940;0.416425;, + 0.989694;0.393267;, + 0.992637;0.393134;, + 0.876305;0.418781;, + 0.878089;0.418609;, + 0.911057;0.330810;, + 0.962285;0.444429;, + 0.946781;0.446617;, + 0.979370;0.443607;, + 0.986266;0.454302;, + 0.928386;0.343665;, + 0.967542;0.470029;, + 0.896709;0.331334;, + 0.879637;0.273628;, + 0.911211;0.271340;, + 0.978944;0.536142;, + 0.945667;0.539949;, + 0.955485;0.522522;, + 0.942009;0.522236;, + 0.891179;0.290655;, + 0.898435;0.289028;, + 0.916592;0.283109;, + 0.923544;0.279476;, + 0.872025;0.285035;, + 0.877537;0.287973;, + 0.984743;0.519101;, + 0.964298;0.521165;, + 0.517879;0.337303;, + 0.520333;0.371133;, + 0.671348;0.375798;, + 0.485728;0.377416;, + 0.588111;0.385241;, + 0.568603;0.437496;, + 0.533434;0.396100;, + 0.634543;0.391558;, + 0.608087;0.371187;, + 0.877145;0.707672;, + 0.960400;0.709690;, + 0.077470;0.007941;, + 0.118900;0.021439;, + 0.160343;0.007951;, + 0.096191;0.017550;, + 0.140289;0.017968;, + 0.746671;0.625954;, + 0.734244;0.671234;, + 0.732498;0.666622;, + 0.900272;0.786620;, + 0.731710;0.674849;, + 0.736027;0.666579;, + 0.900272;0.728227;, + 0.732977;0.667789;, + 0.734000;0.718795;, + 0.761074;0.747759;, + 0.736147;0.623785;, + 0.737496;0.718913;, + 0.734226;0.717671;, + 0.732523;0.718817;, + 0.810386;0.782411;, + 0.734467;0.716557;, + 0.851573;0.787367;, + 0.870436;0.732683;, + 0.553889;0.962996;, + 0.734131;0.719579;, + 0.720172;0.621381;, + 0.735588;0.646949;, + 0.030986;0.280838;, + 0.076380;0.281037;, + 0.076934;0.343481;, + 0.096103;0.280763;, + 0.095504;0.343480;, + 0.032738;0.343592;, + 0.000699;0.307701;, + 0.020304;0.311989;, + 0.047293;0.346485;, + 0.843288;0.736734;, + 0.053339;0.280612;, + 0.736338;0.664520;, + 0.725489;0.717083;, + 0.744737;0.664570;, + 0.721900;0.673406;, + 0.745925;0.715421;, + 0.562853;0.971381;, + 0.737065;0.715344;, + 0.733007;0.717941;, + 0.727989;0.737487;, + 0.733483;0.671167;, + 0.719031;0.668882;, + 0.834806;0.663521;, + 0.835007;0.658223;, + 0.834090;0.664155;, + 0.833989;0.663805;, + 0.829690;0.670101;, + 0.835801;0.668607;, + 0.835224;0.668707;, + 0.835029;0.670638;, + 0.835300;0.663893;, + 0.823120;0.662826;, + 0.832812;0.669285;, + 0.834416;0.664233;, + 0.835037;0.669733;, + 0.834887;0.666282;, + 0.561345;0.969626;, + 0.834183;0.666440;, + 0.834986;0.637076;, + 0.834482;0.664408;, + 0.835577;0.670567;, + 0.833537;0.664226;, + 0.834299;0.670158;, + 0.834830;0.672989;, + 0.833870;0.666754;, + 0.744960;0.730714;, + 0.834660;0.670688;, + 0.834070;0.669709;, + 0.832908;0.665243;, + 0.835705;0.664286;, + 0.737865;0.662673;, + 0.785973;0.667074;, + 0.787948;0.715301;, + 0.783925;0.625418;, + 0.783915;0.623808;, + 0.788056;0.716995;, + 0.784784;0.667199;, + 0.776092;0.624747;, + 0.775797;0.671137;, + 0.776148;0.714559;, + 0.786121;0.625026;, + 0.786733;0.665233;, + 0.789037;0.713793;, + 0.789604;0.625259;, + 0.792483;0.668681;, + 0.795224;0.714966;, + 0.789775;0.626794;, + 0.791308;0.716656;, + 0.788398;0.671637;, + 0.794055;0.624668;, + 0.793033;0.715686;, + 0.793153;0.675128;, + 0.789065;0.672254;, + 0.790982;0.624697;, + 0.788096;0.715701;, + 0.787237;0.625265;, + 0.782224;0.716131;, + 0.785418;0.669593;, + 0.786326;0.625266;, + 0.788118;0.668707;, + 0.790773;0.716699;, + 0.781179;0.626686;, + 0.783592;0.674061;, + 0.784872;0.713970;, + 0.792927;0.627680;, + 0.788729;0.713246;, + 0.790605;0.673075;, + 0.790030;0.625399;, + 0.791012;0.673650;, + 0.792563;0.715100;, + 0.794127;0.624315;, + 0.794834;0.671248;, + 0.795672;0.713800;, + 0.789358;0.626194;, + 0.791458;0.670782;, + 0.793092;0.716678;, + 0.788395;0.624014;, + 0.787444;0.664515;, + 0.787465;0.716819;, + 0.787466;0.627272;, + 0.786838;0.716115;, + 0.782936;0.672655;, + 0.789318;0.623431;, + 0.791531;0.717724;, + 0.791033;0.671303;, + 0.789060;0.669716;, + 0.787419;0.626528;, + 0.791040;0.712023;, + 0.785307;0.628266;, + 0.786651;0.674963;, + 0.788611;0.715906;, + 0.794461;0.691096;, + 0.735370;0.683056;, + 0.774251;0.692068;, + 0.799990;0.689774;, + 0.888227;0.790976;, + 0.835395;0.665671;, + 0.836233;0.664675;, + 0.627047;0.766014;, + 0.744572;0.715680;, + 0.736329;0.716113;, + 0.734454;0.717191;, + 0.735098;0.716966;, + 0.990159;0.782411;, + 0.734561;0.716147;, + 0.948971;0.787367;, + 0.930109;0.732683;, + 0.553889;0.962996;, + 0.734728;0.719064;, + 0.720913;0.621553;, + 0.735588;0.646949;, + 0.202979;0.278588;, + 0.159030;0.278453;, + 0.158950;0.343644;, + 0.137414;0.278462;, + 0.138487;0.343650;, + 0.204731;0.346559;, + 0.233593;0.308306;, + 0.216053;0.311410;, + 0.194414;0.346637;, + 0.957257;0.736734;, + 0.190507;0.280790;, + 0.742980;0.665126;, + 0.723160;0.707602;, + 0.740648;0.670873;, + 0.723155;0.622981;, + 0.739766;0.716934;, + 0.562853;0.971381;, + 0.733230;0.718871;, + 0.734658;0.719848;, + 0.659531;0.747477;, + 0.734644;0.670166;, + 0.721758;0.660849;, + 0.834509;0.661387;, + 0.835535;0.668135;, + 0.835670;0.666180;, + 0.834486;0.664209;, + 0.835569;0.668806;, + 0.833301;0.672000;, + 0.833602;0.671423;, + 0.834827;0.669711;, + 0.835528;0.660376;, + 0.834968;0.660657;, + 0.834747;0.664916;, + 0.834723;0.664911;, + 0.834790;0.666129;, + 0.834147;0.668202;, + 0.561345;0.969626;, + 0.836388;0.669082;, + 0.835301;0.637076;, + 0.834482;0.664408;, + 0.835101;0.665603;, + 0.834303;0.669128;, + 0.835741;0.665606;, + 0.833432;0.665737;, + 0.834464;0.665420;, + 0.642311;0.740696;, + 0.834776;0.666456;, + 0.834707;0.669011;, + 0.834423;0.666673;, + 0.833723;0.664507;, + 0.743295;0.664272;, + 0.778282;0.671219;, + 0.780253;0.710248;, + 0.775491;0.629282;, + 0.775715;0.625039;, + 0.775269;0.711772;, + 0.775669;0.666770;, + 0.776430;0.624558;, + 0.773472;0.669872;, + 0.782015;0.718525;, + 0.776570;0.627422;, + 0.778013;0.664842;, + 0.779315;0.713218;, + 0.789332;0.622118;, + 0.789420;0.664889;, + 0.792645;0.717509;, + 0.786473;0.622338;, + 0.792480;0.716735;, + 0.789424;0.671332;, + 0.789729;0.625677;, + 0.790252;0.715710;, + 0.789600;0.668773;, + 0.791820;0.669964;, + 0.789582;0.625337;, + 0.793545;0.715484;, + 0.788233;0.624304;, + 0.790431;0.718265;, + 0.790284;0.670447;, + 0.785843;0.626007;, + 0.782577;0.667710;, + 0.783500;0.716741;, + 0.790782;0.625718;, + 0.792564;0.716505;, + 0.791922;0.671684;, + 0.794635;0.627982;, + 0.794680;0.715878;, + 0.796221;0.672350;, + 0.788721;0.627413;, + 0.789794;0.670452;, + 0.791182;0.714226;, + 0.790307;0.624378;, + 0.792533;0.671815;, + 0.793801;0.716549;, + 0.784641;0.627340;, + 0.786011;0.670554;, + 0.787199;0.717576;, + 0.790351;0.663633;, + 0.793786;0.630159;, + 0.792190;0.703334;, + 0.795066;0.628478;, + 0.796832;0.714275;, + 0.796356;0.670301;, + 0.791512;0.670914;, + 0.793029;0.706406;, + 0.784249;0.635497;, + 0.771596;0.664582;, + 0.771802;0.630441;, + 0.773771;0.712776;, + 0.788489;0.625167;, + 0.799017;0.715708;, + 0.789250;0.665407;, + 0.796848;0.652952;, + 0.734108;0.683056;, + 0.774251;0.692068;, + 0.799990;0.689774;, + 0.912318;0.790976;, + 0.835605;0.668551;, + 0.834549;0.669792;, + 0.902768;0.883465;, + 0.904724;0.885479;, + 0.902228;0.888187;, + 0.898316;0.888187;, + 0.895821;0.885479;, + 0.897777;0.883465;, + 0.898265;0.798929;, + 0.902280;0.798929;, + 0.904863;0.804096;, + 0.902855;0.809357;, + 0.897690;0.809357;, + 0.895682;0.804096;, + 0.902280;0.790246;, + 0.898265;0.790246;, + 0.902880;0.857875;, + 0.905375;0.862172;, + 0.902768;0.863497;, + 0.897777;0.863497;, + 0.895169;0.862172;, + 0.897665;0.857875;, + 0.897777;0.869929;, + 0.902768;0.869929;, + 0.902768;0.875028;, + 0.897777;0.875028;, + 0.893694;0.933727;, + 0.885232;0.932009;, + 0.892792;0.930218;, + 0.898382;0.930471;, + 0.902162;0.930471;, + 0.907753;0.930218;, + 0.915313;0.932009;, + 0.906851;0.933727;, + 0.906851;0.948663;, + 0.906851;0.952882;, + 0.893694;0.952882;, + 0.893694;0.948663;, + 0.898382;0.921391;, + 0.902162;0.921391;, + 0.902162;0.926208;, + 0.898382;0.926208;, + 0.904359;0.976397;, + 0.908446;0.983814;, + 0.904359;0.987846;, + 0.896186;0.987846;, + 0.892099;0.983814;, + 0.896186;0.976397;, + 0.890317;0.960901;, + 0.887826;0.955517;, + 0.893694;0.954704;, + 0.906851;0.954704;, + 0.912719;0.955517;, + 0.910227;0.960901;, + 0.904359;0.964521;, + 0.896186;0.964521;, + 0.902162;0.914181;, + 0.902162;0.917807;, + 0.898382;0.917807;, + 0.898382;0.914181;, + 0.898382;0.906892;, + 0.895345;0.904106;, + 0.897235;0.900407;, + 0.903310;0.900407;, + 0.905199;0.904106;, + 0.902162;0.906892;, + 0.893278;0.895433;, + 0.893172;0.893912;, + 0.895173;0.891507;, + 0.898316;0.890593;, + 0.902228;0.890593;, + 0.905371;0.891507;, + 0.907373;0.893912;, + 0.907267;0.895433;, + 0.903310;0.896025;, + 0.897235;0.896025;, + 0.809585;0.995319;, + 0.809585;0.995319;, + 0.796174;0.997421;, + 0.680570;0.784109;, + 0.928526;0.597825;, + 0.911482;0.597825;, + 0.707399;0.779975;, + 0.796174;0.997421;, + 0.560395;0.749918;, + 0.553202;0.749918;, + 0.907074;0.649439;, + 0.911482;0.636891;, + 0.928526;0.636891;, + 0.932934;0.649439;, + 0.543036;0.821058;, + 0.553587;0.805318;, + 0.560009;0.805318;, + 0.570560;0.821058;, + 0.896186;0.998590;, + 0.904359;0.998590;, + 0.853099;0.996938;, + 0.853099;0.996938;, + 0.883254;0.975313;, + 0.880549;0.981966;, + 0.868039;0.983920;, + 0.861578;0.975339;, + 0.868286;0.967611;, + 0.877687;0.970762;, + 0.723494;0.934189;, + 0.746615;0.939569;, + 0.750123;0.952141;, + 0.752018;0.752872;, + 0.760772;0.738986;, + 0.765195;0.741466;, + 0.806068;0.843381;, + 0.808596;0.847477;, + 0.810932;0.854328;, + 0.813587;0.861508;, + 0.814928;0.876023;, + 0.811185;0.878414;, + 0.800855;0.868571;, + 0.799856;0.854877;, + 0.699911;0.911896;, + 0.703264;0.913021;, + 0.706468;0.908363;, + 0.706162;0.903342;, + 0.714873;0.897777;, + 0.723917;0.904455;, + 0.716064;0.916632;, + 0.767956;0.739408;, + 0.806619;0.772049;, + 0.820056;0.785642;, + 0.814083;0.790165;, + 0.809808;0.792812;, + 0.806591;0.792094;, + 0.804323;0.784892;, + 0.700241;0.822974;, + 0.693042;0.817639;, + 0.688890;0.819799;, + 0.818973;0.810336;, + 0.819099;0.812192;, + 0.836745;0.213089;, + 0.835593;0.219284;, + 0.816293;0.818786;, + 0.815805;0.820421;, + 0.814192;0.825581;, + 0.811307;0.821517;, + 0.812778;0.808834;, + 0.816886;0.806200;, + 0.878804;0.857303;, + 0.881376;0.861716;, + 0.878829;0.869526;, + 0.875890;0.874631;, + 0.874610;0.876410;, + 0.872738;0.877913;, + 0.872011;0.878691;, + 0.875817;0.878190;, + 0.870373;0.868288;, + 0.874192;0.861851;, + 0.878967;0.896213;, + 0.879498;0.898184;, + 0.884256;0.898560;, + 0.888144;0.899414;, + 0.886178;0.903064;, + 0.880760;0.905962;, + 0.878120;0.900733;, + 0.858925;0.929667;, + 0.857641;0.934125;, + 0.847363;0.935745;, + 0.842772;0.924998;, + 0.848758;0.915479;, + 0.854634;0.921769;, + 0.864692;0.915242;, + 0.870238;0.910052;, + 0.873209;0.915066;, + 0.875924;0.920533;, + 0.868938;0.923141;, + 0.854440;0.942270;, + 0.864958;0.940644;, + 0.873896;0.944310;, + 0.874080;0.948382;, + 0.868064;0.948617;, + 0.857362;0.946171;, + 0.892692;0.920061;, + 0.887110;0.919186;, + 0.884115;0.913800;, + 0.889644;0.911032;, + 0.892703;0.913806;, + 0.892756;0.917449;, + 0.801819;0.909866;, + 0.788935;0.898076;, + 0.796995;0.887735;, + 0.813905;0.896644;, + 0.837738;0.930561;, + 0.842607;0.941175;, + 0.845069;0.945218;, + 0.847347;0.950804;, + 0.841881;0.956079;, + 0.812113;0.950778;, + 0.808814;0.938359;, + 0.825141;0.930378;, + 0.827105;0.920651;, + 0.830349;0.918516;, + 0.890228;0.876990;, + 0.888016;0.878593;, + 0.885001;0.878102;, + 0.883550;0.877809;, + 0.883811;0.876027;, + 0.884569;0.874258;, + 0.887538;0.871524;, + 0.890442;0.871983;, + 0.889999;0.881860;, + 0.892460;0.884911;, + 0.889233;0.885429;, + 0.886009;0.883818;, + 0.886436;0.881270;, + 0.883464;0.873827;, + 0.882424;0.875494;, + 0.880876;0.876215;, + 0.879842;0.875642;, + 0.881287;0.873936;, + 0.862513;0.892170;, + 0.861865;0.879474;, + 0.866388;0.875409;, + 0.873781;0.879035;, + 0.873094;0.883435;, + 0.873229;0.886138;, + 0.874904;0.888885;, + 0.874217;0.893384;, + 0.868208;0.898628;, + 0.871998;0.885239;, + 0.871976;0.882555;, + 0.872387;0.881660;, + 0.872785;0.883681;, + 0.872319;0.885711;, + 0.876354;0.881234;, + 0.875097;0.881843;, + 0.874745;0.879917;, + 0.876504;0.878342;, + 0.877554;0.878922;, + 0.875559;0.894556;, + 0.877148;0.894288;, + 0.881282;0.895325;, + 0.881391;0.896768;, + 0.876803;0.896405;, + 0.872657;0.890011;, + 0.873574;0.892165;, + 0.874760;0.894155;, + 0.874214;0.892318;, + 0.872608;0.889474;, + 0.877867;0.881632;, + 0.877351;0.880920;, + 0.878578;0.878622;, + 0.880091;0.877871;, + 0.879672;0.879604;, + 0.880438;0.882205;, + 0.882153;0.882616;, + 0.881530;0.885276;, + 0.879267;0.886324;, + 0.878742;0.884308;, + 0.882323;0.888704;, + 0.885747;0.890207;, + 0.883744;0.892684;, + 0.879543;0.891763;, + 0.880101;0.889732;, + 0.874627;0.885988;, + 0.875759;0.885288;, + 0.876435;0.886058;, + 0.876968;0.888077;, + 0.876348;0.890096;, + 0.874900;0.890194;, + 0.874116;0.887997;, + 0.885181;0.866347;, + 0.889779;0.863299;, + 0.887402;0.868633;, + 0.884410;0.871352;, + 0.882180;0.871419;, + 0.861419;0.793048;, + 0.856019;0.794881;, + 0.848222;0.791381;, + 0.840650;0.788120;, + 0.868772;0.227338;, + 0.871877;0.218340;, + 0.882605;0.222061;, + 0.884179;0.229250;, + 0.877209;0.231043;, + 0.858143;0.802183;, + 0.858817;0.805122;, + 0.851020;0.801622;, + 0.850346;0.798683;, + 0.841668;0.841308;, + 0.849162;0.841548;, + 0.854411;0.840199;, + 0.855954;0.843593;, + 0.854116;0.848424;, + 0.848984;0.849435;, + 0.841452;0.846086;, + 0.837548;0.841441;, + 0.864295;0.820660;, + 0.867352;0.822653;, + 0.874914;0.824710;, + 0.874712;0.830074;, + 0.868457;0.834824;, + 0.866846;0.831410;, + 0.866617;0.828470;, + 0.900825;0.238070;, + 0.899286;0.230881;, + 0.792524;0.758021;, + 0.705076;0.847899;, + 0.705513;0.842839;, + 0.714572;0.852197;, + 0.709570;0.865796;, + 0.708642;0.862587;, + 0.705810;0.858129;, + 0.704047;0.856128;, + 0.704582;0.853479;, + 0.659696;0.842488;, + 0.656503;0.844340;, + 0.656245;0.853573;, + 0.762387;0.807790;, + 0.769007;0.814582;, + 0.759728;0.829314;, + 0.744754;0.840151;, + 0.735158;0.837187;, + 0.661040;0.868118;, + 0.662092;0.873280;, + 0.667446;0.880470;, + 0.671850;0.884983;, + 0.693052;0.825544;, + 0.688060;0.821769;, + 0.690343;0.819868;, + 0.697497;0.825214;, + 0.697128;0.830256;, + 0.660014;0.869543;, + 0.663290;0.874126;, + 0.667721;0.879178;, + 0.670059;0.882396;, + 0.668880;0.883441;, + 0.665559;0.881576;, + 0.660559;0.874149;, + 0.654537;0.855994;, + 0.653216;0.850818;, + 0.654017;0.841614;, + 0.656962;0.838804;, + 0.656277;0.843395;, + 0.654654;0.851382;, + 0.706763;0.916055;, + 0.704907;0.914299;, + 0.708048;0.909580;, + 0.709904;0.911336;, + 0.673717;0.828513;, + 0.666418;0.834185;, + 0.676727;0.821513;, + 0.674409;0.823336;, + 0.671732;0.825354;, + 0.666087;0.828624;, + 0.662138;0.831262;, + 0.665145;0.829193;, + 0.672670;0.823785;, + 0.686417;0.897062;, + 0.684116;0.895030;, + 0.679361;0.888850;, + 0.680547;0.887802;, + 0.685477;0.891393;, + 0.676015;0.884643;, + 0.678762;0.886893;, + 0.683705;0.892958;, + 0.684863;0.895504;, + 0.680052;0.889403;, + 0.695233;0.914254;, + 0.696896;0.916164;, + 0.693427;0.914360;, + 0.689562;0.910409;, + 0.688484;0.907834;, + 0.690686;0.909875;, + 0.764102;0.734585;, + 0.759679;0.732105;, + 0.683424;0.899463;, + 0.687842;0.905828;, + 0.691611;0.909855;, + 0.807160;0.984871;, + 0.811076;0.992991;, + 0.796303;0.997435;, + 0.727330;0.775774;, + 0.737141;0.770505;, + 0.781718;0.979152;, + 0.853488;0.992247;, + 0.879600;0.995136;, + 0.884085;0.998182;, + 0.853121;0.996991;, + 0.839008;0.997396;, + 0.609087;0.764632;, + 0.608054;0.773833;, + 0.600940;0.751850;, + 0.607154;0.743363;, + 0.885369;0.580065;, + 0.879410;0.592575;, + 0.868069;0.591687;, + 0.617169;0.768622;, + 0.613975;0.756093;, + 0.734130;0.748148;, + 0.723692;0.752707;, + 0.619519;0.824099;, + 0.624525;0.802560;, + 0.864390;0.635775;, + 0.601057;0.823984;, + 0.603096;0.809459;, + 0.615766;0.831442;, + 0.588944;0.744363;, + 0.581349;0.758888;, + 0.571184;0.743148;, + 0.880440;0.641059;, + 0.889476;0.646513;, + 0.773385;0.772241;, + 0.765851;0.784683;, + 0.620152;0.744959;, + 0.749855;0.729434;, + 0.825102;0.801492;, + 0.822392;0.797440;, + 0.828673;0.792745;, + 0.835934;0.796180;, + 0.836558;0.799146;, + 0.832007;0.799764;, + 0.816657;0.843915;, + 0.814437;0.836935;, + 0.817320;0.832012;, + 0.822209;0.837181;, + 0.825497;0.841743;, + 0.822828;0.843553;, + 0.855544;0.831362;, + 0.859143;0.830035;, + 0.861639;0.829097;, + 0.861907;0.832046;, + 0.856590;0.833373;, + 0.878130;0.813309;, + 0.875581;0.819497;, + 0.870798;0.817379;, + 0.867840;0.813108;, + 0.867186;0.810154;, + 0.872694;0.808236;, + 0.851931;0.212439;, + 0.856292;0.215979;, + 0.853159;0.224970;, + 0.847090;0.227705;, + 0.841223;0.221426;, + 0.842931;0.215151;, + 0.859569;0.950864;, + 0.870221;0.953350;, + 0.872713;0.958843;, + 0.862061;0.956357;, + 0.831396;0.804920;, + 0.835696;0.805432;, + 0.831419;0.806932;, + 0.824765;0.808377;, + 0.824615;0.806530;, + 0.850927;0.803168;, + 0.858731;0.806700;, + 0.861498;0.810894;, + 0.858434;0.811439;, + 0.850713;0.807974;, + 0.845972;0.803898;, + 0.822828;0.832534;, + 0.817294;0.827383;, + 0.817703;0.825787;, + 0.822270;0.829261;, + 0.826417;0.832514;, + 0.845619;0.836729;, + 0.838159;0.836479;, + 0.833506;0.833424;, + 0.837442;0.832998;, + 0.844602;0.833326;, + 0.893943;0.238008;, + 0.861501;0.828439;, + 0.859016;0.829365;, + 0.886979;0.239799;, + 0.825506;0.808906;, + 0.832120;0.807468;, + 0.853968;0.203984;, + 0.845126;0.206762;, + 0.887612;0.209226;, + 0.877060;0.205589;, + 0.872370;0.201897;, + 0.845702;0.805354;, + 0.850683;0.808355;, + 0.858295;0.811864;, + 0.844156;0.238056;, + 0.826793;0.828244;, + 0.823281;0.827308;, + 0.819797;0.824826;, + 0.838144;0.231817;, + 0.872906;0.245257;, + 0.848450;0.832215;, + 0.844955;0.832101;, + 0.837770;0.831792;, + 0.858237;0.244246;, + 0.864579;0.241448;, + 0.672033;0.833431;, + 0.677807;0.830377;, + 0.680709;0.830944;, + 0.679630;0.832272;, + 0.675688;0.836035;, + 0.670993;0.837761;, + 0.663100;0.846806;, + 0.666956;0.844848;, + 0.665079;0.848028;, + 0.663611;0.854284;, + 0.662887;0.859062;, + 0.660499;0.854764;, + 0.667818;0.869181;, + 0.667184;0.864531;, + 0.668931;0.867557;, + 0.673075;0.872891;, + 0.672055;0.874351;, + 0.681144;0.879570;, + 0.682419;0.877888;, + 0.685425;0.879351;, + 0.690262;0.881969;, + 0.691271;0.885215;, + 0.688674;0.886066;, + 0.683347;0.882783;, + 0.690935;0.896052;, + 0.693695;0.894958;, + 0.697324;0.896188;, + 0.699246;0.901554;, + 0.696117;0.906264;, + 0.691436;0.901991;, + 0.709604;0.897148;, + 0.707652;0.895403;, + 0.706068;0.890008;, + 0.707265;0.884132;, + 0.708739;0.879243;, + 0.709690;0.882449;, + 0.709279;0.891750;, + 0.698001;0.848790;, + 0.694731;0.848453;, + 0.695212;0.847373;, + 0.694722;0.842825;, + 0.694640;0.838382;, + 0.698400;0.843269;, + 0.683941;0.825341;, + 0.688958;0.829089;, + 0.689393;0.833098;, + 0.687063;0.830490;, + 0.684377;0.828104;, + 0.681690;0.826964;, + 0.694539;0.855245;, + 0.690615;0.856789;, + 0.688785;0.856515;, + 0.689343;0.854694;, + 0.691759;0.852310;, + 0.695125;0.852587;, + 0.695784;0.859438;, + 0.697654;0.861366;, + 0.696067;0.863077;, + 0.694364;0.862584;, + 0.692101;0.862333;, + 0.691934;0.860897;, + 0.701740;0.863271;, + 0.704339;0.867671;, + 0.702837;0.872650;, + 0.700954;0.870057;, + 0.700777;0.866784;, + 0.700061;0.864978;, + 0.696764;0.887057;, + 0.695813;0.883870;, + 0.697109;0.884063;, + 0.699090;0.882660;, + 0.699974;0.879929;, + 0.701745;0.882398;, + 0.700150;0.887901;, + 0.682791;0.865085;, + 0.686164;0.862035;, + 0.687662;0.862175;, + 0.687917;0.863596;, + 0.688128;0.864328;, + 0.687422;0.865453;, + 0.686734;0.866131;, + 0.686434;0.868148;, + 0.683230;0.868455;, + 0.680190;0.857580;, + 0.685190;0.858012;, + 0.684571;0.859844;, + 0.680929;0.862779;, + 0.676758;0.860502;, + 0.672221;0.839192;, + 0.674948;0.836003;, + 0.678899;0.832260;, + 0.681542;0.834280;, + 0.677631;0.838280;, + 0.671368;0.850586;, + 0.669374;0.852969;, + 0.666111;0.855920;, + 0.663889;0.857693;, + 0.662654;0.854286;, + 0.664069;0.848025;, + 0.669448;0.847198;, + 0.675476;0.874545;, + 0.672524;0.872924;, + 0.668080;0.867719;, + 0.670016;0.865994;, + 0.674082;0.868366;, + 0.675098;0.871712;, + 0.684220;0.876796;, + 0.687623;0.876853;, + 0.689145;0.878057;, + 0.690589;0.880286;, + 0.691315;0.882437;, + 0.689607;0.882089;, + 0.684693;0.879534;, + 0.686810;0.844696;, + 0.690521;0.840850;, + 0.692060;0.839733;, + 0.694180;0.842825;, + 0.694638;0.847394;, + 0.688808;0.848147;, + 0.682379;0.829107;, + 0.683790;0.828069;, + 0.686594;0.830238;, + 0.685183;0.831276;, + 0.685882;0.851965;, + 0.691829;0.851125;, + 0.691147;0.852386;, + 0.688693;0.854737;, + 0.683767;0.854326;, + 0.694711;0.863557;, + 0.693094;0.863536;, + 0.690980;0.862835;, + 0.691446;0.862372;, + 0.693808;0.862659;, + 0.700238;0.866960;, + 0.699964;0.868510;, + 0.699518;0.867847;, + 0.698620;0.865539;, + 0.698097;0.864320;, + 0.699268;0.865078;, + 0.697861;0.880863;, + 0.698608;0.882973;, + 0.696609;0.884348;, + 0.695862;0.882238;, + 0.689170;0.871016;, + 0.688397;0.868920;, + 0.689273;0.869881;, + 0.690624;0.871065;, + 0.690629;0.872304;, + 0.694403;0.875504;, + 0.692846;0.873609;, + 0.693085;0.872105;, + 0.693891;0.872222;, + 0.695408;0.872942;, + 0.696159;0.874720;, + 0.698803;0.876854;, + 0.698569;0.874951;, + 0.698109;0.873383;, + 0.698025;0.873732;, + 0.699234;0.872247;, + 0.700303;0.870748;, + 0.699830;0.873806;, + 0.686162;0.868655;, + 0.685702;0.867312;, + 0.685787;0.866385;, + 0.686247;0.867728;, + 0.688933;0.865106;, + 0.690211;0.864034;, + 0.692367;0.864878;, + 0.691761;0.866467;, + 0.689389;0.866404;, + 0.696289;0.866667;, + 0.698091;0.866703;, + 0.698808;0.869151;, + 0.697715;0.870637;, + 0.696397;0.869990;, + 0.695690;0.868468;, + 0.688500;0.870302;, + 0.690574;0.870874;, + 0.691320;0.872191;, + 0.690675;0.872854;, + 0.689815;0.872503;, + 0.688385;0.871268;, + 0.693553;0.873419;, + 0.695096;0.873894;, + 0.695274;0.874506;, + 0.694662;0.874263;, + 0.692990;0.873850;, + 0.698496;0.872792;, + 0.698611;0.873595;, + 0.697475;0.875110;, + 0.697360;0.874307;, + 0.752419;0.911565;, + 0.768600;0.909906;, + 0.781542;0.921746;, + 0.767724;0.929157;, + 0.744573;0.923751;, + 0.783132;0.826576;, + 0.802348;0.807248;, + 0.805375;0.807970;, + 0.804374;0.820607;, + 0.799209;0.833329;, + 0.745404;0.878402;, + 0.752976;0.864062;, + 0.767966;0.853234;, + 0.777948;0.859594;, + 0.778925;0.873285;, + 0.770940;0.883665;, + 0.754637;0.885236;, + 0.723141;0.869933;, + 0.715669;0.884309;, + 0.707286;0.889890;, + 0.708161;0.880536;, + 0.713583;0.866968;, + 0.827892;0.872505;, + 0.834214;0.872050;, + 0.841195;0.877118;, + 0.842540;0.889659;, + 0.836716;0.899163;, + 0.829049;0.887077;, + 0.880758;0.832548;, + 0.880652;0.824610;, + 0.880761;0.819253;, + 0.883634;0.813028;, + 0.888066;0.810723;, + 0.889764;0.816036;, + 0.885281;0.828016;, + 0.897690;0.818794;, + 0.902855;0.818794;, + 0.907566;0.830695;, + 0.904983;0.835183;, + 0.895561;0.835183;, + 0.892979;0.830695;, + 0.897665;0.850874;, + 0.892954;0.852870;, + 0.895561;0.845903;, + 0.904983;0.845903;, + 0.907591;0.852870;, + 0.902880;0.850874;, + 0.892242;0.792424;, + 0.889659;0.797544;, + 0.885280;0.799848;, + 0.879746;0.794853;, + 0.870430;0.855508;, + 0.866426;0.850510;, + 0.868293;0.845675;, + 0.874568;0.840974;, + 0.874367;0.848880;, + 0.864964;0.864889;, + 0.859859;0.861579;, + 0.855510;0.855004;, + 0.860682;0.853995;, + 0.864797;0.859048;, + 0.845572;0.854480;, + 0.849888;0.860753;, + 0.845250;0.864668;, + 0.837521;0.860045;, + 0.834652;0.852847;, + 0.838065;0.851071;, + 0.827484;0.852926;, + 0.830296;0.860081;, + 0.824296;0.860464;, + 0.821483;0.853309;, + 0.917291;0.975313;, + 0.922858;0.970762;, + 0.932259;0.967611;, + 0.861297;0.974650;, + 0.868039;0.983920;, + 0.919995;0.981966;, + 0.631865;0.755748;, + 0.637632;0.767666;, + 0.750123;0.952141;, + 0.746615;0.939569;, + 0.723494;0.934189;, + 0.628816;0.758604;, + 0.800855;0.868571;, + 0.989360;0.878414;, + 0.985617;0.876023;, + 0.986957;0.861508;, + 0.989613;0.854328;, + 0.991949;0.847477;, + 0.994477;0.843381;, + 0.799856;0.854877;, + 0.716064;0.916632;, + 0.723917;0.904455;, + 0.714873;0.897777;, + 0.706162;0.903342;, + 0.706468;0.908363;, + 0.703264;0.913021;, + 0.699911;0.911896;, + 0.625080;0.756874;, + 0.993953;0.792095;, + 0.990736;0.792812;, + 0.986462;0.790165;, + 0.980489;0.785642;, + 0.991540;0.773290;, + 0.804323;0.784892;, + 0.688890;0.819799;, + 0.693042;0.817639;, + 0.700241;0.822974;, + 0.987767;0.808834;, + 0.989237;0.821517;, + 0.986353;0.825581;, + 0.985491;0.820881;, + 0.985003;0.819246;, + 0.905184;0.219462;, + 0.903939;0.213590;, + 0.981445;0.812192;, + 0.981572;0.810336;, + 0.983659;0.806201;, + 0.930171;0.868288;, + 0.925550;0.878190;, + 0.928534;0.878691;, + 0.927806;0.877913;, + 0.925935;0.876410;, + 0.924655;0.874631;, + 0.921715;0.869526;, + 0.919169;0.861716;, + 0.921740;0.857303;, + 0.926353;0.861851;, + 0.919785;0.905962;, + 0.914367;0.903064;, + 0.912401;0.899414;, + 0.916289;0.898560;, + 0.921047;0.898184;, + 0.921578;0.896213;, + 0.922425;0.900733;, + 0.951787;0.915479;, + 0.957773;0.924998;, + 0.953182;0.935745;, + 0.942904;0.934125;, + 0.941619;0.929668;, + 0.945911;0.921769;, + 0.935853;0.915242;, + 0.931607;0.923141;, + 0.924621;0.920533;, + 0.927335;0.915066;, + 0.930306;0.910052;, + 0.932480;0.948617;, + 0.926465;0.948382;, + 0.926648;0.944310;, + 0.935587;0.940644;, + 0.946105;0.942270;, + 0.943182;0.946171;, + 0.907853;0.920061;, + 0.907789;0.917449;, + 0.907842;0.913806;, + 0.910900;0.911032;, + 0.916429;0.913800;, + 0.913434;0.919187;, + 0.801819;0.909866;, + 0.986639;0.896644;, + 0.796995;0.887735;, + 0.788935;0.898076;, + 0.973440;0.920651;, + 0.825141;0.930378;, + 0.808814;0.938359;, + 0.812113;0.950778;, + 0.841881;0.956079;, + 0.953198;0.950804;, + 0.955475;0.945218;, + 0.957938;0.941175;, + 0.962807;0.930561;, + 0.970195;0.918516;, + 0.910316;0.876990;, + 0.910102;0.871983;, + 0.913007;0.871524;, + 0.915975;0.874258;, + 0.916734;0.876027;, + 0.916994;0.877809;, + 0.915543;0.878102;, + 0.912529;0.878593;, + 0.910545;0.881860;, + 0.914109;0.881270;, + 0.914535;0.883818;, + 0.911312;0.885429;, + 0.908085;0.884911;, + 0.920703;0.875642;, + 0.919669;0.876215;, + 0.918121;0.875494;, + 0.917081;0.873827;, + 0.919258;0.873936;, + 0.926327;0.893384;, + 0.925641;0.888885;, + 0.927316;0.886138;, + 0.927450;0.883435;, + 0.926763;0.879035;, + 0.934157;0.875138;, + 0.938680;0.879474;, + 0.938032;0.892170;, + 0.932337;0.898628;, + 0.927759;0.883681;, + 0.928158;0.881660;, + 0.928568;0.882555;, + 0.928547;0.885239;, + 0.928226;0.885711;, + 0.924191;0.881234;, + 0.922991;0.878922;, + 0.924041;0.878342;, + 0.925799;0.879917;, + 0.925448;0.881843;, + 0.924985;0.894556;, + 0.923742;0.896405;, + 0.919153;0.896768;, + 0.919262;0.895325;, + 0.923396;0.894288;, + 0.927887;0.890011;, + 0.927937;0.889474;, + 0.926330;0.892318;, + 0.925785;0.894155;, + 0.926971;0.892165;, + 0.922678;0.881632;, + 0.920873;0.879604;, + 0.920453;0.877871;, + 0.921967;0.878622;, + 0.923194;0.880920;, + 0.921278;0.886324;, + 0.919014;0.885276;, + 0.918391;0.882616;, + 0.920106;0.882205;, + 0.921802;0.884308;, + 0.921002;0.891763;, + 0.916801;0.892684;, + 0.914798;0.890207;, + 0.918222;0.888704;, + 0.920444;0.889732;, + 0.925645;0.890194;, + 0.924197;0.890096;, + 0.923576;0.888077;, + 0.924110;0.886058;, + 0.924786;0.885288;, + 0.925917;0.885988;, + 0.926428;0.887997;, + 0.916135;0.871352;, + 0.913143;0.868633;, + 0.910766;0.863299;, + 0.915364;0.866347;, + 0.918364;0.871419;, + 0.939125;0.793048;, + 0.959895;0.788120;, + 0.952322;0.791381;, + 0.944526;0.794881;, + 0.852650;0.228909;, + 0.854352;0.222094;, + 0.865952;0.218567;, + 0.869308;0.227096;, + 0.860187;0.230609;, + 0.942402;0.802183;, + 0.950198;0.798683;, + 0.949524;0.801622;, + 0.941728;0.805122;, + 0.959092;0.846086;, + 0.951561;0.849435;, + 0.946429;0.848424;, + 0.944591;0.843593;, + 0.946133;0.840199;, + 0.951383;0.841548;, + 0.958877;0.841308;, + 0.962996;0.841441;, + 0.933526;0.820660;, + 0.836316;0.230455;, + 0.834651;0.237269;, + 0.931203;0.828470;, + 0.933698;0.831410;, + 0.932088;0.834824;, + 0.925832;0.830074;, + 0.925630;0.824710;, + 0.930468;0.822653;, + 0.792524;0.758021;, + 0.705076;0.847899;, + 0.704582;0.853479;, + 0.704047;0.856128;, + 0.705810;0.858129;, + 0.708642;0.862587;, + 0.709570;0.865796;, + 0.714572;0.852197;, + 0.705513;0.842839;, + 0.656503;0.844340;, + 0.659696;0.842488;, + 0.658583;0.844044;, + 0.656245;0.853573;, + 0.762387;0.807790;, + 0.735158;0.837187;, + 0.744754;0.840151;, + 0.759728;0.829314;, + 0.769007;0.814582;, + 0.671850;0.884983;, + 0.667446;0.880470;, + 0.662092;0.873280;, + 0.661040;0.868118;, + 0.697497;0.825214;, + 0.690343;0.819868;, + 0.688060;0.821769;, + 0.693052;0.825544;, + 0.697128;0.830256;, + 0.660014;0.869543;, + 0.660559;0.874149;, + 0.665559;0.881576;, + 0.668880;0.883441;, + 0.670059;0.882396;, + 0.667721;0.879178;, + 0.663290;0.874126;, + 0.656277;0.843395;, + 0.656962;0.838804;, + 0.654017;0.841614;, + 0.653216;0.850818;, + 0.654537;0.855994;, + 0.654654;0.851382;, + 0.708048;0.909580;, + 0.704907;0.914299;, + 0.706763;0.916055;, + 0.709904;0.911336;, + 0.665306;0.835742;, + 0.666418;0.834185;, + 0.673717;0.828513;, + 0.676727;0.821513;, + 0.672670;0.823785;, + 0.665146;0.829193;, + 0.662138;0.831262;, + 0.666087;0.828624;, + 0.671732;0.825354;, + 0.674409;0.823336;, + 0.686417;0.897062;, + 0.685477;0.891393;, + 0.680547;0.887802;, + 0.679361;0.888850;, + 0.684116;0.895030;, + 0.676015;0.884643;, + 0.680052;0.889403;, + 0.684863;0.895504;, + 0.683705;0.892958;, + 0.678762;0.886893;, + 0.688484;0.907834;, + 0.689562;0.910409;, + 0.693427;0.914360;, + 0.696896;0.916164;, + 0.695233;0.914254;, + 0.690686;0.909875;, + 0.626382;0.751791;, + 0.691611;0.909855;, + 0.687843;0.905828;, + 0.683424;0.899463;, + 0.629431;0.748934;, + 0.649842;0.784379;, + 0.661634;0.789005;, + 0.796303;0.997435;, + 0.811076;0.992991;, + 0.807160;0.984871;, + 0.781718;0.979152;, + 0.853121;0.996991;, + 0.916460;0.998182;, + 0.920944;0.995136;, + 0.853488;0.992247;, + 0.839008;0.997396;, + 0.501649;0.767269;, + 0.502150;0.750869;, + 0.512657;0.751850;, + 0.505542;0.773833;, + 0.652023;0.759221;, + 0.496782;0.758581;, + 0.495945;0.774158;, + 0.973029;0.592354;, + 0.962233;0.596576;, + 0.954638;0.582066;, + 0.663138;0.761836;, + 0.975073;0.631107;, + 0.491802;0.807701;, + 0.493658;0.821015;, + 0.497831;0.831442;, + 0.510501;0.809459;, + 0.512540;0.823984;, + 0.524652;0.744363;, + 0.542413;0.743148;, + 0.532247;0.758888;, + 0.949442;0.647846;, + 0.958479;0.641726;, + 0.773385;0.772241;, + 0.765851;0.784683;, + 0.660818;0.835561;, + 0.637646;0.745354;, + 0.493444;0.744959;, + 0.963987;0.799146;, + 0.964611;0.796180;, + 0.971871;0.792745;, + 0.978153;0.797440;, + 0.975442;0.801492;, + 0.968537;0.799764;, + 0.983888;0.843915;, + 0.977716;0.843553;, + 0.975048;0.841743;, + 0.978336;0.837181;, + 0.983225;0.832012;, + 0.986108;0.836936;, + 0.938638;0.832046;, + 0.936181;0.829097;, + 0.941401;0.830035;, + 0.945000;0.831362;, + 0.943954;0.833373;, + 0.933359;0.810154;, + 0.932705;0.813108;, + 0.929746;0.817379;, + 0.924964;0.819497;, + 0.922414;0.813309;, + 0.927851;0.808236;, + 0.899096;0.221492;, + 0.892752;0.227445;, + 0.886190;0.224852;, + 0.882803;0.216330;, + 0.887518;0.212975;, + 0.897249;0.215545;, + 0.940975;0.950864;, + 0.938484;0.956357;, + 0.927832;0.958843;, + 0.930323;0.953350;, + 0.969148;0.804920;, + 0.975929;0.806530;, + 0.975779;0.808377;, + 0.969125;0.806932;, + 0.964660;0.806467;, + 0.949832;0.807745;, + 0.942110;0.811209;, + 0.939047;0.810894;, + 0.941813;0.806700;, + 0.949618;0.803168;, + 0.954573;0.803898;, + 0.977716;0.832534;, + 0.974127;0.832514;, + 0.978275;0.829261;, + 0.982842;0.825787;, + 0.983251;0.827383;, + 0.954926;0.836729;, + 0.955943;0.833556;, + 0.963103;0.833228;, + 0.967039;0.832274;, + 0.962386;0.836479;, + 0.941529;0.829365;, + 0.936319;0.828439;, + 0.842092;0.237210;, + 0.849622;0.238907;, + 0.885316;0.204961;, + 0.968425;0.807468;, + 0.975039;0.808906;, + 0.894876;0.207594;, + 0.949861;0.808125;, + 0.954654;0.806389;, + 0.865418;0.202982;, + 0.860347;0.206482;, + 0.848938;0.209929;, + 0.942250;0.811634;, + 0.981687;0.824251;, + 0.977264;0.826044;, + 0.973752;0.827899;, + 0.895925;0.237256;, + 0.902426;0.231342;, + 0.864838;0.244081;, + 0.873842;0.240471;, + 0.880699;0.243123;, + 0.962774;0.831447;, + 0.955589;0.832331;, + 0.952095;0.832215;, + 0.675688;0.836035;, + 0.679630;0.832272;, + 0.680709;0.830944;, + 0.677807;0.830377;, + 0.672033;0.833431;, + 0.670993;0.837761;, + 0.662887;0.859062;, + 0.663611;0.854284;, + 0.665079;0.848028;, + 0.666956;0.844848;, + 0.663100;0.846806;, + 0.660499;0.854764;, + 0.673075;0.872891;, + 0.668931;0.867557;, + 0.667184;0.864531;, + 0.667818;0.869181;, + 0.672055;0.874351;, + 0.681144;0.879570;, + 0.683347;0.882783;, + 0.688674;0.886066;, + 0.691271;0.885215;, + 0.690262;0.881969;, + 0.685425;0.879351;, + 0.682419;0.877888;, + 0.696117;0.906264;, + 0.699246;0.901554;, + 0.697324;0.896188;, + 0.693695;0.894958;, + 0.690935;0.896052;, + 0.691436;0.901991;, + 0.709604;0.897148;, + 0.709279;0.891750;, + 0.709690;0.882449;, + 0.708739;0.879243;, + 0.707265;0.884132;, + 0.706068;0.890008;, + 0.707652;0.895403;, + 0.694640;0.838382;, + 0.694722;0.842825;, + 0.695212;0.847373;, + 0.694731;0.848453;, + 0.698001;0.848790;, + 0.698400;0.843269;, + 0.683941;0.825341;, + 0.681690;0.826964;, + 0.684378;0.828104;, + 0.687063;0.830490;, + 0.689393;0.833098;, + 0.688958;0.829089;, + 0.691759;0.852310;, + 0.689343;0.854694;, + 0.688785;0.856515;, + 0.690615;0.856789;, + 0.694539;0.855245;, + 0.695125;0.852587;, + 0.695784;0.859438;, + 0.691934;0.860897;, + 0.692101;0.862333;, + 0.694364;0.862584;, + 0.696067;0.863077;, + 0.697654;0.861366;, + 0.701740;0.863271;, + 0.700061;0.864978;, + 0.700778;0.866784;, + 0.700954;0.870057;, + 0.702837;0.872650;, + 0.704339;0.867671;, + 0.696764;0.887057;, + 0.700150;0.887901;, + 0.701745;0.882398;, + 0.699974;0.879929;, + 0.699090;0.882660;, + 0.697109;0.884063;, + 0.695813;0.883870;, + 0.686434;0.868148;, + 0.686734;0.866131;, + 0.687422;0.865453;, + 0.688128;0.864328;, + 0.687917;0.863596;, + 0.687662;0.862175;, + 0.686164;0.862035;, + 0.682791;0.865085;, + 0.683230;0.868455;, + 0.680190;0.857580;, + 0.676758;0.860502;, + 0.680929;0.862779;, + 0.684571;0.859844;, + 0.685190;0.858012;, + 0.681542;0.834280;, + 0.678899;0.832260;, + 0.674948;0.836003;, + 0.672221;0.839192;, + 0.677631;0.838280;, + 0.664069;0.848025;, + 0.662654;0.854286;, + 0.663889;0.857693;, + 0.666111;0.855920;, + 0.669374;0.852969;, + 0.671369;0.850586;, + 0.669448;0.847198;, + 0.674082;0.868366;, + 0.670016;0.865994;, + 0.668080;0.867719;, + 0.672524;0.872924;, + 0.675476;0.874545;, + 0.675098;0.871712;, + 0.684220;0.876796;, + 0.684693;0.879534;, + 0.689607;0.882089;, + 0.691315;0.882437;, + 0.690589;0.880286;, + 0.689145;0.878057;, + 0.687623;0.876853;, + 0.686810;0.844696;, + 0.688808;0.848147;, + 0.694638;0.847394;, + 0.694180;0.842825;, + 0.692061;0.839733;, + 0.690521;0.840850;, + 0.686594;0.830238;, + 0.683790;0.828069;, + 0.682379;0.829107;, + 0.685183;0.831276;, + 0.688693;0.854737;, + 0.691147;0.852386;, + 0.691829;0.851125;, + 0.685882;0.851965;, + 0.683767;0.854326;, + 0.691446;0.862372;, + 0.690980;0.862835;, + 0.693094;0.863536;, + 0.694711;0.863557;, + 0.693808;0.862659;, + 0.698097;0.864320;, + 0.698620;0.865539;, + 0.699518;0.867847;, + 0.699965;0.868510;, + 0.700238;0.866960;, + 0.699268;0.865078;, + 0.696609;0.884348;, + 0.698608;0.882973;, + 0.697861;0.880863;, + 0.695862;0.882238;, + 0.690624;0.871065;, + 0.689273;0.869881;, + 0.688397;0.868920;, + 0.689170;0.871016;, + 0.690629;0.872304;, + 0.694403;0.875504;, + 0.696159;0.874720;, + 0.695408;0.872942;, + 0.693891;0.872222;, + 0.693085;0.872105;, + 0.692846;0.873609;, + 0.698803;0.876854;, + 0.699830;0.873806;, + 0.700303;0.870748;, + 0.699234;0.872247;, + 0.698025;0.873732;, + 0.698109;0.873383;, + 0.698569;0.874951;, + 0.685787;0.866385;, + 0.685702;0.867312;, + 0.686162;0.868655;, + 0.686247;0.867728;, + 0.691761;0.866467;, + 0.692367;0.864878;, + 0.690211;0.864034;, + 0.688933;0.865106;, + 0.689389;0.866404;, + 0.696397;0.869990;, + 0.697715;0.870637;, + 0.698808;0.869151;, + 0.698091;0.866703;, + 0.696289;0.866667;, + 0.695690;0.868468;, + 0.688500;0.870302;, + 0.688385;0.871268;, + 0.689815;0.872503;, + 0.690675;0.872854;, + 0.691320;0.872191;, + 0.690574;0.870874;, + 0.693553;0.873419;, + 0.692990;0.873850;, + 0.694662;0.874263;, + 0.695274;0.874506;, + 0.695096;0.873894;, + 0.697475;0.875110;, + 0.698611;0.873595;, + 0.698496;0.872792;, + 0.697360;0.874307;, + 0.752419;0.911565;, + 0.744573;0.923751;, + 0.767724;0.929157;, + 0.781542;0.921746;, + 0.768600;0.909906;, + 0.996171;0.820607;, + 0.995169;0.807970;, + 0.799319;0.811168;, + 0.783132;0.826576;, + 0.798927;0.833329;, + 0.770940;0.883665;, + 0.778925;0.873285;, + 0.777948;0.859594;, + 0.767966;0.853234;, + 0.752976;0.864062;, + 0.745404;0.878402;, + 0.754637;0.885236;, + 0.723141;0.869933;, + 0.713583;0.866968;, + 0.708161;0.880536;, + 0.707286;0.889890;, + 0.715669;0.884309;, + 0.963829;0.899163;, + 0.958004;0.889659;, + 0.959349;0.877118;, + 0.966330;0.872050;, + 0.972653;0.872505;, + 0.971496;0.887077;, + 0.919787;0.832548;, + 0.915263;0.828016;, + 0.910781;0.816036;, + 0.912479;0.810723;, + 0.916910;0.813028;, + 0.919784;0.819253;, + 0.919893;0.824610;, + 0.915265;0.799848;, + 0.910885;0.797544;, + 0.908303;0.792424;, + 0.920798;0.794853;, + 0.925977;0.840974;, + 0.932251;0.845675;, + 0.934119;0.850510;, + 0.930114;0.855508;, + 0.926178;0.848880;, + 0.939862;0.853995;, + 0.945035;0.855004;, + 0.940686;0.861579;, + 0.935580;0.864889;, + 0.935748;0.859048;, + 0.965893;0.852847;, + 0.963024;0.860045;, + 0.955294;0.864668;, + 0.950657;0.860753;, + 0.954972;0.854480;, + 0.962479;0.851071;, + 0.976248;0.860464;, + 0.970248;0.860081;, + 0.973061;0.852926;, + 0.979061;0.853309;, + 0.050851;0.311418;, + 0.182352;0.311622;, + 0.552046;0.238197;, + 0.452719;0.187398;, + 0.438080;0.117554;, + 0.452085;0.122919;, + 0.055836;0.106868;, + 0.772088;0.251618;, + 0.356021;0.264969;, + 0.058251;0.140019;, + 0.013018;0.143812;, + 0.008445;0.097857;, + 0.017286;0.142213;, + 0.466090;0.125759;, + 0.032290;0.226805;, + 0.439368;0.396962;, + 0.028011;0.255177;, + 0.015083;0.184547;, + 0.003633;0.442765;, + 0.028225;0.366884;, + 0.008025;0.366913;, + 0.031155;0.442733;, + 0.035522;0.366908;, + 0.043503;0.366901;, + 0.078333;0.442781;, + 0.077972;0.366951;, + 0.063824;0.366910;, + 0.050581;0.366921;, + 0.116059;0.442822;, + 0.095599;0.366990;, + 0.003503;0.366840;, + 0.598234;0.316550;, + 0.550018;0.316218;, + 0.473892;0.274536;, + 0.441097;0.248866;, + 0.464459;0.326135;, + 0.538350;0.016111;, + 0.514084;0.033957;, + 0.489390;0.113365;, + 0.519113;0.138636;, + 0.490572;0.068422;, + 0.356021;0.325248;, + 0.555413;0.007122;, + 0.817949;0.096034;, + 0.787844;0.203452;, + 0.760901;0.200278;, + 0.794989;0.036951;, + 0.779378;0.059111;, + 0.766486;0.099552;, + 0.759845;0.138679;, + 0.814666;0.026300;, + 0.867984;0.019847;, + 0.832914;0.017848;, + 0.809118;0.135273;, + 0.805604;0.154688;, + 0.804978;0.157227;, + 0.758809;0.175095;, + 0.752513;0.157925;, + 0.781961;0.152723;, + 0.858184;0.093448;, + 0.831251;0.093463;, + 0.832409;0.120566;, + 0.848059;0.120499;, + 0.904949;0.121045;, + 0.904197;0.093746;, + 0.888889;0.093489;, + 0.278833;0.117554;, + 0.264828;0.122919;, + 0.181994;0.106868;, + 0.963886;0.251618;, + 0.179579;0.140019;, + 0.224812;0.143812;, + 0.220544;0.142213;, + 0.229385;0.097857;, + 0.272671;0.396962;, + 0.273453;0.408674;, + 0.209561;0.254798;, + 0.222747;0.184547;, + 0.231654;0.442713;, + 0.228618;0.366834;, + 0.207062;0.366884;, + 0.207750;0.442759;, + 0.197052;0.366829;, + 0.186357;0.366849;, + 0.156410;0.366951;, + 0.159214;0.442781;, + 0.168750;0.366884;, + 0.178828;0.366842;, + 0.136070;0.366990;, + 0.233592;0.366893;, + 0.598234;0.316550;, + 0.550018;0.316218;, + 0.238147;0.274536;, + 0.250823;0.125759;, + 0.275815;0.248866;, + 0.247580;0.326135;, + 0.538350;0.016111;, + 0.514084;0.033957;, + 0.489390;0.113365;, + 0.519113;0.138636;, + 0.490572;0.068422;, + 0.555413;0.007122;, + 0.948111;0.206039;, + 0.975073;0.200278;, + 0.940985;0.036951;, + 0.956597;0.059111;, + 0.969488;0.099552;, + 0.976129;0.138679;, + 0.921308;0.026300;, + 0.903060;0.017848;, + 0.926856;0.135273;, + 0.930370;0.157275;, + 0.930970;0.159128;, + 0.977165;0.175095;, + 0.983462;0.157925;, + 0.954013;0.152723;, + 0.858184;0.093448;, + 0.831251;0.093463;, + 0.832568;0.120761;, + 0.848059;0.120499;, + 0.904949;0.121045;, + 0.904197;0.093746;, + 0.888889;0.093489;, + 0.045297;0.477254;, + 0.024699;0.503835;, + 0.472594;0.539949;, + 0.472914;0.716324;, + 0.371776;0.675528;, + 0.373235;0.731889;, + 0.767119;0.421877;, + 0.727042;0.422032;, + 0.723334;0.470792;, + 0.740205;0.473323;, + 0.768616;0.475082;, + 0.820577;0.474485;, + 0.854839;0.474108;, + 0.857896;0.333084;, + 0.840158;0.333502;, + 0.826868;0.333518;, + 0.774925;0.333534;, + 0.746447;0.334508;, + 0.725798;0.335439;, + 0.718712;0.379084;, + 0.718703;0.421715;, + 0.726481;0.378657;, + 0.834362;0.474339;, + 0.100154;0.969885;, + 0.402711;0.957700;, + 0.481941;0.958396;, + 0.471098;0.942456;, + 0.106806;0.943084;, + 0.367369;0.618403;, + 0.362779;0.569244;, + 0.390556;0.922382;, + 0.481380;0.922948;, + 0.108160;0.830961;, + 0.474937;0.574217;, + 0.374591;0.772968;, + 0.770613;0.378738;, + 0.779658;0.375290;, + 0.468376;0.968225;, + 0.781318;0.421781;, + 0.864584;0.336319;, + 0.862721;0.473397;, + 0.861507;0.384730;, + 0.035279;0.972096;, + 0.046114;0.971274;, + 0.056515;0.976507;, + 0.058788;0.985534;, + 0.424365;0.990067;, + 0.424369;0.986643;, + 0.023807;0.986947;, + 0.025789;0.981161;, + 0.430561;0.982980;, + 0.436946;0.984040;, + 0.053072;0.973154;, + 0.026698;0.979844;, + 0.028129;0.977147;, + 0.442206;0.984188;, + 0.449680;0.985484;, + 0.059185;0.989086;, + 0.453487;0.988306;, + 0.456226;0.990546;, + 0.425617;0.991500;, + 0.371983;0.697920;, + 0.020286;0.699408;, + 0.817399;0.610136;, + 0.829895;0.574015;, + 0.829308;0.486167;, + 0.790539;0.483740;, + 0.831696;0.541216;, + 0.782813;0.613566;, + 0.720868;0.507940;, + 0.721642;0.571367;, + 0.755114;0.484599;, + 0.726396;0.484711;, + 0.749582;0.616531;, + 0.722723;0.608105;, + 0.829070;0.386901;, + 0.826063;0.425306;, + 0.002135;0.449795;, + 0.002967;0.471277;, + 0.096325;0.470207;, + 0.388540;0.470853;, + 0.410191;0.471018;, + 0.426962;0.471210;, + 0.028854;0.470922;, + 0.046416;0.470827;, + 0.441986;0.471377;, + 0.008914;0.470973;, + 0.078325;0.470594;, + 0.411197;0.444817;, + 0.359856;0.444726;, + 0.096730;0.448878;, + 0.045771;0.449319;, + 0.440173;0.445252;, + 0.007387;0.449871;, + 0.848952;0.391126;, + 0.835216;0.391122;, + 0.835524;0.392360;, + 0.835512;0.416900;, + 0.848943;0.416867;, + 0.104771;0.476750;, + 0.114079;0.496443;, + 0.114079;0.543468;, + 0.114079;0.543305;, + 0.107353;0.876654;, + 0.008722;0.875832;, + 0.010738;0.826008;, + 0.011091;0.767026;, + 0.109612;0.782815;, + 0.107819;0.799273;, + 0.373464;0.753821;, + 0.475894;0.744141;, + 0.362779;0.477059;, + 0.205339;0.504702;, + 0.184741;0.478121;, + 0.253357;0.539949;, + 0.254211;0.717753;, + 0.356515;0.676004;, + 0.353890;0.730460;, + 0.766924;0.421998;, + 0.726846;0.422153;, + 0.723334;0.470792;, + 0.740205;0.473323;, + 0.768616;0.475082;, + 0.820577;0.474485;, + 0.854839;0.474108;, + 0.857896;0.333084;, + 0.840158;0.333502;, + 0.826868;0.333518;, + 0.774925;0.333534;, + 0.746447;0.334508;, + 0.725798;0.335439;, + 0.718516;0.379205;, + 0.718508;0.421836;, + 0.726286;0.378778;, + 0.834362;0.474339;, + 0.141709;0.974550;, + 0.343835;0.965103;, + 0.248247;0.942456;, + 0.247517;0.958396;, + 0.133854;0.941784;, + 0.359367;0.618403;, + 0.346186;0.924812;, + 0.248079;0.922472;, + 0.129246;0.830609;, + 0.251014;0.574217;, + 0.352797;0.772717;, + 0.770418;0.378859;, + 0.779658;0.375290;, + 0.247079;0.968701;, + 0.864584;0.336319;, + 0.862721;0.473397;, + 0.861507;0.384730;, + 0.200708;0.973327;, + 0.188454;0.972288;, + 0.174861;0.978172;, + 0.170105;0.984594;, + 0.301203;0.990067;, + 0.301200;0.986643;, + 0.210406;0.987744;, + 0.209311;0.981523;, + 0.295008;0.982980;, + 0.288623;0.984040;, + 0.179545;0.975036;, + 0.208402;0.980206;, + 0.206971;0.977509;, + 0.283363;0.984188;, + 0.275889;0.985484;, + 0.169707;0.988147;, + 0.272081;0.988306;, + 0.269343;0.990546;, + 0.299951;0.991500;, + 0.357865;0.698872;, + 0.220267;0.695386;, + 0.817399;0.610136;, + 0.829895;0.574015;, + 0.829308;0.486167;, + 0.790539;0.483740;, + 0.831696;0.541216;, + 0.782813;0.613566;, + 0.720868;0.507940;, + 0.727230;0.571709;, + 0.755114;0.484599;, + 0.726396;0.484711;, + 0.749582;0.616531;, + 0.728311;0.605711;, + 0.829070;0.386901;, + 0.826063;0.425306;, + 0.789675;0.422317;, + 0.231551;0.471277;, + 0.232384;0.449795;, + 0.128399;0.470207;, + 0.333617;0.470853;, + 0.311966;0.471018;, + 0.295195;0.471210;, + 0.200322;0.470922;, + 0.182760;0.470827;, + 0.280654;0.471377;, + 0.225604;0.470973;, + 0.150851;0.470594;, + 0.313395;0.444893;, + 0.127994;0.448878;, + 0.182429;0.449339;, + 0.281452;0.444727;, + 0.227179;0.449362;, + 0.860812;0.392349;, + 0.861813;0.391103;, + 0.860809;0.416900;, + 0.123959;0.476750;, + 0.130619;0.875688;, + 0.223746;0.876529;, + 0.222682;0.831192;, + 0.222175;0.766782;, + 0.126664;0.781896;, + 0.127108;0.799289;, + 0.355244;0.754385;, + 0.253953;0.745093;, + 0.984741;0.646982;, + 0.615535;0.336575;, + 0.617993;0.370708;, + 0.618503;0.412274;, + 0.683406;0.333879;, + 0.617258;0.334147;, + 0.616727;0.478604;, + 0.486881;0.506343;, + 0.486377;0.522763;, + 0.619069;0.508845;, + 0.619014;0.529288;, + 0.613523;0.537819;, + 0.715761;0.536843;, + 0.698826;0.480362;, + 0.715249;0.479745;, + 0.524207;0.480304;, + 0.577151;0.481311;, + 0.614315;0.481181;, + 0.636157;0.481064;, + 0.652311;0.481307;, + 0.679859;0.480379;, + 0.490306;0.480268;, + 0.482948;0.479671;, + 0.482987;0.487223;, + 0.619378;0.479998;, + 0.618557;0.486635;, + 0.485819;0.480718;, + 0.559587;0.542715;, + 0.647989;0.541297;, + 0.637666;0.713938;, + 0.691713;0.542696;, + 0.668214;0.542030;, + 0.701857;0.714699;, + 0.712881;0.541485;, + 0.622792;0.540665;, + 0.526962;0.540637;, + 0.509701;0.540747;, + 0.715962;0.581565;, + 0.613254;0.657234;, + 0.506449;0.658654;, + 0.590872;0.585541;, + 0.576642;0.545365;, + 0.542761;0.538309;, + 0.485178;0.411726;, + 0.565621;0.335995;, + 0.536916;0.335282;, + 0.594197;0.337971;, + 0.879880;0.266471;, + 0.896585;0.266970;, + 0.981714;0.549754;, + 0.959173;0.550152;, + 0.993412;0.532121;, + 0.911361;0.265679;, + 0.944930;0.548958;, + 0.991594;0.515601;, + 0.987964;0.504932;, + 0.874609;0.301468;, + 0.881797;0.290567;, + 0.987964;0.504932;, + 0.923442;0.290776;, + 0.894704;0.289223;, + 0.988993;0.482104;, + 0.941215;0.509530;, + 0.928011;0.304107;, + 0.938862;0.340611;, + 0.928965;0.335341;, + 0.935938;0.471280;, + 0.916356;0.483920;, + 0.953678;0.337149;, + 0.927180;0.460289;, + 0.952654;0.353364;, + 1.000000;1.000000;, + 1.000000;1.000000;, + 0.922355;0.455126;, + 0.921067;0.451440;, + 0.954272;0.363662;, + 0.914584;0.447588;, + 0.872693;0.373015;, + 0.933280;0.438169;, + 0.932123;0.444577;, + 0.945306;0.436670;, + 0.947010;0.442402;, + 0.934191;0.432159;, + 0.943779;0.430962;, + 0.934464;0.427238;, + 0.944140;0.426029;, + 0.933322;0.423342;, + 0.945347;0.421842;, + 0.933852;0.417199;, + 0.944784;0.415835;, + 0.935261;0.412166;, + 0.943440;0.411143;, + 0.934807;0.408303;, + 0.944128;0.407138;, + 0.933499;0.405627;, + 0.945523;0.404125;, + 0.934306;0.399900;, + 0.944760;0.398593;, + 0.936197;0.395479;, + 0.942312;0.394711;, + 0.938126;0.393378;, + 0.940188;0.393119;, + 0.948663;0.433609;, + 0.962449;0.431891;, + 0.963569;0.439852;, + 0.949712;0.425444;, + 0.960702;0.424073;, + 0.950027;0.418771;, + 0.961120;0.417385;, + 0.948720;0.413426;, + 0.962506;0.411706;, + 0.949332;0.405039;, + 0.961865;0.403475;, + 0.950951;0.398224;, + 0.960328;0.397052;, + 0.950433;0.392937;, + 0.961118;0.391601;, + 0.948935;0.389236;, + 0.962720;0.387514;, + 0.949864;0.381423;, + 0.961849;0.379924;, + 0.952035;0.375474;, + 0.959045;0.374594;, + 0.954248;0.372686;, + 0.956611;0.372389;, + 0.964836;0.431793;, + 0.978209;0.430202;, + 0.979243;0.437677;, + 0.965950;0.424289;, + 0.976611;0.423020;, + 0.966334;0.418150;, + 0.977095;0.416868;, + 0.965133;0.413242;, + 0.978506;0.411649;, + 0.965829;0.405541;, + 0.977985;0.404094;, + 0.967479;0.399276;, + 0.976574;0.398191;, + 0.967041;0.394421;, + 0.977406;0.393185;, + 0.965636;0.391026;, + 0.979007;0.389433;, + 0.966632;0.383854;, + 0.978257;0.382466;, + 0.968804;0.378379;, + 0.975604;0.377565;, + 0.970980;0.375810;, + 0.973272;0.375535;, + 0.980527;0.431609;, + 0.991780;0.430872;, + 0.981826;0.426089;, + 0.990797;0.425501;, + 0.982442;0.421548;, + 0.991496;0.420953;, + 0.981680;0.417876;, + 0.992932;0.417138;, + 0.982647;0.412208;, + 0.992876;0.411538;, + 0.984331;0.407622;, + 0.991985;0.407118;, + 0.984207;0.404017;, + 0.992928;0.403443;, + 0.983205;0.401464;, + 0.994456;0.400724;, + 0.873351;0.415244;, + 0.984397;0.396197;, + 0.870746;0.415440;, + 0.986474;0.392206;, + 0.992196;0.391827;, + 0.988412;0.390367;, + 0.990341;0.390239;, + 0.933195;0.460832;, + 0.929516;0.270184;, + 0.960279;0.517513;, + 0.941215;0.509530;, + 0.935596;0.521485;, + 0.873524;0.323161;, + 0.715286;0.395988;, + 0.499149;0.337032;, + 0.484789;0.334008;, + 0.714967;0.334006;, + 0.616154;0.336767;, + 0.618732;0.413149;, + 0.618222;0.371582;, + 0.645009;0.344914;, + 0.684073;0.334711;, + 0.616956;0.479479;, + 0.485239;0.507463;, + 0.485593;0.530220;, + 0.619554;0.528041;, + 0.617878;0.506596;, + 0.614305;0.539126;, + 0.715662;0.536483;, + 0.707911;0.479876;, + 0.715316;0.480342;, + 0.530845;0.480046;, + 0.579638;0.481539;, + 0.611205;0.482665;, + 0.634599;0.480479;, + 0.659608;0.481359;, + 0.682447;0.479741;, + 0.500776;0.479904;, + 0.485365;0.486454;, + 0.485364;0.479957;, + 0.618547;0.487348;, + 0.618035;0.480859;, + 0.485593;0.480884;, + 0.526256;0.539496;, + 0.658985;0.539087;, + 0.642654;0.716241;, + 0.706306;0.540833;, + 0.676209;0.539484;, + 0.570340;0.539574;, + 0.589402;0.577637;, + 0.580114;0.538910;, + 0.630066;0.542891;, + 0.560574;0.538232;, + 0.707645;0.653215;, + 0.698825;0.716851;, + 0.626437;0.657671;, + 0.494342;0.580983;, + 0.509352;0.540802;, + 0.544101;0.536351;, + 0.484496;0.412560;, + 0.564904;0.336726;, + 0.536100;0.335995;, + 0.593407;0.338687;, + 0.880106;0.263780;, + 0.890029;0.264275;, + 0.983849;0.547217;, + 0.959557;0.551183;, + 0.995531;0.534564;, + 0.911710;0.264051;, + 0.946269;0.549368;, + 0.989370;0.511245;, + 0.993351;0.517791;, + 0.893307;0.290193;, + 0.875823;0.291903;, + 0.989370;0.511245;, + 0.919671;0.294804;, + 0.992837;0.480465;, + 0.940909;0.507167;, + 0.925087;0.297402;, + 0.941330;0.343586;, + 0.926942;0.328248;, + 0.934683;0.469925;, + 0.916037;0.478099;, + 0.955318;0.339833;, + 0.926602;0.455368;, + 0.955264;0.354332;, + 0.919668;0.446793;, + 0.957566;0.362848;, + 0.912527;0.443043;, + 0.872782;0.373158;, + 0.948367;0.441273;, + 0.919288;0.373060;, + 0.933018;0.443136;, + 0.934200;0.436900;, + 0.916783;0.371089;, + 0.935125;0.431048;, + 0.944973;0.430058;, + 0.935605;0.426190;, + 0.945547;0.425188;, + 0.934376;0.422378;, + 0.946729;0.421136;, + 0.934637;0.416466;, + 0.945867;0.415337;, + 0.936131;0.411562;, + 0.944536;0.410714;, + 0.935548;0.407812;, + 0.945126;0.406847;, + 0.934036;0.405221;, + 0.946391;0.403976;, + 0.934582;0.399720;, + 0.945327;0.398635;, + 0.936732;0.395377;, + 0.943022;0.394739;, + 0.938903;0.393308;, + 0.941024;0.393092;, + 0.950025;0.432725;, + 0.964184;0.431303;, + 0.965384;0.439088;, + 0.951087;0.424772;, + 0.962376;0.423636;, + 0.951639;0.418194;, + 0.963037;0.417045;, + 0.950231;0.412967;, + 0.964392;0.411542;, + 0.950532;0.404875;, + 0.963406;0.403580;, + 0.952246;0.398233;, + 0.961882;0.397261;, + 0.951580;0.393096;, + 0.962559;0.391989;, + 0.949847;0.389507;, + 0.964010;0.388079;, + 0.950475;0.381982;, + 0.962793;0.380738;, + 0.952940;0.376145;, + 0.960151;0.375413;, + 0.955429;0.373402;, + 0.957861;0.373154;, + 0.966666;0.431243;, + 0.980400;0.429939;, + 0.981495;0.437251;, + 0.967796;0.423937;, + 0.978747;0.422895;, + 0.968413;0.417885;, + 0.979469;0.416831;, + 0.967116;0.413084;, + 0.980852;0.411777;, + 0.967514;0.405663;, + 0.980002;0.404475;, + 0.969258;0.399559;, + 0.978605;0.398667;, + 0.968680;0.394844;, + 0.979330;0.393828;, + 0.967049;0.391554;, + 0.980787;0.390244;, + 0.967756;0.384653;, + 0.979704;0.383511;, + 0.970216;0.379281;, + 0.977211;0.378609;, + 0.972661;0.376752;, + 0.975020;0.376525;, + 0.982811;0.431347;, + 0.994369;0.430837;, + 0.984136;0.425982;, + 0.993352;0.425573;, + 0.984958;0.421504;, + 0.994262;0.421090;, + 0.984124;0.417916;, + 0.995683;0.417404;, + 0.984852;0.412471;, + 0.995361;0.412006;, + 0.986626;0.408010;, + 0.994491;0.407659;, + 0.986391;0.404516;, + 0.995353;0.404116;, + 0.985203;0.402047;, + 0.996764;0.401532;, + 0.986163;0.396997;, + 0.996218;0.396547;, + 0.988492;0.393082;, + 0.994378;0.392816;, + 0.990660;0.391272;, + 0.992645;0.391182;, + 0.932421;0.459512;, + 0.923257;0.263530;, + 0.959778;0.518762;, + 0.936222;0.521783;, + 0.940909;0.507167;, + 0.715515;0.396862;, + 0.499182;0.336927;, + 0.484655;0.334095;, + 0.716951;0.335782;, + 0.564387;0.076817;, + 0.643460;0.343672;, + 0.616978;0.334945;, + 0.564387;0.076817;, + 0.096204;0.018218;, + 0.077882;0.009132;, + 0.140301;0.018636;, + 0.118913;0.022106;, + 0.159948;0.009132;, + 0.733208;0.668843;, + 0.733271;0.671494;, + 0.733061;0.622205;, + 0.734636;0.718815;, + 0.733702;0.623688;, + 0.733817;0.666406;, + 0.734634;0.717573;, + 0.733411;0.719397;, + 0.733436;0.669007;, + 0.731958;0.668479;, + 0.065514;0.263969;, + 0.075463;0.280817;, + 0.088742;0.263945;, + 0.046752;0.280814;, + 0.020600;0.264050;, + 0.118135;0.263808;, + 0.097353;0.346425;, + 0.118135;0.361247;, + 0.098118;0.280881;, + 0.075557;0.346508;, + 0.087647;0.361135;, + 0.060355;0.361119;, + 0.034011;0.346597;, + 0.017495;0.361046;, + 0.017980;0.308672;, + 0.048694;0.343504;, + 0.794423;0.747604;, + 0.841006;0.735950;, + 0.032432;0.280852;, + 0.737977;0.623570;, + 0.742795;0.665101;, + 0.735401;0.718589;, + 0.735464;0.622670;, + 0.806908;0.784277;, + 0.744124;0.623382;, + 0.734055;0.716026;, + 0.735560;0.624194;, + 0.735259;0.624000;, + 0.736255;0.718648;, + 0.734441;0.669812;, + 0.733843;0.625481;, + 0.734435;0.670116;, + 0.735742;0.624306;, + 0.735112;0.623862;, + 0.721657;0.718291;, + 0.733828;0.668886;, + 0.733464;0.621691;, + 0.734023;0.717847;, + 0.733534;0.719777;, + 0.734009;0.671022;, + 0.734158;0.716596;, + 0.731633;0.621868;, + 0.731332;0.631315;, + 0.669043;0.833034;, + 0.660066;0.832672;, + 0.655598;0.849640;, + 0.737725;0.714443;, + 0.741942;0.676619;, + 0.741961;0.715542;, + 0.733665;0.674284;, + 0.734971;0.669387;, + 0.729903;0.675143;, + 0.734761;0.719063;, + 0.735332;0.716619;, + 0.734955;0.668426;, + 0.721716;0.621992;, + 0.490854;0.881098;, + 0.604315;0.879016;, + 0.619397;0.857270;, + 0.550381;0.879254;, + 0.614918;0.901410;, + 0.733632;0.622431;, + 0.733752;0.622431;, + 0.733619;0.621524;, + 0.734255;0.718460;, + 0.733645;0.623168;, + 0.734765;0.668727;, + 0.733004;0.624609;, + 0.732771;0.623537;, + 0.732742;0.623931;, + 0.733127;0.622943;, + 0.738124;0.626577;, + 0.733325;0.623897;, + 0.736550;0.716796;, + 0.733320;0.626103;, + 0.734626;0.670928;, + 0.735641;0.711463;, + 0.734563;0.670905;, + 0.735018;0.673031;, + 0.734433;0.669076;, + 0.734127;0.670046;, + 0.735105;0.667616;, + 0.734543;0.621846;, + 0.734712;0.717490;, + 0.734725;0.623514;, + 0.733232;0.624888;, + 0.736739;0.716543;, + 0.734684;0.670029;, + 0.734888;0.718644;, + 0.732628;0.670896;, + 0.733935;0.669238;, + 0.733037;0.669749;, + 0.170261;0.263941;, + 0.147528;0.263863;, + 0.159819;0.280672;, + 0.202812;0.280741;, + 0.212210;0.264050;, + 0.138917;0.346425;, + 0.137163;0.280736;, + 0.149118;0.361154;, + 0.160713;0.346508;, + 0.175915;0.361213;, + 0.217292;0.361140;, + 0.217795;0.309277;, + 0.203145;0.343675;, + 0.180652;0.278493;, + 0.737977;0.623570;, + 0.742795;0.665101;, + 0.734658;0.673204;, + 0.734427;0.624424;, + 0.741949;0.625748;, + 0.735977;0.717392;, + 0.735384;0.622600;, + 0.735442;0.624471;, + 0.734397;0.718833;, + 0.735195;0.674837;, + 0.731426;0.622834;, + 0.733554;0.671983;, + 0.732964;0.622128;, + 0.735365;0.720658;, + 0.732993;0.622640;, + 0.722763;0.718246;, + 0.734404;0.664391;, + 0.806292;0.771849;, + 0.733568;0.624201;, + 0.735564;0.717674;, + 0.734832;0.718436;, + 0.734634;0.672608;, + 0.733135;0.673954;, + 0.738890;0.713850;, + 0.734689;0.623399;, + 0.732473;0.640685;, + 0.741942;0.676619;, + 0.734732;0.719564;, + 0.736409;0.671560;, + 0.733928;0.669098;, + 0.734488;0.716382;, + 0.735985;0.719547;, + 0.734111;0.670206;, + 0.722716;0.624358;, + 0.490854;0.881098;, + 0.619397;0.857270;, + 0.604316;0.879016;, + 0.550381;0.879254;, + 0.614041;0.900874;, + 0.734698;0.623311;, + 0.733366;0.623859;, + 0.733853;0.622432;, + 0.736423;0.718140;, + 0.733794;0.624449;, + 0.733416;0.668524;, + 0.734057;0.624252;, + 0.733026;0.622840;, + 0.733957;0.622990;, + 0.733958;0.669768;, + 0.573787;0.946976;, + 0.570524;0.952054;, + 0.732989;0.677617;, + 0.733901;0.623536;, + 0.742194;0.624474;, + 0.735057;0.717697;, + 0.733910;0.670742;, + 0.722198;0.625877;, + 0.726309;0.666336;, + 0.732760;0.623866;, + 0.722409;0.718816;, + 0.771240;0.998210;, + 0.768920;0.993101;, + 0.688441;0.780145;, + 0.670920;0.758421;, + 0.716559;0.753271;, + 0.699682;0.779579;, + 0.768920;0.993101;, + 0.771240;0.998210;, + 0.684801;0.799303;, + 0.703203;0.796694;, + 0.578377;0.723871;, + 0.556798;0.737410;, + 0.535220;0.723871;, + 0.494371;0.846123;, + 0.556672;0.847727;, + 0.617913;0.846306;, + 0.883801;0.999405;, + 0.883640;0.999019;, + 0.883640;0.999019;, + 0.883801;0.999405;, + 0.869557;0.983855;, + 0.878434;0.995071;, + 0.843654;0.956371;, + 0.862861;0.974051;, + 0.704350;0.916866;, + 0.711279;0.931275;, + 0.726665;0.956005;, + 0.758250;0.982937;, + 0.718910;0.943490;, + 0.801523;0.828198;, + 0.803097;0.850936;, + 0.804537;0.864603;, + 0.813820;0.899525;, + 0.696062;0.914837;, + 0.809005;0.773290;, + 0.799319;0.811168;, + 0.709933;0.855338;, + 0.699389;0.815607;, + 0.845499;0.203618;, + 0.836934;0.209967;, + 0.834313;0.222928;, + 0.836611;0.235486;, + 0.817344;0.816095;, + 0.818300;0.813808;, + 0.827677;0.929505;, + 0.900992;0.226326;, + 0.889329;0.204667;, + 0.864170;0.826738;, + 0.897258;0.241354;, + 0.905079;0.230177;, + 0.756146;0.776044;, + 0.749218;0.822256;, + 0.665190;0.878729;, + 0.688338;0.907690;, + 0.762590;0.730701;, + 0.602368;0.738846;, + 0.723336;0.628567;, + 0.723137;0.664019;, + 0.864352;0.570403;, + 0.855895;0.608482;, + 0.865600;0.559362;, + 0.862728;0.546228;, + 0.857614;0.550540;, + 0.739543;0.726668;, + 0.631750;0.845695;, + 0.876169;0.248651;, + 0.890294;0.243145;, + 0.872748;0.198756;, + 0.854340;0.200840;, + 0.879155;0.197889;, + 0.847218;0.244311;, + 0.861893;0.250498;, + 0.842524;0.242503;, + 0.871498;0.251096;, + 0.937684;0.974051;, + 0.956890;0.956371;, + 0.930988;0.983855;, + 0.878434;0.995071;, + 0.758250;0.982937;, + 0.726665;0.956005;, + 0.711279;0.931275;, + 0.704350;0.916866;, + 0.718910;0.943490;, + 0.996007;0.864603;, + 0.813820;0.899525;, + 0.997447;0.850936;, + 0.999022;0.828198;, + 0.696062;0.914837;, + 0.998196;0.807248;, + 0.993636;0.784277;, + 0.794423;0.747604;, + 0.811872;0.736951;, + 0.669043;0.833034;, + 0.699389;0.815607;, + 0.709933;0.855338;, + 0.904083;0.234820;, + 0.906567;0.222917;, + 0.903734;0.210631;, + 0.894473;0.204614;, + 0.984046;0.817359;, + 0.982715;0.814038;, + 0.972868;0.929505;, + 0.934802;0.823017;, + 0.847081;0.205608;, + 0.933650;0.826738;, + 0.838508;0.240382;, + 0.756146;0.776044;, + 0.749218;0.822256;, + 0.655598;0.849640;, + 0.660066;0.832672;, + 0.665190;0.878729;, + 0.688338;0.907690;, + 0.625881;0.747856;, + 0.511229;0.738846;, + 0.721795;0.673083;, + 0.656300;0.740491;, + 0.647354;0.737719;, + 0.984113;0.609149;, + 0.981105;0.573070;, + 0.970594;0.556694;, + 0.980214;0.557876;, + 0.489245;0.841771;, + 0.846038;0.242079;, + 0.861311;0.247298;, + 0.884914;0.201981;, + 0.865010;0.200005;, + 0.858082;0.199183;, + 0.876747;0.249049;, + 0.892614;0.243184;, + 0.897689;0.241471;, + 0.866361;0.249615;, + 0.523805;0.842839;, + 0.590386;0.842199;, + 0.184823;0.343667;, + 0.264166;0.187404;, + 0.551922;0.238188;; + } + + VertexDuplicationIndices { + 4432; + 3420; + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 76, + 77, + 78, + 79, + 80, + 81, + 82, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95, + 96, + 97, + 98, + 99, + 100, + 101, + 102, + 103, + 104, + 105, + 106, + 107, + 108, + 109, + 110, + 111, + 112, + 113, + 114, + 115, + 116, + 117, + 118, + 119, + 120, + 121, + 122, + 123, + 124, + 125, + 126, + 127, + 128, + 129, + 130, + 131, + 132, + 133, + 134, + 135, + 136, + 137, + 138, + 139, + 140, + 141, + 142, + 143, + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 155, + 156, + 157, + 158, + 159, + 160, + 161, + 162, + 163, + 164, + 165, + 166, + 167, + 168, + 169, + 170, + 171, + 172, + 173, + 174, + 175, + 176, + 177, + 178, + 179, + 180, + 181, + 182, + 183, + 184, + 185, + 186, + 187, + 188, + 189, + 190, + 191, + 192, + 193, + 194, + 195, + 196, + 197, + 198, + 199, + 200, + 201, + 202, + 203, + 204, + 205, + 206, + 207, + 208, + 209, + 210, + 211, + 212, + 213, + 214, + 215, + 216, + 217, + 218, + 219, + 220, + 221, + 222, + 223, + 224, + 225, + 226, + 227, + 228, + 229, + 230, + 231, + 232, + 233, + 234, + 235, + 236, + 237, + 238, + 239, + 240, + 241, + 242, + 243, + 244, + 245, + 246, + 247, + 248, + 249, + 250, + 251, + 252, + 253, + 254, + 255, + 256, + 257, + 258, + 259, + 260, + 261, + 262, + 263, + 264, + 265, + 266, + 267, + 268, + 269, + 270, + 271, + 272, + 273, + 274, + 275, + 276, + 277, + 278, + 279, + 280, + 281, + 282, + 283, + 284, + 285, + 286, + 287, + 288, + 289, + 290, + 291, + 292, + 293, + 294, + 295, + 296, + 297, + 298, + 299, + 300, + 301, + 302, + 303, + 304, + 305, + 306, + 307, + 308, + 309, + 310, + 311, + 312, + 313, + 314, + 315, + 316, + 317, + 318, + 319, + 320, + 321, + 322, + 323, + 324, + 325, + 326, + 327, + 328, + 329, + 330, + 331, + 332, + 333, + 334, + 335, + 336, + 337, + 338, + 339, + 340, + 341, + 342, + 343, + 344, + 345, + 346, + 347, + 348, + 349, + 350, + 351, + 352, + 353, + 354, + 355, + 356, + 357, + 358, + 359, + 360, + 361, + 362, + 363, + 364, + 365, + 366, + 367, + 368, + 369, + 370, + 371, + 372, + 373, + 374, + 375, + 376, + 377, + 378, + 379, + 380, + 381, + 382, + 383, + 384, + 385, + 386, + 387, + 388, + 389, + 390, + 391, + 392, + 393, + 394, + 395, + 396, + 397, + 398, + 399, + 400, + 401, + 402, + 403, + 404, + 405, + 406, + 407, + 408, + 409, + 410, + 411, + 412, + 413, + 414, + 415, + 416, + 417, + 418, + 419, + 420, + 421, + 422, + 423, + 424, + 425, + 426, + 427, + 428, + 429, + 430, + 431, + 432, + 433, + 434, + 435, + 436, + 437, + 438, + 439, + 440, + 441, + 442, + 443, + 444, + 445, + 446, + 447, + 448, + 449, + 450, + 451, + 452, + 453, + 454, + 455, + 456, + 457, + 458, + 459, + 460, + 461, + 462, + 463, + 464, + 465, + 466, + 467, + 468, + 469, + 470, + 471, + 472, + 473, + 474, + 475, + 476, + 477, + 478, + 479, + 480, + 481, + 482, + 483, + 484, + 485, + 486, + 487, + 488, + 489, + 490, + 491, + 492, + 493, + 494, + 495, + 496, + 497, + 498, + 499, + 500, + 501, + 502, + 503, + 504, + 505, + 506, + 507, + 508, + 509, + 510, + 511, + 512, + 513, + 514, + 515, + 516, + 517, + 518, + 519, + 520, + 521, + 522, + 523, + 524, + 525, + 526, + 527, + 528, + 529, + 530, + 531, + 532, + 533, + 534, + 535, + 536, + 537, + 538, + 539, + 540, + 541, + 542, + 543, + 544, + 545, + 546, + 547, + 548, + 549, + 550, + 551, + 552, + 553, + 554, + 555, + 556, + 557, + 558, + 559, + 560, + 561, + 562, + 563, + 564, + 565, + 566, + 567, + 568, + 569, + 570, + 571, + 572, + 573, + 574, + 575, + 576, + 577, + 578, + 579, + 580, + 581, + 582, + 583, + 584, + 585, + 586, + 587, + 588, + 589, + 590, + 591, + 592, + 593, + 594, + 595, + 596, + 597, + 598, + 599, + 600, + 601, + 602, + 603, + 604, + 605, + 606, + 607, + 608, + 609, + 610, + 611, + 612, + 613, + 614, + 615, + 616, + 617, + 618, + 619, + 620, + 621, + 622, + 623, + 624, + 625, + 626, + 627, + 628, + 629, + 630, + 631, + 632, + 633, + 634, + 635, + 636, + 637, + 638, + 639, + 640, + 641, + 642, + 643, + 644, + 645, + 646, + 647, + 648, + 649, + 650, + 651, + 652, + 653, + 654, + 655, + 656, + 657, + 658, + 659, + 660, + 661, + 662, + 663, + 664, + 665, + 666, + 667, + 668, + 669, + 670, + 671, + 672, + 673, + 674, + 675, + 676, + 677, + 678, + 679, + 680, + 681, + 682, + 683, + 684, + 685, + 686, + 687, + 688, + 689, + 690, + 691, + 692, + 693, + 694, + 695, + 696, + 697, + 698, + 699, + 700, + 701, + 702, + 703, + 704, + 705, + 706, + 707, + 708, + 709, + 710, + 711, + 712, + 713, + 714, + 715, + 716, + 717, + 718, + 719, + 720, + 721, + 722, + 723, + 724, + 725, + 726, + 727, + 728, + 729, + 730, + 731, + 732, + 733, + 734, + 735, + 736, + 737, + 738, + 739, + 740, + 741, + 742, + 743, + 744, + 745, + 746, + 747, + 748, + 749, + 750, + 751, + 752, + 753, + 754, + 755, + 756, + 757, + 758, + 759, + 760, + 761, + 762, + 763, + 764, + 765, + 766, + 767, + 768, + 769, + 770, + 771, + 772, + 773, + 774, + 775, + 776, + 777, + 778, + 779, + 780, + 781, + 782, + 783, + 784, + 785, + 786, + 787, + 788, + 789, + 790, + 791, + 792, + 793, + 794, + 795, + 796, + 797, + 798, + 799, + 800, + 801, + 802, + 803, + 804, + 805, + 806, + 807, + 808, + 809, + 810, + 811, + 812, + 813, + 814, + 815, + 816, + 817, + 818, + 819, + 820, + 821, + 822, + 823, + 824, + 825, + 826, + 827, + 828, + 829, + 830, + 831, + 832, + 833, + 834, + 835, + 836, + 837, + 838, + 839, + 840, + 841, + 842, + 843, + 844, + 845, + 846, + 847, + 848, + 849, + 850, + 851, + 852, + 853, + 854, + 855, + 856, + 857, + 858, + 859, + 860, + 861, + 862, + 863, + 864, + 865, + 866, + 867, + 868, + 869, + 870, + 871, + 872, + 873, + 874, + 875, + 876, + 877, + 878, + 879, + 880, + 881, + 882, + 883, + 884, + 885, + 886, + 887, + 888, + 889, + 890, + 891, + 892, + 893, + 894, + 895, + 896, + 897, + 898, + 899, + 900, + 901, + 902, + 903, + 904, + 905, + 906, + 907, + 908, + 909, + 910, + 911, + 912, + 913, + 914, + 915, + 916, + 917, + 918, + 919, + 920, + 921, + 922, + 923, + 924, + 925, + 926, + 927, + 928, + 929, + 930, + 931, + 932, + 933, + 934, + 935, + 936, + 937, + 938, + 939, + 940, + 941, + 942, + 943, + 944, + 945, + 946, + 947, + 948, + 949, + 950, + 951, + 952, + 953, + 954, + 955, + 956, + 957, + 958, + 959, + 960, + 961, + 962, + 963, + 964, + 965, + 966, + 967, + 968, + 969, + 970, + 971, + 972, + 973, + 974, + 975, + 976, + 977, + 978, + 979, + 980, + 981, + 982, + 983, + 984, + 985, + 986, + 987, + 988, + 989, + 990, + 991, + 992, + 993, + 994, + 995, + 996, + 997, + 998, + 999, + 1000, + 1001, + 1002, + 1003, + 1004, + 1005, + 1006, + 1007, + 1008, + 1009, + 1010, + 1011, + 1012, + 1013, + 1014, + 1015, + 1016, + 1017, + 1018, + 1019, + 1020, + 1021, + 1022, + 1023, + 1024, + 1025, + 1026, + 1027, + 1028, + 1029, + 1030, + 1031, + 1032, + 1033, + 1034, + 1035, + 1036, + 1037, + 1038, + 1039, + 1040, + 1041, + 1042, + 1043, + 1044, + 1045, + 1046, + 1047, + 1048, + 1049, + 1050, + 1051, + 1052, + 1053, + 1054, + 1055, + 1056, + 1057, + 1058, + 1059, + 1060, + 1061, + 1062, + 1063, + 1064, + 1065, + 1066, + 1067, + 1068, + 1069, + 1070, + 1071, + 1072, + 1073, + 1074, + 1075, + 1076, + 1077, + 1078, + 1079, + 1080, + 1081, + 1082, + 1083, + 1084, + 1085, + 1086, + 1087, + 1088, + 1089, + 1090, + 1091, + 1092, + 1093, + 1094, + 1095, + 1096, + 1097, + 1098, + 1099, + 1100, + 1101, + 1102, + 1103, + 1104, + 1105, + 1106, + 1107, + 1108, + 1109, + 1110, + 1111, + 1112, + 1113, + 1114, + 1115, + 1116, + 1117, + 1118, + 1119, + 1120, + 1121, + 1122, + 1123, + 1124, + 1125, + 1126, + 1127, + 1128, + 1129, + 1130, + 1131, + 1132, + 1133, + 1134, + 1135, + 1136, + 1137, + 1138, + 1139, + 1140, + 1141, + 1142, + 1143, + 1144, + 1145, + 1146, + 1147, + 1148, + 1149, + 1150, + 1151, + 1152, + 1153, + 1154, + 1155, + 1156, + 1157, + 1158, + 1159, + 1160, + 1161, + 1162, + 1163, + 1164, + 1165, + 1166, + 1167, + 1168, + 1169, + 1170, + 1171, + 1172, + 1173, + 1174, + 1175, + 1176, + 1177, + 1178, + 1179, + 1180, + 1181, + 1182, + 1183, + 1184, + 1185, + 1186, + 1187, + 1188, + 1189, + 1190, + 1191, + 1192, + 1193, + 1194, + 1195, + 1196, + 1197, + 1198, + 1199, + 1200, + 1201, + 1202, + 1203, + 1204, + 1205, + 1206, + 1207, + 1208, + 1209, + 1210, + 1211, + 1212, + 1213, + 1214, + 1215, + 1216, + 1217, + 1218, + 1219, + 1220, + 1221, + 1222, + 1223, + 1224, + 1225, + 1226, + 1227, + 1228, + 1229, + 1230, + 1231, + 1232, + 1233, + 1234, + 1235, + 1236, + 1237, + 1238, + 1239, + 1240, + 1241, + 1242, + 1243, + 1244, + 1245, + 1246, + 1247, + 1248, + 1249, + 1250, + 1251, + 1252, + 1253, + 1254, + 1255, + 1256, + 1257, + 1258, + 1259, + 1260, + 1261, + 1262, + 1263, + 1264, + 1265, + 1266, + 1267, + 1268, + 1269, + 1270, + 1271, + 1272, + 1273, + 1274, + 1275, + 1276, + 1277, + 1278, + 1279, + 1280, + 1281, + 1282, + 1283, + 1284, + 1285, + 1286, + 1287, + 1288, + 1289, + 1290, + 1291, + 1292, + 1293, + 1294, + 1295, + 1296, + 1297, + 1298, + 1299, + 1300, + 1301, + 1302, + 1303, + 1304, + 1305, + 1306, + 1307, + 1308, + 1309, + 1310, + 1311, + 1312, + 1313, + 1314, + 1315, + 1316, + 1317, + 1318, + 1319, + 1320, + 1321, + 1322, + 1323, + 1324, + 1325, + 1326, + 1327, + 1328, + 1329, + 1330, + 1331, + 1332, + 1333, + 1334, + 1335, + 1336, + 1337, + 1338, + 1339, + 1340, + 1341, + 1342, + 1343, + 1344, + 1345, + 1346, + 1347, + 1348, + 1349, + 1350, + 1351, + 1352, + 1353, + 1354, + 1355, + 1356, + 1357, + 1358, + 1359, + 1360, + 1361, + 1362, + 1363, + 1364, + 1365, + 1366, + 1367, + 1368, + 1369, + 1370, + 1371, + 1372, + 1373, + 1374, + 1375, + 1376, + 1377, + 1378, + 1379, + 1380, + 1381, + 1382, + 1383, + 1384, + 1385, + 1386, + 1387, + 1388, + 1389, + 1390, + 1391, + 1392, + 1393, + 1394, + 1395, + 1396, + 1397, + 1398, + 1399, + 1400, + 1401, + 1402, + 1403, + 1404, + 1405, + 1406, + 1407, + 1408, + 1409, + 1410, + 1411, + 1412, + 1413, + 1414, + 1415, + 1416, + 1417, + 1418, + 1419, + 1420, + 1421, + 1422, + 1423, + 1424, + 1425, + 1426, + 1427, + 1428, + 1429, + 1430, + 1431, + 1432, + 1433, + 1434, + 1435, + 1436, + 1437, + 1438, + 1439, + 1440, + 1441, + 1442, + 1443, + 1444, + 1445, + 1446, + 1447, + 1448, + 1449, + 1450, + 1451, + 1452, + 1453, + 1454, + 1455, + 1456, + 1457, + 1458, + 1459, + 1460, + 1461, + 1462, + 1463, + 1464, + 1465, + 1466, + 1467, + 1468, + 1469, + 1470, + 1471, + 1472, + 1473, + 1474, + 1475, + 1476, + 1477, + 1478, + 1479, + 1480, + 1481, + 1482, + 1483, + 1484, + 1485, + 1486, + 1487, + 1488, + 1489, + 1490, + 1491, + 1492, + 1493, + 1494, + 1495, + 1496, + 1497, + 1498, + 1499, + 1500, + 1501, + 1502, + 1503, + 1504, + 1505, + 1506, + 1507, + 1508, + 1509, + 1510, + 1511, + 1512, + 1513, + 1514, + 1515, + 1516, + 1517, + 1518, + 1519, + 1520, + 1521, + 1522, + 1523, + 1524, + 1525, + 1526, + 1527, + 1528, + 1529, + 1530, + 1531, + 1532, + 1533, + 1534, + 1535, + 1536, + 1537, + 1538, + 1539, + 1540, + 1541, + 1542, + 1543, + 1544, + 1545, + 1546, + 1547, + 1548, + 1549, + 1550, + 1551, + 1552, + 1553, + 1554, + 1555, + 1556, + 1557, + 1558, + 1559, + 1560, + 1561, + 1562, + 1563, + 1564, + 1565, + 1566, + 1567, + 1568, + 1569, + 1570, + 1571, + 1572, + 1573, + 1574, + 1575, + 1576, + 1577, + 1578, + 1579, + 1580, + 1581, + 1582, + 1583, + 1584, + 1585, + 1586, + 1587, + 1588, + 1589, + 1590, + 1591, + 1592, + 1593, + 1594, + 1595, + 1596, + 1597, + 1598, + 1599, + 1600, + 1601, + 1602, + 1603, + 1604, + 1605, + 1606, + 1607, + 1608, + 1609, + 1610, + 1611, + 1612, + 1613, + 1614, + 1615, + 1616, + 1617, + 1618, + 1619, + 1620, + 1621, + 1622, + 1623, + 1624, + 1625, + 1626, + 1627, + 1628, + 1629, + 1630, + 1631, + 1632, + 1633, + 1634, + 1635, + 1636, + 1637, + 1638, + 1639, + 1640, + 1641, + 1642, + 1643, + 1644, + 1645, + 1646, + 1647, + 1648, + 1649, + 1650, + 1651, + 1652, + 1653, + 1654, + 1655, + 1656, + 1657, + 1658, + 1659, + 1660, + 1661, + 1662, + 1663, + 1664, + 1665, + 1666, + 1667, + 1668, + 1669, + 1670, + 1671, + 1672, + 1673, + 1674, + 1675, + 1676, + 1677, + 1678, + 1679, + 1680, + 1681, + 1682, + 1683, + 1684, + 1685, + 1686, + 1687, + 1688, + 1689, + 1690, + 1691, + 1692, + 1693, + 1694, + 1695, + 1696, + 1697, + 1698, + 1699, + 1700, + 1701, + 1702, + 1703, + 1704, + 1705, + 1706, + 1707, + 1708, + 1709, + 1710, + 1711, + 1712, + 1713, + 1714, + 1715, + 1716, + 1717, + 1718, + 1719, + 1720, + 1721, + 1722, + 1723, + 1724, + 1725, + 1726, + 1727, + 1728, + 1729, + 1730, + 1731, + 1732, + 1733, + 1734, + 1735, + 1736, + 1737, + 1738, + 1739, + 1740, + 1741, + 1742, + 1743, + 1744, + 1745, + 1746, + 1747, + 1748, + 1749, + 1750, + 1751, + 1752, + 1753, + 1754, + 1755, + 1756, + 1757, + 1758, + 1759, + 1760, + 1761, + 1762, + 1763, + 1764, + 1765, + 1766, + 1767, + 1768, + 1769, + 1770, + 1771, + 1772, + 1773, + 1774, + 1775, + 1776, + 1777, + 1778, + 1779, + 1780, + 1781, + 1782, + 1783, + 1784, + 1785, + 1786, + 1787, + 1788, + 1789, + 1790, + 1791, + 1792, + 1793, + 1794, + 1795, + 1796, + 1797, + 1798, + 1799, + 1800, + 1801, + 1802, + 1803, + 1804, + 1805, + 1806, + 1807, + 1808, + 1809, + 1810, + 1811, + 1812, + 1813, + 1814, + 1815, + 1816, + 1817, + 1818, + 1819, + 1820, + 1821, + 1822, + 1823, + 1824, + 1825, + 1826, + 1827, + 1828, + 1829, + 1830, + 1831, + 1832, + 1833, + 1834, + 1835, + 1836, + 1837, + 1838, + 1839, + 1840, + 1841, + 1842, + 1843, + 1844, + 1845, + 1846, + 1847, + 1848, + 1849, + 1850, + 1851, + 1852, + 1853, + 1854, + 1855, + 1856, + 1857, + 1858, + 1859, + 1860, + 1861, + 1862, + 1863, + 1864, + 1865, + 1866, + 1867, + 1868, + 1869, + 1870, + 1871, + 1872, + 1873, + 1874, + 1875, + 1876, + 1877, + 1878, + 1879, + 1880, + 1881, + 1882, + 1883, + 1884, + 1885, + 1886, + 1887, + 1888, + 1889, + 1890, + 1891, + 1892, + 1893, + 1894, + 1895, + 1896, + 1897, + 1898, + 1899, + 1900, + 1901, + 1902, + 1903, + 1904, + 1905, + 1906, + 1907, + 1908, + 1909, + 1910, + 1911, + 1912, + 1913, + 1914, + 1915, + 1916, + 1917, + 1918, + 1919, + 1920, + 1921, + 1922, + 1923, + 1924, + 1925, + 1926, + 1927, + 1928, + 1929, + 1930, + 1931, + 1932, + 1933, + 1934, + 1935, + 1936, + 1937, + 1938, + 1939, + 1940, + 1941, + 1942, + 1943, + 1944, + 1945, + 1946, + 1947, + 1948, + 1949, + 1950, + 1951, + 1952, + 1953, + 1954, + 1955, + 1956, + 1957, + 1958, + 1959, + 1960, + 1961, + 1962, + 1963, + 1964, + 1965, + 1966, + 1967, + 1968, + 1969, + 1970, + 1971, + 1972, + 1973, + 1974, + 1975, + 1976, + 1977, + 1978, + 1979, + 1980, + 1981, + 1982, + 1983, + 1984, + 1985, + 1986, + 1987, + 1988, + 1989, + 1990, + 1991, + 1992, + 1993, + 1994, + 1995, + 1996, + 1997, + 1998, + 1999, + 2000, + 2001, + 2002, + 2003, + 2004, + 2005, + 2006, + 2007, + 2008, + 2009, + 2010, + 2011, + 2012, + 2013, + 2014, + 2015, + 2016, + 2017, + 2018, + 2019, + 2020, + 2021, + 2022, + 2023, + 2024, + 2025, + 2026, + 2027, + 2028, + 2029, + 2030, + 2031, + 2032, + 2033, + 2034, + 2035, + 2036, + 2037, + 2038, + 2039, + 2040, + 2041, + 2042, + 2043, + 2044, + 2045, + 2046, + 2047, + 2048, + 2049, + 2050, + 2051, + 2052, + 2053, + 2054, + 2055, + 2056, + 2057, + 2058, + 2059, + 2060, + 2061, + 2062, + 2063, + 2064, + 2065, + 2066, + 2067, + 2068, + 2069, + 2070, + 2071, + 2072, + 2073, + 2074, + 2075, + 2076, + 2077, + 2078, + 2079, + 2080, + 2081, + 2082, + 2083, + 2084, + 2085, + 2086, + 2087, + 2088, + 2089, + 2090, + 2091, + 2092, + 2093, + 2094, + 2095, + 2096, + 2097, + 2098, + 2099, + 2100, + 2101, + 2102, + 2103, + 2104, + 2105, + 2106, + 2107, + 2108, + 2109, + 2110, + 2111, + 2112, + 2113, + 2114, + 2115, + 2116, + 2117, + 2118, + 2119, + 2120, + 2121, + 2122, + 2123, + 2124, + 2125, + 2126, + 2127, + 2128, + 2129, + 2130, + 2131, + 2132, + 2133, + 2134, + 2135, + 2136, + 2137, + 2138, + 2139, + 2140, + 2141, + 2142, + 2143, + 2144, + 2145, + 2146, + 2147, + 2148, + 2149, + 2150, + 2151, + 2152, + 2153, + 2154, + 2155, + 2156, + 2157, + 2158, + 2159, + 2160, + 2161, + 2162, + 2163, + 2164, + 2165, + 2166, + 2167, + 2168, + 2169, + 2170, + 2171, + 2172, + 2173, + 2174, + 2175, + 2176, + 2177, + 2178, + 2179, + 2180, + 2181, + 2182, + 2183, + 2184, + 2185, + 2186, + 2187, + 2188, + 2189, + 2190, + 2191, + 2192, + 2193, + 2194, + 2195, + 2196, + 2197, + 2198, + 2199, + 2200, + 2201, + 2202, + 2203, + 2204, + 2205, + 2206, + 2207, + 2208, + 2209, + 2210, + 2211, + 2212, + 2213, + 2214, + 2215, + 2216, + 2217, + 2218, + 2219, + 2220, + 2221, + 2222, + 2223, + 2224, + 2225, + 2226, + 2227, + 2228, + 2229, + 2230, + 2231, + 2232, + 2233, + 2234, + 2235, + 2236, + 2237, + 2238, + 2239, + 2240, + 2241, + 2242, + 2243, + 2244, + 2245, + 2246, + 2247, + 2248, + 2249, + 2250, + 2251, + 2252, + 2253, + 2254, + 2255, + 2256, + 2257, + 2258, + 2259, + 2260, + 2261, + 2262, + 2263, + 2264, + 2265, + 2266, + 2267, + 2268, + 2269, + 2270, + 2271, + 2272, + 2273, + 2274, + 2275, + 2276, + 2277, + 2278, + 2279, + 2280, + 2281, + 2282, + 2283, + 2284, + 2285, + 2286, + 2287, + 2288, + 2289, + 2290, + 2291, + 2292, + 2293, + 2294, + 2295, + 2296, + 2297, + 2298, + 2299, + 2300, + 2301, + 2302, + 2303, + 2304, + 2305, + 2306, + 2307, + 2308, + 2309, + 2310, + 2311, + 2312, + 2313, + 2314, + 2315, + 2316, + 2317, + 2318, + 2319, + 2320, + 2321, + 2322, + 2323, + 2324, + 2325, + 2326, + 2327, + 2328, + 2329, + 2330, + 2331, + 2332, + 2333, + 2334, + 2335, + 2336, + 2337, + 2338, + 2339, + 2340, + 2341, + 2342, + 2343, + 2344, + 2345, + 2346, + 2347, + 2348, + 2349, + 2350, + 2351, + 2352, + 2353, + 2354, + 2355, + 2356, + 2357, + 2358, + 2359, + 2360, + 2361, + 2362, + 2363, + 2364, + 2365, + 2366, + 2367, + 2368, + 2369, + 2370, + 2371, + 2372, + 2373, + 2374, + 2375, + 2376, + 2377, + 2378, + 2379, + 2380, + 2381, + 2382, + 2383, + 2384, + 2385, + 2386, + 2387, + 2388, + 2389, + 2390, + 2391, + 2392, + 2393, + 2394, + 2395, + 2396, + 2397, + 2398, + 2399, + 2400, + 2401, + 2402, + 2403, + 2404, + 2405, + 2406, + 2407, + 2408, + 2409, + 2410, + 2411, + 2412, + 2413, + 2414, + 2415, + 2416, + 2417, + 2418, + 2419, + 2420, + 2421, + 2422, + 2423, + 2424, + 2425, + 2426, + 2427, + 2428, + 2429, + 2430, + 2431, + 2432, + 2433, + 2434, + 2435, + 2436, + 2437, + 2438, + 2439, + 2440, + 2441, + 2442, + 2443, + 2444, + 2445, + 2446, + 2447, + 2448, + 2449, + 2450, + 2451, + 2452, + 2453, + 2454, + 2455, + 2456, + 2457, + 2458, + 2459, + 2460, + 2461, + 2462, + 2463, + 2464, + 2465, + 2466, + 2467, + 2468, + 2469, + 2470, + 2471, + 2472, + 2473, + 2474, + 2475, + 2476, + 2477, + 2478, + 2479, + 2480, + 2481, + 2482, + 2483, + 2484, + 2485, + 2486, + 2487, + 2488, + 2489, + 2490, + 2491, + 2492, + 2493, + 2494, + 2495, + 2496, + 2497, + 2498, + 2499, + 2500, + 2501, + 2502, + 2503, + 2504, + 2505, + 2506, + 2507, + 2508, + 2509, + 2510, + 2511, + 2512, + 2513, + 2514, + 2515, + 2516, + 2517, + 2518, + 2519, + 2520, + 2521, + 2522, + 2523, + 2524, + 2525, + 2526, + 2527, + 2528, + 2529, + 2530, + 2531, + 2532, + 2533, + 2534, + 2535, + 2536, + 2537, + 2538, + 2539, + 2540, + 2541, + 2542, + 2543, + 2544, + 2545, + 2546, + 2547, + 2548, + 2549, + 2550, + 2551, + 2552, + 2553, + 2554, + 2555, + 2556, + 2557, + 2558, + 2559, + 2560, + 2561, + 2562, + 2563, + 2564, + 2565, + 2566, + 2567, + 2568, + 2569, + 2570, + 2571, + 2572, + 2573, + 2574, + 2575, + 2576, + 2577, + 2578, + 2579, + 2580, + 2581, + 2582, + 2583, + 2584, + 2585, + 2586, + 2587, + 2588, + 2589, + 2590, + 2591, + 2592, + 2593, + 2594, + 2595, + 2596, + 2597, + 2598, + 2599, + 2600, + 2601, + 2602, + 2603, + 2604, + 2605, + 2606, + 2607, + 2608, + 2609, + 2610, + 2611, + 2612, + 2613, + 2614, + 2615, + 2616, + 2617, + 2618, + 2619, + 2620, + 2621, + 2622, + 2623, + 2624, + 2625, + 2626, + 2627, + 2628, + 2629, + 2630, + 2631, + 2632, + 2633, + 2634, + 2635, + 2636, + 2637, + 2638, + 2639, + 2640, + 2641, + 2642, + 2643, + 2644, + 2645, + 2646, + 2647, + 2648, + 2649, + 2650, + 2651, + 2652, + 2653, + 2654, + 2655, + 2656, + 2657, + 2658, + 2659, + 2660, + 2661, + 2662, + 2663, + 2664, + 2665, + 2666, + 2667, + 2668, + 2669, + 2670, + 2671, + 2672, + 2673, + 2674, + 2675, + 2676, + 2677, + 2678, + 2679, + 2680, + 2681, + 2682, + 2683, + 2684, + 2685, + 2686, + 2687, + 2688, + 2689, + 2690, + 2691, + 2692, + 2693, + 2694, + 2695, + 2696, + 2697, + 2698, + 2699, + 2700, + 2701, + 2702, + 2703, + 2704, + 2705, + 2706, + 2707, + 2708, + 2709, + 2710, + 2711, + 2712, + 2713, + 2714, + 2715, + 2716, + 2717, + 2718, + 2719, + 2720, + 2721, + 2722, + 2723, + 2724, + 2725, + 2726, + 2727, + 2728, + 2729, + 2730, + 2731, + 2732, + 2733, + 2734, + 2735, + 2736, + 2737, + 2738, + 2739, + 2740, + 2741, + 2742, + 2743, + 2744, + 2745, + 2746, + 2747, + 2748, + 2749, + 2750, + 2751, + 2752, + 2753, + 2754, + 2755, + 2756, + 2757, + 2758, + 2759, + 2760, + 2761, + 2762, + 2763, + 2764, + 2765, + 2766, + 2767, + 2768, + 2769, + 2770, + 2771, + 2772, + 2773, + 2774, + 2775, + 2776, + 2777, + 2778, + 2779, + 2780, + 2781, + 2782, + 2783, + 2784, + 2785, + 2786, + 2787, + 2788, + 2789, + 2790, + 2791, + 2792, + 2793, + 2794, + 2795, + 2796, + 2797, + 2798, + 2799, + 2800, + 2801, + 2802, + 2803, + 2804, + 2805, + 2806, + 2807, + 2808, + 2809, + 2810, + 2811, + 2812, + 2813, + 2814, + 2815, + 2816, + 2817, + 2818, + 2819, + 2820, + 2821, + 2822, + 2823, + 2824, + 2825, + 2826, + 2827, + 2828, + 2829, + 2830, + 2831, + 2832, + 2833, + 2834, + 2835, + 2836, + 2837, + 2838, + 2839, + 2840, + 2841, + 2842, + 2843, + 2844, + 2845, + 2846, + 2847, + 2848, + 2849, + 2850, + 2851, + 2852, + 2853, + 2854, + 2855, + 2856, + 2857, + 2858, + 2859, + 2860, + 2861, + 2862, + 2863, + 2864, + 2865, + 2866, + 2867, + 2868, + 2869, + 2870, + 2871, + 2872, + 2873, + 2874, + 2875, + 2876, + 2877, + 2878, + 2879, + 2880, + 2881, + 2882, + 2883, + 2884, + 2885, + 2886, + 2887, + 2888, + 2889, + 2890, + 2891, + 2892, + 2893, + 2894, + 2895, + 2896, + 2897, + 2898, + 2899, + 2900, + 2901, + 2902, + 2903, + 2904, + 2905, + 2906, + 2907, + 2908, + 2909, + 2910, + 2911, + 2912, + 2913, + 2914, + 2915, + 2916, + 2917, + 2918, + 2919, + 2920, + 2921, + 2922, + 2923, + 2924, + 2925, + 2926, + 2927, + 2928, + 2929, + 2930, + 2931, + 2932, + 2933, + 2934, + 2935, + 2936, + 2937, + 2938, + 2939, + 2940, + 2941, + 2942, + 2943, + 2944, + 2945, + 2946, + 2947, + 2948, + 2949, + 2950, + 2951, + 2952, + 2953, + 2954, + 2955, + 2956, + 2957, + 2958, + 2959, + 2960, + 2961, + 2962, + 2963, + 2964, + 2965, + 2966, + 2967, + 2968, + 2969, + 2970, + 2971, + 2972, + 2973, + 2974, + 2975, + 2976, + 2977, + 2978, + 2979, + 2980, + 2981, + 2982, + 2983, + 2984, + 2985, + 2986, + 2987, + 2988, + 2989, + 2990, + 2991, + 2992, + 2993, + 2994, + 2995, + 2996, + 2997, + 2998, + 2999, + 3000, + 3001, + 3002, + 3003, + 3004, + 3005, + 3006, + 3007, + 3008, + 3009, + 3010, + 3011, + 3012, + 3013, + 3014, + 3015, + 3016, + 3017, + 3018, + 3019, + 3020, + 3021, + 3022, + 3023, + 3024, + 3025, + 3026, + 3027, + 3028, + 3029, + 3030, + 3031, + 3032, + 3033, + 3034, + 3035, + 3036, + 3037, + 3038, + 3039, + 3040, + 3041, + 3042, + 3043, + 3044, + 3045, + 3046, + 3047, + 3048, + 3049, + 3050, + 3051, + 3052, + 3053, + 3054, + 3055, + 3056, + 3057, + 3058, + 3059, + 3060, + 3061, + 3062, + 3063, + 3064, + 3065, + 3066, + 3067, + 3068, + 3069, + 3070, + 3071, + 3072, + 3073, + 3074, + 3075, + 3076, + 3077, + 3078, + 3079, + 3080, + 3081, + 3082, + 3083, + 3084, + 3085, + 3086, + 3087, + 3088, + 3089, + 3090, + 3091, + 3092, + 3093, + 3094, + 3095, + 3096, + 3097, + 3098, + 3099, + 3100, + 3101, + 3102, + 3103, + 3104, + 3105, + 3106, + 3107, + 3108, + 3109, + 3110, + 3111, + 3112, + 3113, + 3114, + 3115, + 3116, + 3117, + 3118, + 3119, + 3120, + 3121, + 3122, + 3123, + 3124, + 3125, + 3126, + 3127, + 3128, + 3129, + 3130, + 3131, + 3132, + 3133, + 3134, + 3135, + 3136, + 3137, + 3138, + 3139, + 3140, + 3141, + 3142, + 3143, + 3144, + 3145, + 3146, + 3147, + 3148, + 3149, + 3150, + 3151, + 3152, + 3153, + 3154, + 3155, + 3156, + 3157, + 3158, + 3159, + 3160, + 3161, + 3162, + 3163, + 3164, + 3165, + 3166, + 3167, + 3168, + 3169, + 3170, + 3171, + 3172, + 3173, + 3174, + 3175, + 3176, + 3177, + 3178, + 3179, + 3180, + 3181, + 3182, + 3183, + 3184, + 3185, + 3186, + 3187, + 3188, + 3189, + 3190, + 3191, + 3192, + 3193, + 3194, + 3195, + 3196, + 3197, + 3198, + 3199, + 3200, + 3201, + 3202, + 3203, + 3204, + 3205, + 3206, + 3207, + 3208, + 3209, + 3210, + 3211, + 3212, + 3213, + 3214, + 3215, + 3216, + 3217, + 3218, + 3219, + 3220, + 3221, + 3222, + 3223, + 3224, + 3225, + 3226, + 3227, + 3228, + 3229, + 3230, + 3231, + 3232, + 3233, + 3234, + 3235, + 3236, + 3237, + 3238, + 3239, + 3240, + 3241, + 3242, + 3243, + 3244, + 3245, + 3246, + 3247, + 3248, + 3249, + 3250, + 3251, + 3252, + 3253, + 3254, + 3255, + 3256, + 3257, + 3258, + 3259, + 3260, + 3261, + 3262, + 3263, + 3264, + 3265, + 3266, + 3267, + 3268, + 3269, + 3270, + 3271, + 3272, + 3273, + 3274, + 3275, + 3276, + 3277, + 3278, + 3279, + 3280, + 3281, + 3282, + 3283, + 3284, + 3285, + 3286, + 3287, + 3288, + 3289, + 3290, + 3291, + 3292, + 3293, + 3294, + 3295, + 3296, + 3297, + 3298, + 3299, + 3300, + 3301, + 3302, + 3303, + 3304, + 3305, + 3306, + 3307, + 3308, + 3309, + 3310, + 3311, + 3312, + 3313, + 3314, + 3315, + 3316, + 3317, + 3318, + 3319, + 3320, + 3321, + 3322, + 3323, + 3324, + 3325, + 3326, + 3327, + 3328, + 3329, + 3330, + 3331, + 3332, + 3333, + 3334, + 3335, + 3336, + 3337, + 3338, + 3339, + 3340, + 3341, + 3342, + 3343, + 3344, + 3345, + 3346, + 3347, + 3348, + 3349, + 3350, + 3351, + 3352, + 3353, + 3354, + 3355, + 3356, + 3357, + 3358, + 3359, + 3360, + 3361, + 3362, + 3363, + 3364, + 3365, + 3366, + 3367, + 3368, + 3369, + 3370, + 3371, + 3372, + 3373, + 3374, + 3375, + 3376, + 3377, + 3378, + 3379, + 3380, + 3381, + 3382, + 3383, + 3384, + 3385, + 3386, + 3387, + 3388, + 3389, + 3390, + 3391, + 3392, + 3393, + 3394, + 3395, + 3396, + 3397, + 3398, + 3399, + 3400, + 3401, + 3402, + 3403, + 3404, + 3405, + 3406, + 3407, + 3408, + 3409, + 3410, + 3411, + 3412, + 3413, + 3414, + 3415, + 3416, + 3417, + 3418, + 3419, + 1, + 62, + 11, + 11, + 16, + 26, + 27, + 0, + 28, + 0, + 36, + 84, + 45, + 39, + 32, + 51, + 52, + 65, + 53, + 67, + 35, + 44, + 66, + 54, + 34, + 43, + 26, + 33, + 64, + 0, + 64, + 54, + 20, + 4, + 2, + 71, + 68, + 42, + 93, + 88, + 31, + 101, + 92, + 93, + 94, + 104, + 91, + 89, + 90, + 99, + 9, + 1741, + 102, + 103, + 105, + 125, + 128, + 129, + 124, + 25, + 126, + 127, + 138, + 184, + 145, + 145, + 156, + 157, + 158, + 137, + 205, + 165, + 171, + 166, + 162, + 176, + 175, + 187, + 177, + 189, + 170, + 164, + 188, + 178, + 169, + 156, + 163, + 186, + 137, + 137, + 186, + 178, + 150, + 140, + 139, + 193, + 190, + 211, + 161, + 218, + 210, + 211, + 212, + 221, + 209, + 208, + 216, + 144, + 1743, + 219, + 220, + 222, + 240, + 243, + 244, + 239, + 155, + 241, + 242, + 435, + 260, + 254, + 274, + 280, + 269, + 424, + 300, + 290, + 291, + 292, + 293, + 294, + 299, + 310, + 298, + 297, + 296, + 295, + 295, + 290, + 304, + 309, + 303, + 490, + 492, + 318, + 317, + 261, + 257, + 512, + 516, + 530, + 332, + 533, + 423, + 350, + 307, + 357, + 308, + 308, + 365, + 349, + 347, + 358, + 359, + 360, + 364, + 353, + 352, + 361, + 365, + 357, + 351, + 350, + 355, + 356, + 362, + 366, + 354, + 363, + 393, + 394, + 282, + 337, + 281, + 289, + 391, + 334, + 390, + 286, + 332, + 266, + 394, + 395, + 307, + 303, + 440, + 451, + 453, + 427, + 431, + 432, + 434, + 433, + 435, + 435, + 429, + 41, + 47, + 436, + 40, + 45, + 45, + 46, + 436, + 452, + 453, + 446, + 437, + 460, + 461, + 264, + 327, + 329, + 525, + 278, + 268, + 322, + 547, + 546, + 428, + 562, + 733, + 557, + 575, + 581, + 570, + 724, + 601, + 591, + 592, + 593, + 594, + 595, + 600, + 611, + 599, + 598, + 597, + 596, + 596, + 591, + 605, + 610, + 604, + 780, + 619, + 782, + 618, + 563, + 802, + 806, + 820, + 633, + 823, + 723, + 651, + 608, + 609, + 609, + 666, + 650, + 648, + 659, + 660, + 661, + 665, + 654, + 653, + 662, + 666, + 658, + 652, + 651, + 656, + 657, + 663, + 667, + 655, + 664, + 694, + 695, + 583, + 638, + 582, + 590, + 692, + 635, + 691, + 587, + 633, + 567, + 695, + 696, + 608, + 604, + 658, + 745, + 738, + 747, + 727, + 729, + 730, + 732, + 731, + 733, + 733, + 728, + 168, + 734, + 167, + 171, + 171, + 746, + 734, + 747, + 735, + 628, + 630, + 815, + 579, + 569, + 623, + 837, + 836, + 207, + 198, + 856, + 854, + 194, + 198, + 860, + 893, + 862, + 897, + 863, + 883, + 879, + 858, + 857, + 853, + 860, + 861, + 887, + 859, + 888, + 889, + 857, + 870, + 861, + 873, + 888, + 886, + 884, + 910, + 882, + 881, + 915, + 879, + 883, + 880, + 879, + 912, + 924, + 938, + 909, + 883, + 885, + 945, + 200, + 197, + 201, + 910, + 911, + 910, + 914, + 947, + 915, + 915, + 1281, + 951, + 951, + 1282, + 951, + 954, + 952, + 955, + 954, + 965, + 990, + 989, + 988, + 968, + 995, + 993, + 1000, + 993, + 997, + 1002, + 998, + 1005, + 1003, + 962, + 1018, + 985, + 1015, + 970, + 1024, + 1021, + 1030, + 1027, + 1036, + 1033, + 1042, + 1039, + 1048, + 1045, + 1054, + 1051, + 1060, + 1057, + 1066, + 1063, + 1072, + 1069, + 1076, + 1075, + 1080, + 1077, + 969, + 1086, + 1083, + 1092, + 1089, + 1098, + 1095, + 1104, + 1101, + 1110, + 1107, + 1116, + 1113, + 1122, + 1119, + 1128, + 1125, + 1134, + 1131, + 1138, + 1137, + 1142, + 1139, + 972, + 1148, + 1145, + 1154, + 1151, + 1160, + 1157, + 1166, + 1163, + 1172, + 1169, + 1178, + 1175, + 1184, + 1181, + 1190, + 1187, + 1196, + 1193, + 1200, + 1199, + 1204, + 1201, + 1210, + 1207, + 1216, + 1213, + 1222, + 1219, + 1228, + 1225, + 1234, + 1231, + 1240, + 1237, + 1246, + 1243, + 1250, + 1252, + 1249, + 1258, + 1255, + 1262, + 1261, + 1268, + 950, + 953, + 954, + 1280, + 955, + 1288, + 196, + 195, + 195, + 76, + 1299, + 1301, + 77, + 72, + 1305, + 1338, + 1307, + 1308, + 1342, + 1328, + 1324, + 1303, + 1302, + 1298, + 1305, + 1306, + 1332, + 1304, + 1333, + 1334, + 1315, + 1302, + 1318, + 1306, + 1333, + 1331, + 1329, + 1355, + 1327, + 1326, + 1324, + 1363, + 1327, + 1328, + 1325, + 1382, + 1360, + 1369, + 1354, + 1328, + 1330, + 1390, + 78, + 75, + 79, + 1355, + 1356, + 1355, + 1359, + 1392, + 1360, + 1360, + 1396, + 1726, + 1397, + 1396, + 1396, + 1399, + 1400, + 1399, + 1410, + 1435, + 1434, + 1433, + 1413, + 1440, + 1438, + 1445, + 1443, + 1450, + 1448, + 1407, + 1415, + 1461, + 1430, + 1463, + 1460, + 1469, + 1466, + 1475, + 1472, + 1481, + 1478, + 1487, + 1484, + 1493, + 1490, + 1499, + 1496, + 1505, + 1502, + 1511, + 1508, + 1517, + 1514, + 1521, + 1520, + 1525, + 1522, + 1414, + 1531, + 1528, + 1537, + 1534, + 1543, + 1540, + 1549, + 1546, + 1555, + 1552, + 1561, + 1558, + 1567, + 1564, + 1573, + 1570, + 1579, + 1576, + 1583, + 1582, + 1587, + 1584, + 1417, + 1593, + 1590, + 1599, + 1596, + 1605, + 1602, + 1611, + 1608, + 1617, + 1614, + 1623, + 1620, + 1629, + 1626, + 1635, + 1632, + 1641, + 1638, + 1645, + 1644, + 1649, + 1646, + 1655, + 1652, + 1661, + 1658, + 1667, + 1664, + 1673, + 1670, + 1679, + 1676, + 1685, + 1682, + 1691, + 1688, + 1697, + 1694, + 1703, + 1700, + 1707, + 1706, + 1713, + 1395, + 1398, + 1725, + 1399, + 1733, + 74, + 73, + 73, + 1285, + 199, + 76, + 1730, + 1739, + 9, + 1740, + 10, + 144, + 1757, + 1758, + 1757, + 1759, + 1758, + 1757, + 1757, + 1759, + 1759, + 1765, + 1779, + 1769, + 1767, + 1778, + 1756, + 1746, + 1772, + 1752, + 1771, + 1770, + 1763, + 1777, + 1773, + 1766, + 1775, + 1776, + 1766, + 1777, + 1768, + 1767, + 1779, + 1764, + 1758, + 2146, + 1764, + 1784, + 1757, + 1764, + 1785, + 1765, + 1750, + 1759, + 1759, + 1750, + 1782, + 1761, + 1756, + 1748, + 1784, + 1764, + 1761, + 1753, + 1804, + 1784, + 1804, + 1781, + 1751, + 1880, + 1751, + 1784, + 1761, + 1783, + 1788, + 1786, + 1788, + 1789, + 1761, + 1774, + 1756, + 1818, + 1766, + 1751, + 1747, + 1757, + 1753, + 1748, + 1758, + 1758, + 1764, + 1759, + 1756, + 1761, + 1764, + 1751, + 1786, + 1765, + 1785, + 1813, + 1751, + 1888, + 1748, + 1889, + 1888, + 1890, + 1889, + 1888, + 1888, + 1747, + 1890, + 1750, + 1890, + 1896, + 1910, + 1898, + 1900, + 1899, + 1887, + 1903, + 1902, + 1894, + 1901, + 1908, + 1897, + 1906, + 1904, + 1909, + 1898, + 1910, + 1895, + 1889, + 1895, + 1915, + 1888, + 1895, + 1916, + 1896, + 1750, + 1890, + 1890, + 1754, + 1750, + 1913, + 1892, + 2801, + 1887, + 1748, + 1915, + 1753, + 1895, + 1892, + 1753, + 1935, + 2011, + 1915, + 1892, + 1914, + 1919, + 1917, + 1919, + 1920, + 1892, + 1887, + 1905, + 1949, + 1897, + 1751, + 1747, + 1888, + 1753, + 1748, + 1889, + 1889, + 1895, + 1890, + 1887, + 1998, + 1999, + 1892, + 1895, + 1751, + 1917, + 1896, + 1916, + 1944, + 1916, + 1917, + 2094, + 3050, + 2095, + 3069, + 2406, + 2096, + 2394, + 2097, + 2093, + 2098, + 1788, + 1754, + 1919, + 141, + 86, + 5, + 2109, + 2399, + 3056, + 2110, + 2115, + 2398, + 2208, + 2116, + 2140, + 2124, + 2122, + 2395, + 1755, + 2707, + 2132, + 2131, + 2203, + 2386, + 2141, + 2704, + 1780, + 1761, + 2486, + 2151, + 2154, + 2499, + 2153, + 2152, + 2211, + 2309, + 2495, + 2316, + 2483, + 2310, + 1789, + 1782, + 1783, + 1785, + 1785, + 1786, + 2405, + 2426, + 2409, + 2414, + 1787, + 2426, + 2410, + 2426, + 88, + 2502, + 2484, + 2493, + 2487, + 2494, + 2497, + 2504, + 2498, + 2503, + 2772, + 2864, + 2773, + 3057, + 3049, + 2776, + 2780, + 2796, + 1886, + 2781, + 2857, + 2788, + 3366, + 3044, + 3364, + 2802, + 1897, + 1908, + 1915, + 1892, + 1911, + 3155, + 2810, + 2813, + 3147, + 2811, + 2812, + 2861, + 2966, + 3154, + 2967, + 3142, + 1920, + 1913, + 1912, + 1935, + 1914, + 1916, + 1916, + 1917, + 3086, + 3065, + 3086, + 3072, + 3066, + 1918, + 3065, + 207, + 3141, + 3165, + 3146, + 3150, + 3149, + 3163, + 3157, + 3156, + 3164, + 206, + 87, + 1907, + 3418, + 3419; + } + + MeshMaterialList { + 1; + 6841; + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0; + + Material { + 1.000000;1.000000;1.000000;1.000000;; + 0.000000; + 1.000000;1.000000;1.000000;; + 0.000000;0.000000;0.000000;; + + TextureFilename { + "Tiny_skin.dds"; + } + } + } + + XSkinMeshHeader { + 2; + 4; + 35; + } + + SkinWeights { + "Bip01_R_UpperArm"; + 156; + 0, + 3449, + 3429, + 3427, + 2, + 3454, + 4, + 3453, + 7, + 15, + 68, + 3456, + 69, + 70, + 71, + 3455, + 72, + 3940, + 73, + 4110, + 4109, + 74, + 4108, + 75, + 3980, + 76, + 4113, + 3936, + 77, + 3939, + 78, + 3979, + 79, + 3981, + 1294, + 1295, + 1296, + 1297, + 1298, + 3950, + 1299, + 3937, + 1300, + 1301, + 3938, + 1302, + 3958, + 3949, + 1303, + 3948, + 1304, + 3954, + 1305, + 3951, + 3941, + 1306, + 3960, + 3952, + 1307, + 3943, + 1308, + 3944, + 1309, + 1310, + 1311, + 1312, + 1313, + 1314, + 1315, + 3957, + 1316, + 1317, + 1318, + 3959, + 1319, + 1320, + 1321, + 1322, + 1323, + 1324, + 3967, + 3947, + 1325, + 3971, + 1326, + 3966, + 1327, + 3969, + 3965, + 1328, + 3976, + 3970, + 3946, + 1329, + 3963, + 1330, + 3977, + 1331, + 3962, + 1332, + 3953, + 1333, + 3961, + 3955, + 1334, + 3956, + 1335, + 1336, + 1337, + 1338, + 3942, + 1339, + 1340, + 1341, + 1342, + 3945, + 1343, + 1344, + 1345, + 1346, + 1347, + 1348, + 1349, + 1350, + 1351, + 1352, + 1353, + 1354, + 3975, + 1357, + 1358, + 1362, + 1364, + 1365, + 1366, + 1367, + 1384, + 1385, + 1386, + 1387, + 1388, + 1389, + 1390, + 3978, + 1391, + 1730, + 4114, + 1731, + 1732, + 1733, + 4107, + 1734, + 1735, + 1736, + 1737, + 1738; + 0.605239, + 0.605239, + 0.605239, + 0.605239, + 0.208568, + 0.208568, + 0.332183, + 0.332183, + 0.490972, + 0.001349, + 0.378335, + 0.378335, + 0.505176, + 0.547675, + 0.378478, + 0.378478, + 0.520681, + 0.520681, + 0.514052, + 0.514052, + 0.514052, + 0.489167, + 0.489167, + 0.500779, + 0.500779, + 0.344750, + 0.344750, + 0.344750, + 0.444251, + 0.444251, + 0.422197, + 0.422197, + 0.459563, + 0.459563, + 1.000000, + 1.000000, + 0.523285, + 0.702523, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 0.754566, + 0.754566, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 0.999998, + 0.999998, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 0.937900, + 0.937900, + 0.843455, + 0.843455, + 1.000000, + 1.000000, + 0.692347, + 0.536598, + 0.635737, + 0.793743, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 0.562271, + 1.000000, + 0.606859, + 0.525610, + 0.525610, + 0.525610, + 0.505657, + 0.505657, + 0.499507, + 0.499507, + 0.502042, + 0.502042, + 0.502042, + 0.512201, + 0.512201, + 0.512201, + 0.512201, + 0.500000, + 0.500000, + 0.564140, + 0.564140, + 0.499982, + 0.499982, + 0.999997, + 0.999997, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 0.995135, + 0.936519, + 1.000000, + 0.999529, + 0.980016, + 0.999871, + 0.999950, + 1.000000, + 0.951632, + 0.002571, + 0.000138, + 0.003704, + 0.003704, + 0.000096, + 0.000000, + 0.000217, + 0.000002, + 0.000020, + 0.000376, + 0.001713, + 0.017345, + 0.266756, + 0.080934, + 0.226163, + 0.796931, + 1.000000, + 1.000000, + 1.000000, + 0.171247, + 0.501141, + 0.501141, + 0.569803, + 0.914754, + 0.873090, + 0.873090, + 1.000000, + 1.000000, + 0.999889, + 0.999994, + 0.979129; + -0.941743,-0.646748,0.574719,0.000000,-0.283133,-0.461979,-0.983825,0.000000,0.923060,-1.114919,0.257891,0.000000,-65.499557,30.497688,12.852692,1.000000;; + } + + SkinWeights { + "Bip01_Spine3"; + 299; + 0, + 3449, + 3429, + 3427, + 1, + 3420, + 2, + 3454, + 3, + 4, + 3453, + 5, + 4311, + 6, + 7, + 8, + 9, + 4116, + 3470, + 10, + 4118, + 12, + 13, + 15, + 16, + 3424, + 17, + 18, + 19, + 20, + 3452, + 21, + 22, + 30, + 31, + 3460, + 42, + 3457, + 43, + 3445, + 58, + 62, + 3421, + 68, + 3456, + 69, + 70, + 71, + 3455, + 72, + 3940, + 73, + 4110, + 4109, + 74, + 4108, + 75, + 3980, + 76, + 4113, + 3936, + 77, + 3939, + 78, + 3979, + 79, + 3981, + 85, + 86, + 4310, + 87, + 4428, + 88, + 4360, + 3459, + 89, + 3467, + 90, + 3468, + 91, + 3466, + 92, + 3462, + 93, + 3463, + 3458, + 94, + 3464, + 95, + 96, + 97, + 98, + 99, + 3469, + 100, + 101, + 3461, + 102, + 3472, + 103, + 3473, + 104, + 3465, + 105, + 3474, + 107, + 108, + 109, + 111, + 112, + 113, + 114, + 115, + 116, + 117, + 118, + 119, + 120, + 121, + 122, + 123, + 137, + 3509, + 3508, + 3489, + 138, + 3482, + 139, + 3514, + 140, + 3513, + 141, + 4309, + 142, + 143, + 144, + 4119, + 3527, + 146, + 147, + 148, + 149, + 150, + 3512, + 151, + 152, + 160, + 161, + 3518, + 169, + 3504, + 184, + 3483, + 190, + 3516, + 191, + 192, + 193, + 3515, + 194, + 3759, + 195, + 3935, + 3934, + 196, + 3933, + 197, + 3800, + 198, + 3760, + 3756, + 199, + 4112, + 200, + 3799, + 201, + 3801, + 206, + 4427, + 207, + 4417, + 3755, + 208, + 3525, + 209, + 3524, + 210, + 3520, + 211, + 3521, + 3517, + 212, + 3522, + 213, + 214, + 215, + 216, + 3526, + 217, + 218, + 3519, + 219, + 3529, + 220, + 3530, + 221, + 3523, + 222, + 3531, + 224, + 225, + 227, + 228, + 229, + 230, + 231, + 232, + 233, + 234, + 235, + 236, + 237, + 238, + 845, + 846, + 851, + 852, + 856, + 3757, + 943, + 946, + 1285, + 4111, + 1286, + 1287, + 1288, + 3932, + 1291, + 1293, + 1296, + 1297, + 1301, + 3938, + 1388, + 1391, + 1730, + 4114, + 1731, + 1732, + 1733, + 4107, + 1736, + 1738, + 1739, + 4115, + 1740, + 4117, + 1741, + 3471, + 1742, + 1743, + 3528, + 1744, + 1745, + 2101, + 2102, + 2103, + 2104, + 2105, + 2108, + 2109, + 4312, + 2110, + 4315, + 2111, + 2112, + 2392, + 2397, + 2398, + 4317, + 2399, + 4313, + 2400, + 2401, + 2416, + 2422, + 2423, + 3052, + 3055, + 3056, + 4314, + 3057, + 4373, + 3058, + 3059, + 3071, + 3076, + 3080, + 3081; + 0.394761, + 0.394761, + 0.394761, + 0.394761, + 1.000000, + 1.000000, + 0.791431, + 0.791431, + 0.934090, + 0.667817, + 0.667817, + 0.407500, + 0.407500, + 1.000000, + 0.509028, + 0.500334, + 0.742859, + 0.742859, + 0.742859, + 0.646150, + 0.646150, + 0.000826, + 1.000000, + 0.998651, + 1.000000, + 1.000000, + 0.002232, + 0.000057, + 0.000008, + 0.694294, + 0.694294, + 0.500000, + 0.500000, + 0.005182, + 1.000000, + 1.000000, + 0.000077, + 0.000077, + 0.000000, + 0.000000, + 0.000000, + 0.999987, + 0.999987, + 0.621665, + 0.621665, + 0.494824, + 0.452325, + 0.621522, + 0.621522, + 0.479319, + 0.479319, + 0.485948, + 0.485948, + 0.485948, + 0.510833, + 0.510833, + 0.499221, + 0.499221, + 0.655250, + 0.655250, + 0.655250, + 0.555749, + 0.555749, + 0.577803, + 0.577803, + 0.540437, + 0.540437, + 0.500000, + 0.518319, + 0.518319, + 0.330664, + 0.330664, + 0.499933, + 0.499933, + 0.499933, + 0.506729, + 0.506729, + 0.491771, + 0.491771, + 0.496988, + 0.496988, + 0.458505, + 0.458505, + 0.478085, + 0.478085, + 0.478085, + 0.509104, + 0.509104, + 0.500228, + 0.500000, + 0.500234, + 0.500000, + 0.500000, + 0.500000, + 0.098269, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 0.764280, + 1.000000, + 0.273957, + 0.495039, + 0.559469, + 0.432520, + 0.464423, + 0.334571, + 0.396879, + 0.503634, + 0.500003, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 0.388147, + 0.388147, + 0.388147, + 0.388147, + 1.000000, + 1.000000, + 0.792207, + 0.792207, + 0.667938, + 0.667938, + 0.401391, + 0.401391, + 1.000000, + 0.507531, + 0.789169, + 0.789169, + 0.789169, + 1.000000, + 0.998645, + 0.000055, + 0.000007, + 0.696843, + 0.696843, + 0.500000, + 0.500000, + 0.004977, + 1.000000, + 1.000000, + 0.000000, + 0.000000, + 0.999989, + 0.999989, + 0.622978, + 0.622978, + 0.494410, + 0.451237, + 0.619803, + 0.619803, + 0.471398, + 0.471398, + 0.488642, + 0.488642, + 0.488642, + 0.508940, + 0.508940, + 0.499498, + 0.499498, + 0.650302, + 0.650302, + 0.650302, + 0.577673, + 0.577673, + 0.575168, + 0.575168, + 0.540492, + 0.540492, + 0.329189, + 0.329189, + 0.499882, + 0.499882, + 0.499882, + 0.491653, + 0.491653, + 0.496898, + 0.496898, + 0.457891, + 0.457891, + 0.477594, + 0.477594, + 0.477594, + 0.510518, + 0.510518, + 0.500267, + 0.500000, + 0.500219, + 0.500000, + 0.500000, + 0.097802, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 0.770983, + 1.000000, + 0.494890, + 0.432088, + 0.463982, + 0.333385, + 0.395719, + 0.504955, + 0.500005, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 0.500000, + 0.500000, + 0.477163, + 0.297364, + 0.247515, + 0.247515, + 0.204713, + 0.827083, + 0.498934, + 0.498934, + 0.430994, + 0.086300, + 0.128177, + 0.128177, + 0.000124, + 0.021432, + 0.476715, + 0.297477, + 0.245434, + 0.245434, + 0.203069, + 0.828753, + 0.498859, + 0.498859, + 0.430197, + 0.085246, + 0.126910, + 0.126910, + 0.000111, + 0.020871, + 0.652828, + 0.652828, + 0.678677, + 0.678677, + 0.750800, + 0.750800, + 0.670469, + 0.786977, + 0.786977, + 0.692151, + 0.719323, + 0.510218, + 0.490223, + 0.490260, + 0.509821, + 0.001010, + 0.001002, + 0.000093, + 0.000093, + 0.000094, + 0.000094, + 0.000638, + 0.000637, + 0.000001, + 0.000017, + 0.000001, + 0.000001, + 0.000058, + 0.000058, + 0.000607, + 0.000268, + 0.002483, + 0.503803, + 0.525515, + 0.000001, + 0.000612, + 0.000059, + 0.000059, + 0.000001, + 0.000001, + 0.000018, + 0.000271, + 0.420472, + 0.002513, + 0.523967, + 0.503150; + -0.000000,-0.000002,1.278853,0.000000,1.100796,0.223046,0.000001,0.000000,-0.291970,1.440953,0.000002,0.000000,28.876726,-65.051079,-0.142296,1.000000;; + } + + SkinWeights { + "Bip01_Neck"; + 214; + 3, + 5, + 4311, + 8, + 9, + 4116, + 3470, + 10, + 4118, + 21, + 22, + 85, + 86, + 4310, + 87, + 4428, + 88, + 4360, + 3459, + 89, + 3467, + 90, + 3468, + 91, + 3466, + 92, + 3462, + 93, + 3463, + 3458, + 94, + 3464, + 95, + 96, + 97, + 98, + 99, + 3469, + 106, + 107, + 109, + 110, + 111, + 112, + 113, + 114, + 115, + 116, + 117, + 118, + 123, + 141, + 4309, + 144, + 4119, + 3527, + 151, + 152, + 206, + 4427, + 207, + 4417, + 3755, + 208, + 3525, + 209, + 3524, + 210, + 3520, + 211, + 3521, + 3517, + 212, + 3522, + 213, + 214, + 215, + 216, + 3526, + 223, + 224, + 226, + 227, + 228, + 229, + 230, + 231, + 232, + 233, + 238, + 845, + 846, + 1739, + 4115, + 1740, + 4117, + 1741, + 3471, + 1742, + 1743, + 3528, + 1744, + 1745, + 1754, + 4307, + 4249, + 1786, + 4351, + 4204, + 4183, + 1787, + 4356, + 1917, + 4409, + 4295, + 4290, + 4267, + 1918, + 4415, + 2091, + 2092, + 2093, + 4304, + 2094, + 4296, + 2095, + 4298, + 2096, + 4301, + 2097, + 4303, + 2098, + 4305, + 2099, + 2100, + 2101, + 2102, + 2103, + 2104, + 2105, + 2106, + 2107, + 2108, + 2393, + 2394, + 4302, + 2395, + 4323, + 2402, + 2403, + 2404, + 2405, + 4352, + 2406, + 4300, + 2407, + 2408, + 2409, + 4354, + 2410, + 4358, + 2411, + 2412, + 2413, + 2414, + 4355, + 2415, + 2416, + 2417, + 2418, + 2419, + 2420, + 2421, + 2422, + 2423, + 2426, + 4359, + 4357, + 4353, + 3049, + 4374, + 3050, + 4297, + 3051, + 3060, + 3061, + 3062, + 3063, + 3064, + 3065, + 4416, + 4411, + 3066, + 4414, + 3067, + 3068, + 3069, + 4299, + 3070, + 3071, + 3072, + 4413, + 3073, + 3074, + 3075, + 3076, + 3077, + 3078, + 3079, + 3080, + 3081, + 3086, + 4412, + 4410; + 0.065910, + 0.592500, + 0.592500, + 0.499666, + 0.257141, + 0.257141, + 0.257141, + 0.353850, + 0.353850, + 0.500000, + 0.500000, + 0.500000, + 0.481681, + 0.481681, + 0.669336, + 0.669336, + 0.500067, + 0.500067, + 0.500067, + 0.493271, + 0.493271, + 0.508229, + 0.508229, + 0.503012, + 0.503012, + 0.541495, + 0.541495, + 0.521915, + 0.521915, + 0.521915, + 0.490896, + 0.490896, + 0.499772, + 0.500000, + 0.499766, + 0.500000, + 0.500000, + 0.500000, + 1.000000, + 0.235720, + 0.726043, + 1.000000, + 0.504961, + 0.440531, + 0.567480, + 0.535577, + 0.665429, + 0.603121, + 0.496366, + 0.499997, + 0.000000, + 0.598609, + 0.598609, + 0.210831, + 0.210831, + 0.210831, + 0.500000, + 0.500000, + 0.670811, + 0.670811, + 0.500118, + 0.500118, + 0.500118, + 0.508347, + 0.508347, + 0.503102, + 0.503102, + 0.542109, + 0.542109, + 0.522406, + 0.522406, + 0.522406, + 0.489482, + 0.489482, + 0.499733, + 0.500000, + 0.499781, + 0.500000, + 0.500000, + 1.000000, + 0.229017, + 1.000000, + 0.505110, + 0.567912, + 0.536018, + 0.666615, + 0.604281, + 0.495045, + 0.499995, + 0.000000, + 0.500000, + 0.500000, + 0.347172, + 0.347172, + 0.321323, + 0.321323, + 0.249200, + 0.249200, + 0.329531, + 0.213023, + 0.213023, + 0.307849, + 0.280677, + 0.029899, + 0.029899, + 0.029899, + 0.000563, + 0.000563, + 0.000563, + 0.000563, + 0.447159, + 0.447159, + 0.000741, + 0.000741, + 0.000741, + 0.000741, + 0.000741, + 0.452299, + 0.452299, + 0.000256, + 0.000265, + 0.112240, + 0.112240, + 0.502882, + 0.502882, + 0.660151, + 0.660151, + 0.660342, + 0.660342, + 0.501958, + 0.501958, + 0.110146, + 0.110146, + 0.306701, + 0.307363, + 0.489782, + 0.509777, + 0.509740, + 0.490179, + 0.998990, + 0.966439, + 0.966459, + 0.998998, + 0.006305, + 0.286696, + 0.286696, + 0.102187, + 0.102187, + 0.432449, + 0.484491, + 0.144315, + 0.014990, + 0.014990, + 0.501776, + 0.501776, + 0.689126, + 0.616328, + 0.498337, + 0.498337, + 0.292995, + 0.292995, + 0.319511, + 0.489703, + 1.000000, + 0.970473, + 0.970473, + 1.000000, + 0.997517, + 0.986590, + 1.000000, + 0.043051, + 0.348847, + 0.069256, + 0.496197, + 0.474485, + 0.000614, + 0.000614, + 0.000614, + 0.000614, + 0.111179, + 0.111179, + 0.295001, + 0.295001, + 0.007394, + 0.437806, + 0.017223, + 0.151879, + 0.486630, + 0.330150, + 0.303562, + 0.303562, + 0.303562, + 0.498825, + 0.498825, + 0.615047, + 0.687810, + 0.501685, + 0.501685, + 0.491269, + 0.579528, + 0.970098, + 0.970098, + 1.000000, + 1.000000, + 0.986508, + 0.997487, + 0.046055, + 0.071046, + 0.352668, + 0.476033, + 0.496850, + 0.000875, + 0.000875, + 0.000875; + 0.000001,-0.000002,1.278853,0.000000,1.061682,-0.366513,-0.000001,0.000000,0.479769,1.389753,0.000002,0.000000,-44.801331,-49.085537,-0.142252,1.000000;; + } + + SkinWeights { + "Bip01_Spine2"; + 138; + 11, + 3423, + 3422, + 12, + 14, + 17, + 18, + 19, + 23, + 24, + 25, + 3479, + 26, + 3446, + 3425, + 27, + 3426, + 28, + 3428, + 29, + 30, + 38, + 39, + 3433, + 42, + 3457, + 43, + 3445, + 44, + 3441, + 48, + 49, + 51, + 3435, + 52, + 3436, + 53, + 3438, + 54, + 3451, + 3443, + 58, + 59, + 60, + 61, + 62, + 3421, + 63, + 66, + 3442, + 67, + 3439, + 80, + 81, + 82, + 83, + 100, + 125, + 3475, + 126, + 3480, + 127, + 3481, + 128, + 3476, + 130, + 132, + 133, + 134, + 135, + 145, + 3485, + 3484, + 148, + 149, + 153, + 154, + 155, + 3536, + 156, + 3505, + 3486, + 157, + 3487, + 158, + 3488, + 159, + 160, + 166, + 3493, + 169, + 3504, + 170, + 3500, + 172, + 173, + 175, + 3496, + 176, + 3495, + 177, + 3498, + 178, + 3511, + 3503, + 181, + 182, + 183, + 184, + 3483, + 185, + 188, + 3502, + 189, + 3499, + 202, + 203, + 204, + 217, + 240, + 3532, + 241, + 3537, + 242, + 3538, + 243, + 3533, + 245, + 247, + 248, + 249, + 250, + 1292, + 1737, + 3418, + 4430, + 3419, + 4431; + 1.000000, + 1.000000, + 1.000000, + 0.999173, + 0.999963, + 0.997768, + 0.999943, + 0.999992, + 1.000000, + 0.999958, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 0.994818, + 0.119980, + 0.012547, + 0.012547, + 0.999923, + 0.999923, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 0.026286, + 0.000075, + 0.992608, + 0.992608, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 0.000013, + 0.000013, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 0.025573, + 0.009055, + 0.013395, + 0.009298, + 0.901731, + 0.682231, + 0.682231, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 0.001628, + 0.001628, + 1.000000, + 0.574870, + 1.000000, + 1.000000, + 0.000066, + 1.000000, + 1.000000, + 1.000000, + 0.999945, + 0.999993, + 1.000000, + 0.999959, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 0.995023, + 0.012193, + 0.012193, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 0.025939, + 0.000070, + 0.992952, + 0.992952, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 0.000011, + 0.000011, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 0.009004, + 0.013264, + 0.009112, + 0.902198, + 0.683732, + 0.683732, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 0.001536, + 0.001536, + 1.000000, + 0.575759, + 1.000000, + 1.000000, + 0.000058, + 0.000008, + 0.000006, + 1.000000, + 1.000000, + 1.000000, + 1.000000; + -0.000000,-0.000002,1.278853,0.000000,1.106257,0.194155,0.000001,0.000000,-0.254150,1.448102,0.000002,0.000000,55.345093,-65.818558,-0.142298,1.000000;; + } + + SkinWeights { + "Bip01_Spine1"; + 135; + 14, + 24, + 32, + 3434, + 33, + 3447, + 34, + 3444, + 35, + 3440, + 36, + 3430, + 37, + 38, + 39, + 3433, + 40, + 3630, + 41, + 3627, + 45, + 3632, + 3631, + 3432, + 46, + 3633, + 47, + 3628, + 48, + 49, + 50, + 51, + 3435, + 55, + 56, + 57, + 64, + 3450, + 3448, + 65, + 3437, + 80, + 81, + 82, + 83, + 84, + 3431, + 124, + 3478, + 125, + 3475, + 128, + 3476, + 129, + 3477, + 131, + 132, + 135, + 136, + 154, + 162, + 3494, + 163, + 3506, + 164, + 3501, + 165, + 3491, + 166, + 3493, + 167, + 3740, + 168, + 3738, + 171, + 3742, + 3741, + 3492, + 172, + 173, + 174, + 175, + 3496, + 179, + 180, + 186, + 3510, + 3507, + 187, + 3497, + 202, + 203, + 204, + 205, + 3490, + 239, + 3535, + 240, + 3532, + 243, + 3533, + 244, + 3534, + 246, + 247, + 250, + 251, + 428, + 3650, + 436, + 3634, + 3629, + 438, + 439, + 440, + 3616, + 441, + 442, + 444, + 452, + 3635, + 454, + 456, + 734, + 3744, + 3739, + 736, + 737, + 738, + 3728, + 746, + 3743, + 748, + 847, + 848; + 0.000037, + 0.000042, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 0.999541, + 0.880020, + 0.987453, + 0.987453, + 0.355829, + 0.355829, + 0.539595, + 0.539595, + 0.478610, + 0.478610, + 0.478610, + 0.478610, + 0.193697, + 0.193697, + 0.504065, + 0.504065, + 0.973714, + 0.999925, + 1.000000, + 0.007392, + 0.007392, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 0.974427, + 0.990945, + 0.986605, + 0.990703, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 0.317769, + 0.317769, + 0.998372, + 0.998372, + 1.000000, + 1.000000, + 1.000000, + 0.425130, + 0.999934, + 1.000000, + 0.000041, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 0.987807, + 0.987807, + 0.355636, + 0.355636, + 0.539137, + 0.539137, + 0.495096, + 0.495096, + 0.495096, + 0.495096, + 0.974061, + 0.999930, + 1.000000, + 0.007048, + 0.007048, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 0.990996, + 0.986736, + 0.990888, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 0.316268, + 0.316268, + 0.998464, + 0.998464, + 1.000000, + 1.000000, + 1.000000, + 0.424241, + 0.999942, + 1.000000, + 0.137283, + 0.137283, + 0.274429, + 0.274429, + 0.274429, + 0.292184, + 0.556285, + 0.480198, + 0.480198, + 0.108993, + 0.506586, + 0.129106, + 0.205417, + 0.205417, + 0.087526, + 0.173935, + 0.274599, + 0.274599, + 0.274599, + 0.292740, + 0.555983, + 0.480227, + 0.480227, + 0.205575, + 0.205575, + 0.174090, + 0.999988, + 0.999991; + -0.000000,-0.000002,1.278853,0.000000,1.106257,0.194155,0.000001,0.000000,-0.254150,1.448102,0.000002,0.000000,83.527077,-65.841003,-0.142298,1.000000;; + } + + SkinWeights { + "Bip01_R_Clavicle"; + 2; + 20, + 3452; + 0.305706, + 0.305706; + -1.253361,-0.000002,0.254069,0.000000,-0.218659,-0.223923,-1.078679,0.000000,0.058235,-1.440720,0.287274,0.000000,-7.853105,62.204407,2.554618,1.000000;; + } + + SkinWeights { + "Bip01_Spine"; + 196; + 37, + 40, + 3630, + 41, + 3627, + 45, + 3632, + 3631, + 3432, + 46, + 3633, + 47, + 3628, + 167, + 3740, + 168, + 3738, + 171, + 3742, + 3741, + 3492, + 252, + 253, + 256, + 257, + 3568, + 258, + 259, + 260, + 3540, + 263, + 264, + 3641, + 281, + 3604, + 289, + 3605, + 397, + 400, + 408, + 417, + 421, + 427, + 3619, + 428, + 3650, + 429, + 3626, + 430, + 431, + 3620, + 432, + 3621, + 433, + 3623, + 434, + 3622, + 435, + 3625, + 3624, + 3539, + 436, + 3634, + 3629, + 437, + 3638, + 438, + 439, + 440, + 3616, + 441, + 442, + 443, + 444, + 445, + 446, + 3637, + 447, + 448, + 449, + 450, + 451, + 3617, + 452, + 3635, + 453, + 3636, + 3618, + 454, + 455, + 456, + 457, + 458, + 459, + 460, + 3639, + 461, + 3640, + 462, + 463, + 464, + 465, + 466, + 467, + 468, + 469, + 470, + 471, + 473, + 474, + 481, + 482, + 483, + 484, + 548, + 551, + 554, + 555, + 556, + 559, + 560, + 561, + 562, + 3651, + 565, + 582, + 3714, + 590, + 3715, + 698, + 701, + 709, + 718, + 727, + 3730, + 728, + 3737, + 729, + 3731, + 730, + 3732, + 731, + 3734, + 732, + 3733, + 733, + 3736, + 3735, + 3652, + 734, + 3744, + 3739, + 735, + 3746, + 736, + 737, + 738, + 3728, + 739, + 740, + 741, + 742, + 743, + 744, + 745, + 3727, + 746, + 3743, + 747, + 3745, + 3729, + 748, + 749, + 750, + 751, + 752, + 753, + 754, + 755, + 756, + 757, + 758, + 759, + 760, + 761, + 763, + 764, + 771, + 772, + 773, + 774, + 838, + 841, + 844, + 847, + 848; + 0.000459, + 0.644171, + 0.644171, + 0.460405, + 0.460405, + 0.521390, + 0.521390, + 0.521390, + 0.521390, + 0.806303, + 0.806303, + 0.495935, + 0.495935, + 0.644364, + 0.644364, + 0.460863, + 0.460863, + 0.504904, + 0.504904, + 0.504904, + 0.504904, + 0.490317, + 1.000000, + 0.500000, + 1.000000, + 1.000000, + 1.000000, + 0.452523, + 1.000000, + 1.000000, + 1.000000, + 0.500000, + 0.500000, + 0.491192, + 0.491192, + 0.000010, + 0.000010, + 0.480348, + 0.000000, + 0.000731, + 0.000216, + 0.500000, + 1.000000, + 1.000000, + 0.862717, + 0.862717, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 0.725571, + 0.725571, + 0.725571, + 1.000000, + 1.000000, + 0.707816, + 0.443715, + 0.519802, + 0.519802, + 0.891007, + 0.493414, + 1.000000, + 0.870894, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 0.794583, + 0.794583, + 1.000000, + 1.000000, + 1.000000, + 0.912474, + 1.000000, + 0.826065, + 1.000000, + 1.000000, + 0.500000, + 1.000000, + 1.000000, + 0.500000, + 0.500000, + 1.000000, + 0.500000, + 1.000000, + 0.714864, + 0.500015, + 0.495456, + 0.537862, + 1.000000, + 0.362112, + 0.003282, + 1.000000, + 0.335473, + 1.000000, + 1.000000, + 0.500000, + 1.000000, + 0.061459, + 0.406936, + 0.725066, + 1.000000, + 1.000000, + 0.500000, + 1.000000, + 0.452941, + 1.000000, + 1.000000, + 1.000000, + 0.491389, + 0.491389, + 0.000010, + 0.000010, + 0.480816, + 0.000000, + 0.000763, + 0.000228, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 0.725401, + 0.725401, + 0.725401, + 1.000000, + 1.000000, + 0.707260, + 0.444017, + 0.519773, + 0.519773, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 0.794425, + 0.794425, + 1.000000, + 1.000000, + 1.000000, + 0.825910, + 1.000000, + 1.000000, + 0.500000, + 1.000000, + 0.500000, + 1.000000, + 0.716189, + 0.500014, + 0.495465, + 0.537762, + 1.000000, + 0.370655, + 0.003429, + 1.000000, + 0.336846, + 1.000000, + 1.000000, + 0.500000, + 1.000000, + 0.062153, + 0.407168, + 1.000000, + 0.000012, + 0.000009; + 0.000000,-0.000002,1.278853,0.000000,1.123165,-0.000895,-0.000000,0.000000,0.001171,1.470235,0.000002,0.000000,99.003029,-79.367149,-0.142336,1.000000;; + } + + SkinWeights { + "Bip01_L_UpperArm"; + 157; + 137, + 3509, + 3508, + 3489, + 139, + 3514, + 140, + 3513, + 143, + 147, + 190, + 3516, + 191, + 192, + 193, + 3515, + 194, + 3759, + 195, + 3935, + 3934, + 196, + 3933, + 197, + 3800, + 198, + 3760, + 3756, + 199, + 4112, + 200, + 3799, + 201, + 3801, + 849, + 850, + 851, + 852, + 853, + 3770, + 854, + 3758, + 855, + 856, + 3757, + 857, + 3777, + 3769, + 858, + 3768, + 859, + 3774, + 860, + 3771, + 3761, + 861, + 3779, + 3772, + 862, + 3763, + 863, + 3765, + 864, + 865, + 866, + 867, + 868, + 869, + 870, + 3778, + 871, + 872, + 873, + 3780, + 874, + 875, + 876, + 877, + 878, + 879, + 3791, + 3788, + 3767, + 880, + 3790, + 881, + 3786, + 882, + 3785, + 883, + 3796, + 3789, + 3766, + 884, + 3783, + 885, + 3797, + 886, + 3782, + 887, + 3773, + 888, + 3781, + 3775, + 889, + 3776, + 890, + 891, + 892, + 893, + 3762, + 894, + 895, + 896, + 897, + 3764, + 898, + 899, + 900, + 901, + 902, + 903, + 904, + 905, + 906, + 907, + 908, + 909, + 3795, + 912, + 3792, + 913, + 917, + 919, + 920, + 921, + 922, + 939, + 940, + 941, + 942, + 943, + 944, + 945, + 3798, + 946, + 1285, + 4111, + 1286, + 1287, + 1288, + 3932, + 1289, + 1290, + 1291, + 1292, + 1293; + 0.611853, + 0.611853, + 0.611853, + 0.611853, + 0.207793, + 0.207793, + 0.332061, + 0.332061, + 0.492469, + 0.001355, + 0.377022, + 0.377022, + 0.505590, + 0.548763, + 0.380197, + 0.380197, + 0.528602, + 0.528602, + 0.511358, + 0.511358, + 0.511358, + 0.491060, + 0.491060, + 0.500502, + 0.500502, + 0.349698, + 0.349698, + 0.349698, + 0.422326, + 0.422326, + 0.424832, + 0.424832, + 0.459508, + 0.459508, + 1.000000, + 1.000000, + 0.522837, + 0.702636, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 0.752485, + 0.752485, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 0.999998, + 0.999998, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 0.940238, + 0.940238, + 0.843017, + 0.843017, + 1.000000, + 1.000000, + 0.692400, + 0.538017, + 0.636978, + 0.792629, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 0.562516, + 1.000000, + 0.609501, + 0.526981, + 0.526981, + 0.526981, + 0.526981, + 0.506875, + 0.506875, + 0.499506, + 0.499506, + 0.502402, + 0.502402, + 0.512438, + 0.512438, + 0.512438, + 0.512438, + 0.500000, + 0.500000, + 0.564264, + 0.564264, + 0.499990, + 0.499990, + 0.999998, + 0.999998, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 0.995240, + 0.937903, + 1.000000, + 0.999588, + 0.981116, + 0.999872, + 0.999950, + 1.000000, + 0.953465, + 0.002703, + 0.000144, + 0.003856, + 0.003856, + 0.000096, + 0.000096, + 0.000000, + 0.000218, + 0.000002, + 0.000021, + 0.000402, + 0.001797, + 0.017999, + 0.269651, + 0.082041, + 0.229561, + 0.795287, + 1.000000, + 1.000000, + 1.000000, + 0.172917, + 0.501066, + 0.501066, + 0.569005, + 0.913700, + 0.871823, + 0.871823, + 1.000000, + 1.000000, + 0.999876, + 0.999992, + 0.978568; + 0.941746,0.646745,0.574718,0.000000,-0.283133,-0.461979,0.983825,0.000000,0.923057,-1.114921,-0.257893,0.000000,-65.708862,30.353960,-12.980427,1.000000;; + } + + SkinWeights { + "Bip01_L_Clavicle"; + 2; + 150, + 3512; + 0.303157, + 0.303157; + 1.253361,-0.000002,0.254069,0.000000,-0.218659,-0.223923,1.078679,0.000000,0.058231,-1.440720,-0.287275,0.000000,-8.131670,62.204407,-2.611076,1.000000;; + } + + SkinWeights { + "Bip01_Pelvis"; + 33; + 252, + 254, + 3541, + 256, + 259, + 264, + 3641, + 421, + 459, + 461, + 3640, + 463, + 465, + 466, + 467, + 468, + 474, + 483, + 554, + 557, + 3653, + 559, + 561, + 751, + 753, + 755, + 756, + 757, + 758, + 764, + 773, + 1805, + 1936; + 0.509683, + 0.606020, + 0.606020, + 0.500000, + 0.547477, + 0.500000, + 0.500000, + 0.500000, + 0.500000, + 0.500000, + 0.500000, + 0.500000, + 0.285136, + 0.499985, + 0.504544, + 0.462138, + 0.664527, + 0.500000, + 0.274934, + 0.605750, + 0.605750, + 0.500000, + 0.547059, + 0.500000, + 0.500000, + 0.283811, + 0.499986, + 0.504535, + 0.462238, + 0.663154, + 0.500000, + 1.000000, + 1.000000; + -0.000002,0.000004,1.278853,0.000000,1.123165,-0.000000,0.000002,0.000000,0.000000,1.470235,-0.000004,0.000000,126.489456,-70.579353,-0.141854,1.000000;; + } + + SkinWeights { + "Bip01_R_Thigh"; + 144; + 254, + 3541, + 255, + 261, + 3567, + 262, + 265, + 266, + 3611, + 267, + 268, + 3646, + 269, + 3544, + 270, + 273, + 274, + 3542, + 275, + 278, + 3645, + 279, + 280, + 3543, + 281, + 3604, + 282, + 3602, + 283, + 284, + 285, + 286, + 3609, + 287, + 288, + 289, + 3605, + 311, + 313, + 322, + 3647, + 323, + 324, + 332, + 3610, + 3572, + 333, + 334, + 3607, + 335, + 336, + 337, + 3603, + 338, + 339, + 340, + 341, + 342, + 343, + 344, + 345, + 386, + 387, + 388, + 389, + 390, + 3608, + 391, + 3606, + 392, + 393, + 3600, + 394, + 3612, + 3601, + 395, + 3613, + 396, + 397, + 398, + 399, + 400, + 401, + 402, + 403, + 404, + 405, + 406, + 407, + 408, + 409, + 410, + 411, + 412, + 413, + 414, + 415, + 416, + 417, + 418, + 419, + 420, + 470, + 471, + 472, + 475, + 476, + 477, + 478, + 479, + 480, + 517, + 518, + 524, + 525, + 3644, + 533, + 3573, + 534, + 535, + 536, + 537, + 538, + 539, + 540, + 541, + 542, + 543, + 544, + 546, + 3649, + 547, + 3648, + 548, + 549, + 550, + 551, + 552, + 553, + 563, + 3679, + 581, + 3655, + 839; + 0.393980, + 0.393980, + 1.000000, + 0.796821, + 0.796821, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 0.973372, + 0.426944, + 0.426944, + 1.000000, + 1.000000, + 0.544990, + 0.984533, + 0.999195, + 0.999195, + 0.743688, + 0.445745, + 0.445745, + 1.000000, + 0.984714, + 0.984714, + 0.508808, + 0.508808, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 0.999990, + 0.999990, + 1.000000, + 1.000000, + 0.000009, + 0.000009, + 0.000489, + 0.002645, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 0.000320, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 0.908716, + 0.954129, + 0.999907, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 0.519652, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 0.999269, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 0.999784, + 1.000000, + 1.000000, + 1.000000, + 0.637888, + 0.996718, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 0.000011, + 0.000008, + 0.000000, + 0.000000, + 0.000000, + 0.798798, + 0.798798, + 0.883879, + 0.998063, + 0.778724, + 0.679390, + 0.492835, + 0.737200, + 0.477944, + 0.442104, + 0.471318, + 1.000000, + 0.988985, + 0.691131, + 0.691131, + 0.977434, + 0.977434, + 0.938541, + 0.887283, + 1.000000, + 0.593064, + 1.000000, + 0.999984, + 0.204819, + 0.204819, + 0.015759, + 0.015759, + 0.114201; + -0.122195,-0.009615,-1.272965,0.000000,-1.117778,0.024505,0.107113,0.000000,0.030875,1.469844,-0.014066,0.000000,-130.245026,-68.027489,-17.265657,1.000000;; + } + + SkinWeights { + "Bip01_L_Thigh"; + 144; + 261, + 3567, + 280, + 3543, + 549, + 557, + 3653, + 558, + 563, + 3679, + 564, + 566, + 567, + 3721, + 568, + 569, + 3751, + 570, + 3656, + 571, + 574, + 575, + 3654, + 576, + 579, + 3750, + 580, + 581, + 3655, + 582, + 3714, + 583, + 3712, + 584, + 585, + 586, + 587, + 3719, + 588, + 589, + 590, + 3715, + 612, + 614, + 623, + 3752, + 624, + 625, + 633, + 3720, + 3683, + 634, + 635, + 3717, + 636, + 637, + 638, + 3713, + 639, + 640, + 641, + 642, + 643, + 644, + 645, + 646, + 687, + 688, + 689, + 690, + 691, + 3718, + 692, + 3716, + 693, + 694, + 3710, + 695, + 3722, + 3711, + 696, + 3723, + 697, + 698, + 699, + 700, + 701, + 702, + 703, + 704, + 705, + 706, + 707, + 708, + 709, + 710, + 711, + 712, + 713, + 714, + 715, + 716, + 717, + 718, + 719, + 720, + 721, + 760, + 761, + 762, + 765, + 766, + 767, + 768, + 769, + 770, + 807, + 808, + 814, + 815, + 3749, + 823, + 3684, + 824, + 825, + 826, + 827, + 828, + 829, + 830, + 831, + 832, + 833, + 834, + 836, + 3754, + 837, + 3753, + 838, + 839, + 840, + 841, + 842, + 843; + 0.203179, + 0.203179, + 0.015286, + 0.015286, + 0.112717, + 0.394250, + 0.394250, + 1.000000, + 0.795181, + 0.795181, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 0.973936, + 0.428996, + 0.428996, + 1.000000, + 1.000000, + 0.544972, + 0.984486, + 0.999176, + 0.999176, + 0.742419, + 0.445910, + 0.445910, + 1.000000, + 0.984241, + 0.984241, + 0.508611, + 0.508611, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 0.999990, + 0.999990, + 1.000000, + 1.000000, + 0.000009, + 0.000009, + 0.000473, + 0.002664, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 0.000318, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 0.908719, + 0.953856, + 0.999909, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 0.519184, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 0.999237, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 0.999772, + 1.000000, + 1.000000, + 1.000000, + 0.629345, + 0.996571, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 0.000011, + 0.000008, + 0.000000, + 0.000000, + 0.000000, + 0.800783, + 0.800783, + 0.885426, + 0.998182, + 0.778669, + 0.680971, + 0.493117, + 0.738892, + 0.478082, + 0.442423, + 0.471379, + 1.000000, + 0.989147, + 0.690110, + 0.690110, + 0.978029, + 0.978029, + 0.937847, + 0.885799, + 1.000000, + 0.592832, + 1.000000, + 0.999985; + 0.122195,0.009619,-1.272965,0.000000,-1.117778,0.024505,-0.107113,0.000000,0.030875,1.469844,0.014070,0.000000,-130.272186,-68.029633,17.548590,1.000000;; + } + + SkinWeights { + "Bip01_R_Calf"; + 195; + 267, + 268, + 3646, + 270, + 271, + 272, + 273, + 274, + 3542, + 275, + 276, + 277, + 278, + 3645, + 287, + 293, + 3550, + 298, + 3554, + 299, + 3552, + 303, + 3615, + 3562, + 307, + 3614, + 3576, + 309, + 3561, + 310, + 3553, + 312, + 314, + 315, + 316, + 317, + 3566, + 318, + 3565, + 319, + 320, + 321, + 322, + 3647, + 323, + 324, + 325, + 326, + 327, + 3642, + 328, + 329, + 3643, + 330, + 331, + 334, + 3607, + 336, + 343, + 344, + 345, + 346, + 347, + 3582, + 348, + 349, + 3581, + 350, + 3593, + 3575, + 351, + 3592, + 352, + 3588, + 353, + 3587, + 354, + 3598, + 355, + 3594, + 356, + 3595, + 357, + 3591, + 3577, + 358, + 3583, + 359, + 3584, + 360, + 3585, + 361, + 3589, + 362, + 3596, + 363, + 3599, + 364, + 3586, + 365, + 3590, + 3580, + 366, + 3597, + 368, + 369, + 370, + 371, + 372, + 373, + 374, + 375, + 376, + 377, + 378, + 379, + 380, + 381, + 382, + 383, + 384, + 385, + 425, + 485, + 486, + 487, + 488, + 489, + 490, + 3563, + 491, + 492, + 3564, + 493, + 494, + 495, + 496, + 497, + 498, + 499, + 500, + 501, + 502, + 503, + 504, + 505, + 506, + 507, + 508, + 509, + 510, + 511, + 512, + 3569, + 513, + 514, + 515, + 516, + 3570, + 517, + 518, + 519, + 520, + 521, + 522, + 523, + 524, + 525, + 3644, + 526, + 527, + 528, + 529, + 530, + 3571, + 531, + 532, + 533, + 3573, + 534, + 535, + 536, + 537, + 538, + 539, + 540, + 541, + 542, + 544, + 545, + 546, + 3649, + 547, + 3648, + 553; + 0.026628, + 0.573056, + 0.573056, + 0.455011, + 0.248355, + 0.607645, + 0.015467, + 0.000805, + 0.000805, + 0.256312, + 0.990209, + 0.999682, + 0.554255, + 0.554255, + 0.000000, + 0.000163, + 0.000163, + 0.006766, + 0.006766, + 0.000001, + 0.000001, + 0.274225, + 0.274225, + 0.274225, + 0.472155, + 0.472155, + 0.472155, + 0.000165, + 0.000165, + 0.003872, + 0.003872, + 1.000000, + 0.358415, + 0.498074, + 0.206102, + 0.997888, + 0.997888, + 0.519331, + 0.519331, + 1.000000, + 0.999600, + 1.000000, + 0.999990, + 0.999990, + 0.999511, + 0.997355, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 0.000000, + 0.000000, + 0.999680, + 0.091284, + 0.045871, + 0.000094, + 0.081106, + 0.000049, + 0.000049, + 0.472477, + 0.002229, + 0.002229, + 0.006004, + 0.006004, + 0.006004, + 0.062354, + 0.062354, + 0.261482, + 0.261482, + 0.447819, + 0.447819, + 0.390951, + 0.390951, + 0.607455, + 0.607455, + 0.319347, + 0.319347, + 0.002868, + 0.002868, + 0.002868, + 0.054570, + 0.054570, + 0.134541, + 0.134541, + 0.093624, + 0.093624, + 0.539311, + 0.539311, + 0.191663, + 0.191663, + 0.179730, + 0.179730, + 0.056340, + 0.056340, + 0.731088, + 0.731088, + 0.731088, + 0.319088, + 0.319088, + 0.000359, + 0.003064, + 0.049797, + 0.236320, + 0.425663, + 0.352796, + 0.823837, + 0.413038, + 0.000386, + 0.030880, + 0.090852, + 0.059474, + 0.715907, + 0.138563, + 0.128868, + 0.029103, + 0.898838, + 0.279490, + 0.056695, + 0.028800, + 0.011590, + 1.000000, + 1.000000, + 0.465069, + 0.852364, + 0.852364, + 0.999499, + 0.505223, + 0.505223, + 0.499388, + 0.444644, + 0.999998, + 0.999999, + 0.999981, + 0.091767, + 0.242068, + 0.959793, + 0.397987, + 0.340201, + 0.504990, + 0.489005, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 0.998151, + 1.000000, + 1.000000, + 0.539095, + 0.966305, + 1.000000, + 0.999994, + 0.999994, + 0.999989, + 0.999992, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 0.201202, + 0.201202, + 0.116121, + 0.001937, + 0.221276, + 0.320610, + 0.507165, + 0.262800, + 0.522056, + 0.557896, + 0.528682, + 0.011015, + 1.000000, + 0.308869, + 0.308869, + 0.022566, + 0.022566, + 0.000016; + -0.120906,-0.020142,-1.272965,0.000000,-1.115712,-0.072214,0.107113,0.000000,-0.096302,1.467010,-0.014066,0.000000,-242.661957,-89.338974,-17.265659,1.000000;; + } + + SkinWeights { + "Bip01_R_Foot"; + 153; + 271, + 272, + 276, + 277, + 290, + 3559, + 3547, + 291, + 3548, + 292, + 3549, + 293, + 3550, + 294, + 3551, + 295, + 3558, + 3557, + 296, + 3556, + 297, + 3555, + 298, + 3554, + 299, + 3552, + 300, + 3546, + 301, + 302, + 303, + 3615, + 3562, + 304, + 3560, + 305, + 306, + 307, + 3614, + 3576, + 308, + 3579, + 3578, + 309, + 3561, + 310, + 3553, + 314, + 315, + 316, + 317, + 3566, + 318, + 3565, + 319, + 320, + 321, + 346, + 347, + 3582, + 348, + 349, + 3581, + 350, + 3593, + 3575, + 351, + 3592, + 352, + 3588, + 353, + 3587, + 354, + 3598, + 355, + 3594, + 356, + 3595, + 357, + 3591, + 3577, + 358, + 3583, + 359, + 3584, + 360, + 3585, + 361, + 3589, + 362, + 3596, + 363, + 3599, + 364, + 3586, + 365, + 3590, + 3580, + 366, + 3597, + 367, + 368, + 369, + 370, + 371, + 372, + 373, + 374, + 375, + 376, + 377, + 378, + 379, + 380, + 381, + 382, + 383, + 384, + 385, + 422, + 423, + 3574, + 424, + 3545, + 425, + 426, + 485, + 486, + 487, + 488, + 489, + 490, + 3563, + 491, + 492, + 3564, + 493, + 494, + 495, + 496, + 497, + 498, + 499, + 500, + 501, + 502, + 503, + 504, + 511, + 513, + 514, + 516, + 3570; + 0.751645, + 0.392355, + 0.009791, + 0.000318, + 0.000001, + 0.000001, + 0.000001, + 0.057440, + 0.057440, + 1.000000, + 1.000000, + 0.999837, + 0.999837, + 1.000000, + 1.000000, + 0.000037, + 0.000037, + 0.000037, + 0.450821, + 0.450821, + 1.000000, + 1.000000, + 0.993234, + 0.993234, + 0.999999, + 0.999999, + 0.000045, + 0.000045, + 0.480823, + 0.999943, + 0.725775, + 0.725775, + 0.725775, + 0.000432, + 0.000432, + 0.558857, + 1.000000, + 0.527845, + 0.527845, + 0.527845, + 1.000000, + 1.000000, + 1.000000, + 0.999835, + 0.999835, + 0.996128, + 0.996128, + 0.641585, + 0.501926, + 0.793898, + 0.002112, + 0.002112, + 0.480669, + 0.480669, + 0.000000, + 0.000400, + 0.000000, + 0.918894, + 0.999951, + 0.999951, + 0.527523, + 0.997771, + 0.997771, + 0.993996, + 0.993996, + 0.993996, + 0.937646, + 0.937646, + 0.738518, + 0.738518, + 0.552181, + 0.552181, + 0.609049, + 0.609049, + 0.392545, + 0.392545, + 0.680653, + 0.680653, + 0.997131, + 0.997131, + 0.997131, + 0.945430, + 0.945430, + 0.865459, + 0.865459, + 0.906376, + 0.906376, + 0.460689, + 0.460689, + 0.808337, + 0.808337, + 0.820270, + 0.820270, + 0.943660, + 0.943660, + 0.268912, + 0.268912, + 0.268912, + 0.680912, + 0.680912, + 1.000000, + 0.999641, + 0.996936, + 0.950203, + 0.763680, + 0.574337, + 0.647204, + 0.176163, + 0.586962, + 0.999614, + 0.969120, + 0.909148, + 0.940526, + 0.284093, + 0.861437, + 0.871132, + 0.970897, + 0.101162, + 0.720510, + 0.620766, + 1.000000, + 1.000000, + 0.712070, + 0.712070, + 0.943305, + 1.000000, + 0.971200, + 0.988410, + 0.000000, + 0.000000, + 0.534931, + 0.147636, + 0.147636, + 0.000501, + 0.494777, + 0.494777, + 0.500612, + 0.555356, + 0.000002, + 0.000001, + 0.000019, + 0.908233, + 0.757932, + 0.040207, + 0.602013, + 0.659799, + 0.495010, + 0.510995, + 0.001849, + 0.460905, + 0.033695, + 0.000006, + 0.000006; + 0.000000,0.000002,-1.278853,0.000000,-1.123165,-0.000000,-0.000000,0.000000,-0.000000,1.470235,0.000002,0.000000,-363.589264,-65.273499,-52.807724,1.000000;; + } + + SkinWeights { + "Bip01_R_Toe0"; + 20; + 290, + 3559, + 3547, + 291, + 3548, + 295, + 3558, + 3557, + 296, + 3556, + 300, + 3546, + 301, + 302, + 304, + 3560, + 305, + 422, + 424, + 3545; + 0.999999, + 0.999999, + 0.999999, + 0.942560, + 0.942560, + 0.999963, + 0.999963, + 0.999963, + 0.549179, + 0.549179, + 0.999955, + 0.999955, + 0.519177, + 0.000057, + 0.999568, + 0.999568, + 0.441143, + 0.379234, + 0.287930, + 0.287930; + 0.000002,-0.000000,-1.278853,0.000000,-0.000000,1.123166,-0.000000,0.000000,1.470235,0.000000,0.000002,0.000000,-99.850662,391.012543,-52.807743,1.000000;; + } + + SkinWeights { + "Bip01_L_Calf"; + 195; + 568, + 569, + 3751, + 571, + 572, + 573, + 574, + 575, + 3654, + 576, + 577, + 578, + 579, + 3750, + 588, + 594, + 3662, + 599, + 3666, + 600, + 3664, + 604, + 3725, + 3674, + 608, + 3724, + 3687, + 610, + 3673, + 611, + 3665, + 613, + 615, + 616, + 617, + 618, + 3678, + 619, + 3676, + 620, + 621, + 622, + 623, + 3752, + 624, + 625, + 626, + 627, + 628, + 3747, + 629, + 630, + 3748, + 631, + 632, + 635, + 3717, + 637, + 644, + 645, + 646, + 647, + 648, + 3692, + 649, + 650, + 3691, + 651, + 3703, + 3686, + 652, + 3702, + 653, + 3698, + 654, + 3697, + 655, + 3708, + 656, + 3704, + 657, + 3705, + 658, + 3726, + 3701, + 659, + 3693, + 660, + 3694, + 661, + 3695, + 662, + 3699, + 663, + 3706, + 664, + 3709, + 665, + 3696, + 666, + 3700, + 3690, + 667, + 3707, + 669, + 670, + 671, + 672, + 673, + 674, + 675, + 676, + 677, + 678, + 679, + 680, + 681, + 682, + 683, + 684, + 685, + 686, + 725, + 775, + 776, + 777, + 778, + 779, + 780, + 3675, + 781, + 782, + 3677, + 783, + 784, + 785, + 786, + 787, + 788, + 789, + 790, + 791, + 792, + 793, + 794, + 795, + 796, + 797, + 798, + 799, + 800, + 801, + 802, + 3680, + 803, + 804, + 805, + 806, + 3681, + 807, + 808, + 809, + 810, + 811, + 812, + 813, + 814, + 815, + 3749, + 816, + 817, + 818, + 819, + 820, + 3682, + 821, + 822, + 823, + 3684, + 824, + 825, + 826, + 827, + 828, + 829, + 830, + 831, + 832, + 834, + 835, + 836, + 3754, + 837, + 3753, + 843; + 0.026064, + 0.571004, + 0.571004, + 0.455028, + 0.248249, + 0.604345, + 0.015514, + 0.000824, + 0.000824, + 0.257581, + 0.990195, + 0.999682, + 0.554089, + 0.554089, + 0.000000, + 0.000158, + 0.000158, + 0.006843, + 0.006843, + 0.000001, + 0.000001, + 0.272648, + 0.272648, + 0.272648, + 0.472624, + 0.472624, + 0.472624, + 0.000161, + 0.000161, + 0.003903, + 0.003903, + 1.000000, + 0.357429, + 0.498086, + 0.204317, + 0.997876, + 0.997876, + 0.519316, + 0.519316, + 1.000000, + 0.999598, + 1.000000, + 0.999991, + 0.999991, + 0.999527, + 0.997336, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 0.000000, + 0.000000, + 0.999682, + 0.091281, + 0.046144, + 0.000091, + 0.080118, + 0.000048, + 0.000048, + 0.472785, + 0.002242, + 0.002242, + 0.006073, + 0.006073, + 0.006073, + 0.062748, + 0.062748, + 0.262268, + 0.262268, + 0.448347, + 0.448347, + 0.391542, + 0.391542, + 0.607159, + 0.607159, + 0.319517, + 0.319517, + 0.002809, + 0.002809, + 0.002809, + 0.054075, + 0.054075, + 0.133582, + 0.133582, + 0.092798, + 0.092798, + 0.537874, + 0.537874, + 0.190501, + 0.190501, + 0.178618, + 0.178618, + 0.055746, + 0.055746, + 0.730401, + 0.730401, + 0.730401, + 0.319495, + 0.319495, + 0.000363, + 0.003114, + 0.050198, + 0.237229, + 0.426363, + 0.353552, + 0.823675, + 0.413357, + 0.000372, + 0.030495, + 0.089985, + 0.058787, + 0.714235, + 0.137448, + 0.127817, + 0.028669, + 0.898433, + 0.280034, + 0.057181, + 0.028794, + 0.011515, + 1.000000, + 1.000000, + 0.464511, + 0.852246, + 0.852246, + 0.999499, + 0.505163, + 0.505163, + 0.499411, + 0.444841, + 0.999999, + 0.999999, + 0.999981, + 0.091013, + 0.240829, + 0.959675, + 0.397767, + 0.339149, + 0.504983, + 0.489019, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 0.998162, + 1.000000, + 1.000000, + 0.538773, + 0.966243, + 1.000000, + 0.999994, + 0.999994, + 0.999989, + 0.999992, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 0.199217, + 0.199217, + 0.114574, + 0.001818, + 0.221331, + 0.319029, + 0.506883, + 0.261107, + 0.521918, + 0.557577, + 0.528621, + 0.010854, + 1.000000, + 0.309890, + 0.309890, + 0.021971, + 0.021971, + 0.000015; + 0.120906,0.020146,-1.272965,0.000000,-1.115712,-0.072214,-0.107113,0.000000,-0.096302,1.467010,0.014070,0.000000,-242.688828,-89.343452,17.548592,1.000000;; + } + + SkinWeights { + "Bip01_L_Foot"; + 153; + 572, + 573, + 577, + 578, + 591, + 3671, + 3659, + 592, + 3660, + 593, + 3661, + 594, + 3662, + 595, + 3663, + 596, + 3670, + 3669, + 597, + 3668, + 598, + 3667, + 599, + 3666, + 600, + 3664, + 601, + 3658, + 602, + 603, + 604, + 3725, + 3674, + 605, + 3672, + 606, + 607, + 608, + 3724, + 3687, + 609, + 3689, + 3688, + 610, + 3673, + 611, + 3665, + 615, + 616, + 617, + 618, + 3678, + 619, + 3676, + 620, + 621, + 622, + 647, + 648, + 3692, + 649, + 650, + 3691, + 651, + 3703, + 3686, + 652, + 3702, + 653, + 3698, + 654, + 3697, + 655, + 3708, + 656, + 3704, + 657, + 3705, + 658, + 3726, + 3701, + 659, + 3693, + 660, + 3694, + 661, + 3695, + 662, + 3699, + 663, + 3706, + 664, + 3709, + 665, + 3696, + 666, + 3700, + 3690, + 667, + 3707, + 668, + 669, + 670, + 671, + 672, + 673, + 674, + 675, + 676, + 677, + 678, + 679, + 680, + 681, + 682, + 683, + 684, + 685, + 686, + 722, + 723, + 3685, + 724, + 3657, + 725, + 726, + 775, + 776, + 777, + 778, + 779, + 780, + 3675, + 781, + 782, + 3677, + 783, + 784, + 785, + 786, + 787, + 788, + 789, + 790, + 791, + 792, + 793, + 794, + 801, + 803, + 804, + 806, + 3681; + 0.751751, + 0.395655, + 0.009805, + 0.000317, + 0.000001, + 0.000001, + 0.000001, + 0.057284, + 0.057284, + 1.000000, + 1.000000, + 0.999842, + 0.999842, + 1.000000, + 1.000000, + 0.000037, + 0.000037, + 0.000037, + 0.449247, + 0.449247, + 1.000000, + 1.000000, + 0.993157, + 0.993157, + 0.999999, + 0.999999, + 0.000045, + 0.000045, + 0.480725, + 0.999952, + 0.727352, + 0.727352, + 0.727352, + 0.000434, + 0.000434, + 0.557390, + 1.000000, + 0.527376, + 0.527376, + 0.527376, + 1.000000, + 1.000000, + 1.000000, + 0.999839, + 0.999839, + 0.996097, + 0.996097, + 0.642571, + 0.501914, + 0.795683, + 0.002124, + 0.002124, + 0.480684, + 0.480684, + 0.000000, + 0.000402, + 0.000000, + 0.919882, + 0.999952, + 0.999952, + 0.527215, + 0.997758, + 0.997758, + 0.993927, + 0.993927, + 0.993927, + 0.937252, + 0.937252, + 0.737732, + 0.737732, + 0.551653, + 0.551653, + 0.608458, + 0.608458, + 0.392841, + 0.392841, + 0.680483, + 0.680483, + 0.997191, + 0.997191, + 0.997191, + 0.945925, + 0.945925, + 0.866418, + 0.866418, + 0.907202, + 0.907202, + 0.462126, + 0.462126, + 0.809499, + 0.809499, + 0.821382, + 0.821382, + 0.944254, + 0.944254, + 0.269599, + 0.269599, + 0.269599, + 0.680505, + 0.680505, + 1.000000, + 0.999637, + 0.996886, + 0.949802, + 0.762771, + 0.573637, + 0.646448, + 0.176325, + 0.586643, + 0.999628, + 0.969505, + 0.910015, + 0.941213, + 0.285765, + 0.862552, + 0.872183, + 0.971331, + 0.101567, + 0.719966, + 0.620583, + 1.000000, + 1.000000, + 0.713557, + 0.713557, + 0.942819, + 1.000000, + 0.971206, + 0.988485, + 0.000000, + 0.000000, + 0.535488, + 0.147754, + 0.147754, + 0.000501, + 0.494837, + 0.494837, + 0.500589, + 0.555158, + 0.000002, + 0.000001, + 0.000019, + 0.908987, + 0.759171, + 0.040325, + 0.602233, + 0.660851, + 0.495017, + 0.510981, + 0.001838, + 0.461227, + 0.033757, + 0.000006, + 0.000006; + 0.000000,0.000002,-1.278853,0.000000,-1.123165,-0.000000,-0.000000,0.000000,-0.000000,1.470235,0.000002,0.000000,-363.589264,-65.273499,53.091980,1.000000;; + } + + SkinWeights { + "Bip01_L_Toe0"; + 20; + 591, + 3671, + 3659, + 592, + 3660, + 596, + 3670, + 3669, + 597, + 3668, + 601, + 3658, + 602, + 603, + 605, + 3672, + 606, + 722, + 724, + 3657; + 0.999999, + 0.999999, + 0.999999, + 0.942716, + 0.942716, + 0.999963, + 0.999963, + 0.999963, + 0.550753, + 0.550753, + 0.999955, + 0.999955, + 0.519275, + 0.000048, + 0.999566, + 0.999566, + 0.442610, + 0.379417, + 0.286443, + 0.286443; + 0.000002,0.000000,-1.278853,0.000000,-0.000000,1.123165,0.000000,0.000000,1.470235,0.000000,0.000002,0.000000,-99.850632,391.012512,53.091995,1.000000;; + } + + SkinWeights { + "Bip01_L_Forearm"; + 119; + 859, + 3774, + 862, + 3763, + 863, + 3765, + 866, + 867, + 868, + 869, + 876, + 878, + 879, + 3791, + 3788, + 3767, + 880, + 3790, + 881, + 3786, + 882, + 3785, + 883, + 3796, + 3789, + 3766, + 884, + 3783, + 885, + 3797, + 886, + 3782, + 887, + 3773, + 894, + 898, + 899, + 901, + 902, + 903, + 904, + 906, + 907, + 908, + 909, + 3795, + 910, + 3804, + 3802, + 3784, + 911, + 3803, + 912, + 3792, + 913, + 914, + 3805, + 915, + 3808, + 3807, + 3787, + 916, + 917, + 918, + 919, + 920, + 921, + 922, + 923, + 924, + 3793, + 925, + 926, + 927, + 928, + 929, + 930, + 931, + 932, + 933, + 934, + 935, + 936, + 937, + 938, + 3794, + 939, + 940, + 941, + 942, + 947, + 3806, + 948, + 949, + 950, + 3927, + 951, + 3813, + 3811, + 3810, + 952, + 3815, + 1271, + 1272, + 1273, + 1274, + 1275, + 1276, + 1277, + 1278, + 1279, + 1280, + 3930, + 1281, + 3809, + 1282, + 3812, + 1283, + 1284; + 0.000002, + 0.000002, + 0.059762, + 0.059762, + 0.156983, + 0.156983, + 0.307600, + 0.461983, + 0.363022, + 0.207371, + 0.437484, + 0.390499, + 0.473019, + 0.473019, + 0.473019, + 0.473019, + 0.493125, + 0.493125, + 0.500494, + 0.500494, + 0.497598, + 0.497598, + 0.487562, + 0.487562, + 0.487562, + 0.487562, + 0.500000, + 0.500000, + 0.435736, + 0.435736, + 0.500010, + 0.500010, + 0.000002, + 0.000002, + 0.000000, + 0.004760, + 0.062097, + 0.000412, + 0.018884, + 0.000128, + 0.000050, + 0.046535, + 0.997297, + 0.999856, + 0.996144, + 0.996144, + 0.971005, + 0.971005, + 0.971005, + 0.971005, + 0.998600, + 0.998600, + 0.999904, + 0.999904, + 1.000000, + 0.522519, + 0.522519, + 0.500009, + 0.500009, + 0.500009, + 0.500009, + 1.000000, + 0.999782, + 1.000000, + 0.999998, + 0.999979, + 0.999598, + 0.998203, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 0.982001, + 0.730349, + 0.917959, + 0.770439, + 1.000000, + 1.000000, + 1.000000, + 0.825192, + 0.479548, + 0.479548, + 0.280624, + 0.280624, + 0.280624, + 0.280624, + 0.454016, + 0.454016, + 1.000000, + 1.000000, + 0.999997, + 0.522228, + 0.479390, + 0.437447, + 0.393686, + 0.431087, + 0.457384, + 0.338176, + 0.338176, + 0.610102, + 0.610102, + 0.527919, + 0.527919, + 0.541473, + 0.495169; + 0.888611,0.718008,0.574718,0.000000,-0.246358,-0.482594,0.983825,0.000000,1.006948,-1.039778,-0.257893,0.000000,-156.802475,18.217770,-12.980429,1.000000;; + } + + SkinWeights { + "Bip01_L_Hand"; + 76; + 910, + 3804, + 3802, + 3784, + 911, + 3803, + 914, + 3805, + 915, + 3808, + 3807, + 3787, + 949, + 950, + 3927, + 951, + 3813, + 3811, + 3810, + 952, + 3815, + 953, + 3928, + 954, + 3929, + 3817, + 3814, + 955, + 3931, + 3816, + 956, + 959, + 961, + 963, + 964, + 965, + 3818, + 973, + 974, + 981, + 982, + 983, + 984, + 986, + 987, + 988, + 3821, + 989, + 3820, + 991, + 1008, + 1263, + 1264, + 1265, + 1266, + 1267, + 1268, + 3926, + 1269, + 1270, + 1272, + 1273, + 1274, + 1275, + 1276, + 1277, + 1278, + 1279, + 1280, + 3930, + 1281, + 3809, + 1282, + 3812, + 1283, + 1284; + 0.028995, + 0.028995, + 0.028995, + 0.028995, + 0.001400, + 0.001400, + 0.477481, + 0.477481, + 0.499991, + 0.499991, + 0.499991, + 0.499991, + 0.174808, + 0.520452, + 0.520452, + 0.719376, + 0.719376, + 0.719376, + 0.719376, + 0.545984, + 0.545984, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 0.000575, + 1.000000, + 1.000000, + 1.000000, + 0.489764, + 1.000000, + 1.000000, + 0.007399, + 0.000084, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 0.480738, + 0.480738, + 0.485043, + 0.485043, + 0.500000, + 0.008638, + 1.000000, + 0.044182, + 0.012334, + 0.004315, + 0.389840, + 0.201485, + 0.201485, + 1.000000, + 1.000000, + 0.000000, + 0.000002, + 0.477772, + 0.520610, + 0.562553, + 0.606314, + 0.568913, + 0.542616, + 0.661824, + 0.661824, + 0.389898, + 0.389898, + 0.472081, + 0.472081, + 0.458527, + 0.504831; + 0.888611,-0.574146,0.718465,0.000000,-0.246358,-0.984209,-0.481810,0.000000,1.006948,0.257065,-1.039984,0.000000,-218.473953,12.994934,18.207430,1.000000;; + } + + SkinWeights { + "Bip01_L_Finger1"; + 94; + 956, + 957, + 958, + 960, + 962, + 3832, + 969, + 3859, + 970, + 3836, + 971, + 972, + 3882, + 973, + 974, + 975, + 976, + 977, + 978, + 979, + 980, + 985, + 3834, + 993, + 3826, + 3824, + 998, + 3829, + 1001, + 1008, + 1009, + 1010, + 1011, + 1012, + 1013, + 1014, + 1015, + 3835, + 1016, + 1017, + 1018, + 3833, + 1019, + 1020, + 1021, + 3838, + 1022, + 1023, + 1024, + 3837, + 1025, + 1026, + 1077, + 3858, + 1078, + 1079, + 1080, + 3857, + 1081, + 1082, + 1083, + 3861, + 1087, + 1088, + 1139, + 3881, + 1140, + 1141, + 1142, + 3880, + 1143, + 1144, + 1148, + 3883, + 1149, + 1150, + 1201, + 3904, + 1202, + 1203, + 1204, + 3903, + 1205, + 1206, + 1210, + 3905, + 1211, + 1212, + 1264, + 1265, + 1266, + 1267, + 1268, + 3926; + 0.999425, + 0.999999, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 0.959444, + 0.959444, + 0.998224, + 0.998224, + 0.997435, + 0.994530, + 0.994530, + 0.992601, + 0.999916, + 0.999813, + 0.994714, + 0.988947, + 0.990024, + 0.999781, + 0.999208, + 1.000000, + 1.000000, + 0.056190, + 0.056190, + 0.056190, + 0.000462, + 0.000462, + 0.002074, + 0.991362, + 0.999365, + 0.998360, + 1.000000, + 1.000000, + 0.962750, + 0.958956, + 0.501562, + 0.501562, + 0.544088, + 0.624832, + 0.644254, + 0.644254, + 0.583404, + 0.507984, + 0.001016, + 0.001016, + 0.000028, + 0.000000, + 0.000000, + 0.000000, + 0.000074, + 0.001057, + 0.492123, + 0.492123, + 0.366961, + 0.325544, + 0.443569, + 0.443569, + 0.494251, + 0.499973, + 0.000000, + 0.000000, + 0.000000, + 0.000000, + 0.353513, + 0.353513, + 0.257215, + 0.363813, + 0.495090, + 0.495090, + 0.498815, + 0.462536, + 0.000000, + 0.000000, + 0.000000, + 0.000000, + 0.548101, + 0.548101, + 0.472535, + 0.435641, + 0.482943, + 0.482943, + 0.490011, + 0.524837, + 0.000024, + 0.000024, + 0.000028, + 0.000000, + 0.955818, + 0.987666, + 0.995685, + 0.610160, + 0.798515, + 0.798515; + 0.888611,-0.574718,0.718007,0.000000,-0.246358,-0.983825,-0.482594,0.000000,1.006948,0.257893,-1.039779,0.000000,-242.561966,12.625334,18.722528,1.000000;; + } + + SkinWeights { + "Bip01_L_Finger11"; + 246; + 957, + 958, + 960, + 969, + 3859, + 970, + 3836, + 971, + 972, + 3882, + 975, + 976, + 977, + 978, + 979, + 980, + 1009, + 1010, + 1013, + 1014, + 1015, + 3835, + 1016, + 1017, + 1018, + 3833, + 1019, + 1020, + 1021, + 3838, + 1022, + 1023, + 1024, + 3837, + 1025, + 1026, + 1027, + 3840, + 1028, + 1029, + 1030, + 3839, + 1031, + 1032, + 1033, + 3842, + 1034, + 1035, + 1036, + 3841, + 1037, + 1038, + 1039, + 3844, + 1040, + 1041, + 1042, + 3843, + 1043, + 1044, + 1045, + 3846, + 1046, + 1047, + 1048, + 3845, + 1049, + 1050, + 1051, + 3848, + 1052, + 1053, + 1054, + 3847, + 1055, + 1056, + 1057, + 3850, + 1058, + 1059, + 1060, + 3849, + 1061, + 1062, + 1077, + 3858, + 1078, + 1079, + 1080, + 3857, + 1081, + 1082, + 1083, + 3861, + 1084, + 1085, + 1086, + 3860, + 1087, + 1088, + 1089, + 3863, + 1090, + 1091, + 1092, + 3862, + 1093, + 1094, + 1095, + 3865, + 1096, + 1097, + 1098, + 3864, + 1099, + 1100, + 1101, + 3867, + 1102, + 1103, + 1104, + 3866, + 1105, + 1106, + 1107, + 3869, + 1108, + 1109, + 1110, + 3868, + 1111, + 1112, + 1139, + 3881, + 1140, + 1141, + 1142, + 3880, + 1143, + 1144, + 1145, + 3884, + 1146, + 1147, + 1148, + 3883, + 1149, + 1150, + 1151, + 3886, + 1152, + 1153, + 1154, + 3885, + 1155, + 1156, + 1157, + 3888, + 1158, + 1159, + 1160, + 3887, + 1161, + 1162, + 1163, + 3890, + 1164, + 1165, + 1166, + 3889, + 1167, + 1168, + 1169, + 3892, + 1170, + 1171, + 1172, + 3891, + 1173, + 1174, + 1178, + 3893, + 1201, + 3904, + 1202, + 1203, + 1204, + 3903, + 1205, + 1206, + 1207, + 3906, + 1208, + 1209, + 1210, + 3905, + 1211, + 1212, + 1213, + 3908, + 1214, + 1215, + 1216, + 3907, + 1217, + 1218, + 1219, + 3910, + 1220, + 1221, + 1222, + 3909, + 1223, + 1224, + 1225, + 3912, + 1226, + 1227, + 1228, + 3911, + 1229, + 1230, + 1231, + 3914, + 1232, + 1233, + 1234, + 3913, + 1235, + 1236, + 1237, + 3916, + 1238, + 1239, + 1240, + 3915, + 1241, + 1242, + 1243, + 3918, + 1244, + 1245, + 1246, + 3917, + 1247, + 1248; + 0.000001, + 0.000000, + 0.000000, + 0.040556, + 0.040556, + 0.001776, + 0.001776, + 0.002565, + 0.005470, + 0.005470, + 0.000187, + 0.005286, + 0.011053, + 0.009976, + 0.000219, + 0.000792, + 0.000635, + 0.001640, + 0.037250, + 0.041044, + 0.498439, + 0.498439, + 0.455912, + 0.375168, + 0.355747, + 0.355747, + 0.416596, + 0.492016, + 0.998984, + 0.998984, + 0.999972, + 1.000000, + 1.000000, + 1.000000, + 0.999926, + 0.998943, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 0.999590, + 0.999590, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 0.999972, + 0.687019, + 0.687019, + 0.853539, + 0.975075, + 0.984281, + 0.984281, + 0.931293, + 0.756339, + 0.454794, + 0.454794, + 0.386277, + 0.350143, + 0.375279, + 0.375279, + 0.395390, + 0.437087, + 0.047430, + 0.047430, + 0.013109, + 0.001288, + 0.000577, + 0.000577, + 0.003844, + 0.028016, + 0.507877, + 0.507877, + 0.633039, + 0.674456, + 0.556431, + 0.556431, + 0.505749, + 0.500027, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 0.999996, + 0.999996, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 0.999998, + 0.999965, + 0.763473, + 0.763473, + 0.945556, + 0.978392, + 0.941282, + 0.941282, + 0.833361, + 0.659726, + 0.455132, + 0.455132, + 0.309846, + 0.264637, + 0.353841, + 0.353841, + 0.421831, + 0.468652, + 0.000004, + 0.000004, + 0.000000, + 0.000000, + 0.000000, + 0.000000, + 0.000002, + 0.000008, + 0.646487, + 0.646487, + 0.742785, + 0.636187, + 0.504910, + 0.504910, + 0.501185, + 0.537464, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 0.999946, + 0.999946, + 0.999997, + 0.999305, + 0.978899, + 0.978899, + 0.978208, + 0.997956, + 0.496668, + 0.496668, + 0.492731, + 0.498635, + 0.500000, + 0.500000, + 0.500000, + 0.499604, + 0.000245, + 0.000245, + 0.000164, + 0.000644, + 0.003351, + 0.003351, + 0.003048, + 0.000866, + 0.000000, + 0.000000, + 0.451899, + 0.451899, + 0.527465, + 0.564359, + 0.517057, + 0.517057, + 0.509989, + 0.475163, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 0.999976, + 0.999976, + 0.999972, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 0.999989, + 0.993070, + 0.993070, + 0.998995, + 1.000000, + 0.998765, + 0.998765, + 0.985174, + 0.792985, + 0.640530, + 0.640530, + 0.737351, + 0.957855, + 0.049642, + 0.049642, + 0.038349, + 0.067962, + 0.128283, + 0.128283, + 0.109217, + 0.077048; + 0.888611,-0.574718,0.718007,0.000000,-0.246358,-0.983825,-0.482594,0.000000,1.006948,0.257893,-1.039779,0.000000,-251.862015,12.625334,18.722525,1.000000;; + } + + SkinWeights { + "Bip01_L_Finger0"; + 17; + 964, + 966, + 967, + 968, + 3822, + 988, + 3821, + 989, + 3820, + 990, + 3819, + 991, + 992, + 994, + 995, + 3823, + 996; + 0.510236, + 0.957025, + 0.977791, + 1.000000, + 1.000000, + 0.519262, + 0.519262, + 0.514957, + 0.514957, + 0.500000, + 0.500000, + 0.500000, + 1.000000, + 0.000013, + 0.001700, + 0.001700, + 0.004007; + 0.131869,-1.109649,-0.621896,0.000000,0.164812,0.558010,-0.960710,0.000000,1.446397,0.024762,0.262515,0.000000,-185.006516,140.638351,15.450895,1.000000;; + } + + SkinWeights { + "Bip01_L_Finger01"; + 16; + 966, + 967, + 990, + 3819, + 992, + 993, + 3826, + 3824, + 994, + 995, + 3823, + 996, + 997, + 3827, + 1000, + 3825; + 0.042975, + 0.022209, + 0.500000, + 0.500000, + 0.000000, + 0.943810, + 0.943810, + 0.943810, + 0.999987, + 0.998300, + 0.998300, + 0.995993, + 1.000000, + 1.000000, + 0.019189, + 0.019189; + 0.588472,-0.949953,-0.621896,0.000000,-0.086455,0.575381,-0.960710,0.000000,1.300416,0.633716,0.262515,0.000000,-236.240311,45.016586,15.450904,1.000000;; + } + + SkinWeights { + "Bip01_L_Finger02"; + 15; + 998, + 3829, + 999, + 1000, + 3825, + 1001, + 1002, + 3828, + 1003, + 3831, + 1004, + 1005, + 3830, + 1006, + 1007; + 0.999538, + 0.999538, + 1.000000, + 0.980811, + 0.980811, + 0.997926, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000; + 0.322554,-1.069892,-0.621896,0.000000,0.065410,0.578152,-0.960710,0.000000,1.420123,0.275550,0.262515,0.000000,-222.297882,106.169159,15.450895,1.000000;; + } + + SkinWeights { + "Bip01_L_Finger12"; + 214; + 1039, + 3844, + 1044, + 1045, + 3846, + 1046, + 1047, + 1048, + 3845, + 1049, + 1050, + 1051, + 3848, + 1052, + 1053, + 1054, + 3847, + 1055, + 1056, + 1057, + 3850, + 1058, + 1059, + 1060, + 3849, + 1061, + 1062, + 1063, + 3852, + 1064, + 1065, + 1066, + 3851, + 1067, + 1068, + 1069, + 3854, + 1070, + 1071, + 1072, + 3853, + 1073, + 1074, + 1075, + 3856, + 1076, + 3855, + 1089, + 3863, + 1092, + 3862, + 1093, + 1094, + 1095, + 3865, + 1096, + 1097, + 1098, + 3864, + 1099, + 1100, + 1101, + 3867, + 1102, + 1103, + 1104, + 3866, + 1105, + 1106, + 1107, + 3869, + 1108, + 1109, + 1110, + 3868, + 1111, + 1112, + 1113, + 3871, + 1114, + 1115, + 1116, + 3870, + 1117, + 1118, + 1119, + 3873, + 1120, + 1121, + 1122, + 3872, + 1123, + 1124, + 1125, + 3875, + 1126, + 1127, + 1128, + 3874, + 1129, + 1130, + 1131, + 3877, + 1132, + 1133, + 1134, + 3876, + 1135, + 1136, + 1137, + 3879, + 1138, + 3878, + 1157, + 3888, + 1158, + 1159, + 1160, + 3887, + 1161, + 1162, + 1163, + 3890, + 1164, + 1165, + 1166, + 3889, + 1167, + 1168, + 1169, + 3892, + 1170, + 1171, + 1172, + 3891, + 1173, + 1174, + 1175, + 3894, + 1176, + 1177, + 1178, + 3893, + 1179, + 1180, + 1181, + 3896, + 1182, + 1183, + 1184, + 3895, + 1185, + 1186, + 1187, + 3898, + 1188, + 1189, + 1190, + 3897, + 1191, + 1192, + 1193, + 3900, + 1194, + 1195, + 1196, + 3899, + 1197, + 1198, + 1199, + 3902, + 1200, + 3901, + 1233, + 1234, + 3913, + 1235, + 1237, + 3916, + 1238, + 1239, + 1240, + 3915, + 1241, + 1242, + 1243, + 3918, + 1244, + 1245, + 1246, + 3917, + 1247, + 1248, + 1249, + 3921, + 1250, + 3919, + 1251, + 1252, + 3920, + 1253, + 1254, + 1255, + 3923, + 1256, + 1257, + 1258, + 3922, + 1259, + 1260, + 1261, + 3925, + 1262, + 3924; + 0.000410, + 0.000410, + 0.000028, + 0.312981, + 0.312981, + 0.146461, + 0.024925, + 0.015719, + 0.015719, + 0.068707, + 0.243661, + 0.545206, + 0.545206, + 0.613723, + 0.649857, + 0.624721, + 0.624721, + 0.604610, + 0.562913, + 0.952570, + 0.952570, + 0.986891, + 0.998712, + 0.999423, + 0.999423, + 0.996156, + 0.971984, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 0.000004, + 0.000004, + 0.000000, + 0.000000, + 0.000002, + 0.000035, + 0.236527, + 0.236527, + 0.054444, + 0.021608, + 0.058718, + 0.058718, + 0.166639, + 0.340274, + 0.544868, + 0.544868, + 0.690154, + 0.735363, + 0.646159, + 0.646159, + 0.578169, + 0.531348, + 0.999996, + 0.999996, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 0.999998, + 0.999992, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 0.000054, + 0.000054, + 0.000003, + 0.000695, + 0.021101, + 0.021101, + 0.021792, + 0.002044, + 0.503332, + 0.503332, + 0.507269, + 0.501365, + 0.500000, + 0.500000, + 0.500000, + 0.500396, + 0.999754, + 0.999754, + 0.999836, + 0.999356, + 0.996649, + 0.996649, + 0.996952, + 0.999134, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 0.000011, + 0.006930, + 0.006930, + 0.001005, + 0.001235, + 0.001235, + 0.014826, + 0.207015, + 0.359470, + 0.359470, + 0.262649, + 0.042145, + 0.950358, + 0.950358, + 0.961651, + 0.932038, + 0.871718, + 0.871718, + 0.890783, + 0.922952, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000; + 0.888611,-0.574718,0.718007,0.000000,-0.246358,-0.983825,-0.482594,0.000000,1.006948,0.257893,-1.039779,0.000000,-262.712067,12.625349,18.722527,1.000000;; + } + + SkinWeights { + "Bip01_R_Forearm"; + 118; + 1304, + 3954, + 1307, + 3943, + 1308, + 3944, + 1311, + 1312, + 1313, + 1314, + 1321, + 1323, + 1324, + 3967, + 3947, + 1325, + 3971, + 1326, + 3966, + 1327, + 3969, + 3965, + 1328, + 3976, + 3970, + 3946, + 1329, + 3963, + 1330, + 3977, + 1331, + 3962, + 1332, + 3953, + 1339, + 1343, + 1344, + 1346, + 1347, + 1348, + 1349, + 1351, + 1352, + 1353, + 1354, + 3975, + 1355, + 3984, + 3982, + 3964, + 1356, + 3983, + 1357, + 1358, + 1359, + 3985, + 1360, + 3988, + 3987, + 3973, + 1361, + 1362, + 1363, + 3968, + 1364, + 1365, + 1366, + 1367, + 1368, + 1369, + 3974, + 1370, + 1371, + 1372, + 1373, + 1374, + 1375, + 1376, + 1377, + 1378, + 1379, + 1380, + 1381, + 1382, + 3972, + 1383, + 1384, + 1385, + 1386, + 1387, + 1392, + 3986, + 1393, + 1394, + 1395, + 4103, + 1396, + 3993, + 3992, + 3989, + 1397, + 3991, + 1716, + 1717, + 1718, + 1719, + 1720, + 1721, + 1722, + 1723, + 1724, + 1725, + 4105, + 1726, + 3990, + 1727, + 1728, + 1729; + 0.000002, + 0.000002, + 0.062100, + 0.062100, + 0.156545, + 0.156545, + 0.307653, + 0.463402, + 0.364263, + 0.206257, + 0.437729, + 0.393141, + 0.474390, + 0.474390, + 0.474390, + 0.494343, + 0.494343, + 0.500493, + 0.500493, + 0.497958, + 0.497958, + 0.497958, + 0.487799, + 0.487799, + 0.487799, + 0.487799, + 0.500000, + 0.500000, + 0.435860, + 0.435860, + 0.500018, + 0.500018, + 0.000003, + 0.000003, + 0.000000, + 0.004865, + 0.063481, + 0.000471, + 0.019984, + 0.000129, + 0.000050, + 0.048368, + 0.997429, + 0.999862, + 0.996296, + 0.996296, + 0.969578, + 0.969578, + 0.969578, + 0.969578, + 0.998534, + 0.998534, + 0.999904, + 1.000000, + 0.521478, + 0.521478, + 0.500006, + 0.500006, + 0.500006, + 0.500006, + 1.000000, + 0.999783, + 1.000000, + 1.000000, + 0.999998, + 0.999980, + 0.999624, + 0.998287, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 0.982655, + 0.733244, + 0.919066, + 0.773837, + 1.000000, + 1.000000, + 1.000000, + 0.821199, + 0.479127, + 0.479127, + 0.373080, + 0.373080, + 0.373080, + 0.373080, + 0.494538, + 0.494538, + 1.000000, + 1.000000, + 0.999997, + 0.521167, + 0.479837, + 0.438248, + 0.533577, + 0.511417, + 0.457177, + 0.338835, + 0.338835, + 0.606293, + 0.606293, + 0.526599, + 0.539169, + 0.495281; + -0.888608,-0.718010,0.574719,0.000000,-0.246358,-0.482594,-0.983825,0.000000,1.006950,-1.039776,0.257891,0.000000,-156.604965,18.377340,12.852691,1.000000;; + } + + SkinWeights { + "Bip01_R_Hand"; + 74; + 1355, + 3984, + 3982, + 3964, + 1356, + 3983, + 1359, + 3985, + 1360, + 3988, + 3987, + 3973, + 1394, + 1395, + 4103, + 1396, + 3993, + 3992, + 3989, + 1397, + 3991, + 1398, + 4104, + 1399, + 4106, + 3996, + 3994, + 1400, + 3995, + 1401, + 1404, + 1406, + 1408, + 1409, + 1410, + 3997, + 1418, + 1419, + 1426, + 1427, + 1428, + 1429, + 1431, + 1432, + 1433, + 4000, + 1434, + 3999, + 1436, + 1453, + 1708, + 1709, + 1710, + 1711, + 1712, + 1713, + 4102, + 1714, + 1715, + 1717, + 1718, + 1719, + 1720, + 1721, + 1722, + 1723, + 1724, + 1725, + 4105, + 1726, + 3990, + 1727, + 1728, + 1729; + 0.030422, + 0.030422, + 0.030422, + 0.030422, + 0.001466, + 0.001466, + 0.478522, + 0.478522, + 0.499994, + 0.499994, + 0.499994, + 0.499994, + 0.178801, + 0.520873, + 0.520873, + 0.626920, + 0.626920, + 0.626920, + 0.626920, + 0.505462, + 0.505462, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 0.000096, + 1.000000, + 1.000000, + 0.500000, + 0.470417, + 1.000000, + 1.000000, + 0.002561, + 0.000004, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 0.460453, + 0.460453, + 0.466427, + 0.466427, + 0.496454, + 0.002208, + 1.000000, + 0.022241, + 0.006276, + 0.001324, + 0.337075, + 0.124395, + 0.124395, + 1.000000, + 1.000000, + 0.000000, + 0.000003, + 0.478833, + 0.520163, + 0.561752, + 0.466423, + 0.488583, + 0.542824, + 0.661165, + 0.661165, + 0.393707, + 0.393707, + 0.473401, + 0.460831, + 0.504719; + -0.888608,0.574147,0.718468,0.000000,-0.246358,-0.984209,0.481810,0.000000,1.006950,0.257063,1.039981,0.000000,-218.276459,12.867327,-18.367111,1.000000;; + } + + SkinWeights { + "Bip01_R_Finger1"; + 88; + 1401, + 1402, + 1403, + 1405, + 1407, + 4008, + 1414, + 4036, + 1415, + 4009, + 1416, + 1417, + 4059, + 1418, + 1419, + 1420, + 1421, + 1422, + 1423, + 1424, + 1425, + 1430, + 4011, + 1438, + 4003, + 1443, + 4005, + 1446, + 1453, + 1454, + 1455, + 1456, + 1457, + 1458, + 1459, + 1460, + 4013, + 1461, + 4010, + 1462, + 1463, + 4012, + 1464, + 1465, + 1466, + 4015, + 1467, + 1469, + 4014, + 1470, + 1471, + 1522, + 4035, + 1523, + 1524, + 1525, + 4034, + 1526, + 1527, + 1533, + 1584, + 4058, + 1585, + 1586, + 1587, + 4057, + 1588, + 1589, + 1593, + 4060, + 1594, + 1646, + 4081, + 1647, + 1648, + 1649, + 4080, + 1650, + 1651, + 1655, + 4082, + 1656, + 1709, + 1710, + 1711, + 1712, + 1713, + 4102; + 0.999904, + 0.999575, + 0.999896, + 0.999998, + 0.999965, + 0.999965, + 0.826216, + 0.826216, + 0.988180, + 0.988180, + 0.963893, + 0.941790, + 0.941790, + 0.997439, + 0.999996, + 0.984101, + 0.927449, + 0.946660, + 0.969436, + 0.999024, + 0.990114, + 1.000000, + 1.000000, + 0.051519, + 0.051519, + 0.000312, + 0.000312, + 0.001440, + 0.997792, + 0.988519, + 0.958418, + 0.999946, + 1.000000, + 0.898404, + 0.871105, + 0.499901, + 0.499901, + 0.475211, + 0.475211, + 0.475116, + 0.551148, + 0.551148, + 0.553986, + 0.503293, + 0.000385, + 0.000385, + 0.000002, + 0.000000, + 0.000000, + 0.000073, + 0.000839, + 0.424792, + 0.424792, + 0.175096, + 0.154834, + 0.359990, + 0.359990, + 0.479599, + 0.496175, + 0.000000, + 0.162945, + 0.162945, + 0.064365, + 0.151668, + 0.434586, + 0.434586, + 0.478500, + 0.374775, + 0.000000, + 0.000000, + 0.000000, + 0.193238, + 0.193238, + 0.106886, + 0.203754, + 0.409137, + 0.409137, + 0.427054, + 0.345515, + 0.000000, + 0.000000, + 0.000001, + 0.977759, + 0.993724, + 0.998676, + 0.662925, + 0.875605, + 0.875605; + -0.888608,0.574719,0.718010,0.000000,-0.246358,-0.983825,0.482594,0.000000,1.006950,0.257891,1.039776,0.000000,-242.364456,12.497601,-18.882097,1.000000;; + } + + SkinWeights { + "Bip01_R_Finger11"; + 254; + 1402, + 1403, + 1405, + 1407, + 4008, + 1414, + 4036, + 1415, + 4009, + 1416, + 1417, + 4059, + 1420, + 1421, + 1422, + 1423, + 1424, + 1425, + 1454, + 1455, + 1456, + 1458, + 1459, + 1460, + 4013, + 1461, + 4010, + 1462, + 1463, + 4012, + 1464, + 1465, + 1466, + 4015, + 1467, + 1468, + 1469, + 4014, + 1470, + 1471, + 1472, + 4017, + 1473, + 1474, + 1475, + 4016, + 1476, + 1477, + 1478, + 4019, + 1479, + 1480, + 1481, + 4018, + 1482, + 1483, + 1484, + 4021, + 1485, + 1486, + 1487, + 4020, + 1488, + 1489, + 1490, + 4023, + 1491, + 1492, + 1493, + 4022, + 1494, + 1495, + 1496, + 4025, + 1497, + 1498, + 1499, + 4024, + 1500, + 1501, + 1502, + 4027, + 1503, + 1504, + 1505, + 4026, + 1506, + 1507, + 1508, + 4029, + 1513, + 1522, + 4035, + 1523, + 1524, + 1525, + 4034, + 1526, + 1527, + 1528, + 4038, + 1529, + 1530, + 1531, + 4037, + 1532, + 1533, + 1534, + 4040, + 1535, + 1536, + 1537, + 4039, + 1538, + 1539, + 1540, + 4042, + 1541, + 1542, + 1543, + 4041, + 1544, + 1545, + 1546, + 4044, + 1547, + 1548, + 1549, + 4043, + 1550, + 1551, + 1552, + 4046, + 1553, + 1554, + 1555, + 4045, + 1556, + 1557, + 1584, + 4058, + 1585, + 1586, + 1587, + 4057, + 1588, + 1589, + 1590, + 4061, + 1591, + 1592, + 1593, + 4060, + 1594, + 1595, + 1596, + 4063, + 1597, + 1598, + 1599, + 4062, + 1600, + 1601, + 1602, + 4065, + 1603, + 1604, + 1605, + 4064, + 1606, + 1607, + 1608, + 4067, + 1609, + 1610, + 1611, + 4066, + 1612, + 1613, + 1614, + 4069, + 1615, + 1616, + 1617, + 4068, + 1618, + 1619, + 1623, + 4070, + 1624, + 1646, + 4081, + 1647, + 1648, + 1649, + 4080, + 1650, + 1651, + 1652, + 4083, + 1653, + 1654, + 1655, + 4082, + 1656, + 1657, + 1658, + 4085, + 1659, + 1660, + 1661, + 4084, + 1662, + 1663, + 1664, + 4087, + 1665, + 1666, + 1667, + 4086, + 1668, + 1669, + 1670, + 4089, + 1671, + 1672, + 1673, + 4088, + 1674, + 1675, + 1676, + 4091, + 1677, + 1678, + 1679, + 4090, + 1680, + 1681, + 1682, + 4093, + 1683, + 1684, + 1685, + 4092, + 1686, + 1687, + 1688, + 4095, + 1689, + 1690, + 1691, + 4094, + 1692, + 1693; + 0.000425, + 0.000104, + 0.000002, + 0.000035, + 0.000035, + 0.173784, + 0.173784, + 0.011820, + 0.011820, + 0.036107, + 0.058210, + 0.058210, + 0.015899, + 0.072551, + 0.053340, + 0.030564, + 0.000976, + 0.009886, + 0.011481, + 0.041582, + 0.000054, + 0.101596, + 0.128895, + 0.500099, + 0.500099, + 0.524789, + 0.524789, + 0.524884, + 0.448852, + 0.448852, + 0.446014, + 0.496707, + 0.999615, + 0.999615, + 0.999998, + 1.000000, + 1.000000, + 1.000000, + 0.999927, + 0.999161, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 0.999738, + 0.999738, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 0.999990, + 0.732293, + 0.732293, + 0.886205, + 0.985333, + 0.992404, + 0.992404, + 0.959854, + 0.812284, + 0.489268, + 0.489268, + 0.456724, + 0.487872, + 0.558722, + 0.558722, + 0.534944, + 0.495299, + 0.141677, + 0.141677, + 0.042808, + 0.009349, + 0.010870, + 0.010870, + 0.042129, + 0.130213, + 0.000000, + 0.000000, + 0.000000, + 0.575208, + 0.575208, + 0.824904, + 0.845166, + 0.640010, + 0.640010, + 0.520401, + 0.503825, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 0.999994, + 0.999994, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 0.999999, + 0.999967, + 0.788284, + 0.788284, + 0.947229, + 0.980557, + 0.954581, + 0.954581, + 0.872298, + 0.693192, + 0.483189, + 0.483189, + 0.343736, + 0.320172, + 0.442659, + 0.442659, + 0.491581, + 0.499255, + 0.000025, + 0.000025, + 0.000001, + 0.000001, + 0.000008, + 0.000008, + 0.000046, + 0.000109, + 0.837055, + 0.837055, + 0.935635, + 0.848332, + 0.565414, + 0.565414, + 0.521500, + 0.625225, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 0.999937, + 0.999937, + 0.999993, + 0.999085, + 0.980304, + 0.980304, + 0.982841, + 0.998364, + 0.503262, + 0.503262, + 0.492041, + 0.498016, + 0.500000, + 0.500000, + 0.500000, + 0.500995, + 0.000473, + 0.000473, + 0.000211, + 0.000957, + 0.007196, + 0.007196, + 0.009105, + 0.002560, + 0.000000, + 0.000000, + 0.000000, + 0.806762, + 0.806762, + 0.893114, + 0.796246, + 0.590863, + 0.590863, + 0.572946, + 0.654485, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 0.999999, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 0.999991, + 0.994261, + 0.994261, + 0.999425, + 1.000000, + 0.999589, + 0.999589, + 0.987588, + 0.800337, + 0.665842, + 0.665842, + 0.779593, + 0.974322, + 0.046310, + 0.046310, + 0.022865, + 0.060048, + 0.146116, + 0.146116, + 0.153619, + 0.123733; + -0.888608,0.574719,0.718010,0.000000,-0.246358,-0.983825,0.482594,0.000000,1.006950,0.257891,1.039776,0.000000,-251.664520,12.497601,-18.882095,1.000000;; + } + + SkinWeights { + "Bip01_R_Finger0"; + 17; + 1408, + 1409, + 1411, + 1412, + 1413, + 4001, + 1433, + 4000, + 1434, + 3999, + 1435, + 3998, + 1436, + 1437, + 1440, + 4002, + 1441; + 0.500000, + 0.529583, + 0.538317, + 0.843910, + 0.999997, + 0.999997, + 0.539547, + 0.539547, + 0.533573, + 0.533573, + 0.500000, + 0.500000, + 0.503546, + 0.999995, + 0.000235, + 0.000235, + 0.000825; + -0.131865,1.109649,-0.621897,0.000000,0.164812,0.558010,0.960710,0.000000,1.446398,0.024759,-0.262513,0.000000,-184.977188,140.391739,-15.312693,1.000000;; + } + + SkinWeights { + "Bip01_R_Finger01"; + 16; + 1411, + 1412, + 1413, + 4001, + 1435, + 3998, + 1437, + 1438, + 4003, + 1439, + 1440, + 4002, + 1441, + 1442, + 1445, + 4004; + 0.461683, + 0.156090, + 0.000003, + 0.000003, + 0.500000, + 0.500000, + 0.000006, + 0.948481, + 0.948481, + 1.000000, + 0.999765, + 0.999765, + 0.999175, + 1.000000, + 0.012123, + 0.012123; + -0.588468,0.949955,-0.621897,0.000000,-0.086455,0.575381,0.960710,0.000000,1.300418,0.633713,-0.262513,0.000000,-236.109512,44.805492,-15.312693,1.000000;; + } + + SkinWeights { + "Bip01_R_Finger02"; + 14; + 1443, + 4005, + 1444, + 1445, + 4004, + 1446, + 1447, + 1448, + 4007, + 1449, + 1450, + 4006, + 1451, + 1452; + 0.999688, + 0.999688, + 1.000000, + 0.987877, + 0.987877, + 0.998560, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000; + -0.322550,1.069893,-0.621897,0.000000,0.065410,0.578152,0.960710,0.000000,1.420124,0.275547,-0.262513,0.000000,-222.226196,105.931374,-15.312693,1.000000;; + } + + SkinWeights { + "Bip01_R_Finger12"; + 214; + 1484, + 4021, + 1489, + 1490, + 4023, + 1491, + 1492, + 1493, + 4022, + 1494, + 1495, + 1496, + 4025, + 1497, + 1498, + 1499, + 4024, + 1500, + 1501, + 1502, + 4027, + 1503, + 1504, + 1505, + 4026, + 1506, + 1507, + 1508, + 4029, + 1509, + 1510, + 1511, + 4028, + 1512, + 1513, + 1514, + 4031, + 1515, + 1516, + 1517, + 4030, + 1518, + 1519, + 1520, + 4033, + 1521, + 4032, + 1534, + 4040, + 1537, + 4039, + 1538, + 1539, + 1540, + 4042, + 1541, + 1542, + 1543, + 4041, + 1544, + 1545, + 1546, + 4044, + 1547, + 1548, + 1549, + 4043, + 1550, + 1551, + 1552, + 4046, + 1553, + 1554, + 1555, + 4045, + 1556, + 1557, + 1558, + 4048, + 1559, + 1560, + 1561, + 4047, + 1562, + 1563, + 1564, + 4050, + 1565, + 1566, + 1567, + 4049, + 1568, + 1569, + 1570, + 4052, + 1571, + 1572, + 1573, + 4051, + 1574, + 1575, + 1576, + 4054, + 1577, + 1578, + 1579, + 4053, + 1580, + 1581, + 1582, + 4056, + 1583, + 4055, + 1600, + 1602, + 4065, + 1603, + 1604, + 1605, + 4064, + 1606, + 1607, + 1608, + 4067, + 1609, + 1610, + 1611, + 4066, + 1612, + 1613, + 1614, + 4069, + 1615, + 1616, + 1617, + 4068, + 1618, + 1619, + 1620, + 4071, + 1621, + 1622, + 1623, + 4070, + 1624, + 1625, + 1626, + 4073, + 1627, + 1628, + 1629, + 4072, + 1630, + 1631, + 1632, + 4075, + 1633, + 1634, + 1635, + 4074, + 1636, + 1637, + 1638, + 4077, + 1639, + 1640, + 1641, + 4076, + 1642, + 1643, + 1644, + 4079, + 1645, + 4078, + 1678, + 1679, + 4090, + 1680, + 1682, + 4093, + 1683, + 1684, + 1685, + 4092, + 1686, + 1687, + 1688, + 4095, + 1689, + 1690, + 1691, + 4094, + 1692, + 1693, + 1694, + 4097, + 1695, + 1696, + 1697, + 4096, + 1698, + 1699, + 1700, + 4099, + 1701, + 1702, + 1703, + 4098, + 1704, + 1705, + 1706, + 4101, + 1707, + 4100; + 0.000262, + 0.000262, + 0.000010, + 0.267707, + 0.267707, + 0.113795, + 0.014667, + 0.007596, + 0.007596, + 0.040146, + 0.187716, + 0.510732, + 0.510732, + 0.543276, + 0.512128, + 0.441278, + 0.441278, + 0.465056, + 0.504701, + 0.858323, + 0.858323, + 0.957192, + 0.990651, + 0.989130, + 0.989130, + 0.957871, + 0.869787, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 0.000006, + 0.000006, + 0.000000, + 0.000000, + 0.000001, + 0.000033, + 0.211716, + 0.211716, + 0.052771, + 0.019443, + 0.045419, + 0.045419, + 0.127702, + 0.306808, + 0.516811, + 0.516811, + 0.656264, + 0.679828, + 0.557341, + 0.557341, + 0.508419, + 0.500745, + 0.999975, + 0.999975, + 0.999999, + 0.999999, + 0.999992, + 0.999992, + 0.999954, + 0.999891, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 0.000000, + 0.000063, + 0.000063, + 0.000007, + 0.000915, + 0.019696, + 0.019696, + 0.017159, + 0.001636, + 0.496738, + 0.496738, + 0.507959, + 0.501984, + 0.500000, + 0.500000, + 0.500000, + 0.499005, + 0.999527, + 0.999527, + 0.999789, + 0.999043, + 0.992804, + 0.992804, + 0.990895, + 0.997440, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 0.000009, + 0.005739, + 0.005739, + 0.000575, + 0.000411, + 0.000411, + 0.012412, + 0.199663, + 0.334158, + 0.334158, + 0.220407, + 0.025678, + 0.953690, + 0.953690, + 0.977135, + 0.939952, + 0.853884, + 0.853884, + 0.846381, + 0.876267, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000; + -0.888608,0.574719,0.718010,0.000000,-0.246358,-0.983825,0.482594,0.000000,1.006950,0.257891,1.039776,0.000000,-262.514587,12.497601,-18.882095,1.000000;; + } + + SkinWeights { + "Bip01_Head"; + 1955; + 1746, + 4135, + 1747, + 4276, + 4217, + 4192, + 1748, + 4279, + 4255, + 4210, + 4195, + 4167, + 1749, + 1750, + 4250, + 4246, + 4219, + 4163, + 4160, + 1751, + 4289, + 4275, + 4208, + 4203, + 4191, + 4178, + 4176, + 1752, + 4137, + 1753, + 4278, + 4260, + 4257, + 4194, + 4171, + 1754, + 4307, + 4249, + 1755, + 4324, + 1756, + 4200, + 4188, + 4166, + 4134, + 1757, + 4193, + 4156, + 4126, + 4125, + 4122, + 4120, + 1758, + 4197, + 4196, + 4152, + 4124, + 4121, + 1759, + 4199, + 4162, + 4161, + 4128, + 4127, + 4123, + 1760, + 1761, + 4333, + 4201, + 4186, + 4180, + 4170, + 4165, + 1762, + 1763, + 4140, + 1764, + 4202, + 4198, + 4169, + 4157, + 4154, + 4151, + 1765, + 4205, + 4159, + 4129, + 1766, + 4190, + 4146, + 4143, + 1767, + 4149, + 4132, + 1768, + 4148, + 1769, + 4131, + 1770, + 4139, + 1771, + 4138, + 1772, + 4136, + 1773, + 4142, + 1774, + 4187, + 1775, + 4144, + 1776, + 4145, + 1777, + 4147, + 4141, + 1778, + 4133, + 1779, + 4150, + 4130, + 1780, + 4332, + 1781, + 4175, + 1782, + 4347, + 4164, + 1783, + 4348, + 4181, + 1784, + 4179, + 4173, + 4168, + 4155, + 1785, + 4350, + 4349, + 4206, + 4158, + 1786, + 4351, + 4204, + 4183, + 1787, + 4356, + 1788, + 4306, + 4184, + 4182, + 1789, + 4346, + 4185, + 1790, + 1791, + 1792, + 1793, + 1794, + 1795, + 1796, + 1797, + 1798, + 1799, + 1800, + 1801, + 1802, + 1803, + 1804, + 4174, + 4172, + 1806, + 1807, + 1808, + 1809, + 1810, + 1811, + 1812, + 1813, + 4207, + 1814, + 1815, + 1816, + 1817, + 1818, + 4189, + 1819, + 1820, + 1821, + 1822, + 1823, + 1824, + 1825, + 1826, + 1827, + 1828, + 1829, + 1830, + 1831, + 1832, + 1833, + 1834, + 1835, + 1836, + 1837, + 1838, + 1839, + 1840, + 1841, + 1842, + 1843, + 1844, + 1845, + 1846, + 1847, + 1848, + 1849, + 1850, + 1851, + 1852, + 1853, + 1854, + 1855, + 1856, + 1857, + 1858, + 1859, + 1860, + 1861, + 1862, + 1863, + 1864, + 1865, + 1866, + 1867, + 1868, + 1869, + 1870, + 1871, + 1872, + 1873, + 1874, + 1875, + 1876, + 1877, + 1878, + 1879, + 1880, + 4177, + 1881, + 1882, + 1883, + 1884, + 1885, + 1886, + 4378, + 1887, + 4284, + 4271, + 4254, + 4226, + 1888, + 4277, + 4242, + 4216, + 4215, + 4212, + 4209, + 1889, + 4281, + 4280, + 4239, + 4214, + 4211, + 1890, + 4283, + 4248, + 4247, + 4220, + 4218, + 4213, + 1891, + 1892, + 4389, + 4287, + 4270, + 4264, + 4259, + 4252, + 1893, + 1894, + 4229, + 1895, + 4288, + 4282, + 4258, + 4243, + 4240, + 4238, + 1896, + 4291, + 4245, + 4221, + 1897, + 4386, + 4274, + 4232, + 1898, + 4236, + 4223, + 1899, + 4225, + 1900, + 4224, + 1901, + 4230, + 1902, + 4228, + 1903, + 4227, + 1904, + 4234, + 1905, + 4272, + 1906, + 4233, + 1907, + 4429, + 1908, + 4387, + 4231, + 1909, + 4235, + 1910, + 4237, + 4222, + 1911, + 4390, + 1912, + 4404, + 1913, + 4403, + 4251, + 1914, + 4406, + 4265, + 1915, + 4388, + 4263, + 4256, + 4241, + 1916, + 4408, + 4407, + 4294, + 4292, + 4244, + 1917, + 4409, + 4295, + 4290, + 4267, + 1918, + 4415, + 1919, + 4308, + 4268, + 4266, + 1920, + 4402, + 4269, + 1921, + 1922, + 1923, + 1924, + 1925, + 1926, + 1927, + 1928, + 1929, + 1930, + 1931, + 1932, + 1933, + 1934, + 1935, + 4405, + 4261, + 1937, + 1938, + 1939, + 1940, + 1941, + 1942, + 1943, + 1944, + 4293, + 1945, + 1946, + 1947, + 1948, + 1949, + 4273, + 1950, + 1951, + 1952, + 1953, + 1954, + 1955, + 1956, + 1957, + 1958, + 1959, + 1960, + 1961, + 1962, + 1963, + 1964, + 1965, + 1966, + 1967, + 1968, + 1969, + 1970, + 1971, + 1972, + 1973, + 1974, + 1975, + 1976, + 1977, + 1978, + 1979, + 1980, + 1981, + 1982, + 1983, + 1984, + 1985, + 1986, + 1987, + 1988, + 1989, + 1990, + 1991, + 1992, + 1993, + 1994, + 1995, + 1996, + 1997, + 1998, + 4285, + 1999, + 4286, + 2000, + 2001, + 2002, + 2003, + 2004, + 2005, + 2006, + 2007, + 2008, + 2009, + 2010, + 2011, + 4262, + 2012, + 2013, + 2014, + 2015, + 2016, + 2017, + 2018, + 2019, + 2020, + 2021, + 2022, + 2023, + 2024, + 2025, + 2026, + 2027, + 2028, + 2029, + 2030, + 2031, + 2032, + 2033, + 2034, + 2035, + 2036, + 2037, + 2038, + 2039, + 2040, + 2041, + 2042, + 2043, + 2044, + 2045, + 2046, + 2047, + 2048, + 2049, + 2050, + 2051, + 2052, + 2053, + 2054, + 2055, + 2056, + 2057, + 2058, + 2059, + 2060, + 2061, + 2062, + 2063, + 2064, + 2065, + 2066, + 2067, + 2068, + 2069, + 2070, + 2071, + 2072, + 2073, + 2074, + 2075, + 2076, + 2077, + 2078, + 2079, + 2080, + 2081, + 2082, + 2083, + 2084, + 2085, + 2086, + 2087, + 2088, + 2089, + 2090, + 2091, + 2092, + 2093, + 4304, + 2094, + 4296, + 2095, + 4298, + 2096, + 4301, + 2097, + 4303, + 2098, + 4305, + 2099, + 2100, + 2106, + 2107, + 2109, + 4312, + 2110, + 4315, + 2111, + 2112, + 2113, + 2114, + 2115, + 4316, + 2116, + 4319, + 2117, + 2118, + 2119, + 2120, + 2121, + 2122, + 4322, + 2123, + 2124, + 4321, + 2125, + 2126, + 2127, + 2128, + 2129, + 2130, + 2131, + 4327, + 2132, + 4326, + 2133, + 2134, + 2135, + 2136, + 2137, + 2138, + 2139, + 2140, + 4320, + 2141, + 4330, + 2142, + 2143, + 2144, + 2145, + 2146, + 4153, + 2147, + 2148, + 2149, + 2150, + 2151, + 4335, + 2152, + 4339, + 2153, + 4338, + 2154, + 4336, + 2155, + 2156, + 2157, + 2158, + 2159, + 2160, + 2161, + 2162, + 2163, + 2164, + 2165, + 2166, + 2167, + 2168, + 2169, + 2170, + 2171, + 2172, + 2173, + 2174, + 2175, + 2176, + 2177, + 2178, + 2179, + 2180, + 2181, + 2182, + 2183, + 2184, + 2185, + 2186, + 2187, + 2188, + 2189, + 2190, + 2191, + 2192, + 2193, + 2194, + 2195, + 2196, + 2197, + 2198, + 2199, + 2200, + 2201, + 2202, + 2203, + 4328, + 2204, + 2205, + 2206, + 2207, + 2208, + 4318, + 2209, + 2210, + 2211, + 4340, + 2212, + 2213, + 2214, + 2215, + 2216, + 2217, + 2218, + 2219, + 2220, + 2221, + 2222, + 2223, + 2224, + 2225, + 2226, + 2227, + 2228, + 2229, + 2230, + 2231, + 2232, + 2233, + 2234, + 2235, + 2236, + 2237, + 2238, + 2239, + 2240, + 2241, + 2242, + 2243, + 2244, + 2245, + 2246, + 2247, + 2248, + 2249, + 2250, + 2251, + 2252, + 2253, + 2254, + 2255, + 2256, + 2257, + 2258, + 2259, + 2260, + 2261, + 2262, + 2263, + 2264, + 2265, + 2266, + 2267, + 2268, + 2269, + 2270, + 2271, + 2272, + 2273, + 2274, + 2275, + 2276, + 2277, + 2278, + 2279, + 2280, + 2281, + 2282, + 2283, + 2284, + 2285, + 2286, + 2287, + 2288, + 2289, + 2290, + 2291, + 2292, + 2293, + 2294, + 2295, + 2296, + 2297, + 2298, + 2299, + 2300, + 2301, + 2302, + 2303, + 2304, + 2305, + 2306, + 2307, + 2308, + 2309, + 4341, + 2310, + 4345, + 2311, + 2312, + 2313, + 2314, + 2315, + 2316, + 4343, + 2317, + 2318, + 2319, + 2320, + 2321, + 2322, + 2323, + 2324, + 2325, + 2326, + 2327, + 2328, + 2329, + 2330, + 2331, + 2332, + 2333, + 2334, + 2335, + 2336, + 2337, + 2338, + 2339, + 2340, + 2341, + 2342, + 2343, + 2344, + 2345, + 2346, + 2347, + 2348, + 2349, + 2350, + 2351, + 2352, + 2353, + 2354, + 2355, + 2356, + 2357, + 2358, + 2359, + 2360, + 2361, + 2362, + 2363, + 2364, + 2365, + 2366, + 2367, + 2368, + 2369, + 2370, + 2371, + 2372, + 2373, + 2374, + 2375, + 2376, + 2377, + 2378, + 2379, + 2380, + 2381, + 2382, + 2383, + 2384, + 2385, + 2386, + 4329, + 2387, + 2388, + 2389, + 2390, + 2391, + 2392, + 2393, + 2394, + 4302, + 2395, + 4323, + 2396, + 2397, + 2398, + 4317, + 2399, + 4313, + 2400, + 2401, + 2402, + 2403, + 2404, + 2405, + 4352, + 2406, + 4300, + 2407, + 2408, + 2409, + 4354, + 2410, + 4358, + 2411, + 2412, + 2414, + 4355, + 2417, + 2419, + 2420, + 2421, + 2424, + 2425, + 2426, + 4359, + 4357, + 4353, + 2427, + 2428, + 2429, + 2430, + 2431, + 2432, + 2433, + 2434, + 2435, + 2436, + 2437, + 2438, + 2439, + 2440, + 2441, + 2442, + 2443, + 2444, + 2445, + 2446, + 2447, + 2448, + 2449, + 2450, + 2451, + 2452, + 2453, + 2454, + 2455, + 2456, + 2457, + 2458, + 2459, + 2460, + 2461, + 2462, + 2463, + 2464, + 2465, + 2466, + 2467, + 2468, + 2469, + 2470, + 2471, + 2472, + 2473, + 2474, + 2475, + 2476, + 2477, + 2478, + 2479, + 2480, + 2481, + 2482, + 2483, + 4344, + 2484, + 4362, + 2485, + 2486, + 4334, + 2487, + 4364, + 2488, + 2489, + 2490, + 2491, + 2492, + 2493, + 4363, + 2494, + 4365, + 2495, + 4342, + 2496, + 2497, + 4366, + 2498, + 4368, + 2499, + 4337, + 2500, + 2501, + 2502, + 4361, + 2503, + 4369, + 2504, + 4367, + 2505, + 2506, + 2507, + 2508, + 2509, + 2510, + 2511, + 2512, + 2513, + 2514, + 2515, + 2516, + 2517, + 2518, + 2519, + 2520, + 2521, + 2522, + 2523, + 2524, + 2525, + 2526, + 2527, + 2528, + 2529, + 2530, + 2531, + 2532, + 2533, + 2534, + 2535, + 2536, + 2537, + 2538, + 2539, + 2540, + 2541, + 2542, + 2543, + 2544, + 2545, + 2546, + 2547, + 2548, + 2549, + 2550, + 2551, + 2552, + 2553, + 2554, + 2555, + 2556, + 2557, + 2558, + 2559, + 2560, + 2561, + 2562, + 2563, + 2564, + 2565, + 2566, + 2567, + 2568, + 2569, + 2570, + 2571, + 2572, + 2573, + 2574, + 2575, + 2576, + 2577, + 2578, + 2579, + 2580, + 2581, + 2582, + 2583, + 2584, + 2585, + 2586, + 2587, + 2588, + 2589, + 2590, + 2591, + 2592, + 2593, + 2594, + 2595, + 2596, + 2597, + 2598, + 2599, + 2600, + 2601, + 2602, + 2603, + 2604, + 2605, + 2606, + 2607, + 2608, + 2609, + 2610, + 2611, + 2612, + 2613, + 2614, + 2615, + 2616, + 2617, + 2618, + 2619, + 2620, + 2621, + 2622, + 2623, + 2624, + 2625, + 2626, + 2627, + 2628, + 2629, + 2630, + 2631, + 2632, + 2633, + 2634, + 2635, + 2636, + 2637, + 2638, + 2639, + 2640, + 2641, + 2642, + 2643, + 2644, + 2645, + 2646, + 2647, + 2648, + 2649, + 2650, + 2651, + 2652, + 2653, + 2654, + 2655, + 2656, + 2657, + 2658, + 2659, + 2660, + 2661, + 2662, + 2663, + 2664, + 2665, + 2666, + 2667, + 2668, + 2669, + 2670, + 2671, + 2672, + 2673, + 2674, + 2675, + 2676, + 2677, + 2678, + 2679, + 2680, + 2681, + 2682, + 2683, + 2684, + 2685, + 2686, + 2687, + 2688, + 2689, + 2690, + 2691, + 2692, + 2693, + 2694, + 2695, + 2696, + 2697, + 2698, + 2699, + 2700, + 2701, + 2702, + 2703, + 2704, + 4331, + 2705, + 2706, + 2707, + 4325, + 2708, + 2709, + 2710, + 2711, + 2712, + 2713, + 2714, + 2715, + 2716, + 2717, + 2718, + 2719, + 2720, + 2721, + 2722, + 2723, + 2724, + 2725, + 2726, + 2727, + 2728, + 2729, + 2730, + 2731, + 2732, + 2733, + 2734, + 2735, + 2736, + 2737, + 2738, + 2739, + 2740, + 2741, + 2742, + 2743, + 2744, + 2745, + 2746, + 2747, + 2748, + 2749, + 2750, + 2751, + 2752, + 2753, + 2754, + 2755, + 2756, + 2757, + 2758, + 2759, + 2760, + 2761, + 2762, + 2763, + 2764, + 2765, + 2766, + 2767, + 2768, + 2769, + 2770, + 2771, + 2772, + 4370, + 2773, + 4372, + 2774, + 2775, + 2776, + 4375, + 2777, + 2778, + 2779, + 2780, + 4376, + 2781, + 4379, + 2782, + 2783, + 2784, + 2785, + 2786, + 2787, + 2788, + 4381, + 2789, + 2790, + 2791, + 2792, + 2793, + 2794, + 2795, + 2796, + 4377, + 2797, + 2798, + 2799, + 2800, + 2801, + 4253, + 2802, + 4385, + 2803, + 2804, + 2805, + 2806, + 2807, + 2808, + 2809, + 2810, + 4392, + 2811, + 4395, + 2812, + 4396, + 2813, + 4393, + 2814, + 2815, + 2816, + 2817, + 2818, + 2819, + 2820, + 2821, + 2822, + 2823, + 2824, + 2825, + 2826, + 2827, + 2828, + 2829, + 2830, + 2831, + 2832, + 2833, + 2834, + 2835, + 2836, + 2837, + 2838, + 2839, + 2840, + 2841, + 2842, + 2843, + 2844, + 2845, + 2846, + 2847, + 2848, + 2849, + 2850, + 2851, + 2852, + 2853, + 2854, + 2855, + 2856, + 2857, + 4380, + 2858, + 2859, + 2860, + 2861, + 4397, + 2862, + 2863, + 2864, + 4371, + 2865, + 2866, + 2867, + 2868, + 2869, + 2870, + 2871, + 2872, + 2873, + 2874, + 2875, + 2876, + 2877, + 2878, + 2879, + 2880, + 2881, + 2882, + 2883, + 2884, + 2885, + 2886, + 2887, + 2888, + 2889, + 2890, + 2891, + 2892, + 2893, + 2894, + 2895, + 2896, + 2897, + 2898, + 2899, + 2900, + 2901, + 2902, + 2903, + 2904, + 2905, + 2906, + 2907, + 2908, + 2909, + 2910, + 2911, + 2912, + 2913, + 2914, + 2915, + 2916, + 2917, + 2918, + 2919, + 2920, + 2921, + 2922, + 2923, + 2924, + 2925, + 2926, + 2927, + 2928, + 2929, + 2930, + 2931, + 2932, + 2933, + 2934, + 2935, + 2936, + 2937, + 2938, + 2939, + 2940, + 2941, + 2942, + 2943, + 2944, + 2945, + 2946, + 2947, + 2948, + 2949, + 2950, + 2951, + 2952, + 2953, + 2954, + 2955, + 2956, + 2957, + 2958, + 2959, + 2960, + 2961, + 2962, + 2963, + 2964, + 2965, + 2966, + 4398, + 2967, + 4400, + 2968, + 2969, + 2970, + 2971, + 2972, + 2973, + 2974, + 2975, + 2976, + 2977, + 2978, + 2979, + 2980, + 2981, + 2982, + 2983, + 2984, + 2985, + 2986, + 2987, + 2988, + 2989, + 2990, + 2991, + 2992, + 2993, + 2994, + 2995, + 2996, + 2997, + 2998, + 2999, + 3000, + 3001, + 3002, + 3003, + 3004, + 3005, + 3006, + 3007, + 3008, + 3009, + 3010, + 3011, + 3012, + 3013, + 3014, + 3015, + 3016, + 3017, + 3018, + 3019, + 3020, + 3021, + 3022, + 3023, + 3024, + 3025, + 3026, + 3027, + 3028, + 3029, + 3030, + 3031, + 3032, + 3033, + 3034, + 3035, + 3036, + 3037, + 3038, + 3039, + 3040, + 3041, + 3042, + 3043, + 3044, + 4383, + 3045, + 3046, + 3047, + 3048, + 3049, + 4374, + 3050, + 4297, + 3051, + 3052, + 3053, + 3054, + 3055, + 3056, + 4314, + 3057, + 4373, + 3058, + 3059, + 3060, + 3061, + 3062, + 3063, + 3064, + 3065, + 4416, + 4411, + 3066, + 4414, + 3067, + 3068, + 3069, + 4299, + 3070, + 3072, + 4413, + 3075, + 3077, + 3078, + 3079, + 3082, + 3083, + 3084, + 3085, + 3086, + 4412, + 4410, + 3087, + 3088, + 3089, + 3090, + 3091, + 3092, + 3093, + 3094, + 3095, + 3096, + 3097, + 3098, + 3099, + 3100, + 3101, + 3102, + 3103, + 3104, + 3105, + 3106, + 3107, + 3108, + 3109, + 3110, + 3111, + 3112, + 3113, + 3114, + 3115, + 3116, + 3117, + 3118, + 3119, + 3120, + 3121, + 3122, + 3123, + 3124, + 3125, + 3126, + 3127, + 3128, + 3129, + 3130, + 3131, + 3132, + 3133, + 3134, + 3135, + 3136, + 3137, + 3138, + 3139, + 3140, + 3141, + 4418, + 3142, + 4401, + 3143, + 3144, + 3145, + 3146, + 4420, + 3147, + 4394, + 3148, + 3149, + 4422, + 3150, + 4421, + 3151, + 3152, + 3153, + 3154, + 4399, + 3155, + 4391, + 3156, + 4425, + 3157, + 4424, + 3158, + 3159, + 3160, + 3161, + 3162, + 3163, + 4423, + 3164, + 4426, + 3165, + 4419, + 3166, + 3167, + 3168, + 3169, + 3170, + 3171, + 3172, + 3173, + 3174, + 3175, + 3176, + 3177, + 3178, + 3179, + 3180, + 3181, + 3182, + 3183, + 3184, + 3185, + 3186, + 3187, + 3188, + 3189, + 3190, + 3191, + 3192, + 3193, + 3194, + 3195, + 3196, + 3197, + 3198, + 3199, + 3200, + 3201, + 3202, + 3203, + 3204, + 3205, + 3206, + 3207, + 3208, + 3209, + 3210, + 3211, + 3212, + 3213, + 3214, + 3215, + 3216, + 3217, + 3218, + 3219, + 3220, + 3221, + 3222, + 3223, + 3224, + 3225, + 3226, + 3227, + 3228, + 3229, + 3230, + 3231, + 3232, + 3233, + 3234, + 3235, + 3236, + 3237, + 3238, + 3239, + 3240, + 3241, + 3242, + 3243, + 3244, + 3245, + 3246, + 3247, + 3248, + 3249, + 3250, + 3251, + 3252, + 3253, + 3254, + 3255, + 3256, + 3257, + 3258, + 3259, + 3260, + 3261, + 3262, + 3263, + 3264, + 3265, + 3266, + 3267, + 3268, + 3269, + 3270, + 3271, + 3272, + 3273, + 3274, + 3275, + 3276, + 3277, + 3278, + 3279, + 3280, + 3281, + 3282, + 3283, + 3284, + 3285, + 3286, + 3287, + 3288, + 3289, + 3290, + 3291, + 3292, + 3293, + 3294, + 3295, + 3296, + 3297, + 3298, + 3299, + 3300, + 3301, + 3302, + 3303, + 3304, + 3305, + 3306, + 3307, + 3308, + 3309, + 3310, + 3311, + 3312, + 3313, + 3314, + 3315, + 3316, + 3317, + 3318, + 3319, + 3320, + 3321, + 3322, + 3323, + 3324, + 3325, + 3326, + 3327, + 3328, + 3329, + 3330, + 3331, + 3332, + 3333, + 3334, + 3335, + 3336, + 3337, + 3338, + 3339, + 3340, + 3341, + 3342, + 3343, + 3344, + 3345, + 3346, + 3347, + 3348, + 3349, + 3350, + 3351, + 3352, + 3353, + 3354, + 3355, + 3356, + 3357, + 3358, + 3359, + 3360, + 3361, + 3362, + 3363, + 3364, + 4384, + 3365, + 3366, + 4382, + 3367, + 3368, + 3369, + 3370, + 3371, + 3372, + 3373, + 3374, + 3375, + 3376, + 3377, + 3378, + 3379, + 3380, + 3381, + 3382, + 3383, + 3384, + 3385, + 3386, + 3387, + 3388, + 3389, + 3390, + 3391, + 3392, + 3393, + 3394, + 3395, + 3396, + 3397, + 3398, + 3399, + 3400, + 3401, + 3402, + 3403, + 3404, + 3405, + 3406, + 3407, + 3408, + 3409, + 3410, + 3411, + 3412, + 3413, + 3414, + 3415, + 3416, + 3417; + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 0.970101, + 0.970101, + 0.970101, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 0.999437, + 0.999437, + 0.999437, + 0.999437, + 0.552841, + 0.552841, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 0.999259, + 0.999259, + 0.999259, + 0.999259, + 0.999259, + 0.547701, + 0.547701, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 0.999744, + 0.999735, + 0.887760, + 0.887760, + 0.497118, + 0.497118, + 0.339849, + 0.339849, + 0.339658, + 0.339658, + 0.498042, + 0.498042, + 0.889854, + 0.889854, + 0.693299, + 0.692637, + 0.033561, + 0.033541, + 0.999907, + 0.999907, + 0.999906, + 0.999906, + 0.999362, + 0.999363, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 0.999999, + 0.993695, + 0.713304, + 0.713304, + 0.897813, + 0.897813, + 1.000000, + 0.999983, + 0.999999, + 0.999999, + 0.999942, + 0.999942, + 0.999393, + 0.999732, + 0.567551, + 0.515509, + 0.855685, + 0.985010, + 0.985010, + 0.498224, + 0.498224, + 0.310874, + 0.383672, + 0.501663, + 0.501663, + 0.707005, + 0.707005, + 0.680489, + 0.510297, + 0.029527, + 0.029527, + 0.013410, + 0.956949, + 0.651153, + 0.930744, + 1.000000, + 1.000000, + 0.999386, + 0.999386, + 0.999386, + 0.999386, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 0.888821, + 0.888821, + 0.704999, + 0.704999, + 0.992606, + 0.999999, + 1.000000, + 1.000000, + 0.999388, + 0.999941, + 0.999941, + 0.999999, + 0.999999, + 0.999982, + 0.999729, + 0.562194, + 0.982777, + 0.848121, + 0.513370, + 0.669851, + 0.696438, + 0.696438, + 0.696438, + 0.501175, + 0.501175, + 0.384953, + 0.312190, + 0.498315, + 0.498315, + 0.508731, + 0.029902, + 0.029902, + 0.013492, + 0.953945, + 0.928954, + 0.647332, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 0.999125, + 0.999125, + 0.999125, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000; + 0.000000,-0.000002,1.278853,0.000000,1.112235,-0.156313,-0.000000,0.000000,0.204616,1.455927,0.000002,0.000000,-61.950306,-62.105236,-0.142288,1.000000;; + } + } + } + } + + Frame Box01 { + + + FrameTransformMatrix { + -1.000000,0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-88.696747,-246.341751,858.815247,1.000000;; + } + + Frame Bip01 { + + + FrameTransformMatrix { + 0.186552,-0.974653,0.123489,0.000000,0.982171,0.187991,0.000000,0.000000,-0.023215,0.121288,0.992346,0.000000,-88.977890,-857.346008,247.541595,1.000000;; + } + + Frame Bip01_Footsteps { + + + FrameTransformMatrix { + 0.186552,0.982171,-0.023215,0.000000,-0.974653,0.187991,0.121288,0.000000,0.123489,-0.000000,0.992346,0.000000,-31.624149,0.000000,-254.128143,1.000000;; + } + } + + Frame Bip01_Pelvis { + + + FrameTransformMatrix { + -0.000000,0.011807,0.999930,0.000000,1.000000,0.000001,-0.000000,0.000000,-0.000001,0.999930,-0.011807,0.000000,-2.454305,-1.950977,-0.000005,1.000000;; + } + + Frame Bip01_Spine { + + + FrameTransformMatrix { + 0.999137,0.041531,0.000982,0.000000,-0.040353,0.975880,-0.214545,0.000000,-0.009868,0.214320,0.976714,0.000000,27.422213,8.709480,-0.319006,1.000000;; + } + + Frame Bip01_Spine1 { + + + FrameTransformMatrix { + 0.984808,-0.173648,-0.000000,0.000000,0.173648,0.984808,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,28.178080,-0.022084,0.000000,1.000000;; + } + + Frame Bip01_Spine2 { + + + FrameTransformMatrix { + 0.999958,0.008483,0.003477,0.000000,-0.008313,0.998890,-0.046374,0.000000,-0.003867,0.046343,0.998918,0.000000,28.182159,-0.022430,0.001040,1.000000;; + } + + Frame Bip01_Spine3 { + + + FrameTransformMatrix { + 0.999837,-0.017696,0.003477,0.000000,0.017838,0.998765,-0.046374,0.000000,-0.002652,0.046428,0.998918,0.000000,28.181417,-0.033880,0.001568,1.000000;; + } + + Frame Bip01_Neck { + + + FrameTransformMatrix { + 0.861629,0.507538,0.000001,0.000000,-0.507538,0.861629,-0.000000,0.000000,-0.000001,-0.000000,1.000000,0.000000,42.566055,-0.019138,0.000001,1.000000;; + } + + Frame Bip01_Head { + + + FrameTransformMatrix { + 0.979775,-0.188667,-0.066683,0.000000,0.195389,0.973921,0.115333,0.000000,0.043184,-0.126029,0.991086,0.000000,27.900173,0.000003,0.000000,1.000000;; + } + + Frame Dummy21 { + + + FrameTransformMatrix { + 1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,59.615768,0.000027,0.000002,1.000000;; + } + } + } + + Frame Bip01_L_Clavicle { + + + FrameTransformMatrix { + -0.185356,0.308957,0.932839,0.000000,-0.499811,-0.846968,0.181203,0.000000,0.846069,-0.432656,0.311411,0.000000,-12.374969,4.006883,8.346215,1.000000;; + } + + Frame Bip01_L_UpperArm { + + + FrameTransformMatrix { + 0.640423,0.117307,-0.759011,0.000000,0.064965,0.976451,0.205728,0.000000,0.765270,-0.181062,0.617720,0.000000,31.000208,-0.000032,-0.000004,1.000000;; + } + + Frame Bip01_L_Forearm { + + + FrameTransformMatrix { + 0.485335,-0.874328,-0.000000,0.000000,0.874328,0.485335,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,89.202522,-0.000023,0.000014,1.000000;; + } + + Frame Bip01_L_Hand { + + + FrameTransformMatrix { + 0.999511,-0.027531,-0.014824,0.000000,-0.015327,-0.018154,-0.999718,0.000000,0.027254,0.999456,-0.018567,0.000000,61.671467,0.000001,-0.000001,1.000000;; + } + + Frame Bip01_L_Finger0 { + + + FrameTransformMatrix { + 0.713247,-0.002867,-0.700906,0.000000,-0.700353,-0.042855,-0.712509,0.000000,-0.027995,0.999077,-0.032574,0.000000,12.410522,3.054963,-10.755418,1.000000;; + } + + Frame Bip01_L_Finger01 { + + + FrameTransformMatrix { + 1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,10.075084,0.000006,-0.000007,1.000000;; + } + + Frame Bip01_L_Finger02 { + + + FrameTransformMatrix { + 1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,5.961566,-0.000008,0.000006,1.000000;; + } + + Frame Dummy06 { + + + FrameTransformMatrix { + 1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,5.961566,-0.000008,0.000003,1.000000;; + } + } + } + } + } + + Frame Bip01_L_Finger1 { + + + FrameTransformMatrix { + 1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000796,0.000000,0.000000,0.000796,1.000000,0.000000,24.087988,0.354694,-0.505022,1.000000;; + } + + Frame Bip01_L_Finger11 { + + + FrameTransformMatrix { + 1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,9.300090,-0.000022,-0.000024,1.000000;; + } + + Frame Bip01_L_Finger12 { + + + FrameTransformMatrix { + 1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,10.850065,0.000028,0.000040,1.000000;; + } + + Frame Dummy03 { + + + FrameTransformMatrix { + 1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,11.207734,-0.000002,-0.000004,1.000000;; + } + } + } + } + } + } + } + } + } + + Frame Bip01_R_Clavicle { + + + FrameTransformMatrix { + -0.397155,0.379708,-0.835518,0.000000,-0.502616,-0.851720,-0.148157,0.000000,-0.767883,0.361103,0.529112,0.000000,-12.374941,4.006959,-8.346190,1.000000;; + } + + Frame Bip01_R_UpperArm { + + + FrameTransformMatrix { + 0.532891,0.645602,0.547015,0.000000,-0.380503,0.760229,-0.526564,0.000000,-0.755807,0.072461,0.650772,0.000000,31.000195,-0.000004,0.000004,1.000000;; + } + + Frame Bip01_R_Forearm { + + + FrameTransformMatrix { + 0.881719,-0.471776,0.000000,0.000000,0.471776,0.881718,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,89.202530,-0.000026,0.000000,1.000000;; + } + + Frame Bip01_R_Hand { + + + FrameTransformMatrix { + 0.999848,-0.010016,0.014267,0.000000,-0.014446,-0.018025,0.999733,0.000000,-0.009756,-0.999787,-0.018167,0.000000,61.671482,0.000009,-0.000000,1.000000;; + } + + Frame Bip01_R_Finger0 { + + + FrameTransformMatrix { + 0.713247,-0.002867,0.700906,0.000000,-0.700353,-0.042855,0.712509,0.000000,0.027995,-0.999077,-0.032574,0.000000,12.410507,3.054970,10.755430,1.000000;; + } + + Frame Bip01_R_Finger01 { + + + FrameTransformMatrix { + 1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,10.075073,0.000020,-0.000001,1.000000;; + } + + Frame Bip01_R_Finger02 { + + + FrameTransformMatrix { + 1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,5.961570,-0.000010,-0.000003,1.000000;; + } + + Frame Dummy01 { + + + FrameTransformMatrix { + 1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,-1.000000,0.000000,5.961568,-0.000011,0.000000,1.000000;; + } + } + } + } + } + + Frame Bip01_R_Finger1 { + + + FrameTransformMatrix { + 1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000796,0.000000,0.000000,-0.000796,1.000000,0.000000,24.087997,0.354687,0.504994,1.000000;; + } + + Frame Bip01_R_Finger11 { + + + FrameTransformMatrix { + 1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,9.300055,-0.000003,-0.000036,1.000000;; + } + + Frame Bip01_R_Finger12 { + + + FrameTransformMatrix { + 1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,10.850063,0.000009,0.000012,1.000000;; + } + + Frame Dummy02 { + + + FrameTransformMatrix { + 1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,-1.000000,0.000000,11.207763,0.000001,-0.000002,1.000000;; + } + } + } + } + } + } + } + } + } + } + } + } + } + + Frame Bip01_L_Thigh { + + + FrameTransformMatrix { + -0.959397,-0.281208,0.021883,0.000000,-0.279994,0.958874,0.046525,0.000000,-0.034066,0.038509,-0.998677,0.000000,-27.730272,-13.958670,28.295168,1.000000;; + } + + Frame Bip01_L_Calf { + + + FrameTransformMatrix { + 0.912034,-0.410114,-0.000000,0.000000,0.410114,0.912034,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,119.231491,-0.000008,-0.000001,1.000000;; + } + + Frame Bip01_L_Foot { + + + FrameTransformMatrix { + 0.832169,0.546757,0.092472,0.000000,-0.549113,0.835748,0.000044,0.000000,-0.077259,-0.050814,0.995715,0.000000,119.231468,-0.000006,0.000000,1.000000;; + } + + Frame Bip01_L_Toe0 { + + + FrameTransformMatrix { + 0.000000,1.000000,0.000000,0.000000,-1.000000,-0.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,27.423262,34.577110,0.000002,1.000000;; + } + + Frame Dummy16 { + + + FrameTransformMatrix { + 1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,-1.000000,0.000000,15.738586,0.000005,-0.000001,1.000000;; + } + } + } + } + } + } + + Frame Bip01_R_Thigh { + + + FrameTransformMatrix { + -0.965965,0.253205,-0.052900,0.000000,0.253587,0.886612,-0.386799,0.000000,-0.051038,-0.387049,-0.920645,0.000000,-27.789658,-0.963900,-30.864017,1.000000;; + } + + Frame Bip01_R_Calf { + + + FrameTransformMatrix { + 1.000000,-0.000691,-0.000000,0.000000,0.000691,1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,119.231522,0.000021,-0.000011,1.000000;; + } + + Frame Bip01_R_Foot { + + + FrameTransformMatrix { + 0.988831,0.124156,0.082452,0.000000,-0.122246,0.992109,-0.027835,0.000000,-0.085257,0.017445,0.996206,0.000000,119.231476,-0.000039,0.000023,1.000000;; + } + + Frame Bip01_R_Toe0 { + + + FrameTransformMatrix { + 0.000000,1.000000,0.000000,0.000000,-1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,27.423260,34.577152,-0.000010,1.000000;; + } + + Frame Dummy11 { + + + FrameTransformMatrix { + 1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,15.738579,0.000004,-0.000012,1.000000;; + } + } + } + } + } + } + } + } + } + } +} + +AnimationSet { + + + Animation { + + + AnimationKey { + 4; + 2; + 0;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000;;, + 4960;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000;;; + } + { Scene_Root } + } + + Animation { + + + AnimationKey { + 4; + 2; + 0;16;1.278853,0.000000,-0.000000,0.000000,0.000000,0.000000,1.123165,0.000000,0.000000,-1.470235,0.000000,0.000000,0.135977,2.027985,133.967667,1.000000;;, + 4960;16;1.278853,0.000000,-0.000000,0.000000,0.000000,0.000000,1.123165,0.000000,0.000000,-1.470235,0.000000,0.000000,0.135977,2.027985,133.967667,1.000000;;; + } + { body } + } + + Animation { + + + AnimationKey { + 4; + 62; + 0;16;-1.000000,0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-88.696747,-245.951797,351.625824,1.000000;;, + 80;16;-1.000000,0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-88.696747,-245.958298,360.078979,1.000000;;, + 160;16;-1.000000,0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-88.696747,-245.964798,368.532135,1.000000;;, + 240;16;-1.000000,0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-88.696747,-245.971298,376.985291,1.000000;;, + 320;16;-1.000000,0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-88.696747,-245.977798,385.438446,1.000000;;, + 400;16;-1.000000,0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-88.696747,-245.984299,393.891602,1.000000;;, + 480;16;-1.000000,0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-88.696747,-245.990799,402.344757,1.000000;;, + 560;16;-1.000000,0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-88.696747,-245.997299,410.797913,1.000000;;, + 640;16;-1.000000,0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-88.696747,-246.003784,419.251099,1.000000;;, + 720;16;-1.000000,0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-88.696747,-246.010284,427.704254,1.000000;;, + 800;16;-1.000000,0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-88.696747,-246.016785,436.157410,1.000000;;, + 880;16;-1.000000,0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-88.696747,-246.023285,444.610565,1.000000;;, + 960;16;-1.000000,0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-88.696747,-246.029785,453.063721,1.000000;;, + 1040;16;-1.000000,0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-88.696747,-246.036285,461.516876,1.000000;;, + 1120;16;-1.000000,0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-88.696747,-246.042786,469.970032,1.000000;;, + 1200;16;-1.000000,0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-88.696747,-246.049286,478.423187,1.000000;;, + 1280;16;-1.000000,0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-88.696747,-246.055786,486.876343,1.000000;;, + 1360;16;-1.000000,0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-88.696747,-246.062286,495.329498,1.000000;;, + 1440;16;-1.000000,0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-88.696747,-246.068787,503.782654,1.000000;;, + 1520;16;-1.000000,0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-88.696747,-246.075287,512.235779,1.000000;;, + 1600;16;-1.000000,0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-88.696747,-246.081787,520.688965,1.000000;;, + 1680;16;-1.000000,0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-88.696747,-246.088287,529.142090,1.000000;;, + 1760;16;-1.000000,0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-88.696747,-246.094788,537.595276,1.000000;;, + 1840;16;-1.000000,0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-88.696747,-246.101273,546.048462,1.000000;;, + 1920;16;-1.000000,0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-88.696747,-246.107773,554.501587,1.000000;;, + 2000;16;-1.000000,0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-88.696747,-246.114273,562.954773,1.000000;;, + 2080;16;-1.000000,0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-88.696747,-246.120773,571.407898,1.000000;;, + 2160;16;-1.000000,0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-88.696747,-246.127274,579.861084,1.000000;;, + 2240;16;-1.000000,0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-88.696747,-246.133774,588.314209,1.000000;;, + 2320;16;-1.000000,0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-88.696747,-246.140274,596.767395,1.000000;;, + 2400;16;-1.000000,0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-88.696747,-246.146774,605.220520,1.000000;;, + 2480;16;-1.000000,0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-88.696747,-246.153275,613.673706,1.000000;;, + 2560;16;-1.000000,0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-88.696747,-246.159775,622.126892,1.000000;;, + 2640;16;-1.000000,0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-88.696747,-246.166275,630.580017,1.000000;;, + 2720;16;-1.000000,0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-88.696747,-246.172775,639.033142,1.000000;;, + 2800;16;-1.000000,0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-88.696747,-246.179276,647.486328,1.000000;;, + 2880;16;-1.000000,0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-88.696747,-246.185776,655.939514,1.000000;;, + 2960;16;-1.000000,0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-88.696747,-246.192276,664.392639,1.000000;;, + 3040;16;-1.000000,0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-88.696747,-246.198761,672.845764,1.000000;;, + 3120;16;-1.000000,0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-88.696747,-246.205261,681.298950,1.000000;;, + 3200;16;-1.000000,0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-88.696747,-246.211761,689.752136,1.000000;;, + 3280;16;-1.000000,0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-88.696747,-246.218262,698.205261,1.000000;;, + 3360;16;-1.000000,0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-88.696747,-246.224762,706.658386,1.000000;;, + 3440;16;-1.000000,0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-88.696747,-246.231262,715.111572,1.000000;;, + 3520;16;-1.000000,0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-88.696747,-246.237762,723.564758,1.000000;;, + 3600;16;-1.000000,0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-88.696747,-246.244263,732.017883,1.000000;;, + 3680;16;-1.000000,0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-88.696747,-246.250763,740.471069,1.000000;;, + 3760;16;-1.000000,0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-88.696747,-246.257263,748.924194,1.000000;;, + 3840;16;-1.000000,0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-88.696747,-246.263763,757.377380,1.000000;;, + 3920;16;-1.000000,0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-88.696747,-246.270264,765.830505,1.000000;;, + 4000;16;-1.000000,0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-88.696747,-246.276764,774.283691,1.000000;;, + 4080;16;-1.000000,0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-88.696747,-246.283264,782.736816,1.000000;;, + 4160;16;-1.000000,0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-88.696747,-246.289764,791.190002,1.000000;;, + 4240;16;-1.000000,0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-88.696747,-246.296249,799.643127,1.000000;;, + 4320;16;-1.000000,0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-88.696747,-246.302750,808.096313,1.000000;;, + 4400;16;-1.000000,0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-88.696747,-246.309250,816.549500,1.000000;;, + 4480;16;-1.000000,0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-88.696747,-246.315750,825.002625,1.000000;;, + 4560;16;-1.000000,0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-88.696747,-246.322250,833.455750,1.000000;;, + 4640;16;-1.000000,0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-88.696747,-246.328751,841.908936,1.000000;;, + 4720;16;-1.000000,0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-88.696747,-246.335251,850.362122,1.000000;;, + 4800;16;-1.000000,0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-88.696747,-246.341751,858.815247,1.000000;;, + 4960;16;-1.000000,0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-88.696747,-245.951797,351.625824,1.000000;;; + } + { Box01 } + } + + Animation { + + + AnimationKey { + 4; + 62; + 0;16;0.215193,-0.969920,0.113783,0.000000,0.976260,0.216600,-0.000000,0.000000,-0.024646,0.111082,0.993506,0.000000,-88.995270,-350.280182,247.734116,1.000000;;, + 80;16;0.230210,-0.966046,0.117296,0.000000,0.972762,0.231808,-0.000015,0.000000,-0.027176,0.114104,0.993097,0.000000,-89.026062,-358.696838,245.527908,1.000000;;, + 160;16;0.245161,-0.961926,0.120806,0.000000,0.969026,0.246960,-0.000085,0.000000,-0.029752,0.117085,0.992676,0.000000,-89.057129,-367.113770,243.259003,1.000000;;, + 240;16;0.260919,-0.957329,0.124270,0.000000,0.964815,0.262931,-0.000218,0.000000,-0.032466,0.119955,0.992248,0.000000,-89.090034,-375.532227,240.737289,1.000000;;, + 320;16;0.274853,-0.952953,0.127816,0.000000,0.960847,0.277077,-0.000391,0.000000,-0.035042,0.122919,0.991798,0.000000,-89.121216,-383.949402,238.279861,1.000000;;, + 400;16;0.284678,-0.949573,0.131414,0.000000,0.957902,0.287096,-0.000570,0.000000,-0.037187,0.126044,0.991327,0.000000,-89.147224,-392.364716,236.076599,1.000000;;, + 480;16;0.290388,-0.947267,0.135499,0.000000,0.956114,0.292995,-0.000732,0.000000,-0.039008,0.129765,0.990777,0.000000,-89.169243,-400.772797,234.318848,1.000000;;, + 560;16;0.290787,-0.946384,0.140711,0.000000,0.955929,0.293596,-0.000834,0.000000,-0.040523,0.134752,0.990050,0.000000,-89.187599,-409.165558,233.295410,1.000000;;, + 640;16;0.287101,-0.946645,0.146409,0.000000,0.956994,0.290106,-0.000860,0.000000,-0.041660,0.140360,0.989224,0.000000,-89.201378,-417.550812,232.904465,1.000000;;, + 720;16;0.280185,-0.947747,0.152550,0.000000,0.959005,0.283386,-0.000790,0.000000,-0.042482,0.146518,0.988295,0.000000,-89.211227,-425.929321,233.223892,1.000000;;, + 800;16;0.269861,-0.949850,0.157988,0.000000,0.961957,0.273201,-0.000596,0.000000,-0.042596,0.152138,0.987441,0.000000,-89.212715,-434.314423,234.003555,1.000000;;, + 880;16;0.255996,-0.953099,0.161456,0.000000,0.965782,0.259355,-0.000282,0.000000,-0.041606,0.156003,0.986880,0.000000,-89.200623,-442.720734,235.017471,1.000000;;, + 960;16;0.239263,-0.957127,0.163283,0.000000,0.970142,0.242538,0.000126,0.000000,-0.039723,0.158377,0.986579,0.000000,-89.177910,-451.145142,236.268890,1.000000;;, + 1040;16;0.220092,-0.961751,0.163077,0.000000,0.974779,0.223171,0.000573,0.000000,-0.036945,0.158838,0.986613,0.000000,-89.144325,-459.592773,237.701111,1.000000;;, + 1120;16;0.199072,-0.966547,0.161733,0.000000,0.979407,0.201892,0.001023,0.000000,-0.033641,0.158199,0.986834,0.000000,-89.104233,-468.053619,239.267197,1.000000;;, + 1200;16;0.176961,-0.971115,0.160062,0.000000,0.983756,0.179506,0.001467,0.000000,-0.030157,0.157202,0.987106,0.000000,-89.062035,-476.518890,240.917862,1.000000;;, + 1280;16;0.153774,-0.975404,0.157925,0.000000,0.987752,0.156024,0.001873,0.000000,-0.026467,0.155703,0.987449,0.000000,-89.017326,-484.990173,242.604843,1.000000;;, + 1360;16;0.129723,-0.979294,0.155422,0.000000,0.991292,0.131664,0.002220,0.000000,-0.022637,0.153781,0.987846,0.000000,-88.970947,-493.466614,244.280289,1.000000;;, + 1440;16;0.105024,-0.982683,0.152656,0.000000,0.994293,0.106652,0.002489,0.000000,-0.018727,0.151523,0.988276,0.000000,-88.923561,-501.947113,245.893738,1.000000;;, + 1520;16;0.079902,-0.985493,0.149728,0.000000,0.996693,0.081216,0.002672,0.000000,-0.014793,0.149019,0.988724,0.000000,-88.875931,-510.430634,247.395233,1.000000;;, + 1600;16;0.054583,-0.987668,0.146741,0.000000,0.998450,0.055589,0.002762,0.000000,-0.010885,0.146363,0.989171,0.000000,-88.828560,-518.915955,248.734818,1.000000;;, + 1680;16;0.029299,-0.989173,0.143799,0.000000,0.999546,0.030007,0.002762,0.000000,-0.007047,0.143652,0.989603,0.000000,-88.782097,-527.401978,249.862305,1.000000;;, + 1760;16;0.004282,-0.990000,0.141004,0.000000,0.999985,0.004707,0.002680,0.000000,-0.003317,0.140991,0.990005,0.000000,-88.736885,-535.887329,250.727417,1.000000;;, + 1840;16;-0.020233,-0.990161,0.138461,0.000000,0.999795,-0.020076,0.002532,0.000000,0.000273,0.138484,0.990365,0.000000,-88.693428,-544.370850,251.288864,1.000000;;, + 1920;16;-0.044014,-0.989693,0.136270,0.000000,0.999024,-0.044107,0.002338,0.000000,0.003697,0.136240,0.990669,0.000000,-88.651924,-552.851196,251.468933,1.000000;;, + 2000;16;-0.066451,-0.988672,0.134580,0.000000,0.997766,-0.066772,0.002131,0.000000,0.006879,0.134421,0.990900,0.000000,-88.613358,-561.326355,251.154114,1.000000;;, + 2080;16;-0.088458,-0.987113,0.133352,0.000000,0.996030,-0.088998,0.001921,0.000000,0.009972,0.132992,0.991067,0.000000,-88.575897,-569.796814,250.409897,1.000000;;, + 2160;16;-0.110697,-0.984964,0.132636,0.000000,0.993768,-0.111454,0.001725,0.000000,0.013084,0.132000,0.991163,0.000000,-88.538185,-578.261963,249.224899,1.000000;;, + 2240;16;-0.133303,-0.982204,0.132311,0.000000,0.990942,-0.134282,0.001543,0.000000,0.016252,0.131318,0.991207,0.000000,-88.499825,-586.723389,247.716156,1.000000;;, + 2320;16;-0.156984,-0.978703,0.132274,0.000000,0.987407,-0.158195,0.001366,0.000000,0.019588,0.130823,0.991212,0.000000,-88.459404,-595.182617,245.969635,1.000000;;, + 2400;16;-0.180673,-0.974575,0.132518,0.000000,0.983275,-0.182121,0.001212,0.000000,0.022953,0.130521,0.991180,0.000000,-88.418640,-603.639404,244.067245,1.000000;;, + 2480;16;-0.203757,-0.969944,0.133012,0.000000,0.978669,-0.205441,0.001087,0.000000,0.026272,0.130397,0.991114,0.000000,-88.378433,-612.094116,242.093201,1.000000;;, + 2560;16;-0.225637,-0.964990,0.133725,0.000000,0.973766,-0.227551,0.000998,0.000000,0.029466,0.130442,0.991018,0.000000,-88.339745,-620.546692,240.126892,1.000000;;, + 2640;16;-0.245728,-0.959945,0.134624,0.000000,0.968795,-0.247860,0.000949,0.000000,0.032457,0.130656,0.990896,0.000000,-88.303505,-628.997253,238.248978,1.000000;;, + 2720;16;-0.263458,-0.955082,0.135677,0.000000,0.964030,-0.265793,0.000938,0.000000,0.035166,0.131044,0.990753,0.000000,-88.270691,-637.445679,236.540161,1.000000;;, + 2800;16;-0.278272,-0.950703,0.136852,0.000000,0.959769,-0.280788,0.000962,0.000000,0.037512,0.131614,0.990591,0.000000,-88.242264,-645.891968,235.080368,1.000000;;, + 2880;16;-0.289622,-0.947123,0.138118,0.000000,0.956329,-0.292289,0.001013,0.000000,0.039411,0.132380,0.990415,0.000000,-88.219269,-654.335876,233.952332,1.000000;;, + 2960;16;-0.296833,-0.944706,0.139362,0.000000,0.954060,-0.299614,0.001070,0.000000,0.040744,0.133278,0.990241,0.000000,-88.203102,-662.778076,233.258194,1.000000;;, + 3040;16;-0.299743,-0.943574,0.140795,0.000000,0.953116,-0.302602,0.001152,0.000000,0.041518,0.134539,0.990038,0.000000,-88.193741,-671.216003,233.019211,1.000000;;, + 3120;16;-0.297684,-0.943957,0.142584,0.000000,0.953755,-0.300582,0.001269,0.000000,0.041660,0.136368,0.989782,0.000000,-88.191994,-679.646973,233.327316,1.000000;;, + 3200;16;-0.291409,-0.945585,0.144741,0.000000,0.955708,-0.294313,0.001411,0.000000,0.041265,0.138741,0.989469,0.000000,-88.196808,-688.071472,234.072937,1.000000;;, + 3280;16;-0.281246,-0.948245,0.147418,0.000000,0.958786,-0.284126,0.001582,0.000000,0.040385,0.141787,0.989073,0.000000,-88.207474,-696.487671,235.200226,1.000000;;, + 3360;16;-0.267718,-0.951692,0.150366,0.000000,0.962706,-0.270543,0.001731,0.000000,0.039033,0.145222,0.988629,0.000000,-88.223839,-704.899170,236.639908,1.000000;;, + 3440;16;-0.251299,-0.955670,0.153436,0.000000,0.967193,-0.254036,0.001827,0.000000,0.037233,0.148862,0.988157,0.000000,-88.245697,-713.308228,238.327179,1.000000;;, + 3520;16;-0.232467,-0.959934,0.156480,0.000000,0.971974,-0.235082,0.001843,0.000000,0.035017,0.152523,0.987679,0.000000,-88.272491,-721.717102,240.193939,1.000000;;, + 3600;16;-0.211709,-0.964255,0.159346,0.000000,0.976795,-0.214171,0.001762,0.000000,0.032428,0.156021,0.987221,0.000000,-88.303909,-730.127869,242.173676,1.000000;;, + 3680;16;-0.189524,-0.968439,0.161884,0.000000,0.981432,-0.191803,0.001579,0.000000,0.029521,0.159178,0.986808,0.000000,-88.339073,-738.542786,244.197083,1.000000;;, + 3760;16;-0.166420,-0.972331,0.163945,0.000000,0.985703,-0.168490,0.001297,0.000000,0.026362,0.161817,0.986469,0.000000,-88.377380,-746.964050,246.194870,1.000000;;, + 3840;16;-0.142916,-0.975820,0.165378,0.000000,0.989467,-0.144756,0.000932,0.000000,0.023030,0.163769,0.986230,0.000000,-88.417694,-755.393494,248.100037,1.000000;;, + 3920;16;-0.120009,-0.978789,0.166042,0.000000,0.992578,-0.121612,0.000515,0.000000,0.019688,0.164871,0.986119,0.000000,-88.458206,-763.833313,249.845062,1.000000;;, + 4000;16;-0.096823,-0.981400,0.165766,0.000000,0.995170,-0.098171,0.000058,0.000000,0.016217,0.164971,0.986165,0.000000,-88.500229,-772.285217,251.362381,1.000000;;, + 4080;16;-0.072995,-0.983711,0.164270,0.000000,0.997253,-0.074069,-0.000416,0.000000,0.012576,0.163788,0.986415,0.000000,-88.544342,-780.752625,252.601303,1.000000;;, + 4160;16;-0.047948,-0.985668,0.161738,0.000000,0.998812,-0.048729,-0.000865,0.000000,0.008734,0.161504,0.986833,0.000000,-88.590874,-789.233582,253.443695,1.000000;;, + 4240;16;-0.020710,-0.987195,0.158170,0.000000,0.999775,-0.021175,-0.001258,0.000000,0.004591,0.158109,0.987411,0.000000,-88.641014,-797.727844,253.722046,1.000000;;, + 4320;16;0.007899,-0.988064,0.153839,0.000000,0.999969,0.007754,-0.001540,0.000000,0.000329,0.153846,0.988095,0.000000,-88.692696,-806.232605,253.533524,1.000000;;, + 4400;16;0.037495,-0.988134,0.148950,0.000000,0.999289,0.037666,-0.001676,0.000000,-0.003954,0.148907,0.988843,0.000000,-88.744514,-814.745667,252.858902,1.000000;;, + 4480;16;0.067688,-0.987302,0.143713,0.000000,0.997673,0.068160,-0.001645,0.000000,-0.008171,0.143490,0.989618,0.000000,-88.795670,-823.264404,251.879715,1.000000;;, + 4560;16;0.098083,-0.985516,0.138337,0.000000,0.995103,0.098835,-0.001442,0.000000,-0.012252,0.137801,0.990384,0.000000,-88.845009,-831.786499,250.727203,1.000000;;, + 4640;16;0.128286,-0.982774,0.133035,0.000000,0.991606,0.129293,-0.001079,0.000000,-0.016140,0.132057,0.991111,0.000000,-88.892197,-840.309204,249.532562,1.000000;;, + 4720;16;0.157601,-0.979148,0.128187,0.000000,0.987305,0.158835,-0.000603,0.000000,-0.019770,0.126655,0.991750,0.000000,-88.935722,-848.828125,248.514465,1.000000;;, + 4800;16;0.186552,-0.974653,0.123489,0.000000,0.982171,0.187991,0.000000,0.000000,-0.023215,0.121288,0.992346,0.000000,-88.977890,-857.346008,247.541595,1.000000;;, + 4960;16;0.215193,-0.969920,0.113783,0.000000,0.976260,0.216600,-0.000000,0.000000,-0.024646,0.111082,0.993506,0.000000,-88.995270,-350.280182,247.734116,1.000000;;; + } + { Bip01 } + } + + Animation { + + + AnimationKey { + 4; + 62; + 0;16;0.215193,0.976260,-0.024646,0.000000,-0.969920,0.216600,0.111082,0.000000,0.113783,-0.000000,0.993506,0.000000,-28.695675,0.000000,-250.557556,1.000000;;, + 80;16;0.230210,0.972762,-0.027176,0.000000,-0.966046,0.231808,0.114104,0.000000,0.117296,-0.000015,0.993097,0.000000,-28.930368,0.003710,-244.942093,1.000000;;, + 160;16;0.245161,0.969026,-0.029752,0.000000,-0.961926,0.246960,0.117085,0.000000,0.120806,-0.000085,0.992676,0.000000,-29.871046,0.021084,-245.453903,1.000000;;, + 240;16;0.260919,0.964815,-0.032466,0.000000,-0.957329,0.262931,0.119955,0.000000,0.124270,-0.000218,0.992248,0.000000,-30.679300,0.053845,-244.962097,1.000000;;, + 320;16;0.274853,0.960848,-0.035042,0.000000,-0.952953,0.277077,0.122919,0.000000,0.127816,-0.000391,0.991798,0.000000,-31.485676,0.096353,-244.314850,1.000000;;, + 400;16;0.284678,0.957902,-0.037187,0.000000,-0.949573,0.287096,0.126044,0.000000,0.131414,-0.000570,0.991327,0.000000,-32.236568,0.139836,-243.178284,1.000000;;, + 480;16;0.290388,0.956114,-0.039008,0.000000,-0.947267,0.292995,0.129765,0.000000,0.135499,-0.000732,0.990777,0.000000,-33.082916,0.178625,-241.903809,1.000000;;, + 560;16;0.290787,0.955929,-0.040523,0.000000,-0.946384,0.293596,0.134752,0.000000,0.140711,-0.000834,0.990050,0.000000,-34.169113,0.202512,-240.416290,1.000000;;, + 640;16;0.287101,0.956994,-0.041660,0.000000,-0.946645,0.290106,0.140360,0.000000,0.146409,-0.000860,0.989224,0.000000,-35.483067,0.208447,-239.743652,1.000000;;, + 720;16;0.280185,0.959006,-0.042482,0.000000,-0.947747,0.283386,0.146518,0.000000,0.152550,-0.000790,0.988295,0.000000,-36.856628,0.190942,-238.775558,1.000000;;, + 800;16;0.269861,0.961957,-0.042596,0.000000,-0.949850,0.273201,0.152138,0.000000,0.157988,-0.000596,0.987441,0.000000,-38.280083,0.144505,-239.254517,1.000000;;, + 880;16;0.255996,0.965782,-0.041605,0.000000,-0.953099,0.259355,0.156003,0.000000,0.161456,-0.000282,0.986880,0.000000,-39.272747,0.068616,-240.050232,1.000000;;, + 960;16;0.239263,0.970142,-0.039723,0.000000,-0.957127,0.242538,0.158377,0.000000,0.163283,0.000126,0.986579,0.000000,-39.905502,-0.030840,-241.114822,1.000000;;, + 1040;16;0.220092,0.974779,-0.036945,0.000000,-0.961751,0.223171,0.158838,0.000000,0.163077,0.000573,0.986613,0.000000,-40.085278,-0.140866,-242.514786,1.000000;;, + 1120;16;0.199072,0.979407,-0.033641,0.000000,-0.966547,0.201892,0.158199,0.000000,0.161733,0.001023,0.986834,0.000000,-40.017071,-0.253015,-244.168747,1.000000;;, + 1200;16;0.176961,0.983756,-0.030157,0.000000,-0.971115,0.179506,0.157202,0.000000,0.160062,0.001467,0.987106,0.000000,-39.888794,-0.365580,-245.995041,1.000000;;, + 1280;16;0.153774,0.987751,-0.026467,0.000000,-0.975404,0.156024,0.155703,0.000000,0.157925,0.001873,0.987449,0.000000,-39.636044,-0.470161,-247.830200,1.000000;;, + 1360;16;0.129723,0.991292,-0.022637,0.000000,-0.979294,0.131664,0.153781,0.000000,0.155422,0.002220,0.987846,0.000000,-39.283993,-0.561041,-249.684158,1.000000;;, + 1440;16;0.105024,0.994293,-0.018727,0.000000,-0.982683,0.106652,0.151523,0.000000,0.152656,0.002489,0.988276,0.000000,-38.839005,-0.633379,-251.439117,1.000000;;, + 1520;16;0.079902,0.996693,-0.014793,0.000000,-0.985493,0.081216,0.149019,0.000000,0.149728,0.002672,0.988724,0.000000,-38.326859,-0.683906,-253.090744,1.000000;;, + 1600;16;0.054583,0.998450,-0.010885,0.000000,-0.987668,0.055589,0.146363,0.000000,0.146741,0.002762,0.989171,0.000000,-37.777111,-0.711023,-254.653427,1.000000;;, + 1680;16;0.029299,0.999546,-0.007047,0.000000,-0.989173,0.030007,0.143652,0.000000,0.143798,0.002762,0.989603,0.000000,-37.200829,-0.714508,-256.011414,1.000000;;, + 1760;16;0.004282,0.999985,-0.003317,0.000000,-0.990000,0.004707,0.140991,0.000000,0.141004,0.002680,0.990005,0.000000,-36.619717,-0.696093,-257.110870,1.000000;;, + 1840;16;-0.020233,0.999795,0.000273,0.000000,-0.990161,-0.020076,0.138484,0.000000,0.138461,0.002532,0.990365,0.000000,-36.057411,-0.659389,-257.906921,1.000000;;, + 1920;16;-0.044014,0.999024,0.003697,0.000000,-0.989694,-0.044107,0.136240,0.000000,0.136270,0.002338,0.990669,0.000000,-35.521038,-0.609429,-258.233765,1.000000;;, + 2000;16;-0.066451,0.997766,0.006879,0.000000,-0.988672,-0.066772,0.134421,0.000000,0.134580,0.002131,0.990900,0.000000,-35.047722,-0.554941,-258.053131,1.000000;;, + 2080;16;-0.088458,0.996030,0.009972,0.000000,-0.987113,-0.088998,0.132992,0.000000,0.133352,0.001921,0.991067,0.000000,-34.556820,-0.497754,-256.825684,1.000000;;, + 2160;16;-0.110697,0.993768,0.013084,0.000000,-0.984964,-0.111454,0.132000,0.000000,0.132636,0.001725,0.991163,0.000000,-34.142933,-0.444083,-255.143707,1.000000;;, + 2240;16;-0.133303,0.990942,0.016252,0.000000,-0.982204,-0.134282,0.131318,0.000000,0.132311,0.001543,0.991207,0.000000,-33.727978,-0.393298,-252.673233,1.000000;;, + 2320;16;-0.156984,0.987407,0.019588,0.000000,-0.978703,-0.158195,0.130822,0.000000,0.132274,0.001366,0.991212,0.000000,-33.356308,-0.344591,-249.960281,1.000000;;, + 2400;16;-0.180673,0.983275,0.022953,0.000000,-0.974575,-0.182121,0.130521,0.000000,0.132518,0.001212,0.991180,0.000000,-33.095207,-0.302633,-247.538528,1.000000;;, + 2480;16;-0.203757,0.978669,0.026272,0.000000,-0.969944,-0.205441,0.130397,0.000000,0.133012,0.001087,0.991114,0.000000,-32.885395,-0.268781,-245.038528,1.000000;;, + 2560;16;-0.225637,0.973766,0.029466,0.000000,-0.964990,-0.227551,0.130442,0.000000,0.133725,0.000998,0.991018,0.000000,-32.691967,-0.244099,-242.275589,1.000000;;, + 2640;16;-0.245728,0.968795,0.032457,0.000000,-0.959945,-0.247860,0.130656,0.000000,0.134624,0.000949,0.990896,0.000000,-32.764847,-0.230935,-241.164581,1.000000;;, + 2720;16;-0.263458,0.964030,0.035166,0.000000,-0.955082,-0.265793,0.131044,0.000000,0.135677,0.000938,0.990753,0.000000,-32.898090,-0.227433,-240.231201,1.000000;;, + 2800;16;-0.278272,0.959769,0.037512,0.000000,-0.950703,-0.280788,0.131614,0.000000,0.136852,0.000962,0.990591,0.000000,-33.050110,-0.232307,-239.229568,1.000000;;, + 2880;16;-0.289622,0.956329,0.039411,0.000000,-0.947123,-0.292289,0.132380,0.000000,0.138118,0.001013,0.990415,0.000000,-33.276829,-0.244129,-238.621353,1.000000;;, + 2960;16;-0.296833,0.954060,0.040744,0.000000,-0.944705,-0.299614,0.133278,0.000000,0.139362,0.001070,0.990241,0.000000,-33.489239,-0.257202,-237.958450,1.000000;;, + 3040;16;-0.299743,0.953116,0.041518,0.000000,-0.943574,-0.302602,0.134539,0.000000,0.140795,0.001152,0.990038,0.000000,-33.823746,-0.276747,-237.841446,1.000000;;, + 3120;16;-0.297684,0.953755,0.041660,0.000000,-0.943957,-0.300582,0.136368,0.000000,0.142584,0.001269,0.989782,0.000000,-34.225349,-0.304588,-237.584305,1.000000;;, + 3200;16;-0.291409,0.955708,0.041265,0.000000,-0.945585,-0.294313,0.138741,0.000000,0.144741,0.001411,0.989469,0.000000,-34.849762,-0.339790,-238.237503,1.000000;;, + 3280;16;-0.281246,0.958786,0.040385,0.000000,-0.948245,-0.284126,0.141787,0.000000,0.147418,0.001582,0.989073,0.000000,-35.660633,-0.382615,-239.258606,1.000000;;, + 3360;16;-0.267718,0.962706,0.039033,0.000000,-0.951692,-0.270543,0.145222,0.000000,0.150366,0.001731,0.988629,0.000000,-36.596420,-0.421292,-240.614899,1.000000;;, + 3440;16;-0.251299,0.967193,0.037233,0.000000,-0.955671,-0.254036,0.148862,0.000000,0.153436,0.001827,0.988157,0.000000,-37.616859,-0.447802,-242.259262,1.000000;;, + 3520;16;-0.232467,0.971974,0.035017,0.000000,-0.959934,-0.235082,0.152522,0.000000,0.156480,0.001843,0.987679,0.000000,-38.677807,-0.455441,-244.129257,1.000000;;, + 3600;16;-0.211709,0.976794,0.032428,0.000000,-0.964255,-0.214171,0.156021,0.000000,0.159346,0.001762,0.987221,0.000000,-39.733059,-0.439425,-246.164780,1.000000;;, + 3680;16;-0.189524,0.981432,0.029521,0.000000,-0.968439,-0.191803,0.159178,0.000000,0.161884,0.001579,0.986808,0.000000,-40.710854,-0.397097,-248.163681,1.000000;;, + 3760;16;-0.166420,0.985703,0.026362,0.000000,-0.972330,-0.168490,0.161817,0.000000,0.163945,0.001297,0.986469,0.000000,-41.575722,-0.328980,-250.164444,1.000000;;, + 3840;16;-0.142916,0.989467,0.023030,0.000000,-0.975820,-0.144756,0.163769,0.000000,0.165378,0.000932,0.986230,0.000000,-42.260056,-0.238165,-252.018021,1.000000;;, + 3920;16;-0.120009,0.992578,0.019688,0.000000,-0.978789,-0.121612,0.164871,0.000000,0.166042,0.000515,0.986119,0.000000,-42.725815,-0.132566,-253.747559,1.000000;;, + 4000;16;-0.096823,0.995170,0.016217,0.000000,-0.981401,-0.098171,0.164971,0.000000,0.165766,0.000058,0.986165,0.000000,-42.921295,-0.014893,-255.344513,1.000000;;, + 4080;16;-0.072995,0.997253,0.012576,0.000000,-0.983711,-0.074069,0.163788,0.000000,0.164270,-0.000416,0.986415,0.000000,-42.753769,0.108166,-256.729523,1.000000;;, + 4160;16;-0.047948,0.998812,0.008734,0.000000,-0.985668,-0.048729,0.161504,0.000000,0.161738,-0.000865,0.986833,0.000000,-42.248627,0.226077,-257.777344,1.000000;;, + 4240;16;-0.020710,0.999775,0.004591,0.000000,-0.987195,-0.021175,0.158109,0.000000,0.158170,-0.001258,0.987411,0.000000,-41.379543,0.329120,-258.320129,1.000000;;, + 4320;16;0.007899,0.999969,0.000329,0.000000,-0.988064,0.007754,0.153846,0.000000,0.153839,-0.001540,0.988095,0.000000,-40.226177,0.402630,-258.369110,1.000000;;, + 4400;16;0.037495,0.999289,-0.003954,0.000000,-0.988134,0.037666,0.148907,0.000000,0.148950,-0.001676,0.988843,0.000000,-38.856068,0.437144,-257.956085,1.000000;;, + 4480;16;0.067688,0.997673,-0.008171,0.000000,-0.987302,0.068160,0.143490,0.000000,0.143713,-0.001645,0.989618,0.000000,-37.303371,0.426951,-256.874268,1.000000;;, + 4560;16;0.098083,0.995103,-0.012252,0.000000,-0.985516,0.098835,0.137801,0.000000,0.138337,-0.001442,0.990384,0.000000,-35.704922,0.372164,-255.618713,1.000000;;, + 4640;16;0.128286,0.991606,-0.016140,0.000000,-0.982774,0.129293,0.132057,0.000000,0.133035,-0.001079,0.991111,0.000000,-34.232403,0.277539,-255.031479,1.000000;;, + 4720;16;0.157601,0.987305,-0.019770,0.000000,-0.979148,0.158835,0.126655,0.000000,0.128187,-0.000603,0.991750,0.000000,-32.951950,0.154989,-254.940338,1.000000;;, + 4800;16;0.186552,0.982171,-0.023215,0.000000,-0.974653,0.187991,0.121288,0.000000,0.123489,-0.000000,0.992346,0.000000,-31.477245,0.000000,-252.947632,1.000000;;, + 4960;16;0.215193,0.976260,-0.024646,0.000000,-0.969920,0.216600,0.111082,0.000000,0.113783,-0.000000,0.993506,0.000000,-28.695675,0.000000,-250.557556,1.000000;;; + } + { Bip01_Footsteps } + } + + Animation { + + + AnimationKey { + 4; + 62; + 0;16;-0.000000,0.003123,0.999995,0.000000,1.000000,0.000001,0.000000,0.000000,-0.000001,0.999995,-0.003123,0.000000,-2.498093,-1.716894,0.000001,1.000000;;, + 80;16;-0.000000,0.005798,0.999983,0.000000,1.000000,0.000001,-0.000000,0.000000,-0.000001,0.999983,-0.005798,0.000000,-2.606007,-1.708811,-0.000001,1.000000;;, + 160;16;-0.000000,0.008569,0.999963,0.000000,1.000000,0.000001,0.000000,0.000000,-0.000001,0.999963,-0.008569,0.000000,-2.714359,-1.701997,0.000007,1.000000;;, + 240;16;-0.000000,0.011630,0.999932,0.000000,1.000000,0.000001,0.000000,0.000000,-0.000001,0.999932,-0.011630,0.000000,-2.825058,-1.704134,0.000006,1.000000;;, + 320;16;-0.000000,0.014786,0.999891,0.000000,1.000000,0.000001,-0.000000,0.000000,-0.000001,0.999891,-0.014786,0.000000,-2.935028,-1.702141,-0.000002,1.000000;;, + 400;16;-0.000000,0.017942,0.999839,0.000000,1.000000,0.000001,0.000000,0.000000,-0.000001,0.999839,-0.017942,0.000000,-3.042238,-1.688488,-0.000005,1.000000;;, + 480;16;-0.000000,0.021002,0.999779,0.000000,1.000000,0.000001,0.000000,0.000000,-0.000001,0.999779,-0.021002,0.000000,-3.144488,-1.655950,-0.000001,1.000000;;, + 560;16;-0.000000,0.023869,0.999715,0.000000,1.000000,0.000001,-0.000000,0.000000,-0.000001,0.999715,-0.023869,0.000000,-3.236930,-1.599010,0.000005,1.000000;;, + 640;16;-0.000000,0.026447,0.999650,0.000000,1.000000,0.000001,0.000000,0.000000,-0.000001,0.999650,-0.026447,0.000000,-3.326138,-1.506355,-0.000006,1.000000;;, + 720;16;-0.000000,0.028638,0.999590,0.000000,1.000000,0.000001,0.000000,0.000000,-0.000001,0.999590,-0.028638,0.000000,-3.421040,-1.360553,0.000007,1.000000;;, + 800;16;-0.000000,0.030348,0.999539,0.000000,1.000000,0.000001,-0.000000,0.000000,-0.000001,0.999539,-0.030348,0.000000,-3.513980,-1.175462,0.000007,1.000000;;, + 880;16;-0.000000,0.031444,0.999506,0.000000,1.000000,0.000001,-0.000000,0.000000,-0.000001,0.999506,-0.031444,0.000000,-3.607227,-0.951677,0.000001,1.000000;;, + 960;16;-0.000000,0.031938,0.999490,0.000000,1.000000,0.000001,0.000000,0.000000,-0.000001,0.999490,-0.031938,0.000000,-3.682334,-0.710419,0.000003,1.000000;;, + 1040;16;-0.000000,0.031748,0.999496,0.000000,1.000000,0.000001,-0.000000,0.000000,-0.000001,0.999496,-0.031748,0.000000,-3.717381,-0.472458,0.000000,1.000000;;, + 1120;16;-0.000000,0.031018,0.999519,0.000000,1.000000,0.000001,0.000000,0.000000,-0.000001,0.999519,-0.031018,0.000000,-3.718616,-0.233649,-0.000006,1.000000;;, + 1200;16;-0.000000,0.029844,0.999555,0.000000,1.000000,0.000001,-0.000000,0.000000,-0.000001,0.999555,-0.029844,0.000000,-3.677681,0.000361,0.000003,1.000000;;, + 1280;16;-0.000000,0.028287,0.999600,0.000000,1.000000,0.000001,0.000000,0.000000,-0.000001,0.999600,-0.028287,0.000000,-3.613708,0.239710,-0.000006,1.000000;;, + 1360;16;-0.000000,0.026418,0.999651,0.000000,1.000000,0.000001,0.000000,0.000000,-0.000001,0.999651,-0.026418,0.000000,-3.543681,0.493597,0.000005,1.000000;;, + 1440;16;-0.000000,0.024309,0.999704,0.000000,1.000000,0.000001,-0.000000,0.000000,-0.000001,0.999705,-0.024309,0.000000,-3.467867,0.755770,-0.000003,1.000000;;, + 1520;16;-0.000000,0.022030,0.999757,0.000000,1.000000,0.000001,-0.000000,0.000000,-0.000001,0.999757,-0.022030,0.000000,-3.390432,1.023540,0.000009,1.000000;;, + 1600;16;-0.000000,0.019653,0.999807,0.000000,1.000000,0.000001,-0.000000,0.000000,-0.000001,0.999807,-0.019653,0.000000,-3.315237,1.293970,-0.000004,1.000000;;, + 1680;16;-0.000000,0.017248,0.999851,0.000000,1.000000,0.000001,0.000000,0.000000,-0.000001,0.999851,-0.017248,0.000000,-3.245844,1.563869,-0.000005,1.000000;;, + 1760;16;-0.000000,0.014885,0.999889,0.000000,1.000000,0.000001,-0.000000,0.000000,-0.000001,0.999889,-0.014885,0.000000,-3.185597,1.829824,0.000003,1.000000;;, + 1840;16;-0.000000,0.012637,0.999920,0.000000,1.000000,0.000001,-0.000000,0.000000,-0.000001,0.999920,-0.012637,0.000000,-3.137427,2.088194,-0.000000,1.000000;;, + 1920;16;-0.000000,0.010574,0.999944,0.000000,1.000000,0.000001,-0.000000,0.000000,-0.000001,0.999944,-0.010574,0.000000,-3.103951,2.335164,0.000006,1.000000;;, + 2000;16;0.000000,0.008766,0.999961,0.000000,1.000000,0.000001,-0.000000,0.000000,-0.000001,0.999962,-0.008766,0.000000,-3.087498,2.566761,-0.000003,1.000000;;, + 2080;16;0.000000,0.007285,0.999973,0.000000,1.000000,0.000001,-0.000000,0.000000,-0.000001,0.999973,-0.007285,0.000000,-3.090148,2.778913,0.000000,1.000000;;, + 2160;16;0.000000,0.005903,0.999983,0.000000,1.000000,0.000001,-0.000000,0.000000,-0.000001,0.999983,-0.005903,0.000000,-3.108274,2.971279,-0.000007,1.000000;;, + 2240;16;-0.000000,0.005588,0.999984,0.000000,1.000000,0.000001,0.000000,0.000000,-0.000001,0.999984,-0.005588,0.000000,-3.159645,3.128248,0.000006,1.000000;;, + 2320;16;-0.000000,0.007494,0.999972,0.000000,1.000000,0.000001,-0.000000,0.000000,-0.000001,0.999972,-0.007494,0.000000,-3.264085,3.232729,-0.000002,1.000000;;, + 2400;16;-0.000000,0.010843,0.999941,0.000000,1.000000,0.000001,0.000000,0.000000,-0.000001,0.999941,-0.010843,0.000000,-3.409011,3.285896,0.000004,1.000000;;, + 2480;16;-0.000000,0.015881,0.999874,0.000000,1.000000,0.000001,-0.000000,0.000000,-0.000001,0.999874,-0.015881,0.000000,-3.599284,3.278342,-0.000004,1.000000;;, + 2560;16;-0.000000,0.020687,0.999786,0.000000,1.000000,0.000001,-0.000000,0.000000,-0.000001,0.999786,-0.020687,0.000000,-3.803129,3.227022,-0.000004,1.000000;;, + 2640;16;-0.000000,0.023550,0.999723,0.000000,1.000000,0.000001,-0.000000,0.000000,-0.000001,0.999723,-0.023550,0.000000,-3.998868,3.143643,0.000006,1.000000;;, + 2720;16;-0.000000,0.024101,0.999710,0.000000,1.000000,0.000001,0.000000,0.000000,-0.000001,0.999710,-0.024101,0.000000,-4.165480,3.040740,0.000006,1.000000;;, + 2800;16;-0.000000,0.020898,0.999782,0.000000,1.000000,0.000001,-0.000000,0.000000,-0.000001,0.999782,-0.020898,0.000000,-4.277241,2.936613,0.000006,1.000000;;, + 2880;16;-0.000000,0.015453,0.999881,0.000000,1.000000,0.000001,-0.000000,0.000000,-0.000001,0.999881,-0.015453,0.000000,-4.329769,2.828214,-0.000001,1.000000;;, + 2960;16;-0.000000,0.008510,0.999964,0.000000,1.000000,0.000001,-0.000000,0.000000,-0.000001,0.999964,-0.008510,0.000000,-4.302057,2.720577,-0.000001,1.000000;;, + 3040;16;-0.000000,0.000942,1.000000,0.000000,1.000000,0.000001,0.000000,0.000000,-0.000001,1.000000,-0.000942,0.000000,-4.218734,2.604678,0.000002,1.000000;;, + 3120;16;0.000000,-0.006408,0.999979,0.000000,1.000000,0.000001,-0.000000,0.000000,-0.000001,0.999979,0.006408,0.000000,-4.092600,2.470545,0.000005,1.000000;;, + 3200;16;0.000000,-0.012697,0.999919,0.000000,1.000000,0.000001,-0.000000,0.000000,-0.000001,0.999919,0.012697,0.000000,-3.938424,2.322757,0.000001,1.000000;;, + 3280;16;0.000000,-0.016811,0.999859,0.000000,1.000000,0.000001,-0.000000,0.000000,-0.000001,0.999859,0.016811,0.000000,-3.770470,2.162284,0.000001,1.000000;;, + 3360;16;0.000000,-0.018729,0.999825,0.000000,1.000000,0.000001,0.000000,0.000000,-0.000001,0.999825,0.018729,0.000000,-3.603011,1.990379,-0.000005,1.000000;;, + 3440;16;0.000000,-0.017737,0.999843,0.000000,1.000000,0.000001,-0.000000,0.000000,-0.000001,0.999843,0.017737,0.000000,-3.456044,1.809228,0.000000,1.000000;;, + 3520;16;0.000000,-0.014794,0.999891,0.000000,1.000000,0.000001,0.000000,0.000000,-0.000001,0.999891,0.014794,0.000000,-3.326296,1.619980,-0.000004,1.000000;;, + 3600;16;0.000000,-0.010505,0.999945,0.000000,1.000000,0.000001,-0.000000,0.000000,-0.000001,0.999945,0.010505,0.000000,-3.220668,1.425136,0.000007,1.000000;;, + 3680;16;0.000000,-0.005221,0.999986,0.000000,1.000000,0.000001,0.000000,0.000000,-0.000001,0.999986,0.005221,0.000000,-3.127975,1.224429,-0.000004,1.000000;;, + 3760;16;-0.000000,0.000645,1.000000,0.000000,1.000000,0.000001,0.000000,0.000000,-0.000001,1.000000,-0.000645,0.000000,-3.037925,1.017790,-0.000003,1.000000;;, + 3840;16;0.000000,0.006680,0.999978,0.000000,1.000000,0.000001,0.000000,0.000000,-0.000001,0.999978,-0.006680,0.000000,-2.954320,0.805845,0.000004,1.000000;;, + 3920;16;-0.000000,0.012471,0.999922,0.000000,1.000000,0.000001,-0.000000,0.000000,-0.000001,0.999922,-0.012471,0.000000,-2.877302,0.589109,0.000001,1.000000;;, + 4000;16;-0.000000,0.017603,0.999845,0.000000,1.000000,0.000001,-0.000000,0.000000,-0.000001,0.999845,-0.017603,0.000000,-2.807037,0.368100,-0.000011,1.000000;;, + 4080;16;-0.000000,0.021570,0.999767,0.000000,1.000000,0.000001,-0.000000,0.000000,-0.000001,0.999767,-0.021570,0.000000,-2.743605,0.143374,-0.000008,1.000000;;, + 4160;16;-0.000000,0.024240,0.999706,0.000000,1.000000,0.000001,0.000000,0.000000,-0.000001,0.999706,-0.024240,0.000000,-2.686979,-0.084498,0.000004,1.000000;;, + 4240;16;-0.000000,0.025148,0.999684,0.000000,1.000000,0.000001,0.000000,0.000000,-0.000001,0.999684,-0.025148,0.000000,-2.637086,-0.314932,-0.000005,1.000000;;, + 4320;16;-0.000000,0.024788,0.999693,0.000000,1.000000,0.000001,0.000000,0.000000,-0.000001,0.999693,-0.024788,0.000000,-2.593796,-0.547340,0.000006,1.000000;;, + 4400;16;-0.000000,0.023387,0.999727,0.000000,1.000000,0.000001,0.000000,0.000000,-0.000001,0.999727,-0.023387,0.000000,-2.556833,-0.781132,-0.000001,1.000000;;, + 4480;16;-0.000000,0.021274,0.999774,0.000000,1.000000,0.000001,0.000000,0.000000,-0.000001,0.999774,-0.021274,0.000000,-2.525928,-1.015728,-0.000006,1.000000;;, + 4560;16;-0.000000,0.018755,0.999824,0.000000,1.000000,0.000001,0.000000,0.000000,-0.000001,0.999824,-0.018755,0.000000,-2.500761,-1.250548,-0.000001,1.000000;;, + 4640;16;-0.000000,0.016135,0.999870,0.000000,1.000000,0.000001,0.000000,0.000000,-0.000001,0.999870,-0.016135,0.000000,-2.480774,-1.485050,-0.000002,1.000000;;, + 4720;16;-0.000000,0.013920,0.999903,0.000000,1.000000,0.000001,0.000000,0.000000,-0.000001,0.999903,-0.013920,0.000000,-2.464930,-1.718164,-0.000005,1.000000;;, + 4800;16;-0.000000,0.011807,0.999930,0.000000,1.000000,0.000001,-0.000000,0.000000,-0.000001,0.999930,-0.011807,0.000000,-2.454305,-1.950977,-0.000005,1.000000;;, + 4960;16;-0.000000,0.003123,0.999995,0.000000,1.000000,0.000001,0.000000,0.000000,-0.000001,0.999995,-0.003123,0.000000,-2.498093,-1.716894,0.000001,1.000000;;; + } + { Bip01_Pelvis } + } + + Animation { + + + AnimationKey { + 4; + 62; + 0;16;0.999123,0.041767,0.002963,0.000000,-0.039832,0.969877,-0.240317,0.000000,-0.012911,0.239988,0.970690,0.000000,27.423990,8.709621,-0.080291,1.000000;;, + 80;16;0.999057,0.043399,-0.000923,0.000000,-0.042240,0.967043,-0.251084,0.000000,-0.010004,0.250886,0.967965,0.000000,27.423712,8.709688,-0.153400,1.000000;;, + 160;16;0.998974,0.045019,-0.004910,0.000000,-0.044731,0.963995,-0.262132,0.000000,-0.007067,0.262083,0.965020,0.000000,27.423220,8.709748,-0.229143,1.000000;;, + 240;16;0.998870,0.046629,-0.009154,0.000000,-0.047350,0.960438,-0.274438,0.000000,-0.004004,0.274561,0.961561,0.000000,27.422466,8.709834,-0.312789,1.000000;;, + 320;16;0.998745,0.048222,-0.013527,0.000000,-0.050076,0.956816,-0.286348,0.000000,-0.000865,0.286666,0.958030,0.000000,27.421347,8.709902,-0.399080,1.000000;;, + 400;16;0.998598,0.049795,-0.017967,0.000000,-0.052886,0.953448,-0.296885,0.000000,0.002347,0.297419,0.954744,0.000000,27.420021,8.709992,-0.485405,1.000000;;, + 480;16;0.998429,0.051349,-0.022410,0.000000,-0.055741,0.950693,-0.305085,0.000000,0.005639,0.305855,0.952062,0.000000,27.418449,8.710045,-0.569127,1.000000;;, + 560;16;0.998245,0.052832,-0.026768,0.000000,-0.058535,0.948912,-0.310064,0.000000,0.009019,0.311086,0.950339,0.000000,27.416719,8.710094,-0.647637,1.000000;;, + 640;16;0.998037,0.054406,-0.031026,0.000000,-0.061365,0.948540,-0.310654,0.000000,0.012528,0.311948,0.950017,0.000000,27.415018,8.710110,-0.718311,1.000000;;, + 720;16;0.997794,0.056292,-0.035203,0.000000,-0.064365,0.950186,-0.304965,0.000000,0.016283,0.306558,0.951713,0.000000,27.413412,8.710062,-0.778545,1.000000;;, + 800;16;0.997534,0.058300,-0.039081,0.000000,-0.067245,0.953380,-0.294185,0.000000,0.020108,0.296087,0.954949,0.000000,27.412104,8.709989,-0.825681,1.000000;;, + 880;16;0.997266,0.060451,-0.042510,0.000000,-0.069929,0.957960,-0.278248,0.000000,0.023903,0.280460,0.959568,0.000000,27.411259,8.709897,-0.856093,1.000000;;, + 960;16;0.997026,0.062340,-0.045313,0.000000,-0.071994,0.963208,-0.258933,0.000000,0.027504,0.261425,0.964832,0.000000,27.410852,8.709781,-0.870053,1.000000;;, + 1040;16;0.996863,0.063519,-0.047220,0.000000,-0.072985,0.968531,-0.237953,0.000000,0.030619,0.240653,0.970128,0.000000,27.411047,8.709651,-0.865323,1.000000;;, + 1120;16;0.996767,0.064080,-0.048470,0.000000,-0.073083,0.973748,-0.215580,0.000000,0.033383,0.218425,0.975282,0.000000,27.411665,8.709511,-0.845809,1.000000;;, + 1200;16;0.996748,0.063848,-0.049164,0.000000,-0.072196,0.978567,-0.192861,0.000000,0.035796,0.195783,0.979994,0.000000,27.412643,8.709426,-0.814108,1.000000;;, + 1280;16;0.996775,0.063168,-0.049484,0.000000,-0.070700,0.983031,-0.169270,0.000000,0.037952,0.172223,0.984327,0.000000,27.413853,8.709321,-0.771938,1.000000;;, + 1360;16;0.996821,0.062333,-0.049630,0.000000,-0.068920,0.987101,-0.144503,0.000000,0.039982,0.147464,0.988259,0.000000,27.415201,8.709247,-0.721257,1.000000;;, + 1440;16;0.996884,0.061336,-0.049598,0.000000,-0.066870,0.990648,-0.118935,0.000000,0.041840,0.121881,0.991662,0.000000,27.416634,8.709151,-0.663992,1.000000;;, + 1520;16;0.996959,0.060241,-0.049434,0.000000,-0.064637,0.993586,-0.092783,0.000000,0.043528,0.095696,0.994458,0.000000,27.418028,8.709090,-0.602090,1.000000;;, + 1600;16;0.997039,0.059108,-0.049178,0.000000,-0.062306,0.995855,-0.066263,0.000000,0.045058,0.069131,0.996590,0.000000,27.419365,8.709007,-0.537485,1.000000;;, + 1680;16;0.997120,0.057998,-0.048867,0.000000,-0.059956,0.997415,-0.039601,0.000000,0.046444,0.042417,0.998020,0.000000,27.420511,8.708969,-0.472121,1.000000;;, + 1760;16;0.997196,0.056968,-0.048536,0.000000,-0.057662,0.998251,-0.013023,0.000000,0.047709,0.015785,0.998737,0.000000,27.421484,8.708943,-0.407935,1.000000;;, + 1840;16;0.997262,0.056071,-0.048214,0.000000,-0.055493,0.998371,0.013244,0.000000,0.048878,-0.010532,0.998749,0.000000,27.422323,8.708948,-0.346869,1.000000;;, + 1920;16;0.997316,0.055359,-0.047930,0.000000,-0.053513,0.997806,0.038972,0.000000,0.049982,-0.036302,0.998090,0.000000,27.422901,8.708982,-0.290859,1.000000;;, + 2000;16;0.997353,0.054879,-0.047708,0.000000,-0.051780,0.996610,0.063936,0.000000,0.051055,-0.061296,0.996813,0.000000,27.423340,8.708994,-0.241852,1.000000;;, + 2080;16;0.997370,0.054677,-0.047570,0.000000,-0.050346,0.994855,0.087914,0.000000,0.052132,-0.085287,0.994992,0.000000,27.423624,8.709033,-0.201784,1.000000;;, + 2160;16;0.997381,0.054703,-0.047314,0.000000,-0.049197,0.992647,0.110592,0.000000,0.053016,-0.107975,0.992739,0.000000,27.423874,8.709077,-0.164378,1.000000;;, + 2240;16;0.997334,0.055280,-0.047632,0.000000,-0.048570,0.990053,0.132043,0.000000,0.054458,-0.129378,0.990099,0.000000,27.423906,8.709186,-0.156224,1.000000;;, + 2320;16;0.997165,0.056772,-0.049377,0.000000,-0.048657,0.987131,0.152331,0.000000,0.057390,-0.149496,0.987095,0.000000,27.423563,8.709200,-0.208964,1.000000;;, + 2400;16;0.996914,0.058971,-0.051814,0.000000,-0.049309,0.984002,0.171196,0.000000,0.061081,-0.168113,0.983874,0.000000,27.422709,8.709292,-0.301226,1.000000;;, + 2480;16;0.996559,0.061976,-0.055031,0.000000,-0.050578,0.980749,0.188608,0.000000,0.065661,-0.185176,0.980509,0.000000,27.420868,8.709354,-0.439755,1.000000;;, + 2560;16;0.996214,0.065247,-0.057455,0.000000,-0.052261,0.977576,0.203994,0.000000,0.069476,-0.200219,0.977285,0.000000,27.418518,8.709438,-0.571916,1.000000;;, + 2640;16;0.995992,0.068417,-0.057617,0.000000,-0.054407,0.974679,0.216890,0.000000,0.070997,-0.212886,0.974494,0.000000,27.416853,8.709501,-0.650709,1.000000;;, + 2720;16;0.995927,0.071133,-0.055404,0.000000,-0.056821,0.972261,0.226894,0.000000,0.070007,-0.222822,0.972342,0.000000,27.416513,8.709535,-0.666055,1.000000;;, + 2800;16;0.996094,0.072957,-0.049737,0.000000,-0.059430,0.970551,0.233449,0.000000,0.065304,-0.229581,0.971096,0.000000,27.418550,8.709614,-0.578335,1.000000;;, + 2880;16;0.996384,0.073821,-0.042075,0.000000,-0.061852,0.969652,0.236534,0.000000,0.058259,-0.233076,0.970712,0.000000,27.421329,8.709619,-0.429106,1.000000;;, + 2960;16;0.996750,0.073367,-0.033278,0.000000,-0.063506,0.969726,0.235792,0.000000,0.049569,-0.232913,0.971234,0.000000,27.423607,8.709618,-0.238672,1.000000;;, + 3040;16;0.997114,0.072017,-0.024018,0.000000,-0.064522,0.970635,0.231744,0.000000,0.040002,-0.229526,0.972480,0.000000,27.424623,8.709596,-0.031054,1.000000;;, + 3120;16;0.997436,0.069989,-0.014943,0.000000,-0.064858,0.972275,0.224666,0.000000,0.030253,-0.223120,0.974321,0.000000,27.424124,8.709539,0.170648,1.000000;;, + 3200;16;0.997693,0.067528,-0.006951,0.000000,-0.064461,0.974507,0.214897,0.000000,0.021285,-0.213953,0.976612,0.000000,27.422415,8.709509,0.343353,1.000000;;, + 3280;16;0.997893,0.064869,-0.001153,0.000000,-0.063289,0.977180,0.202767,0.000000,0.014280,-0.202267,0.979226,0.000000,27.420753,8.709398,0.456439,1.000000;;, + 3360;16;0.998058,0.062249,0.002426,0.000000,-0.061590,0.980136,0.188522,0.000000,0.009357,-0.188306,0.982066,0.000000,27.419783,8.709392,0.509363,1.000000;;, + 3440;16;0.998194,0.060003,0.003050,0.000000,-0.059630,0.983218,0.172412,0.000000,0.007346,-0.172283,0.985020,0.000000,27.420202,8.709322,0.482506,1.000000;;, + 3520;16;0.998312,0.058058,0.001693,0.000000,-0.057620,0.986277,0.154716,0.000000,0.007313,-0.154552,0.987958,0.000000,27.421497,8.709218,0.402188,1.000000;;, + 3600;16;0.998401,0.056518,-0.001049,0.000000,-0.055853,0.989165,0.135769,0.000000,0.008711,-0.135493,0.990740,0.000000,27.422939,8.709164,0.285022,1.000000;;, + 3680;16;0.998465,0.055179,-0.004804,0.000000,-0.054254,0.991800,0.115711,0.000000,0.011149,-0.115272,0.993271,0.000000,27.424032,8.709114,0.140571,1.000000;;, + 3760;16;0.998507,0.053849,-0.009127,0.000000,-0.052744,0.994098,0.094798,0.000000,0.014178,-0.094175,0.995455,0.000000,27.424370,8.709086,-0.019833,1.000000;;, + 3840;16;0.998524,0.052587,-0.013613,0.000000,-0.051458,0.996000,0.073054,0.000000,0.017400,-0.072246,0.997235,0.000000,27.423771,8.709007,-0.184858,1.000000;;, + 3920;16;0.998519,0.051392,-0.017847,0.000000,-0.050433,0.997446,0.050570,0.000000,0.020400,-0.049595,0.998561,0.000000,27.422205,8.708976,-0.343148,1.000000;;, + 4000;16;0.998507,0.050259,-0.021413,0.000000,-0.049665,0.998389,0.027438,0.000000,0.022758,-0.026334,0.999394,0.000000,27.420103,8.708972,-0.483372,1.000000;;, + 4080;16;0.998506,0.049186,-0.023804,0.000000,-0.049111,0.998786,0.003750,0.000000,0.023959,-0.002576,0.999710,0.000000,27.417946,8.708911,-0.591626,1.000000;;, + 4160;16;0.998529,0.048169,-0.024885,0.000000,-0.048681,0.998606,-0.020381,0.000000,0.023868,0.021563,0.999483,0.000000,27.416210,8.708953,-0.664299,1.000000;;, + 4240;16;0.998592,0.047204,-0.024190,0.000000,-0.048254,0.997827,-0.044860,0.000000,0.022020,0.045964,0.998700,0.000000,27.415644,8.708937,-0.688669,1.000000;;, + 4320;16;0.998681,0.046287,-0.022210,0.000000,-0.047729,0.996437,-0.069543,0.000000,0.018912,0.070512,0.997332,0.000000,27.415854,8.709007,-0.678236,1.000000;;, + 4400;16;0.998784,0.045413,-0.019169,0.000000,-0.047025,0.994433,-0.094300,0.000000,0.014780,0.095087,0.995359,0.000000,27.416765,8.709054,-0.639246,1.000000;;, + 4480;16;0.998887,0.044578,-0.015395,0.000000,-0.046097,0.991824,-0.118995,0.000000,0.009964,0.119572,0.992776,0.000000,27.418045,8.709128,-0.580761,1.000000;;, + 4560;16;0.998979,0.043778,-0.011190,0.000000,-0.044932,0.988630,-0.143495,0.000000,0.004781,0.143852,0.989588,0.000000,27.419416,8.709133,-0.511128,1.000000;;, + 4640;16;0.999051,0.043007,-0.006858,0.000000,-0.043547,0.984881,-0.167671,0.000000,-0.000457,0.167810,0.985819,0.000000,27.420631,8.709249,-0.438722,1.000000;;, + 4720;16;0.999103,0.042252,-0.002899,0.000000,-0.042026,0.980641,-0.191252,0.000000,-0.005238,0.191202,0.981537,0.000000,27.421503,8.709340,-0.377466,1.000000;;, + 4800;16;0.999137,0.041531,0.000982,0.000000,-0.040353,0.975880,-0.214545,0.000000,-0.009868,0.214320,0.976714,0.000000,27.422213,8.709480,-0.319006,1.000000;;, + 4960;16;0.999123,0.041767,0.002963,0.000000,-0.039832,0.969877,-0.240317,0.000000,-0.012911,0.239988,0.970690,0.000000,27.423990,8.709621,-0.080291,1.000000;;; + } + { Bip01_Spine } + } + + Animation { + + + AnimationKey { + 4; + 62; + 0;16;0.984808,-0.173648,-0.000000,0.000000,0.173648,0.984808,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,28.178093,-0.022107,-0.000000,1.000000;;, + 80;16;0.984808,-0.173648,-0.000000,0.000000,0.173648,0.984808,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,28.178076,-0.022107,-0.000001,1.000000;;, + 160;16;0.984808,-0.173648,-0.000000,0.000000,0.173648,0.984808,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,28.178078,-0.022100,-0.000000,1.000000;;, + 240;16;0.984808,-0.173648,-0.000000,0.000000,0.173648,0.984808,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,28.178055,-0.022113,-0.000001,1.000000;;, + 320;16;0.984808,-0.173648,-0.000000,0.000000,0.173648,0.984808,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,28.178087,-0.022091,-0.000000,1.000000;;, + 400;16;0.984808,-0.173648,-0.000000,0.000000,0.173648,0.984808,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,28.178095,-0.022106,-0.000000,1.000000;;, + 480;16;0.984808,-0.173648,-0.000000,0.000000,0.173648,0.984808,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,28.178078,-0.022101,-0.000000,1.000000;;, + 560;16;0.984808,-0.173648,-0.000000,0.000000,0.173648,0.984808,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,28.178080,-0.022108,-0.000001,1.000000;;, + 640;16;0.984808,-0.173648,-0.000000,0.000000,0.173648,0.984808,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,28.178099,-0.022104,0.000000,1.000000;;, + 720;16;0.984808,-0.173648,-0.000000,0.000000,0.173648,0.984808,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,28.178123,-0.022100,0.000001,1.000000;;, + 800;16;0.984808,-0.173648,-0.000000,0.000000,0.173648,0.984808,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,28.178085,-0.022088,-0.000000,1.000000;;, + 880;16;0.984808,-0.173648,-0.000000,0.000000,0.173648,0.984808,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,28.178066,-0.022108,-0.000001,1.000000;;, + 960;16;0.984808,-0.173648,-0.000000,0.000000,0.173648,0.984808,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,28.178112,-0.022100,0.000001,1.000000;;, + 1040;16;0.984808,-0.173648,-0.000000,0.000000,0.173648,0.984808,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,28.178099,-0.022101,0.000000,1.000000;;, + 1120;16;0.984808,-0.173648,-0.000000,0.000000,0.173648,0.984808,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,28.178110,-0.022086,0.000001,1.000000;;, + 1200;16;0.984808,-0.173648,-0.000000,0.000000,0.173648,0.984808,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,28.178099,-0.022109,0.000000,1.000000;;, + 1280;16;0.984808,-0.173648,-0.000000,0.000000,0.173648,0.984808,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,28.178066,-0.022097,-0.000001,1.000000;;, + 1360;16;0.984808,-0.173648,-0.000000,0.000000,0.173648,0.984808,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,28.178122,-0.022110,0.000001,1.000000;;, + 1440;16;0.984808,-0.173648,-0.000000,0.000000,0.173648,0.984808,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,28.178076,-0.022091,-0.000000,1.000000;;, + 1520;16;0.984808,-0.173648,-0.000000,0.000000,0.173648,0.984808,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,28.178099,-0.022102,0.000000,1.000000;;, + 1600;16;0.984808,-0.173648,-0.000000,0.000000,0.173648,0.984808,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,28.178057,-0.022091,-0.000001,1.000000;;, + 1680;16;0.984808,-0.173648,-0.000000,0.000000,0.173648,0.984808,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,28.178072,-0.022111,-0.000001,1.000000;;, + 1760;16;0.984808,-0.173648,-0.000000,0.000000,0.173648,0.984808,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,28.178089,-0.022071,0.000000,1.000000;;, + 1840;16;0.984808,-0.173648,-0.000000,0.000000,0.173648,0.984808,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,28.178070,-0.022096,-0.000001,1.000000;;, + 1920;16;0.984808,-0.173648,-0.000000,0.000000,0.173648,0.984808,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,28.178097,-0.022103,-0.000000,1.000000;;, + 2000;16;0.984808,-0.173648,-0.000000,0.000000,0.173648,0.984808,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,28.178118,-0.022102,0.000001,1.000000;;, + 2080;16;0.984808,-0.173648,-0.000000,0.000000,0.173648,0.984808,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,28.178083,-0.022100,0.000000,1.000000;;, + 2160;16;0.984808,-0.173648,-0.000000,0.000000,0.173648,0.984808,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,28.178091,-0.022098,0.000000,1.000000;;, + 2240;16;0.984808,-0.173648,-0.000000,0.000000,0.173648,0.984808,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,28.178087,-0.022139,0.000000,1.000000;;, + 2320;16;0.984808,-0.173648,-0.000000,0.000000,0.173648,0.984808,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,28.178082,-0.022113,-0.000001,1.000000;;, + 2400;16;0.984808,-0.173648,-0.000000,0.000000,0.173648,0.984808,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,28.178089,-0.022089,0.000000,1.000000;;, + 2480;16;0.984808,-0.173648,-0.000000,0.000000,0.173648,0.984808,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,28.178091,-0.022090,0.000000,1.000000;;, + 2560;16;0.984808,-0.173648,-0.000000,0.000000,0.173648,0.984808,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,28.178083,-0.022078,0.000000,1.000000;;, + 2640;16;0.984808,-0.173648,-0.000000,0.000000,0.173648,0.984808,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,28.178047,-0.022098,-0.000001,1.000000;;, + 2720;16;0.984808,-0.173648,-0.000000,0.000000,0.173648,0.984808,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,28.178083,-0.022071,0.000001,1.000000;;, + 2800;16;0.984808,-0.173648,-0.000000,0.000000,0.173648,0.984808,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,28.178085,-0.022123,-0.000001,1.000000;;, + 2880;16;0.984808,-0.173648,-0.000000,0.000000,0.173648,0.984808,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,28.178074,-0.022096,-0.000000,1.000000;;, + 2960;16;0.984808,-0.173648,-0.000000,0.000000,0.173648,0.984808,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,28.178123,-0.022122,-0.000002,1.000000;;, + 3040;16;0.984808,-0.173648,-0.000000,0.000000,0.173648,0.984808,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,28.178099,-0.022103,-0.000000,1.000000;;, + 3120;16;0.984808,-0.173648,-0.000000,0.000000,0.173648,0.984808,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,28.178076,-0.022107,-0.000001,1.000000;;, + 3200;16;0.984808,-0.173648,-0.000000,0.000000,0.173648,0.984808,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,28.178122,-0.022106,-0.000001,1.000000;;, + 3280;16;0.984808,-0.173648,-0.000000,0.000000,0.173648,0.984808,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,28.178097,-0.022081,0.000001,1.000000;;, + 3360;16;0.984808,-0.173648,-0.000000,0.000000,0.173648,0.984808,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,28.178120,-0.022132,-0.000003,1.000000;;, + 3440;16;0.984808,-0.173648,-0.000000,0.000000,0.173648,0.984808,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,28.178110,-0.022128,-0.000002,1.000000;;, + 3520;16;0.984808,-0.173648,-0.000000,0.000000,0.173648,0.984808,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,28.178085,-0.022074,0.000002,1.000000;;, + 3600;16;0.984808,-0.173648,-0.000000,0.000000,0.173648,0.984808,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,28.178089,-0.022098,0.000000,1.000000;;, + 3680;16;0.984808,-0.173648,-0.000000,0.000000,0.173648,0.984808,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,28.178097,-0.022077,0.000001,1.000000;;, + 3760;16;0.984808,-0.173648,-0.000000,0.000000,0.173648,0.984808,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,28.178085,-0.022123,-0.000002,1.000000;;, + 3840;16;0.984808,-0.173648,-0.000000,0.000000,0.173648,0.984808,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,28.178057,-0.022095,0.000000,1.000000;;, + 3920;16;0.984808,-0.173648,-0.000000,0.000000,0.173648,0.984808,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,28.178091,-0.022088,0.000001,1.000000;;, + 4000;16;0.984808,-0.173648,-0.000000,0.000000,0.173648,0.984808,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,28.178080,-0.022091,0.000001,1.000000;;, + 4080;16;0.984808,-0.173648,-0.000000,0.000000,0.173648,0.984808,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,28.178082,-0.022065,0.000002,1.000000;;, + 4160;16;0.984808,-0.173648,-0.000000,0.000000,0.173648,0.984808,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,28.178125,-0.022127,-0.000002,1.000000;;, + 4240;16;0.984808,-0.173648,-0.000000,0.000000,0.173648,0.984808,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,28.178078,-0.022039,0.000004,1.000000;;, + 4320;16;0.984808,-0.173648,-0.000000,0.000000,0.173648,0.984808,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,28.178112,-0.022084,0.000001,1.000000;;, + 4400;16;0.984808,-0.173648,-0.000000,0.000000,0.173648,0.984808,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,28.178114,-0.022109,-0.000001,1.000000;;, + 4480;16;0.984808,-0.173648,-0.000000,0.000000,0.173648,0.984808,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,28.178070,-0.022167,-0.000004,1.000000;;, + 4560;16;0.984808,-0.173648,-0.000000,0.000000,0.173648,0.984808,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,28.178085,-0.022028,0.000003,1.000000;;, + 4640;16;0.984808,-0.173648,-0.000000,0.000000,0.173648,0.984808,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,28.178066,-0.022106,-0.000000,1.000000;;, + 4720;16;0.984808,-0.173648,-0.000000,0.000000,0.173648,0.984808,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,28.178074,-0.022161,-0.000002,1.000000;;, + 4800;16;0.984808,-0.173648,-0.000000,0.000000,0.173648,0.984808,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,28.178080,-0.022084,0.000000,1.000000;;, + 4960;16;0.984808,-0.173648,-0.000000,0.000000,0.173648,0.984808,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,28.178093,-0.022107,-0.000000,1.000000;;; + } + { Bip01_Spine1 } + } + + Animation { + + + AnimationKey { + 4; + 62; + 0;16;0.999960,0.008638,0.002139,0.000000,-0.008515,0.998612,-0.051985,0.000000,-0.002585,0.051964,0.998646,0.000000,28.182180,-0.022404,0.001167,1.000000;;, + 80;16;0.999958,0.009006,0.001953,0.000000,-0.008886,0.998480,-0.054390,0.000000,-0.002440,0.054371,0.998518,0.000000,28.182199,-0.022407,0.001221,1.000000;;, + 160;16;0.999954,0.009373,0.001769,0.000000,-0.009257,0.998339,-0.056869,0.000000,-0.002300,0.056850,0.998380,0.000000,28.182215,-0.022390,0.001277,1.000000;;, + 240;16;0.999951,0.009739,0.001601,0.000000,-0.009626,0.998174,-0.059641,0.000000,-0.002179,0.059622,0.998219,0.000000,28.182205,-0.022391,0.001339,1.000000;;, + 320;16;0.999948,0.010105,0.001428,0.000000,-0.009996,0.998005,-0.062338,0.000000,-0.002055,0.062321,0.998054,0.000000,28.182203,-0.022400,0.001399,1.000000;;, + 400;16;0.999944,0.010470,0.001238,0.000000,-0.010368,0.997848,-0.064742,0.000000,-0.001913,0.064726,0.997901,0.000000,28.182194,-0.022392,0.001452,1.000000;;, + 480;16;0.999941,0.010837,0.001019,0.000000,-0.010745,0.997720,-0.066632,0.000000,-0.001739,0.066617,0.997777,0.000000,28.182243,-0.022383,0.001496,1.000000;;, + 560;16;0.999937,0.011193,0.000763,0.000000,-0.011115,0.997637,-0.067804,0.000000,-0.001520,0.067791,0.997698,0.000000,28.182243,-0.022378,0.001522,1.000000;;, + 640;16;0.999933,0.011574,0.000449,0.000000,-0.011516,0.997620,-0.067991,0.000000,-0.001235,0.067981,0.997686,0.000000,28.182236,-0.022407,0.001525,1.000000;;, + 720;16;0.999928,0.012029,0.000047,0.000000,-0.011999,0.997696,-0.066768,0.000000,-0.000850,0.066762,0.997769,0.000000,28.182245,-0.022386,0.001498,1.000000;;, + 800;16;0.999922,0.012511,-0.000419,0.000000,-0.012512,0.997845,-0.064404,0.000000,-0.000387,0.064404,0.997924,0.000000,28.182276,-0.022409,0.001445,1.000000;;, + 880;16;0.999915,0.013021,-0.000950,0.000000,-0.013055,0.998059,-0.060894,0.000000,0.000155,0.060901,0.998144,0.000000,28.182274,-0.022404,0.001366,1.000000;;, + 960;16;0.999908,0.013465,-0.001505,0.000000,-0.013529,0.998303,-0.056640,0.000000,0.000740,0.056656,0.998393,0.000000,28.182281,-0.022418,0.001271,1.000000;;, + 1040;16;0.999904,0.013741,-0.002043,0.000000,-0.013829,0.998550,-0.052024,0.000000,0.001325,0.052047,0.998644,0.000000,28.182289,-0.022406,0.001167,1.000000;;, + 1120;16;0.999900,0.013871,-0.002578,0.000000,-0.013977,0.998792,-0.047110,0.000000,0.001921,0.047141,0.998886,0.000000,28.182270,-0.022416,0.001056,1.000000;;, + 1200;16;0.999900,0.013819,-0.003104,0.000000,-0.013937,0.999015,-0.042130,0.000000,0.002518,0.042169,0.999107,0.000000,28.182281,-0.022428,0.000945,1.000000;;, + 1280;16;0.999900,0.013660,-0.003641,0.000000,-0.013785,0.999221,-0.036971,0.000000,0.003133,0.037018,0.999310,0.000000,28.182306,-0.022411,0.000830,1.000000;;, + 1360;16;0.999900,0.013461,-0.004213,0.000000,-0.013587,0.999409,-0.031574,0.000000,0.003786,0.031628,0.999492,0.000000,28.182280,-0.022422,0.000708,1.000000;;, + 1440;16;0.999901,0.013217,-0.004801,0.000000,-0.013338,0.999573,-0.026018,0.000000,0.004455,0.026080,0.999650,0.000000,28.182310,-0.022427,0.000585,1.000000;;, + 1520;16;0.999902,0.012943,-0.005396,0.000000,-0.013050,0.999708,-0.020351,0.000000,0.005131,0.020419,0.999778,0.000000,28.182245,-0.022437,0.000456,1.000000;;, + 1600;16;0.999902,0.012651,-0.005990,0.000000,-0.012738,0.999812,-0.014617,0.000000,0.005804,0.014692,0.999875,0.000000,28.182310,-0.022420,0.000330,1.000000;;, + 1680;16;0.999902,0.012355,-0.006574,0.000000,-0.012413,0.999884,-0.008863,0.000000,0.006464,0.008943,0.999939,0.000000,28.182240,-0.022410,0.000199,1.000000;;, + 1760;16;0.999902,0.012066,-0.007140,0.000000,-0.012089,0.999922,-0.003134,0.000000,0.007101,0.003220,0.999970,0.000000,28.182266,-0.022477,0.000070,1.000000;;, + 1840;16;0.999901,0.011799,-0.007677,0.000000,-0.011780,0.999927,0.002523,0.000000,0.007706,-0.002433,0.999967,0.000000,28.182272,-0.022432,-0.000056,1.000000;;, + 1920;16;0.999900,0.011565,-0.008177,0.000000,-0.011499,0.999901,0.008063,0.000000,0.008269,-0.007969,0.999934,0.000000,28.182232,-0.022423,-0.000181,1.000000;;, + 2000;16;0.999898,0.011377,-0.008631,0.000000,-0.011260,0.999846,0.013441,0.000000,0.008782,-0.013342,0.999872,0.000000,28.182209,-0.022437,-0.000302,1.000000;;, + 2080;16;0.999896,0.011247,-0.009028,0.000000,-0.011078,0.999765,0.018609,0.000000,0.009235,-0.018507,0.999786,0.000000,28.182236,-0.022451,-0.000417,1.000000;;, + 2160;16;0.999894,0.011168,-0.009374,0.000000,-0.010945,0.999664,0.023506,0.000000,0.009634,-0.023401,0.999680,0.000000,28.182228,-0.022439,-0.000527,1.000000;;, + 2240;16;0.999891,0.011212,-0.009616,0.000000,-0.010938,0.999544,0.028137,0.000000,0.009927,-0.028029,0.999558,0.000000,28.182234,-0.022405,-0.000631,1.000000;;, + 2320;16;0.999887,0.011463,-0.009695,0.000000,-0.011142,0.999410,0.032503,0.000000,0.010061,-0.032392,0.999425,0.000000,28.182226,-0.022421,-0.000730,1.000000;;, + 2400;16;0.999883,0.011880,-0.009621,0.000000,-0.011521,0.999265,0.036556,0.000000,0.010048,-0.036441,0.999285,0.000000,28.182283,-0.022441,-0.000819,1.000000;;, + 2480;16;0.999878,0.012490,-0.009366,0.000000,-0.012103,0.999115,0.040282,0.000000,0.009861,-0.040164,0.999144,0.000000,28.182253,-0.022421,-0.000904,1.000000;;, + 2560;16;0.999873,0.013177,-0.008993,0.000000,-0.012773,0.998968,0.043576,0.000000,0.009557,-0.043456,0.999010,0.000000,28.182255,-0.022452,-0.000979,1.000000;;, + 2640;16;0.999867,0.013860,-0.008544,0.000000,-0.013450,0.998835,0.046354,0.000000,0.009176,-0.046233,0.998889,0.000000,28.182299,-0.022407,-0.001040,1.000000;;, + 2720;16;0.999863,0.014461,-0.008061,0.000000,-0.014053,0.998723,0.048534,0.000000,0.008753,-0.048414,0.998789,0.000000,28.182329,-0.022429,-0.001090,1.000000;;, + 2800;16;0.999860,0.014879,-0.007608,0.000000,-0.014480,0.998643,0.050014,0.000000,0.008342,-0.049897,0.998720,0.000000,28.182306,-0.022414,-0.001123,1.000000;;, + 2880;16;0.999860,0.015098,-0.007168,0.000000,-0.014715,0.998602,0.050771,0.000000,0.007925,-0.050658,0.998685,0.000000,28.182318,-0.022442,-0.001141,1.000000;;, + 2960;16;0.999864,0.015039,-0.006756,0.000000,-0.014678,0.998605,0.050714,0.000000,0.007509,-0.050608,0.998690,0.000000,28.182287,-0.022416,-0.001138,1.000000;;, + 3040;16;0.999870,0.014793,-0.006341,0.000000,-0.014459,0.998647,0.049943,0.000000,0.007071,-0.049844,0.998732,0.000000,28.182310,-0.022401,-0.001120,1.000000;;, + 3120;16;0.999879,0.014408,-0.005889,0.000000,-0.014106,0.998723,0.048503,0.000000,0.006580,-0.048414,0.998806,0.000000,28.182297,-0.022400,-0.001087,1.000000;;, + 3200;16;0.999888,0.013933,-0.005421,0.000000,-0.013666,0.998827,0.046459,0.000000,0.006062,-0.046380,0.998905,0.000000,28.182285,-0.022428,-0.001043,1.000000;;, + 3280;16;0.999898,0.013415,-0.004945,0.000000,-0.013186,0.998950,0.043868,0.000000,0.005529,-0.043798,0.999025,0.000000,28.182266,-0.022429,-0.000985,1.000000;;, + 3360;16;0.999907,0.012904,-0.004470,0.000000,-0.012711,0.999087,0.040788,0.000000,0.004992,-0.040728,0.999158,0.000000,28.182243,-0.022399,-0.000913,1.000000;;, + 3440;16;0.999914,0.012469,-0.004007,0.000000,-0.012311,0.999229,0.037272,0.000000,0.004468,-0.037219,0.999297,0.000000,28.182274,-0.022430,-0.000837,1.000000;;, + 3520;16;0.999920,0.012094,-0.003553,0.000000,-0.011969,0.999371,0.033398,0.000000,0.003955,-0.033353,0.999436,0.000000,28.182243,-0.022438,-0.000751,1.000000;;, + 3600;16;0.999925,0.011801,-0.003112,0.000000,-0.011705,0.999504,0.029249,0.000000,0.003456,-0.029211,0.999567,0.000000,28.182255,-0.022432,-0.000657,1.000000;;, + 3680;16;0.999930,0.011546,-0.002677,0.000000,-0.011476,0.999625,0.024863,0.000000,0.002964,-0.024830,0.999687,0.000000,28.182261,-0.022451,-0.000560,1.000000;;, + 3760;16;0.999934,0.011289,-0.002241,0.000000,-0.011241,0.999731,0.020298,0.000000,0.002469,-0.020271,0.999791,0.000000,28.182238,-0.022433,-0.000455,1.000000;;, + 3840;16;0.999937,0.011041,-0.001804,0.000000,-0.011012,0.999818,0.015564,0.000000,0.001976,-0.015543,0.999877,0.000000,28.182243,-0.022441,-0.000350,1.000000;;, + 3920;16;0.999941,0.010802,-0.001368,0.000000,-0.010787,0.999885,0.010683,0.000000,0.001483,-0.010668,0.999942,0.000000,28.182222,-0.022450,-0.000240,1.000000;;, + 4000;16;0.999944,0.010572,-0.000931,0.000000,-0.010566,0.999928,0.005677,0.000000,0.000991,-0.005667,0.999984,0.000000,28.182243,-0.022468,-0.000130,1.000000;;, + 4080;16;0.999946,0.010348,-0.000494,0.000000,-0.010348,0.999946,0.000569,0.000000,0.000500,-0.000564,1.000000,0.000000,28.182241,-0.022454,-0.000014,1.000000;;, + 4160;16;0.999949,0.010130,-0.000057,0.000000,-0.010130,0.999938,-0.004620,0.000000,0.000010,0.004620,0.999989,0.000000,28.182201,-0.022432,0.000104,1.000000;;, + 4240;16;0.999951,0.009917,0.000381,0.000000,-0.009913,0.999902,-0.009867,0.000000,-0.000478,0.009863,0.999951,0.000000,28.182232,-0.022464,0.000219,1.000000;;, + 4320;16;0.999952,0.009709,0.000819,0.000000,-0.009695,0.999838,-0.015150,0.000000,-0.000966,0.015142,0.999885,0.000000,28.182169,-0.022407,0.000342,1.000000;;, + 4400;16;0.999954,0.009503,0.001259,0.000000,-0.009475,0.999746,-0.020448,0.000000,-0.001453,0.020435,0.999790,0.000000,28.182182,-0.022431,0.000459,1.000000;;, + 4480;16;0.999955,0.009299,0.001699,0.000000,-0.009253,0.999626,-0.025737,0.000000,-0.001938,0.025721,0.999667,0.000000,28.182177,-0.022365,0.000581,1.000000;;, + 4560;16;0.999956,0.009097,0.002141,0.000000,-0.009026,0.999479,-0.030997,0.000000,-0.002422,0.030976,0.999517,0.000000,28.182198,-0.022499,0.000692,1.000000;;, + 4640;16;0.999957,0.008894,0.002585,0.000000,-0.008794,0.999306,-0.036204,0.000000,-0.002905,0.036180,0.999341,0.000000,28.182184,-0.022429,0.000812,1.000000;;, + 4720;16;0.999958,0.008688,0.003030,0.000000,-0.008556,0.999110,-0.041308,0.000000,-0.003387,0.041280,0.999142,0.000000,28.182182,-0.022396,0.000928,1.000000;;, + 4800;16;0.999958,0.008483,0.003477,0.000000,-0.008313,0.998890,-0.046374,0.000000,-0.003867,0.046343,0.998918,0.000000,28.182159,-0.022430,0.001040,1.000000;;, + 4960;16;0.999960,0.008638,0.002139,0.000000,-0.008515,0.998612,-0.051985,0.000000,-0.002585,0.051964,0.998646,0.000000,28.182180,-0.022404,0.001167,1.000000;;; + } + { Bip01_Spine2 } + } + + Animation { + + + AnimationKey { + 4; + 62; + 0;16;0.999844,-0.017541,0.002139,0.000000,0.017628,0.998492,-0.051985,0.000000,-0.001224,0.052014,0.998646,0.000000,28.181387,-0.033838,0.001761,1.000000;;, + 80;16;0.999851,-0.017173,0.001953,0.000000,0.017254,0.998371,-0.054390,0.000000,-0.001015,0.054416,0.998518,0.000000,28.181393,-0.033823,0.001844,1.000000;;, + 160;16;0.999857,-0.016806,0.001769,0.000000,0.016880,0.998239,-0.056869,0.000000,-0.000811,0.056891,0.998380,0.000000,28.181393,-0.033834,0.001926,1.000000;;, + 240;16;0.999864,-0.016440,0.001601,0.000000,0.016506,0.998083,-0.059641,0.000000,-0.000618,0.059659,0.998219,0.000000,28.181406,-0.033831,0.002020,1.000000;;, + 320;16;0.999870,-0.016074,0.001428,0.000000,0.016132,0.997925,-0.062339,0.000000,-0.000423,0.062353,0.998054,0.000000,28.181440,-0.033803,0.002113,1.000000;;, + 400;16;0.999876,-0.015709,0.001238,0.000000,0.015756,0.997778,-0.064742,0.000000,-0.000218,0.064754,0.997901,0.000000,28.181459,-0.033810,0.002194,1.000000;;, + 480;16;0.999882,-0.015342,0.001019,0.000000,0.015376,0.997659,-0.066632,0.000000,0.000006,0.066640,0.997777,0.000000,28.181421,-0.033817,0.002256,1.000000;;, + 560;16;0.999887,-0.014987,0.000763,0.000000,0.015004,0.997586,-0.067804,0.000000,0.000255,0.067808,0.997698,0.000000,28.181471,-0.033799,0.002297,1.000000;;, + 640;16;0.999893,-0.014606,0.000449,0.000000,0.014602,0.997579,-0.067991,0.000000,0.000545,0.067990,0.997686,0.000000,28.181479,-0.033799,0.002304,1.000000;;, + 720;16;0.999900,-0.014151,0.000047,0.000000,0.014122,0.997669,-0.066768,0.000000,0.000898,0.066762,0.997769,0.000000,28.181480,-0.033816,0.002261,1.000000;;, + 800;16;0.999906,-0.013669,-0.000419,0.000000,0.013613,0.997831,-0.064404,0.000000,0.001299,0.064393,0.997924,0.000000,28.181528,-0.033810,0.002183,1.000000;;, + 880;16;0.999913,-0.013158,-0.000950,0.000000,0.013076,0.998059,-0.060894,0.000000,0.001749,0.060876,0.998144,0.000000,28.181520,-0.033831,0.002062,1.000000;;, + 960;16;0.999918,-0.012714,-0.001505,0.000000,0.012608,0.998315,-0.056640,0.000000,0.002222,0.056617,0.998394,0.000000,28.181570,-0.033827,0.001920,1.000000;;, + 1040;16;0.999921,-0.012438,-0.002043,0.000000,0.012315,0.998570,-0.052024,0.000000,0.002687,0.051994,0.998644,0.000000,28.181555,-0.033841,0.001762,1.000000;;, + 1120;16;0.999921,-0.012308,-0.002578,0.000000,0.012173,0.998815,-0.047110,0.000000,0.003154,0.047075,0.998886,0.000000,28.181576,-0.033837,0.001598,1.000000;;, + 1200;16;0.999919,-0.012361,-0.003104,0.000000,0.012219,0.999037,-0.042129,0.000000,0.003622,0.042088,0.999107,0.000000,28.181570,-0.033847,0.001428,1.000000;;, + 1280;16;0.999915,-0.012519,-0.003641,0.000000,0.012376,0.999240,-0.036971,0.000000,0.004101,0.036923,0.999310,0.000000,28.181587,-0.033863,0.001253,1.000000;;, + 1360;16;0.999910,-0.012718,-0.004213,0.000000,0.012579,0.999422,-0.031574,0.000000,0.004612,0.031518,0.999493,0.000000,28.181551,-0.033881,0.001069,1.000000;;, + 1440;16;0.999904,-0.012962,-0.004801,0.000000,0.012832,0.999579,-0.026018,0.000000,0.005136,0.025954,0.999650,0.000000,28.181551,-0.033876,0.000882,1.000000;;, + 1520;16;0.999898,-0.013236,-0.005396,0.000000,0.013123,0.999707,-0.020351,0.000000,0.005664,0.020278,0.999778,0.000000,28.181580,-0.033861,0.000692,1.000000;;, + 1600;16;0.999891,-0.013528,-0.005990,0.000000,0.013439,0.999803,-0.014617,0.000000,0.006187,0.014535,0.999875,0.000000,28.181488,-0.033870,0.000494,1.000000;;, + 1680;16;0.999883,-0.013824,-0.006574,0.000000,0.013766,0.999866,-0.008863,0.000000,0.006696,0.008771,0.999939,0.000000,28.181526,-0.033868,0.000301,1.000000;;, + 1760;16;0.999875,-0.014112,-0.007140,0.000000,0.014090,0.999896,-0.003134,0.000000,0.007183,0.003033,0.999970,0.000000,28.181465,-0.033827,0.000105,1.000000;;, + 1840;16;0.999867,-0.014380,-0.007677,0.000000,0.014399,0.999893,0.002523,0.000000,0.007640,-0.002634,0.999968,0.000000,28.181459,-0.033858,-0.000087,1.000000;;, + 1920;16;0.999860,-0.014614,-0.008177,0.000000,0.014679,0.999860,0.008063,0.000000,0.008058,-0.008182,0.999934,0.000000,28.181480,-0.033867,-0.000273,1.000000;;, + 2000;16;0.999853,-0.014801,-0.008631,0.000000,0.014917,0.999798,0.013441,0.000000,0.008430,-0.013567,0.999872,0.000000,28.181446,-0.033858,-0.000457,1.000000;;, + 2080;16;0.999848,-0.014931,-0.009028,0.000000,0.015097,0.999713,0.018609,0.000000,0.008748,-0.018743,0.999786,0.000000,28.181459,-0.033842,-0.000631,1.000000;;, + 2160;16;0.999843,-0.015010,-0.009375,0.000000,0.015227,0.999608,0.023506,0.000000,0.009018,-0.023645,0.999680,0.000000,28.181465,-0.033830,-0.000798,1.000000;;, + 2240;16;0.999842,-0.014966,-0.009616,0.000000,0.015231,0.999488,0.028137,0.000000,0.009190,-0.028279,0.999558,0.000000,28.181452,-0.033852,-0.000955,1.000000;;, + 2320;16;0.999845,-0.014715,-0.009695,0.000000,0.015023,0.999359,0.032503,0.000000,0.009210,-0.032644,0.999425,0.000000,28.181450,-0.033814,-0.001103,1.000000;;, + 2400;16;0.999851,-0.014298,-0.009621,0.000000,0.014641,0.999224,0.036556,0.000000,0.009091,-0.036692,0.999285,0.000000,28.181465,-0.033791,-0.001241,1.000000;;, + 2480;16;0.999862,-0.013688,-0.009366,0.000000,0.014055,0.999090,0.040282,0.000000,0.008806,-0.040409,0.999144,0.000000,28.181517,-0.033817,-0.001366,1.000000;;, + 2560;16;0.999875,-0.013001,-0.008993,0.000000,0.013381,0.998960,0.043576,0.000000,0.008417,-0.043691,0.999010,0.000000,28.181549,-0.033836,-0.001476,1.000000;;, + 2640;16;0.999888,-0.012318,-0.008544,0.000000,0.012701,0.998844,0.046354,0.000000,0.007963,-0.046458,0.998889,0.000000,28.181564,-0.033836,-0.001570,1.000000;;, + 2720;16;0.999899,-0.011717,-0.008061,0.000000,0.012095,0.998748,0.048534,0.000000,0.007483,-0.048627,0.998789,0.000000,28.181547,-0.033857,-0.001645,1.000000;;, + 2800;16;0.999907,-0.011300,-0.007608,0.000000,0.011666,0.998680,0.050014,0.000000,0.007033,-0.050098,0.998720,0.000000,28.181583,-0.033833,-0.001695,1.000000;;, + 2880;16;0.999913,-0.011081,-0.007168,0.000000,0.011430,0.998645,0.050771,0.000000,0.006596,-0.050848,0.998685,0.000000,28.181591,-0.033802,-0.001721,1.000000;;, + 2960;16;0.999915,-0.011139,-0.006756,0.000000,0.011468,0.998647,0.050714,0.000000,0.006182,-0.050787,0.998690,0.000000,28.181618,-0.033829,-0.001718,1.000000;;, + 3040;16;0.999915,-0.011385,-0.006341,0.000000,0.011688,0.998684,0.049943,0.000000,0.005764,-0.050012,0.998732,0.000000,28.181599,-0.033857,-0.001693,1.000000;;, + 3120;16;0.999913,-0.011770,-0.005889,0.000000,0.012042,0.998750,0.048503,0.000000,0.005310,-0.048570,0.998806,0.000000,28.181557,-0.033831,-0.001643,1.000000;;, + 3200;16;0.999910,-0.012246,-0.005421,0.000000,0.012485,0.998842,0.046459,0.000000,0.004846,-0.046522,0.998905,0.000000,28.181559,-0.033862,-0.001575,1.000000;;, + 3280;16;0.999906,-0.012764,-0.004945,0.000000,0.012968,0.998953,0.043868,0.000000,0.004380,-0.043928,0.999025,0.000000,28.181566,-0.033826,-0.001487,1.000000;;, + 3360;16;0.999902,-0.013275,-0.004470,0.000000,0.013446,0.999077,0.040788,0.000000,0.003924,-0.040844,0.999158,0.000000,28.181530,-0.033886,-0.001383,1.000000;;, + 3440;16;0.999898,-0.013710,-0.004007,0.000000,0.013850,0.999209,0.037272,0.000000,0.003493,-0.037324,0.999297,0.000000,28.181486,-0.033862,-0.001263,1.000000;;, + 3520;16;0.999895,-0.014085,-0.003553,0.000000,0.014195,0.999341,0.033398,0.000000,0.003080,-0.033445,0.999436,0.000000,28.181517,-0.033820,-0.001130,1.000000;;, + 3600;16;0.999892,-0.014378,-0.003112,0.000000,0.014463,0.999467,0.029249,0.000000,0.002690,-0.029291,0.999567,0.000000,28.181490,-0.033846,-0.000991,1.000000;;, + 3680;16;0.999889,-0.014633,-0.002678,0.000000,0.014695,0.999583,0.024863,0.000000,0.002313,-0.024899,0.999687,0.000000,28.181467,-0.033848,-0.000841,1.000000;;, + 3760;16;0.999887,-0.014890,-0.002241,0.000000,0.014933,0.999682,0.020298,0.000000,0.001938,-0.020329,0.999792,0.000000,28.181490,-0.033844,-0.000687,1.000000;;, + 3840;16;0.999884,-0.015138,-0.001804,0.000000,0.015164,0.999764,0.015564,0.000000,0.001568,-0.015589,0.999877,0.000000,28.181444,-0.033860,-0.000526,1.000000;;, + 3920;16;0.999881,-0.015377,-0.001368,0.000000,0.015390,0.999825,0.010683,0.000000,0.001203,-0.010703,0.999942,0.000000,28.181479,-0.033850,-0.000361,1.000000;;, + 4000;16;0.999878,-0.015607,-0.000931,0.000000,0.015612,0.999862,0.005677,0.000000,0.000842,-0.005691,0.999983,0.000000,28.181408,-0.033862,-0.000190,1.000000;;, + 4080;16;0.999875,-0.015831,-0.000494,0.000000,0.015832,0.999874,0.000569,0.000000,0.000485,-0.000577,1.000000,0.000000,28.181391,-0.033842,-0.000016,1.000000;;, + 4160;16;0.999871,-0.016049,-0.000057,0.000000,0.016049,0.999861,-0.004620,0.000000,0.000131,0.004618,0.999989,0.000000,28.181423,-0.033896,0.000155,1.000000;;, + 4240;16;0.999868,-0.016262,0.000381,0.000000,0.016265,0.999819,-0.009867,0.000000,-0.000220,0.009872,0.999951,0.000000,28.181391,-0.033872,0.000335,1.000000;;, + 4320;16;0.999864,-0.016470,0.000819,0.000000,0.016481,0.999749,-0.015150,0.000000,-0.000569,0.015162,0.999885,0.000000,28.181414,-0.033918,0.000510,1.000000;;, + 4400;16;0.999860,-0.016676,0.001259,0.000000,0.016698,0.999652,-0.020448,0.000000,-0.000917,0.020466,0.999790,0.000000,28.181410,-0.033869,0.000693,1.000000;;, + 4480;16;0.999856,-0.016880,0.001699,0.000000,0.016918,0.999526,-0.025737,0.000000,-0.001264,0.025763,0.999667,0.000000,28.181383,-0.033883,0.000871,1.000000;;, + 4560;16;0.999852,-0.017082,0.002141,0.000000,0.017141,0.999372,-0.030997,0.000000,-0.001611,0.031029,0.999517,0.000000,28.181395,-0.033810,0.001054,1.000000;;, + 4640;16;0.999847,-0.017285,0.002585,0.000000,0.017367,0.999193,-0.036204,0.000000,-0.001957,0.036244,0.999341,0.000000,28.181389,-0.033833,0.001229,1.000000;;, + 4720;16;0.999842,-0.017491,0.003030,0.000000,0.017601,0.998991,-0.041308,0.000000,-0.002305,0.041355,0.999142,0.000000,28.181398,-0.033816,0.001402,1.000000;;, + 4800;16;0.999837,-0.017696,0.003477,0.000000,0.017838,0.998765,-0.046374,0.000000,-0.002652,0.046428,0.998918,0.000000,28.181417,-0.033880,0.001568,1.000000;;, + 4960;16;0.999844,-0.017541,0.002139,0.000000,0.017628,0.998492,-0.051985,0.000000,-0.001224,0.052014,0.998646,0.000000,28.181387,-0.033838,0.001761,1.000000;;; + } + { Bip01_Spine3 } + } + + Animation { + + + AnimationKey { + 4; + 62; + 0;16;0.861629,0.507538,0.000001,0.000000,-0.507538,0.861629,-0.000000,0.000000,-0.000001,-0.000000,1.000000,0.000000,42.566051,-0.019152,-0.000001,1.000000;;, + 80;16;0.861629,0.507538,0.000001,0.000000,-0.507538,0.861629,-0.000000,0.000000,-0.000001,-0.000000,1.000000,0.000000,42.566063,-0.019157,-0.000001,1.000000;;, + 160;16;0.861629,0.507538,0.000001,0.000000,-0.507538,0.861629,-0.000000,0.000000,-0.000001,-0.000000,1.000000,0.000000,42.566074,-0.019146,-0.000000,1.000000;;, + 240;16;0.861629,0.507538,0.000001,0.000000,-0.507538,0.861629,-0.000000,0.000000,-0.000001,-0.000000,1.000000,0.000000,42.566082,-0.019151,-0.000001,1.000000;;, + 320;16;0.861629,0.507538,0.000001,0.000000,-0.507538,0.861629,-0.000000,0.000000,-0.000001,-0.000000,1.000000,0.000000,42.566093,-0.019149,-0.000000,1.000000;;, + 400;16;0.861629,0.507538,0.000001,0.000000,-0.507538,0.861629,-0.000000,0.000000,-0.000001,-0.000000,1.000000,0.000000,42.566093,-0.019138,0.000001,1.000000;;, + 480;16;0.861629,0.507538,0.000001,0.000000,-0.507538,0.861629,-0.000000,0.000000,-0.000001,-0.000000,1.000000,0.000000,42.566078,-0.019146,-0.000000,1.000000;;, + 560;16;0.861629,0.507538,0.000001,0.000000,-0.507538,0.861629,-0.000000,0.000000,-0.000001,-0.000000,1.000000,0.000000,42.566078,-0.019152,-0.000001,1.000000;;, + 640;16;0.861629,0.507538,0.000001,0.000000,-0.507538,0.861629,-0.000000,0.000000,-0.000001,-0.000000,1.000000,0.000000,42.566071,-0.019145,0.000000,1.000000;;, + 720;16;0.861629,0.507538,0.000001,0.000000,-0.507538,0.861629,-0.000000,0.000000,-0.000001,-0.000000,1.000000,0.000000,42.566078,-0.019133,0.000002,1.000000;;, + 800;16;0.861629,0.507538,0.000001,0.000000,-0.507538,0.861629,-0.000000,0.000000,-0.000001,-0.000000,1.000000,0.000000,42.566055,-0.019141,0.000000,1.000000;;, + 880;16;0.861629,0.507538,0.000001,0.000000,-0.507538,0.861629,-0.000000,0.000000,-0.000001,-0.000000,1.000000,0.000000,42.566093,-0.019140,0.000001,1.000000;;, + 960;16;0.861629,0.507538,0.000001,0.000000,-0.507538,0.861629,-0.000000,0.000000,-0.000001,-0.000000,1.000000,0.000000,42.566048,-0.019155,-0.000003,1.000000;;, + 1040;16;0.861629,0.507538,0.000001,0.000000,-0.507538,0.861629,-0.000000,0.000000,-0.000001,-0.000000,1.000000,0.000000,42.566097,-0.019147,0.000001,1.000000;;, + 1120;16;0.861629,0.507538,0.000001,0.000000,-0.507538,0.861629,-0.000000,0.000000,-0.000001,-0.000000,1.000000,0.000000,42.566082,-0.019140,0.000001,1.000000;;, + 1200;16;0.861629,0.507538,0.000001,0.000000,-0.507538,0.861629,-0.000000,0.000000,-0.000001,-0.000000,1.000000,0.000000,42.566078,-0.019156,-0.000001,1.000000;;, + 1280;16;0.861629,0.507538,0.000001,0.000000,-0.507538,0.861629,-0.000000,0.000000,-0.000001,-0.000000,1.000000,0.000000,42.566055,-0.019162,-0.000003,1.000000;;, + 1360;16;0.861629,0.507538,0.000001,0.000000,-0.507538,0.861629,-0.000000,0.000000,-0.000001,-0.000000,1.000000,0.000000,42.566086,-0.019146,0.000000,1.000000;;, + 1440;16;0.861629,0.507538,0.000001,0.000000,-0.507538,0.861629,-0.000000,0.000000,-0.000001,-0.000000,1.000000,0.000000,42.566071,-0.019169,-0.000002,1.000000;;, + 1520;16;0.861629,0.507538,0.000001,0.000000,-0.507538,0.861629,-0.000000,0.000000,-0.000001,-0.000000,1.000000,0.000000,42.566051,-0.019159,-0.000002,1.000000;;, + 1600;16;0.861629,0.507538,0.000001,0.000000,-0.507538,0.861629,-0.000000,0.000000,-0.000001,-0.000000,1.000000,0.000000,42.566067,-0.019163,-0.000001,1.000000;;, + 1680;16;0.861629,0.507538,0.000001,0.000000,-0.507538,0.861629,-0.000000,0.000000,-0.000001,-0.000000,1.000000,0.000000,42.566071,-0.019174,-0.000001,1.000000;;, + 1760;16;0.861629,0.507538,0.000001,0.000000,-0.507538,0.861629,-0.000000,0.000000,-0.000001,-0.000000,1.000000,0.000000,42.566082,-0.019169,-0.000000,1.000000;;, + 1840;16;0.861629,0.507538,0.000001,0.000000,-0.507538,0.861629,-0.000000,0.000000,-0.000001,-0.000000,1.000000,0.000000,42.566093,-0.019141,0.000001,1.000000;;, + 1920;16;0.861629,0.507538,0.000001,0.000000,-0.507538,0.861629,-0.000000,0.000000,-0.000001,-0.000000,1.000000,0.000000,42.566051,-0.019146,-0.000001,1.000000;;, + 2000;16;0.861629,0.507538,0.000001,0.000000,-0.507538,0.861629,-0.000000,0.000000,-0.000001,-0.000000,1.000000,0.000000,42.566090,-0.019145,0.000001,1.000000;;, + 2080;16;0.861629,0.507538,0.000001,0.000000,-0.507538,0.861629,-0.000000,0.000000,-0.000001,-0.000000,1.000000,0.000000,42.566048,-0.019155,-0.000001,1.000000;;, + 2160;16;0.861629,0.507538,0.000001,0.000000,-0.507538,0.861629,-0.000000,0.000000,-0.000001,-0.000000,1.000000,0.000000,42.566059,-0.019159,-0.000001,1.000000;;, + 2240;16;0.861629,0.507538,0.000001,0.000000,-0.507538,0.861629,-0.000000,0.000000,-0.000001,-0.000000,1.000000,0.000000,42.566086,-0.019147,0.000001,1.000000;;, + 2320;16;0.861629,0.507538,0.000001,0.000000,-0.507538,0.861629,-0.000000,0.000000,-0.000001,-0.000000,1.000000,0.000000,42.566067,-0.019134,-0.000002,1.000000;;, + 2400;16;0.861629,0.507538,0.000001,0.000000,-0.507538,0.861629,-0.000000,0.000000,-0.000001,-0.000000,1.000000,0.000000,42.566071,-0.019154,0.000000,1.000000;;, + 2480;16;0.861629,0.507538,0.000001,0.000000,-0.507538,0.861629,-0.000000,0.000000,-0.000001,-0.000000,1.000000,0.000000,42.566097,-0.019141,0.000000,1.000000;;, + 2560;16;0.861629,0.507538,0.000001,0.000000,-0.507538,0.861629,-0.000000,0.000000,-0.000001,-0.000000,1.000000,0.000000,42.566093,-0.019137,-0.000000,1.000000;;, + 2640;16;0.861629,0.507538,0.000001,0.000000,-0.507538,0.861629,-0.000000,0.000000,-0.000001,-0.000000,1.000000,0.000000,42.566067,-0.019130,-0.000002,1.000000;;, + 2720;16;0.861629,0.507538,0.000001,0.000000,-0.507538,0.861629,-0.000000,0.000000,-0.000001,-0.000000,1.000000,0.000000,42.566063,-0.019083,-0.000004,1.000000;;, + 2800;16;0.861629,0.507538,0.000001,0.000000,-0.507538,0.861629,-0.000000,0.000000,-0.000001,-0.000000,1.000000,0.000000,42.566048,-0.019105,-0.000003,1.000000;;, + 2880;16;0.861629,0.507538,0.000001,0.000000,-0.507538,0.861629,-0.000000,0.000000,-0.000001,-0.000000,1.000000,0.000000,42.566074,-0.019139,-0.000000,1.000000;;, + 2960;16;0.861629,0.507538,0.000001,0.000000,-0.507538,0.861629,-0.000000,0.000000,-0.000001,-0.000000,1.000000,0.000000,42.566059,-0.019120,-0.000001,1.000000;;, + 3040;16;0.861629,0.507538,0.000001,0.000000,-0.507538,0.861629,-0.000000,0.000000,-0.000001,-0.000000,1.000000,0.000000,42.566078,-0.019110,-0.000001,1.000000;;, + 3120;16;0.861629,0.507538,0.000001,0.000000,-0.507538,0.861629,-0.000000,0.000000,-0.000001,-0.000000,1.000000,0.000000,42.566090,-0.019134,-0.000000,1.000000;;, + 3200;16;0.861629,0.507538,0.000001,0.000000,-0.507538,0.861629,-0.000000,0.000000,-0.000001,-0.000000,1.000000,0.000000,42.566090,-0.019111,-0.000001,1.000000;;, + 3280;16;0.861629,0.507538,0.000001,0.000000,-0.507538,0.861629,-0.000000,0.000000,-0.000001,-0.000000,1.000000,0.000000,42.566059,-0.019137,0.000000,1.000000;;, + 3360;16;0.861629,0.507538,0.000001,0.000000,-0.507538,0.861629,-0.000000,0.000000,-0.000001,-0.000000,1.000000,0.000000,42.566067,-0.019102,-0.000000,1.000000;;, + 3440;16;0.861629,0.507538,0.000001,0.000000,-0.507538,0.861629,-0.000000,0.000000,-0.000001,-0.000000,1.000000,0.000000,42.566082,-0.019094,0.000001,1.000000;;, + 3520;16;0.861629,0.507538,0.000001,0.000000,-0.507538,0.861629,-0.000000,0.000000,-0.000001,-0.000000,1.000000,0.000000,42.566071,-0.019155,-0.000000,1.000000;;, + 3600;16;0.861629,0.507538,0.000001,0.000000,-0.507538,0.861629,-0.000000,0.000000,-0.000001,-0.000000,1.000000,0.000000,42.566086,-0.019138,-0.000000,1.000000;;, + 3680;16;0.861629,0.507538,0.000001,0.000000,-0.507538,0.861629,-0.000000,0.000000,-0.000001,-0.000000,1.000000,0.000000,42.566086,-0.019154,-0.000000,1.000000;;, + 3760;16;0.861629,0.507538,0.000001,0.000000,-0.507538,0.861629,-0.000000,0.000000,-0.000001,-0.000000,1.000000,0.000000,42.566071,-0.019144,0.000000,1.000000;;, + 3840;16;0.861629,0.507538,0.000001,0.000000,-0.507538,0.861629,-0.000000,0.000000,-0.000001,-0.000000,1.000000,0.000000,42.566093,-0.019120,0.000000,1.000000;;, + 3920;16;0.861629,0.507538,0.000001,0.000000,-0.507538,0.861629,-0.000000,0.000000,-0.000001,-0.000000,1.000000,0.000000,42.566059,-0.019139,0.000001,1.000000;;, + 4000;16;0.861629,0.507538,0.000001,0.000000,-0.507538,0.861629,-0.000000,0.000000,-0.000001,-0.000000,1.000000,0.000000,42.566074,-0.019157,-0.000001,1.000000;;, + 4080;16;0.861629,0.507538,0.000001,0.000000,-0.507538,0.861629,-0.000000,0.000000,-0.000001,-0.000000,1.000000,0.000000,42.566097,-0.019134,0.000000,1.000000;;, + 4160;16;0.861629,0.507538,0.000001,0.000000,-0.507538,0.861629,-0.000000,0.000000,-0.000001,-0.000000,1.000000,0.000000,42.566059,-0.019083,0.000005,1.000000;;, + 4240;16;0.861629,0.507538,0.000001,0.000000,-0.507538,0.861629,-0.000000,0.000000,-0.000001,-0.000000,1.000000,0.000000,42.566097,-0.019126,0.000001,1.000000;;, + 4320;16;0.861629,0.507538,0.000001,0.000000,-0.507538,0.861629,-0.000000,0.000000,-0.000001,-0.000000,1.000000,0.000000,42.566090,-0.019128,0.000001,1.000000;;, + 4400;16;0.861629,0.507538,0.000001,0.000000,-0.507538,0.861629,-0.000000,0.000000,-0.000001,-0.000000,1.000000,0.000000,42.566086,-0.019094,0.000005,1.000000;;, + 4480;16;0.861629,0.507538,0.000001,0.000000,-0.507538,0.861629,-0.000000,0.000000,-0.000001,-0.000000,1.000000,0.000000,42.566086,-0.019163,-0.000002,1.000000;;, + 4560;16;0.861629,0.507538,0.000001,0.000000,-0.507538,0.861629,-0.000000,0.000000,-0.000001,-0.000000,1.000000,0.000000,42.566044,-0.019131,0.000002,1.000000;;, + 4640;16;0.861629,0.507538,0.000001,0.000000,-0.507538,0.861629,-0.000000,0.000000,-0.000001,-0.000000,1.000000,0.000000,42.566113,-0.019136,0.000001,1.000000;;, + 4720;16;0.861629,0.507538,0.000001,0.000000,-0.507538,0.861629,-0.000000,0.000000,-0.000001,-0.000000,1.000000,0.000000,42.566063,-0.019118,0.000004,1.000000;;, + 4800;16;0.861629,0.507538,0.000001,0.000000,-0.507538,0.861629,-0.000000,0.000000,-0.000001,-0.000000,1.000000,0.000000,42.566055,-0.019138,0.000001,1.000000;;, + 4960;16;0.861629,0.507538,0.000001,0.000000,-0.507538,0.861629,-0.000000,0.000000,-0.000001,-0.000000,1.000000,0.000000,42.566051,-0.019152,-0.000001,1.000000;;; + } + { Bip01_Neck } + } + + Animation { + + + AnimationKey { + 4; + 62; + 0;16;0.975145,-0.214584,-0.055187,0.000000,0.220005,0.967277,0.126384,0.000000,0.026261,-0.135385,0.990445,0.000000,27.900181,-0.000002,0.000000,1.000000;;, + 80;16;0.975197,-0.214991,-0.052635,0.000000,0.220268,0.966011,0.135298,0.000000,0.021758,-0.143536,0.989406,0.000000,27.900167,-0.000002,-0.000001,1.000000;;, + 160;16;0.975267,-0.215301,-0.049997,0.000000,0.220365,0.964664,0.144437,0.000000,0.017133,-0.151882,0.988250,0.000000,27.900175,0.000002,0.000000,1.000000;;, + 240;16;0.975441,-0.215181,-0.047029,0.000000,0.219930,0.963202,0.154506,0.000000,0.012052,-0.161054,0.986872,0.000000,27.900183,-0.000004,0.000001,1.000000;;, + 320;16;0.975573,-0.215199,-0.044121,0.000000,0.219562,0.961661,0.164319,0.000000,0.007068,-0.169992,0.985420,0.000000,27.900177,0.000001,0.000001,1.000000;;, + 400;16;0.975580,-0.215682,-0.041530,0.000000,0.219629,0.960090,0.173176,0.000000,0.002521,-0.178068,0.984015,0.000000,27.900154,-0.000002,-0.000002,1.000000;;, + 480;16;0.975383,-0.216948,-0.039524,0.000000,0.220516,0.958559,0.180383,0.000000,-0.001248,-0.184658,0.982802,0.000000,27.900179,-0.000001,0.000000,1.000000;;, + 560;16;0.975012,-0.218842,-0.038201,0.000000,0.222115,0.957236,0.185378,0.000000,-0.004001,-0.189231,0.981925,0.000000,27.900166,0.000005,-0.000000,1.000000;;, + 640;16;0.974044,-0.223089,-0.038331,0.000000,0.226300,0.955921,0.187092,0.000000,-0.005097,-0.190910,0.981594,0.000000,27.900171,-0.000009,-0.000000,1.000000;;, + 720;16;0.971828,-0.232107,-0.040951,0.000000,0.235664,0.954284,0.183861,0.000000,-0.003596,-0.188332,0.982099,0.000000,27.900181,-0.000010,-0.000001,1.000000;;, + 800;16;0.968795,-0.243752,-0.044946,0.000000,0.247861,0.952526,0.176804,0.000000,-0.000284,-0.182427,0.983219,0.000000,27.900183,-0.000007,0.000000,1.000000;;, + 880;16;0.964823,-0.258093,-0.050051,0.000000,0.262858,0.950475,0.165841,0.000000,0.004770,-0.173163,0.984882,0.000000,27.900158,-0.000001,-0.000002,1.000000;;, + 960;16;0.961036,-0.270992,-0.054531,0.000000,0.276231,0.948855,0.152875,0.000000,0.010314,-0.161981,0.986740,0.000000,27.900185,-0.000003,0.000001,1.000000;;, + 1040;16;0.958751,-0.278453,-0.057093,0.000000,0.283838,0.948626,0.139806,0.000000,0.015230,-0.150244,0.988532,0.000000,27.900154,0.000002,-0.000001,1.000000;;, + 1120;16;0.958315,-0.279751,-0.058075,0.000000,0.285039,0.950072,0.126952,0.000000,0.019660,-0.138214,0.990207,0.000000,27.900169,-0.000004,-0.000001,1.000000;;, + 1200;16;0.960714,-0.271553,-0.057341,0.000000,0.276558,0.954028,0.115524,0.000000,0.023334,-0.126844,0.991648,0.000000,27.900175,0.000008,0.000000,1.000000;;, + 1280;16;0.964677,-0.257395,-0.056096,0.000000,0.262063,0.959356,0.104684,0.000000,0.026871,-0.115686,0.992922,0.000000,27.900183,0.000001,0.000001,1.000000;;, + 1360;16;0.969418,-0.239136,-0.055161,0.000000,0.243477,0.965345,0.093953,0.000000,0.030781,-0.104510,0.994047,0.000000,27.900160,0.000011,-0.000000,1.000000;;, + 1440;16;0.974249,-0.218751,-0.054649,0.000000,0.222769,0.971291,0.083475,0.000000,0.034820,-0.093500,0.995010,0.000000,27.900187,0.000001,0.000001,1.000000;;, + 1520;16;0.978630,-0.198249,-0.054603,0.000000,0.201936,0.976656,0.073246,0.000000,0.038807,-0.082707,0.995818,0.000000,27.900177,0.000001,0.000000,1.000000;;, + 1600;16;0.982195,-0.179675,-0.054862,0.000000,0.183003,0.981076,0.063241,0.000000,0.042461,-0.072155,0.996489,0.000000,27.900177,-0.000000,0.000001,1.000000;;, + 1680;16;0.984643,-0.165625,-0.055193,0.000000,0.168535,0.984267,0.053052,0.000000,0.045538,-0.061539,0.997065,0.000000,27.900185,0.000018,0.000000,1.000000;;, + 1760;16;0.986165,-0.156511,-0.054617,0.000000,0.158953,0.986321,0.043648,0.000000,0.047039,-0.051725,0.997553,0.000000,27.900152,0.000007,-0.000001,1.000000;;, + 1840;16;0.986674,-0.154239,-0.051811,0.000000,0.156181,0.987081,0.035767,0.000000,0.045625,-0.043382,0.998016,0.000000,27.900175,-0.000011,0.000000,1.000000;;, + 1920;16;0.986546,-0.156575,-0.047031,0.000000,0.158056,0.986987,0.029593,0.000000,0.041786,-0.036628,0.998455,0.000000,27.900173,-0.000017,0.000000,1.000000;;, + 2000;16;0.985931,-0.162299,-0.039997,0.000000,0.163398,0.986220,0.025917,0.000000,0.035239,-0.032088,0.998864,0.000000,27.900160,0.000003,-0.000001,1.000000;;, + 2080;16;0.984863,-0.170390,-0.031822,0.000000,0.171175,0.984952,0.023833,0.000000,0.027282,-0.028919,0.999209,0.000000,27.900188,0.000003,0.000000,1.000000;;, + 2160;16;0.983443,-0.179718,-0.023291,0.000000,0.180245,0.983354,0.022937,0.000000,0.018781,-0.026756,0.999466,0.000000,27.900175,0.000010,-0.000000,1.000000;;, + 2240;16;0.981698,-0.189796,-0.015703,0.000000,0.190118,0.981504,0.022470,0.000000,0.011148,-0.025044,0.999624,0.000000,27.900187,0.000002,-0.000001,1.000000;;, + 2320;16;0.979787,-0.199760,-0.010657,0.000000,0.199947,0.979580,0.021069,0.000000,0.006231,-0.022774,0.999721,0.000000,27.900188,-0.000012,0.000001,1.000000;;, + 2400;16;0.977670,-0.209981,-0.008269,0.000000,0.210108,0.977475,0.019939,0.000000,0.003896,-0.021231,0.999767,0.000000,27.900152,0.000001,-0.000000,1.000000;;, + 2480;16;0.975316,-0.220598,-0.009744,0.000000,0.220752,0.975133,0.019579,0.000000,0.005183,-0.021247,0.999761,0.000000,27.900166,-0.000005,0.000000,1.000000;;, + 2560;16;0.972729,-0.231551,-0.013496,0.000000,0.231795,0.972544,0.020746,0.000000,0.008321,-0.023308,0.999694,0.000000,27.900156,0.000010,-0.000000,1.000000;;, + 2640;16;0.969809,-0.243150,-0.018652,0.000000,0.243566,0.969568,0.024771,0.000000,0.012061,-0.028566,0.999519,0.000000,27.900169,-0.000002,0.000000,1.000000;;, + 2720;16;0.966884,-0.254043,-0.024428,0.000000,0.254722,0.966532,0.030538,0.000000,0.015852,-0.035749,0.999235,0.000000,27.900152,-0.000005,0.000001,1.000000;;, + 2800;16;0.964304,-0.263100,-0.029933,0.000000,0.264120,0.963753,0.037692,0.000000,0.018932,-0.044252,0.998841,0.000000,27.900171,-0.000013,0.000001,1.000000;;, + 2880;16;0.962281,-0.269829,-0.034751,0.000000,0.271235,0.961439,0.045462,0.000000,0.021144,-0.053173,0.998361,0.000000,27.900160,0.000003,0.000000,1.000000;;, + 2960;16;0.961211,-0.273166,-0.038119,0.000000,0.274934,0.959976,0.053444,0.000000,0.021994,-0.061851,0.997843,0.000000,27.900177,0.000008,-0.000000,1.000000;;, + 3040;16;0.960963,-0.273772,-0.039975,0.000000,0.275810,0.959323,0.060235,0.000000,0.021858,-0.068909,0.997383,0.000000,27.900162,-0.000004,0.000000,1.000000;;, + 3120;16;0.961544,-0.271764,-0.039720,0.000000,0.273867,0.959642,0.063915,0.000000,0.020747,-0.072335,0.997165,0.000000,27.900173,-0.000012,0.000000,1.000000;;, + 3200;16;0.962726,-0.267803,-0.037950,0.000000,0.269818,0.960676,0.065568,0.000000,0.018898,-0.073363,0.997126,0.000000,27.900158,-0.000005,0.000000,1.000000;;, + 3280;16;0.964310,-0.262468,-0.034891,0.000000,0.264264,0.962246,0.065163,0.000000,0.016470,-0.072058,0.997264,0.000000,27.900173,-0.000016,-0.000000,1.000000;;, + 3360;16;0.966149,-0.256110,-0.031048,0.000000,0.257631,0.964118,0.064053,0.000000,0.013529,-0.069883,0.997463,0.000000,27.900162,-0.000006,0.000000,1.000000;;, + 3440;16;0.968062,-0.249274,-0.026813,0.000000,0.250507,0.966045,0.063278,0.000000,0.010129,-0.067974,0.997636,0.000000,27.900162,-0.000003,-0.000000,1.000000;;, + 3520;16;0.970018,-0.241960,-0.022798,0.000000,0.242941,0.967945,0.063730,0.000000,0.006647,-0.067358,0.997707,0.000000,27.900169,-0.000007,0.000000,1.000000;;, + 3600;16;0.971815,-0.234939,-0.019495,0.000000,0.235725,0.969518,0.066851,0.000000,0.003195,-0.069562,0.997573,0.000000,27.900171,0.000011,0.000000,1.000000;;, + 3680;16;0.973899,-0.226296,-0.017646,0.000000,0.226981,0.971228,0.072079,0.000000,0.000827,-0.074203,0.997243,0.000000,27.900162,-0.000001,-0.000000,1.000000;;, + 3760;16;0.976723,-0.213722,-0.018324,0.000000,0.214504,0.973451,0.079882,0.000000,0.000765,-0.081953,0.996636,0.000000,27.900162,-0.000009,0.000000,1.000000;;, + 3840;16;0.979840,-0.198735,-0.020458,0.000000,0.199771,0.975824,0.088652,0.000000,0.002345,-0.090952,0.995853,0.000000,27.900175,-0.000003,-0.000000,1.000000;;, + 3920;16;0.983210,-0.180917,-0.023818,0.000000,0.182388,0.978428,0.097019,0.000000,0.005752,-0.099734,0.994998,0.000000,27.900173,-0.000014,-0.000000,1.000000;;, + 4000;16;0.986085,-0.163976,-0.027349,0.000000,0.165961,0.980553,0.104746,0.000000,0.009641,-0.107828,0.994123,0.000000,27.900162,0.000001,0.000000,1.000000;;, + 4080;16;0.987968,-0.151660,-0.030298,0.000000,0.154119,0.981778,0.111169,0.000000,0.012886,-0.114501,0.993340,0.000000,27.900160,0.000008,0.000000,1.000000;;, + 4160;16;0.989028,-0.143993,-0.032998,0.000000,0.146890,0.982308,0.116169,0.000000,0.015686,-0.119741,0.992681,0.000000,27.900154,-0.000039,-0.000003,1.000000;;, + 4240;16;0.989065,-0.143150,-0.035464,0.000000,0.146405,0.982010,0.119259,0.000000,0.017754,-0.123147,0.992230,0.000000,27.900167,-0.000010,-0.000001,1.000000;;, + 4320;16;0.988482,-0.146415,-0.038289,0.000000,0.150030,0.981253,0.120965,0.000000,0.019860,-0.125316,0.991918,0.000000,27.900164,0.000004,0.000000,1.000000;;, + 4400;16;0.987508,-0.151910,-0.041857,0.000000,0.155947,0.980259,0.121543,0.000000,0.022567,-0.126552,0.991703,0.000000,27.900160,-0.000023,-0.000002,1.000000;;, + 4480;16;0.986183,-0.159134,-0.046045,0.000000,0.163642,0.979044,0.121219,0.000000,0.025790,-0.127079,0.991557,0.000000,27.900187,-0.000000,0.000001,1.000000;;, + 4560;16;0.984606,-0.167248,-0.050779,0.000000,0.172273,0.977686,0.120217,0.000000,0.029539,-0.127114,0.991448,0.000000,27.900185,-0.000018,-0.000002,1.000000;;, + 4640;16;0.982904,-0.175418,-0.055927,0.000000,0.180995,0.976288,0.118754,0.000000,0.033769,-0.126846,0.991347,0.000000,27.900181,0.000027,0.000003,1.000000;;, + 4720;16;0.981339,-0.182286,-0.061210,0.000000,0.188427,0.975080,0.117110,0.000000,0.038337,-0.126458,0.991231,0.000000,27.900169,-0.000003,-0.000001,1.000000;;, + 4800;16;0.979775,-0.188667,-0.066683,0.000000,0.195389,0.973921,0.115333,0.000000,0.043184,-0.126029,0.991086,0.000000,27.900173,0.000003,0.000000,1.000000;;, + 4960;16;0.975145,-0.214584,-0.055187,0.000000,0.220005,0.967277,0.126384,0.000000,0.026261,-0.135385,0.990445,0.000000,27.900181,-0.000002,0.000000,1.000000;;; + } + { Bip01_Head } + } + + Animation { + + + AnimationKey { + 4; + 62; + 0;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,59.615768,-0.000004,0.000001,1.000000;;, + 80;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,59.615772,0.000003,0.000001,1.000000;;, + 160;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,59.615749,-0.000000,0.000001,1.000000;;, + 240;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,59.615746,-0.000004,0.000000,1.000000;;, + 320;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,59.615734,-0.000004,-0.000001,1.000000;;, + 400;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,59.615768,0.000001,0.000001,1.000000;;, + 480;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,59.615765,0.000003,0.000002,1.000000;;, + 560;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,59.615765,-0.000004,0.000002,1.000000;;, + 640;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,59.615761,-0.000003,0.000001,1.000000;;, + 720;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,59.615761,-0.000005,0.000000,1.000000;;, + 800;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,59.615761,-0.000002,-0.000000,1.000000;;, + 880;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,59.615749,0.000004,-0.000002,1.000000;;, + 960;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,59.615753,0.000005,-0.000000,1.000000;;, + 1040;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,59.615768,-0.000001,0.000003,1.000000;;, + 1120;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,59.615734,0.000003,-0.000002,1.000000;;, + 1200;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,59.615768,-0.000001,0.000001,1.000000;;, + 1280;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,59.615742,-0.000006,-0.000001,1.000000;;, + 1360;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,59.615749,0.000003,-0.000001,1.000000;;, + 1440;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,59.615768,0.000004,0.000002,1.000000;;, + 1520;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,59.615742,0.000006,-0.000000,1.000000;;, + 1600;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,59.615749,-0.000011,0.000001,1.000000;;, + 1680;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,59.615746,0.000012,-0.000002,1.000000;;, + 1760;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,59.615753,0.000001,-0.000001,1.000000;;, + 1840;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,59.615742,0.000017,-0.000003,1.000000;;, + 1920;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,59.615761,-0.000011,0.000001,1.000000;;, + 2000;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,59.615753,0.000013,-0.000002,1.000000;;, + 2080;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,59.615734,-0.000007,-0.000001,1.000000;;, + 2160;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,59.615768,0.000002,-0.000001,1.000000;;, + 2240;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,59.615746,0.000013,-0.000001,1.000000;;, + 2320;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,59.615746,-0.000003,-0.000000,1.000000;;, + 2400;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,59.615738,0.000004,-0.000001,1.000000;;, + 2480;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,59.615746,0.000004,-0.000000,1.000000;;, + 2560;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,59.615757,-0.000004,0.000000,1.000000;;, + 2640;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,59.615742,-0.000011,0.000001,1.000000;;, + 2720;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,59.615753,-0.000009,0.000001,1.000000;;, + 2800;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,59.615761,0.000006,-0.000000,1.000000;;, + 2880;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,59.615753,-0.000010,0.000001,1.000000;;, + 2960;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,59.615761,0.000013,-0.000000,1.000000;;, + 3040;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,59.615746,-0.000012,0.000001,1.000000;;, + 3120;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,59.615757,-0.000015,0.000001,1.000000;;, + 3200;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,59.615768,-0.000011,0.000002,1.000000;;, + 3280;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,59.615738,-0.000002,-0.000000,1.000000;;, + 3360;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,59.615738,-0.000005,0.000001,1.000000;;, + 3440;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,59.615761,-0.000002,0.000000,1.000000;;, + 3520;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,59.615772,0.000001,0.000000,1.000000;;, + 3600;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,59.615757,-0.000005,0.000000,1.000000;;, + 3680;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,59.615753,-0.000011,0.000001,1.000000;;, + 3760;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,59.615768,-0.000011,0.000001,1.000000;;, + 3840;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,59.615757,0.000005,-0.000000,1.000000;;, + 3920;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,59.615768,-0.000009,0.000001,1.000000;;, + 4000;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,59.615765,0.000010,-0.000000,1.000000;;, + 4080;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,59.615749,0.000009,0.000000,1.000000;;, + 4160;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,59.615776,0.000010,0.000000,1.000000;;, + 4240;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,59.615768,-0.000026,0.000001,1.000000;;, + 4320;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,59.615742,-0.000026,0.000000,1.000000;;, + 4400;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,59.615765,0.000016,0.000000,1.000000;;, + 4480;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,59.615753,0.000004,0.000001,1.000000;;, + 4560;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,59.615746,0.000007,-0.000002,1.000000;;, + 4640;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,59.615757,-0.000022,0.000001,1.000000;;, + 4720;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,59.615765,0.000010,0.000000,1.000000;;, + 4800;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,59.615768,0.000027,0.000002,1.000000;;, + 4960;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,59.615768,-0.000004,0.000001,1.000000;;; + } + { Dummy21 } + } + + Animation { + + + AnimationKey { + 4; + 62; + 0;16;-0.167240,0.313773,0.934654,0.000000,-0.498528,-0.844794,0.194403,0.000000,0.850588,-0.433439,0.297708,0.000000,-12.374964,4.006889,8.346216,1.000000;;, + 80;16;-0.169076,0.312790,0.934653,0.000000,-0.498708,-0.845100,0.192605,0.000000,0.850120,-0.433554,0.298877,0.000000,-12.374962,4.006893,8.346217,1.000000;;, + 160;16;-0.170912,0.311807,0.934647,0.000000,-0.498887,-0.845402,0.190807,0.000000,0.849648,-0.433672,0.300046,0.000000,-12.374972,4.006898,8.346217,1.000000;;, + 240;16;-0.172799,0.310943,0.934588,0.000000,-0.499055,-0.845688,0.189093,0.000000,0.849167,-0.433736,0.301312,0.000000,-12.374967,4.006896,8.346217,1.000000;;, + 320;16;-0.174582,0.309843,0.934622,0.000000,-0.499239,-0.845999,0.187208,0.000000,0.848694,-0.433917,0.302382,0.000000,-12.374953,4.006895,8.346217,1.000000;;, + 400;16;-0.176219,0.308312,0.934821,0.000000,-0.499453,-0.846361,0.184988,0.000000,0.848230,-0.434300,0.303132,0.000000,-12.374983,4.006896,8.346216,1.000000;;, + 480;16;-0.177428,0.305993,0.935354,0.000000,-0.499714,-0.846804,0.182233,0.000000,0.847824,-0.435076,0.303156,0.000000,-12.374947,4.006888,8.346217,1.000000;;, + 560;16;-0.177768,0.302247,0.936507,0.000000,-0.500056,-0.847384,0.178562,0.000000,0.847551,-0.436563,0.301778,0.000000,-12.374949,4.006895,8.346218,1.000000;;, + 640;16;-0.177685,0.297702,0.937977,0.000000,-0.500440,-0.848033,0.174354,0.000000,0.847342,-0.438421,0.299665,0.000000,-12.374961,4.006884,8.346216,1.000000;;, + 720;16;-0.177231,0.292471,0.939707,0.000000,-0.500853,-0.848734,0.169695,0.000000,0.847193,-0.440580,0.296907,0.000000,-12.374961,4.006879,8.346214,1.000000;;, + 800;16;-0.177138,0.287473,0.941266,0.000000,-0.501251,-0.849408,0.165087,0.000000,0.846977,-0.442567,0.294558,0.000000,-12.374962,4.006883,8.346215,1.000000;;, + 880;16;-0.178220,0.283768,0.942186,0.000000,-0.501584,-0.849973,0.161118,0.000000,0.846552,-0.443871,0.293815,0.000000,-12.374976,4.006899,8.346215,1.000000;;, + 960;16;-0.180269,0.281098,0.942596,0.000000,-0.501870,-0.850457,0.157639,0.000000,0.845949,-0.444643,0.294385,0.000000,-12.374944,4.006894,8.346219,1.000000;;, + 1040;16;-0.183495,0.279724,0.942382,0.000000,-0.502099,-0.850845,0.154788,0.000000,0.845119,-0.444766,0.296575,0.000000,-12.374985,4.006907,8.346216,1.000000;;, + 1120;16;-0.187458,0.279129,0.941779,0.000000,-0.502296,-0.851179,0.152296,0.000000,0.844132,-0.444502,0.299765,0.000000,-12.374974,4.006891,8.346215,1.000000;;, + 1200;16;-0.191709,0.278753,0.941034,0.000000,-0.502485,-0.851499,0.149864,0.000000,0.843064,-0.444125,0.303308,0.000000,-12.374945,4.006901,8.346218,1.000000;;, + 1280;16;-0.196491,0.278971,0.939982,0.000000,-0.502648,-0.851776,0.147721,0.000000,0.841865,-0.443455,0.307590,0.000000,-12.374948,4.006887,8.346218,1.000000;;, + 1360;16;-0.201873,0.279924,0.938557,0.000000,-0.502781,-0.852001,0.145966,0.000000,0.840511,-0.442422,0.312736,0.000000,-12.374995,4.006908,8.346215,1.000000;;, + 1440;16;-0.207923,0.281749,0.936689,0.000000,-0.502876,-0.852161,0.144697,0.000000,0.838978,-0.440952,0.318869,0.000000,-12.374962,4.006903,8.346218,1.000000;;, + 1520;16;-0.214508,0.284228,0.934452,0.000000,-0.502944,-0.852276,0.143780,0.000000,0.837278,-0.439135,0.325771,0.000000,-12.374935,4.006886,8.346218,1.000000;;, + 1600;16;-0.222300,0.288549,0.931301,0.000000,-0.502927,-0.852248,0.144009,0.000000,0.835253,-0.436363,0.334574,0.000000,-12.374966,4.006901,8.346218,1.000000;;, + 1680;16;-0.232111,0.296207,0.926491,0.000000,-0.502747,-0.851943,0.146421,0.000000,0.832689,-0.431804,0.346662,0.000000,-12.374960,4.006915,8.346217,1.000000;;, + 1760;16;-0.243355,0.305918,0.920431,0.000000,-0.502463,-0.851462,0.150147,0.000000,0.829644,-0.425943,0.360920,0.000000,-12.374978,4.006920,8.346216,1.000000;;, + 1840;16;-0.256168,0.317769,0.912908,0.000000,-0.502061,-0.850781,0.155262,0.000000,0.826022,-0.418562,0.377483,0.000000,-12.374993,4.006886,8.346215,1.000000;;, + 1920;16;-0.269189,0.329157,0.905093,0.000000,-0.501680,-0.850135,0.159963,0.000000,0.822104,-0.411007,0.393978,0.000000,-12.374964,4.006881,8.346217,1.000000;;, + 2000;16;-0.281039,0.337658,0.898334,0.000000,-0.501467,-0.849774,0.162525,0.000000,0.818259,-0.404809,0.408144,0.000000,-12.374958,4.006900,8.346216,1.000000;;, + 2080;16;-0.291958,0.343326,0.892686,0.000000,-0.501443,-0.849734,0.162807,0.000000,0.814442,-0.400099,0.420245,0.000000,-12.374943,4.006909,8.346217,1.000000;;, + 2160;16;-0.301518,0.344840,0.888916,0.000000,-0.501707,-0.850181,0.159636,0.000000,0.810788,-0.397842,0.429353,0.000000,-12.374960,4.006894,8.346217,1.000000;;, + 2240;16;-0.310373,0.343935,0.886215,0.000000,-0.502132,-0.850901,0.154371,0.000000,0.807175,-0.397084,0.436797,0.000000,-12.374965,4.006871,8.346217,1.000000;;, + 2320;16;-0.319163,0.341745,0.883937,0.000000,-0.502641,-0.851764,0.147817,0.000000,0.803422,-0.397125,0.443627,0.000000,-12.374967,4.006865,8.346219,1.000000;;, + 2400;16;-0.327476,0.338564,0.882119,0.000000,-0.503185,-0.852686,0.140466,0.000000,0.799727,-0.397870,0.449595,0.000000,-12.374972,4.006896,8.346217,1.000000;;, + 2480;16;-0.335163,0.334888,0.880634,0.000000,-0.503717,-0.853586,0.132891,0.000000,0.796201,-0.399050,0.454779,0.000000,-12.374965,4.006886,8.346217,1.000000;;, + 2560;16;-0.342076,0.331206,0.879367,0.000000,-0.504195,-0.854397,0.125668,0.000000,0.792951,-0.400385,0.459261,0.000000,-12.374938,4.006904,8.346217,1.000000;;, + 2640;16;-0.348158,0.328208,0.878103,0.000000,-0.504580,-0.855050,0.119531,0.000000,0.790054,-0.401458,0.463300,0.000000,-12.374950,4.006896,8.346217,1.000000;;, + 2720;16;-0.352986,0.325774,0.877082,0.000000,-0.504877,-0.855552,0.114587,0.000000,0.787719,-0.402370,0.466474,0.000000,-12.374984,4.006876,8.346219,1.000000;;, + 2800;16;-0.356024,0.324125,0.876464,0.000000,-0.505064,-0.855869,0.111349,0.000000,0.786230,-0.403027,0.468414,0.000000,-12.374964,4.006858,8.346218,1.000000;;, + 2880;16;-0.357567,0.322919,0.876281,0.000000,-0.505178,-0.856062,0.109330,0.000000,0.785456,-0.403585,0.469232,0.000000,-12.374959,4.006901,8.346216,1.000000;;, + 2960;16;-0.357503,0.321827,0.876709,0.000000,-0.505237,-0.856163,0.108260,0.000000,0.785447,-0.404243,0.468680,0.000000,-12.374958,4.006893,8.346217,1.000000;;, + 3040;16;-0.356492,0.321048,0.877406,0.000000,-0.505252,-0.856187,0.107999,0.000000,0.785897,-0.404810,0.467434,0.000000,-12.374981,4.006920,8.346217,1.000000;;, + 3120;16;-0.355094,0.320544,0.878157,0.000000,-0.505240,-0.856167,0.108218,0.000000,0.786538,-0.405252,0.465971,0.000000,-12.374980,4.006894,8.346217,1.000000;;, + 3200;16;-0.353494,0.320707,0.878743,0.000000,-0.505184,-0.856073,0.109212,0.000000,0.787293,-0.405321,0.464633,0.000000,-12.374977,4.006891,8.346217,1.000000;;, + 3280;16;-0.352255,0.322102,0.878730,0.000000,-0.505069,-0.855878,0.111259,0.000000,0.787922,-0.404628,0.464171,0.000000,-12.374953,4.006900,8.346217,1.000000;;, + 3360;16;-0.350816,0.324162,0.878548,0.000000,-0.504906,-0.855602,0.114080,0.000000,0.788668,-0.403563,0.463831,0.000000,-12.374961,4.006896,8.346217,1.000000;;, + 3440;16;-0.348943,0.326855,0.878296,0.000000,-0.504688,-0.855232,0.117761,0.000000,0.789638,-0.402174,0.463387,0.000000,-12.374968,4.006890,8.346216,1.000000;;, + 3520;16;-0.346211,0.329156,0.878518,0.000000,-0.504460,-0.854846,0.121487,0.000000,0.790985,-0.401117,0.462004,0.000000,-12.374979,4.006877,8.346216,1.000000;;, + 3600;16;-0.342083,0.330111,0.879776,0.000000,-0.504266,-0.854518,0.124560,0.000000,0.792903,-0.401031,0.458780,0.000000,-12.374969,4.006895,8.346217,1.000000;;, + 3680;16;-0.336630,0.329495,0.882107,0.000000,-0.504127,-0.854282,0.126716,0.000000,0.795321,-0.402038,0.453685,0.000000,-12.374988,4.006921,8.346217,1.000000;;, + 3760;16;-0.329591,0.326439,0.885894,0.000000,-0.504094,-0.854226,0.127225,0.000000,0.798285,-0.404641,0.446101,0.000000,-12.374954,4.006886,8.346217,1.000000;;, + 3840;16;-0.321421,0.321840,0.890566,0.000000,-0.504123,-0.854276,0.126779,0.000000,0.801591,-0.408206,0.436829,0.000000,-12.374970,4.006894,8.346216,1.000000;;, + 3920;16;-0.312468,0.316118,0.895786,0.000000,-0.504197,-0.854400,0.125640,0.000000,0.805077,-0.412394,0.426359,0.000000,-12.374981,4.006866,8.346216,1.000000;;, + 4000;16;-0.302820,0.309854,0.901272,0.000000,-0.504279,-0.854540,0.124354,0.000000,0.808704,-0.416836,0.415025,0.000000,-12.374947,4.006918,8.346219,1.000000;;, + 4080;16;-0.292633,0.303606,0.906747,0.000000,-0.504340,-0.854643,0.123395,0.000000,0.812408,-0.421199,0.403217,0.000000,-12.374985,4.006909,8.346217,1.000000;;, + 4160;16;-0.282062,0.297951,0.911957,0.000000,-0.504350,-0.854660,0.123239,0.000000,0.816132,-0.425185,0.391339,0.000000,-12.374960,4.006845,8.346213,1.000000;;, + 4240;16;-0.271405,0.293515,0.916618,0.000000,-0.504281,-0.854543,0.124323,0.000000,0.819780,-0.428491,0.379941,0.000000,-12.374996,4.006858,8.346213,1.000000;;, + 4320;16;-0.260410,0.290803,0.920663,0.000000,-0.504094,-0.854225,0.127235,0.000000,0.823454,-0.430967,0.369041,0.000000,-12.374979,4.006874,8.346215,1.000000;;, + 4400;16;-0.248931,0.290808,0.923831,0.000000,-0.503712,-0.853578,0.132965,0.000000,0.827229,-0.432245,0.358965,0.000000,-12.374986,4.006876,8.346214,1.000000;;, + 4480;16;-0.236945,0.292723,0.926375,0.000000,-0.503166,-0.852654,0.140730,0.000000,0.831072,-0.432775,0.349321,0.000000,-12.374962,4.006917,8.346219,1.000000;;, + 4560;16;-0.224244,0.296375,0.928373,0.000000,-0.502439,-0.851422,0.150448,0.000000,0.835027,-0.432714,0.339837,0.000000,-12.374972,4.006852,8.346212,1.000000;;, + 4640;16;-0.211239,0.300811,0.929995,0.000000,-0.501594,-0.849990,0.161001,0.000000,0.838917,-0.432470,0.330436,0.000000,-12.374963,4.006896,8.346216,1.000000;;, + 4720;16;-0.198319,0.304878,0.931514,0.000000,-0.500729,-0.848523,0.171111,0.000000,0.842580,-0.432502,0.320939,0.000000,-12.374978,4.006879,8.346214,1.000000;;, + 4800;16;-0.185356,0.308957,0.932839,0.000000,-0.499811,-0.846968,0.181203,0.000000,0.846069,-0.432656,0.311411,0.000000,-12.374969,4.006883,8.346215,1.000000;;, + 4960;16;-0.167240,0.313773,0.934654,0.000000,-0.498528,-0.844794,0.194403,0.000000,0.850588,-0.433439,0.297708,0.000000,-12.374964,4.006889,8.346216,1.000000;;; + } + { Bip01_L_Clavicle } + } + + Animation { + + + AnimationKey { + 4; + 62; + 0;16;0.664909,0.057512,-0.744707,0.000000,0.080413,0.985725,0.147922,0.000000,0.742583,-0.158239,0.650792,0.000000,31.000193,-0.000001,0.000006,1.000000;;, + 80;16;0.677111,0.041649,-0.734701,0.000000,0.081682,0.987974,0.131286,0.000000,0.731333,-0.148907,0.665566,0.000000,31.000191,0.000002,0.000005,1.000000;;, + 160;16;0.689314,0.026352,-0.723983,0.000000,0.082675,0.989948,0.114749,0.000000,0.719730,-0.138954,0.680207,0.000000,31.000195,0.000001,0.000001,1.000000;;, + 240;16;0.702174,0.010462,-0.711928,0.000000,0.083083,0.991857,0.096521,0.000000,0.707141,-0.126924,0.695587,0.000000,31.000191,-0.000000,0.000016,1.000000;;, + 320;16;0.713950,-0.001421,-0.700196,0.000000,0.081960,0.993293,0.081554,0.000000,0.695384,-0.115614,0.709278,0.000000,31.000196,0.000010,-0.000026,1.000000;;, + 400;16;0.723141,-0.005627,-0.690678,0.000000,0.077624,0.994294,0.073172,0.000000,0.686325,-0.106527,0.719451,0.000000,31.000187,0.000001,0.000011,1.000000;;, + 480;16;0.729524,-0.001482,-0.683953,0.000000,0.071224,0.994725,0.073815,0.000000,0.680236,-0.102564,0.725782,0.000000,31.000193,-0.000003,0.000008,1.000000;;, + 560;16;0.732128,0.014851,-0.681005,0.000000,0.062323,0.994108,0.088680,0.000000,0.678310,-0.107367,0.726889,0.000000,31.000196,0.000011,-0.000018,1.000000;;, + 640;16;0.731502,0.037430,-0.680811,0.000000,0.054480,0.992091,0.113081,0.000000,0.679660,-0.119809,0.723677,0.000000,31.000193,-0.000002,0.000005,1.000000;;, + 720;16;0.728315,0.062572,-0.682379,0.000000,0.051888,0.987927,0.145971,0.000000,0.683275,-0.141720,0.716276,0.000000,31.000193,0.000001,0.000005,1.000000;;, + 800;16;0.722962,0.087923,-0.685270,0.000000,0.052813,0.981934,0.181705,0.000000,0.688866,-0.167557,0.705258,0.000000,31.000189,-0.000001,0.000021,1.000000;;, + 880;16;0.715919,0.109442,-0.689552,0.000000,0.057335,0.975086,0.214288,0.000000,0.695825,-0.192948,0.691808,0.000000,31.000189,0.000005,0.000020,1.000000;;, + 960;16;0.706804,0.129493,-0.695457,0.000000,0.063230,0.967604,0.244428,0.000000,0.704578,-0.216736,0.675718,0.000000,31.000193,0.000002,0.000012,1.000000;;, + 1040;16;0.694685,0.148445,-0.703830,0.000000,0.068273,0.960450,0.269954,0.000000,0.716067,-0.235586,0.657075,0.000000,31.000195,0.000005,-0.000002,1.000000;;, + 1120;16;0.680198,0.168418,-0.713419,0.000000,0.072459,0.953034,0.294070,0.000000,0.729439,-0.251719,0.636048,0.000000,31.000187,-0.000002,0.000021,1.000000;;, + 1200;16;0.663318,0.191979,-0.723293,0.000000,0.074914,0.944643,0.319432,0.000000,0.744578,-0.266070,0.612217,0.000000,31.000187,-0.000003,0.000004,1.000000;;, + 1280;16;0.645464,0.217336,-0.732217,0.000000,0.076240,0.935541,0.344893,0.000000,0.759976,-0.278440,0.587288,0.000000,31.000193,0.000000,-0.000009,1.000000;;, + 1360;16;0.627810,0.243434,-0.739320,0.000000,0.076846,0.925810,0.370095,0.000000,0.774564,-0.289163,0.562526,0.000000,31.000193,0.000000,0.000008,1.000000;;, + 1440;16;0.611526,0.269949,-0.743749,0.000000,0.076045,0.915594,0.394848,0.000000,0.787561,-0.298018,0.539382,0.000000,31.000185,-0.000008,0.000026,1.000000;;, + 1520;16;0.597625,0.296327,-0.745007,0.000000,0.074495,0.904654,0.419585,0.000000,0.798308,-0.306254,0.518569,0.000000,31.000196,0.000006,-0.000025,1.000000;;, + 1600;16;0.587804,0.321452,-0.742398,0.000000,0.068325,0.894666,0.441480,0.000000,0.806113,-0.310228,0.503925,0.000000,31.000189,-0.000004,0.000016,1.000000;;, + 1680;16;0.584715,0.343311,-0.735014,0.000000,0.052924,0.887966,0.456854,0.000000,0.809510,-0.306029,0.501038,0.000000,31.000196,-0.000028,-0.000003,1.000000;;, + 1760;16;0.585148,0.363285,-0.725001,0.000000,0.031238,0.883279,0.467807,0.000000,0.810325,-0.296384,0.505500,0.000000,31.000181,0.000007,0.000018,1.000000;;, + 1840;16;0.588209,0.381503,-0.713067,0.000000,0.002441,0.880894,0.473307,0.000000,0.808705,-0.280144,0.517219,0.000000,31.000193,-0.000018,-0.000001,1.000000;;, + 1920;16;0.590003,0.400505,-0.701065,0.000000,-0.026187,0.877334,0.479165,0.000000,0.806976,-0.264350,0.528118,0.000000,31.000183,-0.000005,0.000027,1.000000;;, + 2000;16;0.587083,0.422733,-0.690384,0.000000,-0.047649,0.869391,0.491823,0.000000,0.808123,-0.255845,0.530547,0.000000,31.000193,-0.000008,-0.000004,1.000000;;, + 2080;16;0.579066,0.449439,-0.680211,0.000000,-0.063170,0.856553,0.512178,0.000000,0.812830,-0.253616,0.524392,0.000000,31.000183,0.000023,-0.000003,1.000000;;, + 2160;16;0.563376,0.483771,-0.669756,0.000000,-0.069973,0.835672,0.544754,0.000000,0.823232,-0.260037,0.504648,0.000000,31.000200,-0.000022,-0.000008,1.000000;;, + 2240;16;0.543670,0.522500,-0.656823,0.000000,-0.072204,0.808801,0.583633,0.000000,0.836188,-0.269879,0.477447,0.000000,31.000198,-0.000025,0.000000,1.000000;;, + 2320;16;0.521856,0.563842,-0.640116,0.000000,-0.073318,0.777270,0.624881,0.000000,0.849877,-0.279166,0.446963,0.000000,31.000193,-0.000015,0.000014,1.000000;;, + 2400;16;0.499484,0.605335,-0.619746,0.000000,-0.072819,0.742180,0.666233,0.000000,0.863257,-0.287644,0.414787,0.000000,31.000189,0.000003,0.000012,1.000000;;, + 2480;16;0.478320,0.644525,-0.596487,0.000000,-0.071235,0.705465,0.705156,0.000000,0.875291,-0.294800,0.383350,0.000000,31.000181,0.000003,0.000021,1.000000;;, + 2560;16;0.459026,0.679997,-0.571751,0.000000,-0.069582,0.669098,0.739910,0.000000,0.885694,-0.299854,0.354448,0.000000,31.000212,0.000034,-0.000040,1.000000;;, + 2640;16;0.442866,0.709881,-0.547666,0.000000,-0.069152,0.636059,0.768536,0.000000,0.893917,-0.302486,0.330778,0.000000,31.000189,-0.000007,0.000017,1.000000;;, + 2720;16;0.428936,0.734383,-0.526020,0.000000,-0.069562,0.607432,0.791320,0.000000,0.900653,-0.302835,0.311634,0.000000,31.000189,0.000005,0.000005,1.000000;;, + 2800;16;0.416887,0.752856,-0.509327,0.000000,-0.071094,0.585631,0.807454,0.000000,0.906174,-0.300407,0.297666,0.000000,31.000204,-0.000028,-0.000015,1.000000;;, + 2880;16;0.406468,0.766636,-0.497045,0.000000,-0.072570,0.569383,0.818863,0.000000,0.910778,-0.296771,0.287071,0.000000,31.000191,-0.000002,-0.000002,1.000000;;, + 2960;16;0.396778,0.776797,-0.489034,0.000000,-0.073182,0.557841,0.826715,0.000000,0.914993,-0.292234,0.278186,0.000000,31.000198,-0.000004,-0.000009,1.000000;;, + 3040;16;0.389879,0.782941,-0.484766,0.000000,-0.072425,0.550864,0.831447,0.000000,0.918013,-0.289055,0.271475,0.000000,31.000196,0.000005,-0.000003,1.000000;;, + 3120;16;0.386919,0.785140,-0.483579,0.000000,-0.070232,0.547994,0.833529,0.000000,0.919435,-0.288546,0.267171,0.000000,31.000185,-0.000009,0.000011,1.000000;;, + 3200;16;0.389946,0.782789,-0.484958,0.000000,-0.064925,0.548710,0.833488,0.000000,0.918546,-0.293529,0.264790,0.000000,31.000206,-0.000013,-0.000020,1.000000;;, + 3280;16;0.402191,0.774994,-0.487470,0.000000,-0.054233,0.551662,0.832302,0.000000,0.913948,-0.308307,0.263904,0.000000,31.000189,0.000005,0.000007,1.000000;;, + 3360;16;0.420928,0.761746,-0.492507,0.000000,-0.039832,0.557948,0.828919,0.000000,0.906219,-0.329298,0.265198,0.000000,31.000189,0.000015,-0.000002,1.000000;;, + 3440;16;0.445819,0.742217,-0.500359,0.000000,-0.021552,0.567721,0.822939,0.000000,0.894864,-0.356098,0.269097,0.000000,31.000196,0.000023,-0.000005,1.000000;;, + 3520;16;0.472632,0.717311,-0.511941,0.000000,-0.002587,0.582046,0.813152,0.000000,0.881256,-0.382997,0.276949,0.000000,31.000185,-0.000018,0.000017,1.000000;;, + 3600;16;0.496984,0.688296,-0.528447,0.000000,0.014031,0.602525,0.797977,0.000000,0.867647,-0.403996,0.289788,0.000000,31.000195,-0.000006,-0.000004,1.000000;;, + 3680;16;0.520074,0.654703,-0.548532,0.000000,0.028011,0.628799,0.777063,0.000000,0.853662,-0.419495,0.308683,0.000000,31.000191,-0.000003,0.000003,1.000000;;, + 3760;16;0.541262,0.616501,-0.571806,0.000000,0.037364,0.661724,0.748816,0.000000,0.840023,-0.426671,0.335131,0.000000,31.000200,0.000007,-0.000021,1.000000;;, + 3840;16;0.562143,0.573838,-0.595571,0.000000,0.044106,0.698299,0.714447,0.000000,0.825863,-0.427889,0.367234,0.000000,31.000187,0.000019,-0.000002,1.000000;;, + 3920;16;0.584661,0.526231,-0.617456,0.000000,0.049698,0.736430,0.674686,0.000000,0.809754,-0.425150,0.404409,0.000000,31.000195,-0.000013,-0.000008,1.000000;;, + 4000;16;0.606639,0.476141,-0.636615,0.000000,0.054257,0.774131,0.630696,0.000000,0.793123,-0.417146,0.443784,0.000000,31.000189,0.000008,0.000006,1.000000;;, + 4080;16;0.627035,0.425517,-0.652505,0.000000,0.058091,0.809754,0.583887,0.000000,0.776822,-0.404022,0.483025,0.000000,31.000181,0.000033,0.000008,1.000000;;, + 4160;16;0.644915,0.376375,-0.665152,0.000000,0.061391,0.842003,0.535968,0.000000,0.761785,-0.386488,0.519914,0.000000,31.000193,-0.000002,-0.000007,1.000000;;, + 4240;16;0.659629,0.330881,-0.674838,0.000000,0.064313,0.869738,0.489306,0.000000,0.748834,-0.366161,0.552425,0.000000,31.000200,-0.000042,0.000002,1.000000;;, + 4320;16;0.669552,0.290112,-0.683765,0.000000,0.066772,0.893331,0.444411,0.000000,0.739758,-0.343213,0.578760,0.000000,31.000198,-0.000003,-0.000010,1.000000;;, + 4400;16;0.672038,0.256090,-0.694826,0.000000,0.068657,0.912709,0.402799,0.000000,0.737327,-0.318401,0.595793,0.000000,31.000187,0.000020,-0.000002,1.000000;;, + 4480;16;0.669411,0.226177,-0.707625,0.000000,0.069649,0.929224,0.362894,0.000000,0.739620,-0.292210,0.606279,0.000000,31.000185,0.000020,0.000001,1.000000;;, + 4560;16;0.661728,0.199092,-0.722826,0.000000,0.069524,0.943650,0.323562,0.000000,0.746513,-0.264363,0.610598,0.000000,31.000185,-0.000004,0.000019,1.000000;;, + 4640;16;0.652519,0.172744,-0.737820,0.000000,0.068460,0.956250,0.284429,0.000000,0.754673,-0.236107,0.612145,0.000000,31.000183,0.000022,0.000005,1.000000;;, + 4720;16;0.645864,0.145154,-0.749526,0.000000,0.067051,0.967181,0.245083,0.000000,0.760502,-0.208547,0.614935,0.000000,31.000189,0.000000,0.000008,1.000000;;, + 4800;16;0.640423,0.117307,-0.759011,0.000000,0.064965,0.976451,0.205728,0.000000,0.765270,-0.181062,0.617720,0.000000,31.000208,-0.000032,-0.000004,1.000000;;, + 4960;16;0.664909,0.057512,-0.744707,0.000000,0.080413,0.985725,0.147922,0.000000,0.742583,-0.158239,0.650792,0.000000,31.000193,-0.000001,0.000006,1.000000;;; + } + { Bip01_L_UpperArm } + } + + Animation { + + + AnimationKey { + 4; + 62; + 0;16;0.427260,-0.904129,0.000000,0.000000,0.904129,0.427260,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,89.202515,-0.000002,0.000005,1.000000;;, + 80;16;0.388523,-0.921439,0.000000,0.000000,0.921439,0.388523,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,89.202538,0.000007,-0.000007,1.000000;;, + 160;16;0.349087,-0.937091,0.000000,0.000000,0.937091,0.349087,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,89.202530,0.000009,-0.000001,1.000000;;, + 240;16;0.307986,-0.951391,0.000000,0.000000,0.951391,0.307986,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,89.202522,-0.000001,-0.000005,1.000000;;, + 320;16;0.268401,-0.963307,-0.000000,0.000000,0.963307,0.268401,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,89.202538,0.000000,-0.000014,1.000000;;, + 400;16;0.234165,-0.972197,0.000000,0.000000,0.972197,0.234165,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,89.202530,-0.000005,-0.000011,1.000000;;, + 480;16;0.202875,-0.979205,0.000000,0.000000,0.979205,0.202875,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,89.202507,-0.000004,0.000001,1.000000;;, + 560;16;0.172560,-0.984999,0.000000,0.000000,0.984999,0.172560,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,89.202515,-0.000012,-0.000000,1.000000;;, + 640;16;0.145352,-0.989380,0.000000,0.000000,0.989380,0.145352,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,89.202522,-0.000008,-0.000007,1.000000;;, + 720;16;0.120234,-0.992746,0.000000,0.000000,0.992746,0.120234,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,89.202515,-0.000005,-0.000001,1.000000;;, + 800;16;0.104677,-0.994506,0.000000,0.000000,0.994506,0.104677,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,89.202515,-0.000008,0.000005,1.000000;;, + 880;16;0.106122,-0.994353,-0.000000,0.000000,0.994353,0.106122,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,89.202522,0.000001,-0.000005,1.000000;;, + 960;16;0.123628,-0.992329,-0.000000,0.000000,0.992329,0.123628,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,89.202530,-0.000003,0.000001,1.000000;;, + 1040;16;0.160645,-0.987012,-0.000000,0.000000,0.987012,0.160645,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,89.202522,-0.000006,0.000009,1.000000;;, + 1120;16;0.210713,-0.977548,0.000000,0.000000,0.977548,0.210713,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,89.202530,-0.000003,0.000005,1.000000;;, + 1200;16;0.268857,-0.963180,0.000000,0.000000,0.963180,0.268857,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,89.202545,0.000005,0.000001,1.000000;;, + 1280;16;0.333371,-0.942796,0.000000,0.000000,0.942796,0.333371,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,89.202522,0.000000,0.000003,1.000000;;, + 1360;16;0.401621,-0.915806,0.000000,0.000000,0.915806,0.401621,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,89.202507,0.000003,-0.000005,1.000000;;, + 1440;16;0.470980,-0.882144,0.000000,0.000000,0.882144,0.470980,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,89.202522,-0.000001,-0.000012,1.000000;;, + 1520;16;0.536024,-0.844203,0.000000,0.000000,0.844203,0.536024,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,89.202515,-0.000002,-0.000000,1.000000;;, + 1600;16;0.603285,-0.797526,-0.000000,0.000000,0.797526,0.603285,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,89.202530,-0.000008,-0.000010,1.000000;;, + 1680;16;0.677938,-0.735119,0.000000,0.000000,0.735119,0.677938,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,89.202507,0.000019,-0.000015,1.000000;;, + 1760;16;0.751756,-0.659441,-0.000000,0.000000,0.659441,0.751756,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,89.202530,0.000016,-0.000010,1.000000;;, + 1840;16;0.823370,-0.567505,-0.000000,0.000000,0.567505,0.823370,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,89.202515,0.000029,-0.000014,1.000000;;, + 1920;16;0.879760,-0.475418,-0.000000,0.000000,0.475418,0.879760,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,89.202530,0.000017,-0.000011,1.000000;;, + 2000;16;0.915394,-0.402559,0.000000,0.000000,0.402559,0.915394,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,89.202507,0.000007,-0.000005,1.000000;;, + 2080;16;0.935580,-0.353115,0.000000,0.000000,0.353115,0.935580,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,89.202530,0.000026,-0.000015,1.000000;;, + 2160;16;0.940380,-0.340125,-0.000000,0.000000,0.340125,0.940380,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,89.202553,0.000032,-0.000015,1.000000;;, + 2240;16;0.936602,-0.350395,0.000000,0.000000,0.350395,0.936602,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,89.202538,0.000019,-0.000012,1.000000;;, + 2320;16;0.926964,-0.375151,0.000000,0.000000,0.375151,0.926964,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,89.202522,0.000033,-0.000012,1.000000;;, + 2400;16;0.912356,-0.409397,0.000000,0.000000,0.409397,0.912356,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,89.202545,0.000023,-0.000015,1.000000;;, + 2480;16;0.894412,-0.447245,-0.000000,0.000000,0.447245,0.894412,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,89.202538,0.000017,-0.000011,1.000000;;, + 2560;16;0.875553,-0.483123,-0.000000,0.000000,0.483123,0.875553,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,89.202499,0.000028,-0.000006,1.000000;;, + 2640;16;0.859841,-0.510562,0.000000,0.000000,0.510562,0.859841,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,89.202515,0.000021,-0.000002,1.000000;;, + 2720;16;0.848746,-0.528800,0.000000,0.000000,0.528800,0.848746,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,89.202507,0.000019,-0.000005,1.000000;;, + 2800;16;0.846138,-0.532964,-0.000000,0.000000,0.532964,0.846138,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,89.202538,0.000033,-0.000008,1.000000;;, + 2880;16;0.848612,-0.529015,-0.000000,0.000000,0.529015,0.848612,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,89.202515,0.000039,-0.000009,1.000000;;, + 2960;16;0.854227,-0.519900,0.000000,0.000000,0.519900,0.854227,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,89.202507,0.000020,-0.000006,1.000000;;, + 3040;16;0.860870,-0.508824,0.000000,0.000000,0.508824,0.860870,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,89.202530,0.000027,-0.000011,1.000000;;, + 3120;16;0.866011,-0.500024,0.000000,0.000000,0.500024,0.866011,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,89.202538,0.000019,-0.000009,1.000000;;, + 3200;16;0.869604,-0.493750,0.000000,0.000000,0.493751,0.869603,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,89.202522,0.000016,-0.000008,1.000000;;, + 3280;16;0.870315,-0.492495,0.000000,0.000000,0.492495,0.870315,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,89.202553,0.000015,-0.000006,1.000000;;, + 3360;16;0.869566,-0.493816,0.000000,0.000000,0.493816,0.869566,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,89.202538,-0.000001,-0.000005,1.000000;;, + 3440;16;0.868279,-0.496077,0.000000,0.000000,0.496076,0.868279,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,89.202530,0.000022,-0.000017,1.000000;;, + 3520;16;0.866450,-0.499264,0.000000,0.000000,0.499264,0.866450,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,89.202545,0.000032,-0.000020,1.000000;;, + 3600;16;0.864007,-0.503480,0.000000,0.000000,0.503480,0.864007,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,89.202522,0.000022,-0.000017,1.000000;;, + 3680;16;0.862093,-0.506750,-0.000000,0.000000,0.506750,0.862093,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,89.202545,0.000024,-0.000015,1.000000;;, + 3760;16;0.862146,-0.506659,-0.000000,0.000000,0.506659,0.862146,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,89.202538,0.000027,-0.000014,1.000000;;, + 3840;16;0.863305,-0.504683,0.000000,0.000000,0.504683,0.863304,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,89.202530,0.000016,-0.000012,1.000000;;, + 3920;16;0.865849,-0.500306,0.000000,0.000000,0.500306,0.865849,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,89.202515,0.000034,-0.000013,1.000000;;, + 4000;16;0.867722,-0.497049,-0.000000,0.000000,0.497049,0.867722,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,89.202538,0.000038,-0.000021,1.000000;;, + 4080;16;0.867493,-0.497450,-0.000000,0.000000,0.497450,0.867493,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,89.202522,-0.000010,0.000002,1.000000;;, + 4160;16;0.863690,-0.504024,0.000000,0.000000,0.504024,0.863690,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,89.202538,0.000012,-0.000008,1.000000;;, + 4240;16;0.855068,-0.518517,-0.000000,0.000000,0.518517,0.855067,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,89.202515,0.000002,0.000004,1.000000;;, + 4320;16;0.838383,-0.545081,-0.000000,0.000000,0.545081,0.838383,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,89.202515,0.000005,0.000005,1.000000;;, + 4400;16;0.807911,-0.589304,-0.000000,0.000000,0.589304,0.807911,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,89.202545,-0.000025,0.000009,1.000000;;, + 4480;16;0.764459,-0.644672,-0.000000,0.000000,0.644672,0.764459,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,89.202545,0.000013,-0.000012,1.000000;;, + 4560;16;0.705366,-0.708843,0.000000,0.000000,0.708843,0.705366,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,89.202515,-0.000013,0.000003,1.000000;;, + 4640;16;0.635360,-0.772216,0.000000,0.000000,0.772216,0.635360,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,89.202515,0.000007,0.000003,1.000000;;, + 4720;16;0.562668,-0.826683,0.000000,0.000000,0.826683,0.562668,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,89.202515,-0.000007,0.000003,1.000000;;, + 4800;16;0.485335,-0.874328,-0.000000,0.000000,0.874328,0.485335,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,89.202522,-0.000023,0.000014,1.000000;;, + 4960;16;0.427260,-0.904129,0.000000,0.000000,0.904129,0.427260,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,89.202515,-0.000002,0.000005,1.000000;;; + } + { Bip01_L_Forearm } + } + + Animation { + + + AnimationKey { + 4; + 62; + 0;16;0.999573,-0.023764,-0.016974,0.000000,-0.017488,-0.021598,-0.999614,0.000000,0.023388,0.999484,-0.022005,0.000000,61.671474,0.000008,-0.000005,1.000000;;, + 80;16;0.999618,-0.021237,-0.017707,0.000000,-0.018209,-0.023697,-0.999553,0.000000,0.020808,0.999494,-0.024075,0.000000,61.671478,-0.000011,0.000011,1.000000;;, + 160;16;0.999655,-0.018710,-0.018445,0.000000,-0.018925,-0.025798,-0.999488,0.000000,0.018225,0.999492,-0.026143,0.000000,61.671490,-0.000017,0.000006,1.000000;;, + 240;16;0.999685,-0.016109,-0.019257,0.000000,-0.019703,-0.028003,-0.999414,0.000000,0.015560,0.999478,-0.028312,0.000000,61.671482,0.000006,-0.000002,1.000000;;, + 320;16;0.999708,-0.013662,-0.019937,0.000000,-0.020340,-0.030005,-0.999343,0.000000,0.013055,0.999456,-0.030274,0.000000,61.671474,0.000001,0.000008,1.000000;;, + 400;16;0.999726,-0.011611,-0.020306,0.000000,-0.020664,-0.031527,-0.999289,0.000000,0.010963,0.999435,-0.031758,0.000000,61.671471,-0.000014,0.000015,1.000000;;, + 480;16;0.999745,-0.009844,-0.020335,0.000000,-0.020646,-0.032575,-0.999256,0.000000,0.009175,0.999421,-0.032770,0.000000,61.671478,0.000013,-0.000008,1.000000;;, + 560;16;0.999767,-0.008317,-0.019892,0.000000,-0.020157,-0.033022,-0.999251,0.000000,0.007654,0.999420,-0.033182,0.000000,61.671467,-0.000009,0.000005,1.000000;;, + 640;16;0.999792,-0.007073,-0.019106,0.000000,-0.019329,-0.032993,-0.999269,0.000000,0.006438,0.999431,-0.033122,0.000000,61.671474,0.000008,-0.000005,1.000000;;, + 720;16;0.999819,-0.006037,-0.018044,0.000000,-0.018232,-0.032591,-0.999303,0.000000,0.005445,0.999451,-0.032695,0.000000,61.671482,0.000002,0.000002,1.000000;;, + 800;16;0.999844,-0.005529,-0.016759,0.000000,-0.016927,-0.031764,-0.999352,0.000000,0.004993,0.999480,-0.031852,0.000000,61.671478,0.000022,-0.000012,1.000000;;, + 880;16;0.999865,-0.005827,-0.015342,0.000000,-0.015513,-0.030516,-0.999414,0.000000,0.005356,0.999517,-0.030602,0.000000,61.671474,-0.000009,0.000006,1.000000;;, + 960;16;0.999881,-0.006978,-0.013745,0.000000,-0.013940,-0.028786,-0.999488,0.000000,0.006579,0.999561,-0.028880,0.000000,61.671440,0.000002,-0.000012,1.000000;;, + 1040;16;0.999886,-0.009231,-0.011941,0.000000,-0.012182,-0.026468,-0.999575,0.000000,0.008911,0.999607,-0.026578,0.000000,61.671455,0.000011,-0.000019,1.000000;;, + 1120;16;0.999875,-0.012249,-0.009967,0.000000,-0.010255,-0.023710,-0.999666,0.000000,0.012009,0.999644,-0.023833,0.000000,61.671463,0.000013,-0.000017,1.000000;;, + 1200;16;0.999844,-0.015858,-0.007800,0.000000,-0.008125,-0.020548,-0.999756,0.000000,0.015694,0.999663,-0.020674,0.000000,61.671467,-0.000010,-0.000003,1.000000;;, + 1280;16;0.999788,-0.019821,-0.005588,0.000000,-0.005930,-0.017209,-0.999834,0.000000,0.019722,0.999655,-0.017323,0.000000,61.671455,-0.000011,0.000003,1.000000;;, + 1360;16;0.999708,-0.023916,-0.003435,0.000000,-0.003768,-0.013871,-0.999897,0.000000,0.023866,0.999618,-0.013957,0.000000,61.671463,-0.000001,0.000006,1.000000;;, + 1440;16;0.999609,-0.027921,-0.001439,0.000000,-0.001739,-0.010711,-0.999941,0.000000,0.027904,0.999553,-0.010756,0.000000,61.671452,0.000016,-0.000007,1.000000;;, + 1520;16;0.999503,-0.031527,0.000322,0.000000,0.000073,-0.007923,-0.999969,0.000000,0.031529,0.999471,-0.007917,0.000000,61.671452,0.000007,-0.000004,1.000000;;, + 1600;16;0.999395,-0.034756,0.001694,0.000000,0.001499,-0.005621,-0.999983,0.000000,0.034765,0.999380,-0.005565,0.000000,61.671459,0.000020,-0.000004,1.000000;;, + 1680;16;0.999294,-0.037481,0.002418,0.000000,0.002268,-0.004058,-0.999989,0.000000,0.037491,0.999289,-0.003970,0.000000,61.671463,0.000009,0.000003,1.000000;;, + 1760;16;0.999203,-0.039831,0.002724,0.000000,0.002606,-0.003006,-0.999992,0.000000,0.039839,0.999202,-0.002899,0.000000,61.671497,0.000015,-0.000007,1.000000;;, + 1840;16;0.999117,-0.041923,0.002635,0.000000,0.002537,-0.002396,-0.999994,0.000000,0.041929,0.999118,-0.002288,0.000000,61.671513,0.000010,0.000000,1.000000;;, + 1920;16;0.999043,-0.043674,0.002502,0.000000,0.002417,-0.002001,-0.999995,0.000000,0.043679,0.999044,-0.001893,0.000000,61.671482,0.000012,0.000002,1.000000;;, + 2000;16;0.998982,-0.045038,0.002676,0.000000,0.002608,-0.001574,-0.999995,0.000000,0.045042,0.998984,-0.001455,0.000000,61.671486,0.000014,-0.000004,1.000000;;, + 2080;16;0.998935,-0.046025,0.003169,0.000000,0.003122,-0.001107,-0.999995,0.000000,0.046028,0.998940,-0.000962,0.000000,61.671474,-0.000015,0.000004,1.000000;;, + 2160;16;0.998905,-0.046596,0.004187,0.000000,0.004170,-0.000469,-0.999991,0.000000,0.046597,0.998914,-0.000274,0.000000,61.671474,-0.000006,0.000004,1.000000;;, + 2240;16;0.998887,-0.046849,0.005496,0.000000,0.005513,0.000217,-0.999985,0.000000,0.046847,0.998902,0.000476,0.000000,61.671474,0.000005,-0.000002,1.000000;;, + 2320;16;0.998878,-0.046845,0.006944,0.000000,0.006992,0.000864,-0.999975,0.000000,0.046838,0.998902,0.001191,0.000000,61.671505,-0.000005,0.000003,1.000000;;, + 2400;16;0.998875,-0.046655,0.008496,0.000000,0.008575,0.001494,-0.999962,0.000000,0.046640,0.998910,0.001893,0.000000,61.671490,-0.000015,0.000006,1.000000;;, + 2480;16;0.998874,-0.046347,0.010088,0.000000,0.010197,0.002102,-0.999946,0.000000,0.046324,0.998923,0.002572,0.000000,61.671482,0.000009,-0.000002,1.000000;;, + 2560;16;0.998874,-0.045992,0.011658,0.000000,0.011794,0.002682,-0.999927,0.000000,0.045958,0.998938,0.003221,0.000000,61.671490,0.000016,-0.000006,1.000000;;, + 2640;16;0.998869,-0.045702,0.013111,0.000000,0.013273,0.003228,-0.999907,0.000000,0.045656,0.998950,0.003831,0.000000,61.671482,-0.000001,-0.000003,1.000000;;, + 2720;16;0.998863,-0.045412,0.014473,0.000000,0.014658,0.003735,-0.999886,0.000000,0.045353,0.998961,0.004396,0.000000,61.671482,0.000007,-0.000003,1.000000;;, + 2800;16;0.998859,-0.045096,0.015734,0.000000,0.015939,0.004194,-0.999864,0.000000,0.045024,0.998974,0.004908,0.000000,61.671486,-0.000004,-0.000001,1.000000;;, + 2880;16;0.998855,-0.044747,0.016908,0.000000,0.017131,0.004603,-0.999843,0.000000,0.044662,0.998988,0.005364,0.000000,61.671505,-0.000025,0.000007,1.000000;;, + 2960;16;0.998855,-0.044304,0.018029,0.000000,0.018266,0.004958,-0.999821,0.000000,0.044207,0.999006,0.005761,0.000000,61.671490,0.000004,0.000001,1.000000;;, + 3040;16;0.998855,-0.043896,0.019027,0.000000,0.019276,0.005258,-0.999800,0.000000,0.043788,0.999022,0.006098,0.000000,61.671463,-0.000010,0.000007,1.000000;;, + 3120;16;0.998852,-0.043610,0.019806,0.000000,0.020064,0.005482,-0.999784,0.000000,0.043492,0.999034,0.006350,0.000000,61.671452,-0.000006,-0.000001,1.000000;;, + 3200;16;0.998843,-0.043512,0.020470,0.000000,0.020737,0.005683,-0.999769,0.000000,0.043386,0.999037,0.006579,0.000000,61.671486,0.000021,-0.000006,1.000000;;, + 3280;16;0.998819,-0.043751,0.021126,0.000000,0.021406,0.005931,-0.999753,0.000000,0.043615,0.999025,0.006861,0.000000,61.671448,-0.000005,0.000003,1.000000;;, + 3360;16;0.998789,-0.044179,0.021667,0.000000,0.021960,0.006157,-0.999740,0.000000,0.044034,0.999005,0.007119,0.000000,61.671432,0.000015,-0.000005,1.000000;;, + 3440;16;0.998753,-0.044756,0.022114,0.000000,0.022421,0.006360,-0.999728,0.000000,0.044603,0.998978,0.007355,0.000000,61.671459,-0.000006,0.000007,1.000000;;, + 3520;16;0.998727,-0.045310,0.022186,0.000000,0.022499,0.006399,-0.999726,0.000000,0.045156,0.998952,0.007410,0.000000,61.671459,-0.000027,0.000011,1.000000;;, + 3600;16;0.998724,-0.045639,0.021621,0.000000,0.021923,0.006126,-0.999741,0.000000,0.045494,0.998939,0.007118,0.000000,61.671440,-0.000006,0.000003,1.000000;;, + 3680;16;0.998743,-0.045803,0.020381,0.000000,0.020657,0.005559,-0.999771,0.000000,0.045680,0.998935,0.006498,0.000000,61.671474,-0.000009,0.000002,1.000000;;, + 3760;16;0.998785,-0.045772,0.018247,0.000000,0.018478,0.004627,-0.999819,0.000000,0.045679,0.998941,0.005467,0.000000,61.671463,-0.000003,-0.000004,1.000000;;, + 3840;16;0.998838,-0.045632,0.015506,0.000000,0.015680,0.003447,-0.999871,0.000000,0.045572,0.998952,0.004158,0.000000,61.671455,0.000009,-0.000002,1.000000;;, + 3920;16;0.998889,-0.045491,0.012314,0.000000,0.012423,0.002109,-0.999921,0.000000,0.045461,0.998963,0.002671,0.000000,61.671463,-0.000002,0.000000,1.000000;;, + 4000;16;0.998936,-0.045249,0.008852,0.000000,0.008890,0.000629,-0.999960,0.000000,0.045242,0.998976,0.001031,0.000000,61.671463,-0.000013,0.000009,1.000000;;, + 4080;16;0.998979,-0.044860,0.005298,0.000000,0.005260,-0.000958,-0.999986,0.000000,0.044864,0.998993,-0.000721,0.000000,61.671482,0.000021,-0.000016,1.000000;;, + 4160;16;0.999018,-0.044272,0.001824,0.000000,0.001710,-0.002616,-0.999995,0.000000,0.044277,0.999016,-0.002538,0.000000,61.671467,-0.000028,0.000018,1.000000;;, + 4240;16;0.999054,-0.043471,-0.001353,0.000000,-0.001541,-0.004284,-0.999990,0.000000,0.043465,0.999046,-0.004347,0.000000,61.671459,0.000024,-0.000003,1.000000;;, + 4320;16;0.999096,-0.042305,-0.004176,0.000000,-0.004434,-0.006014,-0.999972,0.000000,0.042278,0.999087,-0.006196,0.000000,61.671509,-0.000014,0.000009,1.000000;;, + 4400;16;0.999156,-0.040575,-0.006446,0.000000,-0.006770,-0.007837,-0.999946,0.000000,0.040522,0.999146,-0.008105,0.000000,61.671440,0.000019,-0.000019,1.000000;;, + 4480;16;0.999227,-0.038410,-0.008369,0.000000,-0.008750,-0.009759,-0.999914,0.000000,0.038325,0.999214,-0.010087,0.000000,61.671467,-0.000005,0.000003,1.000000;;, + 4560;16;0.999309,-0.035783,-0.010036,0.000000,-0.010465,-0.011824,-0.999875,0.000000,0.035660,0.999290,-0.012191,0.000000,61.671474,0.000002,-0.000002,1.000000;;, + 4640;16;0.999389,-0.032964,-0.011585,0.000000,-0.012050,-0.013947,-0.999830,0.000000,0.032797,0.999359,-0.014336,0.000000,61.671474,-0.000013,0.000012,1.000000;;, + 4720;16;0.999455,-0.030246,-0.013202,0.000000,-0.013692,-0.016048,-0.999777,0.000000,0.030027,0.999414,-0.016454,0.000000,61.671448,0.000005,-0.000013,1.000000;;, + 4800;16;0.999511,-0.027531,-0.014824,0.000000,-0.015327,-0.018154,-0.999718,0.000000,0.027254,0.999456,-0.018567,0.000000,61.671467,0.000001,-0.000001,1.000000;;, + 4960;16;0.999573,-0.023764,-0.016974,0.000000,-0.017488,-0.021598,-0.999614,0.000000,0.023388,0.999484,-0.022005,0.000000,61.671474,0.000008,-0.000005,1.000000;;; + } + { Bip01_L_Hand } + } + + Animation { + + + AnimationKey { + 4; + 62; + 0;16;0.713247,-0.002867,-0.700906,0.000000,-0.700353,-0.042855,-0.712509,0.000000,-0.027995,0.999077,-0.032574,0.000000,12.410508,3.054968,-10.755419,1.000000;;, + 80;16;0.713247,-0.002867,-0.700906,0.000000,-0.700353,-0.042855,-0.712509,0.000000,-0.027995,0.999077,-0.032574,0.000000,12.410498,3.054974,-10.755421,1.000000;;, + 160;16;0.713247,-0.002867,-0.700906,0.000000,-0.700353,-0.042855,-0.712509,0.000000,-0.027995,0.999077,-0.032574,0.000000,12.410497,3.054968,-10.755431,1.000000;;, + 240;16;0.713247,-0.002867,-0.700906,0.000000,-0.700353,-0.042855,-0.712509,0.000000,-0.027995,0.999077,-0.032574,0.000000,12.410508,3.054964,-10.755431,1.000000;;, + 320;16;0.713247,-0.002867,-0.700906,0.000000,-0.700353,-0.042855,-0.712509,0.000000,-0.027995,0.999077,-0.032574,0.000000,12.410500,3.054960,-10.755434,1.000000;;, + 400;16;0.713247,-0.002867,-0.700906,0.000000,-0.700353,-0.042855,-0.712509,0.000000,-0.027995,0.999077,-0.032574,0.000000,12.410508,3.054971,-10.755414,1.000000;;, + 480;16;0.713247,-0.002867,-0.700906,0.000000,-0.700353,-0.042855,-0.712509,0.000000,-0.027995,0.999077,-0.032574,0.000000,12.410508,3.054960,-10.755432,1.000000;;, + 560;16;0.713247,-0.002867,-0.700906,0.000000,-0.700353,-0.042855,-0.712509,0.000000,-0.027995,0.999077,-0.032574,0.000000,12.410506,3.054965,-10.755426,1.000000;;, + 640;16;0.713247,-0.002867,-0.700906,0.000000,-0.700353,-0.042855,-0.712509,0.000000,-0.027995,0.999077,-0.032574,0.000000,12.410497,3.054977,-10.755417,1.000000;;, + 720;16;0.713247,-0.002867,-0.700906,0.000000,-0.700353,-0.042855,-0.712509,0.000000,-0.027995,0.999077,-0.032574,0.000000,12.410471,3.054978,-10.755437,1.000000;;, + 800;16;0.713247,-0.002867,-0.700906,0.000000,-0.700353,-0.042855,-0.712509,0.000000,-0.027995,0.999077,-0.032574,0.000000,12.410487,3.054967,-10.755437,1.000000;;, + 880;16;0.713247,-0.002867,-0.700906,0.000000,-0.700353,-0.042855,-0.712509,0.000000,-0.027995,0.999077,-0.032574,0.000000,12.410501,3.054976,-10.755417,1.000000;;, + 960;16;0.713247,-0.002867,-0.700906,0.000000,-0.700353,-0.042855,-0.712509,0.000000,-0.027995,0.999077,-0.032574,0.000000,12.410521,3.054957,-10.755430,1.000000;;, + 1040;16;0.713247,-0.002867,-0.700906,0.000000,-0.700353,-0.042855,-0.712509,0.000000,-0.027995,0.999077,-0.032574,0.000000,12.410499,3.054966,-10.755423,1.000000;;, + 1120;16;0.713247,-0.002867,-0.700906,0.000000,-0.700353,-0.042855,-0.712509,0.000000,-0.027995,0.999077,-0.032574,0.000000,12.410509,3.054960,-10.755429,1.000000;;, + 1200;16;0.713247,-0.002867,-0.700906,0.000000,-0.700353,-0.042855,-0.712509,0.000000,-0.027995,0.999077,-0.032574,0.000000,12.410503,3.054964,-10.755425,1.000000;;, + 1280;16;0.713247,-0.002867,-0.700906,0.000000,-0.700353,-0.042855,-0.712509,0.000000,-0.027995,0.999077,-0.032574,0.000000,12.410506,3.054965,-10.755434,1.000000;;, + 1360;16;0.713247,-0.002867,-0.700906,0.000000,-0.700353,-0.042855,-0.712509,0.000000,-0.027995,0.999077,-0.032574,0.000000,12.410516,3.054975,-10.755422,1.000000;;, + 1440;16;0.713247,-0.002867,-0.700906,0.000000,-0.700353,-0.042855,-0.712509,0.000000,-0.027995,0.999077,-0.032574,0.000000,12.410494,3.054971,-10.755426,1.000000;;, + 1520;16;0.713247,-0.002867,-0.700906,0.000000,-0.700353,-0.042855,-0.712509,0.000000,-0.027995,0.999077,-0.032574,0.000000,12.410505,3.054976,-10.755416,1.000000;;, + 1600;16;0.713247,-0.002867,-0.700906,0.000000,-0.700353,-0.042855,-0.712509,0.000000,-0.027995,0.999077,-0.032574,0.000000,12.410496,3.054975,-10.755421,1.000000;;, + 1680;16;0.713248,-0.002867,-0.700906,0.000000,-0.700353,-0.042855,-0.712509,0.000000,-0.027995,0.999077,-0.032574,0.000000,12.410503,3.054969,-10.755434,1.000000;;, + 1760;16;0.713248,-0.002867,-0.700907,0.000000,-0.700353,-0.042855,-0.712509,0.000000,-0.027995,0.999077,-0.032574,0.000000,12.410509,3.054973,-10.755425,1.000000;;, + 1840;16;0.713247,-0.002867,-0.700906,0.000000,-0.700353,-0.042855,-0.712509,0.000000,-0.027995,0.999077,-0.032574,0.000000,12.410497,3.054973,-10.755424,1.000000;;, + 1920;16;0.713247,-0.002867,-0.700906,0.000000,-0.700353,-0.042855,-0.712509,0.000000,-0.027995,0.999077,-0.032574,0.000000,12.410506,3.054967,-10.755421,1.000000;;, + 2000;16;0.713247,-0.002867,-0.700906,0.000000,-0.700353,-0.042855,-0.712509,0.000000,-0.027995,0.999077,-0.032574,0.000000,12.410499,3.054975,-10.755417,1.000000;;, + 2080;16;0.713247,-0.002867,-0.700906,0.000000,-0.700353,-0.042855,-0.712509,0.000000,-0.027995,0.999077,-0.032574,0.000000,12.410491,3.054975,-10.755412,1.000000;;, + 2160;16;0.713247,-0.002867,-0.700907,0.000000,-0.700353,-0.042855,-0.712509,0.000000,-0.027995,0.999077,-0.032574,0.000000,12.410501,3.054973,-10.755416,1.000000;;, + 2240;16;0.713247,-0.002867,-0.700906,0.000000,-0.700353,-0.042855,-0.712509,0.000000,-0.027995,0.999077,-0.032574,0.000000,12.410501,3.054976,-10.755409,1.000000;;, + 2320;16;0.713247,-0.002867,-0.700906,0.000000,-0.700353,-0.042855,-0.712509,0.000000,-0.027995,0.999077,-0.032574,0.000000,12.410510,3.054970,-10.755433,1.000000;;, + 2400;16;0.713247,-0.002867,-0.700906,0.000000,-0.700353,-0.042855,-0.712509,0.000000,-0.027995,0.999077,-0.032574,0.000000,12.410506,3.054970,-10.755426,1.000000;;, + 2480;16;0.713247,-0.002867,-0.700906,0.000000,-0.700353,-0.042855,-0.712509,0.000000,-0.027995,0.999077,-0.032574,0.000000,12.410507,3.054971,-10.755430,1.000000;;, + 2560;16;0.713247,-0.002867,-0.700906,0.000000,-0.700353,-0.042855,-0.712509,0.000000,-0.027995,0.999077,-0.032574,0.000000,12.410508,3.054976,-10.755413,1.000000;;, + 2640;16;0.713247,-0.002867,-0.700906,0.000000,-0.700353,-0.042855,-0.712509,0.000000,-0.027995,0.999077,-0.032574,0.000000,12.410507,3.054967,-10.755429,1.000000;;, + 2720;16;0.713247,-0.002867,-0.700906,0.000000,-0.700353,-0.042855,-0.712509,0.000000,-0.027995,0.999077,-0.032574,0.000000,12.410498,3.054969,-10.755423,1.000000;;, + 2800;16;0.713247,-0.002867,-0.700906,0.000000,-0.700353,-0.042855,-0.712509,0.000000,-0.027995,0.999077,-0.032574,0.000000,12.410500,3.054970,-10.755417,1.000000;;, + 2880;16;0.713247,-0.002867,-0.700906,0.000000,-0.700353,-0.042855,-0.712509,0.000000,-0.027995,0.999077,-0.032574,0.000000,12.410507,3.054965,-10.755431,1.000000;;, + 2960;16;0.713247,-0.002867,-0.700906,0.000000,-0.700353,-0.042855,-0.712509,0.000000,-0.027995,0.999077,-0.032574,0.000000,12.410504,3.054980,-10.755417,1.000000;;, + 3040;16;0.713247,-0.002867,-0.700906,0.000000,-0.700353,-0.042855,-0.712509,0.000000,-0.027995,0.999077,-0.032574,0.000000,12.410500,3.054974,-10.755425,1.000000;;, + 3120;16;0.713247,-0.002867,-0.700906,0.000000,-0.700353,-0.042855,-0.712509,0.000000,-0.027995,0.999077,-0.032574,0.000000,12.410500,3.054966,-10.755434,1.000000;;, + 3200;16;0.713247,-0.002867,-0.700906,0.000000,-0.700353,-0.042855,-0.712509,0.000000,-0.027995,0.999077,-0.032574,0.000000,12.410495,3.054964,-10.755433,1.000000;;, + 3280;16;0.713247,-0.002867,-0.700906,0.000000,-0.700353,-0.042855,-0.712509,0.000000,-0.027995,0.999077,-0.032574,0.000000,12.410502,3.054964,-10.755434,1.000000;;, + 3360;16;0.713247,-0.002867,-0.700906,0.000000,-0.700353,-0.042855,-0.712509,0.000000,-0.027995,0.999077,-0.032574,0.000000,12.410505,3.054978,-10.755419,1.000000;;, + 3440;16;0.713247,-0.002867,-0.700906,0.000000,-0.700353,-0.042855,-0.712509,0.000000,-0.027995,0.999077,-0.032574,0.000000,12.410506,3.054974,-10.755412,1.000000;;, + 3520;16;0.713247,-0.002867,-0.700906,0.000000,-0.700353,-0.042855,-0.712509,0.000000,-0.027995,0.999077,-0.032574,0.000000,12.410496,3.054967,-10.755432,1.000000;;, + 3600;16;0.713247,-0.002867,-0.700906,0.000000,-0.700353,-0.042855,-0.712509,0.000000,-0.027995,0.999077,-0.032574,0.000000,12.410502,3.054972,-10.755426,1.000000;;, + 3680;16;0.713247,-0.002867,-0.700906,0.000000,-0.700353,-0.042855,-0.712509,0.000000,-0.027995,0.999077,-0.032574,0.000000,12.410500,3.054976,-10.755416,1.000000;;, + 3760;16;0.713247,-0.002867,-0.700906,0.000000,-0.700353,-0.042855,-0.712509,0.000000,-0.027995,0.999077,-0.032574,0.000000,12.410504,3.054980,-10.755415,1.000000;;, + 3840;16;0.713247,-0.002867,-0.700906,0.000000,-0.700353,-0.042855,-0.712509,0.000000,-0.027995,0.999077,-0.032574,0.000000,12.410511,3.054967,-10.755432,1.000000;;, + 3920;16;0.713247,-0.002867,-0.700906,0.000000,-0.700353,-0.042855,-0.712509,0.000000,-0.027995,0.999077,-0.032574,0.000000,12.410498,3.054977,-10.755418,1.000000;;, + 4000;16;0.713247,-0.002867,-0.700906,0.000000,-0.700353,-0.042855,-0.712509,0.000000,-0.027995,0.999077,-0.032574,0.000000,12.410497,3.054971,-10.755430,1.000000;;, + 4080;16;0.713247,-0.002867,-0.700906,0.000000,-0.700353,-0.042855,-0.712509,0.000000,-0.027995,0.999077,-0.032574,0.000000,12.410501,3.054986,-10.755408,1.000000;;, + 4160;16;0.713247,-0.002867,-0.700906,0.000000,-0.700353,-0.042855,-0.712509,0.000000,-0.027995,0.999077,-0.032574,0.000000,12.410512,3.054956,-10.755445,1.000000;;, + 4240;16;0.713247,-0.002867,-0.700906,0.000000,-0.700353,-0.042855,-0.712509,0.000000,-0.027995,0.999077,-0.032574,0.000000,12.410506,3.054977,-10.755414,1.000000;;, + 4320;16;0.713247,-0.002867,-0.700906,0.000000,-0.700353,-0.042855,-0.712509,0.000000,-0.027995,0.999077,-0.032574,0.000000,12.410501,3.054983,-10.755426,1.000000;;, + 4400;16;0.713247,-0.002867,-0.700906,0.000000,-0.700353,-0.042855,-0.712509,0.000000,-0.027995,0.999077,-0.032574,0.000000,12.410499,3.054965,-10.755426,1.000000;;, + 4480;16;0.713247,-0.002867,-0.700906,0.000000,-0.700353,-0.042855,-0.712509,0.000000,-0.027995,0.999077,-0.032574,0.000000,12.410507,3.054966,-10.755425,1.000000;;, + 4560;16;0.713247,-0.002867,-0.700906,0.000000,-0.700353,-0.042855,-0.712509,0.000000,-0.027995,0.999077,-0.032574,0.000000,12.410522,3.054971,-10.755424,1.000000;;, + 4640;16;0.713247,-0.002867,-0.700906,0.000000,-0.700353,-0.042855,-0.712509,0.000000,-0.027995,0.999077,-0.032574,0.000000,12.410505,3.054967,-10.755433,1.000000;;, + 4720;16;0.713247,-0.002867,-0.700906,0.000000,-0.700353,-0.042855,-0.712509,0.000000,-0.027995,0.999077,-0.032574,0.000000,12.410533,3.054963,-10.755422,1.000000;;, + 4800;16;0.713247,-0.002867,-0.700906,0.000000,-0.700353,-0.042855,-0.712509,0.000000,-0.027995,0.999077,-0.032574,0.000000,12.410522,3.054963,-10.755418,1.000000;;, + 4960;16;0.713247,-0.002867,-0.700906,0.000000,-0.700353,-0.042855,-0.712509,0.000000,-0.027995,0.999077,-0.032574,0.000000,12.410508,3.054968,-10.755419,1.000000;;; + } + { Bip01_L_Finger0 } + } + + Animation { + + + AnimationKey { + 4; + 62; + 0;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,10.075042,-0.000009,0.000013,1.000000;;, + 80;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,10.075057,0.000004,0.000005,1.000000;;, + 160;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,10.075050,-0.000016,0.000012,1.000000;;, + 240;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,10.075056,-0.000019,0.000006,1.000000;;, + 320;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,10.075058,-0.000006,0.000002,1.000000;;, + 400;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,10.075063,-0.000001,-0.000003,1.000000;;, + 480;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,10.075071,0.000015,-0.000016,1.000000;;, + 560;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,10.075075,0.000002,-0.000006,1.000000;;, + 640;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,10.075053,0.000015,0.000006,1.000000;;, + 720;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,10.075067,-0.000004,-0.000010,1.000000;;, + 800;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,10.075047,0.000006,0.000007,1.000000;;, + 880;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,10.075071,0.000010,-0.000015,1.000000;;, + 960;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,10.075048,0.000030,0.000001,1.000000;;, + 1040;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,10.075065,0.000007,-0.000005,1.000000;;, + 1120;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,10.075040,-0.000001,0.000021,1.000000;;, + 1200;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,10.075075,0.000018,-0.000009,1.000000;;, + 1280;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,10.075082,0.000004,-0.000016,1.000000;;, + 1360;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,10.075045,0.000004,0.000013,1.000000;;, + 1440;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,10.075075,-0.000006,-0.000005,1.000000;;, + 1520;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,10.075055,-0.000013,0.000004,1.000000;;, + 1600;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,10.075053,-0.000007,0.000004,1.000000;;, + 1680;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,10.075068,-0.000000,-0.000004,1.000000;;, + 1760;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,10.075050,0.000011,-0.000002,1.000000;;, + 1840;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,10.075065,-0.000005,0.000013,1.000000;;, + 1920;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,10.075034,-0.000003,-0.000003,1.000000;;, + 2000;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,10.075072,0.000011,-0.000006,1.000000;;, + 2080;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,10.075059,0.000003,0.000002,1.000000;;, + 2160;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,10.075062,-0.000007,0.000004,1.000000;;, + 2240;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,10.075060,-0.000000,-0.000001,1.000000;;, + 2320;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,10.075060,0.000011,-0.000003,1.000000;;, + 2400;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,10.075072,0.000001,0.000001,1.000000;;, + 2480;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,10.075070,-0.000006,-0.000003,1.000000;;, + 2560;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,10.075075,0.000011,-0.000008,1.000000;;, + 2640;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,10.075055,-0.000009,0.000005,1.000000;;, + 2720;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,10.075059,0.000000,-0.000001,1.000000;;, + 2800;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,10.075051,-0.000017,0.000008,1.000000;;, + 2880;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,10.075068,0.000004,0.000001,1.000000;;, + 2960;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,10.075055,0.000011,-0.000002,1.000000;;, + 3040;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,10.075054,-0.000001,-0.000001,1.000000;;, + 3120;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,10.075063,0.000012,-0.000007,1.000000;;, + 3200;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,10.075068,0.000006,-0.000006,1.000000;;, + 3280;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,10.075062,-0.000019,0.000008,1.000000;;, + 3360;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,10.075058,-0.000014,0.000005,1.000000;;, + 3440;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,10.075047,-0.000004,0.000006,1.000000;;, + 3520;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,10.075062,0.000001,-0.000004,1.000000;;, + 3600;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,10.075053,0.000004,0.000005,1.000000;;, + 3680;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,10.075042,-0.000006,0.000009,1.000000;;, + 3760;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,10.075075,0.000004,-0.000009,1.000000;;, + 3840;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,10.075061,-0.000009,0.000004,1.000000;;, + 3920;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,10.075051,-0.000001,0.000008,1.000000;;, + 4000;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,10.075066,-0.000004,-0.000001,1.000000;;, + 4080;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,10.075035,-0.000012,0.000010,1.000000;;, + 4160;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,10.075076,0.000012,-0.000010,1.000000;;, + 4240;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,10.075080,-0.000000,-0.000001,1.000000;;, + 4320;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,10.075083,-0.000006,-0.000003,1.000000;;, + 4400;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,10.075057,-0.000004,-0.000002,1.000000;;, + 4480;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,10.075103,-0.000009,-0.000019,1.000000;;, + 4560;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,10.075098,-0.000006,-0.000016,1.000000;;, + 4640;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,10.075061,-0.000013,0.000003,1.000000;;, + 4720;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,10.075089,-0.000012,-0.000014,1.000000;;, + 4800;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,10.075084,0.000006,-0.000007,1.000000;;, + 4960;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,10.075042,-0.000009,0.000013,1.000000;;; + } + { Bip01_L_Finger01 } + } + + Animation { + + + AnimationKey { + 4; + 62; + 0;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,5.961583,0.000010,-0.000006,1.000000;;, + 80;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,5.961592,0.000005,-0.000016,1.000000;;, + 160;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,5.961579,0.000013,-0.000008,1.000000;;, + 240;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,5.961580,0.000013,-0.000006,1.000000;;, + 320;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,5.961563,-0.000004,0.000012,1.000000;;, + 400;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,5.961575,0.000008,-0.000006,1.000000;;, + 480;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,5.961571,-0.000003,0.000006,1.000000;;, + 560;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,5.961547,0.000037,0.000017,1.000000;;, + 640;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,5.961574,0.000004,-0.000008,1.000000;;, + 720;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,5.961565,0.000021,0.000006,1.000000;;, + 800;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,5.961578,-0.000000,-0.000003,1.000000;;, + 880;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,5.961573,-0.000007,0.000007,1.000000;;, + 960;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,5.961574,-0.000013,-0.000001,1.000000;;, + 1040;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,5.961557,-0.000014,0.000018,1.000000;;, + 1120;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,5.961590,-0.000004,-0.000009,1.000000;;, + 1200;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,5.961573,-0.000009,0.000002,1.000000;;, + 1280;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,5.961561,0.000001,0.000004,1.000000;;, + 1360;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,5.961581,-0.000005,-0.000008,1.000000;;, + 1440;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,5.961569,0.000008,0.000004,1.000000;;, + 1520;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,5.961579,0.000011,-0.000010,1.000000;;, + 1600;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,5.961600,-0.000001,-0.000014,1.000000;;, + 1680;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,5.961573,-0.000002,0.000006,1.000000;;, + 1760;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,5.961561,-0.000008,0.000007,1.000000;;, + 1840;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,5.961572,0.000001,-0.000005,1.000000;;, + 1920;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,5.961586,0.000006,0.000004,1.000000;;, + 2000;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,5.961570,-0.000011,0.000019,1.000000;;, + 2080;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,5.961590,0.000008,0.000001,1.000000;;, + 2160;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,5.961572,0.000008,0.000004,1.000000;;, + 2240;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,5.961582,0.000020,-0.000002,1.000000;;, + 2320;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,5.961582,-0.000001,0.000001,1.000000;;, + 2400;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,5.961583,0.000017,-0.000006,1.000000;;, + 2480;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,5.961566,0.000003,0.000003,1.000000;;, + 2560;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,5.961568,-0.000006,-0.000001,1.000000;;, + 2640;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,5.961571,0.000001,-0.000004,1.000000;;, + 2720;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,5.961561,-0.000014,0.000009,1.000000;;, + 2800;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,5.961579,0.000009,-0.000003,1.000000;;, + 2880;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,5.961574,-0.000007,0.000002,1.000000;;, + 2960;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,5.961576,-0.000004,0.000002,1.000000;;, + 3040;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,5.961565,-0.000002,0.000004,1.000000;;, + 3120;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,5.961581,-0.000019,0.000004,1.000000;;, + 3200;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,5.961570,-0.000012,0.000005,1.000000;;, + 3280;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,5.961571,0.000010,-0.000000,1.000000;;, + 3360;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,5.961576,0.000006,-0.000005,1.000000;;, + 3440;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,5.961583,-0.000005,-0.000003,1.000000;;, + 3520;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,5.961581,0.000019,-0.000012,1.000000;;, + 3600;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,5.961582,-0.000001,-0.000007,1.000000;;, + 3680;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,5.961586,0.000006,-0.000009,1.000000;;, + 3760;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,5.961561,0.000005,0.000009,1.000000;;, + 3840;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,5.961577,0.000002,-0.000007,1.000000;;, + 3920;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,5.961557,-0.000012,0.000012,1.000000;;, + 4000;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,5.961568,-0.000011,0.000004,1.000000;;, + 4080;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,5.961595,0.000018,-0.000016,1.000000;;, + 4160;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,5.961530,-0.000013,0.000027,1.000000;;, + 4240;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,5.961580,0.000006,-0.000002,1.000000;;, + 4320;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,5.961552,0.000002,0.000005,1.000000;;, + 4400;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,5.961567,0.000004,0.000002,1.000000;;, + 4480;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,5.961559,-0.000005,0.000011,1.000000;;, + 4560;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,5.961559,-0.000019,0.000015,1.000000;;, + 4640;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,5.961563,0.000016,0.000006,1.000000;;, + 4720;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,5.961565,0.000025,0.000000,1.000000;;, + 4800;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,5.961566,-0.000008,0.000006,1.000000;;, + 4960;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,5.961583,0.000010,-0.000006,1.000000;;; + } + { Bip01_L_Finger02 } + } + + Animation { + + + AnimationKey { + 4; + 62; + 0;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,5.961576,0.000009,-0.000003,1.000000;;, + 80;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,5.961568,-0.000009,0.000011,1.000000;;, + 160;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,5.961581,0.000011,-0.000008,1.000000;;, + 240;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,5.961579,0.000013,-0.000003,1.000000;;, + 320;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,5.961580,0.000014,-0.000009,1.000000;;, + 400;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,5.961574,0.000009,-0.000001,1.000000;;, + 480;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,5.961569,-0.000002,0.000006,1.000000;;, + 560;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,5.961576,-0.000011,-0.000001,1.000000;;, + 640;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,5.961578,0.000005,-0.000002,1.000000;;, + 720;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,5.961578,-0.000002,-0.000003,1.000000;;, + 800;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,5.961576,-0.000000,-0.000005,1.000000;;, + 880;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,5.961572,-0.000007,0.000004,1.000000;;, + 960;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,5.961579,-0.000012,0.000002,1.000000;;, + 1040;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,5.961574,0.000008,0.000002,1.000000;;, + 1120;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,5.961586,-0.000004,-0.000012,1.000000;;, + 1200;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,5.961573,-0.000009,0.000007,1.000000;;, + 1280;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,5.961569,-0.000003,0.000001,1.000000;;, + 1360;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,5.961571,0.000000,0.000001,1.000000;;, + 1440;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,5.961565,0.000009,-0.000000,1.000000;;, + 1520;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,5.961580,0.000012,-0.000009,1.000000;;, + 1600;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,5.961571,0.000002,0.000002,1.000000;;, + 1680;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,5.961573,-0.000002,0.000001,1.000000;;, + 1760;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,5.961590,-0.000005,-0.000004,1.000000;;, + 1840;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,5.961571,-0.000000,0.000000,1.000000;;, + 1920;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,5.961586,0.000002,0.000003,1.000000;;, + 2000;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,5.961561,-0.000004,-0.000000,1.000000;;, + 2080;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,5.961565,-0.000010,0.000003,1.000000;;, + 2160;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,5.961571,0.000005,-0.000002,1.000000;;, + 2240;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,5.961568,-0.000010,0.000002,1.000000;;, + 2320;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,5.961582,-0.000001,0.000000,1.000000;;, + 2400;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,5.961562,-0.000001,0.000003,1.000000;;, + 2480;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,5.961565,0.000005,0.000001,1.000000;;, + 2560;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,5.961569,0.000001,0.000004,1.000000;;, + 2640;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,5.961572,0.000005,-0.000000,1.000000;;, + 2720;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,5.961578,0.000008,-0.000005,1.000000;;, + 2800;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,5.961580,0.000013,-0.000000,1.000000;;, + 2880;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,5.961571,-0.000005,0.000003,1.000000;;, + 2960;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,5.961578,-0.000008,0.000000,1.000000;;, + 3040;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,5.961578,-0.000012,0.000004,1.000000;;, + 3120;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,5.961567,-0.000010,0.000005,1.000000;;, + 3200;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,5.961571,-0.000007,0.000005,1.000000;;, + 3280;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,5.961579,0.000017,-0.000002,1.000000;;, + 3360;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,5.961581,0.000006,-0.000003,1.000000;;, + 3440;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,5.961584,0.000001,-0.000004,1.000000;;, + 3520;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,5.961576,-0.000014,0.000005,1.000000;;, + 3600;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,5.961581,0.000002,-0.000007,1.000000;;, + 3680;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,5.961588,0.000002,-0.000007,1.000000;;, + 3760;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,5.961570,-0.000007,0.000005,1.000000;;, + 3840;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,5.961579,0.000004,-0.000002,1.000000;;, + 3920;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,5.961581,0.000002,-0.000001,1.000000;;, + 4000;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,5.961569,-0.000010,0.000008,1.000000;;, + 4080;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,5.961600,0.000003,-0.000014,1.000000;;, + 4160;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,5.961583,0.000002,-0.000000,1.000000;;, + 4240;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,5.961576,0.000004,-0.000008,1.000000;;, + 4320;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,5.961551,0.000002,0.000005,1.000000;;, + 4400;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,5.961569,0.000004,0.000001,1.000000;;, + 4480;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,5.961553,0.000008,0.000013,1.000000;;, + 4560;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,5.961561,0.000010,0.000003,1.000000;;, + 4640;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,5.961563,0.000016,0.000001,1.000000;;, + 4720;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,5.961555,0.000000,0.000016,1.000000;;, + 4800;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,5.961566,-0.000008,0.000003,1.000000;;, + 4960;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,5.961576,0.000009,-0.000003,1.000000;;; + } + { Dummy06 } + } + + Animation { + + + AnimationKey { + 4; + 62; + 0;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000796,0.000000,-0.000000,0.000796,1.000000,0.000000,24.088003,0.354686,-0.505020,1.000000;;, + 80;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000796,0.000000,0.000000,0.000796,1.000000,0.000000,24.088007,0.354687,-0.505029,1.000000;;, + 160;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000796,0.000000,0.000000,0.000796,1.000000,0.000000,24.088003,0.354683,-0.505037,1.000000;;, + 240;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000796,0.000000,0.000000,0.000796,1.000000,0.000000,24.087999,0.354689,-0.505027,1.000000;;, + 320;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000796,0.000000,0.000000,0.000796,1.000000,0.000000,24.087999,0.354678,-0.505037,1.000000;;, + 400;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000796,0.000000,0.000000,0.000796,1.000000,0.000000,24.088018,0.354682,-0.505016,1.000000;;, + 480;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000796,0.000000,0.000000,0.000796,1.000000,0.000000,24.087997,0.354684,-0.505036,1.000000;;, + 560;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000796,0.000000,0.000000,0.000796,1.000000,0.000000,24.087997,0.354680,-0.505038,1.000000;;, + 640;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000796,0.000000,0.000000,0.000796,1.000000,0.000000,24.087982,0.354697,-0.505025,1.000000;;, + 720;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000796,0.000000,0.000000,0.000796,1.000000,0.000000,24.087984,0.354686,-0.505039,1.000000;;, + 800;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000796,0.000000,0.000000,0.000796,1.000000,0.000000,24.087999,0.354695,-0.505016,1.000000;;, + 880;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000796,0.000000,0.000000,0.000796,1.000000,0.000000,24.087994,0.354693,-0.505023,1.000000;;, + 960;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000796,0.000000,0.000000,0.000796,1.000000,0.000000,24.088020,0.354688,-0.505014,1.000000;;, + 1040;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000796,0.000000,0.000000,0.000796,1.000000,0.000000,24.088017,0.354669,-0.505036,1.000000;;, + 1120;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000796,0.000000,0.000000,0.000796,1.000000,0.000000,24.087996,0.354682,-0.505036,1.000000;;, + 1200;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000796,0.000000,0.000000,0.000796,1.000000,0.000000,24.087994,0.354682,-0.505039,1.000000;;, + 1280;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000796,0.000000,-0.000000,0.000796,1.000000,0.000000,24.087999,0.354684,-0.505032,1.000000;;, + 1360;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000796,0.000000,0.000000,0.000796,1.000000,0.000000,24.087997,0.354686,-0.505034,1.000000;;, + 1440;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000796,0.000000,0.000000,0.000796,1.000000,0.000000,24.088001,0.354692,-0.505020,1.000000;;, + 1520;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000796,0.000000,-0.000000,0.000796,1.000000,0.000000,24.088009,0.354688,-0.505025,1.000000;;, + 1600;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,-0.000796,0.000000,0.000000,0.000796,1.000000,0.000000,24.088003,0.354678,-0.505034,1.000000;;, + 1680;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000796,0.000000,-0.000000,0.000796,1.000000,0.000000,24.087992,0.354686,-0.505022,1.000000;;, + 1760;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000796,0.000000,-0.000000,0.000796,1.000000,0.000000,24.087994,0.354689,-0.505026,1.000000;;, + 1840;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,-0.000796,0.000000,-0.000000,0.000796,1.000000,0.000000,24.088005,0.354687,-0.505022,1.000000;;, + 1920;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,-0.000796,0.000000,0.000000,0.000796,1.000000,0.000000,24.087996,0.354682,-0.505020,1.000000;;, + 2000;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000796,0.000000,0.000000,0.000796,1.000000,0.000000,24.087999,0.354694,-0.505015,1.000000;;, + 2080;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000796,0.000000,0.000000,0.000796,1.000000,0.000000,24.088005,0.354690,-0.505026,1.000000;;, + 2160;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000796,0.000000,0.000000,0.000796,1.000000,0.000000,24.088007,0.354689,-0.505020,1.000000;;, + 2240;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,-0.000796,0.000000,0.000000,0.000796,1.000000,0.000000,24.088007,0.354691,-0.505020,1.000000;;, + 2320;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000796,0.000000,0.000000,0.000796,1.000000,0.000000,24.088007,0.354685,-0.505026,1.000000;;, + 2400;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,-0.000796,0.000000,0.000000,0.000796,1.000000,0.000000,24.088003,0.354688,-0.505016,1.000000;;, + 2480;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000796,0.000000,0.000000,0.000796,1.000000,0.000000,24.088007,0.354692,-0.505024,1.000000;;, + 2560;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000796,0.000000,0.000000,0.000796,1.000000,0.000000,24.088001,0.354689,-0.505018,1.000000;;, + 2640;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000796,0.000000,0.000000,0.000796,1.000000,0.000000,24.088001,0.354689,-0.505016,1.000000;;, + 2720;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000796,0.000000,-0.000000,0.000796,1.000000,0.000000,24.087994,0.354685,-0.505033,1.000000;;, + 2800;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000796,0.000000,-0.000000,0.000796,1.000000,0.000000,24.088005,0.354682,-0.505036,1.000000;;, + 2880;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000796,0.000000,-0.000000,0.000796,1.000000,0.000000,24.087996,0.354688,-0.505025,1.000000;;, + 2960;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000796,0.000000,0.000000,0.000796,1.000000,0.000000,24.087997,0.354684,-0.505037,1.000000;;, + 3040;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,-0.000796,0.000000,0.000000,0.000796,1.000000,0.000000,24.088001,0.354691,-0.505015,1.000000;;, + 3120;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,-0.000796,0.000000,0.000000,0.000796,1.000000,0.000000,24.087999,0.354692,-0.505020,1.000000;;, + 3200;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000796,0.000000,-0.000000,0.000796,1.000000,0.000000,24.088005,0.354682,-0.505040,1.000000;;, + 3280;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000796,0.000000,-0.000000,0.000796,1.000000,0.000000,24.088001,0.354681,-0.505039,1.000000;;, + 3360;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,-0.000796,0.000000,0.000000,0.000796,1.000000,0.000000,24.088001,0.354691,-0.505018,1.000000;;, + 3440;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000796,0.000000,-0.000000,0.000796,1.000000,0.000000,24.088003,0.354685,-0.505025,1.000000;;, + 3520;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,-0.000796,0.000000,0.000000,0.000796,1.000000,0.000000,24.088007,0.354681,-0.505039,1.000000;;, + 3600;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000796,0.000000,-0.000000,0.000796,1.000000,0.000000,24.087997,0.354683,-0.505033,1.000000;;, + 3680;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,-0.000796,0.000000,-0.000000,0.000796,1.000000,0.000000,24.088005,0.354683,-0.505036,1.000000;;, + 3760;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000796,0.000000,-0.000000,0.000796,1.000000,0.000000,24.087997,0.354693,-0.505018,1.000000;;, + 3840;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,-0.000796,0.000000,-0.000000,0.000796,1.000000,0.000000,24.088005,0.354691,-0.505020,1.000000;;, + 3920;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000796,0.000000,0.000000,0.000796,1.000000,0.000000,24.088005,0.354683,-0.505038,1.000000;;, + 4000;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000796,0.000000,0.000000,0.000796,1.000000,0.000000,24.087996,0.354698,-0.505015,1.000000;;, + 4080;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,-0.000796,0.000000,0.000000,0.000796,1.000000,0.000000,24.087996,0.354699,-0.505005,1.000000;;, + 4160;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000796,0.000000,0.000000,0.000796,1.000000,0.000000,24.088001,0.354686,-0.505031,1.000000;;, + 4240;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000796,0.000000,0.000000,0.000796,1.000000,0.000000,24.088005,0.354692,-0.505021,1.000000;;, + 4320;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000796,0.000000,0.000000,0.000796,1.000000,0.000000,24.087988,0.354712,-0.505011,1.000000;;, + 4400;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000796,0.000000,-0.000000,0.000796,1.000000,0.000000,24.087994,0.354686,-0.505024,1.000000;;, + 4480;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000796,0.000000,-0.000000,0.000796,1.000000,0.000000,24.088018,0.354674,-0.505038,1.000000;;, + 4560;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000796,0.000000,0.000000,0.000796,1.000000,0.000000,24.088011,0.354684,-0.505024,1.000000;;, + 4640;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,-0.000796,0.000000,-0.000000,0.000796,1.000000,0.000000,24.087997,0.354688,-0.505028,1.000000;;, + 4720;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000796,0.000000,-0.000000,0.000796,1.000000,0.000000,24.088015,0.354667,-0.505041,1.000000;;, + 4800;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000796,0.000000,0.000000,0.000796,1.000000,0.000000,24.087988,0.354694,-0.505022,1.000000;;, + 4960;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000796,0.000000,-0.000000,0.000796,1.000000,0.000000,24.088003,0.354686,-0.505020,1.000000;;; + } + { Bip01_L_Finger1 } + } + + Animation { + + + AnimationKey { + 4; + 62; + 0;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,9.300064,0.000003,0.000006,1.000000;;, + 80;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,9.300063,0.000007,0.000011,1.000000;;, + 160;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,9.300055,0.000007,0.000007,1.000000;;, + 240;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,9.300056,-0.000004,-0.000002,1.000000;;, + 320;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,9.300056,0.000004,0.000004,1.000000;;, + 400;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,9.300014,0.000025,0.000014,1.000000;;, + 480;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,9.300039,-0.000004,-0.000015,1.000000;;, + 560;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,9.300041,0.000005,0.000004,1.000000;;, + 640;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,9.300058,-0.000005,-0.000002,1.000000;;, + 720;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,9.300057,0.000007,0.000014,1.000000;;, + 800;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,9.300075,0.000004,0.000018,1.000000;;, + 880;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,9.300048,-0.000009,-0.000014,1.000000;;, + 960;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,9.300048,-0.000006,-0.000015,1.000000;;, + 1040;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,9.300055,-0.000009,-0.000013,1.000000;;, + 1120;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,9.300047,-0.000007,-0.000015,1.000000;;, + 1200;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,9.300065,-0.000006,0.000000,1.000000;;, + 1280;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,9.300060,0.000002,0.000007,1.000000;;, + 1360;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,9.300070,0.000006,0.000019,1.000000;;, + 1440;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,9.300065,-0.000004,-0.000004,1.000000;;, + 1520;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,9.300047,0.000002,0.000002,1.000000;;, + 1600;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,9.300076,0.000005,-0.000013,1.000000;;, + 1680;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,9.300056,0.000000,-0.000000,1.000000;;, + 1760;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,9.300069,0.000001,0.000005,1.000000;;, + 1840;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,9.300046,-0.000004,0.000008,1.000000;;, + 1920;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,9.300068,-0.000004,0.000000,1.000000;;, + 2000;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,9.300057,0.000006,0.000016,1.000000;;, + 2080;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,9.300053,0.000001,0.000011,1.000000;;, + 2160;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,9.300057,-0.000007,0.000001,1.000000;;, + 2240;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,9.300064,-0.000003,-0.000011,1.000000;;, + 2320;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,9.300056,-0.000001,-0.000002,1.000000;;, + 2400;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,9.300053,-0.000002,-0.000014,1.000000;;, + 2480;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,9.300054,0.000002,0.000003,1.000000;;, + 2560;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,9.300058,-0.000009,-0.000011,1.000000;;, + 2640;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,9.300057,-0.000009,-0.000017,1.000000;;, + 2720;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,9.300058,-0.000002,-0.000006,1.000000;;, + 2800;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,9.300055,-0.000003,-0.000003,1.000000;;, + 2880;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,9.300047,0.000005,0.000011,1.000000;;, + 2960;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,9.300066,-0.000004,-0.000015,1.000000;;, + 3040;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,9.300047,-0.000005,-0.000022,1.000000;;, + 3120;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,9.300045,-0.000003,-0.000006,1.000000;;, + 3200;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,9.300055,-0.000001,0.000005,1.000000;;, + 3280;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,9.300045,-0.000015,-0.000028,1.000000;;, + 3360;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,9.300060,0.000003,0.000007,1.000000;;, + 3440;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,9.300044,-0.000006,-0.000009,1.000000;;, + 3520;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,9.300054,0.000006,0.000008,1.000000;;, + 3600;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,9.300052,-0.000004,-0.000001,1.000000;;, + 3680;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,9.300062,-0.000000,0.000005,1.000000;;, + 3760;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,9.300060,0.000009,0.000010,1.000000;;, + 3840;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,9.300045,0.000013,0.000027,1.000000;;, + 3920;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,9.300067,-0.000013,-0.000011,1.000000;;, + 4000;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,9.300056,-0.000005,0.000000,1.000000;;, + 4080;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,9.300039,0.000021,0.000035,1.000000;;, + 4160;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,9.300084,-0.000016,-0.000027,1.000000;;, + 4240;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,9.300084,-0.000017,-0.000021,1.000000;;, + 4320;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,9.300045,0.000006,0.000015,1.000000;;, + 4400;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,9.300069,-0.000006,-0.000006,1.000000;;, + 4480;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,9.300056,0.000011,0.000010,1.000000;;, + 4560;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,9.300076,-0.000007,-0.000010,1.000000;;, + 4640;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,9.300057,-0.000006,-0.000009,1.000000;;, + 4720;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,9.300072,-0.000010,-0.000010,1.000000;;, + 4800;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,9.300090,-0.000022,-0.000024,1.000000;;, + 4960;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,9.300064,0.000003,0.000006,1.000000;;; + } + { Bip01_L_Finger11 } + } + + Animation { + + + AnimationKey { + 4; + 62; + 0;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,10.850065,0.000001,-0.000008,1.000000;;, + 80;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,10.850067,-0.000012,-0.000005,1.000000;;, + 160;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,10.850059,-0.000008,-0.000011,1.000000;;, + 240;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,10.850067,0.000001,0.000003,1.000000;;, + 320;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,10.850051,0.000009,0.000004,1.000000;;, + 400;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,10.850072,-0.000023,-0.000038,1.000000;;, + 480;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,10.850061,0.000006,0.000004,1.000000;;, + 560;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,10.850071,-0.000013,-0.000012,1.000000;;, + 640;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,10.850073,-0.000001,-0.000002,1.000000;;, + 720;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,10.850061,-0.000004,-0.000007,1.000000;;, + 800;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,10.850033,-0.000012,-0.000037,1.000000;;, + 880;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,10.850089,-0.000003,0.000006,1.000000;;, + 960;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,10.850071,0.000006,0.000006,1.000000;;, + 1040;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,10.850063,0.000002,0.000003,1.000000;;, + 1120;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,10.850079,-0.000002,0.000002,1.000000;;, + 1200;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,10.850054,0.000004,-0.000002,1.000000;;, + 1280;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,10.850033,0.000003,-0.000019,1.000000;;, + 1360;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,10.850060,-0.000001,0.000000,1.000000;;, + 1440;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,10.850060,-0.000002,0.000002,1.000000;;, + 1520;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,10.850078,-0.000007,-0.000004,1.000000;;, + 1600;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,10.850050,-0.000006,0.000007,1.000000;;, + 1680;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,10.850048,0.000007,0.000000,1.000000;;, + 1760;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,10.850069,0.000001,-0.000017,1.000000;;, + 1840;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,10.850089,0.000007,-0.000004,1.000000;;, + 1920;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,10.850056,0.000012,0.000020,1.000000;;, + 2000;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,10.850053,-0.000007,-0.000005,1.000000;;, + 2080;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,10.850065,-0.000002,-0.000010,1.000000;;, + 2160;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,10.850060,0.000009,-0.000003,1.000000;;, + 2240;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,10.850053,0.000000,-0.000000,1.000000;;, + 2320;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,10.850065,0.000006,0.000002,1.000000;;, + 2400;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,10.850070,0.000000,0.000011,1.000000;;, + 2480;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,10.850060,-0.000006,-0.000010,1.000000;;, + 2560;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,10.850062,0.000004,0.000002,1.000000;;, + 2640;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,10.850082,0.000004,0.000002,1.000000;;, + 2720;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,10.850064,0.000001,-0.000002,1.000000;;, + 2800;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,10.850072,0.000007,0.000007,1.000000;;, + 2880;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,10.850075,-0.000000,-0.000010,1.000000;;, + 2960;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,10.850063,0.000002,0.000011,1.000000;;, + 3040;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,10.850078,0.000013,0.000042,1.000000;;, + 3120;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,10.850089,-0.000001,-0.000006,1.000000;;, + 3200;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,10.850073,0.000010,0.000013,1.000000;;, + 3280;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,10.850079,0.000021,0.000042,1.000000;;, + 3360;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,10.850069,-0.000005,-0.000008,1.000000;;, + 3440;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,10.850072,0.000013,0.000025,1.000000;;, + 3520;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,10.850064,-0.000001,0.000000,1.000000;;, + 3600;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,10.850068,-0.000004,-0.000008,1.000000;;, + 3680;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,10.850067,-0.000010,-0.000026,1.000000;;, + 3760;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,10.850063,-0.000014,-0.000005,1.000000;;, + 3840;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,10.850078,-0.000021,-0.000040,1.000000;;, + 3920;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,10.850061,0.000001,-0.000003,1.000000;;, + 4000;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,10.850081,-0.000003,-0.000007,1.000000;;, + 4080;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,10.850072,-0.000017,-0.000023,1.000000;;, + 4160;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,10.850025,0.000036,0.000062,1.000000;;, + 4240;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,10.850046,0.000018,0.000011,1.000000;;, + 4320;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,10.850097,-0.000030,-0.000042,1.000000;;, + 4400;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,10.850051,0.000014,0.000013,1.000000;;, + 4480;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,10.850077,-0.000010,-0.000012,1.000000;;, + 4560;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,10.850067,-0.000007,-0.000006,1.000000;;, + 4640;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,10.850060,0.000006,0.000009,1.000000;;, + 4720;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,10.850066,0.000001,-0.000007,1.000000;;, + 4800;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,10.850065,0.000028,0.000040,1.000000;;, + 4960;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,10.850065,0.000001,-0.000008,1.000000;;; + } + { Bip01_L_Finger12 } + } + + Animation { + + + AnimationKey { + 4; + 62; + 0;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,11.207764,0.000008,0.000012,1.000000;;, + 80;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,11.207752,0.000001,-0.000009,1.000000;;, + 160;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,11.207758,-0.000006,-0.000005,1.000000;;, + 240;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,11.207754,0.000013,0.000008,1.000000;;, + 320;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,11.207761,-0.000003,-0.000001,1.000000;;, + 400;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,11.207761,0.000004,0.000010,1.000000;;, + 480;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,11.207757,-0.000003,0.000000,1.000000;;, + 560;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,11.207770,-0.000005,-0.000006,1.000000;;, + 640;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,11.207747,0.000006,-0.000002,1.000000;;, + 720;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,11.207773,0.000003,-0.000002,1.000000;;, + 800;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,11.207769,0.000006,0.000008,1.000000;;, + 880;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,11.207754,0.000004,0.000008,1.000000;;, + 960;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,11.207753,0.000009,0.000010,1.000000;;, + 1040;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,11.207757,0.000009,0.000006,1.000000;;, + 1120;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,11.207743,0.000002,-0.000000,1.000000;;, + 1200;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,11.207767,-0.000013,-0.000008,1.000000;;, + 1280;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,11.207783,0.000011,0.000022,1.000000;;, + 1360;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,11.207764,-0.000002,0.000000,1.000000;;, + 1440;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,11.207756,-0.000002,-0.000000,1.000000;;, + 1520;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,11.207762,0.000002,0.000001,1.000000;;, + 1600;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,11.207761,0.000001,-0.000005,1.000000;;, + 1680;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,11.207769,-0.000003,0.000000,1.000000;;, + 1760;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,11.207753,0.000002,0.000003,1.000000;;, + 1840;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,11.207752,0.000005,-0.000002,1.000000;;, + 1920;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,11.207760,-0.000011,-0.000011,1.000000;;, + 2000;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,11.207770,-0.000000,-0.000003,1.000000;;, + 2080;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,11.207766,0.000006,0.000004,1.000000;;, + 2160;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,11.207768,-0.000001,-0.000000,1.000000;;, + 2240;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,11.207764,-0.000002,0.000002,1.000000;;, + 2320;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,11.207757,-0.000010,-0.000012,1.000000;;, + 2400;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,11.207762,0.000002,0.000014,1.000000;;, + 2480;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,11.207767,-0.000003,0.000003,1.000000;;, + 2560;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,11.207757,0.000005,0.000015,1.000000;;, + 2640;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,11.207755,0.000002,0.000006,1.000000;;, + 2720;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,11.207770,-0.000002,-0.000001,1.000000;;, + 2800;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,11.207756,-0.000006,-0.000010,1.000000;;, + 2880;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,11.207760,-0.000000,0.000002,1.000000;;, + 2960;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,11.207756,0.000005,0.000012,1.000000;;, + 3040;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,11.207765,-0.000007,-0.000011,1.000000;;, + 3120;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,11.207755,0.000004,0.000013,1.000000;;, + 3200;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,11.207761,-0.000004,-0.000010,1.000000;;, + 3280;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,11.207756,-0.000007,-0.000016,1.000000;;, + 3360;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,11.207761,-0.000004,-0.000012,1.000000;;, + 3440;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,11.207767,-0.000005,-0.000007,1.000000;;, + 3520;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,11.207764,-0.000003,-0.000005,1.000000;;, + 3600;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,11.207770,0.000003,0.000006,1.000000;;, + 3680;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,11.207760,0.000007,0.000009,1.000000;;, + 3760;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,11.207760,0.000005,0.000003,1.000000;;, + 3840;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,11.207765,0.000008,0.000006,1.000000;;, + 3920;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,11.207769,0.000001,-0.000002,1.000000;;, + 4000;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,11.207773,0.000001,-0.000000,1.000000;;, + 4080;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,11.207779,-0.000013,-0.000017,1.000000;;, + 4160;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,11.207768,-0.000015,-0.000020,1.000000;;, + 4240;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,11.207767,-0.000003,-0.000003,1.000000;;, + 4320;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,11.207754,0.000010,0.000015,1.000000;;, + 4400;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,11.207767,-0.000011,-0.000015,1.000000;;, + 4480;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,11.207764,-0.000007,-0.000010,1.000000;;, + 4560;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,11.207754,0.000014,0.000006,1.000000;;, + 4640;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,11.207787,-0.000006,-0.000010,1.000000;;, + 4720;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,11.207737,0.000012,0.000015,1.000000;;, + 4800;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,11.207734,-0.000002,-0.000004,1.000000;;, + 4960;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,11.207764,0.000008,0.000012,1.000000;;; + } + { Dummy03 } + } + + Animation { + + + AnimationKey { + 4; + 62; + 0;16;-0.407607,0.378871,-0.830851,0.000000,-0.503079,-0.852505,-0.141940,0.000000,-0.762081,0.360128,0.538089,0.000000,-12.374953,4.006935,-8.346194,1.000000;;, + 80;16;-0.416514,0.377872,-0.826879,0.000000,-0.503483,-0.853189,-0.136282,0.000000,-0.756981,0.359556,0.545618,0.000000,-12.374949,4.006937,-8.346193,1.000000;;, + 160;16;-0.425366,0.376888,-0.822812,0.000000,-0.503870,-0.853846,-0.130619,0.000000,-0.751784,0.359030,0.553099,0.000000,-12.374967,4.006944,-8.346194,1.000000;;, + 240;16;-0.434586,0.375814,-0.818474,0.000000,-0.504263,-0.854512,-0.124612,0.000000,-0.746227,0.358572,0.560867,0.000000,-12.374971,4.006948,-8.346193,1.000000;;, + 320;16;-0.442896,0.374968,-0.814397,0.000000,-0.504596,-0.855076,-0.119281,0.000000,-0.741098,0.358112,0.567917,0.000000,-12.374956,4.006941,-8.346194,1.000000;;, + 400;16;-0.449149,0.374601,-0.811134,0.000000,-0.504821,-0.855457,-0.115536,0.000000,-0.737171,0.357585,0.573335,0.000000,-12.374967,4.006938,-8.346195,1.000000;;, + 480;16;-0.453500,0.374765,-0.808634,0.000000,-0.504947,-0.855671,-0.113379,0.000000,-0.734415,0.356900,0.577284,0.000000,-12.374941,4.006937,-8.346192,1.000000;;, + 560;16;-0.455431,0.375689,-0.807118,0.000000,-0.504948,-0.855673,-0.113364,0.000000,-0.733219,0.355924,0.579404,0.000000,-12.374949,4.006939,-8.346192,1.000000;;, + 640;16;-0.455793,0.377101,-0.806255,0.000000,-0.504868,-0.855537,-0.114738,0.000000,-0.733049,0.354756,0.580334,0.000000,-12.374961,4.006935,-8.346194,1.000000;;, + 720;16;-0.455233,0.378873,-0.805741,0.000000,-0.504733,-0.855308,-0.117013,0.000000,-0.733490,0.353416,0.580594,0.000000,-12.374965,4.006937,-8.346196,1.000000;;, + 800;16;-0.453797,0.380821,-0.805633,0.000000,-0.504555,-0.855006,-0.119953,0.000000,-0.734501,0.352051,0.580144,0.000000,-12.374959,4.006924,-8.346196,1.000000;;, + 880;16;-0.451680,0.382774,-0.805897,0.000000,-0.504349,-0.854657,-0.123262,0.000000,-0.735947,0.350778,0.579083,0.000000,-12.374973,4.006937,-8.346195,1.000000;;, + 960;16;-0.449073,0.384565,-0.806500,0.000000,-0.504132,-0.854290,-0.126643,0.000000,-0.737688,0.349711,0.577511,0.000000,-12.374933,4.006945,-8.346191,1.000000;;, + 1040;16;-0.446313,0.385962,-0.807365,0.000000,-0.503934,-0.853955,-0.129659,0.000000,-0.739496,0.348991,0.575631,0.000000,-12.374995,4.006943,-8.346198,1.000000;;, + 1120;16;-0.443171,0.386969,-0.808612,0.000000,-0.503748,-0.853639,-0.132431,0.000000,-0.741510,0.348647,0.573244,0.000000,-12.374972,4.006928,-8.346197,1.000000;;, + 1200;16;-0.439593,0.387489,-0.810315,0.000000,-0.503580,-0.853355,-0.134880,0.000000,-0.743751,0.348767,0.570260,0.000000,-12.374940,4.006937,-8.346193,1.000000;;, + 1280;16;-0.435395,0.387588,-0.812532,0.000000,-0.503420,-0.853083,-0.137174,0.000000,-0.746324,0.349320,0.566547,0.000000,-12.374939,4.006934,-8.346193,1.000000;;, + 1360;16;-0.430296,0.387329,-0.815366,0.000000,-0.503253,-0.852800,-0.139529,0.000000,-0.749388,0.350297,0.561881,0.000000,-12.374988,4.006957,-8.346195,1.000000;;, + 1440;16;-0.424518,0.386623,-0.818723,0.000000,-0.503094,-0.852531,-0.141727,0.000000,-0.752782,0.351729,0.556423,0.000000,-12.374943,4.006949,-8.346193,1.000000;;, + 1520;16;-0.418227,0.385487,-0.822488,0.000000,-0.502949,-0.852285,-0.143708,0.000000,-0.756392,0.353567,0.550329,0.000000,-12.374943,4.006932,-8.346193,1.000000;;, + 1600;16;-0.411315,0.383640,-0.826825,0.000000,-0.502837,-0.852095,-0.145222,0.000000,-0.760247,0.356026,0.543388,0.000000,-12.374963,4.006937,-8.346194,1.000000;;, + 1680;16;-0.403712,0.380662,-0.831933,0.000000,-0.502789,-0.852014,-0.145862,0.000000,-0.764343,0.359401,0.535361,0.000000,-12.374950,4.006958,-8.346194,1.000000;;, + 1760;16;-0.395471,0.376937,-0.837569,0.000000,-0.502776,-0.851992,-0.146034,0.000000,-0.768647,0.363357,0.526453,0.000000,-12.374956,4.006951,-8.346193,1.000000;;, + 1840;16;-0.386531,0.372472,-0.843717,0.000000,-0.502794,-0.852022,-0.145794,0.000000,-0.773170,0.367862,0.516610,0.000000,-12.374984,4.006931,-8.346196,1.000000;;, + 1920;16;-0.377170,0.368002,-0.849892,0.000000,-0.502794,-0.852023,-0.145791,0.000000,-0.777779,0.372333,0.506387,0.000000,-12.374930,4.006939,-8.346193,1.000000;;, + 2000;16;-0.367752,0.364251,-0.855616,0.000000,-0.502734,-0.851920,-0.146598,0.000000,-0.782315,0.376236,0.496417,0.000000,-12.374946,4.006942,-8.346193,1.000000;;, + 2080;16;-0.357990,0.361378,-0.860958,0.000000,-0.502589,-0.851675,-0.148502,0.000000,-0.786922,0.379546,0.486516,0.000000,-12.374934,4.006934,-8.346194,1.000000;;, + 2160;16;-0.347639,0.359976,-0.865774,0.000000,-0.502302,-0.851189,-0.152220,0.000000,-0.791732,0.381963,0.476723,0.000000,-12.374949,4.006957,-8.346195,1.000000;;, + 2240;16;-0.336935,0.359491,-0.870196,0.000000,-0.501919,-0.850540,-0.157031,0.000000,-0.796588,0.383859,0.467012,0.000000,-12.374945,4.006944,-8.346195,1.000000;;, + 2320;16;-0.325771,0.359640,-0.874375,0.000000,-0.501454,-0.849752,-0.162683,0.000000,-0.801509,0.385462,0.457168,0.000000,-12.374968,4.006936,-8.346194,1.000000;;, + 2400;16;-0.314956,0.360150,-0.878120,0.000000,-0.500958,-0.848912,-0.168492,0.000000,-0.806129,0.386834,0.447790,0.000000,-12.374965,4.006927,-8.346193,1.000000;;, + 2480;16;-0.305369,0.360675,-0.881285,0.000000,-0.500500,-0.848135,-0.173683,0.000000,-0.810092,0.388046,0.439513,0.000000,-12.374954,4.006912,-8.346193,1.000000;;, + 2560;16;-0.296753,0.361113,-0.884045,0.000000,-0.500082,-0.847426,-0.178289,0.000000,-0.813545,0.389187,0.432063,0.000000,-12.374963,4.006956,-8.346196,1.000000;;, + 2640;16;-0.289142,0.361135,-0.886554,0.000000,-0.499739,-0.846845,-0.181974,0.000000,-0.816491,0.390429,0.425332,0.000000,-12.374942,4.006930,-8.346194,1.000000;;, + 2720;16;-0.282525,0.361066,-0.888713,0.000000,-0.499444,-0.846346,-0.185078,0.000000,-0.818984,0.391574,0.419446,0.000000,-12.374970,4.006927,-8.346194,1.000000;;, + 2800;16;-0.276615,0.361050,-0.890577,0.000000,-0.499173,-0.845887,-0.187887,0.000000,-0.821164,0.392580,0.414212,0.000000,-12.374959,4.006913,-8.346193,1.000000;;, + 2880;16;-0.272267,0.361310,-0.891810,0.000000,-0.498945,-0.845500,-0.190221,0.000000,-0.822754,0.393174,0.410475,0.000000,-12.374945,4.006962,-8.346195,1.000000;;, + 2960;16;-0.269968,0.362030,-0.892217,0.000000,-0.498766,-0.845196,-0.192033,0.000000,-0.823620,0.393164,0.408744,0.000000,-12.374956,4.006938,-8.346194,1.000000;;, + 3040;16;-0.270530,0.363477,-0.891458,0.000000,-0.498648,-0.844997,-0.193209,0.000000,-0.823507,0.392256,0.409844,0.000000,-12.374985,4.006958,-8.346195,1.000000;;, + 3120;16;-0.275395,0.366133,-0.888878,0.000000,-0.498614,-0.844939,-0.193552,0.000000,-0.821913,0.389904,0.415251,0.000000,-12.374957,4.006952,-8.346194,1.000000;;, + 3200;16;-0.283099,0.369485,-0.885062,0.000000,-0.498643,-0.844989,-0.193258,0.000000,-0.819274,0.386619,0.423457,0.000000,-12.374984,4.006936,-8.346194,1.000000;;, + 3280;16;-0.293334,0.373412,-0.880067,0.000000,-0.498733,-0.845141,-0.192360,0.000000,-0.815610,0.382493,0.434142,0.000000,-12.374942,4.006941,-8.346195,1.000000;;, + 3360;16;-0.304042,0.377235,-0.874787,0.000000,-0.498853,-0.845343,-0.191156,0.000000,-0.811606,0.378270,0.445204,0.000000,-12.374965,4.006917,-8.346193,1.000000;;, + 3440;16;-0.313157,0.380268,-0.870246,0.000000,-0.498974,-0.845550,-0.189922,0.000000,-0.808058,0.374755,0.454534,0.000000,-12.374965,4.006925,-8.346195,1.000000;;, + 3520;16;-0.320549,0.382559,-0.866543,0.000000,-0.499089,-0.845743,-0.188755,0.000000,-0.805083,0.371977,0.462034,0.000000,-12.374962,4.006930,-8.346194,1.000000;;, + 3600;16;-0.324950,0.383778,-0.864362,0.000000,-0.499171,-0.845882,-0.187914,0.000000,-0.803266,0.370402,0.466440,0.000000,-12.374987,4.006938,-8.346194,1.000000;;, + 3680;16;-0.327753,0.384378,-0.863036,0.000000,-0.499241,-0.846000,-0.187195,0.000000,-0.802083,0.369509,0.469176,0.000000,-12.374971,4.006967,-8.346194,1.000000;;, + 3760;16;-0.329814,0.384682,-0.862115,0.000000,-0.499305,-0.846110,-0.186524,0.000000,-0.801197,0.368940,0.471133,0.000000,-12.374954,4.006938,-8.346195,1.000000;;, + 3840;16;-0.331424,0.384701,-0.861489,0.000000,-0.499378,-0.846233,-0.185773,0.000000,-0.800488,0.368639,0.472573,0.000000,-12.374972,4.006914,-8.346196,1.000000;;, + 3920;16;-0.333010,0.384524,-0.860956,0.000000,-0.499468,-0.846387,-0.184826,0.000000,-0.799772,0.368471,0.473913,0.000000,-12.374987,4.006909,-8.346196,1.000000;;, + 4000;16;-0.335002,0.384236,-0.860312,0.000000,-0.499588,-0.846590,-0.183569,0.000000,-0.798865,0.368306,0.475568,0.000000,-12.374951,4.006948,-8.346193,1.000000;;, + 4080;16;-0.337949,0.383968,-0.859279,0.000000,-0.499749,-0.846861,-0.181872,0.000000,-0.797522,0.367960,0.478083,0.000000,-12.374978,4.006943,-8.346195,1.000000;;, + 4160;16;-0.341894,0.383677,-0.857847,0.000000,-0.499955,-0.847211,-0.179663,0.000000,-0.795709,0.367459,0.481477,0.000000,-12.374969,4.006939,-8.346195,1.000000;;, + 4240;16;-0.347213,0.383380,-0.855840,0.000000,-0.500220,-0.847661,-0.176777,0.000000,-0.793235,0.366729,0.486094,0.000000,-12.374987,4.006929,-8.346196,1.000000;;, + 4320;16;-0.353440,0.383022,-0.853448,0.000000,-0.500528,-0.848182,-0.173374,0.000000,-0.790286,0.365897,0.491495,0.000000,-12.374973,4.006942,-8.346195,1.000000;;, + 4400;16;-0.360300,0.382532,-0.850795,0.000000,-0.500870,-0.848762,-0.169506,0.000000,-0.786964,0.365065,0.497408,0.000000,-12.374979,4.006924,-8.346196,1.000000;;, + 4480;16;-0.367604,0.381976,-0.847916,0.000000,-0.501231,-0.849373,-0.165330,0.000000,-0.783349,0.364226,0.503691,0.000000,-12.374952,4.006930,-8.346195,1.000000;;, + 4560;16;-0.375143,0.381385,-0.844874,0.000000,-0.501596,-0.849993,-0.160976,0.000000,-0.779531,0.363397,0.510171,0.000000,-12.374953,4.006931,-8.346195,1.000000;;, + 4640;16;-0.382715,0.380790,-0.841741,0.000000,-0.501956,-0.850602,-0.156574,0.000000,-0.775609,0.362594,0.516678,0.000000,-12.374963,4.006971,-8.346191,1.000000;;, + 4720;16;-0.389985,0.380241,-0.838647,0.000000,-0.502292,-0.851172,-0.152345,0.000000,-0.771760,0.361833,0.522937,0.000000,-12.374979,4.006922,-8.346197,1.000000;;, + 4800;16;-0.397155,0.379708,-0.835518,0.000000,-0.502616,-0.851720,-0.148157,0.000000,-0.767883,0.361103,0.529112,0.000000,-12.374941,4.006959,-8.346190,1.000000;;, + 4960;16;-0.407607,0.378871,-0.830851,0.000000,-0.503079,-0.852505,-0.141940,0.000000,-0.762081,0.360128,0.538089,0.000000,-12.374953,4.006935,-8.346194,1.000000;;; + } + { Bip01_R_Clavicle } + } + + Animation { + + + AnimationKey { + 4; + 62; + 0;16;0.452612,0.717604,0.529327,0.000000,-0.426220,0.695510,-0.578448,0.000000,-0.783248,0.036203,0.620654,0.000000,31.000202,0.000005,0.000011,1.000000;;, + 80;16;0.440682,0.740856,0.506885,0.000000,-0.451457,0.670977,-0.588197,0.000000,-0.775877,0.030371,0.630152,0.000000,31.000204,0.000006,0.000021,1.000000;;, + 160;16;0.428367,0.763154,0.483836,0.000000,-0.476352,0.645727,-0.596763,0.000000,-0.767848,0.025157,0.640138,0.000000,31.000195,0.000000,0.000005,1.000000;;, + 240;16;0.415061,0.785612,0.458845,0.000000,-0.502242,0.618382,-0.604447,0.000000,-0.758602,0.020432,0.651234,0.000000,31.000191,0.000002,-0.000009,1.000000;;, + 320;16;0.403766,0.804658,0.435315,0.000000,-0.523951,0.593447,-0.610980,0.000000,-0.749966,0.018609,0.661214,0.000000,31.000191,-0.000002,-0.000000,1.000000;;, + 400;16;0.398536,0.817319,0.416123,0.000000,-0.536147,0.575729,-0.617319,0.000000,-0.744121,0.022920,0.667651,0.000000,31.000198,0.000007,0.000008,1.000000;;, + 480;16;0.397056,0.825128,0.401882,0.000000,-0.541189,0.564142,-0.623584,0.000000,-0.741256,0.030103,0.670547,0.000000,31.000196,0.000003,-0.000004,1.000000;;, + 560;16;0.399127,0.827686,0.394503,0.000000,-0.537802,0.559803,-0.630388,0.000000,-0.742608,0.039440,0.668564,0.000000,31.000212,0.000006,0.000019,1.000000;;, + 640;16;0.401665,0.827066,0.393225,0.000000,-0.530635,0.560148,-0.636129,0.000000,-0.746385,0.046852,0.663863,0.000000,31.000185,-0.000010,-0.000016,1.000000;;, + 720;16;0.400325,0.825301,0.398269,0.000000,-0.524681,0.562755,-0.638762,0.000000,-0.751298,0.046748,0.658305,0.000000,31.000183,-0.000005,-0.000014,1.000000;;, + 800;16;0.398441,0.821326,0.408251,0.000000,-0.517931,0.568828,-0.638891,0.000000,-0.756962,0.043114,0.652034,0.000000,31.000177,-0.000015,-0.000009,1.000000;;, + 880;16;0.397144,0.814737,0.422469,0.000000,-0.510570,0.578657,-0.635983,0.000000,-0.762623,0.036877,0.645791,0.000000,31.000189,-0.000002,-0.000010,1.000000;;, + 960;16;0.398858,0.805317,0.438607,0.000000,-0.501479,0.591997,-0.630920,0.000000,-0.767744,0.031695,0.639972,0.000000,31.000191,0.000008,-0.000007,1.000000;;, + 1040;16;0.404275,0.793806,0.454349,0.000000,-0.490979,0.607461,-0.624444,0.000000,-0.771687,0.029371,0.635324,0.000000,31.000198,-0.000008,0.000000,1.000000;;, + 1120;16;0.419312,0.777423,0.468819,0.000000,-0.474527,0.627936,-0.616863,0.000000,-0.773952,0.036190,0.632209,0.000000,31.000189,-0.000005,-0.000004,1.000000;;, + 1200;16;0.451385,0.752533,0.479527,0.000000,-0.446152,0.655725,-0.609076,0.000000,-0.772787,0.060986,0.631728,0.000000,31.000206,0.000001,0.000017,1.000000;;, + 1280;16;0.494407,0.719313,0.488007,0.000000,-0.408289,0.687812,-0.600179,0.000000,-0.767373,0.097484,0.633746,0.000000,31.000200,-0.000005,0.000008,1.000000;;, + 1360;16;0.547995,0.674778,0.494344,0.000000,-0.358778,0.723465,-0.589811,0.000000,-0.755632,0.145854,0.638550,0.000000,31.000196,0.000009,0.000008,1.000000;;, + 1440;16;0.600843,0.623908,0.499727,0.000000,-0.305625,0.756956,-0.577591,0.000000,-0.738634,0.194312,0.645493,0.000000,31.000193,0.000008,-0.000003,1.000000;;, + 1520;16;0.644029,0.573665,0.506098,0.000000,-0.257437,0.785502,-0.562773,0.000000,-0.720384,0.232153,0.653569,0.000000,31.000195,0.000002,0.000005,1.000000;;, + 1600;16;0.677819,0.525861,0.513841,0.000000,-0.215097,0.810139,-0.545351,0.000000,-0.703061,0.259123,0.662239,0.000000,31.000196,-0.000014,0.000000,1.000000;;, + 1680;16;0.698452,0.486218,0.525127,0.000000,-0.184156,0.831166,-0.524642,0.000000,-0.691557,0.269732,0.670069,0.000000,31.000195,-0.000029,-0.000009,1.000000;;, + 1760;16;0.712112,0.450626,0.538362,0.000000,-0.159496,0.850613,-0.501018,0.000000,-0.683709,0.270914,0.677605,0.000000,31.000202,-0.000005,0.000012,1.000000;;, + 1840;16;0.722193,0.416114,0.552528,0.000000,-0.137589,0.869265,-0.474813,0.000000,-0.677869,0.266885,0.685029,0.000000,31.000195,-0.000011,-0.000001,1.000000;;, + 1920;16;0.729968,0.381999,0.566766,0.000000,-0.117977,0.887209,-0.446028,0.000000,-0.673222,0.258721,0.692701,0.000000,31.000196,0.000019,0.000001,1.000000;;, + 2000;16;0.737439,0.347148,0.579373,0.000000,-0.099271,0.904197,-0.415420,0.000000,-0.668079,0.248832,0.701251,0.000000,31.000193,0.000022,0.000011,1.000000;;, + 2080;16;0.744879,0.309606,0.591015,0.000000,-0.080023,0.920878,-0.381550,0.000000,-0.662383,0.236914,0.710718,0.000000,31.000204,0.000002,0.000018,1.000000;;, + 2160;16;0.753388,0.266011,0.601369,0.000000,-0.057593,0.937702,-0.342634,0.000000,-0.655049,0.223501,0.721774,0.000000,31.000202,0.000016,0.000013,1.000000;;, + 2240;16;0.761671,0.219100,0.609798,0.000000,-0.033967,0.953304,-0.300095,0.000000,-0.647073,0.207861,0.733546,0.000000,31.000189,0.000026,0.000009,1.000000;;, + 2320;16;0.768939,0.168925,0.616601,0.000000,-0.009481,0.967368,-0.253198,0.000000,-0.639252,0.188848,0.745449,0.000000,31.000189,0.000003,-0.000001,1.000000;;, + 2400;16;0.775192,0.120581,0.620112,0.000000,0.013302,0.978281,-0.206857,0.000000,-0.631586,0.168603,0.756751,0.000000,31.000202,-0.000012,0.000010,1.000000;;, + 2480;16;0.780357,0.079030,0.620320,0.000000,0.031675,0.985713,-0.165428,0.000000,-0.624531,0.148741,0.766705,0.000000,31.000210,0.000004,0.000042,1.000000;;, + 2560;16;0.784730,0.044929,0.618207,0.000000,0.046236,0.990348,-0.130665,0.000000,-0.618110,0.131121,0.775079,0.000000,31.000202,0.000013,0.000026,1.000000;;, + 2640;16;0.788437,0.021205,0.614750,0.000000,0.056258,0.992731,-0.106395,0.000000,-0.612538,0.118470,0.781513,0.000000,31.000198,0.000002,0.000004,1.000000;;, + 2720;16;0.791435,0.005262,0.611231,0.000000,0.063142,0.993910,-0.090314,0.000000,-0.607984,0.110072,0.786282,0.000000,31.000195,0.000010,0.000002,1.000000;;, + 2800;16;0.793721,-0.004627,0.608264,0.000000,0.068325,0.994321,-0.081594,0.000000,-0.604432,0.106323,0.789530,0.000000,31.000202,-0.000019,0.000014,1.000000;;, + 2880;16;0.795044,-0.008385,0.606494,0.000000,0.071013,0.994315,-0.079343,0.000000,-0.602381,0.106150,0.791119,0.000000,31.000189,0.000019,0.000005,1.000000;;, + 2960;16;0.795173,-0.006850,0.606343,0.000000,0.071316,0.994053,-0.082297,0.000000,-0.602174,0.108682,0.790933,0.000000,31.000193,0.000009,0.000000,1.000000;;, + 3040;16;0.794147,0.001327,0.607724,0.000000,0.067899,0.993543,-0.090897,0.000000,-0.603920,0.113449,0.788929,0.000000,31.000198,-0.000002,0.000006,1.000000;;, + 3120;16;0.791804,0.018068,0.610508,0.000000,0.058857,0.992653,-0.105712,0.000000,-0.607933,0.119636,0.784924,0.000000,31.000198,-0.000002,0.000010,1.000000;;, + 3200;16;0.788313,0.041502,0.613873,0.000000,0.045577,0.991043,-0.125530,0.000000,-0.613584,0.126935,0.779360,0.000000,31.000193,-0.000014,-0.000006,1.000000;;, + 3280;16;0.783706,0.071876,0.616960,0.000000,0.027939,0.988198,-0.150616,0.000000,-0.620504,0.135275,0.772448,0.000000,31.000196,0.000021,0.000017,1.000000;;, + 3360;16;0.778145,0.104767,0.619285,0.000000,0.008416,0.984162,-0.177070,0.000000,-0.628028,0.142999,0.764939,0.000000,31.000200,-0.000020,0.000008,1.000000;;, + 3440;16;0.771949,0.135668,0.621038,0.000000,-0.010331,0.979509,-0.201136,0.000000,-0.635600,0.148851,0.757533,0.000000,31.000202,-0.000004,0.000017,1.000000;;, + 3520;16;0.765550,0.164315,0.622040,0.000000,-0.028308,0.974503,-0.222581,0.000000,-0.642753,0.152789,0.750682,0.000000,31.000198,0.000012,0.000010,1.000000;;, + 3600;16;0.759653,0.187891,0.622595,0.000000,-0.044033,0.970018,-0.239012,0.000000,-0.648836,0.154151,0.745150,0.000000,31.000191,-0.000024,-0.000017,1.000000;;, + 3680;16;0.753917,0.209216,0.622767,0.000000,-0.059075,0.965687,-0.252902,0.000000,-0.654308,0.153877,0.740407,0.000000,31.000185,0.000021,-0.000005,1.000000;;, + 3760;16;0.748277,0.230114,0.622197,0.000000,-0.074616,0.961153,-0.265739,0.000000,-0.659177,0.152421,0.736379,0.000000,31.000195,0.000003,-0.000001,1.000000;;, + 3840;16;0.742244,0.250932,0.621375,0.000000,-0.090540,0.956296,-0.278031,0.000000,-0.663985,0.150108,0.732524,0.000000,31.000195,-0.000019,-0.000002,1.000000;;, + 3920;16;0.735410,0.272427,0.620448,0.000000,-0.107080,0.950841,-0.290576,0.000000,-0.669109,0.147255,0.728430,0.000000,31.000191,-0.000032,-0.000008,1.000000;;, + 4000;16;0.727352,0.295395,0.619436,0.000000,-0.124487,0.944437,-0.304206,0.000000,-0.674879,0.144153,0.723711,0.000000,31.000198,-0.000002,0.000011,1.000000;;, + 4080;16;0.717608,0.320769,0.618180,0.000000,-0.142928,0.936556,-0.320054,0.000000,-0.681623,0.141318,0.717927,0.000000,31.000189,-0.000014,0.000006,1.000000;;, + 4160;16;0.705739,0.349021,0.616537,0.000000,-0.162977,0.926874,-0.338146,0.000000,-0.689472,0.138162,0.711013,0.000000,31.000168,0.000051,-0.000034,1.000000;;, + 4240;16;0.690887,0.381217,0.614287,0.000000,-0.185335,0.914677,-0.359188,0.000000,-0.698803,0.134310,0.702591,0.000000,31.000187,0.000017,-0.000017,1.000000;;, + 4320;16;0.673460,0.416351,0.610823,0.000000,-0.209720,0.899963,-0.382210,0.000000,-0.708851,0.129301,0.693406,0.000000,31.000189,-0.000003,-0.000010,1.000000;;, + 4400;16;0.653362,0.453959,0.605837,0.000000,-0.236263,0.882566,-0.406518,0.000000,-0.719234,0.122466,0.683889,0.000000,31.000198,-0.000005,-0.000002,1.000000;;, + 4480;16;0.631189,0.493016,0.598779,0.000000,-0.264244,0.862493,-0.431603,0.000000,-0.729230,0.114199,0.674672,0.000000,31.000196,-0.000002,0.000017,1.000000;;, + 4560;16;0.607438,0.532598,0.589371,0.000000,-0.293147,0.839865,-0.456828,0.000000,-0.738298,0.104722,0.666296,0.000000,31.000189,0.000009,-0.000021,1.000000;;, + 4640;16;0.582691,0.571791,0.577517,0.000000,-0.322475,0.814958,-0.481513,0.000000,-0.745976,0.094339,0.659257,0.000000,31.000195,0.000002,0.000001,1.000000;;, + 4720;16;0.558018,0.609306,0.563349,0.000000,-0.351534,0.788520,-0.504639,0.000000,-0.751692,0.083562,0.654199,0.000000,31.000191,-0.000009,-0.000010,1.000000;;, + 4800;16;0.532891,0.645602,0.547015,0.000000,-0.380503,0.760229,-0.526564,0.000000,-0.755807,0.072461,0.650772,0.000000,31.000195,-0.000004,0.000004,1.000000;;, + 4960;16;0.452612,0.717604,0.529327,0.000000,-0.426220,0.695510,-0.578448,0.000000,-0.783248,0.036203,0.620654,0.000000,31.000202,0.000005,0.000011,1.000000;;; + } + { Bip01_R_UpperArm } + } + + Animation { + + + AnimationKey { + 4; + 62; + 0;16;0.839302,-0.543666,-0.000000,0.000000,0.543666,0.839302,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,89.202522,0.000004,-0.000000,1.000000;;, + 80;16;0.845569,-0.533866,0.000000,0.000000,0.533866,0.845569,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,89.202530,-0.000005,-0.000000,1.000000;;, + 160;16;0.851723,-0.523993,0.000000,0.000000,0.523993,0.851723,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,89.202515,-0.000010,0.000002,1.000000;;, + 240;16;0.858073,-0.513528,-0.000000,0.000000,0.513528,0.858073,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,89.202507,0.000006,-0.000001,1.000000;;, + 320;16;0.863682,-0.504036,0.000000,0.000000,0.504036,0.863682,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,89.202522,0.000010,-0.000001,1.000000;;, + 400;16;0.867822,-0.496876,-0.000000,0.000000,0.496876,0.867822,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,89.202507,0.000001,0.000001,1.000000;;, + 480;16;0.870432,-0.492288,0.000000,0.000000,0.492288,0.870432,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,89.202515,-0.000002,0.000001,1.000000;;, + 560;16;0.870943,-0.491383,-0.000000,0.000000,0.491383,0.870943,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,89.202522,-0.000003,-0.000000,1.000000;;, + 640;16;0.870105,-0.492867,0.000000,0.000000,0.492866,0.870105,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,89.202499,-0.000002,-0.000003,1.000000;;, + 720;16;0.868300,-0.496040,-0.000000,0.000000,0.496040,0.868300,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,89.202530,-0.000012,-0.000001,1.000000;;, + 800;16;0.865941,-0.500146,0.000000,0.000000,0.500146,0.865941,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,89.202515,-0.000000,0.000000,1.000000;;, + 880;16;0.863442,-0.504447,-0.000000,0.000000,0.504447,0.863442,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,89.202507,-0.000005,0.000001,1.000000;;, + 960;16;0.861232,-0.508212,0.000000,0.000000,0.508212,0.861232,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,89.202499,-0.000008,-0.000000,1.000000;;, + 1040;16;0.859419,-0.511272,0.000000,0.000000,0.511272,0.859419,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,89.202507,-0.000001,-0.000001,1.000000;;, + 1120;16;0.859435,-0.511245,-0.000000,0.000000,0.511245,0.859435,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,89.202507,-0.000007,-0.000002,1.000000;;, + 1200;16;0.863427,-0.504474,-0.000000,0.000000,0.504474,0.863427,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,89.202522,0.000007,-0.000000,1.000000;;, + 1280;16;0.869177,-0.494501,-0.000000,0.000000,0.494501,0.869177,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,89.202530,0.000000,-0.000002,1.000000;;, + 1360;16;0.876396,-0.481592,0.000000,0.000000,0.481592,0.876396,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,89.202515,0.000005,-0.000003,1.000000;;, + 1440;16;0.881597,-0.472003,0.000000,0.000000,0.472003,0.881597,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,89.202507,0.000001,-0.000001,1.000000;;, + 1520;16;0.881905,-0.471427,0.000000,0.000000,0.471427,0.881905,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,89.202522,-0.000016,-0.000005,1.000000;;, + 1600;16;0.876021,-0.482273,-0.000000,0.000000,0.482273,0.876021,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,89.202515,-0.000007,-0.000007,1.000000;;, + 1680;16;0.859824,-0.510590,0.000000,0.000000,0.510590,0.859824,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,89.202507,0.000013,-0.000002,1.000000;;, + 1760;16;0.835646,-0.549268,-0.000000,0.000000,0.549268,0.835646,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,89.202515,0.000009,-0.000001,1.000000;;, + 1840;16;0.803666,-0.595080,0.000000,0.000000,0.595080,0.803666,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,89.202530,0.000029,0.000012,1.000000;;, + 1920;16;0.766699,-0.642007,-0.000000,0.000000,0.642007,0.766699,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,89.202515,0.000022,0.000007,1.000000;;, + 2000;16;0.729471,-0.684011,-0.000000,0.000000,0.684011,0.729471,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,89.202530,0.000014,0.000011,1.000000;;, + 2080;16;0.692161,-0.721744,-0.000000,0.000000,0.721744,0.692161,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,89.202538,0.000032,0.000015,1.000000;;, + 2160;16;0.657421,-0.753524,0.000000,0.000000,0.753524,0.657421,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,89.202530,0.000011,0.000011,1.000000;;, + 2240;16;0.623622,-0.781726,-0.000000,0.000000,0.781726,0.623622,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,89.202530,0.000032,0.000010,1.000000;;, + 2320;16;0.588879,-0.808221,-0.000000,0.000000,0.808221,0.588879,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,89.202530,0.000034,0.000008,1.000000;;, + 2400;16;0.555261,-0.831676,0.000000,0.000000,0.831676,0.555261,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,89.202560,0.000015,0.000014,1.000000;;, + 2480;16;0.524198,-0.851596,-0.000000,0.000000,0.851596,0.524198,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,89.202538,0.000019,0.000010,1.000000;;, + 2560;16;0.496174,-0.868223,-0.000000,0.000000,0.868223,0.496174,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,89.202507,0.000032,0.000006,1.000000;;, + 2640;16;0.472349,-0.881412,-0.000000,0.000000,0.881412,0.472349,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,89.202507,0.000040,0.000004,1.000000;;, + 2720;16;0.452028,-0.892004,-0.000000,0.000000,0.892004,0.452028,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,89.202507,0.000024,0.000005,1.000000;;, + 2800;16;0.434868,-0.900494,0.000000,0.000000,0.900494,0.434868,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,89.202492,0.000019,-0.000003,1.000000;;, + 2880;16;0.420585,-0.907253,0.000000,0.000000,0.907253,0.420585,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,89.202515,0.000016,-0.000004,1.000000;;, + 2960;16;0.409422,-0.912345,-0.000000,0.000000,0.912345,0.409422,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,89.202499,0.000036,-0.000002,1.000000;;, + 3040;16;0.399246,-0.916844,-0.000000,0.000000,0.916844,0.399247,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,89.202515,0.000042,0.000018,1.000000;;, + 3120;16;0.386862,-0.922137,-0.000000,0.000000,0.922137,0.386862,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,89.202522,0.000018,0.000006,1.000000;;, + 3200;16;0.375469,-0.926835,0.000000,0.000000,0.926835,0.375469,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,89.202515,0.000028,0.000002,1.000000;;, + 3280;16;0.365296,-0.930891,0.000000,0.000000,0.930891,0.365296,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,89.202515,0.000032,0.000009,1.000000;;, + 3360;16;0.362235,-0.932087,0.000000,0.000000,0.932087,0.362235,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,89.202507,0.000022,0.000010,1.000000;;, + 3440;16;0.371763,-0.928328,0.000000,0.000000,0.928328,0.371763,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,89.202515,0.000029,0.000013,1.000000;;, + 3520;16;0.395109,-0.918634,0.000000,0.000000,0.918634,0.395109,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,89.202530,0.000035,0.000017,1.000000;;, + 3600;16;0.437008,-0.899457,-0.000000,0.000000,0.899458,0.437008,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,89.202507,0.000014,0.000007,1.000000;;, + 3680;16;0.490136,-0.871646,0.000000,0.000000,0.871646,0.490136,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,89.202515,0.000030,0.000005,1.000000;;, + 3760;16;0.550422,-0.834887,0.000000,0.000000,0.834887,0.550422,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,89.202538,0.000013,0.000007,1.000000;;, + 3840;16;0.612258,-0.790658,-0.000000,0.000000,0.790658,0.612258,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,89.202507,0.000040,0.000007,1.000000;;, + 3920;16;0.671066,-0.741397,0.000000,0.000000,0.741397,0.671066,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,89.202515,0.000025,-0.000001,1.000000;;, + 4000;16;0.723139,-0.690702,-0.000000,0.000000,0.690702,0.723139,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,89.202507,0.000035,0.000003,1.000000;;, + 4080;16;0.764850,-0.644208,0.000000,0.000000,0.644208,0.764850,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,89.202545,0.000027,0.000003,1.000000;;, + 4160;16;0.797213,-0.603698,-0.000000,0.000000,0.603698,0.797213,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,89.202530,0.000025,0.000005,1.000000;;, + 4240;16;0.819067,-0.573698,-0.000000,0.000000,0.573698,0.819067,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,89.202522,-0.000017,0.000003,1.000000;;, + 4320;16;0.834464,-0.551062,0.000000,0.000000,0.551062,0.834464,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,89.202499,-0.000014,-0.000004,1.000000;;, + 4400;16;0.845668,-0.533709,-0.000000,0.000000,0.533709,0.845668,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,89.202515,-0.000017,-0.000003,1.000000;;, + 4480;16;0.853964,-0.520332,-0.000000,0.000000,0.520332,0.853964,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,89.202515,0.000008,0.000000,1.000000;;, + 4560;16;0.860620,-0.509247,-0.000000,0.000000,0.509247,0.860620,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,89.202522,-0.000018,0.000003,1.000000;;, + 4640;16;0.866783,-0.498686,0.000000,0.000000,0.498686,0.866783,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,89.202522,-0.000006,0.000003,1.000000;;, + 4720;16;0.874184,-0.485595,0.000000,0.000000,0.485595,0.874184,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,89.202507,-0.000021,-0.000002,1.000000;;, + 4800;16;0.881719,-0.471776,0.000000,0.000000,0.471776,0.881718,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,89.202530,-0.000026,0.000000,1.000000;;, + 4960;16;0.839302,-0.543666,-0.000000,0.000000,0.543666,0.839302,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,89.202522,0.000004,-0.000000,1.000000;;; + } + { Bip01_R_Forearm } + } + + Animation { + + + AnimationKey { + 4; + 62; + 0;16;0.999842,-0.009430,0.015054,0.000000,-0.015226,-0.018419,0.999714,0.000000,-0.009150,-0.999786,-0.018560,0.000000,61.671482,-0.000006,0.000000,1.000000;;, + 80;16;0.999827,-0.009472,0.015985,0.000000,-0.016159,-0.018507,0.999698,0.000000,-0.009174,-0.999784,-0.018657,0.000000,61.671463,-0.000007,-0.000003,1.000000;;, + 160;16;0.999812,-0.009515,0.016916,0.000000,-0.017091,-0.018595,0.999681,0.000000,-0.009198,-0.999782,-0.018754,0.000000,61.671459,0.000001,-0.000001,1.000000;;, + 240;16;0.999794,-0.009563,0.017906,0.000000,-0.018082,-0.018690,0.999662,0.000000,-0.009225,-0.999780,-0.018859,0.000000,61.671490,-0.000008,-0.000001,1.000000;;, + 320;16;0.999778,-0.009601,0.018778,0.000000,-0.018955,-0.018770,0.999644,0.000000,-0.009246,-0.999778,-0.018948,0.000000,61.671490,-0.000002,-0.000000,1.000000;;, + 400;16;0.999766,-0.009616,0.019365,0.000000,-0.019544,-0.018816,0.999632,0.000000,-0.009248,-0.999777,-0.019000,0.000000,61.671474,0.000002,0.000001,1.000000;;, + 480;16;0.999760,-0.009618,0.019699,0.000000,-0.019878,-0.018829,0.999625,0.000000,-0.009243,-0.999776,-0.019015,0.000000,61.671467,0.000002,0.000003,1.000000;;, + 560;16;0.999759,-0.009612,0.019718,0.000000,-0.019896,-0.018796,0.999625,0.000000,-0.009238,-0.999777,-0.018982,0.000000,61.671505,0.000017,0.000003,1.000000;;, + 640;16;0.999763,-0.009602,0.019530,0.000000,-0.019707,-0.018733,0.999630,0.000000,-0.009233,-0.999778,-0.018918,0.000000,61.671486,0.000014,0.000004,1.000000;;, + 720;16;0.999769,-0.009597,0.019230,0.000000,-0.019407,-0.018651,0.999638,0.000000,-0.009235,-0.999780,-0.018833,0.000000,61.671482,0.000011,0.000002,1.000000;;, + 800;16;0.999777,-0.009578,0.018802,0.000000,-0.018978,-0.018555,0.999648,0.000000,-0.009226,-0.999782,-0.018732,0.000000,61.671482,0.000007,-0.000003,1.000000;;, + 880;16;0.999788,-0.009534,0.018257,0.000000,-0.018430,-0.018450,0.999660,0.000000,-0.009194,-0.999784,-0.018622,0.000000,61.671471,0.000007,-0.000002,1.000000;;, + 960;16;0.999800,-0.009453,0.017605,0.000000,-0.017776,-0.018343,0.999674,0.000000,-0.009127,-0.999787,-0.018508,0.000000,61.671471,0.000002,-0.000001,1.000000;;, + 1040;16;0.999813,-0.009346,0.016926,0.000000,-0.017095,-0.018262,0.999687,0.000000,-0.009034,-0.999790,-0.018418,0.000000,61.671482,0.000002,0.000003,1.000000;;, + 1120;16;0.999830,-0.009133,0.016027,0.000000,-0.016191,-0.018147,0.999704,0.000000,-0.008839,-0.999794,-0.018292,0.000000,61.671497,-0.000000,0.000002,1.000000;;, + 1200;16;0.999854,-0.008707,0.014680,0.000000,-0.014835,-0.017926,0.999729,0.000000,-0.008441,-0.999801,-0.018053,0.000000,61.671471,-0.000005,-0.000001,1.000000;;, + 1280;16;0.999881,-0.008164,0.013070,0.000000,-0.013213,-0.017669,0.999757,0.000000,-0.007931,-0.999811,-0.017775,0.000000,61.671494,-0.000007,0.000003,1.000000;;, + 1360;16;0.999910,-0.007500,0.011158,0.000000,-0.011287,-0.017372,0.999785,0.000000,-0.007305,-0.999821,-0.017455,0.000000,61.671497,-0.000011,-0.000001,1.000000;;, + 1440;16;0.999932,-0.006905,0.009383,0.000000,-0.009501,-0.017186,0.999807,0.000000,-0.006743,-0.999828,-0.017250,0.000000,61.671490,-0.000003,0.000006,1.000000;;, + 1520;16;0.999945,-0.006558,0.008132,0.000000,-0.008244,-0.017252,0.999817,0.000000,-0.006417,-0.999830,-0.017305,0.000000,61.671482,0.000011,0.000003,1.000000;;, + 1600;16;0.999951,-0.006482,0.007524,0.000000,-0.007637,-0.017610,0.999816,0.000000,-0.006349,-0.999824,-0.017658,0.000000,61.671501,-0.000002,-0.000003,1.000000;;, + 1680;16;0.999945,-0.006802,0.007930,0.000000,-0.008054,-0.018389,0.999799,0.000000,-0.006654,-0.999808,-0.018443,0.000000,61.671494,0.000021,0.000014,1.000000;;, + 1760;16;0.999932,-0.007393,0.008977,0.000000,-0.009119,-0.019460,0.999769,0.000000,-0.007217,-0.999783,-0.019526,0.000000,61.671486,0.000015,0.000004,1.000000;;, + 1840;16;0.999911,-0.008187,0.010506,0.000000,-0.010674,-0.020765,0.999727,0.000000,-0.007967,-0.999751,-0.020850,0.000000,61.671494,-0.000007,0.000002,1.000000;;, + 1920;16;0.999883,-0.009146,0.012254,0.000000,-0.012455,-0.022217,0.999676,0.000000,-0.008871,-0.999711,-0.022328,0.000000,61.671494,0.000001,0.000009,1.000000;;, + 2000;16;0.999852,-0.010190,0.013890,0.000000,-0.014128,-0.023693,0.999619,0.000000,-0.009857,-0.999667,-0.023834,0.000000,61.671455,0.000022,0.000007,1.000000;;, + 2080;16;0.999816,-0.011372,0.015462,0.000000,-0.015745,-0.025248,0.999557,0.000000,-0.010977,-0.999617,-0.025422,0.000000,61.671490,-0.000011,-0.000000,1.000000;;, + 2160;16;0.999777,-0.012730,0.016875,0.000000,-0.017213,-0.026899,0.999490,0.000000,-0.012269,-0.999557,-0.027112,0.000000,61.671467,0.000003,-0.000003,1.000000;;, + 2240;16;0.999733,-0.014224,0.018223,0.000000,-0.018625,-0.028628,0.999417,0.000000,-0.013694,-0.999489,-0.028886,0.000000,61.671478,-0.000009,-0.000003,1.000000;;, + 2320;16;0.999681,-0.015881,0.019623,0.000000,-0.020101,-0.030473,0.999334,0.000000,-0.015272,-0.999409,-0.030783,0.000000,61.671467,0.000001,0.000011,1.000000;;, + 2400;16;0.999627,-0.017550,0.020908,0.000000,-0.021467,-0.032279,0.999248,0.000000,-0.016862,-0.999325,-0.032644,0.000000,61.671471,0.000003,0.000004,1.000000;;, + 2480;16;0.999577,-0.019084,0.021961,0.000000,-0.022599,-0.033901,0.999170,0.000000,-0.018323,-0.999243,-0.034318,0.000000,61.671463,-0.000016,-0.000008,1.000000;;, + 2560;16;0.999531,-0.020501,0.022751,0.000000,-0.023466,-0.035354,0.999099,0.000000,-0.019679,-0.999165,-0.035819,0.000000,61.671486,0.000012,0.000005,1.000000;;, + 2640;16;0.999495,-0.021759,0.023170,0.000000,-0.023956,-0.036589,0.999043,0.000000,-0.020891,-0.999094,-0.037092,0.000000,61.671482,-0.000005,-0.000001,1.000000;;, + 2720;16;0.999466,-0.022900,0.023327,0.000000,-0.024179,-0.037656,0.998998,0.000000,-0.021999,-0.999028,-0.038190,0.000000,61.671471,0.000016,0.000004,1.000000;;, + 2800;16;0.999442,-0.023976,0.023270,0.000000,-0.024185,-0.038610,0.998962,0.000000,-0.023053,-0.998967,-0.039168,0.000000,61.671474,0.000007,-0.000001,1.000000;;, + 2880;16;0.999423,-0.024915,0.023070,0.000000,-0.024041,-0.039392,0.998935,0.000000,-0.023979,-0.998913,-0.039969,0.000000,61.671463,0.000002,-0.000002,1.000000;;, + 2960;16;0.999411,-0.025649,0.022815,0.000000,-0.023829,-0.039954,0.998917,0.000000,-0.024709,-0.998872,-0.040542,0.000000,61.671497,0.000005,0.000003,1.000000;;, + 3040;16;0.999403,-0.026214,0.022511,0.000000,-0.023557,-0.040321,0.998909,0.000000,-0.025277,-0.998843,-0.040915,0.000000,61.671467,-0.000020,-0.000016,1.000000;;, + 3120;16;0.999399,-0.026629,0.022214,0.000000,-0.023283,-0.040508,0.998908,0.000000,-0.025700,-0.998824,-0.041104,0.000000,61.671455,-0.000006,0.000003,1.000000;;, + 3200;16;0.999399,-0.026876,0.021870,0.000000,-0.022949,-0.040500,0.998916,0.000000,-0.025961,-0.998818,-0.041092,0.000000,61.671474,-0.000005,-0.000005,1.000000;;, + 3280;16;0.999406,-0.026975,0.021446,0.000000,-0.022524,-0.040312,0.998933,0.000000,-0.026081,-0.998823,-0.040896,0.000000,61.671497,-0.000002,-0.000003,1.000000;;, + 3360;16;0.999421,-0.026824,0.020931,0.000000,-0.021991,-0.039871,0.998963,0.000000,-0.025962,-0.998845,-0.040438,0.000000,61.671486,-0.000007,-0.000006,1.000000;;, + 3440;16;0.999446,-0.026350,0.020320,0.000000,-0.021343,-0.039125,0.999006,0.000000,-0.025529,-0.998887,-0.039666,0.000000,61.671463,-0.000008,-0.000006,1.000000;;, + 3520;16;0.999483,-0.025496,0.019563,0.000000,-0.020524,-0.038022,0.999066,0.000000,-0.024729,-0.998952,-0.038526,0.000000,61.671463,-0.000012,-0.000017,1.000000;;, + 3600;16;0.999536,-0.024132,0.018581,0.000000,-0.019454,-0.036450,0.999146,0.000000,-0.023434,-0.999044,-0.036903,0.000000,61.671471,-0.000009,-0.000004,1.000000;;, + 3680;16;0.999597,-0.022410,0.017443,0.000000,-0.018211,-0.034542,0.999237,0.000000,-0.021791,-0.999152,-0.034936,0.000000,61.671455,0.000011,-0.000003,1.000000;;, + 3760;16;0.999662,-0.020385,0.016149,0.000000,-0.016803,-0.032340,0.999336,0.000000,-0.019849,-0.999269,-0.032671,0.000000,61.671494,0.000001,-0.000004,1.000000;;, + 3840;16;0.999724,-0.018232,0.014819,0.000000,-0.015362,-0.030006,0.999432,0.000000,-0.017777,-0.999383,-0.030278,0.000000,61.671478,0.000009,-0.000003,1.000000;;, + 3920;16;0.999779,-0.016095,0.013546,0.000000,-0.013988,-0.027677,0.999519,0.000000,-0.015712,-0.999487,-0.027896,0.000000,61.671463,0.000024,0.000011,1.000000;;, + 4000;16;0.999823,-0.014117,0.012423,0.000000,-0.012780,-0.025486,0.999593,0.000000,-0.013794,-0.999575,-0.025662,0.000000,61.671501,-0.000024,0.000006,1.000000;;, + 4080;16;0.999855,-0.012481,0.011565,0.000000,-0.011857,-0.023609,0.999651,0.000000,-0.012204,-0.999643,-0.023753,0.000000,61.671471,-0.000031,-0.000007,1.000000;;, + 4160;16;0.999877,-0.011208,0.011004,0.000000,-0.011249,-0.022065,0.999693,0.000000,-0.010962,-0.999694,-0.022188,0.000000,61.671509,-0.000053,-0.000012,1.000000;;, + 4240;16;0.999887,-0.010432,0.010846,0.000000,-0.011063,-0.020981,0.999719,0.000000,-0.010202,-0.999725,-0.021094,0.000000,61.671482,0.000002,-0.000003,1.000000;;, + 4320;16;0.999890,-0.009995,0.010980,0.000000,-0.011180,-0.020212,0.999733,0.000000,-0.009771,-0.999746,-0.020321,0.000000,61.671471,0.000013,0.000006,1.000000;;, + 4400;16;0.999887,-0.009808,0.011352,0.000000,-0.011543,-0.019672,0.999740,0.000000,-0.009583,-0.999758,-0.019783,0.000000,61.671455,0.000016,0.000008,1.000000;;, + 4480;16;0.999881,-0.009799,0.011888,0.000000,-0.012076,-0.019296,0.999741,0.000000,-0.009568,-0.999766,-0.019412,0.000000,61.671490,-0.000029,-0.000001,1.000000;;, + 4560;16;0.999873,-0.009892,0.012518,0.000000,-0.012704,-0.019013,0.999739,0.000000,-0.009651,-0.999770,-0.019136,0.000000,61.671459,0.000019,0.000000,1.000000;;, + 4640;16;0.999863,-0.010010,0.013171,0.000000,-0.013357,-0.018754,0.999735,0.000000,-0.009760,-0.999774,-0.018885,0.000000,61.671463,-0.000028,-0.000006,1.000000;;, + 4720;16;0.999855,-0.010026,0.013731,0.000000,-0.013913,-0.018401,0.999734,0.000000,-0.009770,-0.999780,-0.018538,0.000000,61.671471,0.000000,0.000002,1.000000;;, + 4800;16;0.999848,-0.010016,0.014267,0.000000,-0.014446,-0.018025,0.999733,0.000000,-0.009756,-0.999787,-0.018167,0.000000,61.671482,0.000009,-0.000000,1.000000;;, + 4960;16;0.999842,-0.009430,0.015054,0.000000,-0.015226,-0.018419,0.999714,0.000000,-0.009150,-0.999786,-0.018560,0.000000,61.671482,-0.000006,0.000000,1.000000;;; + } + { Bip01_R_Hand } + } + + Animation { + + + AnimationKey { + 4; + 62; + 0;16;0.713247,-0.002867,0.700906,0.000000,-0.700353,-0.042855,0.712509,0.000000,0.027995,-0.999077,-0.032574,0.000000,12.410504,3.054970,10.755419,1.000000;;, + 80;16;0.713247,-0.002867,0.700906,0.000000,-0.700353,-0.042855,0.712509,0.000000,0.027995,-0.999077,-0.032574,0.000000,12.410502,3.054969,10.755422,1.000000;;, + 160;16;0.713247,-0.002867,0.700906,0.000000,-0.700353,-0.042855,0.712509,0.000000,0.027995,-0.999077,-0.032574,0.000000,12.410496,3.054973,10.755424,1.000000;;, + 240;16;0.713247,-0.002867,0.700906,0.000000,-0.700353,-0.042855,0.712509,0.000000,0.027995,-0.999077,-0.032574,0.000000,12.410510,3.054973,10.755419,1.000000;;, + 320;16;0.713247,-0.002867,0.700906,0.000000,-0.700353,-0.042855,0.712509,0.000000,0.027995,-0.999077,-0.032574,0.000000,12.410503,3.054971,10.755418,1.000000;;, + 400;16;0.713247,-0.002867,0.700906,0.000000,-0.700353,-0.042855,0.712509,0.000000,0.027995,-0.999077,-0.032574,0.000000,12.410501,3.054970,10.755423,1.000000;;, + 480;16;0.713247,-0.002867,0.700906,0.000000,-0.700353,-0.042855,0.712509,0.000000,0.027995,-0.999077,-0.032574,0.000000,12.410504,3.054974,10.755414,1.000000;;, + 560;16;0.713247,-0.002867,0.700906,0.000000,-0.700353,-0.042855,0.712509,0.000000,0.027995,-0.999077,-0.032574,0.000000,12.410506,3.054973,10.755427,1.000000;;, + 640;16;0.713247,-0.002867,0.700906,0.000000,-0.700353,-0.042855,0.712509,0.000000,0.027995,-0.999077,-0.032574,0.000000,12.410496,3.054969,10.755433,1.000000;;, + 720;16;0.713247,-0.002867,0.700906,0.000000,-0.700353,-0.042855,0.712509,0.000000,0.027995,-0.999077,-0.032574,0.000000,12.410497,3.054971,10.755427,1.000000;;, + 800;16;0.713247,-0.002867,0.700906,0.000000,-0.700353,-0.042855,0.712509,0.000000,0.027995,-0.999077,-0.032574,0.000000,12.410497,3.054971,10.755422,1.000000;;, + 880;16;0.713247,-0.002867,0.700906,0.000000,-0.700353,-0.042855,0.712509,0.000000,0.027995,-0.999077,-0.032574,0.000000,12.410493,3.054971,10.755424,1.000000;;, + 960;16;0.713247,-0.002867,0.700906,0.000000,-0.700353,-0.042855,0.712509,0.000000,0.027995,-0.999077,-0.032574,0.000000,12.410510,3.054967,10.755420,1.000000;;, + 1040;16;0.713247,-0.002867,0.700906,0.000000,-0.700353,-0.042855,0.712509,0.000000,0.027995,-0.999077,-0.032574,0.000000,12.410503,3.054971,10.755429,1.000000;;, + 1120;16;0.713247,-0.002867,0.700906,0.000000,-0.700353,-0.042855,0.712509,0.000000,0.027995,-0.999077,-0.032574,0.000000,12.410495,3.054971,10.755433,1.000000;;, + 1200;16;0.713247,-0.002867,0.700906,0.000000,-0.700353,-0.042855,0.712509,0.000000,0.027995,-0.999077,-0.032574,0.000000,12.410502,3.054972,10.755430,1.000000;;, + 1280;16;0.713247,-0.002867,0.700906,0.000000,-0.700353,-0.042855,0.712509,0.000000,0.027995,-0.999077,-0.032574,0.000000,12.410520,3.054972,10.755430,1.000000;;, + 1360;16;0.713247,-0.002867,0.700906,0.000000,-0.700353,-0.042855,0.712509,0.000000,0.027995,-0.999077,-0.032574,0.000000,12.410509,3.054971,10.755430,1.000000;;, + 1440;16;0.713247,-0.002867,0.700906,0.000000,-0.700353,-0.042855,0.712509,0.000000,0.027995,-0.999077,-0.032574,0.000000,12.410509,3.054970,10.755424,1.000000;;, + 1520;16;0.713247,-0.002867,0.700906,0.000000,-0.700353,-0.042855,0.712509,0.000000,0.027995,-0.999077,-0.032574,0.000000,12.410499,3.054962,10.755417,1.000000;;, + 1600;16;0.713247,-0.002867,0.700906,0.000000,-0.700353,-0.042855,0.712509,0.000000,0.027995,-0.999077,-0.032574,0.000000,12.410498,3.054971,10.755423,1.000000;;, + 1680;16;0.713247,-0.002867,0.700906,0.000000,-0.700353,-0.042855,0.712509,0.000000,0.027995,-0.999077,-0.032574,0.000000,12.410508,3.054972,10.755428,1.000000;;, + 1760;16;0.713247,-0.002867,0.700906,0.000000,-0.700353,-0.042855,0.712509,0.000000,0.027995,-0.999077,-0.032574,0.000000,12.410496,3.054977,10.755415,1.000000;;, + 1840;16;0.713247,-0.002867,0.700906,0.000000,-0.700353,-0.042855,0.712509,0.000000,0.027995,-0.999077,-0.032574,0.000000,12.410498,3.054973,10.755422,1.000000;;, + 1920;16;0.713247,-0.002867,0.700906,0.000000,-0.700353,-0.042855,0.712509,0.000000,0.027995,-0.999077,-0.032574,0.000000,12.410505,3.054962,10.755414,1.000000;;, + 2000;16;0.713247,-0.002867,0.700906,0.000000,-0.700353,-0.042855,0.712509,0.000000,0.027995,-0.999077,-0.032574,0.000000,12.410492,3.054979,10.755416,1.000000;;, + 2080;16;0.713247,-0.002867,0.700906,0.000000,-0.700353,-0.042855,0.712509,0.000000,0.027995,-0.999077,-0.032574,0.000000,12.410499,3.054971,10.755430,1.000000;;, + 2160;16;0.713247,-0.002867,0.700906,0.000000,-0.700353,-0.042855,0.712509,0.000000,0.027995,-0.999077,-0.032574,0.000000,12.410506,3.054967,10.755430,1.000000;;, + 2240;16;0.713247,-0.002867,0.700906,0.000000,-0.700353,-0.042855,0.712509,0.000000,0.027995,-0.999077,-0.032574,0.000000,12.410517,3.054963,10.755426,1.000000;;, + 2320;16;0.713247,-0.002867,0.700906,0.000000,-0.700353,-0.042855,0.712509,0.000000,0.027995,-0.999077,-0.032574,0.000000,12.410503,3.054976,10.755416,1.000000;;, + 2400;16;0.713247,-0.002867,0.700906,0.000000,-0.700353,-0.042855,0.712509,0.000000,0.027995,-0.999077,-0.032574,0.000000,12.410486,3.054972,10.755421,1.000000;;, + 2480;16;0.713247,-0.002867,0.700906,0.000000,-0.700353,-0.042855,0.712509,0.000000,0.027995,-0.999077,-0.032574,0.000000,12.410499,3.054968,10.755430,1.000000;;, + 2560;16;0.713247,-0.002867,0.700906,0.000000,-0.700353,-0.042855,0.712509,0.000000,0.027995,-0.999077,-0.032574,0.000000,12.410509,3.054973,10.755420,1.000000;;, + 2640;16;0.713247,-0.002867,0.700906,0.000000,-0.700353,-0.042855,0.712509,0.000000,0.027995,-0.999077,-0.032574,0.000000,12.410502,3.054973,10.755420,1.000000;;, + 2720;16;0.713247,-0.002867,0.700906,0.000000,-0.700353,-0.042855,0.712509,0.000000,0.027995,-0.999077,-0.032574,0.000000,12.410489,3.054962,10.755431,1.000000;;, + 2800;16;0.713247,-0.002867,0.700906,0.000000,-0.700353,-0.042855,0.712509,0.000000,0.027995,-0.999077,-0.032574,0.000000,12.410504,3.054969,10.755413,1.000000;;, + 2880;16;0.713247,-0.002867,0.700906,0.000000,-0.700353,-0.042855,0.712509,0.000000,0.027995,-0.999077,-0.032574,0.000000,12.410510,3.054960,10.755435,1.000000;;, + 2960;16;0.713247,-0.002867,0.700906,0.000000,-0.700353,-0.042855,0.712509,0.000000,0.027995,-0.999077,-0.032574,0.000000,12.410513,3.054971,10.755418,1.000000;;, + 3040;16;0.713247,-0.002867,0.700906,0.000000,-0.700353,-0.042855,0.712509,0.000000,0.027995,-0.999077,-0.032574,0.000000,12.410494,3.054973,10.755432,1.000000;;, + 3120;16;0.713247,-0.002867,0.700906,0.000000,-0.700353,-0.042855,0.712509,0.000000,0.027995,-0.999077,-0.032574,0.000000,12.410505,3.054975,10.755428,1.000000;;, + 3200;16;0.713247,-0.002867,0.700906,0.000000,-0.700353,-0.042855,0.712509,0.000000,0.027995,-0.999077,-0.032574,0.000000,12.410489,3.054979,10.755415,1.000000;;, + 3280;16;0.713247,-0.002867,0.700906,0.000000,-0.700353,-0.042855,0.712509,0.000000,0.027995,-0.999077,-0.032574,0.000000,12.410505,3.054979,10.755413,1.000000;;, + 3360;16;0.713247,-0.002867,0.700906,0.000000,-0.700353,-0.042855,0.712509,0.000000,0.027995,-0.999077,-0.032574,0.000000,12.410506,3.054971,10.755419,1.000000;;, + 3440;16;0.713247,-0.002867,0.700906,0.000000,-0.700353,-0.042855,0.712509,0.000000,0.027995,-0.999077,-0.032574,0.000000,12.410515,3.054965,10.755436,1.000000;;, + 3520;16;0.713247,-0.002867,0.700906,0.000000,-0.700353,-0.042855,0.712509,0.000000,0.027995,-0.999077,-0.032574,0.000000,12.410480,3.054987,10.755407,1.000000;;, + 3600;16;0.713247,-0.002867,0.700906,0.000000,-0.700353,-0.042855,0.712509,0.000000,0.027995,-0.999077,-0.032574,0.000000,12.410487,3.054979,10.755419,1.000000;;, + 3680;16;0.713247,-0.002867,0.700906,0.000000,-0.700353,-0.042855,0.712509,0.000000,0.027995,-0.999077,-0.032574,0.000000,12.410525,3.054966,10.755445,1.000000;;, + 3760;16;0.713247,-0.002867,0.700906,0.000000,-0.700353,-0.042855,0.712509,0.000000,0.027995,-0.999077,-0.032574,0.000000,12.410490,3.054978,10.755404,1.000000;;, + 3840;16;0.713247,-0.002867,0.700906,0.000000,-0.700353,-0.042855,0.712509,0.000000,0.027995,-0.999077,-0.032574,0.000000,12.410493,3.054979,10.755408,1.000000;;, + 3920;16;0.713247,-0.002867,0.700906,0.000000,-0.700353,-0.042855,0.712509,0.000000,0.027995,-0.999077,-0.032574,0.000000,12.410492,3.054971,10.755415,1.000000;;, + 4000;16;0.713247,-0.002867,0.700906,0.000000,-0.700353,-0.042855,0.712509,0.000000,0.027995,-0.999077,-0.032574,0.000000,12.410519,3.054965,10.755444,1.000000;;, + 4080;16;0.713247,-0.002867,0.700906,0.000000,-0.700353,-0.042855,0.712509,0.000000,0.027995,-0.999077,-0.032574,0.000000,12.410522,3.054968,10.755445,1.000000;;, + 4160;16;0.713247,-0.002867,0.700906,0.000000,-0.700353,-0.042855,0.712509,0.000000,0.027995,-0.999077,-0.032574,0.000000,12.410519,3.054975,10.755439,1.000000;;, + 4240;16;0.713247,-0.002867,0.700906,0.000000,-0.700353,-0.042855,0.712509,0.000000,0.027995,-0.999077,-0.032574,0.000000,12.410499,3.054971,10.755405,1.000000;;, + 4320;16;0.713247,-0.002867,0.700906,0.000000,-0.700353,-0.042855,0.712509,0.000000,0.027995,-0.999077,-0.032574,0.000000,12.410506,3.054970,10.755424,1.000000;;, + 4400;16;0.713247,-0.002867,0.700906,0.000000,-0.700353,-0.042855,0.712509,0.000000,0.027995,-0.999077,-0.032574,0.000000,12.410498,3.054973,10.755425,1.000000;;, + 4480;16;0.713247,-0.002867,0.700907,0.000000,-0.700353,-0.042855,0.712509,0.000000,0.027995,-0.999077,-0.032574,0.000000,12.410496,3.054969,10.755423,1.000000;;, + 4560;16;0.713247,-0.002867,0.700906,0.000000,-0.700353,-0.042855,0.712509,0.000000,0.027995,-0.999077,-0.032574,0.000000,12.410496,3.054974,10.755420,1.000000;;, + 4640;16;0.713247,-0.002867,0.700906,0.000000,-0.700353,-0.042855,0.712509,0.000000,0.027995,-0.999077,-0.032574,0.000000,12.410505,3.054972,10.755441,1.000000;;, + 4720;16;0.713247,-0.002867,0.700906,0.000000,-0.700353,-0.042855,0.712509,0.000000,0.027995,-0.999077,-0.032574,0.000000,12.410500,3.054973,10.755397,1.000000;;, + 4800;16;0.713247,-0.002867,0.700906,0.000000,-0.700353,-0.042855,0.712509,0.000000,0.027995,-0.999077,-0.032574,0.000000,12.410507,3.054970,10.755430,1.000000;;, + 4960;16;0.713247,-0.002867,0.700906,0.000000,-0.700353,-0.042855,0.712509,0.000000,0.027995,-0.999077,-0.032574,0.000000,12.410504,3.054970,10.755419,1.000000;;; + } + { Bip01_R_Finger0 } + } + + Animation { + + + AnimationKey { + 4; + 62; + 0;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,10.075052,0.000002,0.000001,1.000000;;, + 80;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,10.075058,-0.000000,0.000002,1.000000;;, + 160;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,10.075060,0.000007,-0.000002,1.000000;;, + 240;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,10.075061,0.000001,0.000002,1.000000;;, + 320;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,10.075058,-0.000003,0.000001,1.000000;;, + 400;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,10.075050,0.000010,0.000004,1.000000;;, + 480;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,10.075057,-0.000000,0.000002,1.000000;;, + 560;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,10.075052,-0.000008,0.000006,1.000000;;, + 640;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,10.075049,-0.000002,-0.000000,1.000000;;, + 720;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,10.075055,-0.000000,0.000001,1.000000;;, + 800;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,10.075058,0.000006,-0.000003,1.000000;;, + 880;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,10.075056,0.000002,0.000001,1.000000;;, + 960;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,10.075064,0.000012,-0.000004,1.000000;;, + 1040;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,10.075058,0.000012,-0.000001,1.000000;;, + 1120;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,10.075068,-0.000011,-0.000001,1.000000;;, + 1200;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,10.075061,0.000005,0.000002,1.000000;;, + 1280;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,10.075065,0.000005,0.000002,1.000000;;, + 1360;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,10.075057,-0.000009,-0.000001,1.000000;;, + 1440;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,10.075051,0.000008,0.000002,1.000000;;, + 1520;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,10.075061,-0.000001,-0.000004,1.000000;;, + 1600;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,10.075050,-0.000008,-0.000012,1.000000;;, + 1680;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,10.075062,-0.000003,0.000002,1.000000;;, + 1760;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,10.075061,0.000004,0.000001,1.000000;;, + 1840;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,10.075066,-0.000003,0.000002,1.000000;;, + 1920;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,10.075069,0.000007,-0.000002,1.000000;;, + 2000;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,10.075076,0.000014,0.000012,1.000000;;, + 2080;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,10.075056,0.000002,-0.000004,1.000000;;, + 2160;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,10.075055,-0.000008,-0.000001,1.000000;;, + 2240;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,10.075054,-0.000003,-0.000007,1.000000;;, + 2320;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,10.075050,0.000007,-0.000004,1.000000;;, + 2400;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,10.075045,-0.000015,-0.000011,1.000000;;, + 2480;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,10.075078,0.000018,0.000016,1.000000;;, + 2560;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,10.075087,0.000001,0.000011,1.000000;;, + 2640;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,10.075067,0.000012,0.000005,1.000000;;, + 2720;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,10.075042,0.000007,-0.000007,1.000000;;, + 2800;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,10.075064,0.000019,0.000008,1.000000;;, + 2880;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,10.075041,0.000003,-0.000016,1.000000;;, + 2960;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,10.075039,0.000007,-0.000012,1.000000;;, + 3040;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,10.075060,0.000024,0.000005,1.000000;;, + 3120;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,10.075059,-0.000010,-0.000001,1.000000;;, + 3200;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,10.075027,0.000053,-0.000005,1.000000;;, + 3280;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,10.075060,-0.000006,-0.000005,1.000000;;, + 3360;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,10.075058,0.000014,0.000003,1.000000;;, + 3440;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,10.075065,-0.000020,-0.000003,1.000000;;, + 3520;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,10.075032,0.000007,-0.000006,1.000000;;, + 3600;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,10.075042,0.000017,0.000001,1.000000;;, + 3680;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,10.075056,-0.000013,-0.000005,1.000000;;, + 3760;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,10.075061,0.000009,0.000004,1.000000;;, + 3840;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,10.075056,-0.000006,-0.000002,1.000000;;, + 3920;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,10.075090,0.000000,0.000008,1.000000;;, + 4000;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,10.075047,0.000004,0.000001,1.000000;;, + 4080;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,10.075047,-0.000000,-0.000001,1.000000;;, + 4160;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,10.075092,0.000014,0.000012,1.000000;;, + 4240;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,10.075029,-0.000006,-0.000009,1.000000;;, + 4320;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,10.075057,-0.000005,-0.000004,1.000000;;, + 4400;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,10.075061,-0.000004,-0.000000,1.000000;;, + 4480;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,10.075070,0.000014,0.000009,1.000000;;, + 4560;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,10.075041,-0.000008,-0.000004,1.000000;;, + 4640;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,10.075053,0.000000,-0.000002,1.000000;;, + 4720;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,10.075084,0.000022,-0.000000,1.000000;;, + 4800;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,10.075073,0.000020,-0.000001,1.000000;;, + 4960;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,10.075052,0.000002,0.000001,1.000000;;; + } + { Bip01_R_Finger01 } + } + + Animation { + + + AnimationKey { + 4; + 62; + 0;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,5.961570,0.000006,0.000001,1.000000;;, + 80;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,5.961572,-0.000003,0.000001,1.000000;;, + 160;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,5.961579,-0.000014,-0.000005,1.000000;;, + 240;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,5.961579,0.000003,-0.000004,1.000000;;, + 320;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,5.961572,-0.000001,-0.000001,1.000000;;, + 400;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,5.961577,-0.000006,-0.000002,1.000000;;, + 480;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,5.961569,0.000007,-0.000003,1.000000;;, + 560;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,5.961569,0.000006,-0.000003,1.000000;;, + 640;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,5.961580,-0.000004,0.000001,1.000000;;, + 720;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,5.961580,0.000001,0.000001,1.000000;;, + 800;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,5.961578,-0.000004,0.000001,1.000000;;, + 880;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,5.961586,-0.000004,0.000002,1.000000;;, + 960;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,5.961578,0.000002,0.000001,1.000000;;, + 1040;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,5.961571,-0.000016,-0.000002,1.000000;;, + 1120;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,5.961569,-0.000003,-0.000004,1.000000;;, + 1200;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,5.961572,-0.000011,0.000003,1.000000;;, + 1280;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,5.961568,0.000003,-0.000002,1.000000;;, + 1360;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,5.961584,-0.000004,-0.000001,1.000000;;, + 1440;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,5.961586,0.000001,0.000002,1.000000;;, + 1520;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,5.961574,-0.000001,-0.000001,1.000000;;, + 1600;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,5.961571,-0.000003,0.000000,1.000000;;, + 1680;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,5.961561,-0.000015,-0.000013,1.000000;;, + 1760;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,5.961587,0.000014,0.000007,1.000000;;, + 1840;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,5.961578,0.000000,0.000005,1.000000;;, + 1920;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,5.961569,-0.000001,-0.000000,1.000000;;, + 2000;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,5.961568,-0.000005,-0.000007,1.000000;;, + 2080;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,5.961582,-0.000002,0.000007,1.000000;;, + 2160;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,5.961592,0.000002,0.000007,1.000000;;, + 2240;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,5.961571,0.000001,0.000002,1.000000;;, + 2320;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,5.961581,-0.000002,0.000007,1.000000;;, + 2400;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,5.961587,0.000007,0.000005,1.000000;;, + 2480;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,5.961561,-0.000005,-0.000009,1.000000;;, + 2560;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,5.961563,-0.000000,-0.000002,1.000000;;, + 2640;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,5.961570,0.000003,-0.000004,1.000000;;, + 2720;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,5.961582,-0.000004,0.000006,1.000000;;, + 2800;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,5.961578,-0.000005,-0.000001,1.000000;;, + 2880;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,5.961594,0.000013,0.000015,1.000000;;, + 2960;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,5.961571,-0.000003,0.000001,1.000000;;, + 3040;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,5.961572,-0.000013,-0.000007,1.000000;;, + 3120;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,5.961565,-0.000008,-0.000008,1.000000;;, + 3200;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,5.961592,-0.000029,0.000004,1.000000;;, + 3280;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,5.961550,0.000049,0.000002,1.000000;;, + 3360;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,5.961544,0.000018,-0.000008,1.000000;;, + 3440;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,5.961576,0.000012,0.000001,1.000000;;, + 3520;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,5.961610,0.000008,0.000017,1.000000;;, + 3600;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,5.961546,0.000012,-0.000004,1.000000;;, + 3680;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,5.961613,-0.000003,0.000015,1.000000;;, + 3760;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,5.961617,0.000004,0.000010,1.000000;;, + 3840;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,5.961557,-0.000016,-0.000011,1.000000;;, + 3920;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,5.961516,-0.000004,-0.000013,1.000000;;, + 4000;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,5.961571,-0.000010,-0.000010,1.000000;;, + 4080;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,5.961620,0.000005,0.000005,1.000000;;, + 4160;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,5.961563,-0.000004,-0.000014,1.000000;;, + 4240;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,5.961597,0.000014,0.000007,1.000000;;, + 4320;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,5.961577,0.000003,0.000003,1.000000;;, + 4400;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,5.961582,0.000008,-0.000003,1.000000;;, + 4480;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,5.961578,0.000009,0.000002,1.000000;;, + 4560;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,5.961586,0.000002,-0.000004,1.000000;;, + 4640;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,5.961611,0.000023,0.000002,1.000000;;, + 4720;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,5.961559,-0.000019,-0.000006,1.000000;;, + 4800;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,5.961570,-0.000010,-0.000003,1.000000;;, + 4960;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,5.961570,0.000006,0.000001,1.000000;;; + } + { Bip01_R_Finger02 } + } + + Animation { + + + AnimationKey { + 4; + 62; + 0;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,-1.000000,0.000000,5.961581,-0.000005,-0.000000,1.000000;;, + 80;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,-1.000000,0.000000,5.961575,0.000001,0.000000,1.000000;;, + 160;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,-1.000000,0.000000,5.961576,0.000007,-0.000000,1.000000;;, + 240;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,-1.000000,0.000000,5.961576,0.000002,-0.000002,1.000000;;, + 320;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,-1.000000,0.000000,5.961573,-0.000000,-0.000002,1.000000;;, + 400;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,-1.000000,0.000000,5.961582,-0.000001,-0.000004,1.000000;;, + 480;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,-1.000000,0.000000,5.961582,-0.000001,0.000002,1.000000;;, + 560;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,-1.000000,0.000000,5.961582,-0.000003,-0.000002,1.000000;;, + 640;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,-1.000000,0.000000,5.961580,-0.000005,0.000002,1.000000;;, + 720;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,-1.000000,0.000000,5.961580,0.000001,0.000001,1.000000;;, + 800;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,-1.000000,0.000000,5.961578,0.000001,0.000002,1.000000;;, + 880;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,-1.000000,0.000000,5.961575,0.000007,0.000002,1.000000;;, + 960;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,-1.000000,0.000000,5.961577,0.000006,0.000002,1.000000;;, + 1040;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,-1.000000,0.000000,5.961578,-0.000004,0.000001,1.000000;;, + 1120;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,-1.000000,0.000000,5.961572,0.000001,-0.000000,1.000000;;, + 1200;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,-1.000000,0.000000,5.961593,-0.000010,0.000001,1.000000;;, + 1280;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,-1.000000,0.000000,5.961579,-0.000002,0.000000,1.000000;;, + 1360;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,-1.000000,0.000000,5.961573,0.000011,0.000003,1.000000;;, + 1440;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,-1.000000,0.000000,5.961576,-0.000006,-0.000001,1.000000;;, + 1520;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,-1.000000,0.000000,5.961574,-0.000000,-0.000001,1.000000;;, + 1600;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,-1.000000,0.000000,5.961571,-0.000001,0.000001,1.000000;;, + 1680;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,-1.000000,0.000000,5.961578,0.000010,0.000006,1.000000;;, + 1760;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,-1.000000,0.000000,5.961567,-0.000012,-0.000007,1.000000;;, + 1840;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,-1.000000,0.000000,5.961578,0.000001,0.000001,1.000000;;, + 1920;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,-1.000000,0.000000,5.961568,-0.000001,-0.000003,1.000000;;, + 2000;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,-1.000000,0.000000,5.961567,-0.000005,-0.000003,1.000000;;, + 2080;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,-1.000000,0.000000,5.961581,-0.000001,-0.000001,1.000000;;, + 2160;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,-1.000000,0.000000,5.961565,0.000005,-0.000004,1.000000;;, + 2240;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,-1.000000,0.000000,5.961573,0.000003,-0.000001,1.000000;;, + 2320;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,-1.000000,0.000000,5.961581,-0.000002,0.000000,1.000000;;, + 2400;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,-1.000000,0.000000,5.961590,0.000008,0.000005,1.000000;;, + 2480;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,-1.000000,0.000000,5.961561,-0.000005,-0.000011,1.000000;;, + 2560;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,-1.000000,0.000000,5.961563,-0.000000,-0.000004,1.000000;;, + 2640;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,-1.000000,0.000000,5.961572,0.000001,0.000002,1.000000;;, + 2720;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,-1.000000,0.000000,5.961587,-0.000002,0.000000,1.000000;;, + 2800;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,-1.000000,0.000000,5.961576,-0.000006,-0.000003,1.000000;;, + 2880;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,-1.000000,0.000000,5.961582,-0.000011,0.000001,1.000000;;, + 2960;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,-1.000000,0.000000,5.961596,-0.000020,0.000010,1.000000;;, + 3040;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,-1.000000,0.000000,5.961575,-0.000013,-0.000003,1.000000;;, + 3120;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,-1.000000,0.000000,5.961577,0.000014,0.000005,1.000000;;, + 3200;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,-1.000000,0.000000,5.961589,-0.000028,-0.000002,1.000000;;, + 3280;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,-1.000000,0.000000,5.961583,-0.000012,0.000003,1.000000;;, + 3360;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,-1.000000,0.000000,5.961590,-0.000017,0.000003,1.000000;;, + 3440;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,-1.000000,0.000000,5.961579,0.000012,0.000004,1.000000;;, + 3520;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,-1.000000,0.000000,5.961597,-0.000018,0.000009,1.000000;;, + 3600;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,-1.000000,0.000000,5.961603,-0.000013,0.000008,1.000000;;, + 3680;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,-1.000000,0.000000,5.961560,0.000020,0.000000,1.000000;;, + 3760;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,-1.000000,0.000000,5.961558,-0.000007,-0.000006,1.000000;;, + 3840;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,-1.000000,0.000000,5.961568,0.000012,-0.000001,1.000000;;, + 3920;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,-1.000000,0.000000,5.961574,0.000002,0.000012,1.000000;;, + 4000;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,-1.000000,0.000000,5.961567,-0.000001,0.000005,1.000000;;, + 4080;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,-1.000000,0.000000,5.961557,-0.000003,0.000003,1.000000;;, + 4160;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,-1.000000,0.000000,5.961563,-0.000009,0.000006,1.000000;;, + 4240;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,-1.000000,0.000000,5.961600,-0.000002,0.000010,1.000000;;, + 4320;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,-1.000000,0.000000,5.961576,0.000003,0.000009,1.000000;;, + 4400;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,-1.000000,0.000000,5.961584,0.000005,0.000009,1.000000;;, + 4480;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,-1.000000,0.000000,5.961586,-0.000003,0.000008,1.000000;;, + 4560;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,-1.000000,0.000000,5.961587,0.000002,0.000010,1.000000;;, + 4640;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,-1.000000,0.000000,5.961561,-0.000013,0.000004,1.000000;;, + 4720;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,-1.000000,0.000000,5.961559,-0.000019,0.000011,1.000000;;, + 4800;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,-1.000000,0.000000,5.961568,-0.000011,0.000000,1.000000;;, + 4960;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,-1.000000,0.000000,5.961581,-0.000005,-0.000000,1.000000;;; + } + { Dummy01 } + } + + Animation { + + + AnimationKey { + 4; + 62; + 0;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,0.000796,0.000000,0.000000,-0.000796,1.000000,0.000000,24.087999,0.354686,0.505020,1.000000;;, + 80;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000796,0.000000,0.000000,-0.000796,1.000000,0.000000,24.088005,0.354684,0.505019,1.000000;;, + 160;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000796,0.000000,0.000000,-0.000796,1.000000,0.000000,24.087999,0.354688,0.505024,1.000000;;, + 240;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,0.000796,0.000000,0.000000,-0.000796,1.000000,0.000000,24.088009,0.354687,0.505020,1.000000;;, + 320;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000796,0.000000,0.000000,-0.000796,1.000000,0.000000,24.088003,0.354686,0.505027,1.000000;;, + 400;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000796,0.000000,0.000000,-0.000796,1.000000,0.000000,24.087999,0.354684,0.505021,1.000000;;, + 480;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000796,0.000000,0.000000,-0.000796,1.000000,0.000000,24.088009,0.354687,0.505025,1.000000;;, + 560;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,0.000796,0.000000,-0.000000,-0.000796,1.000000,0.000000,24.088003,0.354688,0.505028,1.000000;;, + 640;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000796,0.000000,0.000000,-0.000796,1.000000,0.000000,24.087997,0.354688,0.505030,1.000000;;, + 720;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000796,0.000000,-0.000000,-0.000796,1.000000,0.000000,24.087994,0.354686,0.505022,1.000000;;, + 800;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000796,0.000000,0.000000,-0.000796,1.000000,0.000000,24.087999,0.354685,0.505018,1.000000;;, + 880;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000796,0.000000,-0.000000,-0.000796,1.000000,0.000000,24.087994,0.354686,0.505031,1.000000;;, + 960;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,0.000796,0.000000,0.000000,-0.000796,1.000000,0.000000,24.088005,0.354684,0.505028,1.000000;;, + 1040;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000796,0.000000,-0.000000,-0.000796,1.000000,0.000000,24.088007,0.354689,0.505018,1.000000;;, + 1120;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,0.000796,0.000000,0.000000,-0.000796,1.000000,0.000000,24.088001,0.354687,0.505025,1.000000;;, + 1200;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,0.000796,0.000000,0.000000,-0.000796,1.000000,0.000000,24.087996,0.354690,0.505031,1.000000;;, + 1280;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000796,0.000000,-0.000000,-0.000796,1.000000,0.000000,24.087994,0.354685,0.505033,1.000000;;, + 1360;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000796,0.000000,-0.000000,-0.000796,1.000000,0.000000,24.088009,0.354686,0.505025,1.000000;;, + 1440;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,0.000796,0.000000,-0.000000,-0.000796,1.000000,0.000000,24.088003,0.354692,0.505019,1.000000;;, + 1520;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000796,0.000000,-0.000000,-0.000796,1.000000,0.000000,24.087997,0.354684,0.505028,1.000000;;, + 1600;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,0.000796,0.000000,-0.000000,-0.000796,1.000000,0.000000,24.088011,0.354688,0.505035,1.000000;;, + 1680;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,0.000796,0.000000,-0.000000,-0.000796,1.000000,0.000000,24.088003,0.354685,0.505040,1.000000;;, + 1760;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,0.000796,0.000000,-0.000000,-0.000796,1.000000,0.000000,24.088001,0.354688,0.505032,1.000000;;, + 1840;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000796,0.000000,0.000000,-0.000796,1.000000,0.000000,24.088013,0.354688,0.505036,1.000000;;, + 1920;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000796,0.000000,0.000000,-0.000796,1.000000,0.000000,24.087994,0.354683,0.505022,1.000000;;, + 2000;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000796,0.000000,-0.000000,-0.000796,1.000000,0.000000,24.088003,0.354689,0.505030,1.000000;;, + 2080;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000796,0.000000,-0.000000,-0.000796,1.000000,0.000000,24.087988,0.354692,0.505028,1.000000;;, + 2160;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,0.000796,0.000000,-0.000000,-0.000796,1.000000,0.000000,24.087992,0.354689,0.505020,1.000000;;, + 2240;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000796,0.000000,-0.000000,-0.000796,1.000000,0.000000,24.088015,0.354682,0.505032,1.000000;;, + 2320;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000796,0.000000,0.000000,-0.000796,1.000000,0.000000,24.087988,0.354681,0.505026,1.000000;;, + 2400;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000796,0.000000,-0.000000,-0.000796,1.000000,0.000000,24.087994,0.354679,0.505042,1.000000;;, + 2480;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,0.000796,0.000000,0.000000,-0.000796,1.000000,0.000000,24.087996,0.354681,0.505034,1.000000;;, + 2560;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000796,0.000000,-0.000000,-0.000796,1.000000,0.000000,24.088009,0.354687,0.505028,1.000000;;, + 2640;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000796,0.000000,0.000000,-0.000796,1.000000,0.000000,24.088013,0.354678,0.505034,1.000000;;, + 2720;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000796,0.000000,-0.000000,-0.000796,1.000000,0.000000,24.088007,0.354680,0.505031,1.000000;;, + 2800;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000796,0.000000,-0.000000,-0.000796,1.000000,0.000000,24.087994,0.354681,0.505026,1.000000;;, + 2880;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000796,0.000000,-0.000000,-0.000796,1.000000,0.000000,24.087967,0.354697,0.505018,1.000000;;, + 2960;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000796,0.000000,0.000000,-0.000796,1.000000,0.000000,24.088001,0.354682,0.505031,1.000000;;, + 3040;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000796,0.000000,0.000000,-0.000796,1.000000,0.000000,24.087996,0.354690,0.505022,1.000000;;, + 3120;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,0.000796,0.000000,0.000000,-0.000796,1.000000,0.000000,24.088024,0.354678,0.505043,1.000000;;, + 3200;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000796,0.000000,0.000000,-0.000796,1.000000,0.000000,24.087999,0.354694,0.505016,1.000000;;, + 3280;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000796,0.000000,0.000000,-0.000796,1.000000,0.000000,24.088015,0.354683,0.505044,1.000000;;, + 3360;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000796,0.000000,0.000000,-0.000796,1.000000,0.000000,24.088017,0.354681,0.505035,1.000000;;, + 3440;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000796,0.000000,0.000000,-0.000796,1.000000,0.000000,24.088024,0.354685,0.505028,1.000000;;, + 3520;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,0.000796,0.000000,0.000000,-0.000796,1.000000,0.000000,24.088020,0.354692,0.505020,1.000000;;, + 3600;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000796,0.000000,-0.000000,-0.000796,1.000000,0.000000,24.087996,0.354696,0.505013,1.000000;;, + 3680;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,0.000796,0.000000,-0.000000,-0.000796,1.000000,0.000000,24.087994,0.354693,0.505020,1.000000;;, + 3760;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000796,0.000000,-0.000000,-0.000796,1.000000,0.000000,24.087996,0.354686,0.505022,1.000000;;, + 3840;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000796,0.000000,-0.000000,-0.000796,1.000000,0.000000,24.088005,0.354690,0.505030,1.000000;;, + 3920;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,0.000796,0.000000,0.000000,-0.000796,1.000000,0.000000,24.088001,0.354686,0.505025,1.000000;;, + 4000;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000796,0.000000,-0.000000,-0.000796,1.000000,0.000000,24.087980,0.354687,0.505010,1.000000;;, + 4080;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000796,0.000000,0.000000,-0.000796,1.000000,0.000000,24.088009,0.354684,0.505041,1.000000;;, + 4160;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000796,0.000000,0.000000,-0.000796,1.000000,0.000000,24.087996,0.354690,0.505006,1.000000;;, + 4240;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000796,0.000000,-0.000000,-0.000796,1.000000,0.000000,24.087988,0.354687,0.505018,1.000000;;, + 4320;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000796,0.000000,0.000000,-0.000796,1.000000,0.000000,24.087992,0.354683,0.505023,1.000000;;, + 4400;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000796,0.000000,-0.000000,-0.000796,1.000000,0.000000,24.087997,0.354690,0.505014,1.000000;;, + 4480;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000796,0.000000,0.000000,-0.000796,1.000000,0.000000,24.088001,0.354687,0.505015,1.000000;;, + 4560;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000796,0.000000,-0.000000,-0.000796,1.000000,0.000000,24.088013,0.354685,0.505053,1.000000;;, + 4640;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000796,0.000000,-0.000000,-0.000796,1.000000,0.000000,24.088007,0.354691,0.505029,1.000000;;, + 4720;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,0.000796,0.000000,0.000000,-0.000796,1.000000,0.000000,24.087994,0.354688,0.505030,1.000000;;, + 4800;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000796,0.000000,0.000000,-0.000796,1.000000,0.000000,24.087997,0.354687,0.504994,1.000000;;, + 4960;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,0.000796,0.000000,0.000000,-0.000796,1.000000,0.000000,24.087999,0.354686,0.505020,1.000000;;; + } + { Bip01_R_Finger1 } + } + + Animation { + + + AnimationKey { + 4; + 62; + 0;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,9.300053,-0.000001,-0.000002,1.000000;;, + 80;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,9.300060,0.000002,-0.000000,1.000000;;, + 160;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,9.300057,-0.000002,-0.000002,1.000000;;, + 240;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,9.300056,0.000004,0.000001,1.000000;;, + 320;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,9.300049,0.000001,-0.000006,1.000000;;, + 400;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,9.300044,0.000001,-0.000001,1.000000;;, + 480;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,9.300066,0.000002,0.000005,1.000000;;, + 560;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,9.300056,0.000002,0.000000,1.000000;;, + 640;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,9.300058,0.000001,0.000002,1.000000;;, + 720;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,9.300049,0.000002,-0.000004,1.000000;;, + 800;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,9.300060,-0.000003,-0.000002,1.000000;;, + 880;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,9.300063,0.000001,-0.000012,1.000000;;, + 960;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,9.300061,-0.000000,-0.000003,1.000000;;, + 1040;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,9.300055,-0.000001,0.000002,1.000000;;, + 1120;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,9.300057,0.000000,0.000003,1.000000;;, + 1200;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,9.300050,0.000003,0.000002,1.000000;;, + 1280;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,9.300063,0.000001,0.000010,1.000000;;, + 1360;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,9.300057,0.000005,-0.000010,1.000000;;, + 1440;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,9.300047,-0.000002,0.000016,1.000000;;, + 1520;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,9.300065,-0.000002,-0.000005,1.000000;;, + 1600;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,9.300051,0.000005,0.000003,1.000000;;, + 1680;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,9.300046,0.000004,-0.000021,1.000000;;, + 1760;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,9.300056,-0.000003,0.000006,1.000000;;, + 1840;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,9.300049,-0.000001,0.000003,1.000000;;, + 1920;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,9.300052,0.000002,-0.000008,1.000000;;, + 2000;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,9.300055,-0.000001,0.000007,1.000000;;, + 2080;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,9.300063,0.000004,0.000005,1.000000;;, + 2160;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,9.300055,-0.000006,0.000004,1.000000;;, + 2240;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,9.300035,-0.000005,-0.000005,1.000000;;, + 2320;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,9.300053,-0.000001,0.000010,1.000000;;, + 2400;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,9.300064,0.000002,0.000004,1.000000;;, + 2480;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,9.300051,-0.000006,0.000011,1.000000;;, + 2560;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,9.300082,-0.000002,-0.000012,1.000000;;, + 2640;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,9.300029,-0.000001,0.000011,1.000000;;, + 2720;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,9.300046,-0.000002,0.000013,1.000000;;, + 2800;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,9.300031,-0.000002,0.000014,1.000000;;, + 2880;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,9.300129,-0.000010,-0.000001,1.000000;;, + 2960;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,9.300054,0.000002,-0.000004,1.000000;;, + 3040;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,9.300058,0.000006,-0.000007,1.000000;;, + 3120;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,9.300048,-0.000009,0.000023,1.000000;;, + 3200;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,9.300021,0.000013,-0.000009,1.000000;;, + 3280;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,9.300056,-0.000000,-0.000001,1.000000;;, + 3360;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,9.300068,0.000002,0.000001,1.000000;;, + 3440;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,9.300078,-0.000014,0.000021,1.000000;;, + 3520;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,9.300060,-0.000001,-0.000000,1.000000;;, + 3600;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,9.300076,-0.000000,0.000011,1.000000;;, + 3680;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,9.300021,0.000012,-0.000014,1.000000;;, + 3760;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,9.300063,0.000003,-0.000001,1.000000;;, + 3840;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,9.300073,-0.000002,0.000013,1.000000;;, + 3920;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,9.300053,0.000004,-0.000008,1.000000;;, + 4000;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,9.300080,-0.000001,0.000014,1.000000;;, + 4080;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,9.300086,-0.000009,0.000042,1.000000;;, + 4160;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,9.300044,0.000002,-0.000028,1.000000;;, + 4240;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,9.300059,-0.000001,-0.000010,1.000000;;, + 4320;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,9.300069,-0.000008,0.000042,1.000000;;, + 4400;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,9.300056,-0.000006,0.000022,1.000000;;, + 4480;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,9.300056,0.000002,-0.000013,1.000000;;, + 4560;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,9.300052,-0.000000,-0.000015,1.000000;;, + 4640;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,9.300047,-0.000003,-0.000012,1.000000;;, + 4720;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,9.300055,-0.000005,0.000008,1.000000;;, + 4800;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,9.300055,-0.000003,-0.000036,1.000000;;, + 4960;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,9.300053,-0.000001,-0.000002,1.000000;;; + } + { Bip01_R_Finger11 } + } + + Animation { + + + AnimationKey { + 4; + 62; + 0;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,10.850059,0.000001,-0.000003,1.000000;;, + 80;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,10.850061,-0.000004,0.000004,1.000000;;, + 160;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,10.850073,0.000004,0.000004,1.000000;;, + 240;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,10.850068,-0.000001,0.000002,1.000000;;, + 320;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,10.850068,0.000000,0.000004,1.000000;;, + 400;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,10.850073,0.000004,0.000001,1.000000;;, + 480;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,10.850047,-0.000004,-0.000011,1.000000;;, + 560;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,10.850059,-0.000003,0.000004,1.000000;;, + 640;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,10.850069,0.000001,0.000000,1.000000;;, + 720;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,10.850069,-0.000003,-0.000000,1.000000;;, + 800;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,10.850062,0.000003,-0.000000,1.000000;;, + 880;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,10.850066,-0.000001,0.000004,1.000000;;, + 960;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,10.850061,-0.000002,-0.000004,1.000000;;, + 1040;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,10.850067,0.000000,0.000001,1.000000;;, + 1120;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,10.850071,0.000001,0.000002,1.000000;;, + 1200;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,10.850074,-0.000001,0.000011,1.000000;;, + 1280;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,10.850064,0.000000,-0.000003,1.000000;;, + 1360;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,10.850067,-0.000003,0.000001,1.000000;;, + 1440;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,10.850084,0.000001,-0.000006,1.000000;;, + 1520;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,10.850065,0.000003,0.000004,1.000000;;, + 1600;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,10.850064,-0.000001,-0.000003,1.000000;;, + 1680;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,10.850087,-0.000010,0.000038,1.000000;;, + 1760;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,10.850060,-0.000001,0.000010,1.000000;;, + 1840;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,10.850059,0.000010,-0.000017,1.000000;;, + 1920;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,10.850066,0.000002,0.000002,1.000000;;, + 2000;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,10.850079,-0.000004,0.000000,1.000000;;, + 2080;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,10.850064,-0.000008,0.000001,1.000000;;, + 2160;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,10.850057,0.000004,-0.000001,1.000000;;, + 2240;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,10.850079,0.000004,0.000005,1.000000;;, + 2320;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,10.850055,0.000003,-0.000010,1.000000;;, + 2400;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,10.850050,0.000010,-0.000009,1.000000;;, + 2480;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,10.850052,0.000010,-0.000012,1.000000;;, + 2560;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,10.850057,-0.000001,0.000003,1.000000;;, + 2640;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,10.850087,0.000005,-0.000009,1.000000;;, + 2720;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,10.850062,0.000001,-0.000002,1.000000;;, + 2800;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,10.850121,-0.000019,-0.000002,1.000000;;, + 2880;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,10.849994,0.000003,0.000005,1.000000;;, + 2960;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,10.850060,0.000000,0.000005,1.000000;;, + 3040;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,10.850060,-0.000005,0.000007,1.000000;;, + 3120;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,10.850054,0.000008,-0.000009,1.000000;;, + 3200;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,10.850092,-0.000008,0.000003,1.000000;;, + 3280;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,10.850080,-0.000001,0.000001,1.000000;;, + 3360;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,10.850073,0.000003,-0.000010,1.000000;;, + 3440;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,10.850039,0.000007,-0.000015,1.000000;;, + 3520;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,10.850013,0.000004,-0.000013,1.000000;;, + 3600;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,10.850048,-0.000008,0.000004,1.000000;;, + 3680;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,10.850091,-0.000011,0.000002,1.000000;;, + 3760;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,10.850017,0.000005,-0.000012,1.000000;;, + 3840;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,10.850051,-0.000000,-0.000004,1.000000;;, + 3920;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,10.850064,-0.000007,-0.000001,1.000000;;, + 4000;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,10.850058,-0.000002,-0.000005,1.000000;;, + 4080;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,10.850063,0.000002,-0.000028,1.000000;;, + 4160;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,10.850079,0.000001,0.000024,1.000000;;, + 4240;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,10.850040,0.000002,-0.000030,1.000000;;, + 4320;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,10.850048,0.000017,-0.000079,1.000000;;, + 4400;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,10.850065,0.000008,-0.000017,1.000000;;, + 4480;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,10.850068,0.000002,0.000024,1.000000;;, + 4560;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,10.850074,-0.000003,0.000020,1.000000;;, + 4640;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,10.850078,-0.000001,0.000023,1.000000;;, + 4720;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,10.850074,-0.000001,0.000017,1.000000;;, + 4800;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,10.850063,0.000009,0.000012,1.000000;;, + 4960;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,10.850059,0.000001,-0.000003,1.000000;;; + } + { Bip01_R_Finger12 } + } + + Animation { + + + AnimationKey { + 4; + 62; + 0;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,-1.000000,0.000000,11.207767,0.000001,-0.000003,1.000000;;, + 80;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,-1.000000,0.000000,11.207771,0.000001,-0.000006,1.000000;;, + 160;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,-1.000000,0.000000,11.207757,-0.000001,-0.000003,1.000000;;, + 240;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,-1.000000,0.000000,11.207756,-0.000003,-0.000002,1.000000;;, + 320;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,-1.000000,0.000000,11.207762,0.000000,-0.000007,1.000000;;, + 400;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,-1.000000,0.000000,11.207765,-0.000001,0.000005,1.000000;;, + 480;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,-1.000000,0.000000,11.207770,0.000001,0.000002,1.000000;;, + 560;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,-1.000000,0.000000,11.207768,0.000000,-0.000007,1.000000;;, + 640;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,-1.000000,0.000000,11.207765,0.000001,0.000000,1.000000;;, + 720;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,-1.000000,0.000000,11.207763,0.000001,0.000001,1.000000;;, + 800;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,-1.000000,0.000000,11.207768,-0.000003,0.000004,1.000000;;, + 880;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,-1.000000,0.000000,11.207760,-0.000002,-0.000001,1.000000;;, + 960;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,-1.000000,0.000000,11.207767,0.000003,0.000003,1.000000;;, + 1040;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,-1.000000,0.000000,11.207764,0.000003,0.000001,1.000000;;, + 1120;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,-1.000000,0.000000,11.207767,0.000001,-0.000007,1.000000;;, + 1200;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,-1.000000,0.000000,11.207765,-0.000001,-0.000018,1.000000;;, + 1280;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,-1.000000,0.000000,11.207752,0.000002,-0.000019,1.000000;;, + 1360;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,-1.000000,0.000000,11.207767,0.000003,-0.000009,1.000000;;, + 1440;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,-1.000000,0.000000,11.207752,0.000006,-0.000018,1.000000;;, + 1520;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,-1.000000,0.000000,11.207759,0.000003,-0.000014,1.000000;;, + 1600;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,-1.000000,0.000000,11.207762,0.000001,-0.000006,1.000000;;, + 1680;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,-1.000000,0.000000,11.207762,0.000009,-0.000012,1.000000;;, + 1760;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,-1.000000,0.000000,11.207764,0.000005,-0.000008,1.000000;;, + 1840;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,-1.000000,0.000000,11.207767,-0.000012,0.000006,1.000000;;, + 1920;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,-1.000000,0.000000,11.207767,-0.000005,0.000009,1.000000;;, + 2000;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,-1.000000,0.000000,11.207761,0.000007,-0.000007,1.000000;;, + 2080;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,-1.000000,0.000000,11.207759,0.000001,0.000001,1.000000;;, + 2160;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,-1.000000,0.000000,11.207764,-0.000011,-0.000003,1.000000;;, + 2240;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,-1.000000,0.000000,11.207760,-0.000006,0.000002,1.000000;;, + 2320;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,-1.000000,0.000000,11.207768,0.000004,-0.000001,1.000000;;, + 2400;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,-1.000000,0.000000,11.207767,-0.000001,0.000005,1.000000;;, + 2480;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,-1.000000,0.000000,11.207771,-0.000007,0.000007,1.000000;;, + 2560;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,-1.000000,0.000000,11.207754,-0.000008,0.000019,1.000000;;, + 2640;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,-1.000000,0.000000,11.207768,-0.000000,-0.000003,1.000000;;, + 2720;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,-1.000000,0.000000,11.207767,0.000001,-0.000006,1.000000;;, + 2800;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,-1.000000,0.000000,11.207760,0.000006,-0.000012,1.000000;;, + 2880;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,-1.000000,0.000000,11.207788,-0.000004,0.000004,1.000000;;, + 2960;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,-1.000000,0.000000,11.207781,-0.000001,-0.000003,1.000000;;, + 3040;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,-1.000000,0.000000,11.207762,0.000004,0.000001,1.000000;;, + 3120;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,-1.000000,0.000000,11.207790,0.000001,-0.000008,1.000000;;, + 3200;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,-1.000000,0.000000,11.207770,-0.000011,0.000011,1.000000;;, + 3280;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,-1.000000,0.000000,11.207776,-0.000010,0.000005,1.000000;;, + 3360;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,-1.000000,0.000000,11.207766,-0.000003,0.000010,1.000000;;, + 3440;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,-1.000000,0.000000,11.207795,-0.000000,-0.000005,1.000000;;, + 3520;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,-1.000000,0.000000,11.207788,-0.000011,0.000012,1.000000;;, + 3600;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,-1.000000,0.000000,11.207775,0.000002,-0.000003,1.000000;;, + 3680;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,-1.000000,0.000000,11.207780,-0.000013,0.000009,1.000000;;, + 3760;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,-1.000000,0.000000,11.207794,-0.000012,0.000004,1.000000;;, + 3840;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,-1.000000,0.000000,11.207778,-0.000008,-0.000001,1.000000;;, + 3920;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,-1.000000,0.000000,11.207764,-0.000002,0.000000,1.000000;;, + 4000;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,-1.000000,0.000000,11.207761,-0.000006,0.000001,1.000000;;, + 4080;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,-1.000000,0.000000,11.207756,-0.000004,0.000003,1.000000;;, + 4160;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,-1.000000,0.000000,11.207771,0.000003,0.000013,1.000000;;, + 4240;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,-1.000000,0.000000,11.207773,0.000003,0.000022,1.000000;;, + 4320;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,-1.000000,0.000000,11.207767,-0.000001,0.000026,1.000000;;, + 4400;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,-1.000000,0.000000,11.207769,-0.000001,0.000002,1.000000;;, + 4480;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,-1.000000,0.000000,11.207768,-0.000001,0.000013,1.000000;;, + 4560;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,-1.000000,0.000000,11.207754,-0.000001,-0.000008,1.000000;;, + 4640;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,-1.000000,0.000000,11.207759,-0.000003,0.000012,1.000000;;, + 4720;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,-1.000000,0.000000,11.207764,0.000004,-0.000020,1.000000;;, + 4800;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,-1.000000,0.000000,11.207763,0.000001,-0.000002,1.000000;;, + 4960;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,-1.000000,0.000000,11.207767,0.000001,-0.000003,1.000000;;; + } + { Dummy02 } + } + + Animation { + + + AnimationKey { + 4; + 62; + 0;16;-0.928221,-0.372022,0.002089,0.000000,-0.371612,0.927434,0.042085,0.000000,-0.017595,0.038288,-0.999112,0.000000,-27.673786,-14.652106,27.738972,1.000000;;, + 80;16;-0.911893,-0.410423,0.001942,0.000000,-0.410014,0.911176,0.040585,0.000000,-0.018426,0.036213,-0.999174,0.000000,-27.803984,-14.906741,27.552347,1.000000;;, + 160;16;-0.894068,-0.447927,0.002030,0.000000,-0.447515,0.893423,0.039060,0.000000,-0.019310,0.034014,-0.999235,0.000000,-27.937048,-15.168123,27.357708,1.000000;;, + 240;16;-0.876729,-0.480982,0.001449,0.000000,-0.480732,0.876364,0.029699,0.000000,-0.015554,0.025342,-0.999558,0.000000,-28.077749,-15.463904,27.139896,1.000000;;, + 320;16;-0.858316,-0.513121,0.000186,0.000000,-0.513017,0.858149,0.019868,0.000000,-0.010355,0.016958,-0.999803,0.000000,-28.222052,-15.746859,26.922985,1.000000;;, + 400;16;-0.844044,-0.536271,-0.001682,0.000000,-0.536212,0.843896,0.017797,0.000000,-0.008125,0.015924,-0.999840,0.000000,-28.368185,-15.989561,26.722809,1.000000;;, + 480;16;-0.829903,-0.557881,-0.005424,0.000000,-0.557898,0.829793,0.013899,0.000000,-0.003253,0.014560,-0.999889,0.000000,-28.514095,-16.165241,26.556234,1.000000;;, + 560;16;-0.824385,-0.566006,-0.005093,0.000000,-0.565667,0.823504,0.043151,0.000000,-0.020230,0.038454,-0.999056,0.000000,-28.656796,-16.251249,26.439451,1.000000;;, + 640;16;-0.821005,-0.570894,-0.005540,0.000000,-0.569853,0.818838,0.069083,0.000000,-0.034903,0.059874,-0.997595,0.000000,-28.797022,-16.210737,26.392929,1.000000;;, + 720;16;-0.823503,-0.567299,-0.003918,0.000000,-0.564112,0.818106,0.111716,0.000000,-0.060171,0.094209,-0.993732,0.000000,-28.936790,-15.984868,26.446907,1.000000;;, + 800;16;-0.830397,-0.557166,-0.002518,0.000000,-0.551123,0.820709,0.150666,0.000000,-0.081880,0.126500,-0.988582,0.000000,-29.068157,-15.612783,26.578825,1.000000;;, + 880;16;-0.837220,-0.546855,-0.003339,0.000000,-0.539885,0.825545,0.164316,0.000000,-0.087101,0.139372,-0.986402,0.000000,-29.186691,-15.091745,26.783831,1.000000;;, + 960;16;-0.851299,-0.524663,-0.004269,0.000000,-0.517113,0.837616,0.176049,0.000000,-0.088790,0.152078,-0.984372,0.000000,-29.284082,-14.482901,27.028332,1.000000;;, + 1040;16;-0.881730,-0.471150,0.023876,0.000000,-0.460801,0.870997,0.170374,0.000000,-0.101067,0.139222,-0.985090,0.000000,-29.349228,-13.847182,27.284319,1.000000;;, + 1120;16;-0.924826,-0.375312,0.061950,0.000000,-0.359915,0.916074,0.176831,0.000000,-0.123117,0.141241,-0.982290,0.000000,-29.390091,-13.188616,27.543690,1.000000;;, + 1200;16;-0.953882,-0.285967,0.091281,0.000000,-0.264746,0.944765,0.193205,0.000000,-0.141489,0.160129,-0.976903,0.000000,-29.408573,-12.541369,27.790316,1.000000;;, + 1280;16;-0.973788,-0.194748,0.117513,0.000000,-0.166942,0.962843,0.212280,0.000000,-0.154488,0.187098,-0.970117,0.000000,-29.412472,-11.880296,28.029623,1.000000;;, + 1360;16;-0.984386,-0.107567,0.139334,0.000000,-0.074127,0.971274,0.226124,0.000000,-0.159654,0.212265,-0.964082,0.000000,-29.409801,-11.187845,28.261599,1.000000;;, + 1440;16;-0.987640,-0.032138,0.153410,0.000000,0.005524,0.971008,0.238984,0.000000,-0.156642,0.236878,-0.958828,0.000000,-29.400465,-10.475192,28.482176,1.000000;;, + 1520;16;-0.987774,0.018235,0.154822,0.000000,0.057435,0.965843,0.252683,0.000000,-0.144926,0.258485,-0.955082,0.000000,-29.386217,-9.746704,28.688866,1.000000;;, + 1600;16;-0.987223,0.055913,0.149211,0.000000,0.094826,0.958698,0.268152,0.000000,-0.128055,0.278875,-0.951751,0.000000,-29.368801,-9.006860,28.879656,1.000000;;, + 1680;16;-0.986282,0.088304,0.139466,0.000000,0.125685,0.949444,0.287680,0.000000,-0.107012,0.301263,-0.947517,0.000000,-29.349707,-8.260389,29.053083,1.000000;;, + 1760;16;-0.984677,0.118243,0.128176,0.000000,0.152614,0.939945,0.305308,0.000000,-0.084378,0.320191,-0.943588,0.000000,-29.330469,-7.512198,29.208227,1.000000;;, + 1840;16;-0.981517,0.150351,0.118402,0.000000,0.180808,0.931279,0.316272,0.000000,-0.062714,0.331834,-0.941251,0.000000,-29.312498,-6.767277,29.344717,1.000000;;, + 1920;16;-0.976290,0.186521,0.109854,0.000000,0.212371,0.923573,0.319234,0.000000,-0.041914,0.334995,-0.941287,0.000000,-29.296946,-6.030762,29.462757,1.000000;;, + 2000;16;-0.967245,0.231887,0.103275,0.000000,0.252812,0.916654,0.309568,0.000000,-0.022883,0.325537,-0.945252,0.000000,-29.285093,-5.307709,29.563105,1.000000;;, + 2080;16;-0.954827,0.281060,0.096486,0.000000,0.297109,0.908985,0.292358,0.000000,-0.005534,0.307818,-0.951429,0.000000,-29.278000,-4.603338,29.647009,1.000000;;, + 2160;16;-0.939254,0.331755,0.087974,0.000000,0.343063,0.899678,0.269978,0.000000,0.010418,0.283758,-0.958839,0.000000,-29.269199,-3.928405,29.714540,1.000000;;, + 2240;16;-0.921715,0.379808,0.078662,0.000000,0.387158,0.888636,0.245836,0.000000,0.023468,0.257045,-0.966114,0.000000,-29.282276,-3.270983,29.772947,1.000000;;, + 2320;16;-0.904576,0.420547,0.069868,0.000000,0.425042,0.877045,0.223901,0.000000,0.032884,0.232233,-0.972104,0.000000,-29.346003,-2.617593,29.828417,1.000000;;, + 2400;16;-0.888278,0.455005,0.062707,0.000000,0.457681,0.865378,0.204078,0.000000,0.038591,0.209978,-0.976944,0.000000,-29.436523,-1.981518,29.881910,1.000000;;, + 2480;16;-0.871675,0.486327,0.060564,0.000000,0.488470,0.852122,0.187846,0.000000,0.039746,0.193324,-0.980329,0.000000,-29.557138,-1.359871,29.937998,1.000000;;, + 2560;16;-0.861675,0.504099,0.058305,0.000000,0.505993,0.844767,0.174182,0.000000,0.038550,0.179590,-0.982986,0.000000,-29.655882,-0.786586,29.994652,1.000000;;, + 2640;16;-0.850559,0.522404,0.060360,0.000000,0.524798,0.835842,0.161105,0.000000,0.033710,0.168706,-0.985090,0.000000,-29.685301,-0.287678,30.054073,1.000000;;, + 2720;16;-0.839227,0.540056,0.063543,0.000000,0.543025,0.826154,0.150310,0.000000,0.028680,0.160649,-0.986595,0.000000,-29.639238,0.112493,30.116144,1.000000;;, + 2800;16;-0.831739,0.550993,0.067944,0.000000,0.554706,0.819822,0.142099,0.000000,0.022593,0.155878,-0.987518,0.000000,-29.481970,0.381362,30.180090,1.000000;;, + 2880;16;-0.824607,0.560841,0.074037,0.000000,0.565469,0.813379,0.136600,0.000000,0.016391,0.154507,-0.987856,0.000000,-29.257454,0.515694,30.246803,1.000000;;, + 2960;16;-0.823079,0.564125,0.065599,0.000000,0.567362,0.811610,0.139247,0.000000,0.025312,0.151829,-0.988082,0.000000,-28.989264,0.492861,30.314617,1.000000;;, + 3040;16;-0.821983,0.566438,0.059090,0.000000,0.568494,0.809885,0.144570,0.000000,0.034034,0.152426,-0.987728,0.000000,-28.700897,0.341238,30.383587,1.000000;;, + 3120;16;-0.826104,0.559909,0.063667,0.000000,0.562920,0.814747,0.138952,0.000000,0.025928,0.150629,-0.988250,0.000000,-28.413420,0.076273,30.454477,1.000000;;, + 3200;16;-0.836777,0.543459,0.066758,0.000000,0.547203,0.825715,0.136979,0.000000,0.019320,0.151151,-0.988322,0.000000,-28.155458,-0.285411,30.520918,1.000000;;, + 3280;16;-0.851590,0.520256,0.064253,0.000000,0.524081,0.842254,0.126286,0.000000,0.011583,0.141218,-0.989911,0.000000,-27.962389,-0.726958,30.578775,1.000000;;, + 3360;16;-0.869128,0.490799,0.061101,0.000000,0.494557,0.861031,0.118490,0.000000,0.005545,0.133201,-0.991073,0.000000,-27.836496,-1.234247,30.624882,1.000000;;, + 3440;16;-0.887892,0.456440,0.057541,0.000000,0.460052,0.880657,0.113116,0.000000,0.000957,0.126907,-0.991914,0.000000,-27.802397,-1.789792,30.654890,1.000000;;, + 3520;16;-0.907077,0.417519,0.053751,0.000000,0.420957,0.900416,0.109757,0.000000,-0.002573,0.122185,-0.992504,0.000000,-27.830305,-2.386317,30.668243,1.000000;;, + 3600;16;-0.925802,0.374125,0.054043,0.000000,0.377976,0.918066,0.119538,0.000000,-0.004893,0.131095,-0.991358,0.000000,-27.902847,-3.010064,30.663122,1.000000;;, + 3680;16;-0.943410,0.327208,0.053964,0.000000,0.331539,0.934358,0.130601,0.000000,-0.007688,0.141101,-0.989965,0.000000,-28.007349,-3.661772,30.639570,1.000000;;, + 3760;16;-0.959327,0.277680,0.050859,0.000000,0.282077,0.950027,0.133722,0.000000,-0.011186,0.142630,-0.989713,0.000000,-28.129053,-4.338365,30.598248,1.000000;;, + 3840;16;-0.973079,0.225510,0.047554,0.000000,0.229995,0.963420,0.137565,0.000000,-0.014792,0.144799,-0.989350,0.000000,-28.256105,-5.037010,30.537418,1.000000;;, + 3920;16;-0.984303,0.172439,0.037585,0.000000,0.175741,0.977218,0.118996,0.000000,-0.016209,0.123734,-0.992183,0.000000,-28.375837,-5.754852,30.456379,1.000000;;, + 4000;16;-0.992648,0.117681,0.028285,0.000000,0.119956,0.987680,0.100497,0.000000,-0.016110,0.103151,-0.994535,0.000000,-28.475786,-6.488847,30.354843,1.000000;;, + 4080;16;-0.997899,0.061722,0.019677,0.000000,0.063128,0.994679,0.081416,0.000000,-0.014548,0.082487,-0.996486,0.000000,-28.540384,-7.235955,30.232977,1.000000;;, + 4160;16;-0.999906,0.006143,0.012246,0.000000,0.006892,0.998048,0.062063,0.000000,-0.011841,0.062142,-0.997997,0.000000,-28.565617,-7.992917,30.090918,1.000000;;, + 4240;16;-0.998890,-0.045932,0.010470,0.000000,-0.045145,0.996802,0.065936,0.000000,-0.013465,0.065390,-0.997769,0.000000,-28.537481,-8.756502,29.929228,1.000000;;, + 4320;16;-0.995413,-0.095229,0.009188,0.000000,-0.094366,0.993104,0.069573,0.000000,-0.015750,0.068387,-0.997534,0.000000,-28.470556,-9.522673,29.747852,1.000000;;, + 4400;16;-0.991651,-0.128660,0.008704,0.000000,-0.127798,0.989535,0.066988,0.000000,-0.017232,0.065316,-0.997716,0.000000,-28.371780,-10.287396,29.547218,1.000000;;, + 4480;16;-0.986949,-0.160784,0.008958,0.000000,-0.159894,0.985052,0.064088,0.000000,-0.019128,0.061819,-0.997904,0.000000,-28.251011,-11.046824,29.328005,1.000000;;, + 4560;16;-0.980691,-0.195325,0.009659,0.000000,-0.194402,0.979051,0.060564,0.000000,-0.021286,0.057517,-0.998118,0.000000,-28.117359,-11.797178,29.091358,1.000000;;, + 4640;16;-0.971493,-0.236834,0.010537,0.000000,-0.235888,0.970131,0.056592,0.000000,-0.023625,0.052493,-0.998342,0.000000,-27.979946,-12.534884,28.838869,1.000000;;, + 4720;16;-0.965536,-0.259803,0.015587,0.000000,-0.258707,0.964567,0.051776,0.000000,-0.028486,0.045959,-0.998537,0.000000,-27.853834,-13.252464,28.574549,1.000000;;, + 4800;16;-0.959397,-0.281208,0.021883,0.000000,-0.279994,0.958874,0.046525,0.000000,-0.034066,0.038509,-0.998677,0.000000,-27.730272,-13.958670,28.295168,1.000000;;, + 4960;16;-0.928221,-0.372022,0.002089,0.000000,-0.371612,0.927434,0.042085,0.000000,-0.017595,0.038288,-0.999112,0.000000,-27.673786,-14.652106,27.738972,1.000000;;; + } + { Bip01_L_Thigh } + } + + Animation { + + + AnimationKey { + 4; + 62; + 0;16;0.942163,-0.335154,0.000000,0.000000,0.335154,0.942163,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,119.231491,0.000003,-0.000001,1.000000;;, + 80;16;0.946470,-0.322791,0.000000,0.000000,0.322791,0.946470,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,119.231499,0.000009,-0.000001,1.000000;;, + 160;16;0.950613,-0.310379,0.000000,0.000000,0.310379,0.950613,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,119.231491,0.000003,-0.000001,1.000000;;, + 240;16;0.952025,-0.306021,-0.000000,0.000000,0.306021,0.952025,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,119.231506,0.000002,-0.000002,1.000000;;, + 320;16;0.953424,-0.301634,-0.000000,0.000000,0.301634,0.953424,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,119.231491,-0.000004,0.000001,1.000000;;, + 400;16;0.949301,-0.314369,0.000000,0.000000,0.314369,0.949301,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,119.231499,-0.000008,-0.000000,1.000000;;, + 480;16;0.944996,-0.327081,0.000000,0.000000,0.327081,0.944996,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,119.231499,-0.000004,-0.000001,1.000000;;, + 560;16;0.930883,-0.365318,-0.000000,0.000000,0.365318,0.930883,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,119.231499,-0.000003,0.000003,1.000000;;, + 640;16;0.915212,-0.402971,0.000000,0.000000,0.402971,0.915212,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,119.231499,-0.000010,-0.000001,1.000000;;, + 720;16;0.894055,-0.447956,0.000000,0.000000,0.447956,0.894055,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,119.231522,0.000003,-0.000001,1.000000;;, + 800;16;0.870688,-0.491835,-0.000000,0.000000,0.491835,0.870688,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,119.231522,-0.000005,0.000002,1.000000;;, + 880;16;0.855169,-0.518349,-0.000000,0.000000,0.518349,0.855169,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,119.231506,-0.000015,-0.000003,1.000000;;, + 960;16;0.838845,-0.544371,-0.000000,0.000000,0.544371,0.838845,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,119.231514,-0.000029,-0.000002,1.000000;;, + 1040;16;0.805776,-0.592221,-0.000000,0.000000,0.592221,0.805776,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,119.231499,-0.000011,-0.000003,1.000000;;, + 1120;16;0.739182,-0.673506,0.000000,0.000000,0.673506,0.739182,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,119.231499,-0.000016,-0.000002,1.000000;;, + 1200;16;0.662180,-0.749345,-0.000000,0.000000,0.749345,0.662180,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,119.231506,-0.000011,-0.000002,1.000000;;, + 1280;16;0.580639,-0.814161,0.000000,0.000000,0.814161,0.580639,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,119.231499,-0.000018,-0.000005,1.000000;;, + 1360;16;0.512479,-0.858699,0.000000,0.000000,0.858699,0.512479,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,119.231483,-0.000010,-0.000001,1.000000;;, + 1440;16;0.468474,-0.883477,0.000000,0.000000,0.883477,0.468474,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,119.231483,-0.000011,-0.000002,1.000000;;, + 1520;16;0.470332,-0.882490,-0.000000,0.000000,0.882490,0.470332,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,119.231499,-0.000007,-0.000001,1.000000;;, + 1600;16;0.499227,-0.866471,0.000000,0.000000,0.866471,0.499227,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,119.231506,0.000019,0.000001,1.000000;;, + 1680;16;0.544114,-0.839011,0.000000,0.000000,0.839011,0.544114,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,119.231483,-0.000001,-0.000007,1.000000;;, + 1760;16;0.595785,-0.803144,0.000000,0.000000,0.803144,0.595785,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,119.231499,-0.000007,0.000001,1.000000;;, + 1840;16;0.642066,-0.766650,0.000000,0.000000,0.766650,0.642066,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,119.231491,0.000007,0.000005,1.000000;;, + 1920;16;0.685771,-0.727817,0.000000,0.000000,0.727817,0.685771,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,119.231499,0.000002,-0.000004,1.000000;;, + 2000;16;0.725507,-0.688215,-0.000000,0.000000,0.688215,0.725507,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,119.231514,0.000007,0.000003,1.000000;;, + 2080;16;0.762653,-0.646808,-0.000000,0.000000,0.646808,0.762653,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,119.231522,0.000012,0.000005,1.000000;;, + 2160;16;0.800105,-0.599860,0.000000,0.000000,0.599860,0.800105,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,119.231491,-0.000002,-0.000001,1.000000;;, + 2240;16;0.831071,-0.556167,-0.000000,0.000000,0.556167,0.831071,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,119.231506,-0.000007,0.000002,1.000000;;, + 2320;16;0.851740,-0.523965,-0.000000,0.000000,0.523965,0.851740,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,119.231499,0.000009,0.000002,1.000000;;, + 2400;16;0.862764,-0.505606,0.000000,0.000000,0.505606,0.862764,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,119.231514,0.000021,0.000003,1.000000;;, + 2480;16;0.858597,-0.512651,0.000000,0.000000,0.512651,0.858597,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,119.231506,-0.000001,0.000002,1.000000;;, + 2560;16;0.851861,-0.523767,-0.000000,0.000000,0.523767,0.851861,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,119.231514,-0.000004,0.000000,1.000000;;, + 2640;16;0.834410,-0.551144,0.000000,0.000000,0.551144,0.834410,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,119.231491,0.000018,0.000002,1.000000;;, + 2720;16;0.816079,-0.577940,-0.000000,0.000000,0.577940,0.816079,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,119.231506,0.000016,-0.000001,1.000000;;, + 2800;16;0.795822,-0.605531,0.000000,0.000000,0.605531,0.795822,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,119.231499,0.000002,0.000004,1.000000;;, + 2880;16;0.774632,-0.632412,-0.000000,0.000000,0.632413,0.774632,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,119.231514,-0.000004,-0.000000,1.000000;;, + 2960;16;0.794443,-0.607340,-0.000000,0.000000,0.607339,0.794442,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,119.231514,-0.000008,0.000003,1.000000;;, + 3040;16;0.813442,-0.581647,-0.000000,0.000000,0.581647,0.813442,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,119.231529,0.000008,-0.000002,1.000000;;, + 3120;16;0.778247,-0.627958,0.000000,0.000000,0.627958,0.778247,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,119.231506,0.000010,-0.000002,1.000000;;, + 3200;16;0.754281,-0.656552,-0.000000,0.000000,0.656552,0.754281,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,119.231537,0.000012,0.000006,1.000000;;, + 3280;16;0.743273,-0.668988,-0.000000,0.000000,0.668988,0.743273,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,119.231522,0.000008,0.000001,1.000000;;, + 3360;16;0.740677,-0.671861,0.000000,0.000000,0.671862,0.740677,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,119.231514,0.000010,0.000003,1.000000;;, + 3440;16;0.745040,-0.667020,0.000000,0.000000,0.667020,0.745040,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,119.231514,-0.000006,-0.000000,1.000000;;, + 3520;16;0.755634,-0.654994,0.000000,0.000000,0.654994,0.755634,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,119.231529,0.000022,0.000002,1.000000;;, + 3600;16;0.767893,-0.640578,-0.000000,0.000000,0.640578,0.767893,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,119.231529,-0.000014,-0.000002,1.000000;;, + 3680;16;0.784524,-0.620099,-0.000000,0.000000,0.620099,0.784524,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,119.231529,0.000019,0.000003,1.000000;;, + 3760;16;0.802723,-0.596352,0.000000,0.000000,0.596352,0.802724,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,119.231522,0.000000,-0.000002,1.000000;;, + 3840;16;0.823599,-0.567172,0.000000,0.000000,0.567172,0.823599,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,119.231514,-0.000001,0.000000,1.000000;;, + 3920;16;0.847102,-0.531430,-0.000000,0.000000,0.531430,0.847102,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,119.231529,0.000020,-0.000001,1.000000;;, + 4000;16;0.871324,-0.490708,0.000000,0.000000,0.490708,0.871324,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,119.231499,-0.000010,-0.000002,1.000000;;, + 4080;16;0.895648,-0.444764,-0.000000,0.000000,0.444764,0.895648,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,119.231522,0.000034,-0.000001,1.000000;;, + 4160;16;0.918115,-0.396313,-0.000000,0.000000,0.396313,0.918115,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,119.231506,-0.000014,0.000001,1.000000;;, + 4240;16;0.935408,-0.353571,0.000000,0.000000,0.353571,0.935408,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,119.231514,-0.000005,0.000003,1.000000;;, + 4320;16;0.949647,-0.313321,0.000000,0.000000,0.313321,0.949647,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,119.231506,-0.000011,-0.000001,1.000000;;, + 4400;16;0.953711,-0.300723,0.000000,0.000000,0.300723,0.953711,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,119.231483,-0.000000,0.000001,1.000000;;, + 4480;16;0.957058,-0.289897,0.000000,0.000000,0.289897,0.957058,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,119.231499,-0.000009,-0.000003,1.000000;;, + 4560;16;0.961769,-0.273862,0.000000,0.000000,0.273862,0.961769,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,119.231483,-0.000011,-0.000001,1.000000;;, + 4640;16;0.969896,-0.243518,0.000000,0.000000,0.243518,0.969896,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,119.231491,0.000011,-0.000001,1.000000;;, + 4720;16;0.944640,-0.328109,0.000000,0.000000,0.328109,0.944640,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,119.231514,0.000017,0.000000,1.000000;;, + 4800;16;0.912034,-0.410114,-0.000000,0.000000,0.410114,0.912034,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,119.231491,-0.000008,-0.000001,1.000000;;, + 4960;16;0.942163,-0.335154,0.000000,0.000000,0.335154,0.942163,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,119.231491,0.000003,-0.000001,1.000000;;; + } + { Bip01_L_Calf } + } + + Animation { + + + AnimationKey { + 4; + 62; + 0;16;0.819935,0.566355,0.083354,0.000000,-0.566770,0.823611,-0.020897,0.000000,-0.080486,-0.030108,0.996301,0.000000,119.231514,0.000010,0.000002,1.000000;;, + 80;16;0.819133,0.567125,0.085960,0.000000,-0.567930,0.822898,-0.017163,0.000000,-0.080470,-0.034761,0.996151,0.000000,119.231506,-0.000013,-0.000002,1.000000;;, + 160;16;0.820633,0.564575,0.088416,0.000000,-0.565741,0.824469,-0.013669,0.000000,-0.080614,-0.038804,0.995990,0.000000,119.231506,0.000009,-0.000000,1.000000;;, + 240;16;0.821535,0.563385,0.087619,0.000000,-0.564252,0.825429,-0.016908,0.000000,-0.081849,-0.035548,0.996011,0.000000,119.231499,-0.000001,-0.000001,1.000000;;, + 320;16;0.826038,0.557042,0.085821,0.000000,-0.557428,0.829943,-0.021626,0.000000,-0.083273,-0.029975,0.996076,0.000000,119.231529,0.000014,-0.000001,1.000000;;, + 400;16;0.834533,0.544288,0.085466,0.000000,-0.544571,0.838426,-0.022024,0.000000,-0.083644,-0.028163,0.996098,0.000000,119.231514,0.000008,0.000000,1.000000;;, + 480;16;0.850094,0.520000,0.083306,0.000000,-0.519840,0.853889,-0.025319,0.000000,-0.084300,-0.021782,0.996202,0.000000,119.231506,0.000009,0.000001,1.000000;;, + 560;16;0.875466,0.479959,0.056556,0.000000,-0.481614,0.876161,0.019734,0.000000,-0.040081,-0.044515,0.998204,0.000000,119.231499,0.000006,-0.000002,1.000000;;, + 640;16;0.906159,0.422411,0.021083,0.000000,-0.422892,0.904206,0.059780,0.000000,0.006188,-0.063086,0.997989,0.000000,119.231506,0.000006,0.000002,1.000000;;, + 720;16;0.936240,0.345371,-0.064606,0.000000,-0.336500,0.934263,0.117986,0.000000,0.101108,-0.088723,0.990911,0.000000,119.231529,-0.000006,-0.000001,1.000000;;, + 800;16;0.955721,0.242467,-0.166756,0.000000,-0.216573,0.963188,0.159265,0.000000,0.199234,-0.116098,0.973050,0.000000,119.231514,-0.000003,-0.000002,1.000000;;, + 880;16;0.966320,0.105838,-0.234571,0.000000,-0.068425,0.984372,0.162267,0.000000,0.248079,-0.140751,0.958460,0.000000,119.231522,0.000002,-0.000000,1.000000;;, + 960;16;0.948597,-0.080312,-0.306127,0.000000,0.130235,0.980631,0.146295,0.000000,0.288448,-0.178643,0.940683,0.000000,119.231499,0.000012,0.000000,1.000000;;, + 1040;16;0.955816,-0.074898,-0.284263,0.000000,0.118281,0.983254,0.138643,0.000000,0.269118,-0.166140,0.948669,0.000000,119.231499,0.000002,0.000001,1.000000;;, + 1120;16;0.969026,-0.051502,-0.241531,0.000000,0.081517,0.989903,0.115966,0.000000,0.233120,-0.132063,0.963439,0.000000,119.231522,0.000004,-0.000005,1.000000;;, + 1200;16;0.981818,0.002370,-0.189811,0.000000,0.011582,0.997311,0.072359,0.000000,0.189472,-0.073242,0.979151,0.000000,119.231506,0.000005,0.000003,1.000000;;, + 1280;16;0.987825,0.070976,-0.138435,0.000000,-0.068788,0.997420,0.020535,0.000000,0.139535,-0.010763,0.990159,0.000000,119.231514,0.000006,-0.000002,1.000000;;, + 1360;16;0.985606,0.137460,-0.098419,0.000000,-0.140534,0.989760,-0.024988,0.000000,0.093977,0.038460,0.994831,0.000000,119.231499,0.000006,0.000002,1.000000;;, + 1440;16;0.976475,0.203883,-0.070209,0.000000,-0.208187,0.976208,-0.060640,0.000000,0.056176,0.073830,0.995687,0.000000,119.231514,0.000014,-0.000001,1.000000;;, + 1520;16;0.962520,0.265033,-0.057563,0.000000,-0.268819,0.960425,-0.072939,0.000000,0.035953,0.085679,0.995674,0.000000,119.231514,0.000005,0.000001,1.000000;;, + 1600;16;0.944932,0.323352,-0.050465,0.000000,-0.326285,0.942765,-0.068793,0.000000,0.025332,0.081471,0.996354,0.000000,119.231529,-0.000013,-0.000005,1.000000;;, + 1680;16;0.922942,0.382664,-0.041779,0.000000,-0.384487,0.921669,-0.051931,0.000000,0.018635,0.063993,0.997776,0.000000,119.231483,0.000003,0.000014,1.000000;;, + 1760;16;0.899830,0.435313,-0.028432,0.000000,-0.436035,0.899495,-0.027961,0.000000,0.013403,0.037557,0.999205,0.000000,119.231468,0.000009,0.000009,1.000000;;, + 1840;16;0.878910,0.476864,-0.010806,0.000000,-0.476944,0.878910,-0.006518,0.000000,0.006389,0.010883,0.999920,0.000000,119.231483,-0.000007,-0.000001,1.000000;;, + 1920;16;0.861739,0.507287,0.008100,0.000000,-0.507347,0.861688,0.009672,0.000000,-0.002073,-0.012445,0.999920,0.000000,119.231506,0.000019,0.000005,1.000000;;, + 2000;16;0.850935,0.524778,0.022754,0.000000,-0.525134,0.850905,0.013979,0.000000,-0.012025,-0.023844,0.999643,0.000000,119.231506,-0.000006,-0.000003,1.000000;;, + 2080;16;0.845055,0.533679,0.032674,0.000000,-0.534274,0.845214,0.012795,0.000000,-0.020789,-0.028269,0.999384,0.000000,119.231529,-0.000003,-0.000003,1.000000;;, + 2160;16;0.843436,0.535881,0.038038,0.000000,-0.536569,0.843795,0.010216,0.000000,-0.026622,-0.029027,0.999224,0.000000,119.231483,0.000012,0.000003,1.000000;;, + 2240;16;0.845095,0.533109,0.040127,0.000000,-0.533791,0.845579,0.007924,0.000000,-0.029706,-0.028116,0.999163,0.000000,119.231514,0.000031,0.000008,1.000000;;, + 2320;16;0.848386,0.527731,0.041726,0.000000,-0.528451,0.848928,0.007796,0.000000,-0.031308,-0.028665,0.999099,0.000000,119.231499,-0.000006,0.000001,1.000000;;, + 2400;16;0.853963,0.518533,0.043240,0.000000,-0.519361,0.854496,0.009968,0.000000,-0.031780,-0.030969,0.999015,0.000000,119.231499,0.000006,-0.000000,1.000000;;, + 2480;16;0.864707,0.500080,0.046927,0.000000,-0.501277,0.865103,0.017833,0.000000,-0.031679,-0.038943,0.998739,0.000000,119.231514,0.000021,0.000004,1.000000;;, + 2560;16;0.871883,0.487224,0.049326,0.000000,-0.488704,0.872126,0.023758,0.000000,-0.031443,-0.044820,0.998500,0.000000,119.231491,0.000017,0.000005,1.000000;;, + 2640;16;0.884353,0.464053,0.050747,0.000000,-0.465906,0.884188,0.033806,0.000000,-0.029182,-0.053540,0.998139,0.000000,119.231514,0.000005,0.000001,1.000000;;, + 2720;16;0.896219,0.440584,0.051742,0.000000,-0.442796,0.895536,0.044134,0.000000,-0.026892,-0.062465,0.997685,0.000000,119.231506,0.000008,0.000002,1.000000;;, + 2800;16;0.906430,0.419224,0.051341,0.000000,-0.421676,0.905154,0.053716,0.000000,-0.023953,-0.070339,0.997236,0.000000,119.231491,-0.000000,0.000001,1.000000;;, + 2880;16;0.916137,0.397674,0.050472,0.000000,-0.400321,0.914169,0.063547,0.000000,-0.020869,-0.078422,0.996702,0.000000,119.231491,0.000012,0.000003,1.000000;;, + 2960;16;0.937630,0.345753,0.036129,0.000000,-0.347484,0.935211,0.068081,0.000000,-0.010249,-0.076389,0.997025,0.000000,119.231522,0.000028,-0.000003,1.000000;;, + 3040;16;0.955974,0.292651,0.021675,0.000000,-0.293452,0.953258,0.072014,0.000000,0.000413,-0.075204,0.997168,0.000000,119.231514,-0.000004,0.000002,1.000000;;, + 3120;16;0.942333,0.333838,0.023695,0.000000,-0.334677,0.940153,0.064063,0.000000,-0.000890,-0.068299,0.997665,0.000000,119.231514,-0.000003,0.000001,1.000000;;, + 3200;16;0.930563,0.365233,0.025652,0.000000,-0.366128,0.928602,0.060407,0.000000,-0.001758,-0.065605,0.997844,0.000000,119.231499,-0.000005,-0.000004,1.000000;;, + 3280;16;0.931320,0.363275,0.025978,0.000000,-0.364137,0.930129,0.047574,0.000000,-0.006880,-0.053766,0.998530,0.000000,119.231514,-0.000016,-0.000003,1.000000;;, + 3360;16;0.934368,0.355316,0.026583,0.000000,-0.356132,0.933653,0.038251,0.000000,-0.011228,-0.045208,0.998915,0.000000,119.231506,0.000000,-0.000001,1.000000;;, + 3440;16;0.939233,0.342190,0.027342,0.000000,-0.342963,0.938808,0.031861,0.000000,-0.014766,-0.039302,0.999118,0.000000,119.231491,0.000022,0.000001,1.000000;;, + 3520;16;0.945582,0.324161,0.028189,0.000000,-0.324910,0.945330,0.028018,0.000000,-0.017565,-0.035652,0.999210,0.000000,119.231483,-0.000023,-0.000004,1.000000;;, + 3600;16;0.944105,0.328308,0.029650,0.000000,-0.329292,0.943430,0.038819,0.000000,-0.015227,-0.046413,0.998806,0.000000,119.231491,0.000031,0.000003,1.000000;;, + 3680;16;0.944000,0.328443,0.031452,0.000000,-0.329694,0.942706,0.051065,0.000000,-0.012878,-0.058575,0.998200,0.000000,119.231499,-0.000021,-0.000000,1.000000;;, + 3760;16;0.940374,0.338217,0.036142,0.000000,-0.339794,0.938901,0.054819,0.000000,-0.015393,-0.063831,0.997842,0.000000,119.231499,-0.000012,0.000000,1.000000;;, + 3840;16;0.937802,0.344730,0.041095,0.000000,-0.346695,0.936131,0.058841,0.000000,-0.018186,-0.069429,0.997421,0.000000,119.231499,0.000010,-0.000001,1.000000;;, + 3920;16;0.939902,0.338297,0.046256,0.000000,-0.340073,0.939626,0.038111,0.000000,-0.030570,-0.051551,0.998203,0.000000,119.231522,-0.000021,0.000001,1.000000;;, + 4000;16;0.942779,0.329510,0.050891,0.000000,-0.330734,0.943560,0.017611,0.000000,-0.042216,-0.033434,0.998549,0.000000,119.231476,0.000003,0.000002,1.000000;;, + 4080;16;0.946381,0.318334,0.055010,0.000000,-0.318669,0.947862,-0.002804,0.000000,-0.053034,-0.014877,0.998482,0.000000,119.231506,-0.000026,0.000003,1.000000;;, + 4160;16;0.950159,0.306179,0.058753,0.000000,-0.305398,0.951969,-0.022063,0.000000,-0.062687,0.003020,0.998029,0.000000,119.231491,0.000031,0.000001,1.000000;;, + 4240;16;0.949908,0.306152,0.062812,0.000000,-0.305789,0.951972,-0.015556,0.000000,-0.064557,-0.004431,0.997904,0.000000,119.231514,0.000023,0.000002,1.000000;;, + 4320;16;0.949171,0.307449,0.067452,0.000000,-0.307626,0.951474,-0.008013,0.000000,-0.066642,-0.013145,0.997690,0.000000,119.231491,0.000027,0.000001,1.000000;;, + 4400;16;0.943648,0.323457,0.070034,0.000000,-0.323349,0.946188,-0.013198,0.000000,-0.070534,-0.010191,0.997457,0.000000,119.231491,0.000006,-0.000000,1.000000;;, + 4480;16;0.937464,0.340343,0.072989,0.000000,-0.339952,0.940268,-0.018100,0.000000,-0.074789,-0.007844,0.997169,0.000000,119.231483,0.000030,0.000001,1.000000;;, + 4560;16;0.931869,0.354706,0.076179,0.000000,-0.353973,0.934963,-0.023376,0.000000,-0.079516,-0.005182,0.996820,0.000000,119.231483,-0.000005,0.000001,1.000000;;, + 4640;16;0.928705,0.362194,0.079510,0.000000,-0.361018,0.932101,-0.029214,0.000000,-0.084692,-0.001573,0.996406,0.000000,119.231506,-0.000001,0.000004,1.000000;;, + 4720;16;0.876284,0.474843,0.081553,0.000000,-0.475470,0.879639,-0.012791,0.000000,-0.077811,-0.027567,0.996587,0.000000,119.231522,-0.000039,-0.000003,1.000000;;, + 4800;16;0.832169,0.546757,0.092472,0.000000,-0.549113,0.835748,0.000044,0.000000,-0.077259,-0.050814,0.995715,0.000000,119.231468,-0.000006,0.000000,1.000000;;, + 4960;16;0.819935,0.566355,0.083354,0.000000,-0.566770,0.823611,-0.020897,0.000000,-0.080486,-0.030108,0.996301,0.000000,119.231514,0.000010,0.000002,1.000000;;; + } + { Bip01_L_Foot } + } + + Animation { + + + AnimationKey { + 4; + 62; + 0;16;0.000000,1.000000,0.000000,0.000000,-1.000000,0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,27.423233,34.577133,0.000000,1.000000;;, + 80;16;0.000000,1.000000,-0.000000,0.000000,-1.000000,0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,27.423252,34.577145,-0.000001,1.000000;;, + 160;16;-0.000000,1.000000,0.000000,0.000000,-1.000000,-0.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,27.423252,34.577126,0.000001,1.000000;;, + 240;16;0.000000,1.000000,0.000000,0.000000,-1.000000,0.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,27.423248,34.577133,0.000002,1.000000;;, + 320;16;0.000000,1.000000,-0.000000,0.000000,-1.000000,0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,27.423239,34.577137,-0.000002,1.000000;;, + 400;16;-0.000000,1.000000,-0.000000,0.000000,-1.000000,-0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,27.423252,34.577129,-0.000002,1.000000;;, + 480;16;-0.000000,1.000000,-0.000000,0.000000,-1.000000,-0.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,27.423250,34.577129,-0.000000,1.000000;;, + 560;16;-0.000000,1.000000,-0.000000,0.000000,-1.000000,-0.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,27.423246,34.577141,-0.000001,1.000000;;, + 640;16;0.000000,1.000000,0.000000,0.000000,-1.000000,0.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,27.423258,34.577145,-0.000001,1.000000;;, + 720;16;-0.000000,1.000000,0.000000,0.000000,-1.000000,-0.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,27.423256,34.577141,-0.000000,1.000000;;, + 800;16;0.000000,1.000000,-0.000000,0.000000,-1.000000,0.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,27.423233,34.577141,-0.000003,1.000000;;, + 880;16;-0.000000,1.000000,-0.000000,0.000000,-1.000000,0.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,27.423244,34.577141,0.000001,1.000000;;, + 960;16;0.000000,1.000000,0.000000,0.000000,-1.000000,-0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,27.423248,34.577122,0.000002,1.000000;;, + 1040;16;-0.000000,1.000000,0.000000,0.000000,-1.000000,0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,27.423252,34.577137,0.000001,1.000000;;, + 1120;16;-0.000000,1.000000,-0.000000,0.000000,-1.000000,0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,27.423254,34.577129,0.000004,1.000000;;, + 1200;16;-0.000000,1.000000,0.000000,0.000000,-1.000000,-0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,27.423241,34.577129,0.000001,1.000000;;, + 1280;16;0.000000,1.000000,0.000000,0.000000,-1.000000,-0.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,27.423254,34.577145,0.000002,1.000000;;, + 1360;16;0.000000,1.000000,-0.000000,0.000000,-1.000000,-0.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,27.423235,34.577141,-0.000001,1.000000;;, + 1440;16;-0.000000,1.000000,-0.000000,0.000000,-1.000000,0.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,27.423248,34.577137,-0.000001,1.000000;;, + 1520;16;-0.000000,1.000000,0.000000,0.000000,-1.000000,0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,27.423246,34.577137,-0.000001,1.000000;;, + 1600;16;0.000000,1.000000,0.000000,0.000000,-1.000000,0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,27.423252,34.577145,0.000002,1.000000;;, + 1680;16;0.000000,1.000000,0.000000,0.000000,-1.000000,0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,27.423256,34.577141,-0.000003,1.000000;;, + 1760;16;0.000000,1.000000,0.000000,0.000000,-1.000000,0.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,27.423248,34.577129,-0.000001,1.000000;;, + 1840;16;0.000000,1.000000,-0.000000,0.000000,-1.000000,-0.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,27.423246,34.577129,-0.000005,1.000000;;, + 1920;16;0.000000,1.000000,0.000000,0.000000,-1.000000,0.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,27.423241,34.577141,0.000002,1.000000;;, + 2000;16;-0.000000,1.000000,-0.000000,0.000000,-1.000000,0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,27.423250,34.577148,-0.000004,1.000000;;, + 2080;16;-0.000000,1.000000,0.000000,0.000000,-1.000000,-0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,27.423260,34.577133,-0.000002,1.000000;;, + 2160;16;0.000000,1.000000,-0.000000,0.000000,-1.000000,0.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,27.423248,34.577152,0.000005,1.000000;;, + 2240;16;-0.000000,1.000000,-0.000000,0.000000,-1.000000,0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,27.423265,34.577129,-0.000001,1.000000;;, + 2320;16;0.000000,1.000000,0.000000,0.000000,-1.000000,0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,27.423248,34.577137,0.000001,1.000000;;, + 2400;16;0.000000,1.000000,-0.000000,0.000000,-1.000000,-0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,27.423250,34.577148,0.000004,1.000000;;, + 2480;16;0.000000,1.000000,-0.000000,0.000000,-1.000000,0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,27.423260,34.577156,0.000003,1.000000;;, + 2560;16;-0.000000,1.000000,-0.000000,0.000000,-1.000000,-0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,27.423262,34.577137,-0.000002,1.000000;;, + 2640;16;-0.000000,1.000000,0.000000,0.000000,-1.000000,0.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,27.423246,34.577126,0.000000,1.000000;;, + 2720;16;-0.000000,1.000000,-0.000000,0.000000,-1.000000,0.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,27.423256,34.577145,0.000001,1.000000;;, + 2800;16;0.000000,1.000000,0.000000,0.000000,-1.000000,-0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,27.423262,34.577152,-0.000001,1.000000;;, + 2880;16;-0.000000,1.000000,0.000000,0.000000,-1.000000,0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,27.423254,34.577122,0.000002,1.000000;;, + 2960;16;-0.000000,1.000000,-0.000000,0.000000,-1.000000,0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,27.423243,34.577114,-0.000001,1.000000;;, + 3040;16;0.000000,1.000000,-0.000000,0.000000,-1.000000,0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,27.423254,34.577148,0.000003,1.000000;;, + 3120;16;-0.000000,1.000000,0.000000,0.000000,-1.000000,-0.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,27.423237,34.577110,-0.000001,1.000000;;, + 3200;16;-0.000000,1.000000,-0.000000,0.000000,-1.000000,-0.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,27.423252,34.577164,-0.000002,1.000000;;, + 3280;16;0.000000,1.000000,-0.000000,0.000000,-1.000000,-0.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,27.423246,34.577133,0.000000,1.000000;;, + 3360;16;0.000000,1.000000,-0.000000,0.000000,-1.000000,0.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,27.423244,34.577129,0.000000,1.000000;;, + 3440;16;0.000000,1.000000,-0.000000,0.000000,-1.000000,-0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,27.423239,34.577133,0.000002,1.000000;;, + 3520;16;-0.000000,1.000000,-0.000000,0.000000,-1.000000,-0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,27.423237,34.577118,0.000001,1.000000;;, + 3600;16;0.000000,1.000000,0.000000,0.000000,-1.000000,-0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,27.423250,34.577106,0.000001,1.000000;;, + 3680;16;-0.000000,1.000000,-0.000000,0.000000,-1.000000,-0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,27.423250,34.577160,0.000002,1.000000;;, + 3760;16;-0.000000,1.000000,0.000000,0.000000,-1.000000,-0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,27.423243,34.577160,-0.000000,1.000000;;, + 3840;16;-0.000000,1.000000,-0.000000,0.000000,-1.000000,0.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,27.423256,34.577129,-0.000001,1.000000;;, + 3920;16;0.000000,1.000000,-0.000000,0.000000,-1.000000,0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,27.423256,34.577160,-0.000001,1.000000;;, + 4000;16;0.000000,1.000000,-0.000000,0.000000,-1.000000,-0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,27.423258,34.577137,-0.000001,1.000000;;, + 4080;16;-0.000000,1.000000,-0.000000,0.000000,-1.000000,0.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,27.423260,34.577156,-0.000002,1.000000;;, + 4160;16;0.000000,1.000000,0.000000,0.000000,-1.000000,0.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,27.423262,34.577137,-0.000001,1.000000;;, + 4240;16;0.000000,1.000000,-0.000000,0.000000,-1.000000,0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,27.423237,34.577126,-0.000003,1.000000;;, + 4320;16;-0.000000,1.000000,-0.000000,0.000000,-1.000000,-0.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,27.423239,34.577114,-0.000001,1.000000;;, + 4400;16;0.000000,1.000000,0.000000,0.000000,-1.000000,0.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,27.423233,34.577114,0.000001,1.000000;;, + 4480;16;0.000000,1.000000,-0.000000,0.000000,-1.000000,0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,27.423250,34.577129,-0.000000,1.000000;;, + 4560;16;0.000000,1.000000,-0.000000,0.000000,-1.000000,-0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,27.423254,34.577110,-0.000006,1.000000;;, + 4640;16;0.000000,1.000000,-0.000000,0.000000,-1.000000,-0.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,27.423250,34.577141,-0.000003,1.000000;;, + 4720;16;0.019225,0.999811,-0.002960,0.000000,-0.999808,0.019213,-0.003948,0.000000,-0.003890,0.003035,0.999988,0.000000,27.423246,34.577110,-0.000000,1.000000;;, + 4800;16;0.000000,1.000000,0.000000,0.000000,-1.000000,-0.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,27.423262,34.577110,0.000002,1.000000;;, + 4960;16;0.000000,1.000000,0.000000,0.000000,-1.000000,0.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,27.423233,34.577133,0.000000,1.000000;;; + } + { Bip01_L_Toe0 } + } + + Animation { + + + AnimationKey { + 4; + 62; + 0;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,-1.000000,0.000000,15.738561,-0.000003,0.000000,1.000000;;, + 80;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,-1.000000,0.000000,15.738552,-0.000004,0.000001,1.000000;;, + 160;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,-1.000000,0.000000,15.738560,-0.000006,0.000001,1.000000;;, + 240;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,-1.000000,0.000000,15.738562,-0.000002,-0.000000,1.000000;;, + 320;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,-1.000000,0.000000,15.738562,-0.000007,-0.000000,1.000000;;, + 400;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,-1.000000,0.000000,15.738553,0.000008,0.000002,1.000000;;, + 480;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,-1.000000,0.000000,15.738570,-0.000012,0.000002,1.000000;;, + 560;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,-1.000000,0.000000,15.738561,-0.000000,0.000001,1.000000;;, + 640;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,-1.000000,0.000000,15.738554,0.000003,0.000001,1.000000;;, + 720;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,-1.000000,0.000000,15.738559,0.000018,-0.000001,1.000000;;, + 800;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,-1.000000,0.000000,15.738567,-0.000023,0.000003,1.000000;;, + 880;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,-1.000000,0.000000,15.738561,0.000015,-0.000001,1.000000;;, + 960;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,-1.000000,0.000000,15.738577,0.000009,0.000000,1.000000;;, + 1040;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,-1.000000,0.000000,15.738572,0.000005,-0.000002,1.000000;;, + 1120;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,-1.000000,0.000000,15.738572,0.000003,-0.000002,1.000000;;, + 1200;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,-1.000000,0.000000,15.738558,0.000002,0.000000,1.000000;;, + 1280;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,-1.000000,0.000000,15.738563,0.000006,-0.000003,1.000000;;, + 1360;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,-1.000000,0.000000,15.738564,-0.000010,0.000000,1.000000;;, + 1440;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,-1.000000,0.000000,15.738564,-0.000011,0.000004,1.000000;;, + 1520;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,-1.000000,0.000000,15.738545,-0.000000,-0.000006,1.000000;;, + 1600;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,-1.000000,0.000000,15.738548,-0.000011,-0.000001,1.000000;;, + 1680;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,-1.000000,0.000000,15.738566,-0.000008,0.000001,1.000000;;, + 1760;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,-1.000000,0.000000,15.738560,0.000012,-0.000003,1.000000;;, + 1840;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,-1.000000,0.000000,15.738552,-0.000004,-0.000001,1.000000;;, + 1920;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,-1.000000,0.000000,15.738549,-0.000001,-0.000006,1.000000;;, + 2000;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,-1.000000,0.000000,15.738556,-0.000001,0.000003,1.000000;;, + 2080;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,-1.000000,0.000000,15.738564,0.000012,-0.000001,1.000000;;, + 2160;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,-1.000000,0.000000,15.738553,-0.000004,-0.000002,1.000000;;, + 2240;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,-1.000000,0.000000,15.738557,0.000012,-0.000001,1.000000;;, + 2320;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,-1.000000,0.000000,15.738566,-0.000005,-0.000001,1.000000;;, + 2400;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,-1.000000,0.000000,15.738562,0.000005,0.000004,1.000000;;, + 2480;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,-1.000000,0.000000,15.738552,0.000007,-0.000000,1.000000;;, + 2560;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,-1.000000,0.000000,15.738543,0.000018,-0.000003,1.000000;;, + 2640;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,-1.000000,0.000000,15.738567,-0.000004,0.000004,1.000000;;, + 2720;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,-1.000000,0.000000,15.738589,-0.000015,0.000006,1.000000;;, + 2800;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,-1.000000,0.000000,15.738543,0.000010,-0.000005,1.000000;;, + 2880;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,-1.000000,0.000000,15.738537,0.000003,-0.000002,1.000000;;, + 2960;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,-1.000000,0.000000,15.738583,0.000002,-0.000001,1.000000;;, + 3040;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,-1.000000,0.000000,15.738555,0.000015,-0.000003,1.000000;;, + 3120;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,-1.000000,0.000000,15.738544,0.000016,-0.000002,1.000000;;, + 3200;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,-1.000000,0.000000,15.738552,0.000001,-0.000004,1.000000;;, + 3280;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,-1.000000,0.000000,15.738568,0.000010,-0.000000,1.000000;;, + 3360;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,-1.000000,0.000000,15.738545,0.000010,-0.000002,1.000000;;, + 3440;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,-1.000000,0.000000,15.738567,-0.000012,0.000003,1.000000;;, + 3520;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,-1.000000,0.000000,15.738564,-0.000007,0.000000,1.000000;;, + 3600;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,-1.000000,0.000000,15.738573,-0.000008,0.000002,1.000000;;, + 3680;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,-1.000000,0.000000,15.738562,-0.000005,0.000002,1.000000;;, + 3760;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,-1.000000,0.000000,15.738544,-0.000008,-0.000000,1.000000;;, + 3840;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,-1.000000,0.000000,15.738535,0.000001,0.000001,1.000000;;, + 3920;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,-1.000000,0.000000,15.738588,-0.000004,0.000001,1.000000;;, + 4000;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,-1.000000,0.000000,15.738590,0.000003,0.000001,1.000000;;, + 4080;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,-1.000000,0.000000,15.738544,0.000012,-0.000002,1.000000;;, + 4160;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,-1.000000,0.000000,15.738582,-0.000001,-0.000001,1.000000;;, + 4240;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,-1.000000,0.000000,15.738545,-0.000004,-0.000001,1.000000;;, + 4320;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,-1.000000,0.000000,15.738585,-0.000005,0.000001,1.000000;;, + 4400;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,-1.000000,0.000000,15.738574,-0.000012,0.000001,1.000000;;, + 4480;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,-1.000000,0.000000,15.738592,-0.000014,0.000002,1.000000;;, + 4560;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,-1.000000,0.000000,15.738579,-0.000008,0.000006,1.000000;;, + 4640;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,-1.000000,0.000000,15.738531,-0.000003,0.000001,1.000000;;, + 4720;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,-1.000000,0.000000,15.738544,-0.000011,0.000005,1.000000;;, + 4800;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,-1.000000,0.000000,15.738586,0.000005,-0.000001,1.000000;;, + 4960;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,-1.000000,0.000000,15.738561,-0.000003,0.000000,1.000000;;; + } + { Dummy16 } + } + + Animation { + + + AnimationKey { + 4; + 62; + 0;16;-0.950769,0.300574,-0.075459,0.000000,0.309313,0.905410,-0.290788,0.000000,-0.019082,-0.299812,-0.953807,0.000000,-27.853168,-0.096285,-31.055355,1.000000;;, + 80;16;-0.935626,0.342228,-0.086515,0.000000,0.352570,0.894002,-0.276506,0.000000,-0.017284,-0.289208,-0.957110,0.000000,-27.748009,0.301211,-31.076935,1.000000;;, + 160;16;-0.925290,0.368153,-0.091117,0.000000,0.378918,0.887164,-0.263366,0.000000,-0.016123,-0.278216,-0.960383,0.000000,-27.639570,0.709021,-31.093178,1.000000;;, + 240;16;-0.909113,0.404857,-0.098005,0.000000,0.416296,0.874843,-0.247683,0.000000,-0.014536,-0.265971,-0.963872,0.000000,-27.523199,1.158613,-31.101513,1.000000;;, + 320;16;-0.891424,0.441083,-0.103967,0.000000,0.452986,0.860751,-0.232186,0.000000,-0.012924,-0.254072,-0.967099,0.000000,-27.402622,1.597056,-31.104548,1.000000;;, + 400;16;-0.875825,0.470459,-0.107694,0.000000,0.482491,0.848173,-0.218644,0.000000,-0.011520,-0.243455,-0.969844,0.000000,-27.279839,1.992580,-31.105698,1.000000;;, + 480;16;-0.859232,0.499192,-0.111928,0.000000,0.511488,0.833964,-0.207084,0.000000,-0.010031,-0.235183,-0.971899,0.000000,-27.156675,2.313535,-31.109781,1.000000;;, + 560;16;-0.855702,0.505905,-0.108783,0.000000,0.517335,0.831586,-0.202064,0.000000,-0.011763,-0.229184,-0.973312,0.000000,-27.035406,2.529122,-31.122227,1.000000;;, + 640;16;-0.852038,0.512206,-0.108054,0.000000,0.523309,0.828144,-0.200814,0.000000,-0.013374,-0.227647,-0.973652,0.000000,-26.917717,2.605358,-31.149225,1.000000;;, + 720;16;-0.848776,0.515387,-0.118137,0.000000,0.528752,0.826851,-0.191672,0.000000,-0.001103,-0.225152,-0.974323,0.000000,-26.804501,2.486619,-31.197994,1.000000;;, + 800;16;-0.852712,0.506694,-0.127061,0.000000,0.522288,0.831574,-0.188944,0.000000,0.009923,-0.227477,-0.973733,0.000000,-26.700985,2.205780,-31.262104,1.000000;;, + 880;16;-0.859492,0.494064,-0.131048,0.000000,0.510717,0.840591,-0.180485,0.000000,0.020987,-0.222054,-0.974809,0.000000,-26.611767,1.761564,-31.336849,1.000000;;, + 960;16;-0.869096,0.476071,-0.134272,0.000000,0.493710,0.851557,-0.176354,0.000000,0.030383,-0.219560,-0.975126,0.000000,-26.539392,1.200514,-31.411163,1.000000;;, + 1040;16;-0.880700,0.453676,-0.136183,0.000000,0.472124,0.863998,-0.174947,0.000000,0.038293,-0.218371,-0.975114,0.000000,-26.489084,0.565444,-31.475983,1.000000;;, + 1120;16;-0.893894,0.426739,-0.137284,0.000000,0.445963,0.877632,-0.175723,0.000000,0.045497,-0.218302,-0.974820,0.000000,-26.454227,-0.131122,-31.528803,1.000000;;, + 1200;16;-0.908056,0.393894,-0.142415,0.000000,0.415567,0.889745,-0.188830,0.000000,0.052334,-0.230652,-0.971628,0.000000,-26.430658,-0.859936,-31.567528,1.000000;;, + 1280;16;-0.922470,0.357039,-0.146872,0.000000,0.381403,0.901761,-0.203369,0.000000,0.059832,-0.243619,-0.968024,0.000000,-26.415157,-1.627756,-31.590664,1.000000;;, + 1360;16;-0.936632,0.316821,-0.149480,0.000000,0.343409,0.914687,-0.213116,0.000000,0.069207,-0.250944,-0.965524,0.000000,-26.403652,-2.435472,-31.596870,1.000000;;, + 1440;16;-0.949930,0.273334,-0.151398,0.000000,0.302307,0.926494,-0.224097,0.000000,0.079016,-0.258645,-0.962735,0.000000,-26.396225,-3.271423,-31.582434,1.000000;;, + 1520;16;-0.962460,0.228345,-0.146729,0.000000,0.256494,0.941984,-0.216509,0.000000,0.088778,-0.246016,-0.965191,0.000000,-26.391926,-4.126998,-31.545103,1.000000;;, + 1600;16;-0.973279,0.180599,-0.141817,0.000000,0.207809,0.955496,-0.209388,0.000000,0.097690,-0.233264,-0.967494,0.000000,-26.390018,-4.993391,-31.483387,1.000000;;, + 1680;16;-0.982018,0.130495,-0.136426,0.000000,0.156468,0.966935,-0.201384,0.000000,0.105636,-0.219109,-0.969965,0.000000,-26.389751,-5.861845,-31.396585,1.000000;;, + 1760;16;-0.988295,0.078361,-0.130889,0.000000,0.102952,0.975744,-0.193194,0.000000,0.112575,-0.204408,-0.972391,0.000000,-26.390581,-6.723475,-31.284851,1.000000;;, + 1840;16;-0.991307,0.024053,-0.129348,0.000000,0.050465,0.977461,-0.204997,0.000000,0.121502,-0.209743,-0.970178,0.000000,-26.392103,-7.569542,-31.149120,1.000000;;, + 1920;16;-0.991445,-0.030234,-0.126977,0.000000,-0.002105,0.976380,-0.216048,0.000000,0.130510,-0.213933,-0.968091,0.000000,-26.393761,-8.391356,-30.991154,1.000000;;, + 2000;16;-0.989601,-0.065657,-0.127977,0.000000,-0.035271,0.973343,-0.226624,0.000000,0.139445,-0.219754,-0.965538,0.000000,-26.395369,-9.180367,-30.813459,1.000000;;, + 2080;16;-0.986798,-0.097252,-0.129503,0.000000,-0.064643,0.969690,-0.235632,0.000000,0.148494,-0.224150,-0.963175,0.000000,-26.396614,-9.928298,-30.619232,1.000000;;, + 2160;16;-0.984868,-0.112194,-0.132090,0.000000,-0.079888,0.970267,-0.228473,0.000000,0.153796,-0.214463,-0.964548,0.000000,-26.403309,-10.627003,-30.415258,1.000000;;, + 2240;16;-0.982743,-0.127398,-0.134113,0.000000,-0.095799,0.970749,-0.220155,0.000000,0.158237,-0.203508,-0.966201,0.000000,-26.397121,-11.268909,-30.196938,1.000000;;, + 2320;16;-0.978546,-0.154778,-0.135980,0.000000,-0.121814,0.966943,-0.224014,0.000000,0.166158,-0.202644,-0.965053,0.000000,-26.355202,-11.844269,-29.959543,1.000000;;, + 2400;16;-0.973358,-0.183789,-0.137096,0.000000,-0.149820,0.962418,-0.226507,0.000000,0.173573,-0.199933,-0.964313,0.000000,-26.298077,-12.350889,-29.710909,1.000000;;, + 2480;16;-0.967874,-0.207464,-0.142053,0.000000,-0.169510,0.955665,-0.240771,0.000000,0.185706,-0.208956,-0.960130,0.000000,-26.223885,-12.783846,-29.451048,1.000000;;, + 2560;16;-0.961966,-0.230255,-0.146982,0.000000,-0.188517,0.948972,-0.252811,0.000000,0.197693,-0.215486,-0.956286,0.000000,-26.175800,-13.142502,-29.199085,1.000000;;, + 2640;16;-0.958528,-0.239279,-0.154823,0.000000,-0.193917,0.945671,-0.260966,0.000000,0.208855,-0.220120,-0.952852,0.000000,-26.195387,-13.424680,-28.970636,1.000000;;, + 2720;16;-0.954978,-0.248082,-0.162707,0.000000,-0.199542,0.942941,-0.266544,0.000000,0.219548,-0.222077,-0.949990,0.000000,-26.283360,-13.630479,-28.778227,1.000000;;, + 2800;16;-0.953561,-0.246858,-0.172576,0.000000,-0.195597,0.943225,-0.268456,0.000000,0.229048,-0.222234,-0.947707,0.000000,-26.469358,-13.758628,-28.638807,1.000000;;, + 2880;16;-0.952465,-0.244663,-0.181521,0.000000,-0.191561,0.944292,-0.267614,0.000000,0.236884,-0.220121,-0.946273,0.000000,-26.708914,-13.811164,-28.548800,1.000000;;, + 2960;16;-0.951625,-0.242593,-0.188569,0.000000,-0.188648,0.945716,-0.264638,0.000000,0.242532,-0.216263,-0.945732,0.000000,-26.973581,-13.789098,-28.512592,1.000000;;, + 3040;16;-0.952264,-0.236555,-0.192962,0.000000,-0.183013,0.948285,-0.259349,0.000000,0.244333,-0.211654,-0.946311,0.000000,-27.246073,-13.695509,-28.519129,1.000000;;, + 3120;16;-0.951630,-0.238703,-0.193446,0.000000,-0.186562,0.949180,-0.253479,0.000000,0.244121,-0.205129,-0.947801,0.000000,-27.508265,-13.531747,-28.559759,1.000000;;, + 3200;16;-0.954384,-0.230068,-0.190314,0.000000,-0.180596,0.952381,-0.245673,0.000000,0.237773,-0.200096,-0.950487,0.000000,-27.734383,-13.301747,-28.632072,1.000000;;, + 3280;16;-0.945656,-0.267764,-0.184489,0.000000,-0.218163,0.943176,-0.250646,0.000000,0.241120,-0.196776,-0.950337,0.000000,-27.892500,-13.008595,-28.732557,1.000000;;, + 3360;16;-0.935553,-0.302299,-0.182634,0.000000,-0.248927,0.931215,-0.266222,0.000000,0.250550,-0.203603,-0.946452,0.000000,-27.983364,-12.653031,-28.858446,1.000000;;, + 3440;16;-0.942919,-0.265237,-0.201378,0.000000,-0.204891,0.938750,-0.277069,0.000000,0.262533,-0.219993,-0.939510,0.000000,-27.987085,-12.232808,-29.007380,1.000000;;, + 3520;16;-0.952445,-0.206811,-0.223779,0.000000,-0.138372,0.947867,-0.287057,0.000000,0.271480,-0.242442,-0.931408,0.000000,-27.932764,-11.757487,-29.171944,1.000000;;, + 3600;16;-0.958256,-0.157993,-0.238293,0.000000,-0.082825,0.951111,-0.297537,0.000000,0.273652,-0.265380,-0.924493,0.000000,-27.839216,-11.233636,-29.345602,1.000000;;, + 3680;16;-0.962652,-0.111330,-0.246793,0.000000,-0.030878,0.950742,-0.308443,0.000000,0.268975,-0.289303,-0.918671,0.000000,-27.716318,-10.670435,-29.522480,1.000000;;, + 3760;16;-0.966618,-0.071139,-0.246146,0.000000,0.011804,0.947299,-0.320135,0.000000,0.255948,-0.312354,-0.914836,0.000000,-27.576151,-10.080297,-29.696045,1.000000;;, + 3840;16;-0.970162,-0.033133,-0.240184,0.000000,0.050431,0.941378,-0.333563,0.000000,0.237155,-0.335723,-0.911618,0.000000,-27.431482,-9.461965,-29.864712,1.000000;;, + 3920;16;-0.972774,0.006360,-0.231670,0.000000,0.089438,0.932489,-0.349949,0.000000,0.213804,-0.361141,-0.907670,0.000000,-27.294771,-8.817940,-30.026068,1.000000;;, + 4000;16;-0.974295,0.045173,-0.220698,0.000000,0.125929,0.921535,-0.367307,0.000000,0.186789,-0.385658,-0.903536,0.000000,-27.178677,-8.150883,-30.178059,1.000000;;, + 4080;16;-0.974651,0.082562,-0.207939,0.000000,0.159039,0.909370,-0.384385,0.000000,0.157358,-0.407712,-0.899449,0.000000,-27.098522,-7.463268,-30.319038,1.000000;;, + 4160;16;-0.973899,0.117778,-0.194033,0.000000,0.188152,0.897050,-0.399875,0.000000,0.126961,-0.425945,-0.895797,0.000000,-27.058285,-6.758516,-30.447344,1.000000;;, + 4240;16;-0.972112,0.150360,-0.179973,0.000000,0.213336,0.885692,-0.412356,0.000000,0.097399,-0.439251,-0.893069,0.000000,-27.072193,-6.039464,-30.561668,1.000000;;, + 4320;16;-0.969962,0.178673,-0.165076,0.000000,0.233094,0.876778,-0.420627,0.000000,0.069581,-0.446471,-0.892089,0.000000,-27.125252,-5.310541,-30.660139,1.000000;;, + 4400;16;-0.968280,0.200485,-0.149129,0.000000,0.245693,0.872583,-0.422178,0.000000,0.045487,-0.445426,-0.894162,0.000000,-27.210672,-4.575768,-30.741310,1.000000;;, + 4480;16;-0.967196,0.217127,-0.131860,0.000000,0.252894,0.872030,-0.419057,0.000000,0.023998,-0.438658,-0.898334,0.000000,-27.318468,-3.839471,-30.804024,1.000000;;, + 4560;16;-0.967051,0.228251,-0.112754,0.000000,0.254538,0.875105,-0.411585,0.000000,0.004727,-0.426724,-0.904370,0.000000,-27.439497,-3.105746,-30.847593,1.000000;;, + 4640;16;-0.967164,0.236582,-0.092861,0.000000,0.253796,0.879644,-0.402262,0.000000,-0.013484,-0.412621,-0.910803,0.000000,-27.564468,-2.379188,-30.871828,1.000000;;, + 4720;16;-0.966712,0.245232,-0.073003,0.000000,0.253826,0.883169,-0.394442,0.000000,-0.032256,-0.399841,-0.916017,0.000000,-27.678188,-1.668544,-30.876764,1.000000;;, + 4800;16;-0.965965,0.253205,-0.052900,0.000000,0.253587,0.886612,-0.386799,0.000000,-0.051038,-0.387049,-0.920645,0.000000,-27.789658,-0.963900,-30.864017,1.000000;;, + 4960;16;-0.950769,0.300574,-0.075459,0.000000,0.309313,0.905410,-0.290788,0.000000,-0.019082,-0.299812,-0.953807,0.000000,-27.853168,-0.096285,-31.055355,1.000000;;; + } + { Bip01_R_Thigh } + } + + Animation { + + + AnimationKey { + 4; + 62; + 0;16;1.000000,-0.000691,-0.000000,0.000000,0.000691,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,119.231514,-0.000005,0.000001,1.000000;;, + 80;16;0.992696,-0.120646,-0.000000,0.000000,0.120646,0.992696,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,119.231514,0.000002,-0.000002,1.000000;;, + 160;16;0.981416,-0.191892,-0.000000,0.000000,0.191892,0.981416,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,119.231522,-0.000015,0.000003,1.000000;;, + 240;16;0.955509,-0.294962,-0.000000,0.000000,0.294962,0.955509,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,119.231506,-0.000021,0.000008,1.000000;;, + 320;16;0.918810,-0.394701,-0.000000,0.000000,0.394701,0.918810,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,119.231514,-0.000011,-0.000001,1.000000;;, + 400;16;0.881477,-0.472227,0.000000,0.000000,0.472227,0.881477,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,119.231529,-0.000002,0.000000,1.000000;;, + 480;16;0.837618,-0.546256,-0.000000,0.000000,0.546256,0.837618,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,119.231506,-0.000013,-0.000001,1.000000;;, + 560;16;0.859904,-0.510455,-0.000000,0.000000,0.510456,0.859904,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,119.231506,-0.000008,0.000003,1.000000;;, + 640;16;0.880661,-0.473747,0.000000,0.000000,0.473747,0.880661,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,119.231522,-0.000020,0.000005,1.000000;;, + 720;16;0.841689,-0.539962,0.000000,0.000000,0.539962,0.841689,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,119.231514,-0.000014,0.000004,1.000000;;, + 800;16;0.814050,-0.580795,0.000000,0.000000,0.580795,0.814050,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,119.231499,-0.000020,0.000008,1.000000;;, + 880;16;0.797222,-0.603687,-0.000000,0.000000,0.603687,0.797222,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,119.231483,-0.000022,0.000007,1.000000;;, + 960;16;0.788129,-0.615510,-0.000000,0.000000,0.615510,0.788129,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,119.231506,-0.000014,0.000006,1.000000;;, + 1040;16;0.785779,-0.618507,-0.000000,0.000000,0.618507,0.785779,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,119.231499,-0.000006,0.000003,1.000000;;, + 1120;16;0.789502,-0.613748,-0.000000,0.000000,0.613748,0.789502,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,119.231499,-0.000023,0.000006,1.000000;;, + 1200;16;0.794340,-0.607473,-0.000000,0.000000,0.607473,0.794340,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,119.231499,-0.000002,-0.000001,1.000000;;, + 1280;16;0.803662,-0.595085,0.000000,0.000000,0.595085,0.803663,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,119.231506,-0.000020,0.000005,1.000000;;, + 1360;16;0.814971,-0.579501,0.000000,0.000000,0.579501,0.814971,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,119.231499,-0.000012,0.000003,1.000000;;, + 1440;16;0.829500,-0.558507,0.000000,0.000000,0.558507,0.829500,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,119.231514,-0.000009,0.000001,1.000000;;, + 1520;16;0.847784,-0.530342,-0.000000,0.000000,0.530342,0.847784,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,119.231506,0.000008,-0.000001,1.000000;;, + 1600;16;0.867527,-0.497391,-0.000000,0.000000,0.497391,0.867527,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,119.231514,-0.000005,0.000004,1.000000;;, + 1680;16;0.887900,-0.460037,0.000000,0.000000,0.460037,0.887900,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,119.231522,0.000010,-0.000002,1.000000;;, + 1760;16;0.908067,-0.418825,-0.000000,0.000000,0.418825,0.908067,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,119.231506,-0.000008,0.000003,1.000000;;, + 1840;16;0.926226,-0.376969,0.000000,0.000000,0.376968,0.926226,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,119.231491,0.000014,0.000001,1.000000;;, + 1920;16;0.942370,-0.334573,0.000000,0.000000,0.334573,0.942370,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,119.231506,0.000007,0.000003,1.000000;;, + 2000;16;0.944301,-0.329084,0.000000,0.000000,0.329084,0.944301,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,119.231506,-0.000000,0.000002,1.000000;;, + 2080;16;0.943450,-0.331516,-0.000000,0.000000,0.331516,0.943450,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,119.231499,0.000019,-0.000003,1.000000;;, + 2160;16;0.931197,-0.364515,-0.000000,0.000000,0.364515,0.931197,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,119.231499,-0.000000,0.000000,1.000000;;, + 2240;16;0.918168,-0.396191,-0.000000,0.000000,0.396191,0.918168,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,119.231499,0.000011,-0.000004,1.000000;;, + 2320;16;0.914538,-0.404499,0.000000,0.000000,0.404499,0.914538,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,119.231514,-0.000010,-0.000001,1.000000;;, + 2400;16;0.913027,-0.407898,-0.000000,0.000000,0.407898,0.913028,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,119.231506,0.000013,-0.000001,1.000000;;, + 2480;16;0.908578,-0.417715,-0.000000,0.000000,0.417715,0.908578,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,119.231491,0.000001,-0.000001,1.000000;;, + 2560;16;0.904021,-0.427488,0.000000,0.000000,0.427488,0.904021,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,119.231491,-0.000007,0.000003,1.000000;;, + 2640;16;0.887853,-0.460127,0.000000,0.000000,0.460127,0.887853,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,119.231522,0.000017,-0.000005,1.000000;;, + 2720;16;0.870501,-0.492167,0.000000,0.000000,0.492167,0.870501,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,119.231499,-0.000000,0.000000,1.000000;;, + 2800;16;0.841677,-0.539981,-0.000000,0.000000,0.539981,0.841677,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,119.231499,-0.000001,0.000001,1.000000;;, + 2880;16;0.810227,-0.586117,0.000000,0.000000,0.586117,0.810227,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,119.231499,0.000018,-0.000004,1.000000;;, + 2960;16;0.778798,-0.627275,0.000000,0.000000,0.627275,0.778798,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,119.231506,0.000008,-0.000006,1.000000;;, + 3040;16;0.745275,-0.666757,-0.000000,0.000000,0.666757,0.745275,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,119.231514,-0.000001,0.000000,1.000000;;, + 3120;16;0.728440,-0.685110,0.000000,0.000000,0.685110,0.728439,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,119.231499,-0.000004,0.000003,1.000000;;, + 3200;16;0.711169,-0.703021,0.000000,0.000000,0.703021,0.711169,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,119.231506,-0.000007,0.000002,1.000000;;, + 3280;16;0.735082,-0.677978,-0.000000,0.000000,0.677978,0.735082,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,119.231506,-0.000010,0.000000,1.000000;;, + 3360;16;0.747912,-0.663797,-0.000000,0.000000,0.663798,0.747912,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,119.231514,0.000017,-0.000007,1.000000;;, + 3440;16;0.692942,-0.720993,-0.000000,0.000000,0.720993,0.692942,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,119.231499,0.000020,-0.000003,1.000000;;, + 3520;16;0.618723,-0.785609,0.000000,0.000000,0.785609,0.618723,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,119.231514,0.000003,-0.000002,1.000000;;, + 3600;16;0.568878,-0.822422,0.000000,0.000000,0.822422,0.568878,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,119.231514,0.000002,-0.000004,1.000000;;, + 3680;16;0.538025,-0.842929,0.000000,0.000000,0.842929,0.538025,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,119.231514,-0.000004,0.000002,1.000000;;, + 3760;16;0.538263,-0.842777,0.000000,0.000000,0.842777,0.538264,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,119.231491,0.000011,-0.000005,1.000000;;, + 3840;16;0.556128,-0.831097,0.000000,0.000000,0.831097,0.556128,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,119.231514,0.000010,-0.000007,1.000000;;, + 3920;16;0.580332,-0.814380,0.000000,0.000000,0.814380,0.580332,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,119.231514,-0.000009,0.000003,1.000000;;, + 4000;16;0.612475,-0.790490,0.000000,0.000000,0.790490,0.612475,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,119.231514,-0.000020,0.000009,1.000000;;, + 4080;16;0.650734,-0.759306,0.000000,0.000000,0.759306,0.650734,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,119.231506,-0.000007,0.000001,1.000000;;, + 4160;16;0.693185,-0.720759,-0.000000,0.000000,0.720760,0.693185,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,119.231506,0.000024,-0.000009,1.000000;;, + 4240;16;0.736246,-0.676714,0.000000,0.000000,0.676714,0.736246,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,119.231514,0.000018,-0.000011,1.000000;;, + 4320;16;0.782863,-0.622194,-0.000000,0.000000,0.622194,0.782863,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,119.231514,0.000011,-0.000009,1.000000;;, + 4400;16;0.834057,-0.551678,-0.000000,0.000000,0.551678,0.834057,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,119.231499,0.000028,-0.000016,1.000000;;, + 4480;16;0.885285,-0.465049,0.000000,0.000000,0.465049,0.885285,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,119.231522,0.000006,-0.000006,1.000000;;, + 4560;16;0.933661,-0.358157,-0.000000,0.000000,0.358157,0.933661,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,119.231491,0.000025,-0.000013,1.000000;;, + 4640;16;0.970815,-0.239830,-0.000000,0.000000,0.239830,0.970815,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,119.231476,-0.000004,0.000002,1.000000;;, + 4720;16;0.992635,-0.121142,0.000000,0.000000,0.121142,0.992635,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,119.231483,0.000008,-0.000000,1.000000;;, + 4800;16;1.000000,-0.000691,-0.000000,0.000000,0.000691,1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,119.231522,0.000021,-0.000011,1.000000;;, + 4960;16;1.000000,-0.000691,-0.000000,0.000000,0.000691,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,119.231514,-0.000005,0.000001,1.000000;;; + } + { Bip01_R_Calf } + } + + Animation { + + + AnimationKey { + 4; + 62; + 0;16;0.968778,0.242973,0.049336,0.000000,-0.242361,0.970017,-0.018119,0.000000,-0.052260,0.005597,0.998618,0.000000,119.231522,-0.000002,0.000002,1.000000;;, + 80;16;0.961616,0.269772,0.050179,0.000000,-0.268547,0.962804,-0.029856,0.000000,-0.056367,0.015235,0.998294,0.000000,119.231529,-0.000013,0.000004,1.000000;;, + 160;16;0.956946,0.285763,0.050931,0.000000,-0.284133,0.958073,-0.036938,0.000000,-0.059351,0.020876,0.998019,0.000000,119.231491,0.000001,-0.000003,1.000000;;, + 240;16;0.949554,0.309198,0.052383,0.000000,-0.306909,0.950557,-0.047416,0.000000,-0.064454,0.028947,0.997501,0.000000,119.231491,0.000013,-0.000003,1.000000;;, + 320;16;0.941553,0.332466,0.054256,0.000000,-0.329428,0.942402,-0.057929,0.000000,-0.070390,0.036669,0.996845,0.000000,119.231491,0.000004,0.000001,1.000000;;, + 400;16;0.934630,0.351170,0.056087,0.000000,-0.347449,0.935341,-0.066452,0.000000,-0.075797,0.042621,0.996212,0.000000,119.231522,-0.000004,-0.000001,1.000000;;, + 480;16;0.927307,0.369747,0.058206,0.000000,-0.365269,0.927878,-0.074976,0.000000,-0.081730,0.048265,0.995485,0.000000,119.231514,0.000006,0.000000,1.000000;;, + 560;16;0.947979,0.312243,0.061972,0.000000,-0.307242,0.948384,-0.078548,0.000000,-0.083299,0.055421,0.994982,0.000000,119.231483,0.000002,0.000000,1.000000;;, + 640;16;0.965072,0.253591,0.065789,0.000000,-0.248051,0.965269,-0.082018,0.000000,-0.084303,0.062834,0.994457,0.000000,119.231514,0.000025,-0.000004,1.000000;;, + 720;16;0.952754,0.296732,0.064877,0.000000,-0.291600,0.953349,-0.078073,0.000000,-0.085017,0.055466,0.994834,0.000000,119.231506,0.000021,-0.000005,1.000000;;, + 800;16;0.942792,0.327248,0.063655,0.000000,-0.322237,0.943467,-0.077679,0.000000,-0.085477,0.052723,0.994944,0.000000,119.231491,0.000017,-0.000006,1.000000;;, + 880;16;0.945118,0.318768,0.071687,0.000000,-0.314227,0.946918,-0.067881,0.000000,-0.089520,0.041629,0.995115,0.000000,119.231499,0.000032,-0.000006,1.000000;;, + 960;16;0.949310,0.304217,0.079135,0.000000,-0.300018,0.952000,-0.060710,0.000000,-0.093805,0.033891,0.995014,0.000000,119.231506,0.000007,-0.000003,1.000000;;, + 1040;16;0.954730,0.284711,0.086197,0.000000,-0.280703,0.958173,-0.055767,0.000000,-0.098469,0.029047,0.994716,0.000000,119.231529,0.000002,0.000001,1.000000;;, + 1120;16;0.960945,0.260642,0.093010,0.000000,-0.256682,0.965070,-0.052479,0.000000,-0.103440,0.026555,0.994281,0.000000,119.231514,0.000020,-0.000003,1.000000;;, + 1200;16;0.959528,0.266249,0.091746,0.000000,-0.261187,0.963192,-0.063574,0.000000,-0.105295,0.037039,0.993751,0.000000,119.231499,0.000007,-0.000002,1.000000;;, + 1280;16;0.959127,0.268209,0.090224,0.000000,-0.261922,0.962114,-0.075715,0.000000,-0.107113,0.048988,0.993039,0.000000,119.231506,0.000018,-0.000007,1.000000;;, + 1360;16;0.955512,0.283673,0.080786,0.000000,-0.277209,0.957255,-0.082575,0.000000,-0.100757,0.056507,0.993305,0.000000,119.231506,-0.000005,0.000000,1.000000;;, + 1440;16;0.952631,0.295732,0.070969,0.000000,-0.289172,0.953054,-0.089822,0.000000,-0.094201,0.065045,0.993426,0.000000,119.231499,-0.000014,0.000009,1.000000;;, + 1520;16;0.954221,0.292597,0.062040,0.000000,-0.287759,0.954648,-0.076430,0.000000,-0.081589,0.055078,0.995143,0.000000,119.231499,0.000002,-0.000004,1.000000;;, + 1600;16;0.956422,0.287048,0.053486,0.000000,-0.283651,0.956852,-0.063058,0.000000,-0.069279,0.045138,0.996576,0.000000,119.231491,0.000001,-0.000005,1.000000;;, + 1680;16;0.959114,0.279358,0.045371,0.000000,-0.277210,0.959592,-0.048358,0.000000,-0.057047,0.033803,0.997799,0.000000,119.231499,-0.000008,-0.000001,1.000000;;, + 1760;16;0.962123,0.269997,0.037695,0.000000,-0.268835,0.962615,-0.033178,0.000000,-0.045244,0.021788,0.998738,0.000000,119.231499,0.000015,-0.000006,1.000000;;, + 1840;16;0.962117,0.271123,0.028679,0.000000,-0.269985,0.962110,-0.038108,0.000000,-0.037925,0.028921,0.998862,0.000000,119.231491,-0.000004,-0.000002,1.000000;;, + 1920;16;0.962055,0.272157,0.019505,0.000000,-0.271184,0.961617,-0.041862,0.000000,-0.030149,0.034984,0.998933,0.000000,119.231499,-0.000008,-0.000001,1.000000;;, + 2000;16;0.954595,0.297496,0.015627,0.000000,-0.296517,0.953896,-0.046475,0.000000,-0.028733,0.039731,0.998797,0.000000,119.231491,0.000012,-0.000003,1.000000;;, + 2080;16;0.945039,0.326757,0.011431,0.000000,-0.325822,0.944092,-0.050296,0.000000,-0.027226,0.043807,0.998669,0.000000,119.231476,-0.000017,0.000006,1.000000;;, + 2160;16;0.929391,0.368812,0.014497,0.000000,-0.367984,0.928921,-0.041145,0.000000,-0.028641,0.032905,0.999048,0.000000,119.231499,-0.000003,0.000002,1.000000;;, + 2240;16;0.911959,0.409892,0.017853,0.000000,-0.409216,0.911864,-0.032326,0.000000,-0.029530,0.022175,0.999318,0.000000,119.231506,-0.000002,0.000003,1.000000;;, + 2320;16;0.897343,0.441136,0.013243,0.000000,-0.440449,0.897039,-0.036404,0.000000,-0.027938,0.026834,0.999249,0.000000,119.231506,0.000025,-0.000004,1.000000;;, + 2400;16;0.882926,0.469438,0.008413,0.000000,-0.468778,0.882405,-0.040114,0.000000,-0.026255,0.031473,0.999160,0.000000,119.231514,0.000007,-0.000002,1.000000;;, + 2480;16;0.871719,0.490003,0.001830,0.000000,-0.488862,0.869932,-0.065059,0.000000,-0.033471,0.055819,0.997880,0.000000,119.231491,0.000006,0.000001,1.000000;;, + 2560;16;0.862916,0.505338,-0.002894,0.000000,-0.503552,0.859356,-0.089117,0.000000,-0.042548,0.078358,0.996017,0.000000,119.231476,0.000015,-0.000005,1.000000;;, + 2640;16;0.851604,0.524175,0.003224,0.000000,-0.520013,0.845585,-0.120719,0.000000,-0.066004,0.101128,0.992682,0.000000,119.231514,-0.000008,-0.000003,1.000000;;, + 2720;16;0.844668,0.535099,0.014346,0.000000,-0.527177,0.836215,-0.151094,0.000000,-0.092846,0.120062,0.988415,0.000000,119.231491,0.000021,-0.000007,1.000000;;, + 2800;16;0.842347,0.537394,0.040743,0.000000,-0.522436,0.832783,-0.183122,0.000000,-0.132338,0.132967,0.982246,0.000000,119.231491,0.000019,-0.000007,1.000000;;, + 2880;16;0.847564,0.524947,0.077888,0.000000,-0.500331,0.839350,-0.212510,0.000000,-0.176932,0.141146,0.974050,0.000000,119.231491,0.000008,-0.000007,1.000000;;, + 2960;16;0.862664,0.489335,0.127914,0.000000,-0.452684,0.859806,-0.236242,0.000000,-0.225583,0.145893,0.963238,0.000000,119.231506,0.000004,0.000001,1.000000;;, + 3040;16;0.883839,0.425545,0.194266,0.000000,-0.374392,0.892473,-0.251640,0.000000,-0.280461,0.149678,0.948124,0.000000,119.231506,-0.000006,-0.000000,1.000000;;, + 3120;16;0.912598,0.319880,0.254641,0.000000,-0.255694,0.932509,-0.255046,0.000000,-0.319039,0.167644,0.932797,0.000000,119.231506,0.000024,-0.000009,1.000000;;, + 3200;16;0.928966,0.153149,0.336999,0.000000,-0.073022,0.968328,-0.238766,0.000000,-0.362892,0.197198,0.910726,0.000000,119.231483,0.000025,-0.000008,1.000000;;, + 3280;16;0.937054,0.115470,0.329539,0.000000,-0.042454,0.974414,-0.220714,0.000000,-0.346593,0.192831,0.917981,0.000000,119.231491,0.000020,-0.000004,1.000000;;, + 3360;16;0.949507,0.045192,0.310475,0.000000,0.012573,0.983296,-0.181577,0.000000,-0.313494,0.176312,0.933079,0.000000,119.231514,0.000004,-0.000000,1.000000;;, + 3440;16;0.959181,-0.032297,0.280942,0.000000,0.070203,0.989553,-0.125924,0.000000,-0.273940,0.140507,0.951428,0.000000,119.231506,-0.000007,-0.000002,1.000000;;, + 3520;16;0.963427,-0.104243,0.246864,0.000000,0.123716,0.990207,-0.064688,0.000000,-0.237704,0.092863,0.966889,0.000000,119.231506,-0.000002,-0.000002,1.000000;;, + 3600;16;0.964323,-0.151520,0.217080,0.000000,0.157682,0.987426,-0.011249,0.000000,-0.212646,0.045077,0.976089,0.000000,119.231499,0.000002,0.000002,1.000000;;, + 3680;16;0.965890,-0.170849,0.194596,0.000000,0.167334,0.985297,0.034484,0.000000,-0.197626,-0.000745,0.980277,0.000000,119.231468,0.000007,-0.000011,1.000000;;, + 3760;16;0.970914,-0.148335,0.187941,0.000000,0.138962,0.988344,0.062179,0.000000,-0.194974,-0.034254,0.980210,0.000000,119.231522,0.000009,0.000002,1.000000;;, + 3840;16;0.976399,-0.100533,0.191150,0.000000,0.087220,0.993221,0.076851,0.000000,-0.197580,-0.058365,0.978548,0.000000,119.231514,0.000010,0.000001,1.000000;;, + 3920;16;0.979355,-0.036699,0.198787,0.000000,0.020678,0.996411,0.082076,0.000000,-0.201086,-0.076271,0.976600,0.000000,119.231483,0.000022,-0.000013,1.000000;;, + 4000;16;0.977445,0.036592,0.207995,0.000000,-0.053320,0.995727,0.075395,0.000000,-0.204348,-0.084785,0.975220,0.000000,119.231491,0.000020,-0.000018,1.000000;;, + 4080;16;0.970276,0.111665,0.214698,0.000000,-0.126820,0.990222,0.058118,0.000000,-0.206109,-0.083619,0.974950,0.000000,119.231483,0.000014,-0.000012,1.000000;;, + 4160;16;0.959692,0.180561,0.215382,0.000000,-0.192249,0.980742,0.034431,0.000000,-0.205018,-0.074450,0.975923,0.000000,119.231522,-0.000024,0.000010,1.000000;;, + 4240;16;0.949330,0.234824,0.208878,0.000000,-0.242488,0.970086,0.011497,0.000000,-0.199930,-0.061565,0.977874,0.000000,119.231514,-0.000033,0.000018,1.000000;;, + 4320;16;0.942611,0.270034,0.196382,0.000000,-0.273834,0.961743,-0.008064,0.000000,-0.191047,-0.046175,0.980494,0.000000,119.231483,-0.000004,-0.000003,1.000000;;, + 4400;16;0.943918,0.276524,0.180428,0.000000,-0.277778,0.960461,-0.018793,0.000000,-0.178491,-0.032379,0.983409,0.000000,119.231506,-0.000021,0.000012,1.000000;;, + 4480;16;0.950802,0.263535,0.162863,0.000000,-0.263183,0.964444,-0.024133,0.000000,-0.163432,-0.019916,0.986354,0.000000,119.231476,-0.000019,0.000005,1.000000;;, + 4560;16;0.961555,0.233630,0.144324,0.000000,-0.232262,0.972292,-0.026493,0.000000,-0.146514,-0.008047,0.989176,0.000000,119.231476,-0.000045,0.000023,1.000000;;, + 4640;16;0.972677,0.195524,0.125179,0.000000,-0.193671,0.980697,-0.026926,0.000000,-0.128027,0.001947,0.991769,0.000000,119.231506,0.000011,-0.000006,1.000000;;, + 4720;16;0.981532,0.160253,0.104474,0.000000,-0.158198,0.987018,-0.027719,0.000000,-0.107560,0.010679,0.994141,0.000000,119.231483,0.000002,-0.000002,1.000000;;, + 4800;16;0.988831,0.124156,0.082452,0.000000,-0.122246,0.992109,-0.027835,0.000000,-0.085257,0.017445,0.996206,0.000000,119.231476,-0.000039,0.000023,1.000000;;, + 4960;16;0.968778,0.242973,0.049336,0.000000,-0.242361,0.970017,-0.018119,0.000000,-0.052260,0.005597,0.998618,0.000000,119.231522,-0.000002,0.000002,1.000000;;; + } + { Bip01_R_Foot } + } + + Animation { + + + AnimationKey { + 4; + 62; + 0;16;0.000000,1.000000,-0.000000,0.000000,-1.000000,0.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,27.423256,34.577141,-0.000001,1.000000;;, + 80;16;0.000000,1.000000,-0.000000,0.000000,-1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,27.423260,34.577141,-0.000001,1.000000;;, + 160;16;0.000000,1.000000,-0.000000,0.000000,-1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,27.423243,34.577141,-0.000002,1.000000;;, + 240;16;0.000000,1.000000,-0.000000,0.000000,-1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,27.423237,34.577122,0.000005,1.000000;;, + 320;16;0.000000,1.000000,-0.000000,0.000000,-1.000000,0.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,27.423248,34.577145,-0.000002,1.000000;;, + 400;16;0.000000,1.000000,-0.000000,0.000000,-1.000000,0.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,27.423233,34.577118,0.000006,1.000000;;, + 480;16;0.000000,1.000000,0.000000,0.000000,-1.000000,0.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,27.423246,34.577118,0.000003,1.000000;;, + 560;16;0.000000,1.000000,0.000000,0.000000,-1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,27.423237,34.577145,0.000000,1.000000;;, + 640;16;0.000000,1.000000,0.000000,0.000000,-1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,27.423241,34.577129,0.000002,1.000000;;, + 720;16;0.000000,1.000000,-0.000000,0.000000,-1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,27.423254,34.577126,-0.000001,1.000000;;, + 800;16;0.000000,1.000000,0.000000,0.000000,-1.000000,0.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,27.423248,34.577126,0.000004,1.000000;;, + 880;16;0.000000,1.000000,-0.000000,0.000000,-1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,27.423239,34.577137,-0.000002,1.000000;;, + 960;16;0.000000,1.000000,0.000000,0.000000,-1.000000,0.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,27.423252,34.577133,-0.000001,1.000000;;, + 1040;16;0.000000,1.000000,-0.000000,0.000000,-1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,27.423252,34.577129,0.000002,1.000000;;, + 1120;16;0.000000,1.000000,0.000000,0.000000,-1.000000,0.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,27.423243,34.577133,0.000004,1.000000;;, + 1200;16;0.000000,1.000000,0.000000,0.000000,-1.000000,0.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,27.423243,34.577137,0.000003,1.000000;;, + 1280;16;0.000000,1.000000,0.000000,0.000000,-1.000000,0.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,27.423254,34.577126,0.000000,1.000000;;, + 1360;16;0.000000,1.000000,0.000000,0.000000,-1.000000,0.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,27.423246,34.577145,0.000000,1.000000;;, + 1440;16;0.000000,1.000000,-0.000000,0.000000,-1.000000,0.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,27.423246,34.577141,-0.000001,1.000000;;, + 1520;16;0.000000,1.000000,-0.000000,0.000000,-1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,27.423250,34.577145,0.000000,1.000000;;, + 1600;16;0.000000,1.000000,0.000000,0.000000,-1.000000,0.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,27.423252,34.577126,0.000005,1.000000;;, + 1680;16;0.000000,1.000000,-0.000000,0.000000,-1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,27.423244,34.577145,-0.000002,1.000000;;, + 1760;16;0.000000,1.000000,0.000000,0.000000,-1.000000,0.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,27.423264,34.577141,-0.000001,1.000000;;, + 1840;16;0.000000,1.000000,-0.000000,0.000000,-1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,27.423239,34.577133,0.000002,1.000000;;, + 1920;16;0.000000,1.000000,-0.000000,0.000000,-1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,27.423254,34.577148,0.000000,1.000000;;, + 2000;16;0.000000,1.000000,0.000000,0.000000,-1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,27.423231,34.577152,-0.000002,1.000000;;, + 2080;16;0.000000,1.000000,-0.000000,0.000000,-1.000000,0.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,27.423248,34.577145,-0.000002,1.000000;;, + 2160;16;0.000000,1.000000,-0.000000,0.000000,-1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,27.423264,34.577126,0.000001,1.000000;;, + 2240;16;0.000000,1.000000,0.000000,0.000000,-1.000000,0.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,27.423244,34.577145,0.000000,1.000000;;, + 2320;16;0.000000,1.000000,0.000000,0.000000,-1.000000,0.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,27.423246,34.577126,0.000003,1.000000;;, + 2400;16;0.000000,1.000000,-0.000000,0.000000,-1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,27.423254,34.577122,0.000004,1.000000;;, + 2480;16;0.024776,0.999689,-0.002694,0.000000,-0.999680,0.024761,-0.005212,0.000000,-0.005144,0.002822,0.999983,0.000000,27.423239,34.577126,0.000006,1.000000;;, + 2560;16;0.044065,0.999017,-0.004895,0.000000,-0.998990,0.044020,-0.008951,0.000000,-0.008727,0.005284,0.999948,0.000000,27.423248,34.577118,0.000004,1.000000;;, + 2640;16;0.115791,0.993154,-0.015418,0.000000,-0.993024,0.115400,-0.024201,0.000000,-0.022256,0.018112,0.999588,0.000000,27.423241,34.577133,-0.000000,1.000000;;, + 2720;16;0.177487,0.983804,-0.025052,0.000000,-0.983603,0.176508,-0.037004,0.000000,-0.031983,0.031208,0.999001,0.000000,27.423243,34.577141,0.000001,1.000000;;, + 2800;16;0.240793,0.969825,-0.038193,0.000000,-0.969821,0.238867,-0.048881,0.000000,-0.038283,0.048810,0.998074,0.000000,27.423264,34.577126,0.000001,1.000000;;, + 2880;16;0.286167,0.956856,-0.050355,0.000000,-0.957322,0.283293,-0.057265,0.000000,-0.040530,0.064593,0.997088,0.000000,27.423264,34.577122,0.000002,1.000000;;, + 2960;16;0.286216,0.956506,-0.056368,0.000000,-0.957519,0.283368,-0.053482,0.000000,-0.035183,0.069281,0.996977,0.000000,27.423243,34.577133,0.000004,1.000000;;, + 3040;16;0.260367,0.963717,-0.058811,0.000000,-0.965111,0.258026,-0.044523,0.000000,-0.027733,0.068352,0.997276,0.000000,27.423264,34.577133,-0.000003,1.000000;;, + 3120;16;0.155009,0.987246,-0.036283,0.000000,-0.987737,0.154184,-0.024549,0.000000,-0.018642,0.039643,0.999040,0.000000,27.423260,34.577133,-0.000001,1.000000;;, + 3200;16;0.000000,1.000000,-0.000000,0.000000,-1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,27.423254,34.577126,-0.000004,1.000000;;, + 3280;16;0.000000,1.000000,-0.000000,0.000000,-1.000000,0.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,27.423252,34.577156,0.000000,1.000000;;, + 3360;16;0.000000,1.000000,0.000000,0.000000,-1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,27.423235,34.577148,0.000001,1.000000;;, + 3440;16;0.000000,1.000000,-0.000000,0.000000,-1.000000,0.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,27.423250,34.577133,-0.000003,1.000000;;, + 3520;16;0.000000,1.000000,-0.000000,0.000000,-1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,27.423254,34.577137,-0.000004,1.000000;;, + 3600;16;0.000000,1.000000,-0.000000,0.000000,-1.000000,0.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,27.423254,34.577141,0.000003,1.000000;;, + 3680;16;0.000000,1.000000,0.000000,0.000000,-1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,27.423246,34.577141,0.000001,1.000000;;, + 3760;16;0.000000,1.000000,-0.000000,0.000000,-1.000000,0.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,27.423243,34.577137,0.000006,1.000000;;, + 3840;16;0.000000,1.000000,0.000000,0.000000,-1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,27.423250,34.577126,0.000009,1.000000;;, + 3920;16;0.000000,1.000000,-0.000000,0.000000,-1.000000,0.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,27.423264,34.577133,0.000002,1.000000;;, + 4000;16;0.000000,1.000000,0.000000,0.000000,-1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,27.423225,34.577141,-0.000002,1.000000;;, + 4080;16;0.000000,1.000000,0.000000,0.000000,-1.000000,0.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,27.423256,34.577133,-0.000001,1.000000;;, + 4160;16;0.000000,1.000000,0.000000,0.000000,-1.000000,0.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,27.423248,34.577114,0.000016,1.000000;;, + 4240;16;0.000000,1.000000,0.000000,0.000000,-1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,27.423229,34.577160,-0.000016,1.000000;;, + 4320;16;0.000000,1.000000,-0.000000,0.000000,-1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,27.423254,34.577152,-0.000008,1.000000;;, + 4400;16;0.000000,1.000000,-0.000000,0.000000,-1.000000,0.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,27.423243,34.577137,0.000001,1.000000;;, + 4480;16;0.000000,1.000000,-0.000000,0.000000,-1.000000,0.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,27.423248,34.577156,-0.000007,1.000000;;, + 4560;16;0.000000,1.000000,0.000000,0.000000,-1.000000,0.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,27.423246,34.577122,0.000004,1.000000;;, + 4640;16;0.000000,1.000000,0.000000,0.000000,-1.000000,0.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,27.423243,34.577122,0.000004,1.000000;;, + 4720;16;0.000000,1.000000,-0.000000,0.000000,-1.000000,0.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,27.423264,34.577164,-0.000009,1.000000;;, + 4800;16;0.000000,1.000000,0.000000,0.000000,-1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,27.423260,34.577152,-0.000010,1.000000;;, + 4960;16;0.000000,1.000000,-0.000000,0.000000,-1.000000,0.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,27.423256,34.577141,-0.000001,1.000000;;; + } + { Bip01_R_Toe0 } + } + + Animation { + + + AnimationKey { + 4; + 62; + 0;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,15.738550,-0.000017,-0.000003,1.000000;;, + 80;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,15.738570,0.000009,0.000001,1.000000;;, + 160;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,15.738559,-0.000016,0.000003,1.000000;;, + 240;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,15.738566,-0.000021,-0.000003,1.000000;;, + 320;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,15.738569,-0.000017,-0.000004,1.000000;;, + 400;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,15.738562,0.000016,-0.000001,1.000000;;, + 480;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,15.738554,-0.000006,0.000001,1.000000;;, + 560;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,15.738573,-0.000013,-0.000002,1.000000;;, + 640;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,15.738546,0.000014,0.000001,1.000000;;, + 720;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,15.738572,-0.000015,-0.000003,1.000000;;, + 800;16;1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,15.738565,-0.000003,-0.000002,1.000000;;, + 880;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,15.738555,-0.000002,-0.000002,1.000000;;, + 960;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,15.738550,0.000001,0.000002,1.000000;;, + 1040;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,15.738564,-0.000014,-0.000003,1.000000;;, + 1120;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,15.738560,-0.000017,-0.000002,1.000000;;, + 1200;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,15.738569,0.000010,-0.000004,1.000000;;, + 1280;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,15.738572,0.000021,-0.000003,1.000000;;, + 1360;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,15.738555,0.000018,0.000000,1.000000;;, + 1440;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,15.738553,0.000010,-0.000001,1.000000;;, + 1520;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,15.738554,-0.000013,-0.000002,1.000000;;, + 1600;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,15.738569,0.000017,-0.000002,1.000000;;, + 1680;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,15.738546,0.000001,0.000001,1.000000;;, + 1760;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,15.738545,-0.000005,0.000004,1.000000;;, + 1840;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,15.738573,0.000006,-0.000004,1.000000;;, + 1920;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,15.738564,0.000001,0.000000,1.000000;;, + 2000;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,15.738553,-0.000003,-0.000000,1.000000;;, + 2080;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,15.738568,-0.000013,-0.000007,1.000000;;, + 2160;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,15.738563,0.000001,-0.000003,1.000000;;, + 2240;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,15.738546,-0.000010,0.000004,1.000000;;, + 2320;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,15.738555,0.000009,0.000001,1.000000;;, + 2400;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,15.738561,-0.000011,-0.000002,1.000000;;, + 2480;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,15.738555,0.000004,-0.000001,1.000000;;, + 2560;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,15.738554,-0.000003,-0.000003,1.000000;;, + 2640;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,15.738580,-0.000005,-0.000007,1.000000;;, + 2720;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,15.738547,0.000002,-0.000000,1.000000;;, + 2800;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,15.738557,0.000008,-0.000001,1.000000;;, + 2880;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,15.738566,-0.000006,-0.000001,1.000000;;, + 2960;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,15.738572,0.000009,-0.000003,1.000000;;, + 3040;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,15.738565,-0.000010,-0.000004,1.000000;;, + 3120;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,15.738559,0.000005,-0.000002,1.000000;;, + 3200;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,15.738583,0.000002,-0.000004,1.000000;;, + 3280;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,15.738565,0.000011,-0.000003,1.000000;;, + 3360;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,15.738559,-0.000004,-0.000001,1.000000;;, + 3440;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,15.738562,0.000010,-0.000000,1.000000;;, + 3520;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,15.738569,0.000010,0.000005,1.000000;;, + 3600;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,15.738554,0.000004,-0.000001,1.000000;;, + 3680;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,15.738561,-0.000015,-0.000001,1.000000;;, + 3760;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,15.738567,-0.000010,-0.000000,1.000000;;, + 3840;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,15.738560,-0.000001,-0.000002,1.000000;;, + 3920;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,15.738556,0.000008,-0.000003,1.000000;;, + 4000;16;1.000000,-0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,15.738570,0.000005,-0.000004,1.000000;;, + 4080;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,15.738561,-0.000005,-0.000003,1.000000;;, + 4160;16;1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,15.738545,-0.000018,0.000004,1.000000;;, + 4240;16;1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,15.738561,0.000007,0.000004,1.000000;;, + 4320;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,-0.000000,-0.000000,1.000000,0.000000,15.738585,0.000006,-0.000014,1.000000;;, + 4400;16;1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,-0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,15.738553,-0.000006,0.000002,1.000000;;, + 4480;16;1.000000,0.000000,-0.000000,0.000000,-0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,15.738564,0.000006,-0.000004,1.000000;;, + 4560;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,15.738543,0.000010,0.000013,1.000000;;, + 4640;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,15.738590,-0.000006,-0.000010,1.000000;;, + 4720;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,-0.000000,1.000000,0.000000,15.738582,-0.000003,-0.000011,1.000000;;, + 4800;16;1.000000,0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,15.738579,0.000004,-0.000012,1.000000;;, + 4960;16;1.000000,-0.000000,-0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-0.000000,0.000000,1.000000,0.000000,15.738550,-0.000017,-0.000003,1.000000;;; + } + { Dummy11 } + } +} \ No newline at end of file diff --git a/Demos/DX11ClothDemo/Media/UI/DXUTShared.fx b/Demos/DX11ClothDemo/Media/UI/DXUTShared.fx new file mode 100644 index 000000000..0da2c6b33 --- /dev/null +++ b/Demos/DX11ClothDemo/Media/UI/DXUTShared.fx @@ -0,0 +1,69 @@ +//-------------------------------------------------------------------------------------- +// File: DXUTShared.fx +// +// +// +// Copyright (c) Microsoft Corporation. All rights reserved. +//-------------------------------------------------------------------------------------- + + +//-------------------------------------------------------------------------------------- +// Global variables +//-------------------------------------------------------------------------------------- +float4 g_MaterialDiffuseColor; // Material's diffuse color +float3 g_LightDir; // Light's direction in world space +float4x4 g_mWorld; // World matrix for object +float4x4 g_mWorldViewProjection; // World * View * Projection matrix + + + +//-------------------------------------------------------------------------------------- +// Vertex shader output structure +//-------------------------------------------------------------------------------------- +struct VS_OUTPUT +{ + float4 Position : POSITION; // vertex position + float4 Diffuse : COLOR0; // vertex diffuse color +}; + + +//-------------------------------------------------------------------------------------- +// This shader computes standard transform and lighting +//-------------------------------------------------------------------------------------- +VS_OUTPUT RenderWith1LightNoTextureVS( float4 vPos : POSITION, + float3 vNormal : NORMAL ) +{ + VS_OUTPUT Output; + + // Transform the position from object space to homogeneous projection space + Output.Position = mul(vPos, g_mWorldViewProjection); + + // Transform the normal from object space to world space + float3 vNormalWorldSpace; + vNormalWorldSpace = normalize(mul(vNormal, (float3x3)g_mWorld)); // normal (world space) + + // Compute simple directional lighting equation + Output.Diffuse.rgb = g_MaterialDiffuseColor * max(0,dot(vNormalWorldSpace, g_LightDir)); + Output.Diffuse.a = 1.0f; + + return Output; +} + + +//-------------------------------------------------------------------------------------- +float4 RenderWith1LightNoTexturePS( float4 Diffuse : COLOR0 ) : COLOR0 +{ + return Diffuse; +} + + +//-------------------------------------------------------------------------------------- +technique RenderWith1LightNoTexture +{ + pass P0 + { + VertexShader = compile vs_1_1 RenderWith1LightNoTextureVS(); + PixelShader = compile ps_1_1 RenderWith1LightNoTexturePS(); + } +} + diff --git a/Demos/DX11ClothDemo/Media/UI/Font.dds b/Demos/DX11ClothDemo/Media/UI/Font.dds new file mode 100644 index 000000000..37514f5bf Binary files /dev/null and b/Demos/DX11ClothDemo/Media/UI/Font.dds differ diff --git a/Demos/DX11ClothDemo/Media/UI/arrow.x b/Demos/DX11ClothDemo/Media/UI/arrow.x new file mode 100644 index 000000000..54a96a4ff --- /dev/null +++ b/Demos/DX11ClothDemo/Media/UI/arrow.x @@ -0,0 +1,1050 @@ +xof 0303txt 0032 +template XSkinMeshHeader { + <3cf169ce-ff7c-44ab-93c0-f78f62d172e2> + WORD nMaxSkinWeightsPerVertex; + WORD nMaxSkinWeightsPerFace; + WORD nBones; +} + +template VertexDuplicationIndices { + + DWORD nIndices; + DWORD nOriginalVertices; + array DWORD indices[nIndices]; +} + +template SkinWeights { + <6f0d123b-bad2-4167-a0d0-80224f25fabb> + STRING transformNodeName; + DWORD nWeights; + array DWORD vertexIndices[nWeights]; + array FLOAT weights[nWeights]; + Matrix4x4 matrixOffset; +} + + +Frame Scene_Root { + + + FrameTransformMatrix { + 1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000;; + } + + Frame Arrow { + + + FrameTransformMatrix { + 0.004058,0.000000,0.000000,0.000000,0.000000,0.000000,0.004058,0.000000,0.000000,-0.004058,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000;; + } + + Frame Cylinder01 { + + + FrameTransformMatrix { + 1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-1.000000,0.000000,0.000000,0.000002,116.363640,0.000002,1.000000;; + } + + Frame { + + + FrameTransformMatrix { + 1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,-0.000000,0.000000,0.000003,1.000000;; + } + + Mesh { + 58; + 0.000000;0.000000;0.000000;, + 24.461134;0.000000;0.000000;, + 22.038719;-10.613288;0.000000;, + 15.251267;-19.124485;0.000000;, + 5.443114;-23.847843;0.000000;, + -5.443115;-23.847841;0.000000;, + -15.251268;-19.124485;0.000000;, + -22.038721;-10.613288;0.000000;, + -24.461134;0.000001;0.000000;, + -22.038719;10.613289;0.000000;, + -15.251266;19.124485;0.000000;, + -5.443113;23.847843;0.000000;, + 5.443115;23.847841;0.000000;, + 15.251268;19.124483;0.000000;, + 22.038721;10.613287;0.000000;, + 24.461134;0.000000;-140.000000;, + 22.038719;-10.613288;-140.000000;, + 15.251267;-19.124485;-140.000000;, + 5.443114;-23.847843;-140.000000;, + -5.443115;-23.847841;-140.000000;, + -15.251268;-19.124485;-140.000000;, + -22.038721;-10.613288;-140.000000;, + -24.461134;0.000001;-140.000000;, + -22.038719;10.613289;-140.000000;, + -15.251266;19.124485;-140.000000;, + -5.443113;23.847843;-140.000000;, + 5.443115;23.847841;-140.000000;, + 15.251268;19.124483;-140.000000;, + 22.038721;10.613287;-140.000000;, + 0.000000;0.000000;-140.000000;, + 24.461134;0.000000;0.000000;, + 22.038719;-10.613288;0.000000;, + 15.251267;-19.124485;0.000000;, + 5.443114;-23.847843;0.000000;, + -5.443115;-23.847841;0.000000;, + -15.251268;-19.124485;0.000000;, + -22.038721;-10.613288;0.000000;, + -24.461134;0.000001;0.000000;, + -22.038719;10.613289;0.000000;, + -15.251266;19.124485;0.000000;, + -5.443113;23.847843;0.000000;, + 5.443115;23.847841;0.000000;, + 15.251268;19.124483;0.000000;, + 22.038721;10.613287;0.000000;, + 24.461134;0.000000;-140.000000;, + 22.038719;-10.613288;-140.000000;, + 15.251267;-19.124485;-140.000000;, + 5.443114;-23.847843;-140.000000;, + -5.443115;-23.847841;-140.000000;, + -15.251268;-19.124485;-140.000000;, + -22.038721;-10.613288;-140.000000;, + -24.461134;0.000001;-140.000000;, + -22.038719;10.613289;-140.000000;, + -15.251266;19.124485;-140.000000;, + -5.443113;23.847843;-140.000000;, + 5.443115;23.847841;-140.000000;, + 15.251268;19.124483;-140.000000;, + 22.038721;10.613287;-140.000000;; + 56; + 3;0,2,1;, + 3;0,3,2;, + 3;0,4,3;, + 3;0,5,4;, + 3;0,6,5;, + 3;0,7,6;, + 3;0,8,7;, + 3;0,9,8;, + 3;0,10,9;, + 3;0,11,10;, + 3;0,12,11;, + 3;0,13,12;, + 3;0,14,13;, + 3;0,1,14;, + 3;30,16,15;, + 3;30,31,16;, + 3;31,17,16;, + 3;31,32,17;, + 3;32,18,17;, + 3;32,33,18;, + 3;33,19,18;, + 3;33,34,19;, + 3;34,20,19;, + 3;34,35,20;, + 3;35,21,20;, + 3;35,36,21;, + 3;36,22,21;, + 3;36,37,22;, + 3;37,23,22;, + 3;37,38,23;, + 3;38,24,23;, + 3;38,39,24;, + 3;39,25,24;, + 3;39,40,25;, + 3;40,26,25;, + 3;40,41,26;, + 3;41,27,26;, + 3;41,42,27;, + 3;42,28,27;, + 3;42,43,28;, + 3;43,15,28;, + 3;43,30,15;, + 3;29,44,45;, + 3;29,45,46;, + 3;29,46,47;, + 3;29,47,48;, + 3;29,48,49;, + 3;29,49,50;, + 3;29,50,51;, + 3;29,51,52;, + 3;29,52,53;, + 3;29,53,54;, + 3;29,54,55;, + 3;29,55,56;, + 3;29,56,57;, + 3;29,57,44;; + + MeshNormals { + 58; + 0.000000;0.000000;1.000000;, + 0.000000;0.000000;1.000000;, + 0.000000;0.000000;1.000000;, + 0.000000;0.000000;1.000000;, + 0.000000;0.000000;1.000000;, + 0.000000;0.000000;1.000000;, + 0.000000;0.000000;1.000000;, + 0.000000;0.000000;1.000000;, + 0.000000;0.000000;1.000000;, + 0.000000;0.000000;1.000000;, + 0.000000;0.000000;1.000000;, + 0.000000;0.000000;1.000000;, + 0.000000;0.000000;1.000000;, + 0.000000;0.000000;1.000000;, + 0.000000;0.000000;1.000000;, + 0.997118;0.075862;0.000000;, + 0.931288;-0.364284;0.000000;, + 0.681004;-0.732279;0.000000;, + 0.295840;-0.955238;0.000000;, + -0.147920;-0.988999;0.000000;, + -0.562382;-0.826878;0.000000;, + -0.865457;-0.500983;0.000000;, + -0.997118;-0.075862;0.000000;, + -0.931288;0.364284;0.000000;, + -0.681004;0.732279;0.000000;, + -0.295840;0.955238;0.000000;, + 0.147920;0.988999;0.000000;, + 0.562382;0.826878;0.000000;, + 0.865457;0.500983;0.000000;, + 0.000000;0.000000;-1.000000;, + 0.997118;-0.075862;0.000000;, + 0.865457;-0.500983;0.000000;, + 0.562382;-0.826878;0.000000;, + 0.147920;-0.988999;0.000000;, + -0.295840;-0.955238;0.000000;, + -0.681004;-0.732279;0.000000;, + -0.931288;-0.364284;0.000000;, + -0.997118;0.075862;0.000000;, + -0.865457;0.500983;0.000000;, + -0.562382;0.826878;0.000000;, + -0.147920;0.988999;0.000000;, + 0.295840;0.955238;0.000000;, + 0.681004;0.732279;0.000000;, + 0.931288;0.364284;0.000000;, + 0.000000;0.000000;-1.000000;, + 0.000000;0.000000;-1.000000;, + 0.000000;0.000000;-1.000000;, + 0.000000;0.000000;-1.000000;, + 0.000000;0.000000;-1.000000;, + 0.000000;0.000000;-1.000000;, + 0.000000;0.000000;-1.000000;, + 0.000000;0.000000;-1.000000;, + 0.000000;0.000000;-1.000000;, + 0.000000;0.000000;-1.000000;, + 0.000000;0.000000;-1.000000;, + 0.000000;0.000000;-1.000000;, + 0.000000;0.000000;-1.000000;, + 0.000000;0.000000;-1.000000;; + 56; + 3;0,2,1;, + 3;0,3,2;, + 3;0,4,3;, + 3;0,5,4;, + 3;0,6,5;, + 3;0,7,6;, + 3;0,8,7;, + 3;0,9,8;, + 3;0,10,9;, + 3;0,11,10;, + 3;0,12,11;, + 3;0,13,12;, + 3;0,14,13;, + 3;0,1,14;, + 3;30,16,15;, + 3;30,31,16;, + 3;31,17,16;, + 3;31,32,17;, + 3;32,18,17;, + 3;32,33,18;, + 3;33,19,18;, + 3;33,34,19;, + 3;34,20,19;, + 3;34,35,20;, + 3;35,21,20;, + 3;35,36,21;, + 3;36,22,21;, + 3;36,37,22;, + 3;37,23,22;, + 3;37,38,23;, + 3;38,24,23;, + 3;38,39,24;, + 3;39,25,24;, + 3;39,40,25;, + 3;40,26,25;, + 3;40,41,26;, + 3;41,27,26;, + 3;41,42,27;, + 3;42,28,27;, + 3;42,43,28;, + 3;43,15,28;, + 3;43,30,15;, + 3;29,44,45;, + 3;29,45,46;, + 3;29,46,47;, + 3;29,47,48;, + 3;29,48,49;, + 3;29,49,50;, + 3;29,50,51;, + 3;29,51,52;, + 3;29,52,53;, + 3;29,53,54;, + 3;29,54,55;, + 3;29,55,56;, + 3;29,56,57;, + 3;29,57,44;; + } + + VertexDuplicationIndices { + 58; + 30; + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28; + } + + MeshMaterialList { + 1; + 56; + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0; + + Material { + 1.000000;1.000000;1.000000;1.000000;; + 0.000000; + 1.000000;1.000000;1.000000;; + 0.000000;0.000000;0.000000;; + } + } + } + } + } + + Frame Cone01 { + + + FrameTransformMatrix { + 1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,-1.000000,0.000000,0.000000,0.000000,116.363640,0.000000,1.000000;; + } + + Frame { + + + FrameTransformMatrix { + 1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000003,1.000000;; + } + + Mesh { + 98; + 0.000000;0.000000;0.000000;, + 58.922840;0.000000;0.000000;, + 56.915092;15.250354;0.000000;, + 51.028675;29.461420;0.000000;, + 41.664738;41.664742;0.000000;, + 29.461418;51.028679;0.000000;, + 15.250351;56.915092;0.000000;, + -0.000003;58.922840;0.000000;, + -15.250356;56.915092;0.000000;, + -29.461424;51.028675;0.000000;, + -41.664742;41.664738;0.000000;, + -51.028679;29.461416;0.000000;, + -56.915092;15.250349;0.000000;, + -58.922840;-0.000005;0.000000;, + -56.915092;-15.250359;0.000000;, + -51.028675;-29.461426;0.000000;, + -41.664734;-41.664745;0.000000;, + -29.461414;-51.028679;0.000000;, + -15.250346;-56.915096;0.000000;, + 0.000008;-58.922840;0.000000;, + 15.250361;-56.915092;0.000000;, + 29.461428;-51.028671;0.000000;, + 41.664745;-41.664734;0.000000;, + 51.028683;-29.461412;0.000000;, + 56.915096;-15.250343;0.000000;, + 0.000000;0.000000;116.363632;, + 0.000000;0.000000;116.363632;, + 0.000000;0.000000;116.363632;, + 0.000000;0.000000;116.363632;, + 0.000000;0.000000;116.363632;, + 0.000000;0.000000;116.363632;, + 0.000000;0.000000;116.363632;, + 0.000000;0.000000;116.363632;, + 0.000000;0.000000;116.363632;, + 0.000000;0.000000;116.363632;, + 0.000000;0.000000;116.363632;, + 0.000000;0.000000;116.363632;, + 0.000000;0.000000;116.363632;, + 0.000000;0.000000;116.363632;, + 0.000000;0.000000;116.363632;, + 0.000000;0.000000;116.363632;, + 0.000000;0.000000;116.363632;, + 0.000000;0.000000;116.363632;, + 0.000000;0.000000;116.363632;, + 0.000000;0.000000;116.363632;, + 0.000000;0.000000;116.363632;, + 0.000000;0.000000;116.363632;, + 0.000000;0.000000;116.363632;, + 0.000000;0.000000;116.363632;, + 0.000000;0.000000;116.363632;, + 58.922840;0.000000;0.000000;, + 56.915092;15.250354;0.000000;, + 51.028675;29.461420;0.000000;, + 41.664738;41.664742;0.000000;, + 29.461418;51.028679;0.000000;, + 15.250351;56.915092;0.000000;, + -0.000003;58.922840;0.000000;, + -15.250356;56.915092;0.000000;, + -29.461424;51.028675;0.000000;, + -41.664742;41.664738;0.000000;, + -51.028679;29.461416;0.000000;, + -56.915092;15.250349;0.000000;, + -58.922840;-0.000005;0.000000;, + -56.915092;-15.250359;0.000000;, + -51.028675;-29.461426;0.000000;, + -41.664734;-41.664745;0.000000;, + -29.461414;-51.028679;0.000000;, + -15.250346;-56.915096;0.000000;, + 0.000008;-58.922840;0.000000;, + 15.250361;-56.915092;0.000000;, + 29.461428;-51.028671;0.000000;, + 41.664745;-41.664734;0.000000;, + 51.028683;-29.461412;0.000000;, + 56.915096;-15.250343;0.000000;, + 0.000000;0.000000;116.363632;, + 0.000000;0.000000;116.363632;, + 0.000000;0.000000;116.363632;, + 0.000000;0.000000;116.363632;, + 0.000000;0.000000;116.363632;, + 0.000000;0.000000;116.363632;, + 0.000000;0.000000;116.363632;, + 0.000000;0.000000;116.363632;, + 0.000000;0.000000;116.363632;, + 0.000000;0.000000;116.363632;, + 0.000000;0.000000;116.363632;, + 0.000000;0.000000;116.363632;, + 0.000000;0.000000;116.363632;, + 0.000000;0.000000;116.363632;, + 0.000000;0.000000;116.363632;, + 0.000000;0.000000;116.363632;, + 0.000000;0.000000;116.363632;, + 0.000000;0.000000;116.363632;, + 0.000000;0.000000;116.363632;, + 0.000000;0.000000;116.363632;, + 0.000000;0.000000;116.363632;, + 0.000000;0.000000;116.363632;, + 0.000000;0.000000;116.363632;, + 0.000000;0.000000;116.363632;; + 96; + 3;0,2,1;, + 3;0,3,2;, + 3;0,4,3;, + 3;0,5,4;, + 3;0,6,5;, + 3;0,7,6;, + 3;0,8,7;, + 3;0,9,8;, + 3;0,10,9;, + 3;0,11,10;, + 3;0,12,11;, + 3;0,13,12;, + 3;0,14,13;, + 3;0,15,14;, + 3;0,16,15;, + 3;0,17,16;, + 3;0,18,17;, + 3;0,19,18;, + 3;0,20,19;, + 3;0,21,20;, + 3;0,22,21;, + 3;0,23,22;, + 3;0,24,23;, + 3;0,1,24;, + 3;50,26,25;, + 3;50,51,26;, + 3;51,27,26;, + 3;51,52,27;, + 3;52,28,27;, + 3;52,53,28;, + 3;53,29,28;, + 3;53,54,29;, + 3;54,30,29;, + 3;54,55,30;, + 3;55,31,30;, + 3;55,56,31;, + 3;56,32,31;, + 3;56,57,32;, + 3;57,33,32;, + 3;57,58,33;, + 3;58,34,33;, + 3;58,59,34;, + 3;59,35,34;, + 3;59,60,35;, + 3;60,36,35;, + 3;60,61,36;, + 3;61,37,36;, + 3;61,62,37;, + 3;62,38,37;, + 3;62,63,38;, + 3;63,39,38;, + 3;63,64,39;, + 3;64,40,39;, + 3;64,65,40;, + 3;65,41,40;, + 3;65,66,41;, + 3;66,42,41;, + 3;66,67,42;, + 3;67,43,42;, + 3;67,68,43;, + 3;68,44,43;, + 3;68,69,44;, + 3;69,45,44;, + 3;69,70,45;, + 3;70,46,45;, + 3;70,71,46;, + 3;71,47,46;, + 3;71,72,47;, + 3;72,48,47;, + 3;72,73,48;, + 3;73,25,48;, + 3;73,50,25;, + 3;49,74,75;, + 3;49,75,76;, + 3;49,76,77;, + 3;49,77,78;, + 3;49,78,79;, + 3;49,79,80;, + 3;49,80,81;, + 3;49,81,82;, + 3;49,82,83;, + 3;49,83,84;, + 3;49,84,85;, + 3;49,85,86;, + 3;49,86,87;, + 3;49,87,88;, + 3;49,88,89;, + 3;49,89,90;, + 3;49,90,91;, + 3;49,91,92;, + 3;49,92,93;, + 3;49,93,94;, + 3;49,94,95;, + 3;49,95,96;, + 3;49,96,97;, + 3;49,97,74;; + + MeshNormals { + 98; + 0.000000;0.000000;-1.000000;, + 0.000000;0.000000;-1.000000;, + 0.000000;0.000000;-1.000000;, + 0.000000;0.000000;-1.000000;, + 0.000000;0.000000;-1.000000;, + 0.000000;0.000000;-1.000000;, + 0.000000;0.000000;-1.000000;, + 0.000000;0.000000;-1.000000;, + 0.000000;0.000000;-1.000000;, + 0.000000;0.000000;-1.000000;, + 0.000000;0.000000;-1.000000;, + 0.000000;0.000000;-1.000000;, + 0.000000;0.000000;-1.000000;, + 0.000000;0.000000;-1.000000;, + 0.000000;0.000000;-1.000000;, + 0.000000;0.000000;-1.000000;, + 0.000000;0.000000;-1.000000;, + 0.000000;0.000000;-1.000000;, + 0.000000;0.000000;-1.000000;, + 0.000000;0.000000;-1.000000;, + 0.000000;0.000000;-1.000000;, + 0.000000;0.000000;-1.000000;, + 0.000000;0.000000;-1.000000;, + 0.000000;0.000000;-1.000000;, + 0.000000;0.000000;-1.000000;, + 0.886052;-0.116651;0.448669;, + 0.886052;0.116651;0.448669;, + 0.825669;0.342004;0.448669;, + 0.709018;0.544049;0.448669;, + 0.544049;0.709018;0.448669;, + 0.342003;0.825669;0.448669;, + 0.116651;0.886052;0.448669;, + -0.116651;0.886052;0.448669;, + -0.342003;0.825669;0.448669;, + -0.544049;0.709018;0.448669;, + -0.709018;0.544049;0.448669;, + -0.825669;0.342003;0.448669;, + -0.886052;0.116651;0.448669;, + -0.886052;-0.116651;0.448669;, + -0.825669;-0.342003;0.448669;, + -0.709018;-0.544049;0.448669;, + -0.544049;-0.709018;0.448669;, + -0.342003;-0.825669;0.448669;, + -0.116651;-0.886052;0.448669;, + 0.116651;-0.886052;0.448669;, + 0.342004;-0.825669;0.448669;, + 0.544049;-0.709018;0.448669;, + 0.709018;-0.544049;0.448669;, + 0.825669;-0.342003;0.448669;, + 1.000000;0.000000;0.000000;, + 0.892143;0.000000;0.451753;, + 0.861744;0.230904;0.451753;, + 0.772619;0.446072;0.451753;, + 0.630840;0.630840;0.451753;, + 0.446072;0.772619;0.451753;, + 0.230904;0.861744;0.451753;, + 0.000000;0.892143;0.451753;, + -0.230904;0.861744;0.451753;, + -0.446072;0.772619;0.451753;, + -0.630840;0.630840;0.451753;, + -0.772619;0.446071;0.451753;, + -0.861744;0.230904;0.451753;, + -0.892143;-0.000000;0.451753;, + -0.861744;-0.230904;0.451753;, + -0.772619;-0.446072;0.451753;, + -0.630840;-0.630841;0.451753;, + -0.446072;-0.772619;0.451753;, + -0.230904;-0.861744;0.451753;, + 0.000000;-0.892143;0.451753;, + 0.230904;-0.861744;0.451753;, + 0.446072;-0.772619;0.451753;, + 0.630840;-0.630840;0.451753;, + 0.772619;-0.446071;0.451753;, + 0.861744;-0.230903;0.451753;, + 1.000000;0.000000;0.000000;, + 1.000000;0.000000;0.000000;, + 1.000000;0.000000;0.000000;, + 1.000000;0.000000;0.000000;, + 1.000000;0.000000;0.000000;, + 1.000000;0.000000;0.000000;, + 1.000000;0.000000;0.000000;, + 1.000000;0.000000;0.000000;, + 1.000000;0.000000;0.000000;, + 1.000000;0.000000;0.000000;, + 1.000000;0.000000;0.000000;, + 1.000000;0.000000;0.000000;, + 1.000000;0.000000;0.000000;, + 1.000000;0.000000;0.000000;, + 1.000000;0.000000;0.000000;, + 1.000000;0.000000;0.000000;, + 1.000000;0.000000;0.000000;, + 1.000000;0.000000;0.000000;, + 1.000000;0.000000;0.000000;, + 1.000000;0.000000;0.000000;, + 1.000000;0.000000;0.000000;, + 1.000000;0.000000;0.000000;, + 1.000000;0.000000;0.000000;, + 1.000000;0.000000;0.000000;; + 96; + 3;0,2,1;, + 3;0,3,2;, + 3;0,4,3;, + 3;0,5,4;, + 3;0,6,5;, + 3;0,7,6;, + 3;0,8,7;, + 3;0,9,8;, + 3;0,10,9;, + 3;0,11,10;, + 3;0,12,11;, + 3;0,13,12;, + 3;0,14,13;, + 3;0,15,14;, + 3;0,16,15;, + 3;0,17,16;, + 3;0,18,17;, + 3;0,19,18;, + 3;0,20,19;, + 3;0,21,20;, + 3;0,22,21;, + 3;0,23,22;, + 3;0,24,23;, + 3;0,1,24;, + 3;50,26,25;, + 3;50,51,26;, + 3;51,27,26;, + 3;51,52,27;, + 3;52,28,27;, + 3;52,53,28;, + 3;53,29,28;, + 3;53,54,29;, + 3;54,30,29;, + 3;54,55,30;, + 3;55,31,30;, + 3;55,56,31;, + 3;56,32,31;, + 3;56,57,32;, + 3;57,33,32;, + 3;57,58,33;, + 3;58,34,33;, + 3;58,59,34;, + 3;59,35,34;, + 3;59,60,35;, + 3;60,36,35;, + 3;60,61,36;, + 3;61,37,36;, + 3;61,62,37;, + 3;62,38,37;, + 3;62,63,38;, + 3;63,39,38;, + 3;63,64,39;, + 3;64,40,39;, + 3;64,65,40;, + 3;65,41,40;, + 3;65,66,41;, + 3;66,42,41;, + 3;66,67,42;, + 3;67,43,42;, + 3;67,68,43;, + 3;68,44,43;, + 3;68,69,44;, + 3;69,45,44;, + 3;69,70,45;, + 3;70,46,45;, + 3;70,71,46;, + 3;71,47,46;, + 3;71,72,47;, + 3;72,48,47;, + 3;72,73,48;, + 3;73,25,48;, + 3;73,50,25;, + 3;49,74,75;, + 3;49,75,76;, + 3;49,76,77;, + 3;49,77,78;, + 3;49,78,79;, + 3;49,79,80;, + 3;49,80,81;, + 3;49,81,82;, + 3;49,82,83;, + 3;49,83,84;, + 3;49,84,85;, + 3;49,85,86;, + 3;49,86,87;, + 3;49,87,88;, + 3;49,88,89;, + 3;49,89,90;, + 3;49,90,91;, + 3;49,91,92;, + 3;49,92,93;, + 3;49,93,94;, + 3;49,94,95;, + 3;49,95,96;, + 3;49,96,97;, + 3;49,97,74;; + } + + VertexDuplicationIndices { + 98; + 50; + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48; + } + + MeshMaterialList { + 1; + 96; + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0; + + Material { + 1.000000;1.000000;1.000000;1.000000;; + 0.000000; + 1.000000;1.000000;1.000000;; + 0.000000;0.000000;0.000000;; + } + } + } + } + } + } +} \ No newline at end of file diff --git a/Demos/DX11ClothDemo/Media/UI/dxutcontrols.dds b/Demos/DX11ClothDemo/Media/UI/dxutcontrols.dds new file mode 100644 index 000000000..b5f52e10a Binary files /dev/null and b/Demos/DX11ClothDemo/Media/UI/dxutcontrols.dds differ diff --git a/Demos/DX11ClothDemo/amdFlag.bmp b/Demos/DX11ClothDemo/amdFlag.bmp new file mode 100644 index 000000000..dd1d394ec Binary files /dev/null and b/Demos/DX11ClothDemo/amdFlag.bmp differ diff --git a/Demos/DX11ClothDemo/atiFlag.bmp b/Demos/DX11ClothDemo/atiFlag.bmp new file mode 100644 index 000000000..2be4847dd Binary files /dev/null and b/Demos/DX11ClothDemo/atiFlag.bmp differ diff --git a/Demos/DX11ClothDemo/btDirectComputeSupport.h b/Demos/DX11ClothDemo/btDirectComputeSupport.h new file mode 100644 index 000000000..52843484a --- /dev/null +++ b/Demos/DX11ClothDemo/btDirectComputeSupport.h @@ -0,0 +1,178 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef BT_DIRECT_COMPUTE_SUPPORT_HPP +#define BT_DIRECT_COMPUTE_SUPPORT_HPP + +// DX11 support +#include +#include +#include +#include +#include + +#ifndef SAFE_RELEASE +#define SAFE_RELEASE(p) { if(p) { (p)->Release(); (p)=NULL; } } +#endif + +namespace BTAcceleratedSoftBody +{ + + /** + * Class to provide basic DX11 support to an application, wrapping the device creation functionality and necessary pointers. + */ + class DX11SupportHelper + { + private: + + ID3D11Device* m_pd3dDevice; + ID3D11DeviceContext* m_pd3dImmediateContext; + typedef HRESULT (WINAPI * LPD3D11CREATEDEVICE)( IDXGIAdapter*, D3D_DRIVER_TYPE, HMODULE, UINT32, D3D_FEATURE_LEVEL*, UINT, UINT32, ID3D11Device**, D3D_FEATURE_LEVEL*, ID3D11DeviceContext** ); + HMODULE m_s_hModD3D11; + LPD3D11CREATEDEVICE m_s_DynamicD3D11CreateDevice; + + + bool Dynamic_EnsureD3D11APIs( void ) + { + // If both modules are non-NULL, this function has already been called. Note + // that this doesn't guarantee that all ProcAddresses were found. + if( m_s_hModD3D11 != NULL ) + return true; + + // This may fail if Direct3D 11 isn't installed + m_s_hModD3D11 = LoadLibraryA( "d3d11.dll" ); + if( m_s_hModD3D11 != NULL ) + { + m_s_DynamicD3D11CreateDevice = ( LPD3D11CREATEDEVICE )GetProcAddress( m_s_hModD3D11, "D3D11CreateDevice" ); + } + + return ( m_s_hModD3D11 != NULL ); + } + + // Helper to call D3D11CreateDevice from d3d11.dll + HRESULT WINAPI Dynamic_D3D11CreateDevice( IDXGIAdapter* pAdapter, + D3D_DRIVER_TYPE DriverType, + HMODULE Software, + UINT32 Flags, + D3D_FEATURE_LEVEL* pFeatureLevels, + UINT FeatureLevels, + UINT32 SDKVersion, + ID3D11Device** ppDevice, + D3D_FEATURE_LEVEL* pFeatureLevel, + ID3D11DeviceContext** ppImmediateContext ) + { + if( Dynamic_EnsureD3D11APIs() && m_s_DynamicD3D11CreateDevice != NULL ) + { + return m_s_DynamicD3D11CreateDevice( + pAdapter, + DriverType, + Software, + Flags, + pFeatureLevels, + FeatureLevels, + SDKVersion, + ppDevice, + pFeatureLevel, + ppImmediateContext ); + } + else + { + MessageBoxA( 0, "Could not locate resources need by d3d11."\ + " Please install the latest DirectX SDK.", "Error", MB_ICONEXCLAMATION ); + return E_FAIL; + } + } + + public: + DX11SupportHelper() + { + m_s_hModD3D11 = 0; + m_s_DynamicD3D11CreateDevice = 0; + m_pd3dDevice = 0; + m_pd3dImmediateContext = 0; + } + + virtual ~DX11SupportHelper() + { + SAFE_RELEASE( m_pd3dDevice ); + SAFE_RELEASE( m_pd3dImmediateContext ); + } + + ID3D11Device* getDevice() + { + return m_pd3dDevice; + } + + ID3D11DeviceContext* getContext() + { + return m_pd3dImmediateContext; + } + + /** + * Do a simplistic initialisation of the first DirectCompute device in the system. + * Clearly the user can do their own version for more flexibility. + */ + bool InitComputeShaderDevice() + { + HRESULT hr = S_OK; + + UINT createDeviceFlags = 0; + #ifdef _DEBUG + createDeviceFlags |= D3D11_CREATE_DEVICE_DEBUG; + #endif + + D3D_FEATURE_LEVEL fl[] = { + D3D_FEATURE_LEVEL_11_0, + D3D_FEATURE_LEVEL_10_1, + D3D_FEATURE_LEVEL_10_0 + }; + + // Create a hardware Direct3D 11 device + hr = Dynamic_D3D11CreateDevice( NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, createDeviceFlags, + fl, _countof(fl), D3D11_SDK_VERSION, &m_pd3dDevice, NULL, &m_pd3dImmediateContext ); + + // Check if the hardware device supports Compute Shader 4.0 + D3D11_FEATURE_DATA_D3D10_X_HARDWARE_OPTIONS hwopts; + m_pd3dDevice->CheckFeatureSupport(D3D11_FEATURE_D3D10_X_HARDWARE_OPTIONS, &hwopts, sizeof(hwopts)); + if( !hwopts.ComputeShaders_Plus_RawAndStructuredBuffers_Via_Shader_4_x ) { + SAFE_RELEASE( m_pd3dImmediateContext ); + SAFE_RELEASE( m_pd3dDevice ); + + int result = MessageBoxA(0, "This program needs to use the Direct3D 11 reference device. This device implements the entire Direct3D 11 feature set, but runs very slowly. Do you wish to continue?", "Compute Shader Sort", MB_ICONINFORMATION | MB_YESNO); + if( result == IDNO ) + return false;//E_FAIL; + + // Create a reference device if hardware is not available + hr = Dynamic_D3D11CreateDevice( NULL, D3D_DRIVER_TYPE_REFERENCE, NULL, createDeviceFlags, + fl, _countof(fl), D3D11_SDK_VERSION, &m_pd3dDevice, NULL, &m_pd3dImmediateContext ); + if( FAILED( hr ) ) + return (hr==S_OK); + + printf("Using Direct3D 11 Reference Device\n"); + } + + bool returnVal = (hr==S_OK); + + + return returnVal; + + } // InitComputeShaderDevice + + }; // DX11SupportHelper + +} // namespace BTAcceleratedSoftBody + + +#endif // #ifndef BT_DIRECT_COMPUTE_SUPPORT_HPP \ No newline at end of file diff --git a/Demos/DX11ClothDemo/cap.h b/Demos/DX11ClothDemo/cap.h new file mode 100644 index 000000000..38cfae21b --- /dev/null +++ b/Demos/DX11ClothDemo/cap.h @@ -0,0 +1,274 @@ + +class cap +{ + public: + + ID3D11Buffer* g_pIndexBuffer; + ID3D11Buffer* pVB[1]; + UINT Strides[1]; + UINT Offsets[1]; + + double x_offset, y_offset, z_offset; + + int width,height; + bool top; + + ID3D11Texture2D *texture2D; + ID3D11ShaderResourceView *texture2D_view; + btCollisionShape *collisionShape; + btCollisionObject *collisionObject; + + void set_collision_object(btCollisionObject* co) + { + collisionObject = co; + } + + void set_collision_shape(btCollisionShape* cs) + { + collisionShape = cs; + } + + void create_texture(void) + { + D3DX11_IMAGE_LOAD_INFO loadInfo; + ZeroMemory(&loadInfo, sizeof(D3DX11_IMAGE_LOAD_INFO) ); + loadInfo.BindFlags = D3D11_BIND_SHADER_RESOURCE; + loadInfo.Format = DXGI_FORMAT_BC1_UNORM; + + HRESULT hr = D3DX11CreateShaderResourceViewFromFile(g_pd3dDevice, L"texture.bmp", &loadInfo, NULL, &texture2D_view, NULL); + hr = hr; + } + + void destroy() + { + + } + + void draw(void) + { + + ID3D11DeviceContext* pd3dImmediateContext = DXUTGetD3D11DeviceContext(); + + D3DXMATRIX mWorldViewProjection; + D3DXVECTOR3 vLightDir; + D3DXMATRIX mWorld; + D3DXMATRIX mView; + D3DXMATRIX mProj; + + // Get the projection & view matrix from the camera class + mProj = *g_Camera.GetProjMatrix(); + mView = *g_Camera.GetViewMatrix(); + + // Get the light direction + vLightDir = g_LightControl.GetLightDirection(); + + // Per frame cb update + D3D11_MAPPED_SUBRESOURCE MappedResource; + + HRESULT hr; + + V( pd3dImmediateContext->Map( g_pcbPSPerFrame, 0, D3D11_MAP_WRITE_DISCARD, 0, &MappedResource ) ); + CB_PS_PER_FRAME* pPerFrame = ( CB_PS_PER_FRAME* )MappedResource.pData; + float fAmbient = 0.1f; + pPerFrame->m_vLightDirAmbient = D3DXVECTOR4( vLightDir.x, vLightDir.y, vLightDir.z, fAmbient ); + pd3dImmediateContext->Unmap( g_pcbPSPerFrame, 0 ); + + pd3dImmediateContext->PSSetConstantBuffers( g_iCBPSPerFrameBind, 1, &g_pcbPSPerFrame ); + + + ///////////////////////////////////////Modify below////////////////////////////////////////////////////// + + //Get the mesh + //IA setup + pd3dImmediateContext->IASetInputLayout( g_pVertexLayout11 ); + + //This is where we pass the vertex buffer to DX + pd3dImmediateContext->IASetVertexBuffers( 0, 1, pVB, Strides, Offsets ); + + //This is where we pass the index buffer to DX + pd3dImmediateContext->IASetIndexBuffer( g_pIndexBuffer, DXGI_FORMAT_R32_UINT, 0 ); + + ///////////////////////////////////////////////////////////////////////////////////////////////////////// + // Set the shaders + pd3dImmediateContext->VSSetShader( g_pVertexShader, NULL, 0 ); + pd3dImmediateContext->PSSetShader( g_pPixelShader, NULL, 0 ); + pd3dImmediateContext->GSSetShader( g_pGeometryShader, NULL, 0); + + // Set the per object constant data + + + + btTransform trans = collisionObject->getWorldTransform(); + + + + btVector3 origin = trans.getOrigin(); + btMatrix3x3 btM = trans.getBasis(); + + btScalar* scalar_matrix = new btScalar[16];; + trans.getOpenGLMatrix(scalar_matrix); + + D3DXMATRIXA16 m_trans(scalar_matrix[0],scalar_matrix[1],scalar_matrix[2],scalar_matrix[3], + scalar_matrix[4],scalar_matrix[5],scalar_matrix[6],scalar_matrix[7], + scalar_matrix[8],scalar_matrix[9],scalar_matrix[10],scalar_matrix[11], + scalar_matrix[12],scalar_matrix[13],scalar_matrix[14],scalar_matrix[15]); + + D3DXMATRIXA16 m_scale; + float sc = 10; + D3DXMatrixScaling(&m_scale,sc,sc,sc); + + + D3DXVECTOR3 vCenter( global_shift_x, global_shift_y, global_shift_z); + + D3DXMatrixTranslation( &g_mCenterMesh, -vCenter.x+x_offset, -vCenter.y+y_offset, -vCenter.z+z_offset ); + + + D3DXMATRIXA16 m_trans_transpose; + D3DXMatrixTranspose(&m_trans_transpose,&m_trans); + + mWorld = *g_Camera.GetWorldMatrix() ; + mProj = *g_Camera.GetProjMatrix(); + mView = m_trans * *g_Camera.GetViewMatrix(); + + mWorldViewProjection = mView * mProj; + + + // VS Per object + V( pd3dImmediateContext->Map( g_pcbVSPerObject, 0, D3D11_MAP_WRITE_DISCARD, 0, &MappedResource ) ); + CB_VS_PER_OBJECT* pVSPerObject = ( CB_VS_PER_OBJECT* )MappedResource.pData; + D3DXMatrixTranspose( &pVSPerObject->m_WorldViewProj, &mWorldViewProjection ); + D3DXMatrixTranspose( &pVSPerObject->m_World, &mWorld ); + pd3dImmediateContext->Unmap( g_pcbVSPerObject, 0 ); + + pd3dImmediateContext->VSSetConstantBuffers( g_iCBVSPerObjectBind, 1, &g_pcbVSPerObject ); + + // PS Per object + V( pd3dImmediateContext->Map( g_pcbPSPerObject, 0, D3D11_MAP_WRITE_DISCARD, 0, &MappedResource ) ); + CB_PS_PER_OBJECT* pPSPerObject = ( CB_PS_PER_OBJECT* )MappedResource.pData; + pPSPerObject->m_vObjectColor = D3DXVECTOR4( 1, 1, 1, 1 ); + pd3dImmediateContext->Unmap( g_pcbPSPerObject, 0 ); + + pd3dImmediateContext->PSSetConstantBuffers( g_iCBPSPerObjectBind, 1, &g_pcbPSPerObject ); + + //Render + SDKMESH_SUBSET* pSubset = NULL; + D3D11_PRIMITIVE_TOPOLOGY PrimType; + + pd3dImmediateContext->PSSetSamplers( 0, 1, &g_pSamLinear ); + + { + // Get the subset + pSubset = g_Mesh11.GetSubset( 0, 0 ); + + pd3dImmediateContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); + + pd3dImmediateContext->PSSetShaderResources(0,1,&texture2D_view); + + pd3dImmediateContext->DrawIndexed( (width*3*2+2 + height*width*3*2), 0, ( UINT )pSubset->VertexStart ); + } + + SAFE_RELEASE(pd3dImmediateContext); + } + + + void create_buffers(int width_, int height_, bool top_) + { + + top = top_; + width = width_; + height = height_; + + D3D11_BUFFER_DESC bufferDesc; + bufferDesc.Usage = D3D11_USAGE_DEFAULT; + bufferDesc.ByteWidth = sizeof(vertex_struct)*width*height; + bufferDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER; + bufferDesc.CPUAccessFlags = 0; + bufferDesc.MiscFlags = 0; + + + vertex_struct *vertices = new vertex_struct[width*height]; + + btCapsuleShape* cs = static_cast(collisionShape); + float radius = cs->getRadius(); + float halfHeight = cs->getHalfHeight(); + + + if (top) + { + for(int y = 0; y < height; y++) + { + for(int x = 0; x < width; x++) + { + float X = (x/((float)(width-1)))*3.14159; + float Y = (y/((float)(height-1)))*3.14159; + float z_coord = radius*cos(X)*sin(Y); + float y_coord = radius*sin(X)*sin(Y) + halfHeight; + float x_coord = radius*cos(Y); + vertices[y*width+x].Pos = D3DXVECTOR3(x_coord, y_coord, z_coord); + vertices[y*width+x].Normal = D3DXVECTOR3(x_coord,y_coord-halfHeight,z_coord); + vertices[y*width+x].Texcoord = D3DXVECTOR2(x/( (float)(width-1)), y/((float)(height-1))); + } + } + + } + + else + + { + + for(int y = 0; y < height; y++) + { + for(int x = 0; x < width; x++) + { + float X = (x/((float)(width-1)))*3.14159; + float Y = (y/((float)(height-1)))*3.14159; + float z_coord = radius*cos(X)*sin(Y); + float y_coord = -radius*sin(X)*sin(Y) - halfHeight; + float x_coord = radius*cos(Y); + vertices[y*width+x].Pos = D3DXVECTOR3(x_coord, y_coord, z_coord); + vertices[y*width+x].Normal = D3DXVECTOR3(x_coord,y_coord+halfHeight,z_coord); + vertices[y*width+x].Texcoord = D3DXVECTOR2(x/( (float)(width-1)), y/((float)(height-1))); + } + } + + } + + D3D11_SUBRESOURCE_DATA InitData; + InitData.pSysMem = vertices; + InitData.SysMemPitch = 0; + InitData.SysMemSlicePitch = 0; + + HRESULT hr = g_pd3dDevice->CreateBuffer(&bufferDesc, &InitData, &pVB[0]); + + + + //What is this vertex stride thing all about? + Strides[0] = ( UINT )g_Mesh11.GetVertexStride( 0, 0 ); + Offsets[0] = 0; + + unsigned int* indices = new unsigned int[width*3*2+2 + height*width*3*2]; + + for(int y = 0; y < height-1; y++) + { + for(int x = 0; x < width-1; x++) + { + indices[x*3*2 + y*width*3*2] = x + y*width; + indices[x*3*2+1 + y*width*3*2] = x+1 + y*width; + indices[x*3*2+2 + y*width*3*2] = x+width + y*width; + + indices[x*3*2 + 3 + y*width*3*2] = x + 1 + y*width; + indices[x*3*2 + 4 + y*width*3*2] = x+(width+1) + y*width; + indices[x*3*2 + 5 + y*width*3*2] = x+width + y*width; + + } + } + + bufferDesc.ByteWidth = sizeof(unsigned int)*(width*3*2+2 + height*width*3*2); + bufferDesc.BindFlags = D3D11_BIND_INDEX_BUFFER; + + InitData.pSysMem = indices; + + hr = g_pd3dDevice->CreateBuffer(&bufferDesc, &InitData, &g_pIndexBuffer); + hr = hr; + } +}; diff --git a/Demos/DX11ClothDemo/cloth.h b/Demos/DX11ClothDemo/cloth.h new file mode 100644 index 000000000..fd1983811 --- /dev/null +++ b/Demos/DX11ClothDemo/cloth.h @@ -0,0 +1,286 @@ + + +class piece_of_cloth +{ +public: + + + void destroy(void) + { + + if(created) + { + SAFE_RELEASE(g_pIndexBuffer); + SAFE_RELEASE(pVB[0]); + SAFE_RELEASE(g_pVB_UAV); + SAFE_RELEASE(pVB_staging); + SAFE_RELEASE(texture2D_view); + if(m_vertexBufferDescriptor) delete [] m_vertexBufferDescriptor; + if(cpu_buffer) delete [] cpu_buffer; + } + } + + piece_of_cloth() + { + created = false; + m_vertexBufferDescriptor = NULL; + cpu_buffer = NULL; + } + bool created; + + ID3D11Buffer* g_pIndexBuffer; + ID3D11Buffer* pVB[1]; + ID3D11Buffer* pVB_staging; + + float* cpu_buffer; + + ID3D11UnorderedAccessView* g_pVB_UAV; + UINT Strides[1]; + UINT Offsets[1]; + + double x_offset, y_offset, z_offset; + + + ID3D11ShaderResourceView *texture2D_view; + + int width; + int height; + + btVertexBufferDescriptor *m_vertexBufferDescriptor; + + void create_texture(std::wstring filename) + { + D3DX11_IMAGE_LOAD_INFO loadInfo; + ZeroMemory(&loadInfo, sizeof(D3DX11_IMAGE_LOAD_INFO) ); + loadInfo.BindFlags = D3D11_BIND_SHADER_RESOURCE; + loadInfo.Format = DXGI_FORMAT_BC1_UNORM; + + HRESULT hr = D3DX11CreateShaderResourceViewFromFile(g_pd3dDevice, filename.c_str(), &loadInfo, NULL, &texture2D_view, NULL); + hr = hr; + + } + + void draw(void) + { + + ID3D11DeviceContext* pd3dImmediateContext = DXUTGetD3D11DeviceContext(); + + D3DXMATRIX mWorldViewProjection; + D3DXVECTOR3 vLightDir; + D3DXMATRIX mWorld; + D3DXMATRIX mView; + D3DXMATRIX mProj; + + // Get the projection & view matrix from the camera class + mProj = *g_Camera.GetProjMatrix(); + mView = *g_Camera.GetViewMatrix(); + + // Get the light direction + vLightDir = g_LightControl.GetLightDirection(); + + // Per frame cb update + D3D11_MAPPED_SUBRESOURCE MappedResource; + + HRESULT hr; +#ifndef USE_GPU_COPY + pd3dImmediateContext->Map( pVB_staging, 0, D3D11_MAP_WRITE_DISCARD, 0, &MappedResource ); + memcpy( MappedResource.pData, cpu_buffer, 4*width*height*8 ); + pd3dImmediateContext->Unmap(pVB_staging, 0 ); + pd3dImmediateContext->CopyResource(pVB[0], pVB_staging); +#endif // #ifndef USE_GPU_COPY + + V( pd3dImmediateContext->Map( g_pcbPSPerFrame, 0, D3D11_MAP_WRITE_DISCARD, 0, &MappedResource ) ); + CB_PS_PER_FRAME* pPerFrame = ( CB_PS_PER_FRAME* )MappedResource.pData; + float fAmbient = 0.1f; + pPerFrame->m_vLightDirAmbient = D3DXVECTOR4( vLightDir.x, vLightDir.y, vLightDir.z, fAmbient ); + pd3dImmediateContext->Unmap( g_pcbPSPerFrame, 0 ); + + pd3dImmediateContext->PSSetConstantBuffers( g_iCBPSPerFrameBind, 1, &g_pcbPSPerFrame ); + + + ///////////////////////////////////////Modify below////////////////////////////////////////////////////// + + //Get the mesh + //IA setup + pd3dImmediateContext->IASetInputLayout( g_pVertexLayout11 ); + + //This is where we pass the vertex buffer to DX + pd3dImmediateContext->IASetVertexBuffers( 0, 1, pVB, Strides, Offsets ); + + //This is where we pass the index buffer to DX + pd3dImmediateContext->IASetIndexBuffer( g_pIndexBuffer, DXGI_FORMAT_R32_UINT, 0 ); + + ///////////////////////////////////////////////////////////////////////////////////////////////////////// + // Set the shaders + pd3dImmediateContext->VSSetShader( g_pVertexShader, NULL, 0 ); + pd3dImmediateContext->PSSetShader( g_pPixelShader, NULL, 0 ); + pd3dImmediateContext->GSSetShader( g_pGeometryShader, NULL, 0); + + // Set the per object constant data + + D3DXMATRIXA16 m_scale; + float sc = 10; + D3DXMatrixScaling(&m_scale,sc,sc,sc); + + + D3DXVECTOR3 vCenter( global_shift_x, global_shift_y, global_shift_z); + + D3DXMatrixTranslation( &g_mCenterMesh, -vCenter.x+x_offset, -vCenter.y+y_offset, -vCenter.z+z_offset ); + + + mWorld = *g_Camera.GetWorldMatrix(); + mProj = *g_Camera.GetProjMatrix(); + mView = *g_Camera.GetViewMatrix(); + + mWorldViewProjection = mView * mProj; + + + // VS Per object + V( pd3dImmediateContext->Map( g_pcbVSPerObject, 0, D3D11_MAP_WRITE_DISCARD, 0, &MappedResource ) ); + CB_VS_PER_OBJECT* pVSPerObject = ( CB_VS_PER_OBJECT* )MappedResource.pData; + D3DXMatrixTranspose( &pVSPerObject->m_WorldViewProj, &mWorldViewProjection ); + D3DXMatrixTranspose( &pVSPerObject->m_World, &mWorld ); + pd3dImmediateContext->Unmap( g_pcbVSPerObject, 0 ); + + pd3dImmediateContext->VSSetConstantBuffers( g_iCBVSPerObjectBind, 1, &g_pcbVSPerObject ); + + // PS Per object + V( pd3dImmediateContext->Map( g_pcbPSPerObject, 0, D3D11_MAP_WRITE_DISCARD, 0, &MappedResource ) ); + CB_PS_PER_OBJECT* pPSPerObject = ( CB_PS_PER_OBJECT* )MappedResource.pData; + pPSPerObject->m_vObjectColor = D3DXVECTOR4( 1, 1, 1, 1 ); + pd3dImmediateContext->Unmap( g_pcbPSPerObject, 0 ); + + pd3dImmediateContext->PSSetConstantBuffers( g_iCBPSPerObjectBind, 1, &g_pcbPSPerObject ); + + //Render + SDKMESH_SUBSET* pSubset = NULL; + D3D11_PRIMITIVE_TOPOLOGY PrimType; + + if( g_wireFrame ) + pd3dImmediateContext->RSSetState(g_pRasterizerStateWF); + else + pd3dImmediateContext->RSSetState(g_pRasterizerState); + + pd3dImmediateContext->PSSetSamplers( 0, 1, &g_pSamLinear ); + + { + // Get the subset + pSubset = g_Mesh11.GetSubset( 0, 0 ); + + pd3dImmediateContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); + + pd3dImmediateContext->PSSetShaderResources(0,1,&texture2D_view); + + pd3dImmediateContext->DrawIndexed( (width*3*2+2 + height*width*3*2), 0, ( UINT )pSubset->VertexStart ); + } + + SAFE_RELEASE(pd3dImmediateContext); + } + + void create_buffers(int width_, int height_) + { + width = width_; + height = height_; + + created = true; + + + cpu_buffer = new float[width*height*8]; + memset(cpu_buffer,0,width*height*8*4); + + // Set texture coordinates in output buffers + for(int y = 0; y < height; y++) + { + for(int x = 0; x < width; x++) + { + cpu_buffer[y*8*width + x*8 + 6] = x/( (float)(width-1)); + cpu_buffer[y*8*width + x*8 + 7] = 1-y/((float)(height-1)); + } + } + + + + D3D11_BUFFER_DESC bufferDesc; + ZeroMemory(&bufferDesc, sizeof(bufferDesc)); + bufferDesc.Usage = D3D11_USAGE_DEFAULT; + bufferDesc.ByteWidth = sizeof(vertex_struct)*width*height; + bufferDesc.StructureByteStride = 0;//sizeof(vertex_struct); + bufferDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER | D3D11_BIND_UNORDERED_ACCESS; + bufferDesc.MiscFlags = 0;//D3D11_RESOURCE_MISC_BUFFER_STRUCTURED; + bufferDesc.CPUAccessFlags = 0; + + vertex_struct *vertices = new vertex_struct[width*height]; + for(int y = 0; y < height; y++) + { + for(int x = 0; x < width; x++) + { + double coord = sin(x/5.0)*50; + //coord = sin(y/); + + vertices[y*width+x].Pos = D3DXVECTOR3( (x/((float)(width-1)))*1000, coord, (y/((float)(height-1)))*1000); + vertices[y*width+x].Normal = D3DXVECTOR3(1,0,0); + vertices[y*width+x].Texcoord = D3DXVECTOR2(x/( (float)(width-1)), 1.f-y/((float)(height-1))); + } + } + + D3D11_SUBRESOURCE_DATA InitData; + InitData.pSysMem = vertices; + InitData.SysMemPitch = 0; + InitData.SysMemSlicePitch = 0; + + HRESULT hr = g_pd3dDevice->CreateBuffer(&bufferDesc, &InitData, &pVB[0]); + + + D3D11_UNORDERED_ACCESS_VIEW_DESC uavbuffer_desc; + ZeroMemory(&uavbuffer_desc, sizeof(uavbuffer_desc)); + uavbuffer_desc.Format = DXGI_FORMAT_R32_FLOAT; + uavbuffer_desc.ViewDimension = D3D11_UAV_DIMENSION_BUFFER; + + uavbuffer_desc.Buffer.NumElements = width*height*sizeof(vertex_struct)/4; + hr = g_pd3dDevice->CreateUnorderedAccessView(pVB[0], &uavbuffer_desc, &g_pVB_UAV); + + + //What is this vertex stride thing all about? + Strides[0] = ( UINT )g_Mesh11.GetVertexStride( 0, 0 ); + Offsets[0] = 0; + + + //unsigned int indices[] = {0,1,2, 1,3,2}; + unsigned int* indices = new unsigned int[width*3*2+2 + height*width*3*2]; + + for(int y = 0; y < height-1; y++) + { + for(int x = 0; x < width-1; x++) + { + // *3 indices/triangle, *2 triangles/quad + int baseIndex = (x + y*(width-1))*3*2; + indices[baseIndex] = x + y*width; + indices[baseIndex+1] = x+1 + y*width; + indices[baseIndex+2] = x+width + y*width; + + + indices[baseIndex+3] = x + 1 + y*width; + indices[baseIndex+4] = x+(width+1) + y*width; + indices[baseIndex+5] = x+width + y*width; + } + } + + bufferDesc.ByteWidth = sizeof(unsigned int)*(width*3*2+2 + height*width*3*2); + bufferDesc.BindFlags = D3D11_BIND_INDEX_BUFFER; + + InitData.pSysMem = indices; + + hr = g_pd3dDevice->CreateBuffer(&bufferDesc, &InitData, &g_pIndexBuffer); + + bufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; + bufferDesc.Usage = D3D11_USAGE_DYNAMIC; + bufferDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE; + bufferDesc.ByteWidth = sizeof(vertex_struct)*width*height; + + hr = g_pd3dDevice->CreateBuffer(&bufferDesc, NULL, &pVB_staging); + + delete [] indices; + delete [] vertices; + } + +}; diff --git a/Demos/DX11ClothDemo/cloth_renderer.cpp b/Demos/DX11ClothDemo/cloth_renderer.cpp new file mode 100644 index 000000000..2a5a93c20 --- /dev/null +++ b/Demos/DX11ClothDemo/cloth_renderer.cpp @@ -0,0 +1,1298 @@ +//-------------------------------------------------------------------------------------- +// File: BasicHLSL10.cpp +// +// This sample shows a simple example of the Microsoft Direct3D's High-Level +// Shader Language (HLSL) using the Effect interface. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +//-------------------------------------------------------------------------------------- + +#include "DXUT.h" +#include "DXUTcamera.h" +#include "DXUTgui.h" +#include "DXUTsettingsDlg.h" +#include "SDKmisc.h" +#include "SDKMesh.h" +#include "resource.h" + +#include "btBulletDynamicsCommon.h" +#include "LinearMath/btHashMap.h" +#include "btDirectComputeSupport.h" +#include "BulletSoftBody/btSoftRigidDynamicsWorld.h" +#include "BulletMultiThreaded/GpuSoftBodySolvers/DX11/btSoftBodySolverVertexBuffer_DX11.h" +#include "BulletSoftBody/btSoftBodyHelpers.h" +#include "vectormath_aos.h" + +class btDefaultSoftBodySolver; +class btCPUSoftBodySolver; +class btCPUSoftBodyVertexSolver; +class btDX11SoftBodySolver; +class btDX11SIMDAwareSoftBodySolver; + +#include "BulletSoftBody/btSoftBodySolvers.h" +#include "BulletSoftBody/btDefaultSoftBodySolver.h" +#include "BulletMultiThreaded/GpuSoftBodySolvers/CPU/btSoftBodySolver_CPU.h" +//#include "BulletSoftBody/Solvers/CPU/btAcceleratedSoftBody_CPUVertexSolver.h" +#include "BulletMultiThreaded/GpuSoftBodySolvers/DX11/btSoftBodySolver_DX11.h" +//#include "BulletSoftBody/Solvers/DX11/btAcceleratedSoftBody_DX11SIMDAwareSolver.h" +//#include "BulletSoftBody/btAcceleratedSoftBody_DXVertexBuffers.h" + +#include "BulletSoftBody/btSoftBodyRigidBodyCollisionConfiguration.h" + +//#define USE_SIMDAWARE_SOLVER +//#define USE_GPU_SOLVER +//#define USE_VERTEX_SOLVER +//#define USE_GPU_COPY +const int numFlags = 2; +const int clothWidth = 40; +const int clothHeight = 60;//60; +float _windAngle = 1.0;//0.4; +float _windStrength = 15; + + +#include + +#include + +using Vectormath::Aos::Vector3; + + +class piece_of_cloth; +class btBroadphaseInterface; +class btCollisionShape; +class btOverlappingPairCache; +class btCollisionDispatcher; +class btConstraintSolver; +struct btCollisionAlgorithmCreateFunc; +class btDefaultCollisionConfiguration; + +int paused = 0; + +float global_shift_x = 0; +float global_shift_y = 0; +float global_shift_z = 0; + +namespace BTAcceleratedSoftBody +{ + class BulletPhysicsDevice; + class CPUDevice; + class DX11Device; +} +namespace Vectormath +{ + namespace Aos + { + class Transform3; + } +} + + + +const float flagSpacing = 30.f; + +#include +using namespace std; + +//-------------------------------------------------------------------------------------- +// Global variables +//-------------------------------------------------------------------------------------- +CDXUTDialogResourceManager g_DialogResourceManager; // manager for shared resources of dialogs +//CModelViewerCamera g_Camera; // A model viewing camera +CFirstPersonCamera g_Camera; // A model viewing camera +CDXUTDirectionWidget g_LightControl; +CD3DSettingsDlg g_D3DSettingsDlg; // Device settings dialog +CDXUTDialog g_HUD; // manages the 3D +CDXUTDialog g_SampleUI; // dialog for sample specific controls +D3DXMATRIXA16 g_mCenterMesh; +float g_fLightScale; +int g_nNumActiveLights; +int g_nActiveLight; +bool g_bShowHelp = false; // If true, it renders the UI control text + +// Direct3D9 resources +CDXUTTextHelper* g_pTxtHelper = NULL; + +CDXUTSDKMesh g_Mesh11; + +ID3D11InputLayout* g_pVertexLayout11 = NULL; +ID3D11Buffer* g_pVertexBuffer = NULL; +//ID3D11Buffer* g_pIndexBuffer = NULL; +ID3D11VertexShader* g_pVertexShader = NULL; +ID3D11GeometryShader* g_pGeometryShader = NULL; +ID3D11PixelShader* g_pPixelShader = NULL; +ID3D11SamplerState* g_pSamLinear = NULL; + +ID3D11RasterizerState *g_pRasterizerState = NULL; +ID3D11RasterizerState *g_pRasterizerStateWF = NULL; + +bool g_wireFrame = false; + +struct CB_VS_PER_OBJECT +{ + D3DXMATRIX m_WorldViewProj; + D3DXMATRIX m_World; +}; +UINT g_iCBVSPerObjectBind = 0; + +struct CB_PS_PER_OBJECT +{ + D3DXVECTOR4 m_vObjectColor; +}; +UINT g_iCBPSPerObjectBind = 0; + +struct CB_PS_PER_FRAME +{ + D3DXVECTOR4 m_vLightDirAmbient; +}; +UINT g_iCBPSPerFrameBind = 1; + +ID3D11Buffer* g_pcbVSPerObject = NULL; +ID3D11Buffer* g_pcbPSPerObject = NULL; +ID3D11Buffer* g_pcbPSPerFrame = NULL; + +ID3D11Device* g_pd3dDevice; + + + + +// Create our vertex input layout +const D3D11_INPUT_ELEMENT_DESC layout[] = +{ + { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 }, + { "NORMAL", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0 }, + { "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 24, D3D11_INPUT_PER_VERTEX_DATA, 0 }, +}; + +struct vertex_struct +{ + D3DXVECTOR3 Pos; + D3DXVECTOR3 Normal; + D3DXVECTOR2 Texcoord; +}; + + + + + +#include "cap.h" +#include "cylinder.h" +#include "cloth.h" +//#include "capsule.h" + + + +//cylinder cyl_1; +//cap cap_1; +btRigidBody *capCollider; + + + +btAlignedObjectArray cloths; +//capsule my_capsule; + +////////////////////////////////////////// +// Bullet globals + +btAlignedObjectArray m_collisionShapes; +btBroadphaseInterface* m_broadphase; +btCollisionDispatcher* m_dispatcher; +btConstraintSolver* m_solver; +btDefaultCollisionConfiguration* m_collisionConfiguration; +BTAcceleratedSoftBody::DX11SupportHelper m_dxSupport; + +btAlignedObjectArray m_flags; +btSoftRigidDynamicsWorld* m_dynamicsWorld; + +btDefaultSoftBodySolver *g_defaultSolver = NULL; +btCPUSoftBodySolver *g_cpuSolver = NULL; +btDX11SoftBodySolver *g_dx11Solver = NULL; + +btSoftBodySolver *g_solver = NULL; + +// End bullet globals +////////////////////////////////////////// + +// Helper to test and add links correctly. +// Records links that have already been generated +static bool testAndAddLink( btAlignedObjectArray &trianglesForLinks, btSoftBody *softBody, int triangle, int *triangleVertexIndexArray, int numVertices, int vertex0, int vertex1, int nonLinkVertex, btSoftBody::Material *structuralMaterial, bool createBendLinks, btSoftBody::Material *bendMaterial ) +{ + if( trianglesForLinks[ numVertices * vertex0 + vertex1 ] >= 0 && createBendLinks) + { + // Already have link so find other triangle and generate cross link + + int otherTriangle = trianglesForLinks[numVertices * vertex0 + vertex1]; + int otherIndices[3] = {triangleVertexIndexArray[otherTriangle * 3], triangleVertexIndexArray[otherTriangle * 3 + 1], triangleVertexIndexArray[otherTriangle * 3 + 2]}; + + int nodeA; + // Test all links of the other triangle against this link. The one that's not part of it is what we want. + if( otherIndices[0] != vertex0 && otherIndices[0] != vertex1 ) + nodeA = otherIndices[0]; + if( otherIndices[1] != vertex0 && otherIndices[1] != vertex1 ) + nodeA = otherIndices[1]; + if( otherIndices[2] != vertex0 && otherIndices[2] != vertex1 ) + nodeA = otherIndices[2]; + + softBody->appendLink( nodeA, nonLinkVertex, bendMaterial ); + + return true; + } else { + // Don't yet have link so create it + softBody->appendLink( vertex0, vertex1, structuralMaterial ); + + // If we added a new link, set the triangle array + trianglesForLinks[numVertices * vertex0 + vertex1] = triangle; + trianglesForLinks[numVertices * vertex1 + vertex0] = triangle; + return true; + } +} + +btSoftBody *createFromIndexedMesh( btVector3 *vertexArray, int numVertices, int *triangleVertexIndexArray, int numTriangles, bool createBendLinks ) +{ + btSoftBody* softBody = new btSoftBody(&(m_dynamicsWorld->getWorldInfo()), numVertices, vertexArray, 0); + btSoftBody::Material * structuralMaterial = softBody->appendMaterial(); + btSoftBody::Material * bendMaterial; + if( createBendLinks ) + { + bendMaterial = softBody->appendMaterial(); + bendMaterial->m_kLST = 0.7; + } else { + bendMaterial = NULL; + } + structuralMaterial->m_kLST = 1.0; + + + // List of values for each link saying which triangle is associated with that link + // -1 to start. Once a value is entered we know the "other" triangle + // and can add a link across the link + btAlignedObjectArray triangleForLinks; + triangleForLinks.resize( numVertices * numVertices, -1 ); + for( int triangle = 0; triangle < numTriangles; ++triangle ) + { + int index[3] = {triangleVertexIndexArray[triangle * 3], triangleVertexIndexArray[triangle * 3 + 1], triangleVertexIndexArray[triangle * 3 + 2]}; + softBody->appendFace( index[0], index[1], index[2] ); + + // Generate the structural links directly from the triangles + testAndAddLink( triangleForLinks, softBody, triangle, triangleVertexIndexArray, numVertices, index[0], index[1], index[2], structuralMaterial, createBendLinks, bendMaterial ); + testAndAddLink( triangleForLinks, softBody, triangle, triangleVertexIndexArray, numVertices, index[1], index[2], index[0], structuralMaterial, createBendLinks, bendMaterial ); + testAndAddLink( triangleForLinks, softBody, triangle, triangleVertexIndexArray, numVertices, index[2], index[0], index[1], structuralMaterial, createBendLinks, bendMaterial); + } + + return softBody; +} + +/** + * Create a sequence of flag objects and add them to the world. + */ +void createFlag( int width, int height, btAlignedObjectArray &flags ) +{ + // First create a triangle mesh to represent a flag + + using namespace BTAcceleratedSoftBody; + using Vectormath::Aos::Matrix3; + using Vectormath::Aos::Vector3; + + // Allocate a simple mesh consisting of a vertex array and a triangle index array + btIndexedMesh mesh; + mesh.m_numVertices = width*height; + mesh.m_numTriangles = 2*(width-1)*(height-1); + + btVector3 *vertexArray = new btVector3[mesh.m_numVertices]; + + mesh.m_vertexBase = reinterpret_cast(vertexArray); + int *triangleVertexIndexArray = new int[3*mesh.m_numTriangles]; + mesh.m_triangleIndexBase = reinterpret_cast(triangleVertexIndexArray); + mesh.m_triangleIndexStride = sizeof(int)*3; + mesh.m_vertexStride = sizeof(Vector3); + + // Generate normalised object space vertex coordinates for a rectangular flag + float zCoordinate = 0.0f; + + Matrix3 defaultScale(Vector3(5.f, 0.f, 0.f), Vector3(0.f, 20.f, 0.f), Vector3(0.f, 0.f, 1.f)); + for( int y = 0; y < height; ++y ) + { + float yCoordinate = y*2.0f/float(height) - 1.0f; + for( int x = 0; x < width; ++x ) + { + float xCoordinate = x*2.0f/float(width) - 1.0f; + + Vector3 vertex(xCoordinate, yCoordinate, zCoordinate); + Vector3 transformedVertex = defaultScale*vertex; + + vertexArray[y*width + x] = btVector3(transformedVertex.getX(), transformedVertex.getY(), transformedVertex.getZ() ); + + } + } + + // Generate vertex indices for triangles + for( int y = 0; y < (height-1); ++y ) + { + for( int x = 0; x < (width-1); ++x ) + { + // Triangle 0 + // Top left of square on mesh + { + int vertex0 = y*width + x; + int vertex1 = vertex0 + 1; + int vertex2 = vertex0 + width; + int triangleIndex = 2*y*(width-1) + 2*x; + triangleVertexIndexArray[(mesh.m_triangleIndexStride*triangleIndex)/sizeof(int)] = vertex0; + triangleVertexIndexArray[(mesh.m_triangleIndexStride*triangleIndex+1)/sizeof(int)+1] = vertex1; + triangleVertexIndexArray[(mesh.m_triangleIndexStride*triangleIndex+2)/sizeof(int)+2] = vertex2; + } + + // Triangle 1 + // Bottom right of square on mesh + { + int vertex0 = y*width + x + 1; + int vertex1 = vertex0 + width; + int vertex2 = vertex1 - 1; + int triangleIndex = 2*y*(width-1) + 2*x + 1; + triangleVertexIndexArray[(mesh.m_triangleIndexStride*triangleIndex)/sizeof(int)] = vertex0; + triangleVertexIndexArray[(mesh.m_triangleIndexStride*triangleIndex)/sizeof(int)+1] = vertex1; + triangleVertexIndexArray[(mesh.m_triangleIndexStride*triangleIndex)/sizeof(int)+2] = vertex2; + } + } + } + + + float rotateAngleRoundZ = 0.5; + float rotateAngleRoundX = 0.5; + btMatrix3x3 defaultRotate; + defaultRotate[0] = btVector3(cos(rotateAngleRoundZ), sin(rotateAngleRoundZ), 0.f); + defaultRotate[1] = btVector3(-sin(rotateAngleRoundZ), cos(rotateAngleRoundZ), 0.f); + defaultRotate[2] = btVector3(0.f, 0.f, 1.f); + btMatrix3x3 defaultRotateX; + defaultRotateX[0] = btVector3(1.f, 0.f, 0.f); + defaultRotateX[1] = btVector3( 0.f, cos(rotateAngleRoundX), sin(rotateAngleRoundX)); + defaultRotateX[2] = btVector3(0.f, -sin(rotateAngleRoundX), cos(rotateAngleRoundX)); + + //btMatrix3x3 defaultRotateAndScale( (defaultRotateX*defaultRotate) ); + btMatrix3x3 defaultRotateAndScale( (defaultRotateX) ); + + + // Construct the sequence flags applying a slightly different translation to each one to arrange them + // appropriately in the scene. + for( int i = 0; i < numFlags; ++i ) + { + float zTranslate = flagSpacing * (i-numFlags/2); + + btVector3 defaultTranslate(0.f, 20.f, zTranslate); + + btTransform transform( defaultRotateAndScale, defaultTranslate ); + + + btSoftBody *softBody = createFromIndexedMesh( vertexArray, mesh.m_numVertices, triangleVertexIndexArray, mesh.m_numTriangles, true ); + + + for( int i = 0; i < mesh.m_numVertices; ++i ) + { + softBody->setMass(i, 10.f/mesh.m_numVertices); + } + + // Set the fixed points + softBody->setMass((height-1)*(width), 0.f); + softBody->setMass((height-1)*(width) + width - 1, 0.f); + softBody->setMass((height-1)*width + width/2, 0.f); + + softBody->m_cfg.collisions = btSoftBody::fCollision::CL_SS+btSoftBody::fCollision::CL_RS; + softBody->m_cfg.kLF = 0.0005f; + softBody->m_cfg.kVCF = 0.001f; + softBody->m_cfg.kDP = 0.f; + softBody->m_cfg.kDG = 0.f; + + flags.push_back( softBody ); + + softBody->transform( transform ); + + m_dynamicsWorld->addSoftBody( softBody ); + } + + delete [] vertexArray; + delete [] triangleVertexIndexArray; +} + + + + + +void updatePhysicsWorld() +{ + static int counter = 0; + + // Change wind velocity a bit based on a frame counter + if( (counter % 400) == 0 ) + { + _windAngle = (_windAngle + 0.05f); + if( _windAngle > (2*3.141) ) + _windAngle = 0; + + for( int flagIndex = 0; flagIndex < m_flags.size(); ++flagIndex ) + { + btSoftBody *cloth = 0; + + cloth = m_flags[flagIndex]; + + float localWind = _windAngle + 0.5*(((float(rand())/RAND_MAX))-0.1); + float xCoordinate = cos(localWind)*_windStrength; + float zCoordinate = sin(localWind)*_windStrength; + + cloth->setWindVelocity( btVector3(xCoordinate, 0, zCoordinate) ); + } + } + + //btVector3 origin( capCollider->getWorldTransform().getOrigin() ); + //origin.setX( origin.getX() + 0.05 ); + //capCollider->getWorldTransform().setOrigin( origin ); + + counter++; +} + +void initBullet(void) +{ + + +#ifdef USE_GPU_SOLVER + g_dx11Solver = new btDX11SoftBodySolver( g_pd3dDevice, DXUTGetD3D11DeviceContext() ); + g_solver = g_dx11Solver; +#else + g_cpuSolver = new btCPUSoftBodySolver; + g_solver = g_cpuSolver; + //g_defaultSolver = new btDefaultSoftBodySolver; + //g_solver = g_defaultSolver; +#endif + + + + // Initialise CPU physics device + //m_collisionConfiguration = new btDefaultCollisionConfiguration(); + m_collisionConfiguration = new btSoftBodyRigidBodyCollisionConfiguration(); + m_dispatcher = new btCollisionDispatcher(m_collisionConfiguration); + m_broadphase = new btDbvtBroadphase(); + btSequentialImpulseConstraintSolver* sol = new btSequentialImpulseConstraintSolver; + m_solver = sol; + + m_dynamicsWorld = new btSoftRigidDynamicsWorld(m_dispatcher, m_broadphase, m_solver, m_collisionConfiguration, g_solver); + + m_dynamicsWorld->setGravity(btVector3(0,-10,0)); + btCollisionShape* groundShape = new btBoxShape(btVector3(btScalar(50.),btScalar(50.),btScalar(50.))); + m_collisionShapes.push_back(groundShape); + btTransform groundTransform; + groundTransform.setIdentity(); + groundTransform.setOrigin(btVector3(0,-50,0)); + + m_dynamicsWorld->getWorldInfo().air_density = (btScalar)1.2; + m_dynamicsWorld->getWorldInfo().water_density = 0; + m_dynamicsWorld->getWorldInfo().water_offset = 0; + m_dynamicsWorld->getWorldInfo().water_normal = btVector3(0,0,0); + m_dynamicsWorld->getWorldInfo().m_gravity.setValue(0,-10,0); + +#if 0 + { + btScalar mass(0.); + + //rigidbody is dynamic if and only if mass is non zero, otherwise static + bool isDynamic = (mass != 0.f); + + btVector3 localInertia(0,0,0); + if (isDynamic) + groundShape->calculateLocalInertia(mass,localInertia); + + //using motionstate is recommended, it provides interpolation capabilities, and only synchronizes 'active' objects + btDefaultMotionState* myMotionState = new btDefaultMotionState(groundTransform); + btRigidBody::btRigidBodyConstructionInfo rbInfo(mass,myMotionState,groundShape,localInertia); + btRigidBody* body = new btRigidBody(rbInfo); + + //add the body to the dynamics world + m_dynamicsWorld->addRigidBody(body); + } + +#endif +#if 0 + { + btScalar mass(0.); + + //btScalar mass(1.); + + //rigidbody is dynamic if and only if mass is non zero, otherwise static + bool isDynamic = (mass != 0.f); + + btCollisionShape *capsuleShape = new btCapsuleShape(5, 30); + + + + my_capsule.set_collision_shape(capsuleShape); + + btVector3 localInertia(0,0,0); + if (isDynamic) + capsuleShape->calculateLocalInertia(mass,localInertia); + + m_collisionShapes.push_back(capsuleShape); + btTransform capsuleTransform; + capsuleTransform.setIdentity(); + capsuleTransform.setOrigin(btVector3(0, 10, 0)); + btDefaultMotionState* myMotionState = new btDefaultMotionState(capsuleTransform); + btRigidBody::btRigidBodyConstructionInfo rbInfo(mass,myMotionState,capsuleShape,localInertia); + btRigidBody* body = new btRigidBody(rbInfo); + + my_capsule.set_collision_object(body); + + m_dynamicsWorld->addRigidBody(body); + //cap_1.collisionShape = body; + capCollider = body; + } +#endif + + + createFlag( clothWidth, clothHeight, m_flags ); + + // Create output buffer descriptions for ecah flag + // These describe where the simulation should send output data to + for( int flagIndex = 0; flagIndex < m_flags.size(); ++flagIndex ) + { + // In this case we have a DX11 output buffer with a vertex at index 0, 8, 16 and so on as well as a normal at 3, 11, 19 etc. + // Copies will be performed GPU-side directly into the output buffer +#ifdef USE_GPU_COPY + btDX11VertexBufferDescriptor *vertexBufferDescriptor = new btDX11VertexBufferDescriptor(DXUTGetD3D11DeviceContext(), cloths[flagIndex].pVB[0], cloths[flagIndex].g_pVB_UAV, 0, 8, 3, 8); + cloths[flagIndex].m_vertexBufferDescriptor = vertexBufferDescriptor; +#else // #ifdef USE_GPU_COPY + btCPUVertexBufferDescriptor *vertexBufferDescriptor = new btCPUVertexBufferDescriptor(cloths[flagIndex].cpu_buffer, 0, 8, 3, 8); + cloths[flagIndex].m_vertexBufferDescriptor = vertexBufferDescriptor; +#endif // #ifdef USE_GPU_COPY + } + + g_solver->optimize( m_dynamicsWorld->getSoftBodyArray() ); + +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +//-------------------------------------------------------------------------------------- +// UI control IDs +//-------------------------------------------------------------------------------------- +#define IDC_TOGGLEFULLSCREEN 1 +#define IDC_TOGGLEREF 3 +#define IDC_CHANGEDEVICE 4 +#define IDC_PAUSE 5 +#define IDC_WIREFRAME 6 + +//-------------------------------------------------------------------------------------- +// Forward declarations +//-------------------------------------------------------------------------------------- +bool CALLBACK ModifyDeviceSettings( DXUTDeviceSettings* pDeviceSettings, void* pUserContext ); +void CALLBACK OnFrameMove( double fTime, float fElapsedTime, void* pUserContext ); +LRESULT CALLBACK MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, bool* pbNoFurtherProcessing, + void* pUserContext ); +void CALLBACK OnKeyboard( UINT nChar, bool bKeyDown, bool bAltDown, void* pUserContext ); +void CALLBACK OnGUIEvent( UINT nEvent, int nControlID, CDXUTControl* pControl, void* pUserContext ); + +bool CALLBACK IsD3D11DeviceAcceptable(const CD3D11EnumAdapterInfo *AdapterInfo, UINT Output, const CD3D11EnumDeviceInfo *DeviceInfo, + DXGI_FORMAT BackBufferFormat, bool bWindowed, void* pUserContext ); +HRESULT CALLBACK OnD3D11CreateDevice( ID3D11Device* pd3dDevice, const DXGI_SURFACE_DESC* pBackBufferSurfaceDesc, + void* pUserContext ); +HRESULT CALLBACK OnD3D11ResizedSwapChain( ID3D11Device* pd3dDevice, IDXGISwapChain* pSwapChain, + const DXGI_SURFACE_DESC* pBackBufferSurfaceDesc, void* pUserContext ); +void CALLBACK OnD3D11ReleasingSwapChain( void* pUserContext ); +void CALLBACK OnD3D11DestroyDevice( void* pUserContext ); +void CALLBACK OnD3D11FrameRender( ID3D11Device* pd3dDevice, ID3D11DeviceContext* pd3dImmediateContext, double fTime, + float fElapsedTime, void* pUserContext ); + +void InitApp(); +void RenderText(); + + +//-------------------------------------------------------------------------------------- +// Entry point to the program. Initializes everything and goes into a message processing +// loop. Idle time is used to render the scene. +//-------------------------------------------------------------------------------------- +int WINAPI wWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow ) +{ + // Enable run-time memory check for debug builds. +#if defined(DEBUG) | defined(_DEBUG) + _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF ); +#endif + + // DXUT will create and use the best device (either D3D9 or D3D11) + // that is available on the system depending on which D3D callbacks are set below + + // Set DXUT callbacks + DXUTSetCallbackDeviceChanging( ModifyDeviceSettings ); + DXUTSetCallbackMsgProc( MsgProc ); + DXUTSetCallbackKeyboard( OnKeyboard ); + DXUTSetCallbackFrameMove( OnFrameMove ); + + + DXUTSetCallbackD3D11DeviceAcceptable( IsD3D11DeviceAcceptable ); + DXUTSetCallbackD3D11DeviceCreated( OnD3D11CreateDevice ); + + DXUTSetCallbackD3D11SwapChainResized( OnD3D11ResizedSwapChain ); + DXUTSetCallbackD3D11FrameRender( OnD3D11FrameRender ); + DXUTSetCallbackD3D11SwapChainReleasing( OnD3D11ReleasingSwapChain ); + + DXUTSetCallbackD3D11DeviceDestroyed( OnD3D11DestroyDevice ); + + + InitApp(); + DXUTInit( true, true, NULL ); // Parse the command line, show msgboxes on error, no extra command line params + DXUTSetCursorSettings( true, true ); // Show the cursor and clip it when in full screen + DXUTCreateWindow( L"Cloth Renderer" ); + DXUTCreateDevice (D3D_FEATURE_LEVEL_11_0, true, 800, 600 ); + DXUTSetMultimonSettings(false); + //DXUTCreateDevice(true, 640, 480); + DXUTMainLoop(); // Enter into the DXUT render loop + + return DXUTGetExitCode(); +} + + +//-------------------------------------------------------------------------------------- +// Initialize the app +//-------------------------------------------------------------------------------------- +void InitApp() +{ + D3DXVECTOR3 vLightDir( 1, 0, 0 ); + D3DXVec3Normalize( &vLightDir, &vLightDir ); + g_LightControl.SetLightDirection( vLightDir ); + + // Initialize dialogs + g_D3DSettingsDlg.Init( &g_DialogResourceManager ); + g_HUD.Init( &g_DialogResourceManager ); + g_SampleUI.Init( &g_DialogResourceManager ); + + g_HUD.SetCallback( OnGUIEvent ); int iY = 10; + g_HUD.AddButton( IDC_TOGGLEFULLSCREEN, L"Toggle full screen", 0, iY, 170, 23 ); + + g_HUD.AddButton( IDC_TOGGLEREF, L"Toggle REF (F3)", 0, iY += 26, 170, 23, VK_F3 ); + g_HUD.AddButton( IDC_CHANGEDEVICE, L"Change device (F2)", 0, iY += 26, 170, 23, VK_F2 ); + g_HUD.AddButton( IDC_PAUSE, L"Pause", 0, iY += 26, 170, 23 ); + g_HUD.AddButton( IDC_WIREFRAME, L"Wire frame", 0, iY += 26, 170, 23 ); + + g_SampleUI.SetCallback( OnGUIEvent ); iY = 10; +} + + +//-------------------------------------------------------------------------------------- +// Called right before creating a D3D9 or D3D11 device, allowing the app to modify the device settings as needed +//-------------------------------------------------------------------------------------- +bool CALLBACK ModifyDeviceSettings( DXUTDeviceSettings* pDeviceSettings, void* pUserContext ) +{ + // Uncomment this to get debug information from D3D11 + pDeviceSettings->d3d11.CreateFlags |= D3D11_CREATE_DEVICE_DEBUG; + + // For the first device created if its a REF device, optionally display a warning dialog box + static bool s_bFirstTime = true; + if( s_bFirstTime ) + { + s_bFirstTime = false; + if( ( DXUT_D3D11_DEVICE == pDeviceSettings->ver && + pDeviceSettings->d3d11.DriverType == D3D_DRIVER_TYPE_REFERENCE ) ) + { + DXUTDisplaySwitchingToREFWarning( pDeviceSettings->ver ); + } + } + + return true; +} + + +//-------------------------------------------------------------------------------------- +// Handle updates to the scene. This is called regardless of which D3D API is used +//-------------------------------------------------------------------------------------- +void CALLBACK OnFrameMove( double fTime, float fElapsedTime, void* pUserContext ) +{ + // Update the camera's position based on user input + g_Camera.FrameMove( fElapsedTime ); +} + + +//-------------------------------------------------------------------------------------- +// Render the help and statistics text +//-------------------------------------------------------------------------------------- +void RenderText() +{ + UINT nBackBufferHeight = ( DXUTIsAppRenderingWithD3D9() ) ? DXUTGetD3D9BackBufferSurfaceDesc()->Height : + DXUTGetDXGIBackBufferSurfaceDesc()->Height; + + g_pTxtHelper->Begin(); + g_pTxtHelper->SetInsertionPos( 2, 0 ); + g_pTxtHelper->SetForegroundColor( D3DXCOLOR( 1.0f, 1.0f, 0.0f, 1.0f ) ); + g_pTxtHelper->DrawTextLine( DXUTGetFrameStats( DXUTIsVsyncEnabled() ) ); + g_pTxtHelper->DrawTextLine( DXUTGetDeviceStats() ); + + // Draw help + if( g_bShowHelp ) + { + g_pTxtHelper->SetInsertionPos( 2, nBackBufferHeight - 20 * 6 ); + g_pTxtHelper->SetForegroundColor( D3DXCOLOR( 1.0f, 0.75f, 0.0f, 1.0f ) ); + g_pTxtHelper->DrawTextLine( L"Controls:" ); + + g_pTxtHelper->SetInsertionPos( 20, nBackBufferHeight - 20 * 5 ); + g_pTxtHelper->DrawTextLine( L"Rotate view: Left mouse button\n" + L"Move camera: W, A, S, and D\n" + L"Rotate light: Right mouse button\n" + L"Zoom camera: Mouse wheel scroll\n" ); + + g_pTxtHelper->SetInsertionPos( 550, nBackBufferHeight - 20 * 5 ); + g_pTxtHelper->DrawTextLine( L"Hide help: F1\n" + L"Quit: ESC\n" ); + } + else + { + g_pTxtHelper->SetForegroundColor( D3DXCOLOR( 1.0f, 1.0f, 1.0f, 1.0f ) ); + g_pTxtHelper->DrawTextLine( L"Press F1 for help" ); + } + + g_pTxtHelper->End(); +} + + +//-------------------------------------------------------------------------------------- +// Handle messages to the application +//-------------------------------------------------------------------------------------- +LRESULT CALLBACK MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, bool* pbNoFurtherProcessing, + void* pUserContext ) +{ + // Pass messages to dialog resource manager calls so GUI state is updated correctly + *pbNoFurtherProcessing = g_DialogResourceManager.MsgProc( hWnd, uMsg, wParam, lParam ); + if( *pbNoFurtherProcessing ) + return 0; + + // Pass messages to settings dialog if its active + if( g_D3DSettingsDlg.IsActive() ) + { + g_D3DSettingsDlg.MsgProc( hWnd, uMsg, wParam, lParam ); + return 0; + } + + // Give the dialogs a chance to handle the message first + *pbNoFurtherProcessing = g_HUD.MsgProc( hWnd, uMsg, wParam, lParam ); + if( *pbNoFurtherProcessing ) + return 0; + *pbNoFurtherProcessing = g_SampleUI.MsgProc( hWnd, uMsg, wParam, lParam ); + if( *pbNoFurtherProcessing ) + return 0; + + g_LightControl.HandleMessages( hWnd, uMsg, wParam, lParam ); + + // Pass all remaining windows messages to camera so it can respond to user input + g_Camera.HandleMessages( hWnd, uMsg, wParam, lParam ); + + return 0; +} + + +//-------------------------------------------------------------------------------------- +// Handle key presses +//-------------------------------------------------------------------------------------- +void CALLBACK OnKeyboard( UINT nChar, bool bKeyDown, bool bAltDown, void* pUserContext ) +{ + if( bKeyDown ) + { + switch( nChar ) + { + case VK_F1: + g_bShowHelp = !g_bShowHelp; break; + } + } +} + + +//-------------------------------------------------------------------------------------- +// Handles the GUI events +//-------------------------------------------------------------------------------------- +void CALLBACK OnGUIEvent( UINT nEvent, int nControlID, CDXUTControl* pControl, void* pUserContext ) +{ + switch( nControlID ) + { + case IDC_TOGGLEFULLSCREEN: + DXUTToggleFullScreen(); break; + case IDC_TOGGLEREF: + DXUTToggleREF(); break; + case IDC_CHANGEDEVICE: + g_D3DSettingsDlg.SetActive( !g_D3DSettingsDlg.IsActive() ); break; + case IDC_PAUSE: + paused = !paused; + break; + case IDC_WIREFRAME: + g_wireFrame = !g_wireFrame; + break; + } + +} + + +//-------------------------------------------------------------------------------------- +// Reject any D3D11 devices that aren't acceptable by returning false +//-------------------------------------------------------------------------------------- +bool CALLBACK IsD3D11DeviceAcceptable( const CD3D11EnumAdapterInfo *AdapterInfo, UINT Output, const CD3D11EnumDeviceInfo *DeviceInfo, + DXGI_FORMAT BackBufferFormat, bool bWindowed, void* pUserContext ) +{ + return true; +} + +//-------------------------------------------------------------------------------------- +// Use this until D3DX11 comes online and we get some compilation helpers +//-------------------------------------------------------------------------------------- +HRESULT CompileShaderFromFile( WCHAR* szFileName, LPCSTR szEntryPoint, LPCSTR szShaderModel, ID3DBlob** ppBlobOut ) +{ + HRESULT hr = S_OK; + + // find the file + WCHAR str[MAX_PATH]; + V_RETURN( DXUTFindDXSDKMediaFileCch( str, MAX_PATH, szFileName ) ); + + // open the file + HANDLE hFile = CreateFile( str, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, + FILE_FLAG_SEQUENTIAL_SCAN, NULL ); + if( INVALID_HANDLE_VALUE == hFile ) + return E_FAIL; + + // Get the file size + LARGE_INTEGER FileSize; + GetFileSizeEx( hFile, &FileSize ); + + // create enough space for the file data + BYTE* pFileData = new BYTE[ FileSize.LowPart ]; + if( !pFileData ) + return E_OUTOFMEMORY; + + // read the data in + DWORD BytesRead; + if( !ReadFile( hFile, pFileData, FileSize.LowPart, &BytesRead, NULL ) ) + return E_FAIL; + + CloseHandle( hFile ); + + // Compile the shader + ID3DBlob* pErrorBlob; + hr = D3DCompile( pFileData, FileSize.LowPart, "none", NULL, NULL, szEntryPoint, szShaderModel, D3D10_SHADER_ENABLE_STRICTNESS, 0, ppBlobOut, &pErrorBlob ); + + delete []pFileData; + + if( FAILED(hr) ) + { + OutputDebugStringA( (char*)pErrorBlob->GetBufferPointer() ); + SAFE_RELEASE( pErrorBlob ); + return hr; + } + SAFE_RELEASE( pErrorBlob ); + + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +// Create any D3D11 resources that aren't dependant on the back buffer +//-------------------------------------------------------------------------------------- +HRESULT CALLBACK OnD3D11CreateDevice( ID3D11Device* pd3dDevice, const DXGI_SURFACE_DESC* pBackBufferSurfaceDesc, + void* pUserContext ) +{ + + g_pd3dDevice = pd3dDevice; + + HRESULT hr; + + ID3D11DeviceContext* pd3dImmediateContext = DXUTGetD3D11DeviceContext(); + + V_RETURN( g_DialogResourceManager.OnD3D11CreateDevice( pd3dDevice, pd3dImmediateContext ) ); + V_RETURN( g_D3DSettingsDlg.OnD3D11CreateDevice( pd3dDevice ) ); + g_pTxtHelper = new CDXUTTextHelper( pd3dDevice, pd3dImmediateContext, &g_DialogResourceManager, 15 ); + + D3DXVECTOR3 vCenter( 0.25767413f, -28.503521f, 111.00689f); + FLOAT fObjectRadius = 378.15607f; + + D3DXMatrixTranslation( &g_mCenterMesh, -vCenter.x, -vCenter.y, -vCenter.z ); + D3DXMATRIXA16 m; + D3DXMatrixRotationY( &m, D3DX_PI ); + g_mCenterMesh *= m; + D3DXMatrixRotationX( &m, D3DX_PI / 2.0f ); + g_mCenterMesh *= m; + + // Compile the shaders to a model based on the feature level we acquired + ID3DBlob* pVertexShaderBuffer = NULL; + ID3DBlob* pGeometryShaderBuffer = NULL; + ID3DBlob* pPixelShaderBuffer = NULL; + + switch( DXUTGetD3D11DeviceFeatureLevel() ) + { + case D3D_FEATURE_LEVEL_11_0: + V_RETURN( CompileShaderFromFile( L"cloth_renderer_VS.hlsl", "VSMain", "vs_5_0" , &pVertexShaderBuffer ) ); + V_RETURN( CompileShaderFromFile( L"cloth_renderer_PS.hlsl", "GSMain", "gs_5_0" , &pGeometryShaderBuffer ) ); + V_RETURN( CompileShaderFromFile( L"cloth_renderer_PS.hlsl", "PSMain", "ps_5_0" , &pPixelShaderBuffer ) ); + break; + } + + // Create the shaders + V_RETURN( pd3dDevice->CreateVertexShader( pVertexShaderBuffer->GetBufferPointer(), + pVertexShaderBuffer->GetBufferSize(), NULL, &g_pVertexShader ) ); + + + V_RETURN( pd3dDevice->CreateGeometryShader( pGeometryShaderBuffer->GetBufferPointer(), + pGeometryShaderBuffer->GetBufferSize(), NULL, &g_pGeometryShader ) ); + + + V_RETURN( pd3dDevice->CreatePixelShader( pPixelShaderBuffer->GetBufferPointer(), + pPixelShaderBuffer->GetBufferSize(), NULL, &g_pPixelShader ) ); + + + + V_RETURN( pd3dDevice->CreateInputLayout( layout, ARRAYSIZE( layout ), pVertexShaderBuffer->GetBufferPointer(), + pVertexShaderBuffer->GetBufferSize(), &g_pVertexLayout11 ) ); + + SAFE_RELEASE( pVertexShaderBuffer ); + SAFE_RELEASE( pPixelShaderBuffer ); + SAFE_RELEASE( pGeometryShaderBuffer ); + + + // Load the mesh + V_RETURN( g_Mesh11.Create( pd3dDevice, L"tiny\\tiny.sdkmesh", true ) ); + + + + + // Create a sampler state + D3D11_SAMPLER_DESC SamDesc; + SamDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR; + SamDesc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP; + SamDesc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP; + SamDesc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP; + SamDesc.MipLODBias = 0.0f; + SamDesc.MaxAnisotropy = 1; + SamDesc.ComparisonFunc = D3D11_COMPARISON_ALWAYS; + SamDesc.BorderColor[0] = SamDesc.BorderColor[1] = SamDesc.BorderColor[2] = SamDesc.BorderColor[3] = 0; + SamDesc.MinLOD = 0; + SamDesc.MaxLOD = D3D11_FLOAT32_MAX; + V_RETURN( pd3dDevice->CreateSamplerState( &SamDesc, &g_pSamLinear ) ); + + + + + // Setup constant buffers + D3D11_BUFFER_DESC Desc; + Desc.Usage = D3D11_USAGE_DYNAMIC; + Desc.BindFlags = D3D11_BIND_CONSTANT_BUFFER; + Desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; + Desc.MiscFlags = 0; + + Desc.ByteWidth = sizeof( CB_VS_PER_OBJECT ); + V_RETURN( pd3dDevice->CreateBuffer( &Desc, NULL, &g_pcbVSPerObject ) ); + + Desc.ByteWidth = sizeof( CB_PS_PER_OBJECT ); + V_RETURN( pd3dDevice->CreateBuffer( &Desc, NULL, &g_pcbPSPerObject ) ); + + Desc.ByteWidth = sizeof( CB_PS_PER_FRAME ); + V_RETURN( pd3dDevice->CreateBuffer( &Desc, NULL, &g_pcbPSPerFrame ) ); + + // Setup the camera's view parameters + + + D3DXVECTOR3 vecEye( 0.0f, 0.0f, -100.0f ); + D3DXVECTOR3 vecAt ( 0.0f, 0.0f, -0.0f ); + + + g_Camera.SetViewParams( &vecEye, &vecAt ); + + cloths.resize(numFlags); + + for( int flagIndex = 0; flagIndex < numFlags; ++flagIndex ) + { + cloths[flagIndex].create_buffers(clothWidth, clothHeight); + } + + initBullet(); + + + //my_capsule.create_buffers(50,40); + + + + std::wstring flagTexs[] = { + L"atiFlag.bmp", + L"amdFlag.bmp", + }; + int numFlagTexs = 2; + + for( int flagIndex = 0; flagIndex < numFlags; ++flagIndex ) + { + cloths[flagIndex].create_texture(flagTexs[flagIndex % numFlagTexs]); + cloths[flagIndex].x_offset = 0; + cloths[flagIndex].y_offset = 0; + cloths[flagIndex].z_offset = 0; + } + + //cap_1.create_texture(); + //cap_1.x_offset = 0; + //cap_1.y_offset = 0; + //cap_1.z_offset = 0; + + //my_capsule.create_texture(); + + //Turn off backface culling + D3D11_RASTERIZER_DESC rsDesc; + ZeroMemory(&rsDesc,sizeof(D3D11_RASTERIZER_DESC) ); + rsDesc.CullMode = D3D11_CULL_NONE; + rsDesc.FillMode = D3D11_FILL_SOLID; + + hr = pd3dDevice->CreateRasterizerState(&rsDesc, &g_pRasterizerState); + + rsDesc.FillMode = D3D11_FILL_WIREFRAME; + hr = pd3dDevice->CreateRasterizerState(&rsDesc, &g_pRasterizerStateWF); + + SAFE_RELEASE(pd3dImmediateContext); + + + + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +// Create any D3D11 resources that depend on the back buffer +//-------------------------------------------------------------------------------------- +HRESULT CALLBACK OnD3D11ResizedSwapChain( ID3D11Device* pd3dDevice, IDXGISwapChain* pSwapChain, + const DXGI_SURFACE_DESC* pBackBufferSurfaceDesc, void* pUserContext ) +{ + HRESULT hr; + + V_RETURN( g_DialogResourceManager.OnD3D11ResizedSwapChain( pd3dDevice, pBackBufferSurfaceDesc ) ); + V_RETURN( g_D3DSettingsDlg.OnD3D11ResizedSwapChain( pd3dDevice, pBackBufferSurfaceDesc ) ); + + // Setup the camera's projection parameters + float fAspectRatio = pBackBufferSurfaceDesc->Width / ( FLOAT )pBackBufferSurfaceDesc->Height; + g_Camera.SetProjParams( D3DX_PI / 4, fAspectRatio, 2.0f, 4000.0f ); + // g_Camera.SetWindow( pBackBufferSurfaceDesc->Width, pBackBufferSurfaceDesc->Height ); + // g_Camera.SetButtonMasks( MOUSE_MIDDLE_BUTTON, MOUSE_WHEEL, MOUSE_LEFT_BUTTON ); + + + D3DXVECTOR3 vMin = D3DXVECTOR3( -1000.0f, -1000.0f, -1000.0f ); + D3DXVECTOR3 vMax = D3DXVECTOR3( 1000.0f, 1000.0f, 1000.0f ); + g_Camera.SetRotateButtons(TRUE, FALSE, FALSE); + + + g_Camera.SetScalers( 0.01f, 30.0f ); + g_Camera.SetDrag( true ); + g_Camera.SetEnableYAxisMovement( true ); + g_Camera.SetClipToBoundary( TRUE, &vMin, &vMax ); + g_Camera.FrameMove( 0 ); + + + g_HUD.SetLocation( pBackBufferSurfaceDesc->Width - 170, 0 ); + g_HUD.SetSize( 170, 170 ); + g_SampleUI.SetLocation( pBackBufferSurfaceDesc->Width - 170, pBackBufferSurfaceDesc->Height - 300 ); + g_SampleUI.SetSize( 170, 300 ); + + //Turn off backface culling + D3D11_RASTERIZER_DESC rsDesc; + ZeroMemory(&rsDesc,sizeof(D3D11_RASTERIZER_DESC) ); + rsDesc.CullMode = D3D11_CULL_NONE; + rsDesc.FillMode = D3D11_FILL_SOLID; + //rsDesc.FillMode = D3D11_FILL_WIREFRAME; + + + ID3D11RasterizerState *pRasterizerState = NULL; + pd3dDevice->CreateRasterizerState(&rsDesc, &pRasterizerState); + + DXUTGetD3D11DeviceContext()->RSSetState(pRasterizerState); + + SAFE_RELEASE(pRasterizerState); + + return S_OK; +} + + +btClock m_clock; +//-------------------------------------------------------------------------------------- +// Render the scene using the D3D11 device +//-------------------------------------------------------------------------------------- +void CALLBACK OnD3D11FrameRender( ID3D11Device* pd3dDevice, ID3D11DeviceContext* pd3dImmediateContext, double fTime, + float fElapsedTime, void* pUserContext ) +{ + + + + + //float ms = getDeltaTimeMicroseconds(); + btScalar dt = (btScalar)m_clock.getTimeMicroseconds(); + m_clock.reset(); + + ///step the simulation + if (m_dynamicsWorld && !paused) + { + + m_dynamicsWorld->stepSimulation(dt / 1000000.f); + + updatePhysicsWorld(); + } + + //paused = 1; + + + + /////////////////////////////////////////////////////// + + HRESULT hr; + + // If the settings dialog is being shown, then render it instead of rendering the app's scene + if( g_D3DSettingsDlg.IsActive() ) + { + g_D3DSettingsDlg.OnRender( fElapsedTime ); + return; + } + + // Clear the render target and depth stencil + float ClearColor[4] = { 0.0f, 0.25f, 0.25f, 0.55f }; + ID3D11RenderTargetView* pRTV = DXUTGetD3D11RenderTargetView(); + pd3dImmediateContext->ClearRenderTargetView( pRTV, ClearColor ); + ID3D11DepthStencilView* pDSV = DXUTGetD3D11DepthStencilView(); + pd3dImmediateContext->ClearDepthStencilView( pDSV, D3D11_CLEAR_DEPTH, 1.0, 0 ); + + + for( int flagIndex = 0; flagIndex < m_flags.size(); ++flagIndex ) + { + g_solver->copySoftBodyToVertexBuffer( m_flags[flagIndex], cloths[flagIndex].m_vertexBufferDescriptor ); + cloths[flagIndex].draw(); + } + + //my_capsule.draw(); + //cap_1.draw(); + + + DXUT_BeginPerfEvent( DXUT_PERFEVENTCOLOR, L"HUD / Stats" ); + g_HUD.OnRender( fElapsedTime ); + g_SampleUI.OnRender( fElapsedTime ); + RenderText(); + DXUT_EndPerfEvent(); + + +/* + SAFE_RELEASE(pRTV); + SAFE_RELEASE(pDSV); +*/ + + +} + + +//-------------------------------------------------------------------------------------- +// Release D3D11 resources created in OnD3D11ResizedSwapChain +//-------------------------------------------------------------------------------------- +void CALLBACK OnD3D11ReleasingSwapChain( void* pUserContext ) +{ + g_DialogResourceManager.OnD3D11ReleasingSwapChain(); + DXUTGetD3D11DeviceContext()->ClearState(); +} + + +//-------------------------------------------------------------------------------------- +// Release D3D11 resources created in OnD3D11CreateDevice +//-------------------------------------------------------------------------------------- +void CALLBACK OnD3D11DestroyDevice( void* pUserContext ) +{ + g_DialogResourceManager.OnD3D11DestroyDevice(); + g_D3DSettingsDlg.OnD3D11DestroyDevice(); + DXUTGetGlobalResourceCache().OnDestroyDevice(); + SAFE_DELETE( g_pTxtHelper ); + + g_Mesh11.Destroy(); + + + SAFE_RELEASE(g_pGeometryShader); + SAFE_RELEASE( g_pVertexLayout11 ); + SAFE_RELEASE( g_pVertexBuffer ); + SAFE_RELEASE( g_pVertexShader ); + SAFE_RELEASE( g_pPixelShader ); + SAFE_RELEASE( g_pSamLinear ); + + SAFE_RELEASE( g_pcbVSPerObject ); + SAFE_RELEASE( g_pcbPSPerObject ); + SAFE_RELEASE( g_pcbPSPerFrame ); + + SAFE_RELEASE( g_pRasterizerState ); + SAFE_RELEASE( g_pRasterizerStateWF ); + + + for( int flagIndex = 0; flagIndex < numFlags; ++flagIndex ) + { + cloths[flagIndex].destroy(); + } + + // Shouldn't need to delete this as it's just a soft body and will be deleted later by the collision object cleanup. + //for( int flagIndex = 0; flagIndex < m_flags.size(); ++flagIndex ) + //{ + //delete m_flags[flagIndex]; + //} + + //cleanup in the reverse order of creation/initialization + if( g_defaultSolver ) + delete g_defaultSolver; + if( g_cpuSolver ) + delete g_cpuSolver; + if( g_dx11Solver ) + delete g_dx11Solver; + + for(int i=0; i< m_collisionShapes.size(); i++) + delete m_collisionShapes[i]; + + //remove the rigidbodies from the dynamics world and delete them + int i; + for (i=m_dynamicsWorld->getNumCollisionObjects()-1; i>=0 ;i--) + { + btCollisionObject* obj = m_dynamicsWorld->getCollisionObjectArray()[i]; + btRigidBody* body = btRigidBody::upcast(obj); + if (body && body->getMotionState()) + { + delete body->getMotionState(); + } + m_dynamicsWorld->removeCollisionObject( obj ); + delete obj; + } + + delete m_dynamicsWorld; + delete m_solver; + delete m_broadphase; + delete m_dispatcher; + delete m_collisionConfiguration; + + +} + + + + + + + + + + diff --git a/Demos/DX11ClothDemo/cloth_renderer.fx b/Demos/DX11ClothDemo/cloth_renderer.fx new file mode 100644 index 000000000..2b8f318ff --- /dev/null +++ b/Demos/DX11ClothDemo/cloth_renderer.fx @@ -0,0 +1,157 @@ +//-------------------------------------------------------------------------------------- +// File: BasicHLSL.fx +// +// The effect file for the BasicHLSL sample. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +//-------------------------------------------------------------------------------------- + + +//-------------------------------------------------------------------------------------- +// Global variables +//-------------------------------------------------------------------------------------- +float4 g_MaterialAmbientColor; // Material's ambient color +float4 g_MaterialDiffuseColor; // Material's diffuse color +int g_nNumLights; + +float3 g_LightDir; // Light's direction in world space +float4 g_LightDiffuse; // Light's diffuse color +float4 g_LightAmbient; // Light's ambient color + +texture g_MeshTexture; // Color texture for mesh + +float g_fTime; // App's time in seconds +float4x4 g_mWorld; // World matrix for object +float4x4 g_mWorldViewProjection; // World * View * Projection matrix + + + +//-------------------------------------------------------------------------------------- +// Texture samplers +//-------------------------------------------------------------------------------------- +sampler MeshTextureSampler = +sampler_state +{ + Texture = ; + MipFilter = LINEAR; + MinFilter = LINEAR; + MagFilter = LINEAR; +}; + + +//-------------------------------------------------------------------------------------- +// Vertex shader output structure +//-------------------------------------------------------------------------------------- +struct VS_OUTPUT +{ + float4 Position : POSITION; // vertex position + float4 Diffuse : COLOR0; // vertex diffuse color (note that COLOR0 is clamped from 0..1) + float2 TextureUV : TEXCOORD0; // vertex texture coords +}; + + +//-------------------------------------------------------------------------------------- +// This shader computes standard transform and lighting +//-------------------------------------------------------------------------------------- +VS_OUTPUT RenderSceneVS( float4 vPos : POSITION, + float3 vNormal : NORMAL, + float2 vTexCoord0 : TEXCOORD0, + uniform int nNumLights, + uniform bool bTexture, + uniform bool bAnimate ) +{ + + VS_OUTPUT Output; + float3 vNormalWorldSpace; + + // Transform the position from object space to homogeneous projection space + Output.Position = mul(vPos, g_mWorldViewProjection); + + // Transform the normal from object space to world space + vNormalWorldSpace = normalize(mul(vNormal, (float3x3)g_mWorld)); // normal (world space) + + // Compute simple directional lighting equation + float3 vTotalLightDiffuse = float3(0,0,0); + for(int i=0; i + + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (U.S.) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +#ifdef _WIN32 +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(1252) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +// Icon with lowest ID value placed first to ensure application icon +// remains consistent on all systems. +IDI_MAIN_ICON ICON "DXUT\Optional\\directx.ico" + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#define IDC_STATIC -1\r\n" + "#include \r\n" + "\r\n" + "\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + +#endif // English (U.S.) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/Demos/DX11ClothDemo/cloth_renderer_PS.hlsl b/Demos/DX11ClothDemo/cloth_renderer_PS.hlsl new file mode 100644 index 000000000..553a546ec --- /dev/null +++ b/Demos/DX11ClothDemo/cloth_renderer_PS.hlsl @@ -0,0 +1,90 @@ +//-------------------------------------------------------------------------------------- +// File: BasicHLSL11_PS.hlsl +// +// The pixel shader file for the BasicHLSL11 sample. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +//-------------------------------------------------------------------------------------- + +//-------------------------------------------------------------------------------------- +// Globals +//-------------------------------------------------------------------------------------- +cbuffer cbPerObject : register( b0 ) +{ + float4 g_vObjectColor : packoffset( c0 ); +}; + +cbuffer cbPerFrame : register( b1 ) +{ + float3 g_vLightDir : packoffset( c0 ); + float g_fAmbient : packoffset( c0.w ); +}; + +//-------------------------------------------------------------------------------------- +// Textures and Samplers +//-------------------------------------------------------------------------------------- +Texture2D g_txDiffuse : register( t0 ); +SamplerState g_samLinear : register( s0 ); + +//-------------------------------------------------------------------------------------- +// Input / Output structures +//-------------------------------------------------------------------------------------- +struct PS_INPUT +{ + float3 vNormal : NORMAL; + float2 vTexcoord : TEXCOORD0; + float4 vPosition : SV_POSITION; +}; + +//-------------------------------------------------------------------------------------- +// Pixel Shader +//-------------------------------------------------------------------------------------- +float4 PSMain( PS_INPUT Input ) : SV_TARGET +{ + float4 vDiffuse = g_txDiffuse.Sample( g_samLinear, Input.vTexcoord ); + + + float fLighting = saturate( dot( g_vLightDir, (Input.vNormal)/length(Input.vNormal) ) ); + //float fLighting = saturate( dot( g_vLightDir, float3(Input.vTexcoord.x,0,0) ) ); + fLighting = max( fLighting, g_fAmbient ); + + //fLighting = dot(g_vLightDir,float3(0,1,0)); + + return vDiffuse * fLighting; +} + + +struct VS_OUTPUT +{ + float3 vNormal : NORMAL; + float2 vTexcoord : TEXCOORD0; + float4 vPosition : SV_POSITION; +}; + +[maxvertexcount(3)] +void GSMain(triangle VS_OUTPUT input[3], inout TriangleStream OutputStream) +{ +PS_INPUT output = (PS_INPUT)0; + + +/* +float3 v1 = input[1].vPosition - input[0].vPosition; +float3 v2 = input[2].vPosition - input[0].vPosition; +float3 normal = cross(v1,v2); + +normal = normalize(normal); +*/ + + +for(int i = 0; i < 3; i++) +{ + +output.vNormal = input[i].vNormal; +output.vTexcoord = input[i].vTexcoord; +output.vPosition = input[i].vPosition; +OutputStream.Append(output); +} + +OutputStream.RestartStrip(); + +} \ No newline at end of file diff --git a/Demos/DX11ClothDemo/cloth_renderer_VS.hlsl b/Demos/DX11ClothDemo/cloth_renderer_VS.hlsl new file mode 100644 index 000000000..331e2f8a3 --- /dev/null +++ b/Demos/DX11ClothDemo/cloth_renderer_VS.hlsl @@ -0,0 +1,48 @@ +//-------------------------------------------------------------------------------------- +// File: BasicHLSL11_VS.hlsl +// +// The vertex shader file for the BasicHLSL11 sample. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +//-------------------------------------------------------------------------------------- + +//-------------------------------------------------------------------------------------- +// Globals +//-------------------------------------------------------------------------------------- +cbuffer cbPerObject : register( b0 ) +{ + matrix g_mWorldViewProjection : packoffset( c0 ); + matrix g_mWorld : packoffset( c4 ); +}; + +//-------------------------------------------------------------------------------------- +// Input / Output structures +//-------------------------------------------------------------------------------------- +struct VS_INPUT +{ + float4 vPosition : POSITION; + float3 vNormal : NORMAL; + float2 vTexcoord : TEXCOORD0; +}; + +struct VS_OUTPUT +{ + float3 vNormal : NORMAL; + float2 vTexcoord : TEXCOORD0; + float4 vPosition : SV_POSITION; +}; + +//-------------------------------------------------------------------------------------- +// Vertex Shader +//-------------------------------------------------------------------------------------- +VS_OUTPUT VSMain( VS_INPUT Input ) +{ + VS_OUTPUT Output; + + Output.vPosition = mul( Input.vPosition, g_mWorldViewProjection ); + Output.vNormal = mul( Input.vNormal, (float3x3)g_mWorld ); + Output.vTexcoord = Input.vTexcoord; + + return Output; +} + diff --git a/Demos/DX11ClothDemo/cylinder.h b/Demos/DX11ClothDemo/cylinder.h new file mode 100644 index 000000000..a9c6edb7e --- /dev/null +++ b/Demos/DX11ClothDemo/cylinder.h @@ -0,0 +1,267 @@ + +class cylinder +{ + public: + + ID3D11Buffer* g_pIndexBuffer; + ID3D11Buffer* pVB[1]; + UINT Strides[1]; + UINT Offsets[1]; + + double x_offset, y_offset, z_offset; + + int width; + int height; + + ID3D11Texture2D *texture2D; + ID3D11ShaderResourceView *texture2D_view; + + btCollisionShape *collisionShape; + + //static_cast(capsuleShape) + + + btCollisionObject *collisionObject; + + void set_collision_object(btCollisionObject* co) + { + collisionObject = co; + } + + void set_collision_shape(btCollisionShape* cs) + { + collisionShape = cs; + } + + + + void create_texture(void) + { + D3DX11_IMAGE_LOAD_INFO loadInfo; + ZeroMemory(&loadInfo, sizeof(D3DX11_IMAGE_LOAD_INFO) ); + loadInfo.BindFlags = D3D11_BIND_SHADER_RESOURCE; + loadInfo.Format = DXGI_FORMAT_BC1_UNORM; + + HRESULT hr = D3DX11CreateShaderResourceViewFromFile(g_pd3dDevice, L"texture.bmp", &loadInfo, NULL, &texture2D_view, NULL); + hr = hr; + + } + + void draw(void) + { + + ID3D11DeviceContext* pd3dImmediateContext = DXUTGetD3D11DeviceContext(); + + D3DXMATRIX mWorldViewProjection; + D3DXVECTOR3 vLightDir; + D3DXMATRIX mWorld; + D3DXMATRIX mView; + D3DXMATRIX mProj; + + // Get the projection & view matrix from the camera class + mProj = *g_Camera.GetProjMatrix(); + mView = *g_Camera.GetViewMatrix(); + + // Get the light direction + vLightDir = g_LightControl.GetLightDirection(); + + // Per frame cb update + D3D11_MAPPED_SUBRESOURCE MappedResource; + + HRESULT hr; + + V( pd3dImmediateContext->Map( g_pcbPSPerFrame, 0, D3D11_MAP_WRITE_DISCARD, 0, &MappedResource ) ); + CB_PS_PER_FRAME* pPerFrame = ( CB_PS_PER_FRAME* )MappedResource.pData; + float fAmbient = 0.1f; + pPerFrame->m_vLightDirAmbient = D3DXVECTOR4( vLightDir.x, vLightDir.y, vLightDir.z, fAmbient ); + pd3dImmediateContext->Unmap( g_pcbPSPerFrame, 0 ); + + pd3dImmediateContext->PSSetConstantBuffers( g_iCBPSPerFrameBind, 1, &g_pcbPSPerFrame ); + + + ///////////////////////////////////////Modify below////////////////////////////////////////////////////// + + //Get the mesh + //IA setup + pd3dImmediateContext->IASetInputLayout( g_pVertexLayout11 ); + + //This is where we pass the vertex buffer to DX + pd3dImmediateContext->IASetVertexBuffers( 0, 1, pVB, Strides, Offsets ); + + //This is where we pass the index buffer to DX + pd3dImmediateContext->IASetIndexBuffer( g_pIndexBuffer, DXGI_FORMAT_R32_UINT, 0 ); + + ///////////////////////////////////////////////////////////////////////////////////////////////////////// + // Set the shaders + pd3dImmediateContext->VSSetShader( g_pVertexShader, NULL, 0 ); + pd3dImmediateContext->PSSetShader( g_pPixelShader, NULL, 0 ); + pd3dImmediateContext->GSSetShader( g_pGeometryShader, NULL, 0); + + // Set the per object constant data + + + + btTransform trans = collisionObject->getWorldTransform(); + + + + btVector3 origin = trans.getOrigin(); + btMatrix3x3 btM = trans.getBasis(); + + btScalar* scalar_matrix = new btScalar[16];; + trans.getOpenGLMatrix(scalar_matrix); + + D3DXMATRIXA16 m_trans(scalar_matrix[0],scalar_matrix[1],scalar_matrix[2],scalar_matrix[3], + scalar_matrix[4],scalar_matrix[5],scalar_matrix[6],scalar_matrix[7], + scalar_matrix[8],scalar_matrix[9],scalar_matrix[10],scalar_matrix[11], + scalar_matrix[12],scalar_matrix[13],scalar_matrix[14],scalar_matrix[15]); + + D3DXMATRIXA16 m_scale; + float sc = 10; + D3DXMatrixScaling(&m_scale,sc,sc,sc); + + + D3DXVECTOR3 vCenter( global_shift_x, global_shift_y, global_shift_z); + + D3DXMatrixTranslation( &g_mCenterMesh, -vCenter.x+x_offset, -vCenter.y+y_offset, -vCenter.z+z_offset ); + + + D3DXMATRIXA16 m_trans_transpose; + D3DXMatrixTranspose(&m_trans_transpose,&m_trans); + + mWorld = *g_Camera.GetWorldMatrix() ; + mProj = *g_Camera.GetProjMatrix(); + mView = m_trans * *g_Camera.GetViewMatrix(); + + mWorldViewProjection = mView * mProj; + + + // VS Per object + V( pd3dImmediateContext->Map( g_pcbVSPerObject, 0, D3D11_MAP_WRITE_DISCARD, 0, &MappedResource ) ); + CB_VS_PER_OBJECT* pVSPerObject = ( CB_VS_PER_OBJECT* )MappedResource.pData; + D3DXMatrixTranspose( &pVSPerObject->m_WorldViewProj, &mWorldViewProjection ); + D3DXMatrixTranspose( &pVSPerObject->m_World, &mWorld ); + pd3dImmediateContext->Unmap( g_pcbVSPerObject, 0 ); + + pd3dImmediateContext->VSSetConstantBuffers( g_iCBVSPerObjectBind, 1, &g_pcbVSPerObject ); + + // PS Per object + V( pd3dImmediateContext->Map( g_pcbPSPerObject, 0, D3D11_MAP_WRITE_DISCARD, 0, &MappedResource ) ); + CB_PS_PER_OBJECT* pPSPerObject = ( CB_PS_PER_OBJECT* )MappedResource.pData; + pPSPerObject->m_vObjectColor = D3DXVECTOR4( 1, 1, 1, 1 ); + pd3dImmediateContext->Unmap( g_pcbPSPerObject, 0 ); + + pd3dImmediateContext->PSSetConstantBuffers( g_iCBPSPerObjectBind, 1, &g_pcbPSPerObject ); + + //Render + SDKMESH_SUBSET* pSubset = NULL; + D3D11_PRIMITIVE_TOPOLOGY PrimType; + + pd3dImmediateContext->PSSetSamplers( 0, 1, &g_pSamLinear ); + + { + // Get the subset + pSubset = g_Mesh11.GetSubset( 0, 0 ); + + pd3dImmediateContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); + + pd3dImmediateContext->PSSetShaderResources(0,1,&texture2D_view); + + pd3dImmediateContext->DrawIndexed( (width*3*2+2 + height*width*3*2), 0, ( UINT )pSubset->VertexStart ); + } + + SAFE_RELEASE(pd3dImmediateContext); + } + + void create_buffers(int width_, int height_) + { + width = width_; + height = height_; + + + D3D11_BUFFER_DESC bufferDesc; + bufferDesc.Usage = D3D11_USAGE_DEFAULT; + bufferDesc.ByteWidth = sizeof(vertex_struct)*width*height; + bufferDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER; + bufferDesc.CPUAccessFlags = 0; + bufferDesc.MiscFlags = 0; + + vertex_struct *vertices = new vertex_struct[width*height]; + + btCapsuleShape* cs = static_cast(collisionShape); + float radius = cs->getRadius(); + float halfHeight = cs->getHalfHeight(); + + for(int y = 0; y < height; y++) + { + for(int x = 0; x < width; x++) + { + double coord_2 = sin(2.2*3.141159*y/(float)height)*radius; + double coord_1 = cos(2.2*3.141159*y/(float)height)*radius; + //double coord_2 = (y/((float)(height-1)))*1000; + + //coord = sin(y/); + + vertices[y*width+x].Pos = D3DXVECTOR3(coord_1, ((x/((float)(width-1)))-.5)*halfHeight*2, coord_2); + vertices[y*width+x].Normal = D3DXVECTOR3(coord_1,0,coord_2); + vertices[y*width+x].Texcoord = D3DXVECTOR2(x/( (float)(width-1)), y/((float)(height-1))); + } + } + + + /* + for(int y = 0; y < height; y++) + { + for(int x = 0; x < width; x++) + { + double coord = sin(x/5.0)*50; + //coord = sin(y/); + + vertices[y*width+x].Pos = D3DXVECTOR3( (x/((float)(width-1)))*1000, coord, (y/((float)(height-1)))*1000); + vertices[y*width+x].Normal = D3DXVECTOR3(1,0,0); + vertices[y*width+x].Texcoord = D3DXVECTOR2(x/( (float)(width-1)), y/((float)(height-1))); + } + } + */ + + D3D11_SUBRESOURCE_DATA InitData; + InitData.pSysMem = vertices; + InitData.SysMemPitch = 0; + InitData.SysMemSlicePitch = 0; + + HRESULT hr = g_pd3dDevice->CreateBuffer(&bufferDesc, &InitData, &pVB[0]); + + + //What is this vertex stride thing all about? + Strides[0] = ( UINT )g_Mesh11.GetVertexStride( 0, 0 ); + Offsets[0] = 0; + + //unsigned int indices[] = {0,1,2, 1,3,2}; + unsigned int* indices = new unsigned int[width*3*2+2 + height*width*3*2]; + + for(int y = 0; y < height-1; y++) + { + for(int x = 0; x < width-1; x++) + { + indices[x*3*2 + y*width*3*2] = x + y*width; + indices[x*3*2+1 + y*width*3*2] = x+1 + y*width; + indices[x*3*2+2 + y*width*3*2] = x+width + y*width; + + indices[x*3*2 + 3 + y*width*3*2] = x + 1 + y*width; + indices[x*3*2 + 4 + y*width*3*2] = x+(width+1) + y*width; + indices[x*3*2 + 5 + y*width*3*2] = x+width + y*width; + } + } + + bufferDesc.ByteWidth = sizeof(unsigned int)*(width*3*2+2 + height*width*3*2); + bufferDesc.BindFlags = D3D11_BIND_INDEX_BUFFER; + + InitData.pSysMem = indices; + + hr = g_pd3dDevice->CreateBuffer(&bufferDesc, &InitData, &g_pIndexBuffer); + hr = hr; + } + + +}; + diff --git a/Demos/DX11ClothDemo/resource.h b/Demos/DX11ClothDemo/resource.h new file mode 100644 index 000000000..9807fb169 --- /dev/null +++ b/Demos/DX11ClothDemo/resource.h @@ -0,0 +1,16 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by BasicHLSL10.rc +// +#define IDI_MAIN_ICON 101 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 113 +#define _APS_NEXT_COMMAND_VALUE 40029 +#define _APS_NEXT_CONTROL_VALUE 1000 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/Demos/DX11ClothDemo/texture.bmp b/Demos/DX11ClothDemo/texture.bmp new file mode 100644 index 000000000..5bd5e762a Binary files /dev/null and b/Demos/DX11ClothDemo/texture.bmp differ diff --git a/Demos/DX11ClothDemo/texture.png b/Demos/DX11ClothDemo/texture.png new file mode 100644 index 000000000..19d4d7e24 Binary files /dev/null and b/Demos/DX11ClothDemo/texture.png differ diff --git a/src/BulletMultiThreaded/CMakeLists.txt b/src/BulletMultiThreaded/CMakeLists.txt index 116e2aebf..326936f1c 100644 --- a/src/BulletMultiThreaded/CMakeLists.txt +++ b/src/BulletMultiThreaded/CMakeLists.txt @@ -77,6 +77,12 @@ ADD_LIBRARY(BulletMultiThreaded ../MiniCL/cl_MiniCL_Defs.h ) +#for now, only Direct 11 (Direct Compute) +IF(USE_DX11) + SUBDIRS(GpuSoftBodySolvers) +ENDIF(USE_DX11) + + IF (BUILD_SHARED_LIBS) TARGET_LINK_LIBRARIES(BulletMultiThreaded BulletDynamics BulletCollision) ENDIF (BUILD_SHARED_LIBS) diff --git a/src/BulletMultiThreaded/GpuSoftBodySolvers/CMakeLists.txt b/src/BulletMultiThreaded/GpuSoftBodySolvers/CMakeLists.txt new file mode 100644 index 000000000..aaf2e4bef --- /dev/null +++ b/src/BulletMultiThreaded/GpuSoftBodySolvers/CMakeLists.txt @@ -0,0 +1,22 @@ + +INCLUDE_DIRECTORIES( +${BULLET_PHYSICS_SOURCE_DIR}/src +) + +LIST(APPEND SubDirList "CPU") + + +# Configure use of OpenCL and DX11 +# Generates the settings file and defines libraries and include paths +OPTION(USE_OPENCL "Use OpenCL" OFF) + + + +if( USE_OPENCL ) + LIST(APPEND SubDirList "OpenCL") +endif( USE_OPENCL ) +if( USE_DX11 ) + LIST(APPEND SubDirList "DX11") +endif( USE_DX11 ) + +SUBDIRS( ${SubDirList} ) diff --git a/src/BulletMultiThreaded/GpuSoftBodySolvers/CPU/CMakeLists.txt b/src/BulletMultiThreaded/GpuSoftBodySolvers/CPU/CMakeLists.txt new file mode 100644 index 000000000..0eb83d15e --- /dev/null +++ b/src/BulletMultiThreaded/GpuSoftBodySolvers/CPU/CMakeLists.txt @@ -0,0 +1,39 @@ + +INCLUDE_DIRECTORIES( +${BULLET_PHYSICS_SOURCE_DIR}/src +${VECTOR_MATH_INCLUDE} +) + + + +SET(BulletSoftBodyCPUSolvers_SRCS + btSoftBodySolver_CPU.cpp +) + +SET(BulletSoftBodyCPUSolvers_HDRS + btSoftBodySolver_CPU.h + btSoftBodySolverData.h +) + + +ADD_LIBRARY(BulletSoftBodySolvers_CPU ${BulletSoftBodyCPUSolvers_SRCS} ${BulletSoftBodyCPUSolvers_HDRS} ) +SET_TARGET_PROPERTIES(BulletSoftBodySolvers_CPU PROPERTIES VERSION ${BULLET_VERSION}) +SET_TARGET_PROPERTIES(BulletSoftBodySolvers_CPU PROPERTIES SOVERSION ${BULLET_VERSION}) + +IF (INSTALL_LIBS) + IF (NOT INTERNAL_CREATE_DISTRIBUTABLE_MSVC_PROJECTFILES) + IF (${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION} GREATER 2.5) + IF (APPLE AND BUILD_SHARED_LIBS AND FRAMEWORK) + INSTALL(TARGETS BulletSoftBodySolvers_CPU DESTINATION .) + ELSE (APPLE AND BUILD_SHARED_LIBS AND FRAMEWORK) + INSTALL(TARGETS BulletSoftBodySolvers_CPU DESTINATION lib${LIB_SUFFIX}) + INSTALL(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} DESTINATION include FILES_MATCHING PATTERN "*.h") + ENDIF (APPLE AND BUILD_SHARED_LIBS AND FRAMEWORK) + ENDIF (${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION} GREATER 2.5) + + IF (APPLE AND BUILD_SHARED_LIBS AND FRAMEWORK) + SET_TARGET_PROPERTIES(BulletSoftBodySolvers_CPU PROPERTIES FRAMEWORK true) + SET_TARGET_PROPERTIES(BulletSoftBodySolvers_CPU PROPERTIES PUBLIC_HEADER "${BulletSoftBodyCPUSolvers_HDRS}") + ENDIF (APPLE AND BUILD_SHARED_LIBS AND FRAMEWORK) + ENDIF (NOT INTERNAL_CREATE_DISTRIBUTABLE_MSVC_PROJECTFILES) +ENDIF (INSTALL_LIBS) diff --git a/src/BulletMultiThreaded/GpuSoftBodySolvers/CPU/btSoftBodySolverData.h b/src/BulletMultiThreaded/GpuSoftBodySolvers/CPU/btSoftBodySolverData.h new file mode 100644 index 000000000..b99412b5d --- /dev/null +++ b/src/BulletMultiThreaded/GpuSoftBodySolvers/CPU/btSoftBodySolverData.h @@ -0,0 +1,717 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef BT_SOFT_BODY_SOLVER_DATA_H +#define BT_SOFT_BODY_SOLVER_DATA_H + +#include "BulletCollision/CollisionShapes/btTriangleIndexVertexArray.h" +#include "vectormath_aos.h" + + +class btSoftBodyLinkData +{ +public: + /** + * Class representing a link as a set of three indices into the vertex array. + */ + class LinkNodePair + { + public: + int vertex0; + int vertex1; + + LinkNodePair() + { + vertex0 = 0; + vertex1 = 0; + } + + LinkNodePair( int v0, int v1 ) + { + vertex0 = v0; + vertex1 = v1; + } + }; + + /** + * Class describing a link for input into the system. + */ + class LinkDescription + { + protected: + int m_vertex0; + int m_vertex1; + float m_linkLinearStiffness; + float m_linkStrength; + + public: + + LinkDescription() + { + m_vertex0 = 0; + m_vertex1 = 0; + m_linkLinearStiffness = 1.0; + m_linkStrength = 1.0; + } + + LinkDescription( int newVertex0, int newVertex1, float linkLinearStiffness ) + { + m_vertex0 = newVertex0; + m_vertex1 = newVertex1; + m_linkLinearStiffness = linkLinearStiffness; + m_linkStrength = 1.0; + } + + LinkNodePair getVertexPair() const + { + LinkNodePair nodes; + nodes.vertex0 = m_vertex0; + nodes.vertex1 = m_vertex1; + return nodes; + } + + void setVertex0( int vertex ) + { + m_vertex0 = vertex; + } + + void setVertex1( int vertex ) + { + m_vertex1 = vertex; + } + + void setLinkLinearStiffness( float linearStiffness ) + { + m_linkLinearStiffness = linearStiffness; + } + + void setLinkStrength( float strength ) + { + m_linkStrength = strength; + } + + int getVertex0() const + { + return m_vertex0; + } + + int getVertex1() const + { + return m_vertex1; + } + + float getLinkStrength() const + { + return m_linkStrength; + } + + float getLinkLinearStiffness() const + { + return m_linkLinearStiffness; + } + }; + + +protected: + // NOTE: + // Vertex reference data is stored relative to global array, not relative to individual cloth. + // Values must be correct if being passed into single-cloth VBOs or when migrating from one solver + // to another. + + btAlignedObjectArray< LinkNodePair > m_links; // Vertex pair for the link + btAlignedObjectArray< float > m_linkStrength; // Strength of each link + // (inverseMassA + inverseMassB)/ linear stiffness coefficient + btAlignedObjectArray< float > m_linksMassLSC; + btAlignedObjectArray< float > m_linksRestLengthSquared; + // Current vector length of link + btAlignedObjectArray< Vectormath::Aos::Vector3 > m_linksCLength; + // 1/(current length * current length * massLSC) + btAlignedObjectArray< float > m_linksLengthRatio; + btAlignedObjectArray< float > m_linksRestLength; + btAlignedObjectArray< float > m_linksMaterialLinearStiffnessCoefficient; + +public: + btSoftBodyLinkData() + { + } + + virtual ~btSoftBodyLinkData() + { + } + + virtual void clear() + { + m_links.resize(0); + m_linkStrength.resize(0); + m_linksMassLSC.resize(0); + m_linksRestLengthSquared.resize(0); + m_linksLengthRatio.resize(0); + m_linksRestLength.resize(0); + m_linksMaterialLinearStiffnessCoefficient.resize(0); + } + + int getNumLinks() + { + return m_links.size(); + } + + /** Allocate enough space in all link-related arrays to fit numLinks links */ + virtual void createLinks( int numLinks ) + { + int previousSize = m_links.size(); + int newSize = previousSize + numLinks; + + // Resize all the arrays that store link data + m_links.resize( newSize ); + m_linkStrength.resize( newSize ); + m_linksMassLSC.resize( newSize ); + m_linksRestLengthSquared.resize( newSize ); + m_linksCLength.resize( newSize ); + m_linksLengthRatio.resize( newSize ); + m_linksRestLength.resize( newSize ); + m_linksMaterialLinearStiffnessCoefficient.resize( newSize ); + } + + /** Insert the link described into the correct data structures assuming space has already been allocated by a call to createLinks */ + virtual void setLinkAt( const LinkDescription &link, int linkIndex ) + { + m_links[linkIndex] = link.getVertexPair(); + m_linkStrength[linkIndex] = link.getLinkStrength(); + m_linksMassLSC[linkIndex] = 0.f; + m_linksRestLengthSquared[linkIndex] = 0.f; + m_linksCLength[linkIndex] = Vectormath::Aos::Vector3(0.f, 0.f, 0.f); + m_linksLengthRatio[linkIndex] = 0.f; + m_linksRestLength[linkIndex] = 0.f; + m_linksMaterialLinearStiffnessCoefficient[linkIndex] = link.getLinkLinearStiffness(); + } + + + /** + * Return true if data is on the accelerator. + * The CPU version of this class will return true here because + * the CPU is the same as the accelerator. + */ + virtual bool onAccelerator() + { + return true; + } + + /** + * Move data from host memory to the accelerator. + * The CPU version will always return that it has moved it. + */ + virtual bool moveToAccelerator() + { + return true; + } + + /** + * Move data from host memory from the accelerator. + * The CPU version will always return that it has moved it. + */ + virtual bool moveFromAccelerator() + { + return true; + } + + + + /** + * Return reference to the vertex index pair for link linkIndex as stored on the host. + */ + LinkNodePair &getVertexPair( int linkIndex ) + { + return m_links[linkIndex]; + } + + /** + * Return reference to strength of link linkIndex as stored on the host. + */ + float &getStrength( int linkIndex ) + { + return m_linkStrength[linkIndex]; + } + + /** + * Return a reference to the strength of the link corrected for link sorting. + * This is important if we are using data on an accelerator which has the data sorted in some fashion. + */ + virtual float &getStrengthCorrected( int linkIndex ) + { + return getStrength( linkIndex ); + } + + /** + * Return reference to the rest length of link linkIndex as stored on the host. + */ + float &getRestLength( int linkIndex ) + { + return m_linksRestLength[linkIndex]; + } + + /** + * Return reference to linear stiffness coefficient for link linkIndex as stored on the host. + */ + float &getLinearStiffnessCoefficient( int linkIndex ) + { + return m_linksMaterialLinearStiffnessCoefficient[linkIndex]; + } + + /** + * Return reference to the MassLSC value for link linkIndex as stored on the host. + */ + float &getMassLSC( int linkIndex ) + { + return m_linksMassLSC[linkIndex]; + } + + /** + * Return reference to rest length squared for link linkIndex as stored on the host. + */ + float &getRestLengthSquared( int linkIndex ) + { + return m_linksRestLengthSquared[linkIndex]; + } + + /** + * Return reference to current length of link linkIndex as stored on the host. + */ + Vectormath::Aos::Vector3 &getCurrentLength( int linkIndex ) + { + return m_linksCLength[linkIndex]; + } + + /** + * Return the link length ratio from for link linkIndex as stored on the host. + */ + float &getLinkLengthRatio( int linkIndex ) + { + return m_linksLengthRatio[linkIndex]; + } +}; + + + +/** + * Wrapper for vertex data information. + * By wrapping it like this we stand a good chance of being able to optimise for storage format easily. + * It should also help us make sure all the data structures remain consistent. + */ +class btSoftBodyVertexData +{ +public: + /** + * Class describing a vertex for input into the system. + */ + class VertexDescription + { + private: + Vectormath::Aos::Point3 m_position; + /** Inverse mass. If this is 0f then the mass was 0 because that simplifies calculations. */ + float m_inverseMass; + + public: + VertexDescription() + { + m_position = Vectormath::Aos::Point3( 0.f, 0.f, 0.f ); + m_inverseMass = 0.f; + } + + VertexDescription( const Vectormath::Aos::Point3 &position, float mass ) + { + m_position = position; + if( mass > 0.f ) + m_inverseMass = 1.0f/mass; + else + m_inverseMass = 0.f; + } + + void setPosition( const Vectormath::Aos::Point3 &position ) + { + m_position = position; + } + + void setInverseMass( float inverseMass ) + { + m_inverseMass = inverseMass; + } + + void setMass( float mass ) + { + if( mass > 0.f ) + m_inverseMass = 1.0f/mass; + else + m_inverseMass = 0.f; + } + + Vectormath::Aos::Point3 getPosition() const + { + return m_position; + } + + float getInverseMass() const + { + return m_inverseMass; + } + + float getMass() const + { + if( m_inverseMass == 0.f ) + return 0.f; + else + return 1.0f/m_inverseMass; + } + }; +protected: + + // identifier for the individual cloth + // For the CPU we don't really need this as we can grab the cloths and iterate over only their vertices + // For a parallel accelerator knowing on a per-vertex basis which cloth we're part of will help for obtaining + // per-cloth data + // For sorting etc it might also be helpful to be able to use in-array data such as this. + btAlignedObjectArray< int > m_clothIdentifier; + btAlignedObjectArray< Vectormath::Aos::Point3 > m_vertexPosition; // vertex positions + btAlignedObjectArray< Vectormath::Aos::Point3 > m_vertexPreviousPosition; // vertex positions + btAlignedObjectArray< Vectormath::Aos::Vector3 > m_vertexVelocity; // Velocity + btAlignedObjectArray< Vectormath::Aos::Vector3 > m_vertexForceAccumulator; // Force accumulator + btAlignedObjectArray< Vectormath::Aos::Vector3 > m_vertexNormal; // Normals + btAlignedObjectArray< float > m_vertexInverseMass; // Inverse mass + btAlignedObjectArray< float > m_vertexArea; // Area controlled by the vertex + btAlignedObjectArray< int > m_vertexTriangleCount; // Number of triangles touching this vertex + +public: + btSoftBodyVertexData() + { + } + + virtual void clear() + { + m_clothIdentifier.resize(0); + m_vertexPosition.resize(0); + m_vertexPreviousPosition.resize(0); + m_vertexVelocity.resize(0); + m_vertexForceAccumulator.resize(0); + m_vertexNormal.resize(0); + m_vertexInverseMass.resize(0); + m_vertexArea.resize(0); + m_vertexTriangleCount.resize(0); + } + + int getNumVertices() + { + return m_vertexPosition.size(); + } + + int getClothIdentifier( int vertexIndex ) + { + return m_clothIdentifier[vertexIndex]; + } + + void setVertexAt( const VertexDescription &vertex, int vertexIndex ) + { + m_vertexPosition[vertexIndex] = vertex.getPosition(); + m_vertexPreviousPosition[vertexIndex] = vertex.getPosition(); + m_vertexVelocity[vertexIndex] = Vectormath::Aos::Vector3(0.f, 0.f, 0.f); + m_vertexForceAccumulator[vertexIndex] = Vectormath::Aos::Vector3(0.f, 0.f, 0.f); + m_vertexNormal[vertexIndex] = Vectormath::Aos::Vector3(0.f, 0.f, 0.f); + m_vertexInverseMass[vertexIndex] = vertex.getInverseMass(); + m_vertexArea[vertexIndex] = 0.f; + m_vertexTriangleCount[vertexIndex] = 0; + } + + /** Create numVertices new vertices for cloth clothIdentifier */ + void createVertices( int numVertices, int clothIdentifier ) + { + int previousSize = m_vertexPosition.size(); + int newSize = previousSize + numVertices; + + // Resize all the arrays that store vertex data + m_clothIdentifier.resize( newSize ); + m_vertexPosition.resize( newSize ); + m_vertexPreviousPosition.resize( newSize ); + m_vertexVelocity.resize( newSize ); + m_vertexForceAccumulator.resize( newSize ); + m_vertexNormal.resize( newSize ); + m_vertexInverseMass.resize( newSize ); + m_vertexArea.resize( newSize ); + m_vertexTriangleCount.resize( newSize ); + + for( int vertexIndex = previousSize; vertexIndex < newSize; ++vertexIndex ) + m_clothIdentifier[vertexIndex] = clothIdentifier; + } + + // Get and set methods in header so they can be inlined + + /** + * Return a reference to the position of vertex vertexIndex as stored on the host. + */ + Vectormath::Aos::Point3 &getPosition( int vertexIndex ) + { + return m_vertexPosition[vertexIndex]; + } + + /** + * Return a reference to the previous position of vertex vertexIndex as stored on the host. + */ + Vectormath::Aos::Point3 &getPreviousPosition( int vertexIndex ) + { + return m_vertexPreviousPosition[vertexIndex]; + } + + /** + * Return a reference to the velocity of vertex vertexIndex as stored on the host. + */ + Vectormath::Aos::Vector3 &getVelocity( int vertexIndex ) + { + return m_vertexVelocity[vertexIndex]; + } + + /** + * Return a reference to the force accumulator of vertex vertexIndex as stored on the host. + */ + Vectormath::Aos::Vector3 &getForceAccumulator( int vertexIndex ) + { + return m_vertexForceAccumulator[vertexIndex]; + } + + /** + * Return a reference to the normal of vertex vertexIndex as stored on the host. + */ + Vectormath::Aos::Vector3 &getNormal( int vertexIndex ) + { + return m_vertexNormal[vertexIndex]; + } + + /** + * Return a reference to the inverse mass of vertex vertexIndex as stored on the host. + */ + float &getInverseMass( int vertexIndex ) + { + return m_vertexInverseMass[vertexIndex]; + } + + /** + * Get access to the area controlled by this vertex. + */ + float &getArea( int vertexIndex ) + { + return m_vertexArea[vertexIndex]; + } + + /** + * Get access to the array of how many triangles touch each vertex. + */ + int &getTriangleCount( int vertexIndex ) + { + return m_vertexTriangleCount[vertexIndex]; + } + + + + /** + * Return true if data is on the accelerator. + * The CPU version of this class will return true here because + * the CPU is the same as the accelerator. + */ + virtual bool onAccelerator() + { + return true; + } + + /** + * Move data from host memory to the accelerator. + * The CPU version will always return that it has moved it. + */ + virtual bool moveToAccelerator() + { + return true; + } + + /** + * Move data from host memory from the accelerator. + * The CPU version will always return that it has moved it. + */ + virtual bool moveFromAccelerator() + { + return true; + } + + btAlignedObjectArray< Vectormath::Aos::Point3 > &getVertexPositions() + { + return m_vertexPosition; + } +}; + + +class btSoftBodyTriangleData +{ +public: + /** + * Class representing a triangle as a set of three indices into the + * vertex array. + */ + class TriangleNodeSet + { + public: + int vertex0; + int vertex1; + int vertex2; + int _padding; + + TriangleNodeSet( ) + { + vertex0 = 0; + vertex1 = 0; + vertex2 = 0; + _padding = -1; + } + + TriangleNodeSet( int newVertex0, int newVertex1, int newVertex2 ) + { + vertex0 = newVertex0; + vertex1 = newVertex1; + vertex2 = newVertex2; + } + }; + + class TriangleDescription + { + protected: + int m_vertex0; + int m_vertex1; + int m_vertex2; + + public: + TriangleDescription() + { + m_vertex0 = 0; + m_vertex1 = 0; + m_vertex2 = 0; + } + + TriangleDescription( int newVertex0, int newVertex1, int newVertex2 ) + { + m_vertex0 = newVertex0; + m_vertex1 = newVertex1; + m_vertex2 = newVertex2; + } + + TriangleNodeSet getVertexSet() const + { + btSoftBodyTriangleData::TriangleNodeSet nodes; + nodes.vertex0 = m_vertex0; + nodes.vertex1 = m_vertex1; + nodes.vertex2 = m_vertex2; + return nodes; + } + }; + +protected: + // NOTE: + // Vertex reference data is stored relative to global array, not relative to individual cloth. + // Values must be correct if being passed into single-cloth VBOs or when migrating from one solver + // to another. + btAlignedObjectArray< TriangleNodeSet > m_vertexIndices; + btAlignedObjectArray< float > m_area; + btAlignedObjectArray< Vectormath::Aos::Vector3 > m_normal; + +public: + btSoftBodyTriangleData() + { + } + + virtual void clear() + { + m_vertexIndices.resize(0); + m_area.resize(0); + m_normal.resize(0); + } + + int getNumTriangles() + { + return m_vertexIndices.size(); + } + + virtual void setTriangleAt( const TriangleDescription &triangle, int triangleIndex ) + { + m_vertexIndices[triangleIndex] = triangle.getVertexSet(); + } + + virtual void createTriangles( int numTriangles ) + { + int previousSize = m_vertexIndices.size(); + int newSize = previousSize + numTriangles; + + // Resize all the arrays that store triangle data + m_vertexIndices.resize( newSize ); + m_area.resize( newSize ); + m_normal.resize( newSize ); + } + + /** + * Return the vertex index set for triangle triangleIndex as stored on the host. + */ + const TriangleNodeSet &getVertexSet( int triangleIndex ) + { + return m_vertexIndices[triangleIndex]; + } + + /** + * Get access to the triangle area. + */ + float &getTriangleArea( int triangleIndex ) + { + return m_area[triangleIndex]; + } + + /** + * Get access to the normal vector for this triangle. + */ + Vectormath::Aos::Vector3 &getNormal( int triangleIndex ) + { + return m_normal[triangleIndex]; + } + + /** + * Return true if data is on the accelerator. + * The CPU version of this class will return true here because + * the CPU is the same as the accelerator. + */ + virtual bool onAccelerator() + { + return true; + } + + /** + * Move data from host memory to the accelerator. + * The CPU version will always return that it has moved it. + */ + virtual bool moveToAccelerator() + { + return true; + } + + /** + * Move data from host memory from the accelerator. + * The CPU version will always return that it has moved it. + */ + virtual bool moveFromAccelerator() + { + return true; + } +}; + + +#endif // #ifndef BT_SOFT_BODY_SOLVER_DATA_H \ No newline at end of file diff --git a/src/BulletMultiThreaded/GpuSoftBodySolvers/CPU/btSoftBodySolver_CPU.cpp b/src/BulletMultiThreaded/GpuSoftBodySolvers/CPU/btSoftBodySolver_CPU.cpp new file mode 100644 index 000000000..bf8194228 --- /dev/null +++ b/src/BulletMultiThreaded/GpuSoftBodySolvers/CPU/btSoftBodySolver_CPU.cpp @@ -0,0 +1,766 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#include "BulletCollision/CollisionShapes/btTriangleIndexVertexArray.h" +#include "BulletCollision/CollisionDispatch/btCollisionObject.h" +#include "BulletCollision/CollisionShapes/btCollisionShape.h" +#include "vectormath_aos.h" + +#include "BulletMultiThreaded/GpuSoftBodySolvers/CPU/btSoftBodySolver_CPU.h" +#include "BulletSoftBody/btSoftBody.h" +#include "BulletCollision/CollisionShapes/btCapsuleShape.h" + + +btCPUSoftBodySolver::btCPUSoftBodySolver() +{ + // Initial we will clearly need to update solver constants + // For now this is global for the cloths linked with this solver - we should probably make this body specific + // for performance in future once we understand more clearly when constants need to be updated + m_updateSolverConstants = true; +} + +btCPUSoftBodySolver::~btCPUSoftBodySolver() +{ +} + + + + +btSoftBodyLinkData &btCPUSoftBodySolver::getLinkData() +{ + return m_linkData; +} + +btSoftBodyVertexData &btCPUSoftBodySolver::getVertexData() +{ + return m_vertexData; +} + +btSoftBodyTriangleData &btCPUSoftBodySolver::getTriangleData() +{ + return m_triangleData; +} + + + + + + +static Vectormath::Aos::Vector3 toVector3( const btVector3 &vec ) +{ + Vectormath::Aos::Vector3 outVec( vec.getX(), vec.getY(), vec.getZ() ); + return outVec; +} + +static Vectormath::Aos::Transform3 toTransform3( const btTransform &transform ) +{ + Vectormath::Aos::Transform3 outTransform; + outTransform.setCol(0, toVector3(transform.getBasis().getColumn(0))); + outTransform.setCol(1, toVector3(transform.getBasis().getColumn(1))); + outTransform.setCol(2, toVector3(transform.getBasis().getColumn(2))); + outTransform.setCol(3, toVector3(transform.getOrigin())); + return outTransform; +} + + + + +void btCPUSoftBodySolver::optimize( btAlignedObjectArray< btSoftBody * > &softBodies ) +{ + if( m_softBodySet.size() != softBodies.size() ) + { + // Have a change in the soft body set so update, reloading all the data + getVertexData().clear(); + getTriangleData().clear(); + getLinkData().clear(); + m_softBodySet.resize(0); + + + for( int softBodyIndex = 0; softBodyIndex < softBodies.size(); ++softBodyIndex ) + { + btSoftBody *softBody = softBodies[ softBodyIndex ]; + using Vectormath::Aos::Matrix3; + using Vectormath::Aos::Point3; + + // Create SoftBody that will store the information within the solver + btAcceleratedSoftBodyInterface *newSoftBody = new btAcceleratedSoftBodyInterface( softBody ); + m_softBodySet.push_back( newSoftBody ); + + m_perClothAcceleration.push_back( toVector3(softBody->getWorldInfo()->m_gravity) ); + m_perClothDampingFactor.push_back(softBody->m_cfg.kDP); + m_perClothVelocityCorrectionCoefficient.push_back( softBody->m_cfg.kVCF ); + m_perClothLiftFactor.push_back( softBody->m_cfg.kLF ); + m_perClothDragFactor.push_back( softBody->m_cfg.kDG ); + m_perClothMediumDensity.push_back(softBody->getWorldInfo()->air_density); + + // Add space for new vertices and triangles in the default solver for now + // TODO: Include space here for tearing too later + int firstVertex = getVertexData().getNumVertices(); + int numVertices = softBody->m_nodes.size(); + int maxVertices = numVertices; + // Allocate space for new vertices in all the vertex arrays + getVertexData().createVertices( maxVertices, softBodyIndex ); + + int firstTriangle = getTriangleData().getNumTriangles(); + int numTriangles = softBody->m_faces.size(); + int maxTriangles = numTriangles; + getTriangleData().createTriangles( maxTriangles ); + + // Copy vertices from softbody into the solver + for( int vertex = 0; vertex < numVertices; ++vertex ) + { + Point3 multPoint(softBody->m_nodes[vertex].m_x.getX(), softBody->m_nodes[vertex].m_x.getY(), softBody->m_nodes[vertex].m_x.getZ()); + btSoftBodyVertexData::VertexDescription desc; + + // TODO: Position in the softbody might be pre-transformed + // or we may need to adapt for the pose. + //desc.setPosition( cloth.getMeshTransform()*multPoint ); + desc.setPosition( multPoint ); + + float vertexInverseMass = softBody->m_nodes[vertex].m_im; + desc.setInverseMass(vertexInverseMass); + getVertexData().setVertexAt( desc, firstVertex + vertex ); + } + + // Copy triangles similarly + // We're assuming here that vertex indices are based on the firstVertex rather than the entire scene + for( int triangle = 0; triangle < numTriangles; ++triangle ) + { + // Note that large array storage is relative to the array not to the cloth + // So we need to add firstVertex to each value + int vertexIndex0 = (softBody->m_faces[triangle].m_n[0] - &(softBody->m_nodes[0])); + int vertexIndex1 = (softBody->m_faces[triangle].m_n[1] - &(softBody->m_nodes[0])); + int vertexIndex2 = (softBody->m_faces[triangle].m_n[2] - &(softBody->m_nodes[0])); + btSoftBodyTriangleData::TriangleDescription newTriangle(vertexIndex0 + firstVertex, vertexIndex1 + firstVertex, vertexIndex2 + firstVertex); + getTriangleData().setTriangleAt( newTriangle, firstTriangle + triangle ); + + // Increase vertex triangle counts for this triangle + getVertexData().getTriangleCount(newTriangle.getVertexSet().vertex0)++; + getVertexData().getTriangleCount(newTriangle.getVertexSet().vertex1)++; + getVertexData().getTriangleCount(newTriangle.getVertexSet().vertex2)++; + } + + int firstLink = getLinkData().getNumLinks(); + int numLinks = softBody->m_links.size(); + int maxLinks = numLinks; + + // Allocate space for the links + getLinkData().createLinks( numLinks ); + + // Add the links + for( int link = 0; link < numLinks; ++link ) + { + int vertexIndex0 = softBody->m_links[link].m_n[0] - &(softBody->m_nodes[0]); + int vertexIndex1 = softBody->m_links[link].m_n[1] - &(softBody->m_nodes[0]); + + btSoftBodyLinkData::LinkDescription newLink(vertexIndex0 + firstVertex, vertexIndex1 + firstVertex, softBody->m_links[link].m_material->m_kLST); + newLink.setLinkStrength(1.f); + getLinkData().setLinkAt(newLink, firstLink + link); + } + + newSoftBody->setFirstVertex( firstVertex ); + newSoftBody->setFirstTriangle( firstTriangle ); + newSoftBody->setNumVertices( numVertices ); + newSoftBody->setMaxVertices( maxVertices ); + newSoftBody->setNumTriangles( numTriangles ); + newSoftBody->setMaxTriangles( maxTriangles ); + newSoftBody->setFirstLink( firstLink ); + newSoftBody->setNumLinks( numLinks ); + } + + + + updateConstants(0.f); + } +} + + + + +void btCPUSoftBodySolver::updateSoftBodies() +{ + using namespace Vectormath::Aos; + + int numVertices = m_vertexData.getNumVertices(); + int numTriangles = m_triangleData.getNumTriangles(); + + // Initialise normal and vertex counts + for( int vertexIndex = 0; vertexIndex < numVertices; ++vertexIndex ) + { + m_vertexData.getArea(vertexIndex) = 0.f; + m_vertexData.getNormal(vertexIndex) = Vector3(0.f, 0.f, 0.f); + } + + // Update the areas for the triangles and vertices. + for( int triangleIndex = 0; triangleIndex < numTriangles; ++triangleIndex ) + { + float &triangleArea( m_triangleData.getTriangleArea( triangleIndex ) ); + const btSoftBodyTriangleData::TriangleNodeSet &vertices( m_triangleData.getVertexSet(triangleIndex) ); + + Point3 &vertexPosition0( m_vertexData.getPosition( vertices.vertex0 ) ); + Point3 &vertexPosition1( m_vertexData.getPosition( vertices.vertex1 ) ); + Point3 &vertexPosition2( m_vertexData.getPosition( vertices.vertex2 ) ); + + triangleArea = computeTriangleArea( vertexPosition0, vertexPosition1, vertexPosition2 ); + + // Add to areas for vertices and increase the count of the number of triangles affecting the vertex + m_vertexData.getArea(vertices.vertex0) += triangleArea; + m_vertexData.getArea(vertices.vertex1) += triangleArea; + m_vertexData.getArea(vertices.vertex2) += triangleArea; + + Point3 &vertex0( m_vertexData.getPosition(vertices.vertex0) ); + Point3 &vertex1( m_vertexData.getPosition(vertices.vertex1) ); + Point3 &vertex2( m_vertexData.getPosition(vertices.vertex2) ); + + Vector3 triangleNormal = cross( vertex1-vertex0, vertex2 - vertex0 ); + + m_triangleData.getNormal(triangleIndex) = normalize(triangleNormal); + + m_vertexData.getNormal(vertices.vertex0) += triangleNormal; + m_vertexData.getNormal(vertices.vertex1) += triangleNormal; + m_vertexData.getNormal(vertices.vertex2) += triangleNormal; + + } + + // Normalise the area and normals + for( int vertexIndex = 0; vertexIndex < numVertices; ++vertexIndex ) + { + m_vertexData.getArea(vertexIndex) /= m_vertexData.getTriangleCount(vertexIndex); + m_vertexData.getNormal(vertexIndex) = normalize( m_vertexData.getNormal(vertexIndex) ); + } + + + // Clear the collision shape array for the next frame + m_collisionObjectDetails.clear(); + +} // updateSoftBodies + + +Vectormath::Aos::Vector3 btCPUSoftBodySolver::ProjectOnAxis( const Vectormath::Aos::Vector3 &v, const Vectormath::Aos::Vector3 &a ) +{ + return a*Vectormath::Aos::dot(v, a); +} + +void btCPUSoftBodySolver::ApplyClampedForce( float solverdt, const Vectormath::Aos::Vector3 &force, const Vectormath::Aos::Vector3 &vertexVelocity, float inverseMass, Vectormath::Aos::Vector3 &vertexForce ) +{ + float dtInverseMass = solverdt*inverseMass; + if( Vectormath::Aos::lengthSqr(force * dtInverseMass) > Vectormath::Aos::lengthSqr(vertexVelocity) ) + { + vertexForce -= ProjectOnAxis( vertexVelocity, normalize( force ) )/dtInverseMass; + } else { + vertexForce += force; + } +} + +bool btCPUSoftBodySolver::checkInitialized() +{ + return true; +} + +void btCPUSoftBodySolver::applyForces( float solverdt ) +{ + using namespace Vectormath::Aos; + + int numVertices = m_vertexData.getNumVertices(); + for( int clothIndex = 0; clothIndex < m_softBodySet.size(); ++clothIndex ) + { + btAcceleratedSoftBodyInterface *currentCloth = m_softBodySet[clothIndex]; + const int startVertex = currentCloth->getFirstVertex(); + const int numVertices = currentCloth->getNumVertices(); + + Vector3 velocityChange = m_perClothAcceleration[clothIndex]*solverdt; + for( int vertexIndex = startVertex; vertexIndex < (startVertex + numVertices); ++vertexIndex ) + { + float inverseMass = m_vertexData.getInverseMass( vertexIndex ); + Vector3 &vertexVelocity( m_vertexData.getVelocity( vertexIndex ) ); + + // First apply the global acceleration to all vertices + if( inverseMass > 0 ) + vertexVelocity += velocityChange; + + // If it's a non-static vertex + if( m_vertexData.getInverseMass(vertexIndex) > 0 ) + { + // Wind effects on a wind-per-cloth basis + float liftFactor = m_perClothLiftFactor[clothIndex]; + float dragFactor = m_perClothDragFactor[clothIndex]; + if( (liftFactor > 0.f) || (dragFactor > 0.f) ) + { + Vector3 normal = m_vertexData.getNormal(vertexIndex); + Vector3 relativeWindVelocity = m_vertexData.getVelocity(vertexIndex) - m_perClothWindVelocity[clothIndex]; + float relativeSpeedSquared = lengthSqr(relativeWindVelocity); + if( relativeSpeedSquared > FLT_EPSILON ) + { + normal = normal * (dot(normal, relativeWindVelocity) < 0 ? -1.f : +1.f); + float dvNormal = dot(normal, relativeWindVelocity); + if( dvNormal > 0 ) + { + Vector3 force( 0.f, 0.f, 0.f ); + float c0 = m_vertexData.getArea(vertexIndex) * dvNormal * relativeSpeedSquared / 2; + float c1 = c0 * m_perClothMediumDensity[clothIndex]; + force += normal * (-c1 * liftFactor); + force += normalize(relativeWindVelocity)*(-c1 * dragFactor); + + Vectormath::Aos::Vector3 &vertexForce( m_vertexData.getForceAccumulator(vertexIndex) ); + ApplyClampedForce( solverdt, force, vertexVelocity, inverseMass, vertexForce ); + } + } + } + } + } + } +} // btCPUSoftBodySolver::applyForces + +/** + * Integrate motion on the solver. + */ +void btCPUSoftBodySolver::integrate( float solverdt ) +{ + using namespace Vectormath::Aos; + int numVertices = m_vertexData.getNumVertices(); + for( int vertexIndex = 0; vertexIndex < numVertices; ++vertexIndex ) + { + Point3 &position( m_vertexData.getPosition(vertexIndex) ); + Point3 &previousPosition( m_vertexData.getPreviousPosition(vertexIndex) ); + Vector3 &forceAccumulator( m_vertexData.getForceAccumulator(vertexIndex) ); + Vector3 &velocity( m_vertexData.getVelocity(vertexIndex) ); + float inverseMass = m_vertexData.getInverseMass(vertexIndex); + + previousPosition = position; + velocity += forceAccumulator * inverseMass * solverdt; + position += velocity * solverdt; + forceAccumulator = Vector3(0.f, 0.f, 0.f); + } +} // btCPUSoftBodySolver::integrate + +float btCPUSoftBodySolver::computeTriangleArea( + const Vectormath::Aos::Point3 &vertex0, + const Vectormath::Aos::Point3 &vertex1, + const Vectormath::Aos::Point3 &vertex2 ) +{ + Vectormath::Aos::Vector3 a = vertex1 - vertex0; + Vectormath::Aos::Vector3 b = vertex2 - vertex0; + Vectormath::Aos::Vector3 crossProduct = cross(a, b); + float area = length( crossProduct ); + return area; +} + +void btCPUSoftBodySolver::updateConstants( float timeStep ) +{ + using namespace Vectormath::Aos; + + if( m_updateSolverConstants ) + { + m_updateSolverConstants = false; + + // Will have to redo this if we change the structure (tear, maybe) or various other possible changes + + // Initialise link constants + const int numLinks = m_linkData.getNumLinks(); + for( int linkIndex = 0; linkIndex < numLinks; ++linkIndex ) + { + btSoftBodyLinkData::LinkNodePair &vertices( m_linkData.getVertexPair(linkIndex) ); + m_linkData.getRestLength(linkIndex) = length((m_vertexData.getPosition( vertices.vertex0 ) - m_vertexData.getPosition( vertices.vertex1 ))); + float invMass0 = m_vertexData.getInverseMass(vertices.vertex0); + float invMass1 = m_vertexData.getInverseMass(vertices.vertex1); + float linearStiffness = m_linkData.getLinearStiffnessCoefficient(linkIndex); + float massLSC = (invMass0 + invMass1)/linearStiffness; + m_linkData.getMassLSC(linkIndex) = massLSC; + float restLength = m_linkData.getRestLength(linkIndex); + float restLengthSquared = restLength*restLength; + m_linkData.getRestLengthSquared(linkIndex) = restLengthSquared; + } + } +} // btCPUSoftBodySolver::updateConstants + +/** + * Sort the collision object details array and generate indexing into it for the per-cloth collision object array. + */ +void btCPUSoftBodySolver::prepareCollisionConstraints() +{ + // First do a simple radix sort on the collision objects + btAlignedObjectArray numObjectsPerClothPrefixSum; + btAlignedObjectArray numObjectsPerCloth; + numObjectsPerCloth.resize( m_softBodySet.size(), 0 ); + numObjectsPerClothPrefixSum.resize( m_softBodySet.size(), 0 ); + + btAlignedObjectArray< CollisionShapeDescription > m_collisionObjectDetailsCopy(m_collisionObjectDetails); + // Count and prefix sum number of previous cloths + for( int collisionObject = 0; collisionObject < m_collisionObjectDetailsCopy.size(); ++collisionObject ) + { + CollisionShapeDescription &shapeDescription( m_collisionObjectDetailsCopy[collisionObject] ); + ++numObjectsPerClothPrefixSum[shapeDescription.softBodyIdentifier]; + } + int sum = 0; + for( int cloth = 0; cloth < m_softBodySet.size(); ++cloth ) + { + int currentValue = numObjectsPerClothPrefixSum[cloth]; + numObjectsPerClothPrefixSum[cloth] = sum; + sum += currentValue; + } + // Move into the target array + for( int collisionObject = 0; collisionObject < m_collisionObjectDetailsCopy.size(); ++collisionObject ) + { + CollisionShapeDescription &shapeDescription( m_collisionObjectDetailsCopy[collisionObject] ); + int clothID = shapeDescription.softBodyIdentifier; + int newLocation = numObjectsPerClothPrefixSum[clothID] + numObjectsPerCloth[clothID]; + numObjectsPerCloth[shapeDescription.softBodyIdentifier]++; + m_collisionObjectDetails[newLocation] = shapeDescription; + } + for( int collisionObject = 0; collisionObject < m_collisionObjectDetailsCopy.size(); ++collisionObject ) + { + CollisionShapeDescription &shapeDescription( m_collisionObjectDetails[collisionObject] ); + } + + // Generating indexing for perClothCollisionObjects + // First clear the previous values + for( int clothIndex = 0; clothIndex < m_perClothCollisionObjects.size(); ++clothIndex ) + { + m_perClothCollisionObjects[clothIndex].firstObject = 0; + m_perClothCollisionObjects[clothIndex].endObject = 0; + } + int currentCloth = 0; + int startIndex = 0; + for( int collisionObject = 0; collisionObject < m_collisionObjectDetails.size(); ++collisionObject ) + { + int nextCloth = m_collisionObjectDetails[collisionObject].softBodyIdentifier; + if( nextCloth != currentCloth ) + { + // Changed cloth in the array + // Set the end index and the range is what we need for currentCloth + m_perClothCollisionObjects[currentCloth].firstObject = startIndex; + m_perClothCollisionObjects[currentCloth].endObject = collisionObject; + currentCloth = nextCloth; + startIndex = collisionObject; + } + } + //m_perClothCollisionObjects +} // prepareCollisionConstraints + + +void btCPUSoftBodySolver::solveConstraints( float solverdt ) +{ + using Vectormath::Aos::Vector3; + using Vectormath::Aos::Point3; + using Vectormath::Aos::lengthSqr; + using Vectormath::Aos::dot; + + // Prepare links + int numLinks = m_linkData.getNumLinks(); + int numVertices = m_vertexData.getNumVertices(); + + float kst = 1.f; + + for( int linkIndex = 0; linkIndex < numLinks; ++linkIndex ) + { + btSoftBodyLinkData::LinkNodePair &nodePair( m_linkData.getVertexPair(linkIndex) ); + Vector3 currentLength = m_vertexData.getPreviousPosition( nodePair.vertex1 ) - m_vertexData.getPreviousPosition( nodePair.vertex0 ); + m_linkData.getCurrentLength(linkIndex) = currentLength; + + // If mass at both ends of links is 0 (both static points) then we don't want this information. + // In reality this would be a fairly pointless link, but it could have been inserted + float linkLengthRatio = 0; + if( m_linkData.getMassLSC(linkIndex) > 0 ) + linkLengthRatio = 1.f/(lengthSqr(currentLength) * m_linkData.getMassLSC(linkIndex)); + m_linkData.getLinkLengthRatio(linkIndex) = linkLengthRatio; + + } + +#if 0 + prepareCollisionConstraints(); + + // Solve collision constraints + // Very simple solver that pushes the vertex out of collision imposters for now + // to test integration with the broad phase code. + // May also want to put this into position solver loop every n iterations depending on + // how it behaves + for( int clothIndex = 0; clothIndex < m_softBodySet.size(); ++clothIndex ) + { + btAcceleratedSoftBodyInterface *currentCloth = m_softBodySet[clothIndex]; + + const int startVertex = currentCloth->getFirstVertex(); + const int numVertices = currentCloth->getNumVertices(); + int endVertex = startVertex + numVertices; + + int startObject = m_perClothCollisionObjects[clothIndex].firstObject; + int endObject = m_perClothCollisionObjects[clothIndex].endObject; + + for( int collisionObject = startObject; collisionObject < endObject; ++collisionObject ) + { + CollisionShapeDescription &shapeDescription( m_collisionObjectDetails[collisionObject] ); + + if( shapeDescription.collisionShapeType == CAPSULE_SHAPE_PROXYTYPE ) + { + using namespace Vectormath::Aos; + + float capsuleHalfHeight = shapeDescription.shapeInformation.capsule.halfHeight; + float capsuleRadius = shapeDescription.shapeInformation.capsule.radius; + Transform3 worldTransform = shapeDescription.shapeTransform; + for( int vertexIndex = startVertex; vertexIndex < endVertex; ++vertexIndex ) + { + Point3 vertex( m_vertexData.getPosition( vertexIndex ) ); + Point3 c1(0.f, -capsuleHalfHeight, 0.f); + Point3 c2(0.f, +capsuleHalfHeight, 0.f); + Point3 worldC1 = worldTransform * c1; + Point3 worldC2 = worldTransform * c2; + Vector3 segment = worldC2 - worldC1; + + // compute distance of tangent to vertex along line segment in capsule + float distanceAlongSegment = -( dot( worldC1 - vertex, segment ) / lengthSqr(segment) ); + + Point3 closestPoint = (worldC1 + segment * distanceAlongSegment); + float distanceFromLine = length(vertex - closestPoint); + float distanceFromC1 = length(worldC1 - vertex); + float distanceFromC2 = length(worldC2 - vertex); + + // Final distance from collision, point to push from, direction to push in + // for impulse force + float distance; + Point3 sourcePoint; + Vector3 pushVector; + if( distanceAlongSegment < 0 ) + { + distance = distanceFromC1; + sourcePoint = worldC1; + pushVector = normalize(vertex - worldC1); + } else if( distanceAlongSegment > 1.f ) { + distance = distanceFromC1; + sourcePoint = worldC1; + pushVector = normalize(vertex - worldC1); + } else { + distance = distanceFromLine; + sourcePoint = closestPoint; + pushVector = normalize(vertex - closestPoint); + } + + // For now just update vertex position by moving to radius distance along the push vector + // Could use this as the basis for simple vector distance constraint for the point later, possibly? + // That way in the main solver loop all shape types could be the same... though when + // we need to apply bi-directionally it becomes more complicated + m_vertexData.getPosition( vertexIndex ) = closestPoint + capsuleRadius * pushVector; + } + } + } + } +#endif + + for( int iteration = 0; iteration < m_numberOfVelocityIterations ; ++iteration ) + { + // Solve velocity + for(int linkIndex = 0; linkIndex < numLinks; ++linkIndex) + { + + int vertexIndex0 = m_linkData.getVertexPair(linkIndex).vertex0; + int vertexIndex1 = m_linkData.getVertexPair(linkIndex).vertex1; + + float j = -dot(m_linkData.getCurrentLength(linkIndex), m_vertexData.getVelocity(vertexIndex0) - m_vertexData.getVelocity(vertexIndex1)) * m_linkData.getLinkLengthRatio(linkIndex)*kst; + + // If both ends of the link have no mass then this will be zero. Catch that case. + // TODO: Should really catch the /0 in the link setup, too + //if(psb->m_linksc0[i]>0) + { + m_vertexData.getVelocity(vertexIndex0) = m_vertexData.getVelocity(vertexIndex0) + m_linkData.getCurrentLength(linkIndex)*j*m_vertexData.getInverseMass(vertexIndex0); + m_vertexData.getVelocity(vertexIndex1) = m_vertexData.getVelocity(vertexIndex1) - m_linkData.getCurrentLength(linkIndex)*j*m_vertexData.getInverseMass(vertexIndex1); + } + } + } + + // Compute new positions from velocity + // Also update the previous position so that our position computation is now based on the new position from the velocity solution + // rather than based directly on the original positions + if( m_numberOfVelocityIterations > 0 ) + { + for(int vertexIndex = 0; vertexIndex < numVertices; ++vertexIndex) + { + m_vertexData.getPosition(vertexIndex) = m_vertexData.getPreviousPosition(vertexIndex) + m_vertexData.getVelocity(vertexIndex) * solverdt; + m_vertexData.getPreviousPosition(vertexIndex) = m_vertexData.getPosition(vertexIndex); + } + } + + // Solve drift + for( int iteration = 0; iteration < m_numberOfPositionIterations ; ++iteration ) + { + for( int clothIndex = 0; clothIndex < m_softBodySet.size(); ++clothIndex ) + { + btAcceleratedSoftBodyInterface *currentCloth = m_softBodySet[clothIndex]; + + const int startLink = currentCloth->getFirstLink(); + const int numLinks = currentCloth->getNumLinks(); + + int endLink = startLink + numLinks; + for(int linkIndex = startLink; linkIndex < endLink; ++linkIndex) + { + int vertexIndex0 = m_linkData.getVertexPair(linkIndex).vertex0; + int vertexIndex1 = m_linkData.getVertexPair(linkIndex).vertex1; + + float massLSC = m_linkData.getMassLSC(linkIndex); + if( massLSC > 0.f ) + { + Point3 &vertexPosition0( m_vertexData.getPosition( vertexIndex0 ) ); + Point3 &vertexPosition1( m_vertexData.getPosition( vertexIndex1 ) ); + + Vector3 del = vertexPosition1 - vertexPosition0; + float len = lengthSqr(del); + float restLength2 = m_linkData.getRestLengthSquared(linkIndex); + float k = ((restLength2 - len) / (massLSC * (restLength2 + len) ) )*kst; + + vertexPosition0 -= del*(k*m_vertexData.getInverseMass(vertexIndex0)); + vertexPosition1 += del*(k*m_vertexData.getInverseMass(vertexIndex1)); + } + } + } + } + for( int clothIndex = 0; clothIndex < m_softBodySet.size(); ++clothIndex ) + { + btAcceleratedSoftBodyInterface *currentCloth = m_softBodySet[clothIndex]; + + const int startLink = currentCloth->getFirstLink(); + const int numLinks = currentCloth->getNumLinks(); + const int startVertex = currentCloth->getFirstVertex(); + const int numVertices = currentCloth->getNumVertices(); + const int lastVertex = startVertex + numVertices; + // Update the velocities based on the change in position + // TODO: Damping should only be applied to the action of link constraints so the cloth still falls but then moves stiffly once it hits something + float velocityCoefficient = (1.f - m_perClothDampingFactor[clothIndex]); + float velocityCorrectionCoefficient = m_perClothVelocityCorrectionCoefficient[clothIndex]; + float isolverDt = 1.f/solverdt; + + if( m_numberOfVelocityIterations > 0 ) + { + for(int vertexIndex = startVertex; vertexIndex < lastVertex; ++vertexIndex) + { + m_vertexData.getVelocity(vertexIndex) += (m_vertexData.getPosition(vertexIndex) - m_vertexData.getPreviousPosition(vertexIndex)) * velocityCorrectionCoefficient * isolverDt; + m_vertexData.getVelocity(vertexIndex) *= velocityCoefficient; + m_vertexData.getForceAccumulator( vertexIndex ) = Vector3(0.f, 0.f, 0.f); + } + } else { + // If we didn't compute the velocity iteratively then we compute it purely based on the position change + for(int vertexIndex = startVertex; vertexIndex < lastVertex; ++vertexIndex) + { + m_vertexData.getVelocity(vertexIndex) = (m_vertexData.getPosition(vertexIndex) - m_vertexData.getPreviousPosition(vertexIndex)) * velocityCoefficient * isolverDt; + m_vertexData.getForceAccumulator( vertexIndex ) = Vector3(0.f, 0.f, 0.f); + } + } + } + +} // btCPUSoftBodySolver::solveConstraints + + +btCPUSoftBodySolver::btAcceleratedSoftBodyInterface *btCPUSoftBodySolver::findSoftBodyInterface( const btSoftBody* const softBody ) +{ + for( int softBodyIndex = 0; softBodyIndex < m_softBodySet.size(); ++softBodyIndex ) + { + btAcceleratedSoftBodyInterface *softBodyInterface = m_softBodySet[softBodyIndex]; + if( softBodyInterface->getSoftBody() == softBody ) + return softBodyInterface; + } + return 0; +} + +void btCPUSoftBodySolver::copySoftBodyToVertexBuffer( const btSoftBody * const softBody, btVertexBufferDescriptor *vertexBuffer ) +{ + // Currently only support CPU output buffers + // TODO: check for DX11 buffers. Take all offsets into the same DX11 buffer + // and use them together on a single kernel call if possible by setting up a + // per-cloth target buffer array for the copy kernel. + + btAcceleratedSoftBodyInterface *currentCloth = findSoftBodyInterface( softBody ); + + if( vertexBuffer->getBufferType() == btVertexBufferDescriptor::CPU_BUFFER ) + { + const int firstVertex = currentCloth->getFirstVertex(); + const int lastVertex = firstVertex + currentCloth->getNumVertices(); + const btCPUVertexBufferDescriptor *cpuVertexBuffer = static_cast< btCPUVertexBufferDescriptor* >(vertexBuffer); + float *basePointer = cpuVertexBuffer->getBasePointer(); + + if( vertexBuffer->hasVertexPositions() ) + { + const int vertexOffset = cpuVertexBuffer->getVertexOffset(); + const int vertexStride = cpuVertexBuffer->getVertexStride(); + float *vertexPointer = basePointer + vertexOffset; + + for( int vertexIndex = firstVertex; vertexIndex < lastVertex; ++vertexIndex ) + { + Vectormath::Aos::Point3 position = m_vertexData.getPosition(vertexIndex); + *(vertexPointer + 0) = position.getX(); + *(vertexPointer + 1) = position.getY(); + *(vertexPointer + 2) = position.getZ(); + vertexPointer += vertexStride; + } + } + if( vertexBuffer->hasNormals() ) + { + const int normalOffset = cpuVertexBuffer->getNormalOffset(); + const int normalStride = cpuVertexBuffer->getNormalStride(); + float *normalPointer = basePointer + normalOffset; + + for( int vertexIndex = firstVertex; vertexIndex < lastVertex; ++vertexIndex ) + { + Vectormath::Aos::Vector3 normal = m_vertexData.getNormal(vertexIndex); + *(normalPointer + 0) = normal.getX(); + *(normalPointer + 1) = normal.getY(); + *(normalPointer + 2) = normal.getZ(); + normalPointer += normalStride; + } + } + } +} // btCPUSoftBodySolver::outputToVertexBuffers + + + +void btCPUSoftBodySolver::addCollisionObjectForSoftBody( int clothIndex, btCollisionObject *collisionObject ) +{ + btCollisionShape *collisionShape = collisionObject->getCollisionShape(); + int shapeType = collisionShape->getShapeType(); + if( shapeType == CAPSULE_SHAPE_PROXYTYPE ) + { + // Add to the list of expected collision objects + CollisionShapeDescription newCollisionShapeDescription; + newCollisionShapeDescription.softBodyIdentifier = clothIndex; + newCollisionShapeDescription.collisionShapeType = shapeType; + newCollisionShapeDescription.shapeTransform = toTransform3(collisionObject->getWorldTransform()); + btCapsuleShape *capsule = static_cast( collisionShape ); + newCollisionShapeDescription.shapeInformation.capsule.radius = capsule->getRadius(); + newCollisionShapeDescription.shapeInformation.capsule.halfHeight = capsule->getHalfHeight(); + m_collisionObjectDetails.push_back( newCollisionShapeDescription ); + + // TODO: In the collision function, sort the above array on the clothIndex and generate the start and end indices + } else { + btAssert("Unsupported collision shape type\n"); + } +} + + +void btCPUSoftBodySolver::predictMotion( float timeStep ) +{ + // Fill the force arrays with current acceleration data etc + m_perClothWindVelocity.resize( m_softBodySet.size() ); + for( int softBodyIndex = 0; softBodyIndex < m_softBodySet.size(); ++softBodyIndex ) + { + btSoftBody *softBody = m_softBodySet[softBodyIndex]->getSoftBody(); + + m_perClothWindVelocity[softBodyIndex] = toVector3(softBody->getWindVelocity()); + } + + + // Apply forces that we know about to the cloths + applyForces( timeStep * getTimeScale() ); + + // Itegrate motion for all soft bodies dealt with by the solver + integrate( timeStep * getTimeScale() ); + // End prediction work for solvers +} + + diff --git a/src/BulletMultiThreaded/GpuSoftBodySolvers/CPU/btSoftBodySolver_CPU.h b/src/BulletMultiThreaded/GpuSoftBodySolvers/CPU/btSoftBodySolver_CPU.h new file mode 100644 index 000000000..51adedf39 --- /dev/null +++ b/src/BulletMultiThreaded/GpuSoftBodySolvers/CPU/btSoftBodySolver_CPU.h @@ -0,0 +1,345 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef BT_ACCELERATED_SOFT_BODY_CPU_SOLVER_H +#define BT_ACCELERATED_SOFT_BODY_CPU_SOLVER_H + +#include "vectormath_aos.h" + +#include "BulletSoftBody/btSoftBodySolvers.h" +#include "BulletSoftBody/btSoftBodySolverVertexBuffer.h" +#include "BulletMultiThreaded/GpuSoftBodySolvers/CPU/btSoftBodySolverData.h" + + + +class btCPUSoftBodySolver : public btSoftBodySolver +{ +protected: + /** + * Entry in the collision shape array. + * Specifies the shape type, the transform matrix and the necessary details of the collisionShape. + */ + struct CollisionShapeDescription + { + int softBodyIdentifier; + int collisionShapeType; + Vectormath::Aos::Transform3 shapeTransform; + union + { + struct Sphere + { + float radius; + } sphere; + struct Capsule + { + float radius; + float halfHeight; + } capsule; + } shapeInformation; + + CollisionShapeDescription() + { + collisionShapeType = 0; + } + }; + + /** + * SoftBody class to maintain information about a soft body instance + * within a solver. + * This data addresses the main solver arrays. + */ + class btAcceleratedSoftBodyInterface + { + protected: + /** Current number of vertices that are part of this cloth */ + int m_numVertices; + /** Maximum number of vertices allocated to be part of this cloth */ + int m_maxVertices; + /** Current number of triangles that are part of this cloth */ + int m_numTriangles; + /** Maximum number of triangles allocated to be part of this cloth */ + int m_maxTriangles; + /** Index of first vertex in the world allocated to this cloth */ + int m_firstVertex; + /** Index of first triangle in the world allocated to this cloth */ + int m_firstTriangle; + /** Index of first link in the world allocated to this cloth */ + int m_firstLink; + /** Maximum number of links allocated to this cloth */ + int m_maxLinks; + /** Current number of links allocated to this cloth */ + int m_numLinks; + + /** The actual soft body this data represents */ + btSoftBody *m_softBody; + + + public: + btAcceleratedSoftBodyInterface( btSoftBody *softBody ) : + m_softBody( softBody ) + { + m_numVertices = 0; + m_maxVertices = 0; + m_numTriangles = 0; + m_maxTriangles = 0; + m_firstVertex = 0; + m_firstTriangle = 0; + m_firstLink = 0; + m_maxLinks = 0; + m_numLinks = 0; + } + int getNumVertices() + { + return m_numVertices; + } + + int getNumTriangles() + { + return m_numTriangles; + } + + int getMaxVertices() + { + return m_maxVertices; + } + + int getMaxTriangles() + { + return m_maxTriangles; + } + + int getFirstVertex() + { + return m_firstVertex; + } + + int getFirstTriangle() + { + return m_firstTriangle; + } + + // TODO: All of these set functions will have to do checks and + // update the world because restructuring of the arrays will be necessary + // Reasonable use of "friend"? + void setNumVertices( int numVertices ) + { + m_numVertices = numVertices; + } + + void setNumTriangles( int numTriangles ) + { + m_numTriangles = numTriangles; + } + + void setMaxVertices( int maxVertices ) + { + m_maxVertices = maxVertices; + } + + void setMaxTriangles( int maxTriangles ) + { + m_maxTriangles = maxTriangles; + } + + void setFirstVertex( int firstVertex ) + { + m_firstVertex = firstVertex; + } + + void setFirstTriangle( int firstTriangle ) + { + m_firstTriangle = firstTriangle; + } + + void setMaxLinks( int maxLinks ) + { + m_maxLinks = maxLinks; + } + + void setNumLinks( int numLinks ) + { + m_numLinks = numLinks; + } + + void setFirstLink( int firstLink ) + { + m_firstLink = firstLink; + } + + int getMaxLinks() + { + return m_maxLinks; + } + + int getNumLinks() + { + return m_numLinks; + } + + int getFirstLink() + { + return m_firstLink; + } + + btSoftBody* getSoftBody() + { + return m_softBody; + } + + #if 0 + void setAcceleration( Vectormath::Aos::Vector3 acceleration ) + { + m_currentSolver->setPerClothAcceleration( m_clothIdentifier, acceleration ); + } + + void setWindVelocity( Vectormath::Aos::Vector3 windVelocity ) + { + m_currentSolver->setPerClothWindVelocity( m_clothIdentifier, windVelocity ); + } + + /** + * Set the density of the air in which the cloth is situated. + */ + void setAirDensity( btScalar density ) + { + m_currentSolver->setPerClothMediumDensity( m_clothIdentifier, static_cast(density) ); + } + + /** + * Add a collision object to this soft body. + */ + void addCollisionObject( btCollisionObject *collisionObject ) + { + m_currentSolver->addCollisionObjectForSoftBody( m_clothIdentifier, collisionObject ); + } + #endif + }; + + + struct CollisionObjectIndices + { + int firstObject; + int endObject; + }; + + + + btSoftBodyLinkData m_linkData; + btSoftBodyVertexData m_vertexData; + btSoftBodyTriangleData m_triangleData; + + /** Variable to define whether we need to update solver constants on the next iteration */ + bool m_updateSolverConstants; + + /** + * Cloths owned by this solver. + * Only our cloths are in this array. + */ + btAlignedObjectArray< btAcceleratedSoftBodyInterface * > m_softBodySet; + + /** Acceleration value to be applied to all non-static vertices in the solver. + * Index n is cloth n, array sized by number of cloths in the world not the solver. + */ + btAlignedObjectArray< Vectormath::Aos::Vector3 > m_perClothAcceleration; + + /** Wind velocity to be applied normal to all non-static vertices in the solver. + * Index n is cloth n, array sized by number of cloths in the world not the solver. + */ + btAlignedObjectArray< Vectormath::Aos::Vector3 > m_perClothWindVelocity; + + /** Velocity damping factor */ + btAlignedObjectArray< float > m_perClothDampingFactor; + + /** Velocity correction coefficient */ + btAlignedObjectArray< float > m_perClothVelocityCorrectionCoefficient; + + /** Lift parameter for wind effect on cloth. */ + btAlignedObjectArray< float > m_perClothLiftFactor; + + /** Drag parameter for wind effect on cloth. */ + btAlignedObjectArray< float > m_perClothDragFactor; + + /** Density of the medium in which each cloth sits */ + btAlignedObjectArray< float > m_perClothMediumDensity; + + /** + * Collision shape details: pair of index of first collision shape for the cloth and number of collision objects. + */ + btAlignedObjectArray< CollisionObjectIndices > m_perClothCollisionObjects; + + /** + * Collision shapes being passed across to the cloths in this solver. + */ + btAlignedObjectArray< CollisionShapeDescription > m_collisionObjectDetails; + + + void prepareCollisionConstraints(); + + Vectormath::Aos::Vector3 ProjectOnAxis( const Vectormath::Aos::Vector3 &v, const Vectormath::Aos::Vector3 &a ); + + void ApplyClampedForce( float solverdt, const Vectormath::Aos::Vector3 &force, const Vectormath::Aos::Vector3 &vertexVelocity, float inverseMass, Vectormath::Aos::Vector3 &vertexForce ); + + float computeTriangleArea( + const Vectormath::Aos::Point3 &vertex0, + const Vectormath::Aos::Point3 &vertex1, + const Vectormath::Aos::Point3 &vertex2 ); + + void applyForces( float solverdt ); + void integrate( float solverdt ); + void updateConstants( float timeStep ); + btAcceleratedSoftBodyInterface *findSoftBodyInterface( const btSoftBody* const softBody ); + + +public: + btCPUSoftBodySolver(); + + virtual ~btCPUSoftBodySolver(); + + + virtual btSoftBodyLinkData &getLinkData(); + + virtual btSoftBodyVertexData &getVertexData(); + + virtual btSoftBodyTriangleData &getTriangleData(); + + + + + + /** + * Add a collision object to be used by the indicated softbody. + */ + virtual void addCollisionObjectForSoftBody( int clothIdentifier, btCollisionObject *collisionObject ); + + + + + + + + virtual bool checkInitialized(); + + virtual void updateSoftBodies( ); + + virtual void optimize( btAlignedObjectArray< btSoftBody * > &softBodies ); + + virtual void solveConstraints( float solverdt ); + + virtual void predictMotion( float solverdt ); + + virtual void copySoftBodyToVertexBuffer( const btSoftBody *const softBody, btVertexBufferDescriptor *vertexBuffer ); +}; + +#endif // #ifndef BT_ACCELERATED_SOFT_BODY_CPU_SOLVER_H \ No newline at end of file diff --git a/src/BulletMultiThreaded/GpuSoftBodySolvers/DX11/CMakeLists.txt b/src/BulletMultiThreaded/GpuSoftBodySolvers/DX11/CMakeLists.txt new file mode 100644 index 000000000..5fea665b0 --- /dev/null +++ b/src/BulletMultiThreaded/GpuSoftBodySolvers/DX11/CMakeLists.txt @@ -0,0 +1,76 @@ + +INCLUDE_DIRECTORIES( +${BULLET_PHYSICS_SOURCE_DIR}/src +) + +SET(DXSDK_DIR $ENV{DXSDK_DIR}) +SET(DX11_INCLUDE_PATH "${DIRECTX_SDK_BASE_DIR}/Include" CACHE DOCSTRING "Microsoft directX SDK include path") + + +INCLUDE_DIRECTORIES( +${DX11_INCLUDE_PATH} "../cpu/" +${VECTOR_MATH_INCLUDE} +) + +SET(BulletSoftBodyDX11Solvers_SRCS + btSoftBodySolver_DX11.cpp +) + +SET(BulletSoftBodyDX11Solvers_HDRS + btSoftBodySolver_DX11.h + ../cpu/btSoftBodySolverData.h + btSoftBodySolverVertexData_DX11.h + btSoftBodySolverTriangleData_DX11.h + btSoftBodySolverLinkData_DX11.h + btSoftBodySolverBuffer_DX11.h + btSoftBodySolverVertexBuffer_DX11.h + +) + +# OpenCL and HLSL Shaders. +# Build rules generated to stringify these into headers +# which are needed by some of the sources +SET(BulletSoftBodyDX11Solvers_Shaders + OutputToVertexArray + UpdateNormals + Integrate + UpdatePositions + UpdateNodes + SolvePositions + UpdatePositionsFromVelocities + ApplyForces + PrepareLinks + VSolveLinks +) + +foreach(f ${BulletSoftBodyDX11Solvers_Shaders}) + LIST(APPEND BulletSoftBodyDX11Solvers_HLSL "HLSL/${f}.hlsl") +endforeach(f) + + + +ADD_LIBRARY(BulletSoftBodySolvers_DX11 ${BulletSoftBodyDX11Solvers_SRCS} ${BulletSoftBodyDX11Solvers_HDRS} ${BulletSoftBodyDX11Solvers_HLSL}) +SET_TARGET_PROPERTIES(BulletSoftBodySolvers_DX11 PROPERTIES VERSION ${BULLET_VERSION}) +SET_TARGET_PROPERTIES(BulletSoftBodySolvers_DX11 PROPERTIES SOVERSION ${BULLET_VERSION}) +IF (BUILD_SHARED_LIBS) + TARGET_LINK_LIBRARIES(BulletSoftBody BulletDynamics) +ENDIF (BUILD_SHARED_LIBS) + + +IF (INSTALL_LIBS) + IF (NOT INTERNAL_CREATE_DISTRIBUTABLE_MSVC_PROJECTFILES) + IF (${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION} GREATER 2.5) + IF (APPLE AND BUILD_SHARED_LIBS AND FRAMEWORK) + INSTALL(TARGETS BulletSoftBodySolvers_DX11 DESTINATION .) + ELSE (APPLE AND BUILD_SHARED_LIBS AND FRAMEWORK) + INSTALL(TARGETS BulletSoftBodySolvers_DX11 DESTINATION lib${LIB_SUFFIX}) + INSTALL(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} DESTINATION include FILES_MATCHING PATTERN "*.h") + ENDIF (APPLE AND BUILD_SHARED_LIBS AND FRAMEWORK) + ENDIF (${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION} GREATER 2.5) + + IF (APPLE AND BUILD_SHARED_LIBS AND FRAMEWORK) + SET_TARGET_PROPERTIES(BulletSoftBodySolvers_DX11 PROPERTIES FRAMEWORK true) + SET_TARGET_PROPERTIES(BulletSoftBodySolvers_DX11 PROPERTIES PUBLIC_HEADER "${BulletSoftBodyDX11Solvers_HDRS}") + ENDIF (APPLE AND BUILD_SHARED_LIBS AND FRAMEWORK) + ENDIF (NOT INTERNAL_CREATE_DISTRIBUTABLE_MSVC_PROJECTFILES) +ENDIF (INSTALL_LIBS) diff --git a/src/BulletMultiThreaded/GpuSoftBodySolvers/DX11/HLSL/ApplyForces.hlsl b/src/BulletMultiThreaded/GpuSoftBodySolvers/DX11/HLSL/ApplyForces.hlsl new file mode 100644 index 000000000..9f9ac07a3 --- /dev/null +++ b/src/BulletMultiThreaded/GpuSoftBodySolvers/DX11/HLSL/ApplyForces.hlsl @@ -0,0 +1,95 @@ +MSTRINGIFY( + +cbuffer ApplyForcesCB : register( b0 ) +{ + unsigned int numNodes; + float solverdt; + float epsilon; + int padding3; +}; + + +StructuredBuffer g_vertexClothIdentifier : register( t0 ); +StructuredBuffer g_vertexNormal : register( t1 ); +StructuredBuffer g_vertexArea : register( t2 ); +StructuredBuffer g_vertexInverseMass : register( t3 ); +// TODO: These could be combined into a lift/drag factor array along with medium density +StructuredBuffer g_clothLiftFactor : register( t4 ); +StructuredBuffer g_clothDragFactor : register( t5 ); +StructuredBuffer g_clothWindVelocity : register( t6 ); +StructuredBuffer g_clothAcceleration : register( t7 ); +StructuredBuffer g_clothMediumDensity : register( t8 ); + +RWStructuredBuffer g_vertexForceAccumulator : register( u0 ); +RWStructuredBuffer g_vertexVelocity : register( u1 ); + +float3 projectOnAxis( float3 v, float3 a ) +{ + return (a*dot(v, a)); +} + +[numthreads(128, 1, 1)] +void +ApplyForcesKernel( uint3 Gid : SV_GroupID, uint3 DTid : SV_DispatchThreadID, uint3 GTid : SV_GroupThreadID, uint GI : SV_GroupIndex ) +{ + unsigned int nodeID = DTid.x; + if( nodeID < numNodes ) + { + int clothId = g_vertexClothIdentifier[nodeID]; + float nodeIM = g_vertexInverseMass[nodeID]; + + if( nodeIM > 0.0f ) + { + float3 nodeV = g_vertexVelocity[nodeID].xyz; + float3 normal = g_vertexNormal[nodeID].xyz; + float area = g_vertexArea[nodeID]; + float3 nodeF = g_vertexForceAccumulator[nodeID].xyz; + + // Read per-cloth values + float3 clothAcceleration = g_clothAcceleration[clothId].xyz; + float3 clothWindVelocity = g_clothWindVelocity[clothId].xyz; + float liftFactor = g_clothLiftFactor[clothId]; + float dragFactor = g_clothDragFactor[clothId]; + float mediumDensity = g_clothMediumDensity[clothId]; + + // Apply the acceleration to the cloth rather than do this via a force + nodeV += (clothAcceleration*solverdt); + + g_vertexVelocity[nodeID] = float4(nodeV, 0.f); + + float3 relativeWindVelocity = nodeV - clothWindVelocity; + float relativeSpeedSquared = dot(relativeWindVelocity, relativeWindVelocity); + + if( relativeSpeedSquared > epsilon ) + { + // Correct direction of normal relative to wind direction and get dot product + normal = normal * (dot(normal, relativeWindVelocity) < 0 ? -1.f : 1.f); + float dvNormal = dot(normal, relativeWindVelocity); + if( dvNormal > 0 ) + { + float3 force = float3(0.f, 0.f, 0.f); + float c0 = area * dvNormal * relativeSpeedSquared / 2.f; + float c1 = c0 * mediumDensity; + force += normal * (-c1 * liftFactor); + force += normalize(relativeWindVelocity)*(-c1 * dragFactor); + + float dtim = solverdt * nodeIM; + float3 forceDTIM = force * dtim; + + float3 nodeFPlusForce = nodeF + force; + + // m_nodesf[i] -= ProjectOnAxis(m_nodesv[i], force.normalized())/dtim; + float3 nodeFMinus = nodeF - (projectOnAxis(nodeV, normalize(force))/dtim); + + nodeF = nodeFPlusForce; + if( dot(forceDTIM, forceDTIM) > dot(nodeV, nodeV) ) + nodeF = nodeFMinus; + + g_vertexForceAccumulator[nodeID] = float4(nodeF, 0.0f); + } + } + } + } +} + +); \ No newline at end of file diff --git a/src/BulletMultiThreaded/GpuSoftBodySolvers/DX11/HLSL/Integrate.hlsl b/src/BulletMultiThreaded/GpuSoftBodySolvers/DX11/HLSL/Integrate.hlsl new file mode 100644 index 000000000..e43870bed --- /dev/null +++ b/src/BulletMultiThreaded/GpuSoftBodySolvers/DX11/HLSL/Integrate.hlsl @@ -0,0 +1,41 @@ +MSTRINGIFY( + +cbuffer IntegrateCB : register( b0 ) +{ + int numNodes; + float solverdt; + int padding1; + int padding2; +}; + +// Node indices for each link +StructuredBuffer g_vertexInverseMasses : register( t0 ); + +RWStructuredBuffer g_vertexPositions : register( u0 ); +RWStructuredBuffer g_vertexVelocity : register( u1 ); +RWStructuredBuffer g_vertexPreviousPositions : register( u2 ); +RWStructuredBuffer g_vertexForceAccumulator : register( u3 ); + +[numthreads(128, 1, 1)] +void +IntegrateKernel( uint3 Gid : SV_GroupID, uint3 DTid : SV_DispatchThreadID, uint3 GTid : SV_GroupThreadID, uint GI : SV_GroupIndex ) +{ + int nodeID = DTid.x; + if( nodeID < numNodes ) + { + float3 position = g_vertexPositions[nodeID].xyz; + float3 velocity = g_vertexVelocity[nodeID].xyz; + float3 force = g_vertexForceAccumulator[nodeID].xyz; + float inverseMass = g_vertexInverseMasses[nodeID]; + + g_vertexPreviousPositions[nodeID] = float4(position, 0.f); + velocity += force * inverseMass * solverdt; + position += velocity * solverdt; + + g_vertexForceAccumulator[nodeID] = float4(0.f, 0.f, 0.f, 0.0f); + g_vertexPositions[nodeID] = float4(position, 0.f); + g_vertexVelocity[nodeID] = float4(velocity, 0.f); + } +} + +); \ No newline at end of file diff --git a/src/BulletMultiThreaded/GpuSoftBodySolvers/DX11/HLSL/OutputToVertexArray.hlsl b/src/BulletMultiThreaded/GpuSoftBodySolvers/DX11/HLSL/OutputToVertexArray.hlsl new file mode 100644 index 000000000..cd2924ddb --- /dev/null +++ b/src/BulletMultiThreaded/GpuSoftBodySolvers/DX11/HLSL/OutputToVertexArray.hlsl @@ -0,0 +1,63 @@ +MSTRINGIFY( + +cbuffer OutputToVertexArrayCB : register( b0 ) +{ + int startNode; + int numNodes; + int positionOffset; + int positionStride; + + int normalOffset; + int normalStride; + int padding1; + int padding2; +}; + + +StructuredBuffer g_vertexPositions : register( t0 ); +StructuredBuffer g_vertexNormals : register( t1 ); + +RWBuffer g_vertexBuffer : register( u0 ); + + +[numthreads(128, 1, 1)] +void +OutputToVertexArrayWithNormalsKernel( uint3 Gid : SV_GroupID, uint3 DTid : SV_DispatchThreadID, uint3 GTid : SV_GroupThreadID, uint GI : SV_GroupIndex ) +{ + int nodeID = DTid.x; + if( nodeID < numNodes ) + { + float4 position = g_vertexPositions[nodeID + startNode]; + float4 normal = g_vertexNormals[nodeID + startNode]; + + // Stride should account for the float->float4 conversion + int positionDestination = nodeID * positionStride + positionOffset; + g_vertexBuffer[positionDestination] = position.x; + g_vertexBuffer[positionDestination+1] = position.y; + g_vertexBuffer[positionDestination+2] = position.z; + + int normalDestination = nodeID * normalStride + normalOffset; + g_vertexBuffer[normalDestination] = normal.x; + g_vertexBuffer[normalDestination+1] = normal.y; + g_vertexBuffer[normalDestination+2] = normal.z; + } +} + +[numthreads(128, 1, 1)] +void +OutputToVertexArrayWithoutNormalsKernel( uint3 Gid : SV_GroupID, uint3 DTid : SV_DispatchThreadID, uint3 GTid : SV_GroupThreadID, uint GI : SV_GroupIndex ) +{ + int nodeID = DTid.x; + if( nodeID < numNodes ) + { + float4 position = g_vertexPositions[nodeID + startNode]; + float4 normal = g_vertexNormals[nodeID + startNode]; + + // Stride should account for the float->float4 conversion + int positionDestination = nodeID * positionStride + positionOffset; + g_vertexBuffer[positionDestination] = position.x; + g_vertexBuffer[positionDestination+1] = position.y; + g_vertexBuffer[positionDestination+2] = position.z; + } +} +); \ No newline at end of file diff --git a/src/BulletMultiThreaded/GpuSoftBodySolvers/DX11/HLSL/PrepareLinks.hlsl b/src/BulletMultiThreaded/GpuSoftBodySolvers/DX11/HLSL/PrepareLinks.hlsl new file mode 100644 index 000000000..269e65c39 --- /dev/null +++ b/src/BulletMultiThreaded/GpuSoftBodySolvers/DX11/HLSL/PrepareLinks.hlsl @@ -0,0 +1,44 @@ +MSTRINGIFY( + +cbuffer PrepareLinksCB : register( b0 ) +{ + int numLinks; + int padding0; + int padding1; + int padding2; +}; + +// Node indices for each link +StructuredBuffer g_linksVertexIndices : register( t0 ); +StructuredBuffer g_linksMassLSC : register( t1 ); +StructuredBuffer g_nodesPreviousPosition : register( t2 ); + +RWStructuredBuffer g_linksLengthRatio : register( u0 ); +RWStructuredBuffer g_linksCurrentLength : register( u1 ); + +[numthreads(128, 1, 1)] +void +PrepareLinksKernel( uint3 Gid : SV_GroupID, uint3 DTid : SV_DispatchThreadID, uint3 GTid : SV_GroupThreadID, uint GI : SV_GroupIndex ) +{ + int linkID = DTid.x; + if( linkID < numLinks ) + { + int2 nodeIndices = g_linksVertexIndices[linkID]; + int node0 = nodeIndices.x; + int node1 = nodeIndices.y; + + float4 nodePreviousPosition0 = g_nodesPreviousPosition[node0]; + float4 nodePreviousPosition1 = g_nodesPreviousPosition[node1]; + + float massLSC = g_linksMassLSC[linkID]; + + float4 linkCurrentLength = nodePreviousPosition1 - nodePreviousPosition0; + + float linkLengthRatio = dot(linkCurrentLength, linkCurrentLength)*massLSC; + linkLengthRatio = 1./linkLengthRatio; + + g_linksCurrentLength[linkID] = linkCurrentLength; + g_linksLengthRatio[linkID] = linkLengthRatio; + } +} +); \ No newline at end of file diff --git a/src/BulletMultiThreaded/GpuSoftBodySolvers/DX11/HLSL/SolvePositions.hlsl b/src/BulletMultiThreaded/GpuSoftBodySolvers/DX11/HLSL/SolvePositions.hlsl new file mode 100644 index 000000000..0eacaf1ad --- /dev/null +++ b/src/BulletMultiThreaded/GpuSoftBodySolvers/DX11/HLSL/SolvePositions.hlsl @@ -0,0 +1,55 @@ +MSTRINGIFY( + +cbuffer SolvePositionsFromLinksKernelCB : register( b0 ) +{ + int startLink; + int numLinks; + float kst; + float ti; +}; + +// Node indices for each link +StructuredBuffer g_linksVertexIndices : register( t0 ); + +StructuredBuffer g_linksMassLSC : register( t1 ); +StructuredBuffer g_linksRestLengthSquared : register( t2 ); +StructuredBuffer g_verticesInverseMass : register( t3 ); + +RWStructuredBuffer g_vertexPositions : register( u0 ); + +[numthreads(128, 1, 1)] +void +SolvePositionsFromLinksKernel( uint3 Gid : SV_GroupID, uint3 DTid : SV_DispatchThreadID, uint3 GTid : SV_GroupThreadID, uint GI : SV_GroupIndex ) +{ + int linkID = DTid.x + startLink; + if( DTid.x < numLinks ) + { + float massLSC = g_linksMassLSC[linkID]; + float restLengthSquared = g_linksRestLengthSquared[linkID]; + + if( massLSC > 0.0f ) + { + int2 nodeIndices = g_linksVertexIndices[linkID]; + int node0 = nodeIndices.x; + int node1 = nodeIndices.y; + + float3 position0 = g_vertexPositions[node0].xyz; + float3 position1 = g_vertexPositions[node1].xyz; + + float inverseMass0 = g_verticesInverseMass[node0]; + float inverseMass1 = g_verticesInverseMass[node1]; + + float3 del = position1 - position0; + float len = dot(del, del); + float k = ((restLengthSquared - len)/(massLSC*(restLengthSquared+len)))*kst; + position0 = position0 - del*(k*inverseMass0); + position1 = position1 + del*(k*inverseMass1); + + g_vertexPositions[node0] = float4(position0, 0.f); + g_vertexPositions[node1] = float4(position1, 0.f); + + } + } +} + +); \ No newline at end of file diff --git a/src/BulletMultiThreaded/GpuSoftBodySolvers/DX11/HLSL/UpdateConstants.hlsl b/src/BulletMultiThreaded/GpuSoftBodySolvers/DX11/HLSL/UpdateConstants.hlsl new file mode 100644 index 000000000..0b8031b9c --- /dev/null +++ b/src/BulletMultiThreaded/GpuSoftBodySolvers/DX11/HLSL/UpdateConstants.hlsl @@ -0,0 +1,48 @@ +MSTRINGIFY( + +cbuffer UpdateConstantsCB : register( b0 ) +{ + int numLinks; + int padding0; + int padding1; + int padding2; +}; + +// Node indices for each link +StructuredBuffer g_linksVertexIndices : register( t0 ); +StructuredBuffer g_vertexPositions : register( t1 ); +StructuredBuffer g_vertexInverseMasses : register( t2 ); +StructuredBuffer g_linksMaterialLSC : register( t3 ); + +RWStructuredBuffer g_linksMassLSC : register( u0 ); +RWStructuredBuffer g_linksRestLengthSquared : register( u1 ); +RWStructuredBuffer g_linksRestLengths : register( u2 ); + +[numthreads(128, 1, 1)] +void +UpdateConstantsKernel( uint3 Gid : SV_GroupID, uint3 DTid : SV_DispatchThreadID, uint3 GTid : SV_GroupThreadID, uint GI : SV_GroupIndex ) +{ + int linkID = DTid.x; + if( linkID < numLinks ) + { + int2 nodeIndices = g_linksVertexIndices[linkID]; + int node0 = nodeIndices.x; + int node1 = nodeIndices.y; + float linearStiffnessCoefficient = g_linksMaterialLSC[ linkID ]; + + float3 position0 = g_vertexPositions[node0].xyz; + float3 position1 = g_vertexPositions[node1].xyz; + float inverseMass0 = g_vertexInverseMasses[node0]; + float inverseMass1 = g_vertexInverseMasses[node1]; + + float3 difference = position0 - position1; + float length2 = dot(difference, difference); + float length = sqrt(length2); + + g_linksRestLengths[linkID] = length; + g_linksMassLSC[linkID] = (inverseMass0 + inverseMass1)/linearStiffnessCoefficient; + g_linksRestLengthSquared[linkID] = length*length; + } +} + +); \ No newline at end of file diff --git a/src/BulletMultiThreaded/GpuSoftBodySolvers/DX11/HLSL/UpdateNodes.hlsl b/src/BulletMultiThreaded/GpuSoftBodySolvers/DX11/HLSL/UpdateNodes.hlsl new file mode 100644 index 000000000..538cc226c --- /dev/null +++ b/src/BulletMultiThreaded/GpuSoftBodySolvers/DX11/HLSL/UpdateNodes.hlsl @@ -0,0 +1,49 @@ +MSTRINGIFY( + +cbuffer UpdateVelocitiesFromPositionsWithVelocitiesCB : register( b0 ) +{ + int numNodes; + float isolverdt; + int padding1; + int padding2; +}; + + +StructuredBuffer g_vertexPositions : register( t0 ); +StructuredBuffer g_vertexPreviousPositions : register( t1 ); +StructuredBuffer g_vertexClothIndices : register( t2 ); +StructuredBuffer g_clothVelocityCorrectionCoefficients : register( t3 ); +StructuredBuffer g_clothDampingFactor : register( t4 ); + +RWStructuredBuffer g_vertexVelocities : register( u0 ); +RWStructuredBuffer g_vertexForces : register( u1 ); + + +[numthreads(128, 1, 1)] +void +updateVelocitiesFromPositionsWithVelocitiesKernel( uint3 Gid : SV_GroupID, uint3 DTid : SV_DispatchThreadID, uint3 GTid : SV_GroupThreadID, uint GI : SV_GroupIndex ) +{ + int nodeID = DTid.x; + if( nodeID < numNodes ) + { + float3 position = g_vertexPositions[nodeID].xyz; + float3 previousPosition = g_vertexPreviousPositions[nodeID].xyz; + float3 velocity = g_vertexVelocities[nodeID].xyz; + int clothIndex = g_vertexClothIndices[nodeID]; + float velocityCorrectionCoefficient = g_clothVelocityCorrectionCoefficients[clothIndex]; + float dampingFactor = g_clothDampingFactor[clothIndex]; + float velocityCoefficient = (1.f - dampingFactor); + + float3 difference = position - previousPosition; + + velocity += difference*velocityCorrectionCoefficient*isolverdt; + + // Damp the velocity + velocity *= velocityCoefficient; + + g_vertexVelocities[nodeID] = float4(velocity, 0.f); + g_vertexForces[nodeID] = float4(0.f, 0.f, 0.f, 0.f); + } +} + +); \ No newline at end of file diff --git a/src/BulletMultiThreaded/GpuSoftBodySolvers/DX11/HLSL/UpdateNormals.hlsl b/src/BulletMultiThreaded/GpuSoftBodySolvers/DX11/HLSL/UpdateNormals.hlsl new file mode 100644 index 000000000..edfd3214f --- /dev/null +++ b/src/BulletMultiThreaded/GpuSoftBodySolvers/DX11/HLSL/UpdateNormals.hlsl @@ -0,0 +1,98 @@ +MSTRINGIFY( + +cbuffer UpdateSoftBodiesCB : register( b0 ) +{ + unsigned int numNodes; + unsigned int startFace; + unsigned int numFaces; + float epsilon; +}; + + +// Node indices for each link +StructuredBuffer g_triangleVertexIndexSet : register( t0 ); +StructuredBuffer g_vertexPositions : register( t1 ); +StructuredBuffer g_vertexTriangleCount : register( t2 ); + +RWStructuredBuffer g_vertexNormals : register( u0 ); +RWStructuredBuffer g_vertexArea : register( u1 ); +RWStructuredBuffer g_triangleNormals : register( u2 ); +RWStructuredBuffer g_triangleArea : register( u3 ); + + +[numthreads(128, 1, 1)] +void +ResetNormalsAndAreasKernel( uint3 Gid : SV_GroupID, uint3 DTid : SV_DispatchThreadID, uint3 GTid : SV_GroupThreadID, uint GI : SV_GroupIndex ) +{ + if( DTid.x < numNodes ) + { + g_vertexNormals[DTid.x] = float4(0.0f, 0.0f, 0.0f, 0.0f); + g_vertexArea[DTid.x] = 0.0f; + } +} + + +[numthreads(128, 1, 1)] +void +UpdateSoftBodiesKernel( uint3 Gid : SV_GroupID, uint3 DTid : SV_DispatchThreadID, uint3 GTid : SV_GroupThreadID, uint GI : SV_GroupIndex ) +{ + int faceID = DTid.x + startFace; + if( DTid.x < numFaces ) + { + int4 triangleIndexSet = g_triangleVertexIndexSet[ faceID ]; + int nodeIndex0 = triangleIndexSet.x; + int nodeIndex1 = triangleIndexSet.y; + int nodeIndex2 = triangleIndexSet.z; + + float3 node0 = g_vertexPositions[nodeIndex0].xyz; + float3 node1 = g_vertexPositions[nodeIndex1].xyz; + float3 node2 = g_vertexPositions[nodeIndex2].xyz; + float3 nodeNormal0 = g_vertexNormals[nodeIndex0].xyz; + float3 nodeNormal1 = g_vertexNormals[nodeIndex1].xyz; + float3 nodeNormal2 = g_vertexNormals[nodeIndex2].xyz; + float vertexArea0 = g_vertexArea[nodeIndex0]; + float vertexArea1 = g_vertexArea[nodeIndex1]; + float vertexArea2 = g_vertexArea[nodeIndex2]; + + float3 vector0 = node1 - node0; + float3 vector1 = node2 - node0; + + float3 faceNormal = cross(vector0.xyz, vector1.xyz); + float triangleArea = length(faceNormal); + + nodeNormal0 = nodeNormal0 + faceNormal; + nodeNormal1 = nodeNormal1 + faceNormal; + nodeNormal2 = nodeNormal2 + faceNormal; + vertexArea0 = vertexArea0 + triangleArea; + vertexArea1 = vertexArea1 + triangleArea; + vertexArea2 = vertexArea2 + triangleArea; + + g_triangleNormals[faceID] = float4(normalize(faceNormal), 0.f); + g_vertexNormals[nodeIndex0] = float4(nodeNormal0, 0.f); + g_vertexNormals[nodeIndex1] = float4(nodeNormal1, 0.f); + g_vertexNormals[nodeIndex2] = float4(nodeNormal2, 0.f); + g_triangleArea[faceID] = triangleArea; + g_vertexArea[nodeIndex0] = vertexArea0; + g_vertexArea[nodeIndex1] = vertexArea1; + g_vertexArea[nodeIndex2] = vertexArea2; + } +} + +[numthreads(128, 1, 1)] +void +NormalizeNormalsAndAreasKernel( uint3 Gid : SV_GroupID, uint3 DTid : SV_DispatchThreadID, uint3 GTid : SV_GroupThreadID, uint GI : SV_GroupIndex ) +{ + if( DTid.x < numNodes ) + { + float4 normal = g_vertexNormals[DTid.x]; + float area = g_vertexArea[DTid.x]; + int numTriangles = g_vertexTriangleCount[DTid.x]; + + float vectorLength = length(normal); + + g_vertexNormals[DTid.x] = normalize(normal); + g_vertexArea[DTid.x] = area/float(numTriangles); + } +} + +); \ No newline at end of file diff --git a/src/BulletMultiThreaded/GpuSoftBodySolvers/DX11/HLSL/UpdatePositions.hlsl b/src/BulletMultiThreaded/GpuSoftBodySolvers/DX11/HLSL/UpdatePositions.hlsl new file mode 100644 index 000000000..3547a744a --- /dev/null +++ b/src/BulletMultiThreaded/GpuSoftBodySolvers/DX11/HLSL/UpdatePositions.hlsl @@ -0,0 +1,44 @@ +MSTRINGIFY( + +cbuffer UpdateVelocitiesFromPositionsWithoutVelocitiesCB : register( b0 ) +{ + int numNodes; + float isolverdt; + int padding1; + int padding2; +}; + + +StructuredBuffer g_vertexPositions : register( t0 ); +StructuredBuffer g_vertexPreviousPositions : register( t1 ); +StructuredBuffer g_vertexClothIndices : register( t2 ); +StructuredBuffer g_clothDampingFactor : register( t3 ); + +RWStructuredBuffer g_vertexVelocities : register( u0 ); +RWStructuredBuffer g_vertexForces : register( u1 ); + + +[numthreads(128, 1, 1)] +void +updateVelocitiesFromPositionsWithoutVelocitiesKernel( uint3 Gid : SV_GroupID, uint3 DTid : SV_DispatchThreadID, uint3 GTid : SV_GroupThreadID, uint GI : SV_GroupIndex ) +{ + int nodeID = DTid.x; + if( nodeID < numNodes ) + { + float3 position = g_vertexPositions[nodeID].xyz; + float3 previousPosition = g_vertexPreviousPositions[nodeID].xyz; + float3 velocity = g_vertexVelocities[nodeID].xyz; + int clothIndex = g_vertexClothIndices[nodeID]; + float dampingFactor = g_clothDampingFactor[clothIndex]; + float velocityCoefficient = (1.f - dampingFactor); + + float3 difference = position - previousPosition; + + velocity = difference*velocityCoefficient*isolverdt; + + g_vertexVelocities[nodeID] = float4(velocity, 0.f); + g_vertexForces[nodeID] = float4(0.f, 0.f, 0.f, 0.f); + } +} + +); \ No newline at end of file diff --git a/src/BulletMultiThreaded/GpuSoftBodySolvers/DX11/HLSL/UpdatePositionsFromVelocities.hlsl b/src/BulletMultiThreaded/GpuSoftBodySolvers/DX11/HLSL/UpdatePositionsFromVelocities.hlsl new file mode 100644 index 000000000..5c94bd0e2 --- /dev/null +++ b/src/BulletMultiThreaded/GpuSoftBodySolvers/DX11/HLSL/UpdatePositionsFromVelocities.hlsl @@ -0,0 +1,35 @@ +MSTRINGIFY( + +cbuffer UpdatePositionsFromVelocitiesCB : register( b0 ) +{ + int numNodes; + float solverSDT; + int padding1; + int padding2; +}; + + +StructuredBuffer g_vertexVelocities : register( t0 ); + +RWStructuredBuffer g_vertexPreviousPositions : register( u0 ); +RWStructuredBuffer g_vertexCurrentPosition : register( u1 ); + + +[numthreads(128, 1, 1)] +void +UpdatePositionsFromVelocitiesKernel( uint3 Gid : SV_GroupID, uint3 DTid : SV_DispatchThreadID, uint3 GTid : SV_GroupThreadID, uint GI : SV_GroupIndex ) +{ + int vertexID = DTid.x; + if( vertexID < numNodes ) + { + float3 previousPosition = g_vertexPreviousPositions[vertexID].xyz; + float3 velocity = g_vertexVelocities[vertexID].xyz; + + float3 newPosition = previousPosition + velocity*solverSDT; + + g_vertexCurrentPosition[vertexID] = float4(newPosition, 0.f); + g_vertexPreviousPositions[vertexID] = float4(newPosition, 0.f); + } +} + +); \ No newline at end of file diff --git a/src/BulletMultiThreaded/GpuSoftBodySolvers/DX11/HLSL/VSolveLinks.hlsl b/src/BulletMultiThreaded/GpuSoftBodySolvers/DX11/HLSL/VSolveLinks.hlsl new file mode 100644 index 000000000..fc391953b --- /dev/null +++ b/src/BulletMultiThreaded/GpuSoftBodySolvers/DX11/HLSL/VSolveLinks.hlsl @@ -0,0 +1,55 @@ +MSTRINGIFY( + +cbuffer VSolveLinksCB : register( b0 ) +{ + int startLink; + int numLinks; + float kst; + int padding; +}; + +// Node indices for each link +StructuredBuffer g_linksVertexIndices : register( t0 ); + +StructuredBuffer g_linksLengthRatio : register( t1 ); +StructuredBuffer g_linksCurrentLength : register( t2 ); +StructuredBuffer g_vertexInverseMass : register( t3 ); + +RWStructuredBuffer g_vertexVelocity : register( u0 ); + +[numthreads(128, 1, 1)] +void +VSolveLinksKernel( uint3 Gid : SV_GroupID, uint3 DTid : SV_DispatchThreadID, uint3 GTid : SV_GroupThreadID, uint GI : SV_GroupIndex ) +{ + int linkID = DTid.x + startLink; + if( DTid.x < numLinks ) + { + int2 nodeIndices = g_linksVertexIndices[linkID]; + int node0 = nodeIndices.x; + int node1 = nodeIndices.y; + + float linkLengthRatio = g_linksLengthRatio[linkID]; + float3 linkCurrentLength = g_linksCurrentLength[linkID].xyz; + + float3 vertexVelocity0 = g_vertexVelocity[node0].xyz; + float3 vertexVelocity1 = g_vertexVelocity[node1].xyz; + + float vertexInverseMass0 = g_vertexInverseMass[node0]; + float vertexInverseMass1 = g_vertexInverseMass[node1]; + + float3 nodeDifference = vertexVelocity0 - vertexVelocity1; + float dotResult = dot(linkCurrentLength, nodeDifference); + float j = -dotResult*linkLengthRatio*kst; + + float3 velocityChange0 = linkCurrentLength*(j*vertexInverseMass0); + float3 velocityChange1 = linkCurrentLength*(j*vertexInverseMass1); + + vertexVelocity0 += velocityChange0; + vertexVelocity1 -= velocityChange1; + + g_vertexVelocity[node0] = float4(vertexVelocity0, 0.f); + g_vertexVelocity[node1] = float4(vertexVelocity1, 0.f); + } +} + +); \ No newline at end of file diff --git a/src/BulletMultiThreaded/GpuSoftBodySolvers/DX11/btSoftBodySolverBuffer_DX11.h b/src/BulletMultiThreaded/GpuSoftBodySolvers/DX11/btSoftBodySolverBuffer_DX11.h new file mode 100644 index 000000000..ff7f12ece --- /dev/null +++ b/src/BulletMultiThreaded/GpuSoftBodySolvers/DX11/btSoftBodySolverBuffer_DX11.h @@ -0,0 +1,309 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ +#ifndef BT_SOFT_BODY_SOLVER_BUFFER_DX11_H +#define BT_SOFT_BODY_SOLVER_BUFFER_DX11_H + +// DX11 support +#include +#include +#include +#include +#include + +#ifndef SAFE_RELEASE +#define SAFE_RELEASE(p) { if(p) { (p)->Release(); (p)=NULL; } } +#endif + +/** + * DX11 Buffer that tracks a host buffer on use to ensure size-correctness. + */ +template class btDX11Buffer +{ +protected: + ID3D11Device* m_d3dDevice; + ID3D11DeviceContext* m_d3dDeviceContext; + + ID3D11Buffer* m_Buffer; + ID3D11ShaderResourceView* m_SRV; + ID3D11UnorderedAccessView* m_UAV; + btAlignedObjectArray< ElementType >* m_CPUBuffer; + + // TODO: Separate this from the main class + // as read back buffers can be shared between buffers + ID3D11Buffer* m_readBackBuffer; + + int m_gpuSize; + bool m_onGPU; + + bool m_readOnlyOnGPU; + + bool createBuffer( ID3D11Buffer *preexistingBuffer = 0) + { + HRESULT hr = S_OK; + + // Create all CS buffers + if( preexistingBuffer ) + { + m_Buffer = preexistingBuffer; + } else { + D3D11_BUFFER_DESC buffer_desc; + ZeroMemory(&buffer_desc, sizeof(buffer_desc)); + buffer_desc.Usage = D3D11_USAGE_DEFAULT; + if( m_readOnlyOnGPU ) + buffer_desc.BindFlags = D3D11_BIND_SHADER_RESOURCE; + else + buffer_desc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_UNORDERED_ACCESS; + buffer_desc.MiscFlags = D3D11_RESOURCE_MISC_BUFFER_STRUCTURED; + + buffer_desc.ByteWidth = m_CPUBuffer->size() * sizeof(ElementType); + buffer_desc.StructureByteStride = sizeof(ElementType); + hr = m_d3dDevice->CreateBuffer(&buffer_desc, NULL, &m_Buffer); + if( FAILED( hr ) ) + return (hr==S_OK); + } + + if( m_readOnlyOnGPU ) + { + D3D11_SHADER_RESOURCE_VIEW_DESC srvbuffer_desc; + ZeroMemory(&srvbuffer_desc, sizeof(srvbuffer_desc)); + srvbuffer_desc.Format = DXGI_FORMAT_UNKNOWN; + srvbuffer_desc.ViewDimension = D3D11_SRV_DIMENSION_BUFFER; + + srvbuffer_desc.Buffer.ElementWidth = m_CPUBuffer->size(); + hr = m_d3dDevice->CreateShaderResourceView(m_Buffer, &srvbuffer_desc, &m_SRV); + if( FAILED( hr ) ) + return (hr==S_OK); + } else { + // Create SRV + D3D11_SHADER_RESOURCE_VIEW_DESC srvbuffer_desc; + ZeroMemory(&srvbuffer_desc, sizeof(srvbuffer_desc)); + srvbuffer_desc.Format = DXGI_FORMAT_UNKNOWN; + srvbuffer_desc.ViewDimension = D3D11_SRV_DIMENSION_BUFFER; + + srvbuffer_desc.Buffer.ElementWidth = m_CPUBuffer->size(); + hr = m_d3dDevice->CreateShaderResourceView(m_Buffer, &srvbuffer_desc, &m_SRV); + if( FAILED( hr ) ) + return (hr==S_OK); + + // Create UAV + D3D11_UNORDERED_ACCESS_VIEW_DESC uavbuffer_desc; + ZeroMemory(&uavbuffer_desc, sizeof(uavbuffer_desc)); + uavbuffer_desc.Format = DXGI_FORMAT_UNKNOWN; + uavbuffer_desc.ViewDimension = D3D11_UAV_DIMENSION_BUFFER; + + uavbuffer_desc.Buffer.NumElements = m_CPUBuffer->size(); + hr = m_d3dDevice->CreateUnorderedAccessView(m_Buffer, &uavbuffer_desc, &m_UAV); + if( FAILED( hr ) ) + return (hr==S_OK); + + // Create read back buffer + D3D11_BUFFER_DESC readback_buffer_desc; + ZeroMemory(&readback_buffer_desc, sizeof(readback_buffer_desc)); + + readback_buffer_desc.ByteWidth = m_CPUBuffer->size() * sizeof(ElementType); + readback_buffer_desc.Usage = D3D11_USAGE_STAGING; + readback_buffer_desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ; + readback_buffer_desc.StructureByteStride = sizeof(ElementType); + hr = m_d3dDevice->CreateBuffer(&readback_buffer_desc, NULL, &m_readBackBuffer); + if( FAILED( hr ) ) + return (hr==S_OK); + } + + m_gpuSize = m_CPUBuffer->size(); + return true; + } + + + +public: + btDX11Buffer( ID3D11Device *d3dDevice, ID3D11DeviceContext *d3dDeviceContext, btAlignedObjectArray< ElementType > *CPUBuffer, bool readOnly ) + { + m_d3dDevice = d3dDevice; + m_d3dDeviceContext = d3dDeviceContext; + m_Buffer = 0; + m_SRV = 0; + m_UAV = 0; + m_readBackBuffer = 0; + + m_CPUBuffer = CPUBuffer; + + m_gpuSize = 0; + m_onGPU = false; + + m_readOnlyOnGPU = readOnly; + } + + virtual ~btDX11Buffer() + { + SAFE_RELEASE(m_Buffer); + SAFE_RELEASE(m_SRV); + SAFE_RELEASE(m_UAV); + SAFE_RELEASE(m_readBackBuffer); + } + + ID3D11ShaderResourceView* &getSRV() + { + return m_SRV; + } + + ID3D11UnorderedAccessView* &getUAV() + { + return m_UAV; + } + + ID3D11Buffer* &getBuffer() + { + return m_Buffer; + } + + /** + * Move the data to the GPU if it is not there already. + */ + bool moveToGPU() + { + if( (m_CPUBuffer->size() != m_gpuSize) ) + m_onGPU = false; + if( !m_onGPU && m_CPUBuffer->size() > 0 ) + { + // If the buffer doesn't exist or the CPU-side buffer has changed size, create + // We should really delete the old one, too, but let's leave that for later + if( !m_Buffer || (m_CPUBuffer->size() != m_gpuSize) ) + { + SAFE_RELEASE(m_Buffer); + SAFE_RELEASE(m_SRV); + SAFE_RELEASE(m_UAV); + SAFE_RELEASE(m_readBackBuffer); + if( !createBuffer() ) + { + btAssert("Buffer creation failed."); + return false; + } + } + + D3D11_BOX destRegion; + destRegion.left = 0; + destRegion.front = 0; + destRegion.top = 0; + destRegion.bottom = 1; + destRegion.back = 1; + destRegion.right = (m_CPUBuffer->size())*sizeof(ElementType); + m_d3dDeviceContext->UpdateSubresource(m_Buffer, 0, &destRegion, &((*m_CPUBuffer)[0]), 0, 0); + + m_onGPU = true; + } + + return true; + } + + /** + * Move the data back from the GPU if it is on there and isn't read only. + */ + bool moveFromGPU() + { + if( m_CPUBuffer->size() > 0 ) + { + if( m_onGPU && !m_readOnlyOnGPU ) + { + // Copy back + D3D11_MAPPED_SUBRESOURCE MappedResource = {0}; + //m_pd3dImmediateContext->CopyResource(m_phAngVelReadBackBuffer, m_phAngVel); + + D3D11_BOX destRegion; + destRegion.left = 0; + destRegion.front = 0; + destRegion.top = 0; + destRegion.bottom = 1; + destRegion.back = 1; + + destRegion.right = (m_CPUBuffer->size())*sizeof(ElementType); + m_d3dDeviceContext->CopySubresourceRegion( + m_readBackBuffer, + 0, + 0, + 0, + 0 , + m_Buffer, + 0, + &destRegion + ); + + m_d3dDeviceContext->Map(m_readBackBuffer, 0, D3D11_MAP_READ, 0, &MappedResource); + //memcpy(m_hAngVel, MappedResource.pData, (m_maxObjs * sizeof(float) )); + memcpy(&((*m_CPUBuffer)[0]), MappedResource.pData, ((m_CPUBuffer->size()) * sizeof(ElementType) )); + m_d3dDeviceContext->Unmap(m_readBackBuffer, 0); + + m_onGPU = false; + } + } + + return true; + } + + + /** + * Copy the data back from the GPU without changing its state to be CPU-side. + * Useful if we just want to view it on the host for visualization. + */ + bool copyFromGPU() + { + if( m_CPUBuffer->size() > 0 ) + { + if( m_onGPU && !m_readOnlyOnGPU ) + { + // Copy back + D3D11_MAPPED_SUBRESOURCE MappedResource = {0}; + + D3D11_BOX destRegion; + destRegion.left = 0; + destRegion.front = 0; + destRegion.top = 0; + destRegion.bottom = 1; + destRegion.back = 1; + + destRegion.right = (m_CPUBuffer->size())*sizeof(ElementType); + m_d3dDeviceContext->CopySubresourceRegion( + m_readBackBuffer, + 0, + 0, + 0, + 0 , + m_Buffer, + 0, + &destRegion + ); + + m_d3dDeviceContext->Map(m_readBackBuffer, 0, D3D11_MAP_READ, 0, &MappedResource); + //memcpy(m_hAngVel, MappedResource.pData, (m_maxObjs * sizeof(float) )); + memcpy(&((*m_CPUBuffer)[0]), MappedResource.pData, ((m_CPUBuffer->size()) * sizeof(ElementType) )); + m_d3dDeviceContext->Unmap(m_readBackBuffer, 0); + } + } + + return true; + } + + /** + * Call if data has changed on the CPU. + * Can then trigger a move to the GPU as necessary. + */ + virtual void changedOnCPU() + { + m_onGPU = false; + } +}; // class btDX11Buffer + + + +#endif // #ifndef BT_SOFT_BODY_SOLVER_BUFFER_DX11_H \ No newline at end of file diff --git a/src/BulletMultiThreaded/GpuSoftBodySolvers/DX11/btSoftBodySolverLinkData_DX11.h b/src/BulletMultiThreaded/GpuSoftBodySolvers/DX11/btSoftBodySolverLinkData_DX11.h new file mode 100644 index 000000000..555483d2d --- /dev/null +++ b/src/BulletMultiThreaded/GpuSoftBodySolvers/DX11/btSoftBodySolverLinkData_DX11.h @@ -0,0 +1,103 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + + +#include "BulletMultiThreaded/GpuSoftBodySolvers/CPU/btSoftBodySolverData.h" +#include "btSoftBodySolverBuffer_DX11.h" + + +#ifndef BT_SOFT_BODY_SOLVER_LINK_DATA_DX11_H +#define BT_SOFT_BODY_SOLVER_LINK_DATA_DX11_H + +struct ID3D11Device; +struct ID3D11DeviceContext; + + +class btSoftBodyLinkDataDX11 : public btSoftBodyLinkData +{ +public: + bool m_onGPU; + ID3D11Device *m_d3dDevice; + ID3D11DeviceContext *m_d3dDeviceContext; + + + btDX11Buffer m_dx11Links; + btDX11Buffer m_dx11LinkStrength; + btDX11Buffer m_dx11LinksMassLSC; + btDX11Buffer m_dx11LinksRestLengthSquared; + btDX11Buffer m_dx11LinksCLength; + btDX11Buffer m_dx11LinksLengthRatio; + btDX11Buffer m_dx11LinksRestLength; + btDX11Buffer m_dx11LinksMaterialLinearStiffnessCoefficient; + + struct BatchPair + { + int start; + int length; + + BatchPair() : + start(0), + length(0) + { + } + + BatchPair( int s, int l ) : + start( s ), + length( l ) + { + } + }; + + /** + * Link addressing information for each cloth. + * Allows link locations to be computed independently of data batching. + */ + btAlignedObjectArray< int > m_linkAddresses; + + /** + * Start and length values for computation batches over link data. + */ + btAlignedObjectArray< BatchPair > m_batchStartLengths; + + + //ID3D11Buffer* readBackBuffer; + + btSoftBodyLinkDataDX11( ID3D11Device *d3dDevice, ID3D11DeviceContext *d3dDeviceContext ); + + virtual ~btSoftBodyLinkDataDX11(); + + /** Allocate enough space in all link-related arrays to fit numLinks links */ + virtual void createLinks( int numLinks ); + + /** Insert the link described into the correct data structures assuming space has already been allocated by a call to createLinks */ + virtual void setLinkAt( const LinkDescription &link, int linkIndex ); + + virtual bool onAccelerator(); + + virtual bool moveToAccelerator(); + + virtual bool moveFromAccelerator(); + + /** + * Generate (and later update) the batching for the entire link set. + * This redoes a lot of work because it batches the entire set when each cloth is inserted. + * In theory we could delay it until just before we need the cloth. + * It's a one-off overhead, though, so that is a later optimisation. + */ + void generateBatches(); +}; + + +#endif // #ifndef BT_SOFT_BODY_SOLVER_LINK_DATA_DX11_H diff --git a/src/BulletMultiThreaded/GpuSoftBodySolvers/DX11/btSoftBodySolverTriangleData_DX11.h b/src/BulletMultiThreaded/GpuSoftBodySolvers/DX11/btSoftBodySolverTriangleData_DX11.h new file mode 100644 index 000000000..9d78d91f5 --- /dev/null +++ b/src/BulletMultiThreaded/GpuSoftBodySolvers/DX11/btSoftBodySolverTriangleData_DX11.h @@ -0,0 +1,96 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#include "BulletMultiThreaded/GpuSoftBodySolvers/CPU/btSoftBodySolverData.h" +#include "btSoftBodySolverBuffer_DX11.h" + + +#ifndef BT_SOFT_BODY_SOLVER_TRIANGLE_DATA_DX11_H +#define BT_SOFT_BODY_SOLVER_TRIANGLE_DATA_DX11_H + +struct ID3D11Device; +struct ID3D11DeviceContext; + +class btSoftBodyTriangleDataDX11 : public btSoftBodyTriangleData +{ +public: + bool m_onGPU; + ID3D11Device *m_d3dDevice; + ID3D11DeviceContext *m_d3dDeviceContext; + + btDX11Buffer m_dx11VertexIndices; + btDX11Buffer m_dx11Area; + btDX11Buffer m_dx11Normal; + + struct BatchPair + { + int start; + int length; + + BatchPair() : + start(0), + length(0) + { + } + + BatchPair( int s, int l ) : + start( s ), + length( l ) + { + } + }; + + + /** + * Link addressing information for each cloth. + * Allows link locations to be computed independently of data batching. + */ + btAlignedObjectArray< int > m_triangleAddresses; + + /** + * Start and length values for computation batches over link data. + */ + btAlignedObjectArray< BatchPair > m_batchStartLengths; + + //ID3D11Buffer* readBackBuffer; + +public: + btSoftBodyTriangleDataDX11( ID3D11Device *d3dDevice, ID3D11DeviceContext *d3dDeviceContext ); + + virtual ~btSoftBodyTriangleDataDX11(); + + + /** Allocate enough space in all link-related arrays to fit numLinks links */ + virtual void createTriangles( int numTriangles ); + + /** Insert the link described into the correct data structures assuming space has already been allocated by a call to createLinks */ + virtual void setTriangleAt( const btSoftBodyTriangleData::TriangleDescription &triangle, int triangleIndex ); + + virtual bool onAccelerator(); + virtual bool moveToAccelerator(); + + virtual bool moveFromAccelerator(); + /** + * Generate (and later update) the batching for the entire triangle set. + * This redoes a lot of work because it batches the entire set when each cloth is inserted. + * In theory we could delay it until just before we need the cloth. + * It's a one-off overhead, though, so that is a later optimisation. + */ + void generateBatches(); +}; + + + +#endif // #ifndef BT_SOFT_BODY_SOLVER_TRIANGLE_DATA_DX11_H diff --git a/src/BulletMultiThreaded/GpuSoftBodySolvers/DX11/btSoftBodySolverVertexBuffer_DX11.h b/src/BulletMultiThreaded/GpuSoftBodySolvers/DX11/btSoftBodySolverVertexBuffer_DX11.h new file mode 100644 index 000000000..49d1d0f3b --- /dev/null +++ b/src/BulletMultiThreaded/GpuSoftBodySolvers/DX11/btSoftBodySolverVertexBuffer_DX11.h @@ -0,0 +1,107 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef BT_SOFT_BODY_SOLVER_VERTEX_BUFFER_DX11_H +#define BT_SOFT_BODY_SOLVER_VERTEX_BUFFER_DX11_H + + +#include "BulletSoftBody/btSoftBodySolverVertexBuffer.h" + +#include +#include +#include +#include +#include + +class btDX11VertexBufferDescriptor : public btVertexBufferDescriptor +{ +protected: + /** Context of the DX11 device on which the vertex buffer is stored. */ + ID3D11DeviceContext* m_context; + /** DX11 vertex buffer */ + ID3D11Buffer* m_vertexBuffer; + /** UAV for DX11 buffer */ + ID3D11UnorderedAccessView* m_vertexBufferUAV; + + +public: + /** + * buffer is a pointer to the DX11 buffer to place the vertex data in. + * UAV is a pointer to the UAV representation of the buffer laid out in floats. + * vertexOffset is the offset in floats to the first vertex. + * vertexStride is the stride in floats between vertices. + */ + btDX11VertexBufferDescriptor( ID3D11DeviceContext* context, ID3D11Buffer* buffer, ID3D11UnorderedAccessView *UAV, int vertexOffset, int vertexStride ) + { + m_context = context; + m_vertexBuffer = buffer; + m_vertexBufferUAV = UAV; + m_vertexOffset = vertexOffset; + m_vertexStride = vertexStride; + m_hasVertexPositions = true; + } + + /** + * buffer is a pointer to the DX11 buffer to place the vertex data in. + * UAV is a pointer to the UAV representation of the buffer laid out in floats. + * vertexOffset is the offset in floats to the first vertex. + * vertexStride is the stride in floats between vertices. + * normalOffset is the offset in floats to the first normal. + * normalStride is the stride in floats between normals. + */ + btDX11VertexBufferDescriptor( ID3D11DeviceContext* context, ID3D11Buffer* buffer, ID3D11UnorderedAccessView *UAV, int vertexOffset, int vertexStride, int normalOffset, int normalStride ) + { + m_context = context; + m_vertexBuffer = buffer; + m_vertexBufferUAV = UAV; + m_vertexOffset = vertexOffset; + m_vertexStride = vertexStride; + m_hasVertexPositions = true; + + m_normalOffset = normalOffset; + m_normalStride = normalStride; + m_hasNormals = true; + } + + virtual ~btDX11VertexBufferDescriptor() + { + + } + + /** + * Return the type of the vertex buffer descriptor. + */ + virtual BufferTypes getBufferType() const + { + return DX11_BUFFER; + } + + virtual ID3D11DeviceContext* getContext() const + { + return m_context; + } + + virtual ID3D11Buffer* getbtDX11Buffer() const + { + return m_vertexBuffer; + } + + virtual ID3D11UnorderedAccessView* getDX11UAV() const + { + return m_vertexBufferUAV; + } +}; + +#endif // #ifndef BT_SOFT_BODY_SOLVER_VERTEX_BUFFER_DX11_H \ No newline at end of file diff --git a/src/BulletMultiThreaded/GpuSoftBodySolvers/DX11/btSoftBodySolverVertexData_DX11.h b/src/BulletMultiThreaded/GpuSoftBodySolvers/DX11/btSoftBodySolverVertexData_DX11.h new file mode 100644 index 000000000..2216cb9e0 --- /dev/null +++ b/src/BulletMultiThreaded/GpuSoftBodySolvers/DX11/btSoftBodySolverVertexData_DX11.h @@ -0,0 +1,63 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + + +#include "BulletMultiThreaded/GpuSoftBodySolvers/CPU/btSoftBodySolverData.h" +#include "btSoftBodySolverBuffer_DX11.h" + + +#ifndef BT_SOFT_BHODY_SOLVER_VERTEX_DATA_DX11_H +#define BT_SOFT_BHODY_SOLVER_VERTEX_DATA_DX11_H + +class btSoftBodyLinkData; +class btSoftBodyLinkData::LinkDescription; + +struct ID3D11Device; +struct ID3D11DeviceContext; + +class btSoftBodyVertexDataDX11 : public btSoftBodyVertexData +{ +protected: + bool m_onGPU; + ID3D11Device *m_d3dDevice; + ID3D11DeviceContext *m_d3dDeviceContext; + +public: + btDX11Buffer m_dx11ClothIdentifier; + btDX11Buffer m_dx11VertexPosition; + btDX11Buffer m_dx11VertexPreviousPosition; + btDX11Buffer m_dx11VertexVelocity; + btDX11Buffer m_dx11VertexForceAccumulator; + btDX11Buffer m_dx11VertexNormal; + btDX11Buffer m_dx11VertexInverseMass; + btDX11Buffer m_dx11VertexArea; + btDX11Buffer m_dx11VertexTriangleCount; + + + //ID3D11Buffer* readBackBuffer; + +public: + btSoftBodyVertexDataDX11( ID3D11Device *d3dDevice, ID3D11DeviceContext *d3dDeviceContext ); + virtual ~btSoftBodyVertexDataDX11(); + + virtual bool onAccelerator(); + virtual bool moveToAccelerator(); + + virtual bool moveFromAccelerator(); +}; + + +#endif // #ifndef BT_SOFT_BHODY_SOLVER_VERTEX_DATA_DX11_H + diff --git a/src/BulletMultiThreaded/GpuSoftBodySolvers/DX11/btSoftBodySolver_DX11.cpp b/src/BulletMultiThreaded/GpuSoftBodySolvers/DX11/btSoftBodySolver_DX11.cpp new file mode 100644 index 000000000..eeead9ab5 --- /dev/null +++ b/src/BulletMultiThreaded/GpuSoftBodySolvers/DX11/btSoftBodySolver_DX11.cpp @@ -0,0 +1,1779 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#include "BulletCollision/CollisionShapes/btTriangleIndexVertexArray.h" +#include "vectormath_aos.h" + +#include "btSoftBodySolver_DX11.h" +#include "btSoftBodySolverVertexBuffer_DX11.h" +#include "BulletSoftBody/btSoftBody.h" + +#define MSTRINGIFY(A) #A +static char* PrepareLinksHLSLString = +#include "HLSL/PrepareLinks.hlsl" +static char* UpdatePositionsFromVelocitiesHLSLString = +#include "HLSL/UpdatePositionsFromVelocities.hlsl" +static char* SolvePositionsHLSLString = +#include "HLSL/SolvePositions.hlsl" +static char* UpdateNodesHLSLString = +#include "HLSL/UpdateNodes.hlsl" +static char* UpdatePositionsHLSLString = +#include "HLSL/UpdatePositions.hlsl" +static char* UpdateConstantsHLSLString = +#include "HLSL/UpdateConstants.hlsl" +static char* IntegrateHLSLString = +#include "HLSL/Integrate.hlsl" +static char* ApplyForcesHLSLString = +#include "HLSL/ApplyForces.hlsl" +static char* UpdateNormalsHLSLString = +#include "HLSL/UpdateNormals.hlsl" +static char* OutputToVertexArrayHLSLString = +#include "HLSL/OutputToVertexArray.hlsl" +static char* VSolveLinksHLSLString = +#include "HLSL/VSolveLinks.hlsl" + + +btSoftBodyLinkDataDX11::btSoftBodyLinkDataDX11( ID3D11Device *d3dDevice, ID3D11DeviceContext *d3dDeviceContext ) : + m_dx11Links( d3dDevice, d3dDeviceContext, &m_links, false ), + m_dx11LinkStrength( d3dDevice, d3dDeviceContext, &m_linkStrength, false ), + m_dx11LinksMassLSC( d3dDevice, d3dDeviceContext, &m_linksMassLSC, false ), + m_dx11LinksRestLengthSquared( d3dDevice, d3dDeviceContext, &m_linksRestLengthSquared, false ), + m_dx11LinksCLength( d3dDevice, d3dDeviceContext, &m_linksCLength, false ), + m_dx11LinksLengthRatio( d3dDevice, d3dDeviceContext, &m_linksLengthRatio, false ), + m_dx11LinksRestLength( d3dDevice, d3dDeviceContext, &m_linksRestLength, false ), + m_dx11LinksMaterialLinearStiffnessCoefficient( d3dDevice, d3dDeviceContext, &m_linksMaterialLinearStiffnessCoefficient, false ) +{ + m_d3dDevice = d3dDevice; + m_d3dDeviceContext = d3dDeviceContext; +} + +btSoftBodyLinkDataDX11::~btSoftBodyLinkDataDX11() +{ +} + +static Vectormath::Aos::Vector3 toVector3( const btVector3 &vec ) +{ + Vectormath::Aos::Vector3 outVec( vec.getX(), vec.getY(), vec.getZ() ); + return outVec; +} + +void btSoftBodyLinkDataDX11::createLinks( int numLinks ) +{ + int previousSize = m_links.size(); + int newSize = previousSize + numLinks; + + btSoftBodyLinkData::createLinks( numLinks ); + + // Resize the link addresses array as well + m_linkAddresses.resize( newSize ); +} + +void btSoftBodyLinkDataDX11::setLinkAt( const btSoftBodyLinkData::LinkDescription &link, int linkIndex ) +{ + btSoftBodyLinkData::setLinkAt( link, linkIndex ); + + // Set the link index correctly for initialisation + m_linkAddresses[linkIndex] = linkIndex; +} + +bool btSoftBodyLinkDataDX11::onAccelerator() +{ + return m_onGPU; +} + +bool btSoftBodyLinkDataDX11::moveToAccelerator() +{ + bool success = true; + success = success && m_dx11Links.moveToGPU(); + success = success && m_dx11LinkStrength.moveToGPU(); + success = success && m_dx11LinksMassLSC.moveToGPU(); + success = success && m_dx11LinksRestLengthSquared.moveToGPU(); + success = success && m_dx11LinksCLength.moveToGPU(); + success = success && m_dx11LinksLengthRatio.moveToGPU(); + success = success && m_dx11LinksRestLength.moveToGPU(); + success = success && m_dx11LinksMaterialLinearStiffnessCoefficient.moveToGPU(); + + if( success ) + m_onGPU = true; + + return success; +} + +bool btSoftBodyLinkDataDX11::moveFromAccelerator() +{ + bool success = true; + success = success && m_dx11Links.moveFromGPU(); + success = success && m_dx11LinkStrength.moveFromGPU(); + success = success && m_dx11LinksMassLSC.moveFromGPU(); + success = success && m_dx11LinksRestLengthSquared.moveFromGPU(); + success = success && m_dx11LinksCLength.moveFromGPU(); + success = success && m_dx11LinksLengthRatio.moveFromGPU(); + success = success && m_dx11LinksRestLength.moveFromGPU(); + success = success && m_dx11LinksMaterialLinearStiffnessCoefficient.moveFromGPU(); + + if( success ) + m_onGPU = false; + + return success; +} + +void btSoftBodyLinkDataDX11::generateBatches() +{ + int numLinks = getNumLinks(); + + // Do the graph colouring here temporarily + btAlignedObjectArray< int > batchValues; + batchValues.resize( numLinks, 0 ); + + // Find the maximum vertex value internally for now + int maxVertex = 0; + for( int linkIndex = 0; linkIndex < numLinks; ++linkIndex ) + { + int vertex0 = getVertexPair(linkIndex).vertex0; + int vertex1 = getVertexPair(linkIndex).vertex1; + if( vertex0 > maxVertex ) + maxVertex = vertex0; + if( vertex1 > maxVertex ) + maxVertex = vertex1; + } + int numVertices = maxVertex + 1; + + // Set of lists, one for each node, specifying which colours are connected + // to that node. + // No two edges into a node can share a colour. + btAlignedObjectArray< btAlignedObjectArray< int > > vertexConnectedColourLists; + vertexConnectedColourLists.resize(numVertices); + + + + // Simple algorithm that chooses the lowest batch number + // that none of the links attached to either of the connected + // nodes is in + for( int linkIndex = 0; linkIndex < numLinks; ++linkIndex ) + { + int linkLocation = m_linkAddresses[linkIndex]; + + int vertex0 = getVertexPair(linkLocation).vertex0; + int vertex1 = getVertexPair(linkLocation).vertex1; + + // Get the two node colour lists + btAlignedObjectArray< int > &colourListVertex0( vertexConnectedColourLists[vertex0] ); + btAlignedObjectArray< int > &colourListVertex1( vertexConnectedColourLists[vertex1] ); + + // Choose the minimum colour that is in neither list + int colour = 0; + while( colourListVertex0.findLinearSearch(colour) != colourListVertex0.size() || colourListVertex1.findLinearSearch(colour) != colourListVertex1.size() ) + ++colour; + // i should now be the minimum colour in neither list + // Add to the two lists so that future edges don't share + // And store the colour against this edge + + colourListVertex0.push_back(colour); + colourListVertex1.push_back(colour); + batchValues[linkIndex] = colour; + } + + // Check the colour counts + btAlignedObjectArray< int > batchCounts; + for( int i = 0; i < numLinks; ++i ) + { + int batch = batchValues[i]; + if( batch >= batchCounts.size() ) + batchCounts.push_back(1); + else + ++(batchCounts[batch]); + } + + m_batchStartLengths.resize(batchCounts.size()); + if( m_batchStartLengths.size() > 0 ) + { + m_batchStartLengths[0] = BatchPair( 0, 0 ); + + int sum = 0; + for( int batchIndex = 0; batchIndex < batchCounts.size(); ++batchIndex ) + { + m_batchStartLengths[batchIndex].start = sum; + m_batchStartLengths[batchIndex].length = batchCounts[batchIndex]; + sum += batchCounts[batchIndex]; + } + } + + ///////////////////////////// + // Sort data based on batches + + // Create source arrays by copying originals + btAlignedObjectArray m_links_Backup(m_links); + btAlignedObjectArray m_linkStrength_Backup(m_linkStrength); + btAlignedObjectArray m_linksMassLSC_Backup(m_linksMassLSC); + btAlignedObjectArray m_linksRestLengthSquared_Backup(m_linksRestLengthSquared); + btAlignedObjectArray m_linksCLength_Backup(m_linksCLength); + btAlignedObjectArray m_linksLengthRatio_Backup(m_linksLengthRatio); + btAlignedObjectArray m_linksRestLength_Backup(m_linksRestLength); + btAlignedObjectArray m_linksMaterialLinearStiffnessCoefficient_Backup(m_linksMaterialLinearStiffnessCoefficient); + + + for( int batch = 0; batch < batchCounts.size(); ++batch ) + batchCounts[batch] = 0; + + // Do sort as single pass into destination arrays + for( int linkIndex = 0; linkIndex < numLinks; ++linkIndex ) + { + // To maintain locations run off the original link locations rather than the current position. + // It's not cache efficient, but as we run this rarely that should not matter. + // It's faster than searching the link location array for the current location and then updating it. + // The other alternative would be to unsort before resorting, but this is equivalent to doing that. + int linkLocation = m_linkAddresses[linkIndex]; + + // Obtain batch and calculate target location for the + // next element in that batch, incrementing the batch counter + // afterwards + int batch = batchValues[linkIndex]; + int newLocation = m_batchStartLengths[batch].start + batchCounts[batch]; + + batchCounts[batch] = batchCounts[batch] + 1; + m_links[newLocation] = m_links_Backup[linkLocation]; +#if 1 + m_linkStrength[newLocation] = m_linkStrength_Backup[linkLocation]; + m_linksMassLSC[newLocation] = m_linksMassLSC_Backup[linkLocation]; + m_linksRestLengthSquared[newLocation] = m_linksRestLengthSquared_Backup[linkLocation]; + m_linksLengthRatio[newLocation] = m_linksLengthRatio_Backup[linkLocation]; + m_linksRestLength[newLocation] = m_linksRestLength_Backup[linkLocation]; + m_linksMaterialLinearStiffnessCoefficient[newLocation] = m_linksMaterialLinearStiffnessCoefficient_Backup[linkLocation]; +#endif + // Update the locations array to account for the moved entry + m_linkAddresses[linkIndex] = newLocation; + } +} // void btSoftBodyLinkDataDX11::generateBatches() + + + +btSoftBodyVertexDataDX11::btSoftBodyVertexDataDX11( ID3D11Device *d3dDevice, ID3D11DeviceContext *d3dDeviceContext ) : + m_dx11ClothIdentifier( d3dDevice, d3dDeviceContext, &m_clothIdentifier, false ), + m_dx11VertexPosition( d3dDevice, d3dDeviceContext, &m_vertexPosition, false ), + m_dx11VertexPreviousPosition( d3dDevice, d3dDeviceContext, &m_vertexPreviousPosition, false ), + m_dx11VertexVelocity( d3dDevice, d3dDeviceContext, &m_vertexVelocity, false ), + m_dx11VertexForceAccumulator( d3dDevice, d3dDeviceContext, &m_vertexForceAccumulator, false ), + m_dx11VertexNormal( d3dDevice, d3dDeviceContext, &m_vertexNormal, false ), + m_dx11VertexInverseMass( d3dDevice, d3dDeviceContext, &m_vertexInverseMass, false ), + m_dx11VertexArea( d3dDevice, d3dDeviceContext, &m_vertexArea, false ), + m_dx11VertexTriangleCount( d3dDevice, d3dDeviceContext, &m_vertexTriangleCount, false ) +{ + m_d3dDevice = d3dDevice; + m_d3dDeviceContext = d3dDeviceContext; +} + +btSoftBodyVertexDataDX11::~btSoftBodyVertexDataDX11() +{ + +} + +bool btSoftBodyVertexDataDX11::onAccelerator() +{ + return m_onGPU; +} + +bool btSoftBodyVertexDataDX11::moveToAccelerator() +{ + bool success = true; + success = success && m_dx11ClothIdentifier.moveToGPU(); + success = success && m_dx11VertexPosition.moveToGPU(); + success = success && m_dx11VertexPreviousPosition.moveToGPU(); + success = success && m_dx11VertexVelocity.moveToGPU(); + success = success && m_dx11VertexForceAccumulator.moveToGPU(); + success = success && m_dx11VertexNormal.moveToGPU(); + success = success && m_dx11VertexInverseMass.moveToGPU(); + success = success && m_dx11VertexArea.moveToGPU(); + success = success && m_dx11VertexTriangleCount.moveToGPU(); + + if( success ) + m_onGPU = true; + + return success; +} + +bool btSoftBodyVertexDataDX11::moveFromAccelerator() +{ + bool success = true; + success = success && m_dx11ClothIdentifier.moveFromGPU(); + success = success && m_dx11VertexPosition.moveFromGPU(); + success = success && m_dx11VertexPreviousPosition.moveFromGPU(); + success = success && m_dx11VertexVelocity.moveFromGPU(); + success = success && m_dx11VertexForceAccumulator.moveFromGPU(); + success = success && m_dx11VertexNormal.moveFromGPU(); + success = success && m_dx11VertexInverseMass.moveFromGPU(); + success = success && m_dx11VertexArea.moveFromGPU(); + success = success && m_dx11VertexTriangleCount.moveFromGPU(); + + if( success ) + m_onGPU = true; + + return success; +} + + +btSoftBodyTriangleDataDX11::btSoftBodyTriangleDataDX11( ID3D11Device *d3dDevice, ID3D11DeviceContext *d3dDeviceContext ) : + m_dx11VertexIndices( d3dDevice, d3dDeviceContext, &m_vertexIndices, false ), + m_dx11Area( d3dDevice, d3dDeviceContext, &m_area, false ), + m_dx11Normal( d3dDevice, d3dDeviceContext, &m_normal, false ) +{ + m_d3dDevice = d3dDevice; + m_d3dDeviceContext = d3dDeviceContext; +} + +btSoftBodyTriangleDataDX11::~btSoftBodyTriangleDataDX11() +{ + +} + + +/** Allocate enough space in all link-related arrays to fit numLinks links */ +void btSoftBodyTriangleDataDX11::createTriangles( int numTriangles ) +{ + int previousSize = getNumTriangles(); + int newSize = previousSize + numTriangles; + + btSoftBodyTriangleData::createTriangles( numTriangles ); + + // Resize the link addresses array as well + m_triangleAddresses.resize( newSize ); +} + +/** Insert the link described into the correct data structures assuming space has already been allocated by a call to createLinks */ +void btSoftBodyTriangleDataDX11::setTriangleAt( const btSoftBodyTriangleData::TriangleDescription &triangle, int triangleIndex ) +{ + btSoftBodyTriangleData::setTriangleAt( triangle, triangleIndex ); + + m_triangleAddresses[triangleIndex] = triangleIndex; +} + +bool btSoftBodyTriangleDataDX11::onAccelerator() +{ + return m_onGPU; +} + +bool btSoftBodyTriangleDataDX11::moveToAccelerator() +{ + bool success = true; + success = success && m_dx11VertexIndices.moveToGPU(); + success = success && m_dx11Area.moveToGPU(); + success = success && m_dx11Normal.moveToGPU(); + + if( success ) + m_onGPU = true; + + return success; +} + +bool btSoftBodyTriangleDataDX11::moveFromAccelerator() +{ + bool success = true; + success = success && m_dx11VertexIndices.moveFromGPU(); + success = success && m_dx11Area.moveFromGPU(); + success = success && m_dx11Normal.moveFromGPU(); + + if( success ) + m_onGPU = true; + + return success; +} + +/** + * Generate (and later update) the batching for the entire triangle set. + * This redoes a lot of work because it batches the entire set when each cloth is inserted. + * In theory we could delay it until just before we need the cloth. + * It's a one-off overhead, though, so that is a later optimisation. + */ +void btSoftBodyTriangleDataDX11::generateBatches() +{ + int numTriangles = getNumTriangles(); + if( numTriangles == 0 ) + return; + + // Do the graph colouring here temporarily + btAlignedObjectArray< int > batchValues; + batchValues.resize( numTriangles ); + + // Find the maximum vertex value internally for now + int maxVertex = 0; + for( int triangleIndex = 0; triangleIndex < numTriangles; ++triangleIndex ) + { + int vertex0 = getVertexSet(triangleIndex).vertex0; + int vertex1 = getVertexSet(triangleIndex).vertex1; + int vertex2 = getVertexSet(triangleIndex).vertex2; + + if( vertex0 > maxVertex ) + maxVertex = vertex0; + if( vertex1 > maxVertex ) + maxVertex = vertex1; + if( vertex2 > maxVertex ) + maxVertex = vertex2; + } + int numVertices = maxVertex + 1; + + // Set of lists, one for each node, specifying which colours are connected + // to that node. + // No two edges into a node can share a colour. + btAlignedObjectArray< btAlignedObjectArray< int > > vertexConnectedColourLists; + vertexConnectedColourLists.resize(numVertices); + + + //std::cout << "\n"; + // Simple algorithm that chooses the lowest batch number + // that none of the faces attached to either of the connected + // nodes is in + for( int triangleIndex = 0; triangleIndex < numTriangles; ++triangleIndex ) + { + // To maintain locations run off the original link locations rather than the current position. + // It's not cache efficient, but as we run this rarely that should not matter. + // It's faster than searching the link location array for the current location and then updating it. + // The other alternative would be to unsort before resorting, but this is equivalent to doing that. + int triangleLocation = m_triangleAddresses[triangleIndex]; + + int vertex0 = getVertexSet(triangleLocation).vertex0; + int vertex1 = getVertexSet(triangleLocation).vertex1; + int vertex2 = getVertexSet(triangleLocation).vertex2; + + // Get the three node colour lists + btAlignedObjectArray< int > &colourListVertex0( vertexConnectedColourLists[vertex0] ); + btAlignedObjectArray< int > &colourListVertex1( vertexConnectedColourLists[vertex1] ); + btAlignedObjectArray< int > &colourListVertex2( vertexConnectedColourLists[vertex2] ); + + // Choose the minimum colour that is in none of the lists + int colour = 0; + while( + colourListVertex0.findLinearSearch(colour) != colourListVertex0.size() || + colourListVertex1.findLinearSearch(colour) != colourListVertex1.size() || + colourListVertex2.findLinearSearch(colour) != colourListVertex2.size() ) + { + ++colour; + } + // i should now be the minimum colour in neither list + // Add to the three lists so that future edges don't share + // And store the colour against this face + colourListVertex0.push_back(colour); + colourListVertex1.push_back(colour); + colourListVertex2.push_back(colour); + + batchValues[triangleIndex] = colour; + } + + + // Check the colour counts + btAlignedObjectArray< int > batchCounts; + for( int i = 0; i < numTriangles; ++i ) + { + int batch = batchValues[i]; + if( batch >= batchCounts.size() ) + batchCounts.push_back(1); + else + ++(batchCounts[batch]); + } + + + m_batchStartLengths.resize(batchCounts.size()); + m_batchStartLengths[0] = BatchPair( 0, 0 ); + + + int sum = 0; + for( int batchIndex = 0; batchIndex < batchCounts.size(); ++batchIndex ) + { + m_batchStartLengths[batchIndex].start = sum; + m_batchStartLengths[batchIndex].length = batchCounts[batchIndex]; + sum += batchCounts[batchIndex]; + } + + ///////////////////////////// + // Sort data based on batches + + // Create source arrays by copying originals + btAlignedObjectArray m_vertexIndices_Backup(m_vertexIndices); + btAlignedObjectArray m_area_Backup(m_area); + btAlignedObjectArray m_normal_Backup(m_normal); + + + for( int batch = 0; batch < batchCounts.size(); ++batch ) + batchCounts[batch] = 0; + + // Do sort as single pass into destination arrays + for( int triangleIndex = 0; triangleIndex < numTriangles; ++triangleIndex ) + { + // To maintain locations run off the original link locations rather than the current position. + // It's not cache efficient, but as we run this rarely that should not matter. + // It's faster than searching the link location array for the current location and then updating it. + // The other alternative would be to unsort before resorting, but this is equivalent to doing that. + int triangleLocation = m_triangleAddresses[triangleIndex]; + + // Obtain batch and calculate target location for the + // next element in that batch, incrementing the batch counter + // afterwards + int batch = batchValues[triangleIndex]; + int newLocation = m_batchStartLengths[batch].start + batchCounts[batch]; + + batchCounts[batch] = batchCounts[batch] + 1; + m_vertexIndices[newLocation] = m_vertexIndices_Backup[triangleLocation]; + m_area[newLocation] = m_area_Backup[triangleLocation]; + m_normal[newLocation] = m_normal_Backup[triangleLocation]; + + // Update the locations array to account for the moved entry + m_triangleAddresses[triangleIndex] = newLocation; + } +} // btSoftBodyTriangleDataDX11::generateBatches + + + + + + + + + + + + +btDX11SoftBodySolver::btDX11SoftBodySolver(ID3D11Device * dx11Device, ID3D11DeviceContext* dx11Context) : + m_dx11Device( dx11Device ), + m_dx11Context( dx11Context ), + m_linkData(m_dx11Device, m_dx11Context), + m_vertexData(m_dx11Device, m_dx11Context), + m_triangleData(m_dx11Device, m_dx11Context), + m_dx11PerClothAcceleration( m_dx11Device, m_dx11Context, &m_perClothAcceleration, true ), + m_dx11PerClothWindVelocity( m_dx11Device, m_dx11Context, &m_perClothWindVelocity, true ), + m_dx11PerClothDampingFactor( m_dx11Device, m_dx11Context, &m_perClothDampingFactor, true ), + m_dx11PerClothVelocityCorrectionCoefficient( m_dx11Device, m_dx11Context, &m_perClothVelocityCorrectionCoefficient, true ), + m_dx11PerClothLiftFactor( m_dx11Device, m_dx11Context, &m_perClothLiftFactor, true ), + m_dx11PerClothDragFactor( m_dx11Device, m_dx11Context, &m_perClothDragFactor, true ), + m_dx11PerClothMediumDensity( m_dx11Device, m_dx11Context, &m_perClothMediumDensity, true ) +{ + // Initial we will clearly need to update solver constants + // For now this is global for the cloths linked with this solver - we should probably make this body specific + // for performance in future once we understand more clearly when constants need to be updated + m_updateSolverConstants = true; + + m_shadersInitialized = false; +} + +btDX11SoftBodySolver::~btDX11SoftBodySolver() +{ + SAFE_RELEASE( integrateKernel.constBuffer ); + SAFE_RELEASE( integrateKernel.kernel ); + SAFE_RELEASE( prepareLinksKernel.constBuffer ); + SAFE_RELEASE( prepareLinksKernel.kernel ); + SAFE_RELEASE( solvePositionsFromLinksKernel.constBuffer ); + SAFE_RELEASE( solvePositionsFromLinksKernel.kernel ); + SAFE_RELEASE( vSolveLinksKernel.constBuffer ); + SAFE_RELEASE( vSolveLinksKernel.kernel ); + SAFE_RELEASE( updatePositionsFromVelocitiesKernel.constBuffer ); + SAFE_RELEASE( updatePositionsFromVelocitiesKernel.kernel ); + SAFE_RELEASE( updateVelocitiesFromPositionsWithoutVelocitiesKernel.constBuffer ); + SAFE_RELEASE( updateVelocitiesFromPositionsWithoutVelocitiesKernel.kernel ); + SAFE_RELEASE( updateVelocitiesFromPositionsWithVelocitiesKernel.constBuffer ); + SAFE_RELEASE( updateVelocitiesFromPositionsWithVelocitiesKernel.kernel ); + SAFE_RELEASE( resetNormalsAndAreasKernel.constBuffer ); + SAFE_RELEASE( resetNormalsAndAreasKernel.kernel ); + SAFE_RELEASE( normalizeNormalsAndAreasKernel.constBuffer ); + SAFE_RELEASE( normalizeNormalsAndAreasKernel.kernel ); + SAFE_RELEASE( updateSoftBodiesKernel.constBuffer ); + SAFE_RELEASE( updateSoftBodiesKernel.kernel ); + SAFE_RELEASE( outputToVertexArrayWithNormalsKernel.constBuffer ); + SAFE_RELEASE( outputToVertexArrayWithNormalsKernel.kernel ); + SAFE_RELEASE( outputToVertexArrayWithoutNormalsKernel.constBuffer ); + SAFE_RELEASE( outputToVertexArrayWithoutNormalsKernel.kernel ); + + + SAFE_RELEASE( addVelocityKernel.constBuffer ); + SAFE_RELEASE( addVelocityKernel.kernel ); + SAFE_RELEASE( applyForcesKernel.constBuffer ); + SAFE_RELEASE( applyForcesKernel.kernel ); + SAFE_RELEASE( outputToVertexArrayKernel.constBuffer ); + SAFE_RELEASE( outputToVertexArrayKernel.kernel ); + SAFE_RELEASE( collideCylinderKernel.constBuffer ); + SAFE_RELEASE( collideCylinderKernel.kernel ); +} + + + +void btDX11SoftBodySolver::optimize( btAlignedObjectArray< btSoftBody * > &softBodies ) +{ + if( m_softBodySet.size() != softBodies.size() ) + { + // Have a change in the soft body set so update, reloading all the data + getVertexData().clear(); + getTriangleData().clear(); + getLinkData().clear(); + m_softBodySet.resize(0); + + + for( int softBodyIndex = 0; softBodyIndex < softBodies.size(); ++softBodyIndex ) + { + btSoftBody *softBody = softBodies[ softBodyIndex ]; + using Vectormath::Aos::Matrix3; + using Vectormath::Aos::Point3; + + // Create SoftBody that will store the information within the solver + btAcceleratedSoftBodyInterface *newSoftBody = new btAcceleratedSoftBodyInterface( softBody ); + m_softBodySet.push_back( newSoftBody ); + + m_perClothAcceleration.push_back( toVector3(softBody->getWorldInfo()->m_gravity) ); + m_perClothDampingFactor.push_back(softBody->m_cfg.kDP); + m_perClothVelocityCorrectionCoefficient.push_back( softBody->m_cfg.kVCF ); + m_perClothLiftFactor.push_back( softBody->m_cfg.kLF ); + m_perClothDragFactor.push_back( softBody->m_cfg.kDG ); + m_perClothMediumDensity.push_back(softBody->getWorldInfo()->air_density); + + // Add space for new vertices and triangles in the default solver for now + // TODO: Include space here for tearing too later + int firstVertex = getVertexData().getNumVertices(); + int numVertices = softBody->m_nodes.size(); + int maxVertices = numVertices; + // Allocate space for new vertices in all the vertex arrays + getVertexData().createVertices( maxVertices, softBodyIndex ); + + int firstTriangle = getTriangleData().getNumTriangles(); + int numTriangles = softBody->m_faces.size(); + int maxTriangles = numTriangles; + getTriangleData().createTriangles( maxTriangles ); + + // Copy vertices from softbody into the solver + for( int vertex = 0; vertex < numVertices; ++vertex ) + { + Point3 multPoint(softBody->m_nodes[vertex].m_x.getX(), softBody->m_nodes[vertex].m_x.getY(), softBody->m_nodes[vertex].m_x.getZ()); + btSoftBodyVertexData::VertexDescription desc; + + // TODO: Position in the softbody might be pre-transformed + // or we may need to adapt for the pose. + //desc.setPosition( cloth.getMeshTransform()*multPoint ); + desc.setPosition( multPoint ); + + float vertexInverseMass = softBody->m_nodes[vertex].m_im; + desc.setInverseMass(vertexInverseMass); + getVertexData().setVertexAt( desc, firstVertex + vertex ); + } + + // Copy triangles similarly + // We're assuming here that vertex indices are based on the firstVertex rather than the entire scene + for( int triangle = 0; triangle < numTriangles; ++triangle ) + { + // Note that large array storage is relative to the array not to the cloth + // So we need to add firstVertex to each value + int vertexIndex0 = (softBody->m_faces[triangle].m_n[0] - &(softBody->m_nodes[0])); + int vertexIndex1 = (softBody->m_faces[triangle].m_n[1] - &(softBody->m_nodes[0])); + int vertexIndex2 = (softBody->m_faces[triangle].m_n[2] - &(softBody->m_nodes[0])); + btSoftBodyTriangleData::TriangleDescription newTriangle(vertexIndex0 + firstVertex, vertexIndex1 + firstVertex, vertexIndex2 + firstVertex); + getTriangleData().setTriangleAt( newTriangle, firstTriangle + triangle ); + + // Increase vertex triangle counts for this triangle + getVertexData().getTriangleCount(newTriangle.getVertexSet().vertex0)++; + getVertexData().getTriangleCount(newTriangle.getVertexSet().vertex1)++; + getVertexData().getTriangleCount(newTriangle.getVertexSet().vertex2)++; + } + + int firstLink = getLinkData().getNumLinks(); + int numLinks = softBody->m_links.size(); + int maxLinks = numLinks; + + // Allocate space for the links + getLinkData().createLinks( numLinks ); + + // Add the links + for( int link = 0; link < numLinks; ++link ) + { + int vertexIndex0 = softBody->m_links[link].m_n[0] - &(softBody->m_nodes[0]); + int vertexIndex1 = softBody->m_links[link].m_n[1] - &(softBody->m_nodes[0]); + + btSoftBodyLinkData::LinkDescription newLink(vertexIndex0 + firstVertex, vertexIndex1 + firstVertex, softBody->m_links[link].m_material->m_kLST); + newLink.setLinkStrength(1.f); + getLinkData().setLinkAt(newLink, firstLink + link); + } + + newSoftBody->setFirstVertex( firstVertex ); + newSoftBody->setFirstTriangle( firstTriangle ); + newSoftBody->setNumVertices( numVertices ); + newSoftBody->setMaxVertices( maxVertices ); + newSoftBody->setNumTriangles( numTriangles ); + newSoftBody->setMaxTriangles( maxTriangles ); + newSoftBody->setFirstLink( firstLink ); + newSoftBody->setNumLinks( numLinks ); + } + + + + updateConstants(0.f); + + + m_linkData.generateBatches(); + m_triangleData.generateBatches(); + } +} + + +btSoftBodyLinkData &btDX11SoftBodySolver::getLinkData() +{ + // TODO: Consider setting link data to "changed" here + return m_linkData; +} + +btSoftBodyVertexData &btDX11SoftBodySolver::getVertexData() +{ + // TODO: Consider setting vertex data to "changed" here + return m_vertexData; +} + +btSoftBodyTriangleData &btDX11SoftBodySolver::getTriangleData() +{ + // TODO: Consider setting triangle data to "changed" here + return m_triangleData; +} + +bool btDX11SoftBodySolver::checkInitialized() +{ + return buildShaders(); +} + +void btDX11SoftBodySolver::resetNormalsAndAreas( int numVertices ) +{ + // No need to batch link solver, it is entirely parallel + // Copy kernel parameters to GPU + UpdateSoftBodiesCB constBuffer; + + constBuffer.numNodes = numVertices; + constBuffer.epsilon = FLT_EPSILON; + + // Todo: factor this out. Number of nodes is static and sdt might be, too, we can update this just once on setup + D3D11_MAPPED_SUBRESOURCE MappedResource = {0}; + m_dx11Context->Map( integrateKernel.constBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &MappedResource ); + memcpy( MappedResource.pData, &constBuffer, sizeof(UpdateSoftBodiesCB) ); + m_dx11Context->Unmap( integrateKernel.constBuffer, 0 ); + m_dx11Context->CSSetConstantBuffers( 0, 1, &integrateKernel.constBuffer ); + + // Set resources and dispatch + m_dx11Context->CSSetUnorderedAccessViews( 0, 1, &(m_vertexData.m_dx11VertexNormal.getUAV()), NULL ); + m_dx11Context->CSSetUnorderedAccessViews( 1, 1, &(m_vertexData.m_dx11VertexArea.getUAV()), NULL ); + + // Execute the kernel + m_dx11Context->CSSetShader( resetNormalsAndAreasKernel.kernel, NULL, 0 ); + + int numBlocks = (constBuffer.numNodes + (128-1)) / 128; + m_dx11Context->Dispatch(numBlocks, 1, 1 ); + + { + // Tidy up + ID3D11UnorderedAccessView* pUAViewNULL = NULL; + m_dx11Context->CSSetUnorderedAccessViews( 0, 1, &pUAViewNULL, NULL ); + m_dx11Context->CSSetUnorderedAccessViews( 1, 1, &pUAViewNULL, NULL ); + + ID3D11Buffer *pBufferNull = NULL; + m_dx11Context->CSSetConstantBuffers( 0, 1, &pBufferNull ); + } +} // btDX11SoftBodySolver::resetNormalsAndAreas + +void btDX11SoftBodySolver::normalizeNormalsAndAreas( int numVertices ) +{ + // No need to batch link solver, it is entirely parallel + // Copy kernel parameters to GPU + UpdateSoftBodiesCB constBuffer; + + constBuffer.numNodes = numVertices; + constBuffer.epsilon = FLT_EPSILON; + + // Todo: factor this out. Number of nodes is static and sdt might be, too, we can update this just once on setup + D3D11_MAPPED_SUBRESOURCE MappedResource = {0}; + m_dx11Context->Map( integrateKernel.constBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &MappedResource ); + memcpy( MappedResource.pData, &constBuffer, sizeof(UpdateSoftBodiesCB) ); + m_dx11Context->Unmap( integrateKernel.constBuffer, 0 ); + m_dx11Context->CSSetConstantBuffers( 0, 1, &integrateKernel.constBuffer ); + + // Set resources and dispatch + m_dx11Context->CSSetShaderResources( 2, 1, &(m_vertexData.m_dx11VertexTriangleCount.getSRV()) ); + + m_dx11Context->CSSetUnorderedAccessViews( 0, 1, &(m_vertexData.m_dx11VertexNormal.getUAV()), NULL ); + m_dx11Context->CSSetUnorderedAccessViews( 1, 1, &(m_vertexData.m_dx11VertexArea.getUAV()), NULL ); + + // Execute the kernel + m_dx11Context->CSSetShader( normalizeNormalsAndAreasKernel.kernel, NULL, 0 ); + + int numBlocks = (constBuffer.numNodes + (128-1)) / 128; + m_dx11Context->Dispatch(numBlocks, 1, 1 ); + + { + // Tidy up + ID3D11ShaderResourceView* pViewNULL = NULL; + m_dx11Context->CSSetShaderResources( 2, 1, &pViewNULL ); + + ID3D11UnorderedAccessView* pUAViewNULL = NULL; + m_dx11Context->CSSetUnorderedAccessViews( 0, 1, &pUAViewNULL, NULL ); + m_dx11Context->CSSetUnorderedAccessViews( 1, 1, &pUAViewNULL, NULL ); + + ID3D11Buffer *pBufferNull = NULL; + m_dx11Context->CSSetConstantBuffers( 0, 1, &pBufferNull ); + } +} // btDX11SoftBodySolver::normalizeNormalsAndAreas + +void btDX11SoftBodySolver::executeUpdateSoftBodies( int firstTriangle, int numTriangles ) +{ + // No need to batch link solver, it is entirely parallel + // Copy kernel parameters to GPU + UpdateSoftBodiesCB constBuffer; + + constBuffer.startFace = firstTriangle; + constBuffer.numFaces = numTriangles; + + // Todo: factor this out. Number of nodes is static and sdt might be, too, we can update this just once on setup + D3D11_MAPPED_SUBRESOURCE MappedResource = {0}; + m_dx11Context->Map( updateSoftBodiesKernel.constBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &MappedResource ); + memcpy( MappedResource.pData, &constBuffer, sizeof(UpdateSoftBodiesCB) ); + m_dx11Context->Unmap( updateSoftBodiesKernel.constBuffer, 0 ); + m_dx11Context->CSSetConstantBuffers( 0, 1, &updateSoftBodiesKernel.constBuffer ); + + // Set resources and dispatch + m_dx11Context->CSSetShaderResources( 0, 1, &(m_triangleData.m_dx11VertexIndices.getSRV()) ); + m_dx11Context->CSSetShaderResources( 1, 1, &(m_vertexData.m_dx11VertexPosition.getSRV()) ); + + m_dx11Context->CSSetUnorderedAccessViews( 0, 1, &(m_vertexData.m_dx11VertexNormal.getUAV()), NULL ); + m_dx11Context->CSSetUnorderedAccessViews( 1, 1, &(m_vertexData.m_dx11VertexArea.getUAV()), NULL ); + m_dx11Context->CSSetUnorderedAccessViews( 2, 1, &(m_triangleData.m_dx11Normal.getUAV()), NULL ); + m_dx11Context->CSSetUnorderedAccessViews( 3, 1, &(m_triangleData.m_dx11Area.getUAV()), NULL ); + + // Execute the kernel + m_dx11Context->CSSetShader( updateSoftBodiesKernel.kernel, NULL, 0 ); + + int numBlocks = (numTriangles + (128-1)) / 128; + m_dx11Context->Dispatch(numBlocks, 1, 1 ); + + { + // Tidy up + ID3D11ShaderResourceView* pViewNULL = NULL; + m_dx11Context->CSSetShaderResources( 4, 1, &pViewNULL ); + + ID3D11UnorderedAccessView* pUAViewNULL = NULL; + m_dx11Context->CSSetUnorderedAccessViews( 0, 1, &pUAViewNULL, NULL ); + m_dx11Context->CSSetUnorderedAccessViews( 1, 1, &pUAViewNULL, NULL ); + + ID3D11Buffer *pBufferNull = NULL; + m_dx11Context->CSSetConstantBuffers( 0, 1, &pBufferNull ); + } +} // btDX11SoftBodySolver::executeUpdateSoftBodies + +void btDX11SoftBodySolver::updateSoftBodies() +{ + using namespace Vectormath::Aos; + + + int numVertices = m_vertexData.getNumVertices(); + int numTriangles = m_triangleData.getNumTriangles(); + + // Ensure data is on accelerator + m_vertexData.moveToAccelerator(); + m_triangleData.moveToAccelerator(); + + resetNormalsAndAreas( numVertices ); + + + // Go through triangle batches so updates occur correctly + for( int batchIndex = 0; batchIndex < m_triangleData.m_batchStartLengths.size(); ++batchIndex ) + { + + int startTriangle = m_triangleData.m_batchStartLengths[batchIndex].start; + int numTriangles = m_triangleData.m_batchStartLengths[batchIndex].length; + + executeUpdateSoftBodies( startTriangle, numTriangles ); + } + + + normalizeNormalsAndAreas( numVertices ); + +} // btDX11SoftBodySolver::updateSoftBodies + + +Vectormath::Aos::Vector3 btDX11SoftBodySolver::ProjectOnAxis( const Vectormath::Aos::Vector3 &v, const Vectormath::Aos::Vector3 &a ) +{ + return a*Vectormath::Aos::dot(v, a); +} + +void btDX11SoftBodySolver::ApplyClampedForce( float solverdt, const Vectormath::Aos::Vector3 &force, const Vectormath::Aos::Vector3 &vertexVelocity, float inverseMass, Vectormath::Aos::Vector3 &vertexForce ) +{ + float dtInverseMass = solverdt*inverseMass; + if( Vectormath::Aos::lengthSqr(force * dtInverseMass) > Vectormath::Aos::lengthSqr(vertexVelocity) ) + { + vertexForce -= ProjectOnAxis( vertexVelocity, normalize( force ) )/dtInverseMass; + } else { + vertexForce += force; + } +} + +void btDX11SoftBodySolver::applyForces( float solverdt ) +{ + using namespace Vectormath::Aos; + + + // Ensure data is on accelerator + m_vertexData.moveToAccelerator(); + m_dx11PerClothAcceleration.moveToGPU(); + m_dx11PerClothLiftFactor.moveToGPU(); + m_dx11PerClothDragFactor.moveToGPU(); + m_dx11PerClothMediumDensity.moveToGPU(); + m_dx11PerClothWindVelocity.moveToGPU(); + + // No need to batch link solver, it is entirely parallel + // Copy kernel parameters to GPU + ApplyForcesCB constBuffer; + + constBuffer.numNodes = m_vertexData.getNumVertices(); + constBuffer.solverdt = solverdt; + constBuffer.epsilon = FLT_EPSILON; + + // Todo: factor this out. Number of nodes is static and sdt might be, too, we can update this just once on setup + D3D11_MAPPED_SUBRESOURCE MappedResource = {0}; + m_dx11Context->Map( integrateKernel.constBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &MappedResource ); + memcpy( MappedResource.pData, &constBuffer, sizeof(ApplyForcesCB) ); + m_dx11Context->Unmap( integrateKernel.constBuffer, 0 ); + m_dx11Context->CSSetConstantBuffers( 0, 1, &integrateKernel.constBuffer ); + + // Set resources and dispatch + m_dx11Context->CSSetShaderResources( 0, 1, &(m_vertexData.m_dx11ClothIdentifier.getSRV()) ); + m_dx11Context->CSSetShaderResources( 1, 1, &(m_vertexData.m_dx11VertexNormal.getSRV()) ); + m_dx11Context->CSSetShaderResources( 2, 1, &(m_vertexData.m_dx11VertexArea.getSRV()) ); + m_dx11Context->CSSetShaderResources( 3, 1, &(m_vertexData.m_dx11VertexInverseMass.getSRV()) ); + m_dx11Context->CSSetShaderResources( 4, 1, &(m_dx11PerClothLiftFactor.getSRV()) ); + m_dx11Context->CSSetShaderResources( 5, 1, &(m_dx11PerClothDragFactor.getSRV()) ); + m_dx11Context->CSSetShaderResources( 6, 1, &(m_dx11PerClothWindVelocity.getSRV()) ); + m_dx11Context->CSSetShaderResources( 7, 1, &(m_dx11PerClothAcceleration.getSRV()) ); + m_dx11Context->CSSetShaderResources( 8, 1, &(m_dx11PerClothMediumDensity.getSRV()) ); + + m_dx11Context->CSSetUnorderedAccessViews( 0, 1, &(m_vertexData.m_dx11VertexForceAccumulator.getUAV()), NULL ); + m_dx11Context->CSSetUnorderedAccessViews( 1, 1, &(m_vertexData.m_dx11VertexVelocity.getUAV()), NULL ); + + // Execute the kernel + m_dx11Context->CSSetShader( applyForcesKernel.kernel, NULL, 0 ); + + int numBlocks = (constBuffer.numNodes + (128-1)) / 128; + m_dx11Context->Dispatch(numBlocks, 1, 1 ); + + { + // Tidy up + ID3D11ShaderResourceView* pViewNULL = NULL; + m_dx11Context->CSSetShaderResources( 0, 1, &pViewNULL ); + m_dx11Context->CSSetShaderResources( 1, 1, &pViewNULL ); + m_dx11Context->CSSetShaderResources( 2, 1, &pViewNULL ); + m_dx11Context->CSSetShaderResources( 3, 1, &pViewNULL ); + m_dx11Context->CSSetShaderResources( 4, 1, &pViewNULL ); + m_dx11Context->CSSetShaderResources( 5, 1, &pViewNULL ); + m_dx11Context->CSSetShaderResources( 6, 1, &pViewNULL ); + m_dx11Context->CSSetShaderResources( 7, 1, &pViewNULL ); + m_dx11Context->CSSetShaderResources( 8, 1, &pViewNULL ); + + ID3D11UnorderedAccessView* pUAViewNULL = NULL; + m_dx11Context->CSSetUnorderedAccessViews( 0, 1, &pUAViewNULL, NULL ); + m_dx11Context->CSSetUnorderedAccessViews( 1, 1, &pUAViewNULL, NULL ); + + ID3D11Buffer *pBufferNull = NULL; + m_dx11Context->CSSetConstantBuffers( 0, 1, &pBufferNull ); + } +} // btDX11SoftBodySolver::applyForces + +/** + * Integrate motion on the solver. + */ +void btDX11SoftBodySolver::integrate( float solverdt ) +{ + // TEMPORARY COPIES + m_vertexData.moveToAccelerator(); + + // No need to batch link solver, it is entirely parallel + // Copy kernel parameters to GPU + IntegrateCB constBuffer; + + constBuffer.numNodes = m_vertexData.getNumVertices(); + constBuffer.solverdt = solverdt; + + // Todo: factor this out. Number of nodes is static and sdt might be, too, we can update this just once on setup + D3D11_MAPPED_SUBRESOURCE MappedResource = {0}; + m_dx11Context->Map( integrateKernel.constBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &MappedResource ); + memcpy( MappedResource.pData, &constBuffer, sizeof(IntegrateCB) ); + m_dx11Context->Unmap( integrateKernel.constBuffer, 0 ); + m_dx11Context->CSSetConstantBuffers( 0, 1, &integrateKernel.constBuffer ); + + // Set resources and dispatch + m_dx11Context->CSSetShaderResources( 0, 1, &(m_vertexData.m_dx11VertexInverseMass.getSRV()) ); + + m_dx11Context->CSSetUnorderedAccessViews( 0, 1, &(m_vertexData.m_dx11VertexPosition.getUAV()), NULL ); + m_dx11Context->CSSetUnorderedAccessViews( 1, 1, &(m_vertexData.m_dx11VertexVelocity.getUAV()), NULL ); + m_dx11Context->CSSetUnorderedAccessViews( 2, 1, &(m_vertexData.m_dx11VertexPreviousPosition.getUAV()), NULL ); + m_dx11Context->CSSetUnorderedAccessViews( 3, 1, &(m_vertexData.m_dx11VertexForceAccumulator.getUAV()), NULL ); + + // Execute the kernel + m_dx11Context->CSSetShader( integrateKernel.kernel, NULL, 0 ); + + int numBlocks = (constBuffer.numNodes + (128-1)) / 128; + m_dx11Context->Dispatch(numBlocks, 1, 1 ); + + { + // Tidy up + ID3D11ShaderResourceView* pViewNULL = NULL; + m_dx11Context->CSSetShaderResources( 0, 1, &pViewNULL ); + + ID3D11UnorderedAccessView* pUAViewNULL = NULL; + m_dx11Context->CSSetUnorderedAccessViews( 0, 1, &pUAViewNULL, NULL ); + m_dx11Context->CSSetUnorderedAccessViews( 1, 1, &pUAViewNULL, NULL ); + m_dx11Context->CSSetUnorderedAccessViews( 2, 1, &pUAViewNULL, NULL ); + m_dx11Context->CSSetUnorderedAccessViews( 3, 1, &pUAViewNULL, NULL ); + + ID3D11Buffer *pBufferNull = NULL; + m_dx11Context->CSSetConstantBuffers( 0, 1, &pBufferNull ); + } +} // btDX11SoftBodySolver::integrate + +float btDX11SoftBodySolver::computeTriangleArea( + const Vectormath::Aos::Point3 &vertex0, + const Vectormath::Aos::Point3 &vertex1, + const Vectormath::Aos::Point3 &vertex2 ) +{ + Vectormath::Aos::Vector3 a = vertex1 - vertex0; + Vectormath::Aos::Vector3 b = vertex2 - vertex0; + Vectormath::Aos::Vector3 crossProduct = cross(a, b); + float area = length( crossProduct ); + return area; +} // btDX11SoftBodySolver::computeTriangleArea + +void btDX11SoftBodySolver::updateConstants( float timeStep ) +{ + using namespace Vectormath::Aos; + + if( m_updateSolverConstants ) + { + m_updateSolverConstants = false; + + // Will have to redo this if we change the structure (tear, maybe) or various other possible changes + + // Initialise link constants + const int numLinks = m_linkData.getNumLinks(); + for( int linkIndex = 0; linkIndex < numLinks; ++linkIndex ) + { + btSoftBodyLinkData::LinkNodePair &vertices( m_linkData.getVertexPair(linkIndex) ); + m_linkData.getRestLength(linkIndex) = length((m_vertexData.getPosition( vertices.vertex0 ) - m_vertexData.getPosition( vertices.vertex1 ))); + float invMass0 = m_vertexData.getInverseMass(vertices.vertex0); + float invMass1 = m_vertexData.getInverseMass(vertices.vertex1); + float linearStiffness = m_linkData.getLinearStiffnessCoefficient(linkIndex); + float massLSC = (invMass0 + invMass1)/linearStiffness; + m_linkData.getMassLSC(linkIndex) = massLSC; + float restLength = m_linkData.getRestLength(linkIndex); + float restLengthSquared = restLength*restLength; + m_linkData.getRestLengthSquared(linkIndex) = restLengthSquared; + } + } +} // btDX11SoftBodySolver::updateConstants + + + +void btDX11SoftBodySolver::solveConstraints( float solverdt ) +{ + + //std::cerr << "'GPU' solve constraints\n"; + using Vectormath::Aos::Vector3; + using Vectormath::Aos::Point3; + using Vectormath::Aos::lengthSqr; + using Vectormath::Aos::dot; + + // Prepare links + int numLinks = m_linkData.getNumLinks(); + int numVertices = m_vertexData.getNumVertices(); + + float kst = 1.f; + float ti = 0.f; + + + m_dx11PerClothDampingFactor.moveToGPU(); + m_dx11PerClothVelocityCorrectionCoefficient.moveToGPU(); + + + // Ensure data is on accelerator + m_linkData.moveToAccelerator(); + m_vertexData.moveToAccelerator(); + + + prepareLinks(); + + for( int iteration = 0; iteration < m_numberOfVelocityIterations ; ++iteration ) + { + for( int i = 0; i < m_linkData.m_batchStartLengths.size(); ++i ) + { + int startLink = m_linkData.m_batchStartLengths[i].start; + int numLinks = m_linkData.m_batchStartLengths[i].length; + + solveLinksForVelocity( startLink, numLinks, kst ); + } + } + + // Compute new positions from velocity + // Also update the previous position so that our position computation is now based on the new position from the velocity solution + // rather than based directly on the original positions + if( m_numberOfVelocityIterations > 0 ) + { + updateVelocitiesFromPositionsWithVelocities( 1.f/solverdt ); + } else { + updateVelocitiesFromPositionsWithoutVelocities( 1.f/solverdt ); + } + + + // Solve drift + for( int iteration = 0; iteration < m_numberOfPositionIterations ; ++iteration ) + { + for( int i = 0; i < m_linkData.m_batchStartLengths.size(); ++i ) + { + int startLink = m_linkData.m_batchStartLengths[i].start; + int numLinks = m_linkData.m_batchStartLengths[i].length; + + solveLinksForPosition( startLink, numLinks, kst, ti ); + } + + } // for( int iteration = 0; iteration < m_numberOfPositionIterations ; ++iteration ) + + updateVelocitiesFromPositionsWithoutVelocities( 1.f/solverdt ); +} // btDX11SoftBodySolver::solveConstraints + + + + +////////////////////////////////////// +// Kernel dispatches +void btDX11SoftBodySolver::prepareLinks() +{ + // No need to batch link solver, it is entirely parallel + // Copy kernel parameters to GPU + PrepareLinksCB constBuffer; + + constBuffer.numLinks = m_linkData.getNumLinks(); + + D3D11_MAPPED_SUBRESOURCE MappedResource = {0}; + m_dx11Context->Map( prepareLinksKernel.constBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &MappedResource ); + memcpy( MappedResource.pData, &constBuffer, sizeof(PrepareLinksCB) ); + m_dx11Context->Unmap( prepareLinksKernel.constBuffer, 0 ); + m_dx11Context->CSSetConstantBuffers( 0, 1, &prepareLinksKernel.constBuffer ); + + // Set resources and dispatch + m_dx11Context->CSSetShaderResources( 0, 1, &(m_linkData.m_dx11Links.getSRV()) ); + m_dx11Context->CSSetShaderResources( 1, 1, &(m_linkData.m_dx11LinksMassLSC.getSRV()) ); + m_dx11Context->CSSetShaderResources( 2, 1, &(m_vertexData.m_dx11VertexPreviousPosition.getSRV()) ); + + m_dx11Context->CSSetUnorderedAccessViews( 0, 1, &(m_linkData.m_dx11LinksLengthRatio.getUAV()), NULL ); + m_dx11Context->CSSetUnorderedAccessViews( 1, 1, &(m_linkData.m_dx11LinksCLength.getUAV()), NULL ); + + // Execute the kernel + m_dx11Context->CSSetShader( prepareLinksKernel.kernel, NULL, 0 ); + + int numBlocks = (constBuffer.numLinks + (128-1)) / 128; + m_dx11Context->Dispatch(numBlocks , 1, 1 ); + + { + // Tidy up + ID3D11ShaderResourceView* pViewNULL = NULL; + m_dx11Context->CSSetShaderResources( 0, 1, &pViewNULL ); + m_dx11Context->CSSetShaderResources( 1, 1, &pViewNULL ); + m_dx11Context->CSSetShaderResources( 2, 1, &pViewNULL ); + + ID3D11UnorderedAccessView* pUAViewNULL = NULL; + m_dx11Context->CSSetUnorderedAccessViews( 0, 1, &pUAViewNULL, NULL ); + m_dx11Context->CSSetUnorderedAccessViews( 1, 1, &pUAViewNULL, NULL ); + + ID3D11Buffer *pBufferNull = NULL; + m_dx11Context->CSSetConstantBuffers( 0, 1, &pBufferNull ); + } +} // btDX11SoftBodySolver::prepareLinks + + +void btDX11SoftBodySolver::updatePositionsFromVelocities( float solverdt ) +{ + // No need to batch link solver, it is entirely parallel + // Copy kernel parameters to GPU + UpdatePositionsFromVelocitiesCB constBuffer; + + constBuffer.numNodes = m_vertexData.getNumVertices(); + constBuffer.solverSDT = solverdt; + + // Todo: factor this out. Number of nodes is static and sdt might be, too, we can update this just once on setup + D3D11_MAPPED_SUBRESOURCE MappedResource = {0}; + m_dx11Context->Map( updatePositionsFromVelocitiesKernel.constBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &MappedResource ); + memcpy( MappedResource.pData, &constBuffer, sizeof(UpdatePositionsFromVelocitiesCB) ); + m_dx11Context->Unmap( updatePositionsFromVelocitiesKernel.constBuffer, 0 ); + m_dx11Context->CSSetConstantBuffers( 0, 1, &updatePositionsFromVelocitiesKernel.constBuffer ); + + // Set resources and dispatch + m_dx11Context->CSSetShaderResources( 0, 1, &(m_vertexData.m_dx11VertexVelocity.getSRV()) ); + + m_dx11Context->CSSetUnorderedAccessViews( 0, 1, &(m_vertexData.m_dx11VertexPreviousPosition.getUAV()), NULL ); + m_dx11Context->CSSetUnorderedAccessViews( 1, 1, &(m_vertexData.m_dx11VertexPosition.getUAV()), NULL ); + + // Execute the kernel + m_dx11Context->CSSetShader( updatePositionsFromVelocitiesKernel.kernel, NULL, 0 ); + + int numBlocks = (constBuffer.numNodes + (128-1)) / 128; + m_dx11Context->Dispatch(numBlocks, 1, 1 ); + + { + // Tidy up + ID3D11ShaderResourceView* pViewNULL = NULL; + m_dx11Context->CSSetShaderResources( 0, 1, &pViewNULL ); + + ID3D11UnorderedAccessView* pUAViewNULL = NULL; + m_dx11Context->CSSetUnorderedAccessViews( 0, 1, &pUAViewNULL, NULL ); + m_dx11Context->CSSetUnorderedAccessViews( 1, 1, &pUAViewNULL, NULL ); + + ID3D11Buffer *pBufferNull = NULL; + m_dx11Context->CSSetConstantBuffers( 0, 1, &pBufferNull ); + } +} // btDX11SoftBodySolver::updatePositionsFromVelocities + +void btDX11SoftBodySolver::solveLinksForPosition( int startLink, int numLinks, float kst, float ti ) +{ + // Copy kernel parameters to GPU + SolvePositionsFromLinksKernelCB constBuffer; + + // Set the first link of the batch + // and the batch size + constBuffer.startLink = startLink; + constBuffer.numLinks = numLinks; + + constBuffer.kst = kst; + constBuffer.ti = ti; + + D3D11_MAPPED_SUBRESOURCE MappedResource = {0}; + m_dx11Context->Map( solvePositionsFromLinksKernel.constBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &MappedResource ); + memcpy( MappedResource.pData, &constBuffer, sizeof(SolvePositionsFromLinksKernelCB) ); + m_dx11Context->Unmap( solvePositionsFromLinksKernel.constBuffer, 0 ); + m_dx11Context->CSSetConstantBuffers( 0, 1, &solvePositionsFromLinksKernel.constBuffer ); + + // Set resources and dispatch + m_dx11Context->CSSetShaderResources( 0, 1, &(m_linkData.m_dx11Links.getSRV()) ); + m_dx11Context->CSSetShaderResources( 1, 1, &(m_linkData.m_dx11LinksMassLSC.getSRV()) ); + m_dx11Context->CSSetShaderResources( 2, 1, &(m_linkData.m_dx11LinksRestLengthSquared.getSRV()) ); + m_dx11Context->CSSetShaderResources( 3, 1, &(m_vertexData.m_dx11VertexInverseMass.getSRV()) ); + + m_dx11Context->CSSetUnorderedAccessViews( 0, 1, &(m_vertexData.m_dx11VertexPosition.getUAV()), NULL ); + + // Execute the kernel + m_dx11Context->CSSetShader( solvePositionsFromLinksKernel.kernel, NULL, 0 ); + + int numBlocks = (constBuffer.numLinks + (128-1)) / 128; + m_dx11Context->Dispatch(numBlocks , 1, 1 ); + + { + // Tidy up + ID3D11ShaderResourceView* pViewNULL = NULL; + m_dx11Context->CSSetShaderResources( 0, 1, &pViewNULL ); + m_dx11Context->CSSetShaderResources( 1, 1, &pViewNULL ); + m_dx11Context->CSSetShaderResources( 2, 1, &pViewNULL ); + m_dx11Context->CSSetShaderResources( 3, 1, &pViewNULL ); + + ID3D11UnorderedAccessView* pUAViewNULL = NULL; + m_dx11Context->CSSetUnorderedAccessViews( 0, 1, &pUAViewNULL, NULL ); + + ID3D11Buffer *pBufferNull = NULL; + m_dx11Context->CSSetConstantBuffers( 0, 1, &pBufferNull ); + } + +} // btDX11SoftBodySolver::solveLinksForPosition + +void btDX11SoftBodySolver::solveLinksForVelocity( int startLink, int numLinks, float kst ) +{ + // Copy kernel parameters to GPU + VSolveLinksCB constBuffer; + + // Set the first link of the batch + // and the batch size + + constBuffer.startLink = startLink; + constBuffer.numLinks = numLinks; + constBuffer.kst = kst; + + D3D11_MAPPED_SUBRESOURCE MappedResource = {0}; + m_dx11Context->Map( vSolveLinksKernel.constBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &MappedResource ); + memcpy( MappedResource.pData, &constBuffer, sizeof(VSolveLinksCB) ); + m_dx11Context->Unmap( vSolveLinksKernel.constBuffer, 0 ); + m_dx11Context->CSSetConstantBuffers( 0, 1, &vSolveLinksKernel.constBuffer ); + + // Set resources and dispatch + m_dx11Context->CSSetShaderResources( 0, 1, &(m_linkData.m_dx11Links.getSRV()) ); + m_dx11Context->CSSetShaderResources( 1, 1, &(m_linkData.m_dx11LinksLengthRatio.getSRV()) ); + m_dx11Context->CSSetShaderResources( 2, 1, &(m_linkData.m_dx11LinksCLength.getSRV()) ); + m_dx11Context->CSSetShaderResources( 3, 1, &(m_vertexData.m_dx11VertexInverseMass.getSRV()) ); + + m_dx11Context->CSSetUnorderedAccessViews( 0, 1, &(m_vertexData.m_dx11VertexVelocity.getUAV()), NULL ); + + // Execute the kernel + m_dx11Context->CSSetShader( vSolveLinksKernel.kernel, NULL, 0 ); + + int numBlocks = (constBuffer.numLinks + (128-1)) / 128; + m_dx11Context->Dispatch(numBlocks , 1, 1 ); + + { + // Tidy up + ID3D11ShaderResourceView* pViewNULL = NULL; + m_dx11Context->CSSetShaderResources( 0, 1, &pViewNULL ); + m_dx11Context->CSSetShaderResources( 1, 1, &pViewNULL ); + m_dx11Context->CSSetShaderResources( 2, 1, &pViewNULL ); + m_dx11Context->CSSetShaderResources( 3, 1, &pViewNULL ); + + ID3D11UnorderedAccessView* pUAViewNULL = NULL; + m_dx11Context->CSSetUnorderedAccessViews( 0, 1, &pUAViewNULL, NULL ); + + ID3D11Buffer *pBufferNull = NULL; + m_dx11Context->CSSetConstantBuffers( 0, 1, &pBufferNull ); + } +} // btDX11SoftBodySolver::solveLinksForVelocity + + +void btDX11SoftBodySolver::updateVelocitiesFromPositionsWithVelocities( float isolverdt ) +{ + // Copy kernel parameters to GPU + UpdateVelocitiesFromPositionsWithVelocitiesCB constBuffer; + + // Set the first link of the batch + // and the batch size + constBuffer.numNodes = m_vertexData.getNumVertices(); + constBuffer.isolverdt = isolverdt; + + D3D11_MAPPED_SUBRESOURCE MappedResource = {0}; + m_dx11Context->Map( updateVelocitiesFromPositionsWithVelocitiesKernel.constBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &MappedResource ); + memcpy( MappedResource.pData, &constBuffer, sizeof(UpdateVelocitiesFromPositionsWithVelocitiesCB) ); + m_dx11Context->Unmap( updateVelocitiesFromPositionsWithVelocitiesKernel.constBuffer, 0 ); + m_dx11Context->CSSetConstantBuffers( 0, 1, &updateVelocitiesFromPositionsWithVelocitiesKernel.constBuffer ); + + // Set resources and dispatch + m_dx11Context->CSSetShaderResources( 0, 1, &(m_vertexData.m_dx11VertexPosition.getSRV()) ); + m_dx11Context->CSSetShaderResources( 1, 1, &(m_vertexData.m_dx11VertexPreviousPosition.getSRV()) ); + m_dx11Context->CSSetShaderResources( 2, 1, &(m_vertexData.m_dx11ClothIdentifier.getSRV()) ); + m_dx11Context->CSSetShaderResources( 3, 1, &(m_dx11PerClothVelocityCorrectionCoefficient.getSRV()) ); + m_dx11Context->CSSetShaderResources( 4, 1, &(m_dx11PerClothDampingFactor.getSRV()) ); + + m_dx11Context->CSSetUnorderedAccessViews( 0, 1, &(m_vertexData.m_dx11VertexVelocity.getUAV()), NULL ); + m_dx11Context->CSSetUnorderedAccessViews( 1, 1, &(m_vertexData.m_dx11VertexForceAccumulator.getUAV()), NULL ); + + + // Execute the kernel + m_dx11Context->CSSetShader( updateVelocitiesFromPositionsWithVelocitiesKernel.kernel, NULL, 0 ); + + int numBlocks = (constBuffer.numNodes + (128-1)) / 128; + m_dx11Context->Dispatch(numBlocks , 1, 1 ); + + { + // Tidy up + ID3D11ShaderResourceView* pViewNULL = NULL; + m_dx11Context->CSSetShaderResources( 0, 1, &pViewNULL ); + m_dx11Context->CSSetShaderResources( 1, 1, &pViewNULL ); + m_dx11Context->CSSetShaderResources( 2, 1, &pViewNULL ); + m_dx11Context->CSSetShaderResources( 3, 1, &pViewNULL ); + m_dx11Context->CSSetShaderResources( 4, 1, &pViewNULL ); + + ID3D11UnorderedAccessView* pUAViewNULL = NULL; + m_dx11Context->CSSetUnorderedAccessViews( 0, 1, &pUAViewNULL, NULL ); + m_dx11Context->CSSetUnorderedAccessViews( 1, 1, &pUAViewNULL, NULL ); + + ID3D11Buffer *pBufferNull = NULL; + m_dx11Context->CSSetConstantBuffers( 0, 1, &pBufferNull ); + } + +} // btDX11SoftBodySolver::updateVelocitiesFromPositionsWithVelocities + +void btDX11SoftBodySolver::updateVelocitiesFromPositionsWithoutVelocities( float isolverdt ) +{ + // Copy kernel parameters to GPU + UpdateVelocitiesFromPositionsWithoutVelocitiesCB constBuffer; + + // Set the first link of the batch + // and the batch size + constBuffer.numNodes = m_vertexData.getNumVertices(); + constBuffer.isolverdt = isolverdt; + + D3D11_MAPPED_SUBRESOURCE MappedResource = {0}; + m_dx11Context->Map( updateVelocitiesFromPositionsWithoutVelocitiesKernel.constBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &MappedResource ); + memcpy( MappedResource.pData, &constBuffer, sizeof(UpdateVelocitiesFromPositionsWithoutVelocitiesCB) ); + m_dx11Context->Unmap( updateVelocitiesFromPositionsWithoutVelocitiesKernel.constBuffer, 0 ); + m_dx11Context->CSSetConstantBuffers( 0, 1, &updateVelocitiesFromPositionsWithoutVelocitiesKernel.constBuffer ); + + // Set resources and dispatch + m_dx11Context->CSSetShaderResources( 0, 1, &(m_vertexData.m_dx11VertexPosition.getSRV()) ); + m_dx11Context->CSSetShaderResources( 1, 1, &(m_vertexData.m_dx11VertexPreviousPosition.getSRV()) ); + m_dx11Context->CSSetShaderResources( 2, 1, &(m_vertexData.m_dx11ClothIdentifier.getSRV()) ); + m_dx11Context->CSSetShaderResources( 3, 1, &(m_dx11PerClothDampingFactor.getSRV()) ); + + m_dx11Context->CSSetUnorderedAccessViews( 0, 1, &(m_vertexData.m_dx11VertexVelocity.getUAV()), NULL ); + m_dx11Context->CSSetUnorderedAccessViews( 1, 1, &(m_vertexData.m_dx11VertexForceAccumulator.getUAV()), NULL ); + + + // Execute the kernel + m_dx11Context->CSSetShader( updateVelocitiesFromPositionsWithoutVelocitiesKernel.kernel, NULL, 0 ); + + int numBlocks = (constBuffer.numNodes + (128-1)) / 128; + m_dx11Context->Dispatch(numBlocks , 1, 1 ); + + { + // Tidy up + ID3D11ShaderResourceView* pViewNULL = NULL; + m_dx11Context->CSSetShaderResources( 0, 1, &pViewNULL ); + m_dx11Context->CSSetShaderResources( 1, 1, &pViewNULL ); + m_dx11Context->CSSetShaderResources( 2, 1, &pViewNULL ); + m_dx11Context->CSSetShaderResources( 3, 1, &pViewNULL ); + + ID3D11UnorderedAccessView* pUAViewNULL = NULL; + m_dx11Context->CSSetUnorderedAccessViews( 0, 1, &pUAViewNULL, NULL ); + m_dx11Context->CSSetUnorderedAccessViews( 1, 1, &pUAViewNULL, NULL ); + + ID3D11Buffer *pBufferNull = NULL; + m_dx11Context->CSSetConstantBuffers( 0, 1, &pBufferNull ); + } + +} // btDX11SoftBodySolver::updateVelocitiesFromPositionsWithoutVelocities + +// End kernel dispatches +///////////////////////////////////// + + + + + + + + + + + + + + +btDX11SoftBodySolver::btAcceleratedSoftBodyInterface *btDX11SoftBodySolver::findSoftBodyInterface( const btSoftBody* const softBody ) +{ + for( int softBodyIndex = 0; softBodyIndex < m_softBodySet.size(); ++softBodyIndex ) + { + btAcceleratedSoftBodyInterface *softBodyInterface = m_softBodySet[softBodyIndex]; + if( softBodyInterface->getSoftBody() == softBody ) + return softBodyInterface; + } + return 0; +} + +void btDX11SoftBodySolver::copySoftBodyToVertexBuffer( const btSoftBody * const softBody, btVertexBufferDescriptor *vertexBuffer ) +{ + checkInitialized(); + + btAcceleratedSoftBodyInterface *currentCloth = findSoftBodyInterface( softBody ); + + + const int firstVertex = currentCloth->getFirstVertex(); + const int lastVertex = firstVertex + currentCloth->getNumVertices(); + + if( vertexBuffer->getBufferType() == btVertexBufferDescriptor::CPU_BUFFER ) + { + // If we're doing a CPU-buffer copy must copy the data back to the host first + m_vertexData.m_dx11VertexPosition.copyFromGPU(); + m_vertexData.m_dx11VertexNormal.copyFromGPU(); + + const int firstVertex = currentCloth->getFirstVertex(); + const int lastVertex = firstVertex + currentCloth->getNumVertices(); + const btCPUVertexBufferDescriptor *cpuVertexBuffer = static_cast< btCPUVertexBufferDescriptor* >(vertexBuffer); + float *basePointer = cpuVertexBuffer->getBasePointer(); + + if( vertexBuffer->hasVertexPositions() ) + { + const int vertexOffset = cpuVertexBuffer->getVertexOffset(); + const int vertexStride = cpuVertexBuffer->getVertexStride(); + float *vertexPointer = basePointer + vertexOffset; + + for( int vertexIndex = firstVertex; vertexIndex < lastVertex; ++vertexIndex ) + { + Vectormath::Aos::Point3 position = m_vertexData.getPosition(vertexIndex); + *(vertexPointer + 0) = position.getX(); + *(vertexPointer + 1) = position.getY(); + *(vertexPointer + 2) = position.getZ(); + vertexPointer += vertexStride; + } + } + if( vertexBuffer->hasNormals() ) + { + const int normalOffset = cpuVertexBuffer->getNormalOffset(); + const int normalStride = cpuVertexBuffer->getNormalStride(); + float *normalPointer = basePointer + normalOffset; + + for( int vertexIndex = firstVertex; vertexIndex < lastVertex; ++vertexIndex ) + { + Vectormath::Aos::Vector3 normal = m_vertexData.getNormal(vertexIndex); + *(normalPointer + 0) = normal.getX(); + *(normalPointer + 1) = normal.getY(); + *(normalPointer + 2) = normal.getZ(); + normalPointer += normalStride; + } + } + } else if( vertexBuffer->getBufferType() == btVertexBufferDescriptor::DX11_BUFFER ) + { + // Do a DX11 copy shader DX to DX copy + + const btDX11VertexBufferDescriptor *dx11VertexBuffer = static_cast< btDX11VertexBufferDescriptor* >(vertexBuffer); + + // No need to batch link solver, it is entirely parallel + // Copy kernel parameters to GPU + OutputToVertexArrayCB constBuffer; + ID3D11ComputeShader* outputToVertexArrayShader = outputToVertexArrayWithoutNormalsKernel.kernel; + ID3D11Buffer* outputToVertexArrayConstBuffer = outputToVertexArrayWithoutNormalsKernel.constBuffer; + + constBuffer.startNode = firstVertex; + constBuffer.numNodes = currentCloth->getNumVertices(); + constBuffer.positionOffset = vertexBuffer->getVertexOffset(); + constBuffer.positionStride = vertexBuffer->getVertexStride(); + if( vertexBuffer->hasNormals() ) + { + constBuffer.normalOffset = vertexBuffer->getNormalOffset(); + constBuffer.normalStride = vertexBuffer->getNormalStride(); + outputToVertexArrayShader = outputToVertexArrayWithNormalsKernel.kernel; + outputToVertexArrayConstBuffer = outputToVertexArrayWithNormalsKernel.constBuffer; + } + + // TODO: factor this out. Number of nodes is static and sdt might be, too, we can update this just once on setup + D3D11_MAPPED_SUBRESOURCE MappedResource = {0}; + m_dx11Context->Map( outputToVertexArrayConstBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &MappedResource ); + memcpy( MappedResource.pData, &constBuffer, sizeof(OutputToVertexArrayCB) ); + m_dx11Context->Unmap( outputToVertexArrayConstBuffer, 0 ); + m_dx11Context->CSSetConstantBuffers( 0, 1, &outputToVertexArrayConstBuffer ); + + // Set resources and dispatch + m_dx11Context->CSSetShaderResources( 0, 1, &(m_vertexData.m_dx11VertexPosition.getSRV()) ); + m_dx11Context->CSSetShaderResources( 1, 1, &(m_vertexData.m_dx11VertexNormal.getSRV()) ); + + ID3D11UnorderedAccessView* dx11UAV = dx11VertexBuffer->getDX11UAV(); + m_dx11Context->CSSetUnorderedAccessViews( 0, 1, &(dx11UAV), NULL ); + + // Execute the kernel + m_dx11Context->CSSetShader( outputToVertexArrayShader, NULL, 0 ); + + int numBlocks = (constBuffer.numNodes + (128-1)) / 128; + m_dx11Context->Dispatch(numBlocks, 1, 1 ); + + { + // Tidy up + ID3D11ShaderResourceView* pViewNULL = NULL; + m_dx11Context->CSSetShaderResources( 0, 1, &pViewNULL ); + m_dx11Context->CSSetShaderResources( 1, 1, &pViewNULL ); + + ID3D11UnorderedAccessView* pUAViewNULL = NULL; + m_dx11Context->CSSetUnorderedAccessViews( 0, 1, &pUAViewNULL, NULL ); + + ID3D11Buffer *pBufferNull = NULL; + m_dx11Context->CSSetConstantBuffers( 0, 1, &pBufferNull ); + } + } + + + + + + if( vertexBuffer->getBufferType() == btVertexBufferDescriptor::CPU_BUFFER ) + { + const int firstVertex = currentCloth->getFirstVertex(); + const int lastVertex = firstVertex + currentCloth->getNumVertices(); + const btCPUVertexBufferDescriptor *cpuVertexBuffer = static_cast< btCPUVertexBufferDescriptor* >(vertexBuffer); + float *basePointer = cpuVertexBuffer->getBasePointer(); + + if( vertexBuffer->hasVertexPositions() ) + { + const int vertexOffset = cpuVertexBuffer->getVertexOffset(); + const int vertexStride = cpuVertexBuffer->getVertexStride(); + float *vertexPointer = basePointer + vertexOffset; + + for( int vertexIndex = firstVertex; vertexIndex < lastVertex; ++vertexIndex ) + { + Vectormath::Aos::Point3 position = m_vertexData.getPosition(vertexIndex); + *(vertexPointer + 0) = position.getX(); + *(vertexPointer + 1) = position.getY(); + *(vertexPointer + 2) = position.getZ(); + vertexPointer += vertexStride; + } + } + if( vertexBuffer->hasNormals() ) + { + const int normalOffset = cpuVertexBuffer->getNormalOffset(); + const int normalStride = cpuVertexBuffer->getNormalStride(); + float *normalPointer = basePointer + normalOffset; + + for( int vertexIndex = firstVertex; vertexIndex < lastVertex; ++vertexIndex ) + { + Vectormath::Aos::Vector3 normal = m_vertexData.getNormal(vertexIndex); + *(normalPointer + 0) = normal.getX(); + *(normalPointer + 1) = normal.getY(); + *(normalPointer + 2) = normal.getZ(); + normalPointer += normalStride; + } + } + } +} // btDX11SoftBodySolver::outputToVertexBuffers + + + + +btDX11SoftBodySolver::KernelDesc btDX11SoftBodySolver::compileComputeShaderFromString( const char* shaderString, const char* shaderName, int constBufferSize ) +{ + const char *cs5String = "cs_5_0"; + + HRESULT hr = S_OK; + ID3DBlob* pErrorBlob = NULL; + ID3DBlob* pBlob = NULL; + ID3D11ComputeShader* kernelPointer = 0; + + hr = D3DX11CompileFromMemory( + shaderString, + strlen(shaderString), + shaderName, // file name + NULL, + NULL, + shaderName, + cs5String, + D3D10_SHADER_ENABLE_STRICTNESS, + NULL, + NULL, + &pBlob, + &pErrorBlob, + NULL + ); + + if( FAILED(hr) ) + { + if( pErrorBlob ) { + btAssert( "Compilation of compute shader failed\n" ); + //OutputDebugStringA( (char*)pErrorBlob->GetBufferPointer() ); + } + + SAFE_RELEASE( pErrorBlob ); + SAFE_RELEASE( pBlob ); + + btDX11SoftBodySolver::KernelDesc descriptor; + descriptor.kernel = 0; + descriptor.constBuffer = 0; + return descriptor; + } + + // Create the Compute Shader + hr = m_dx11Device->CreateComputeShader( pBlob->GetBufferPointer(), pBlob->GetBufferSize(), NULL, &kernelPointer ); + if( FAILED( hr ) ) + { + btDX11SoftBodySolver::KernelDesc descriptor; + descriptor.kernel = 0; + descriptor.constBuffer = 0; + return descriptor; + } + + ID3D11Buffer* constBuffer = 0; + if( constBufferSize > 0 ) + { + // Create the constant buffer + D3D11_BUFFER_DESC constant_buffer_desc; + ZeroMemory(&constant_buffer_desc, sizeof(constant_buffer_desc)); + constant_buffer_desc.ByteWidth = constBufferSize; + constant_buffer_desc.Usage = D3D11_USAGE_DYNAMIC; + constant_buffer_desc.BindFlags = D3D11_BIND_CONSTANT_BUFFER; + constant_buffer_desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; + m_dx11Device->CreateBuffer(&constant_buffer_desc, NULL, &constBuffer); + if( FAILED( hr ) ) + { + KernelDesc descriptor; + descriptor.kernel = 0; + descriptor.constBuffer = 0; + return descriptor; + } + } + + SAFE_RELEASE( pErrorBlob ); + SAFE_RELEASE( pBlob ); + + btDX11SoftBodySolver::KernelDesc descriptor; + descriptor.kernel = kernelPointer; + descriptor.constBuffer = constBuffer; + return descriptor; +} // compileComputeShader + + +bool btDX11SoftBodySolver::buildShaders() +{ + bool returnVal = true; + + if( m_shadersInitialized ) + return true; + + prepareLinksKernel = compileComputeShaderFromString( PrepareLinksHLSLString, "PrepareLinksKernel", sizeof(PrepareLinksCB) ); + if( !prepareLinksKernel.constBuffer ) + returnVal = false; + updatePositionsFromVelocitiesKernel = compileComputeShaderFromString( UpdatePositionsFromVelocitiesHLSLString, "UpdatePositionsFromVelocitiesKernel", sizeof(UpdatePositionsFromVelocitiesCB) ); + if( !updatePositionsFromVelocitiesKernel.constBuffer ) + returnVal = false; + solvePositionsFromLinksKernel = compileComputeShaderFromString( SolvePositionsHLSLString, "SolvePositionsFromLinksKernel", sizeof(SolvePositionsFromLinksKernelCB) ); + if( !updatePositionsFromVelocitiesKernel.constBuffer ) + returnVal = false; + vSolveLinksKernel = compileComputeShaderFromString( VSolveLinksHLSLString, "VSolveLinksKernel", sizeof(VSolveLinksCB) ); + if( !vSolveLinksKernel.constBuffer ) + returnVal = false; + updateVelocitiesFromPositionsWithVelocitiesKernel = compileComputeShaderFromString( UpdateNodesHLSLString, "updateVelocitiesFromPositionsWithVelocitiesKernel", sizeof(UpdateVelocitiesFromPositionsWithVelocitiesCB) ); + if( !updateVelocitiesFromPositionsWithVelocitiesKernel.constBuffer ) + returnVal = false; + updateVelocitiesFromPositionsWithoutVelocitiesKernel = compileComputeShaderFromString( UpdatePositionsHLSLString, "updateVelocitiesFromPositionsWithoutVelocitiesKernel", sizeof(UpdateVelocitiesFromPositionsWithoutVelocitiesCB) ); + if( !updateVelocitiesFromPositionsWithoutVelocitiesKernel.constBuffer ) + returnVal = false; + integrateKernel = compileComputeShaderFromString( IntegrateHLSLString, "IntegrateKernel", sizeof(IntegrateCB) ); + if( !integrateKernel.constBuffer ) + returnVal = false; + applyForcesKernel = compileComputeShaderFromString( ApplyForcesHLSLString, "ApplyForcesKernel", sizeof(ApplyForcesCB) ); + if( !applyForcesKernel.constBuffer ) + returnVal = false; + + // TODO: Rename to UpdateSoftBodies + resetNormalsAndAreasKernel = compileComputeShaderFromString( UpdateNormalsHLSLString, "ResetNormalsAndAreasKernel", sizeof(UpdateSoftBodiesCB) ); + if( !resetNormalsAndAreasKernel.constBuffer ) + returnVal = false; + normalizeNormalsAndAreasKernel = compileComputeShaderFromString( UpdateNormalsHLSLString, "NormalizeNormalsAndAreasKernel", sizeof(UpdateSoftBodiesCB) ); + if( !normalizeNormalsAndAreasKernel.constBuffer ) + returnVal = false; + updateSoftBodiesKernel = compileComputeShaderFromString( UpdateNormalsHLSLString, "UpdateSoftBodiesKernel", sizeof(UpdateSoftBodiesCB) ); + if( !updateSoftBodiesKernel.constBuffer ) + returnVal = false; + outputToVertexArrayWithNormalsKernel = compileComputeShaderFromString( OutputToVertexArrayHLSLString, "OutputToVertexArrayWithNormalsKernel", sizeof(OutputToVertexArrayCB) ); + if( !outputToVertexArrayWithNormalsKernel.constBuffer ) + returnVal = false; + outputToVertexArrayWithoutNormalsKernel = compileComputeShaderFromString( OutputToVertexArrayHLSLString, "OutputToVertexArrayWithoutNormalsKernel", sizeof(OutputToVertexArrayCB) ); + if( !outputToVertexArrayWithoutNormalsKernel.constBuffer ) + returnVal = false; + + + + if( returnVal ) + m_shadersInitialized = true; + + return returnVal; +} + + +void btDX11SoftBodySolver::predictMotion( float timeStep ) +{ + // Fill the force arrays with current acceleration data etc + m_perClothWindVelocity.resize( m_softBodySet.size() ); + for( int softBodyIndex = 0; softBodyIndex < m_softBodySet.size(); ++softBodyIndex ) + { + btSoftBody *softBody = m_softBodySet[softBodyIndex]->getSoftBody(); + + m_perClothWindVelocity[softBodyIndex] = toVector3(softBody->getWindVelocity()); + } + m_dx11PerClothWindVelocity.changedOnCPU(); + + // Apply forces that we know about to the cloths + applyForces( timeStep * getTimeScale() ); + + // Itegrate motion for all soft bodies dealt with by the solver + integrate( timeStep * getTimeScale() ); + // End prediction work for solvers +} + diff --git a/src/BulletMultiThreaded/GpuSoftBodySolvers/DX11/btSoftBodySolver_DX11.h b/src/BulletMultiThreaded/GpuSoftBodySolvers/DX11/btSoftBodySolver_DX11.h new file mode 100644 index 000000000..9bdae8b5c --- /dev/null +++ b/src/BulletMultiThreaded/GpuSoftBodySolvers/DX11/btSoftBodySolver_DX11.h @@ -0,0 +1,480 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + + +#include "vectormath_aos.h" + +#include "BulletSoftBody/btSoftBodySolvers.h" +#include "btSoftBodySolverVertexBuffer_DX11.h" +#include "btSoftBodySolverLinkData_DX11.h" +#include "btSoftBodySolverVertexData_DX11.h" +#include "btSoftBodySolverTriangleData_DX11.h" + + +#ifndef BT_ACCELERATED_SOFT_BODY_DX11_SOLVER_H +#define BT_ACCELERATED_SOFT_BODY_DX11_SOLVER_H + +class btDX11SoftBodySolver : public btSoftBodySolver +{ +public: + + /** + * SoftBody class to maintain information about a soft body instance + * within a solver. + * This data addresses the main solver arrays. + */ + class btAcceleratedSoftBodyInterface + { + protected: + /** Current number of vertices that are part of this cloth */ + int m_numVertices; + /** Maximum number of vertices allocated to be part of this cloth */ + int m_maxVertices; + /** Current number of triangles that are part of this cloth */ + int m_numTriangles; + /** Maximum number of triangles allocated to be part of this cloth */ + int m_maxTriangles; + /** Index of first vertex in the world allocated to this cloth */ + int m_firstVertex; + /** Index of first triangle in the world allocated to this cloth */ + int m_firstTriangle; + /** Index of first link in the world allocated to this cloth */ + int m_firstLink; + /** Maximum number of links allocated to this cloth */ + int m_maxLinks; + /** Current number of links allocated to this cloth */ + int m_numLinks; + + /** The actual soft body this data represents */ + btSoftBody *m_softBody; + + + public: + btAcceleratedSoftBodyInterface( btSoftBody *softBody ) : + m_softBody( softBody ) + { + m_numVertices = 0; + m_maxVertices = 0; + m_numTriangles = 0; + m_maxTriangles = 0; + m_firstVertex = 0; + m_firstTriangle = 0; + m_firstLink = 0; + m_maxLinks = 0; + m_numLinks = 0; + } + int getNumVertices() + { + return m_numVertices; + } + + int getNumTriangles() + { + return m_numTriangles; + } + + int getMaxVertices() + { + return m_maxVertices; + } + + int getMaxTriangles() + { + return m_maxTriangles; + } + + int getFirstVertex() + { + return m_firstVertex; + } + + int getFirstTriangle() + { + return m_firstTriangle; + } + + // TODO: All of these set functions will have to do checks and + // update the world because restructuring of the arrays will be necessary + // Reasonable use of "friend"? + void setNumVertices( int numVertices ) + { + m_numVertices = numVertices; + } + + void setNumTriangles( int numTriangles ) + { + m_numTriangles = numTriangles; + } + + void setMaxVertices( int maxVertices ) + { + m_maxVertices = maxVertices; + } + + void setMaxTriangles( int maxTriangles ) + { + m_maxTriangles = maxTriangles; + } + + void setFirstVertex( int firstVertex ) + { + m_firstVertex = firstVertex; + } + + void setFirstTriangle( int firstTriangle ) + { + m_firstTriangle = firstTriangle; + } + + void setMaxLinks( int maxLinks ) + { + m_maxLinks = maxLinks; + } + + void setNumLinks( int numLinks ) + { + m_numLinks = numLinks; + } + + void setFirstLink( int firstLink ) + { + m_firstLink = firstLink; + } + + int getMaxLinks() + { + return m_maxLinks; + } + + int getNumLinks() + { + return m_numLinks; + } + + int getFirstLink() + { + return m_firstLink; + } + + btSoftBody* getSoftBody() + { + return m_softBody; + } + + #if 0 + void setAcceleration( Vectormath::Aos::Vector3 acceleration ) + { + m_currentSolver->setPerClothAcceleration( m_clothIdentifier, acceleration ); + } + + void setWindVelocity( Vectormath::Aos::Vector3 windVelocity ) + { + m_currentSolver->setPerClothWindVelocity( m_clothIdentifier, windVelocity ); + } + + /** + * Set the density of the air in which the cloth is situated. + */ + void setAirDensity( btScalar density ) + { + m_currentSolver->setPerClothMediumDensity( m_clothIdentifier, static_cast(density) ); + } + + /** + * Add a collision object to this soft body. + */ + void addCollisionObject( btCollisionObject *collisionObject ) + { + m_currentSolver->addCollisionObjectForSoftBody( m_clothIdentifier, collisionObject ); + } + #endif + }; + + + class KernelDesc + { + protected: + + + public: + ID3D11ComputeShader* kernel; + ID3D11Buffer* constBuffer; + + KernelDesc() + { + kernel = 0; + constBuffer = 0; + } + + virtual ~KernelDesc() + { + // TODO: this should probably destroy its kernel but we need to be careful + // in case KernelDescs are copied + } + }; + + + struct PrepareLinksCB + { + int numLinks; + int padding0; + int padding1; + int padding2; + }; + + struct SolvePositionsFromLinksKernelCB + { + int startLink; + int numLinks; + float kst; + float ti; + }; + + struct IntegrateCB + { + int numNodes; + float solverdt; + int padding1; + int padding2; + }; + + struct UpdatePositionsFromVelocitiesCB + { + int numNodes; + float solverSDT; + int padding1; + int padding2; + }; + + struct UpdateVelocitiesFromPositionsWithoutVelocitiesCB + { + int numNodes; + float isolverdt; + int padding1; + int padding2; + }; + + struct UpdateVelocitiesFromPositionsWithVelocitiesCB + { + int numNodes; + float isolverdt; + int padding1; + int padding2; + }; + + struct UpdateSoftBodiesCB + { + int numNodes; + int startFace; + int numFaces; + float epsilon; + }; + + + struct OutputToVertexArrayCB + { + int startNode; + int numNodes; + int positionOffset; + int positionStride; + + int normalOffset; + int normalStride; + int padding1; + int padding2; + }; + + + struct ApplyForcesCB + { + unsigned int numNodes; + float solverdt; + float epsilon; + int padding3; + }; + + struct AddVelocityCB + { + int startNode; + int lastNode; + float velocityX; + float velocityY; + float velocityZ; + int padding1; + int padding2; + int padding3; + }; + + struct VSolveLinksCB + { + int startLink; + int numLinks; + float kst; + int padding; + }; + + +private: + ID3D11Device * m_dx11Device; + ID3D11DeviceContext* m_dx11Context; + + + /** Link data for all cloths. Note that this will be sorted batch-wise for efficient computation and m_linkAddresses will maintain the addressing. */ + btSoftBodyLinkDataDX11 m_linkData; + btSoftBodyVertexDataDX11 m_vertexData; + btSoftBodyTriangleDataDX11 m_triangleData; + + /** Variable to define whether we need to update solver constants on the next iteration */ + bool m_updateSolverConstants; + + bool m_shadersInitialized; + + /** + * Cloths owned by this solver. + * Only our cloths are in this array. + */ + btAlignedObjectArray< btAcceleratedSoftBodyInterface * > m_softBodySet; + + /** Acceleration value to be applied to all non-static vertices in the solver. + * Index n is cloth n, array sized by number of cloths in the world not the solver. + */ + btAlignedObjectArray< Vectormath::Aos::Vector3 > m_perClothAcceleration; + btDX11Buffer m_dx11PerClothAcceleration; + + /** Wind velocity to be applied normal to all non-static vertices in the solver. + * Index n is cloth n, array sized by number of cloths in the world not the solver. + */ + btAlignedObjectArray< Vectormath::Aos::Vector3 > m_perClothWindVelocity; + btDX11Buffer m_dx11PerClothWindVelocity; + + /** Velocity damping factor */ + btAlignedObjectArray< float > m_perClothDampingFactor; + btDX11Buffer m_dx11PerClothDampingFactor; + + /** Velocity correction coefficient */ + btAlignedObjectArray< float > m_perClothVelocityCorrectionCoefficient; + btDX11Buffer m_dx11PerClothVelocityCorrectionCoefficient; + + /** Lift parameter for wind effect on cloth. */ + btAlignedObjectArray< float > m_perClothLiftFactor; + btDX11Buffer m_dx11PerClothLiftFactor; + + /** Drag parameter for wind effect on cloth. */ + btAlignedObjectArray< float > m_perClothDragFactor; + btDX11Buffer m_dx11PerClothDragFactor; + + /** Density of the medium in which each cloth sits */ + btAlignedObjectArray< float > m_perClothMediumDensity; + btDX11Buffer m_dx11PerClothMediumDensity; + + KernelDesc prepareLinksKernel; + KernelDesc solvePositionsFromLinksKernel; + KernelDesc vSolveLinksKernel; + KernelDesc integrateKernel; + KernelDesc addVelocityKernel; + KernelDesc updatePositionsFromVelocitiesKernel; + KernelDesc updateVelocitiesFromPositionsWithoutVelocitiesKernel; + KernelDesc updateVelocitiesFromPositionsWithVelocitiesKernel; + KernelDesc resetNormalsAndAreasKernel; + KernelDesc normalizeNormalsAndAreasKernel; + KernelDesc updateSoftBodiesKernel; + KernelDesc outputToVertexArrayWithNormalsKernel; + KernelDesc outputToVertexArrayWithoutNormalsKernel; + + KernelDesc outputToVertexArrayKernel; + KernelDesc applyForcesKernel; + KernelDesc collideSphereKernel; + KernelDesc collideCylinderKernel; + + + /** + * Integrate motion on the solver. + */ + virtual void integrate( float solverdt ); + float computeTriangleArea( + const Vectormath::Aos::Point3 &vertex0, + const Vectormath::Aos::Point3 &vertex1, + const Vectormath::Aos::Point3 &vertex2 ); + + + /** + * Compile a compute shader kernel from a string and return the appropriate KernelDesc object. + */ + KernelDesc compileComputeShaderFromString( const char* shaderString, const char* shaderName, int constBufferSize ); + + bool buildShaders(); + + void resetNormalsAndAreas( int numVertices ); + + void normalizeNormalsAndAreas( int numVertices ); + + void executeUpdateSoftBodies( int firstTriangle, int numTriangles ); + + Vectormath::Aos::Vector3 ProjectOnAxis( const Vectormath::Aos::Vector3 &v, const Vectormath::Aos::Vector3 &a ); + + void ApplyClampedForce( float solverdt, const Vectormath::Aos::Vector3 &force, const Vectormath::Aos::Vector3 &vertexVelocity, float inverseMass, Vectormath::Aos::Vector3 &vertexForce ); + + virtual void applyForces( float solverdt ); + + void updateConstants( float timeStep ); + + btAcceleratedSoftBodyInterface *findSoftBodyInterface( const btSoftBody* const softBody ); + + ////////////////////////////////////// + // Kernel dispatches + void prepareLinks(); + + void updatePositionsFromVelocities( float solverdt ); + void solveLinksForPosition( int startLink, int numLinks, float kst, float ti ); + void solveLinksForVelocity( int startLink, int numLinks, float kst ); + + void updateVelocitiesFromPositionsWithVelocities( float isolverdt ); + void updateVelocitiesFromPositionsWithoutVelocities( float isolverdt ); + + // End kernel dispatches + ///////////////////////////////////// + +public: + btDX11SoftBodySolver(ID3D11Device * dx11Device, ID3D11DeviceContext* dx11Context); + + virtual ~btDX11SoftBodySolver(); + + + virtual btSoftBodyLinkData &getLinkData(); + + virtual btSoftBodyVertexData &getVertexData(); + + virtual btSoftBodyTriangleData &getTriangleData(); + + + + + virtual bool checkInitialized(); + + virtual void updateSoftBodies( ); + + virtual void optimize( btAlignedObjectArray< btSoftBody * > &softBodies ); + + virtual void solveConstraints( float solverdt ); + + virtual void predictMotion( float solverdt ); + + virtual void copySoftBodyToVertexBuffer( const btSoftBody *const softBody, btVertexBufferDescriptor *vertexBuffer ); + +}; + +#endif // #ifndef BT_ACCELERATED_SOFT_BODY_DX11_SOLVER_H + + diff --git a/src/BulletMultiThreaded/GpuSoftBodySolvers/OpenCL/CMakeLists.txt b/src/BulletMultiThreaded/GpuSoftBodySolvers/OpenCL/CMakeLists.txt new file mode 100644 index 000000000..0c63b945a --- /dev/null +++ b/src/BulletMultiThreaded/GpuSoftBodySolvers/OpenCL/CMakeLists.txt @@ -0,0 +1,71 @@ + +INCLUDE_DIRECTORIES( +${BULLET_PHYSICS_SOURCE_DIR}/src +) + + +SET(OPENCL_DIR $ENV{ATISTREAMSDKROOT}) +SET(OPENCL_INCLUDE_PATH "${ATISTREAMSDKROOT}/include" CACHE DOCSTRING "OpenCL SDK include path") + +INCLUDE_DIRECTORIES(${OPENCL_INCLUDE_PATH} "../cpu/") + +SET(BulletSoftBodyOpenCLSolvers_SRCS + btSoftBodySolver_OpenCL.cpp +) + +SET(BulletSoftBodyOpenCLSolvers_HDRS + btSoftBodySolver_OpenCL.h + ../cpu/btSoftBodySolverData.h + btSoftBodySolverVertexData_OpenCL.h + btSoftBodySolverTriangleData_OpenCL.h + btSoftBodySolverLinkData_OpenCL.h + btSoftBodySolverBuffer_OpenCL.h +) + +# OpenCL and HLSL Shaders. +# Build rules generated to stringify these into headers +# which are needed by some of the sources +SET(BulletSoftBodyOpenCLSolvers_Shaders +# OutputToVertexArray + UpdateNormals + Integrate + UpdatePositions + UpdateNodes + SolvePositions + UpdatePositionsFromVelocities + ApplyForces + PrepareLinks + VSolveLinks +) + +foreach(f ${BulletSoftBodyOpenCLSolvers_Shaders}) + LIST(APPEND BulletSoftBodyOpenCLSolvers_OpenCLC "OpenCLC/${f}.cl") +endforeach(f) + + + +ADD_LIBRARY(BulletSoftBodySolvers_OpenCL ${BulletSoftBodyOpenCLSolvers_SRCS} ${BulletSoftBodyOpenCLSolvers_HDRS} ${BulletSoftBodyOpenCLSolvers_OpenCLC}) +SET_TARGET_PROPERTIES(BulletSoftBodySolvers_OpenCL PROPERTIES VERSION ${BULLET_VERSION}) +SET_TARGET_PROPERTIES(BulletSoftBodySolvers_OpenCL PROPERTIES SOVERSION ${BULLET_VERSION}) +IF (BUILD_SHARED_LIBS) + TARGET_LINK_LIBRARIES(BulletSoftBody BulletDynamics) +ENDIF (BUILD_SHARED_LIBS) + + +IF (INSTALL_LIBS) + IF (NOT INTERNAL_CREATE_DISTRIBUTABLE_MSVC_PROJECTFILES) + IF (${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION} GREATER 2.5) + IF (APPLE AND BUILD_SHARED_LIBS AND FRAMEWORK) + INSTALL(TARGETS BulletSoftBodySolvers_OpenCL DESTINATION .) + ELSE (APPLE AND BUILD_SHARED_LIBS AND FRAMEWORK) + INSTALL(TARGETS BulletSoftBodySolvers_OpenCL DESTINATION lib${LIB_SUFFIX}) + INSTALL(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} DESTINATION include FILES_MATCHING PATTERN "*.h") + ENDIF (APPLE AND BUILD_SHARED_LIBS AND FRAMEWORK) + ENDIF (${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION} GREATER 2.5) + + IF (APPLE AND BUILD_SHARED_LIBS AND FRAMEWORK) + SET_TARGET_PROPERTIES(BulletSoftBodySolvers_OpenCL PROPERTIES FRAMEWORK true) + SET_TARGET_PROPERTIES(BulletSoftBodySolvers_OpenCL PROPERTIES PUBLIC_HEADER "${BulletSoftBodyOpenCLSolvers_HDRS}") + ENDIF (APPLE AND BUILD_SHARED_LIBS AND FRAMEWORK) + ENDIF (NOT INTERNAL_CREATE_DISTRIBUTABLE_MSVC_PROJECTFILES) +ENDIF (INSTALL_LIBS) diff --git a/src/BulletMultiThreaded/GpuSoftBodySolvers/OpenCL/OpenCLC/ApplyForces.cl b/src/BulletMultiThreaded/GpuSoftBodySolvers/OpenCL/OpenCLC/ApplyForces.cl new file mode 100644 index 000000000..7204a80c6 --- /dev/null +++ b/src/BulletMultiThreaded/GpuSoftBodySolvers/OpenCL/OpenCLC/ApplyForces.cl @@ -0,0 +1,91 @@ +MSTRINGIFY( + +/*#define float3 float4 +float dot3(float3 a, float3 b) +{ + return a.x*b.x + a.y*b.y + a.z*b.z; +}*/ + +float3 projectOnAxis( float3 v, float3 a ) +{ + return (a*dot(v, a)); +} + +__kernel void +ApplyForcesKernel( + const uint numNodes, + const float solverdt, + const float epsilon, + __global int * g_vertexClothIdentifier, + __global float4 * g_vertexNormal, + __global float * g_vertexArea, + __global float * g_vertexInverseMass, + __global float * g_clothLiftFactor, + __global float * g_clothDragFactor, + __global float4 * g_clothWindVelocity, + __global float4 * g_clothAcceleration, + __global float * g_clothMediumDensity, + __global float4 * g_vertexForceAccumulator, + __global float4 * g_vertexVelocity) +{ + unsigned int nodeID = get_global_id(0); + if( nodeID < numNodes ) + { + int clothId = g_vertexClothIdentifier[nodeID]; + float nodeIM = g_vertexInverseMass[nodeID]; + + if( nodeIM > 0.0f ) + { + float3 nodeV = g_vertexVelocity[nodeID].xyz; + float3 normal = g_vertexNormal[nodeID].xyz; + float area = g_vertexArea[nodeID]; + float3 nodeF = g_vertexForceAccumulator[nodeID].xyz; + + // Read per-cloth values + float3 clothAcceleration = g_clothAcceleration[clothId].xyz; + float3 clothWindVelocity = g_clothWindVelocity[clothId].xyz; + float liftFactor = g_clothLiftFactor[clothId]; + float dragFactor = g_clothDragFactor[clothId]; + float mediumDensity = g_clothMediumDensity[clothId]; + + // Apply the acceleration to the cloth rather than do this via a force + nodeV += (clothAcceleration*solverdt); + + g_vertexVelocity[nodeID] = (float4)(nodeV, 0.f); + + float3 relativeWindVelocity = nodeV - clothWindVelocity; + float relativeSpeedSquared = dot(relativeWindVelocity, relativeWindVelocity); + + if( relativeSpeedSquared > epsilon ) + { + // Correct direction of normal relative to wind direction and get dot product + normal = normal * (dot(normal, relativeWindVelocity) < 0 ? -1.f : 1.f); + float dvNormal = dot(normal, relativeWindVelocity); + if( dvNormal > 0 ) + { + float3 force = (float3)(0.f, 0.f, 0.f); + float c0 = area * dvNormal * relativeSpeedSquared / 2.f; + float c1 = c0 * mediumDensity; + force += normal * (-c1 * liftFactor); + force += normalize(relativeWindVelocity)*(-c1 * dragFactor); + + float dtim = solverdt * nodeIM; + float3 forceDTIM = force * dtim; + + float3 nodeFPlusForce = nodeF + force; + + // m_nodesf[i] -= ProjectOnAxis(m_nodesv[i], force.normalized())/dtim; + float3 nodeFMinus = nodeF - (projectOnAxis(nodeV, normalize(force))/dtim); + + nodeF = nodeFPlusForce; + if( dot(forceDTIM, forceDTIM) > dot(nodeV, nodeV) ) + nodeF = nodeFMinus; + + g_vertexForceAccumulator[nodeID] = (float4)(nodeF, 0.0f); + } + } + } + } +} + +); \ No newline at end of file diff --git a/src/BulletMultiThreaded/GpuSoftBodySolvers/OpenCL/OpenCLC/Integrate.cl b/src/BulletMultiThreaded/GpuSoftBodySolvers/OpenCL/OpenCLC/Integrate.cl new file mode 100644 index 000000000..4a2c9f2fc --- /dev/null +++ b/src/BulletMultiThreaded/GpuSoftBodySolvers/OpenCL/OpenCLC/Integrate.cl @@ -0,0 +1,35 @@ +MSTRINGIFY( + +// Node indices for each link + +//#define float3 float4 + +__kernel void +IntegrateKernel( + const int numNodes, + const float solverdt, + __global float * g_vertexInverseMasses, + __global float4 * g_vertexPositions, + __global float4 * g_vertexVelocity, + __global float4 * g_vertexPreviousPositions, + __global float4 * g_vertexForceAccumulator) +{ + int nodeID = get_global_id(0); + if( nodeID < numNodes ) + { + float3 position = g_vertexPositions[nodeID].xyz; + float3 velocity = g_vertexVelocity[nodeID].xyz; + float3 force = g_vertexForceAccumulator[nodeID].xyz; + float inverseMass = g_vertexInverseMasses[nodeID]; + + g_vertexPreviousPositions[nodeID] = (float4)(position, 0.f); + velocity += force * inverseMass * solverdt; + position += velocity * solverdt; + + g_vertexForceAccumulator[nodeID] = (float4)(0.f, 0.f, 0.f, 0.0f); + g_vertexPositions[nodeID] = (float4)(position, 0.f); + g_vertexVelocity[nodeID] = (float4)(velocity, 0.f); + } +} + +); \ No newline at end of file diff --git a/src/BulletMultiThreaded/GpuSoftBodySolvers/OpenCL/OpenCLC/PrepareLinks.cl b/src/BulletMultiThreaded/GpuSoftBodySolvers/OpenCL/OpenCLC/PrepareLinks.cl new file mode 100644 index 000000000..f37a2f359 --- /dev/null +++ b/src/BulletMultiThreaded/GpuSoftBodySolvers/OpenCL/OpenCLC/PrepareLinks.cl @@ -0,0 +1,34 @@ +MSTRINGIFY( + +__kernel void +PrepareLinksKernel( + const int numLinks, + __global int2 * g_linksVertexIndices, + __global float * g_linksMassLSC, + __global float4 * g_nodesPreviousPosition, + __global float * g_linksLengthRatio, + __global float4 * g_linksCurrentLength) +{ + int linkID = get_global_id(0); + if( linkID < numLinks ) + { + int2 nodeIndices = g_linksVertexIndices[linkID]; + int node0 = nodeIndices.x; + int node1 = nodeIndices.y; + + float4 nodePreviousPosition0 = g_nodesPreviousPosition[node0]; + float4 nodePreviousPosition1 = g_nodesPreviousPosition[node1]; + + float massLSC = g_linksMassLSC[linkID]; + + float4 linkCurrentLength = nodePreviousPosition1 - nodePreviousPosition0; + + float linkLengthRatio = dot(linkCurrentLength, linkCurrentLength)*massLSC; + linkLengthRatio = 1.0f/linkLengthRatio; + + g_linksCurrentLength[linkID] = linkCurrentLength; + g_linksLengthRatio[linkID] = linkLengthRatio; + } +} + +); \ No newline at end of file diff --git a/src/BulletMultiThreaded/GpuSoftBodySolvers/OpenCL/OpenCLC/SolvePositions.cl b/src/BulletMultiThreaded/GpuSoftBodySolvers/OpenCL/OpenCLC/SolvePositions.cl new file mode 100644 index 000000000..4a08a56c3 --- /dev/null +++ b/src/BulletMultiThreaded/GpuSoftBodySolvers/OpenCL/OpenCLC/SolvePositions.cl @@ -0,0 +1,55 @@ + +MSTRINGIFY( + +/*#define float3 float4 + +float dot3(float3 a, float3 b) +{ + return a.x*b.x + a.y*b.y + a.z*b.z; +}*/ + +__kernel void +SolvePositionsFromLinksKernel( + const int startLink, + const int numLinks, + const float kst, + const float ti, + __global int2 * g_linksVertexIndices, + __global float * g_linksMassLSC, + __global float * g_linksRestLengthSquared, + __global float * g_verticesInverseMass, + __global float4 * g_vertexPositions) + +{ + int linkID = get_global_id(0) + startLink; + if( get_global_id(0) < numLinks ) + { + float massLSC = g_linksMassLSC[linkID]; + float restLengthSquared = g_linksRestLengthSquared[linkID]; + + if( massLSC > 0.0f ) + { + int2 nodeIndices = g_linksVertexIndices[linkID]; + int node0 = nodeIndices.x; + int node1 = nodeIndices.y; + + float3 position0 = g_vertexPositions[node0].xyz; + float3 position1 = g_vertexPositions[node1].xyz; + + float inverseMass0 = g_verticesInverseMass[node0]; + float inverseMass1 = g_verticesInverseMass[node1]; + + float3 del = position1 - position0; + float len = dot(del, del); + float k = ((restLengthSquared - len)/(massLSC*(restLengthSquared+len)))*kst; + position0 = position0 - del*(k*inverseMass0); + position1 = position1 + del*(k*inverseMass1); + + g_vertexPositions[node0] = (float4)(position0, 0.f); + g_vertexPositions[node1] = (float4)(position1, 0.f); + + } + } +} + +); \ No newline at end of file diff --git a/src/BulletMultiThreaded/GpuSoftBodySolvers/OpenCL/OpenCLC/UpdateConstants.cl b/src/BulletMultiThreaded/GpuSoftBodySolvers/OpenCL/OpenCLC/UpdateConstants.cl new file mode 100644 index 000000000..488a58479 --- /dev/null +++ b/src/BulletMultiThreaded/GpuSoftBodySolvers/OpenCL/OpenCLC/UpdateConstants.cl @@ -0,0 +1,44 @@ +MSTRINGIFY( + +/*#define float3 float4 + +float dot3(float3 a, float3 b) +{ + return a.x*b.x + a.y*b.y + a.z*b.z; +}*/ + +__kernel void +UpdateConstantsKernel( + const int numLinks, + __global int2 * g_linksVertexIndices, + __global float4 * g_vertexPositions, + __global float * g_vertexInverseMasses, + __global float * g_linksMaterialLSC, + __global float * g_linksMassLSC, + __global float * g_linksRestLengthSquared, + __global float * g_linksRestLengths) +{ + int linkID = get_global_id(0); + if( linkID < numLinks ) + { + int2 nodeIndices = g_linksVertexIndices[linkID]; + int node0 = nodeIndices.x; + int node1 = nodeIndices.y; + float linearStiffnessCoefficient = g_linksMaterialLSC[ linkID ]; + + float3 position0 = g_vertexPositions[node0].xyz; + float3 position1 = g_vertexPositions[node1].xyz; + float inverseMass0 = g_vertexInverseMasses[node0]; + float inverseMass1 = g_vertexInverseMasses[node1]; + + float3 difference = position0 - position1; + float length2 = dot(difference, difference); + float length = sqrt(length2); + + g_linksRestLengths[linkID] = length; + g_linksMassLSC[linkID] = (inverseMass0 + inverseMass1)/linearStiffnessCoefficient; + g_linksRestLengthSquared[linkID] = length*length; + } +} + +); \ No newline at end of file diff --git a/src/BulletMultiThreaded/GpuSoftBodySolvers/OpenCL/OpenCLC/UpdateNodes.cl b/src/BulletMultiThreaded/GpuSoftBodySolvers/OpenCL/OpenCLC/UpdateNodes.cl new file mode 100644 index 000000000..cad4b8ad7 --- /dev/null +++ b/src/BulletMultiThreaded/GpuSoftBodySolvers/OpenCL/OpenCLC/UpdateNodes.cl @@ -0,0 +1,40 @@ +MSTRINGIFY( + +//#define float3 float4 + +__kernel void +updateVelocitiesFromPositionsWithVelocitiesKernel( + int numNodes, + float isolverdt, + __global float4 * g_vertexPositions, + __global float4 * g_vertexPreviousPositions, + __global int * g_vertexClothIndices, + __global float *g_clothVelocityCorrectionCoefficients, + __global float * g_clothDampingFactor, + __global float4 * g_vertexVelocities, + __global float4 * g_vertexForces) +{ + int nodeID = get_global_id(0); + if( nodeID < numNodes ) + { + float3 position = g_vertexPositions[nodeID].xyz; + float3 previousPosition = g_vertexPreviousPositions[nodeID].xyz; + float3 velocity = g_vertexVelocities[nodeID].xyz; + int clothIndex = g_vertexClothIndices[nodeID]; + float velocityCorrectionCoefficient = g_clothVelocityCorrectionCoefficients[clothIndex]; + float dampingFactor = g_clothDampingFactor[clothIndex]; + float velocityCoefficient = (1.f - dampingFactor); + + float3 difference = position - previousPosition; + + velocity += difference*velocityCorrectionCoefficient*isolverdt; + + // Damp the velocity + velocity *= velocityCoefficient; + + g_vertexVelocities[nodeID] = (float4)(velocity, 0.f); + g_vertexForces[nodeID] = (float4)(0.f, 0.f, 0.f, 0.f); + } +} + +); \ No newline at end of file diff --git a/src/BulletMultiThreaded/GpuSoftBodySolvers/OpenCL/OpenCLC/UpdateNormals.cl b/src/BulletMultiThreaded/GpuSoftBodySolvers/OpenCL/OpenCLC/UpdateNormals.cl new file mode 100644 index 000000000..37c8b3fad --- /dev/null +++ b/src/BulletMultiThreaded/GpuSoftBodySolvers/OpenCL/OpenCLC/UpdateNormals.cl @@ -0,0 +1,103 @@ +MSTRINGIFY( + +//#define float3 float4 + +/*float length3(float3 a) +{ + a.w = 0; + return length(a); +} + +float normalize3(float3 a) +{ + a.w = 0; + return normalize(a); +}*/ + +__kernel void +ResetNormalsAndAreasKernel( + const unsigned int numNodes, + __global float4 * g_vertexNormals, + __global float * g_vertexArea) +{ + if( get_global_id(0) < numNodes ) + { + g_vertexNormals[get_global_id(0)] = (float4)(0.0f, 0.0f, 0.0f, 0.0f); + g_vertexArea[get_global_id(0)] = 0.0f; + } +} + +__kernel void +UpdateSoftBodiesKernel( + const unsigned int startFace, + const unsigned int numFaces, + __global int4 * g_triangleVertexIndexSet, + __global float4 * g_vertexPositions, + __global float4 * g_vertexNormals, + __global float * g_vertexArea, + __global float4 * g_triangleNormals, + __global float * g_triangleArea) +{ + int faceID = get_global_id(0) + startFace; + if( get_global_id(0) < numFaces ) + { + int4 triangleIndexSet = g_triangleVertexIndexSet[ faceID ]; + int nodeIndex0 = triangleIndexSet.x; + int nodeIndex1 = triangleIndexSet.y; + int nodeIndex2 = triangleIndexSet.z; + + float3 node0 = g_vertexPositions[nodeIndex0].xyz; + float3 node1 = g_vertexPositions[nodeIndex1].xyz; + float3 node2 = g_vertexPositions[nodeIndex2].xyz; + float3 nodeNormal0 = g_vertexNormals[nodeIndex0].xyz; + float3 nodeNormal1 = g_vertexNormals[nodeIndex1].xyz; + float3 nodeNormal2 = g_vertexNormals[nodeIndex2].xyz; + float vertexArea0 = g_vertexArea[nodeIndex0]; + float vertexArea1 = g_vertexArea[nodeIndex1]; + float vertexArea2 = g_vertexArea[nodeIndex2]; + + float3 vector0 = node1 - node0; + float3 vector1 = node2 - node0; + + float3 faceNormal = cross(vector0.xyz, vector1.xyz); + float triangleArea = length(faceNormal); + + nodeNormal0 = nodeNormal0 + faceNormal; + nodeNormal1 = nodeNormal1 + faceNormal; + nodeNormal2 = nodeNormal2 + faceNormal; + vertexArea0 = vertexArea0 + triangleArea; + vertexArea1 = vertexArea1 + triangleArea; + vertexArea2 = vertexArea2 + triangleArea; + + g_triangleNormals[faceID] = (float4)(normalize(faceNormal), 0.f); + g_vertexNormals[nodeIndex0] = (float4)(nodeNormal0, 0.f); + g_vertexNormals[nodeIndex1] = (float4)(nodeNormal1, 0.f); + g_vertexNormals[nodeIndex2] = (float4)(nodeNormal2, 0.f); + g_triangleArea[faceID] = triangleArea; + g_vertexArea[nodeIndex0] = vertexArea0; + g_vertexArea[nodeIndex1] = vertexArea1; + g_vertexArea[nodeIndex2] = vertexArea2; + } +} + +__kernel void +NormalizeNormalsAndAreasKernel( + const unsigned int numNodes, + __global int * g_vertexTriangleCount, + __global float4 * g_vertexNormals, + __global float * g_vertexArea) +{ + if( get_global_id(0) < numNodes ) + { + float4 normal = g_vertexNormals[get_global_id(0)]; + float area = g_vertexArea[get_global_id(0)]; + int numTriangles = g_vertexTriangleCount[get_global_id(0)]; + + float vectorLength = length(normal); + + g_vertexNormals[get_global_id(0)] = normalize(normal); + g_vertexArea[get_global_id(0)] = area/(float)(numTriangles); + } +} + +); \ No newline at end of file diff --git a/src/BulletMultiThreaded/GpuSoftBodySolvers/OpenCL/OpenCLC/UpdatePositions.cl b/src/BulletMultiThreaded/GpuSoftBodySolvers/OpenCL/OpenCLC/UpdatePositions.cl new file mode 100644 index 000000000..ae7599a81 --- /dev/null +++ b/src/BulletMultiThreaded/GpuSoftBodySolvers/OpenCL/OpenCLC/UpdatePositions.cl @@ -0,0 +1,36 @@ +MSTRINGIFY( + +//#define float3 float4 + +__kernel void +updateVelocitiesFromPositionsWithoutVelocitiesKernel( + const int numNodes, + const float isolverdt, + __global float4 * g_vertexPositions, + __global float4 * g_vertexPreviousPositions, + __global int * g_vertexClothIndices, + __global float * g_clothDampingFactor, + __global float4 * g_vertexVelocities, + __global float4 * g_vertexForces) + +{ + int nodeID = get_global_id(0); + if( nodeID < numNodes ) + { + float3 position = g_vertexPositions[nodeID].xyz; + float3 previousPosition = g_vertexPreviousPositions[nodeID].xyz; + float3 velocity = g_vertexVelocities[nodeID].xyz; + int clothIndex = g_vertexClothIndices[nodeID]; + float dampingFactor = g_clothDampingFactor[clothIndex]; + float velocityCoefficient = (1.f - dampingFactor); + + float3 difference = position - previousPosition; + + velocity = difference*velocityCoefficient*isolverdt; + + g_vertexVelocities[nodeID] = (float4)(velocity, 0.f); + g_vertexForces[nodeID] = (float4)(0.f, 0.f, 0.f, 0.f); + } +} + +); \ No newline at end of file diff --git a/src/BulletMultiThreaded/GpuSoftBodySolvers/OpenCL/OpenCLC/UpdatePositionsFromVelocities.cl b/src/BulletMultiThreaded/GpuSoftBodySolvers/OpenCL/OpenCLC/UpdatePositionsFromVelocities.cl new file mode 100644 index 000000000..a3c945186 --- /dev/null +++ b/src/BulletMultiThreaded/GpuSoftBodySolvers/OpenCL/OpenCLC/UpdatePositionsFromVelocities.cl @@ -0,0 +1,26 @@ +MSTRINGIFY( + +//#define float3 float4 + +__kernel void +UpdatePositionsFromVelocitiesKernel( + const int numNodes, + const float solverSDT, + __global float4 * g_vertexVelocities, + __global float4 * g_vertexPreviousPositions, + __global float4 * g_vertexCurrentPosition) +{ + int vertexID = get_global_id(0); + if( vertexID < numNodes ) + { + float3 previousPosition = g_vertexPreviousPositions[vertexID].xyz; + float3 velocity = g_vertexVelocities[vertexID].xyz; + + float3 newPosition = previousPosition + velocity*solverSDT; + + g_vertexCurrentPosition[vertexID] = (float4)(newPosition, 0.f); + g_vertexPreviousPositions[vertexID] = (float4)(newPosition, 0.f); + } +} + +); \ No newline at end of file diff --git a/src/BulletMultiThreaded/GpuSoftBodySolvers/OpenCL/OpenCLC/VSolveLinks.cl b/src/BulletMultiThreaded/GpuSoftBodySolvers/OpenCL/OpenCLC/VSolveLinks.cl new file mode 100644 index 000000000..b7345e379 --- /dev/null +++ b/src/BulletMultiThreaded/GpuSoftBodySolvers/OpenCL/OpenCLC/VSolveLinks.cl @@ -0,0 +1,45 @@ +MSTRINGIFY( + +__kernel void +VSolveLinksKernel( + int startLink, + int numLinks, + float kst, + __global int2 * g_linksVertexIndices, + __global float * g_linksLengthRatio, + __global float4 * g_linksCurrentLength, + __global float * g_vertexInverseMass, + __global float4 * g_vertexVelocity) +{ + int linkID = get_global_id(0) + startLink; + if( get_global_id(0) < numLinks ) + { + int2 nodeIndices = g_linksVertexIndices[linkID]; + int node0 = nodeIndices.x; + int node1 = nodeIndices.y; + + float linkLengthRatio = g_linksLengthRatio[linkID]; + float3 linkCurrentLength = g_linksCurrentLength[linkID].xyz; + + float3 vertexVelocity0 = g_vertexVelocity[node0].xyz; + float3 vertexVelocity1 = g_vertexVelocity[node1].xyz; + + float vertexInverseMass0 = g_vertexInverseMass[node0]; + float vertexInverseMass1 = g_vertexInverseMass[node1]; + + float3 nodeDifference = vertexVelocity0 - vertexVelocity1; + float dotResult = dot(linkCurrentLength, nodeDifference); + float j = -dotResult*linkLengthRatio*kst; + + float3 velocityChange0 = linkCurrentLength*(j*vertexInverseMass0); + float3 velocityChange1 = linkCurrentLength*(j*vertexInverseMass1); + + vertexVelocity0 += velocityChange0; + vertexVelocity1 -= velocityChange1; + + g_vertexVelocity[node0] = (float4)(vertexVelocity0, 0.f); + g_vertexVelocity[node1] = (float4)(vertexVelocity1, 0.f); + } +} + +); \ No newline at end of file diff --git a/src/BulletMultiThreaded/GpuSoftBodySolvers/OpenCL/btSoftBodySolverBuffer_OpenCL.h b/src/BulletMultiThreaded/GpuSoftBodySolvers/OpenCL/btSoftBodySolverBuffer_OpenCL.h new file mode 100644 index 000000000..e71ae8778 --- /dev/null +++ b/src/BulletMultiThreaded/GpuSoftBodySolvers/OpenCL/btSoftBodySolverBuffer_OpenCL.h @@ -0,0 +1,183 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef BT_SOFT_BODY_SOLVER_BUFFER_OPENCL_H +#define BT_SOFT_BODY_SOLVER_BUFFER_OPENCL_H + +// OpenCL support +#include + +#ifndef SAFE_RELEASE +#define SAFE_RELEASE(p) { if(p) { (p)->Release(); (p)=NULL; } } +#endif + +template class btOpenCLBuffer +{ +protected: + cl::CommandQueue m_queue; + btAlignedObjectArray< ElementType > * m_CPUBuffer; + cl::Buffer m_buffer; + + int m_gpuSize; + bool m_onGPU; + + bool m_readOnlyOnGPU; + + bool m_allocated; + // TODO: Remove this once C++ bindings are fixed + cl::Context context; + + bool createBuffer( cl::Buffer *preexistingBuffer = 0) + { + cl_int err; + + + if( preexistingBuffer ) + { + m_buffer = *preexistingBuffer; + } + else { + m_buffer = cl::Buffer( + context, + m_readOnlyOnGPU ? CL_MEM_READ_ONLY : CL_MEM_READ_WRITE, + m_CPUBuffer->size() * sizeof(ElementType), + 0, + &err); + if( err != CL_SUCCESS ) + { + btAssert( "Buffer::Buffer(m_buffer)"); + } + } + + m_gpuSize = m_CPUBuffer->size(); + return true; + } + +public: + btOpenCLBuffer( + cl::CommandQueue queue, + btAlignedObjectArray< ElementType > *CPUBuffer, + bool readOnly) : + m_queue(queue), + m_CPUBuffer(CPUBuffer), + m_gpuSize(0), + m_onGPU(false), + m_readOnlyOnGPU(readOnly), + m_allocated(false) + { + context = m_queue.getInfo(); + } + + ~btOpenCLBuffer() + { + } + + cl::Buffer getBuffer() + { + return m_buffer; + } + + bool moveToGPU() + { + cl_int err; + + if( (m_CPUBuffer->size() != m_gpuSize) ) + { + m_onGPU = false; + } + + if( !m_onGPU && m_CPUBuffer->size() > 0 ) + { + if (!m_allocated || (m_CPUBuffer->size() != m_gpuSize)) { + if (!createBuffer()) { + return false; + } + m_allocated = true; + } + + err = m_queue.enqueueWriteBuffer( + m_buffer, + CL_FALSE, + 0, + m_CPUBuffer->size() * sizeof(ElementType), + &((*m_CPUBuffer)[0])); + if( err != CL_SUCCESS ) + { + btAssert( "CommandQueue::enqueueWriteBuffer(m_buffer)" ); + } + + m_onGPU = true; + } + + return true; + } + + bool moveFromGPU() + { + cl_int err; + + if (m_CPUBuffer->size() > 0) { + if (m_onGPU && !m_readOnlyOnGPU) { + err = m_queue.enqueueReadBuffer( + m_buffer, + CL_TRUE, + 0, + m_CPUBuffer->size() * sizeof(ElementType), + &((*m_CPUBuffer)[0])); + + if( err != CL_SUCCESS ) + { + btAssert( "CommandQueue::enqueueReadBuffer(m_buffer)" ); + } + + m_onGPU = false; + } + } + + return true; + } + + bool copyFromGPU() + { + cl_int err; + + if (m_CPUBuffer->size() > 0) { + if (m_onGPU && !m_readOnlyOnGPU) { + err = m_queue.enqueueReadBuffer( + m_buffer, + CL_TRUE, + 0, + m_CPUBuffer->size() * sizeof(ElementType), + &((*m_CPUBuffer)[0])); + + if( err != CL_SUCCESS ) + { + btAssert( "CommandQueue::enqueueReadBuffer(m_buffer)"); + } + + } + } + + return true; + } + + virtual void changedOnCPU() + { + m_onGPU = false; + } +}; // class btOpenCLBuffer + + +#endif // #ifndef BT_SOFT_BODY_SOLVER_BUFFER_OPENCL_H \ No newline at end of file diff --git a/src/BulletMultiThreaded/GpuSoftBodySolvers/OpenCL/btSoftBodySolverLinkData_OpenCL.h b/src/BulletMultiThreaded/GpuSoftBodySolvers/OpenCL/btSoftBodySolverLinkData_OpenCL.h new file mode 100644 index 000000000..6c270c5b5 --- /dev/null +++ b/src/BulletMultiThreaded/GpuSoftBodySolvers/OpenCL/btSoftBodySolverLinkData_OpenCL.h @@ -0,0 +1,79 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#include "BulletSoftBody/Solvers/CPU/btSoftBodySolverData.h" +#include "BulletSoftBody/Solvers/OpenCL/btSoftBodySolverBuffer_OpenCL.h" + + +#ifndef BT_SOFT_BODY_SOLVER_LINK_DATA_OPENCL_H +#define BT_SOFT_BODY_SOLVER_LINK_DATA_OPENCL_H + + +class btSoftBodyLinkDataOpenCL : public btSoftBodyLinkData +{ +public: + bool m_onGPU; + cl::CommandQueue m_queue; + + btOpenCLBuffer m_clLinks; + btOpenCLBuffer m_clLinkStrength; + btOpenCLBuffer m_clLinksMassLSC; + btOpenCLBuffer m_clLinksRestLengthSquared; + btOpenCLBuffer m_clLinksCLength; + btOpenCLBuffer m_clLinksLengthRatio; + btOpenCLBuffer m_clLinksRestLength; + btOpenCLBuffer m_clLinksMaterialLinearStiffnessCoefficient; + + /** + * Link addressing information for each cloth. + * Allows link locations to be computed independently of data batching. + */ + btAlignedObjectArray< int > m_linkAddresses; + + /** + * Start and length values for computation batches over link data. + */ + btAlignedObjectArray< std::pair< int, int > > m_batchStartLengths; + + btSoftBodyLinkDataOpenCL(cl::CommandQueue queue); + + virtual ~btSoftBodyLinkDataOpenCL(); + + /** Allocate enough space in all link-related arrays to fit numLinks links */ + virtual void createLinks( int numLinks ); + + /** Insert the link described into the correct data structures assuming space has already been allocated by a call to createLinks */ + virtual void setLinkAt( + const LinkDescription &link, + int linkIndex ); + + virtual bool onAccelerator(); + + virtual bool moveToAccelerator(); + + virtual bool moveFromAccelerator(); + + /** + * Generate (and later update) the batching for the entire link set. + * This redoes a lot of work because it batches the entire set when each cloth is inserted. + * In theory we could delay it until just before we need the cloth. + * It's a one-off overhead, though, so that is a later optimisation. + */ + void generateBatches(); +}; + + + +#endif // #ifndef BT_SOFT_BODY_SOLVER_LINK_DATA_OPENCL_H diff --git a/src/BulletMultiThreaded/GpuSoftBodySolvers/OpenCL/btSoftBodySolverTriangleData_OpenCL.h b/src/BulletMultiThreaded/GpuSoftBodySolvers/OpenCL/btSoftBodySolverTriangleData_OpenCL.h new file mode 100644 index 000000000..4bc9215ea --- /dev/null +++ b/src/BulletMultiThreaded/GpuSoftBodySolvers/OpenCL/btSoftBodySolverTriangleData_OpenCL.h @@ -0,0 +1,74 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + + +#include "BulletSoftBody/Solvers/CPU/btSoftBodySolverData.h" +#include "BulletSoftBody/Solvers/OpenCL/btSoftBodySolverBuffer_OpenCL.h" + + +#ifndef BT_SOFT_BODY_SOLVER_TRIANGLE_DATA_OPENCL_H +#define BT_SOFT_BODY_SOLVER_TRIANGLE_DATA_OPENCL_H + + +class btSoftBodyTriangleDataOpenCL : public btSoftBodyTriangleData +{ +public: + bool m_onGPU; + cl::CommandQueue m_queue; + + btOpenCLBuffer m_clVertexIndices; + btOpenCLBuffer m_clArea; + btOpenCLBuffer m_clNormal; + + /** + * Link addressing information for each cloth. + * Allows link locations to be computed independently of data batching. + */ + btAlignedObjectArray< int > m_triangleAddresses; + + /** + * Start and length values for computation batches over link data. + */ + btAlignedObjectArray< std::pair< int, int > > m_batchStartLengths; + +public: + btSoftBodyTriangleDataOpenCL( cl::CommandQueue queue ); + + virtual ~btSoftBodyTriangleDataOpenCL(); + + /** Allocate enough space in all link-related arrays to fit numLinks links */ + virtual void createTriangles( int numTriangles ); + + /** Insert the link described into the correct data structures assuming space has already been allocated by a call to createLinks */ + virtual void setTriangleAt( const btSoftBodyTriangleData::TriangleDescription &triangle, int triangleIndex ); + + virtual bool onAccelerator(); + + virtual bool moveToAccelerator(); + + virtual bool moveFromAccelerator(); + + /** + * Generate (and later update) the batching for the entire triangle set. + * This redoes a lot of work because it batches the entire set when each cloth is inserted. + * In theory we could delay it until just before we need the cloth. + * It's a one-off overhead, though, so that is a later optimisation. + */ + void generateBatches(); +}; // class btSoftBodyTriangleDataOpenCL + + +#endif // #ifndef BT_SOFT_BODY_SOLVER_TRIANGLE_DATA_OPENCL_H + diff --git a/src/BulletMultiThreaded/GpuSoftBodySolvers/OpenCL/btSoftBodySolverVertexData_OpenCL.h b/src/BulletMultiThreaded/GpuSoftBodySolvers/OpenCL/btSoftBodySolverVertexData_OpenCL.h new file mode 100644 index 000000000..8f65c9de4 --- /dev/null +++ b/src/BulletMultiThreaded/GpuSoftBodySolvers/OpenCL/btSoftBodySolverVertexData_OpenCL.h @@ -0,0 +1,52 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#include "BulletSoftBody/Solvers/CPU/btSoftBodySolverData.h" +#include "BulletSoftBody/Solvers/OpenCL/btSoftBodySolverBuffer_OpenCL.h" + +#ifndef BT_SOFT_BODY_SOLVER_VERTEX_DATA_OPENCL_H +#define BT_SOFT_BODY_SOLVER_VERTEX_DATA_OPENCL_H + + +class btSoftBodyVertexDataOpenCL : public btSoftBodyVertexData +{ +protected: + bool m_onGPU; + cl::CommandQueue m_queue; + +public: + btOpenCLBuffer m_clClothIdentifier; + btOpenCLBuffer m_clVertexPosition; + btOpenCLBuffer m_clVertexPreviousPosition; + btOpenCLBuffer m_clVertexVelocity; + btOpenCLBuffer m_clVertexForceAccumulator; + btOpenCLBuffer m_clVertexNormal; + btOpenCLBuffer m_clVertexInverseMass; + btOpenCLBuffer m_clVertexArea; + btOpenCLBuffer m_clVertexTriangleCount; +public: + btSoftBodyVertexDataOpenCL( cl::CommandQueue queue); + + virtual ~btSoftBodyVertexDataOpenCL(); + + virtual bool onAccelerator(); + + virtual bool moveToAccelerator(); + + virtual bool moveFromAccelerator(); +}; + + +#endif // #ifndef BT_SOFT_BODY_SOLVER_VERTEX_DATA_OPENCL_H diff --git a/src/BulletMultiThreaded/GpuSoftBodySolvers/OpenCL/btSoftBodySolver_OpenCL.cpp b/src/BulletMultiThreaded/GpuSoftBodySolvers/OpenCL/btSoftBodySolver_OpenCL.cpp new file mode 100644 index 000000000..af8be10ed --- /dev/null +++ b/src/BulletMultiThreaded/GpuSoftBodySolvers/OpenCL/btSoftBodySolver_OpenCL.cpp @@ -0,0 +1,1279 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + + +#include "BulletCollision/CollisionShapes/btTriangleIndexVertexArray.h" +#include "BulletMultiThreaded/vectormath/scalar/cpp/vectormath_aos.h" +#include "BulletMultiThreaded/vectormath/scalar/cpp/mat_aos.h" +#include "BulletMultiThreaded/vectormath/scalar/cpp/vec_aos.h" + +#include "BulletSoftBody/solvers/OpenCL/btSoftBodySolver_OpenCL.h" +#include "BulletSoftBody/VertexBuffers/btSoftBodySolverVertexBuffer.h" +#include "BulletSoftBody/btSoftBody.h" + +#define MSTRINGIFY(A) #A +static char* PrepareLinksCLString = +#include "OpenCLC/PrepareLinks.cl" +static char* UpdatePositionsFromVelocitiesCLString = +#include "OpenCLC/UpdatePositionsFromVelocities.cl" +static char* SolvePositionsCLString = +#include "OpenCLC/SolvePositions.cl" +static char* UpdateNodesCLString = +#include "OpenCLC/UpdateNodes.cl" +static char* UpdatePositionsCLString = +#include "OpenCLC/UpdatePositions.cl" +static char* UpdateConstantsCLString = +#include "OpenCLC/UpdateConstants.cl" +static char* IntegrateCLString = +#include "OpenCLC/Integrate.cl" +static char* ApplyForcesCLString = +#include "OpenCLC/ApplyForces.cl" +static char* UpdateNormalsCLString = +#include "OpenCLC/UpdateNormals.cl" +static char* VSolveLinksCLString = +#include "OpenCLC/VSolveLinks.cl" + + +btSoftBodyVertexDataOpenCL::btSoftBodyVertexDataOpenCL( cl::CommandQueue queue) : + m_queue(queue), + m_clClothIdentifier( queue, &m_clothIdentifier, false ), + m_clVertexPosition( queue, &m_vertexPosition, false ), + m_clVertexPreviousPosition( queue, &m_vertexPreviousPosition, false ), + m_clVertexVelocity( queue, &m_vertexVelocity, false ), + m_clVertexForceAccumulator( queue, &m_vertexForceAccumulator, false ), + m_clVertexNormal( queue, &m_vertexNormal, false ), + m_clVertexInverseMass( queue, &m_vertexInverseMass, false ), + m_clVertexArea( queue, &m_vertexArea, false ), + m_clVertexTriangleCount( queue, &m_vertexTriangleCount, false ) +{ +} + +btSoftBodyVertexDataOpenCL::~btSoftBodyVertexDataOpenCL() +{ + +} + +bool btSoftBodyVertexDataOpenCL::onAccelerator() +{ + return m_onGPU; +} + +bool btSoftBodyVertexDataOpenCL::moveToAccelerator() +{ + bool success = true; + success = success && m_clClothIdentifier.moveToGPU(); + success = success && m_clVertexPosition.moveToGPU(); + success = success && m_clVertexPreviousPosition.moveToGPU(); + success = success && m_clVertexVelocity.moveToGPU(); + success = success && m_clVertexForceAccumulator.moveToGPU(); + success = success && m_clVertexNormal.moveToGPU(); + success = success && m_clVertexInverseMass.moveToGPU(); + success = success && m_clVertexArea.moveToGPU(); + success = success && m_clVertexTriangleCount.moveToGPU(); + + if( success ) + m_onGPU = true; + + return success; +} + +bool btSoftBodyVertexDataOpenCL::moveFromAccelerator() +{ + bool success = true; + success = success && m_clClothIdentifier.moveFromGPU(); + success = success && m_clVertexPosition.moveFromGPU(); + success = success && m_clVertexPreviousPosition.moveFromGPU(); + success = success && m_clVertexVelocity.moveFromGPU(); + success = success && m_clVertexForceAccumulator.moveFromGPU(); + success = success && m_clVertexNormal.moveFromGPU(); + success = success && m_clVertexInverseMass.moveFromGPU(); + success = success && m_clVertexArea.moveFromGPU(); + success = success && m_clVertexTriangleCount.moveFromGPU(); + + if( success ) + m_onGPU = true; + + return success; +} + + + + +btSoftBodyLinkDataOpenCL::btSoftBodyLinkDataOpenCL(cl::CommandQueue queue) : + m_queue(queue), + m_clLinks( queue, &m_links, false ), + m_clLinkStrength( queue, &m_linkStrength, false ), + m_clLinksMassLSC( queue, &m_linksMassLSC, false ), + m_clLinksRestLengthSquared( queue, &m_linksRestLengthSquared, false ), + m_clLinksCLength( queue, &m_linksCLength, false ), + m_clLinksLengthRatio( queue, &m_linksLengthRatio, false ), + m_clLinksRestLength( queue, &m_linksRestLength, false ), + m_clLinksMaterialLinearStiffnessCoefficient( queue, &m_linksMaterialLinearStiffnessCoefficient, false ) +{ +} + +btSoftBodyLinkDataOpenCL::~btSoftBodyLinkDataOpenCL() +{ +} + +static Vectormath::Aos::Vector3 toVector3( const btVector3 &vec ) +{ + Vectormath::Aos::Vector3 outVec( vec.getX(), vec.getY(), vec.getZ() ); + return outVec; +} + +/** Allocate enough space in all link-related arrays to fit numLinks links */ +void btSoftBodyLinkDataOpenCL::createLinks( int numLinks ) +{ + int previousSize = m_links.size(); + int newSize = previousSize + numLinks; + + btSoftBodyLinkData::createLinks( numLinks ); + + // Resize the link addresses array as well + m_linkAddresses.resize( newSize ); +} + +/** Insert the link described into the correct data structures assuming space has already been allocated by a call to createLinks */ +void btSoftBodyLinkDataOpenCL::setLinkAt( + const LinkDescription &link, + int linkIndex ) +{ + btSoftBodyLinkData::setLinkAt( link, linkIndex ); + + // Set the link index correctly for initialisation + m_linkAddresses[linkIndex] = linkIndex; +} + +bool btSoftBodyLinkDataOpenCL::onAccelerator() +{ + return m_onGPU; +} + +bool btSoftBodyLinkDataOpenCL::moveToAccelerator() +{ + bool success = true; + success = success && m_clLinks.moveToGPU(); + success = success && m_clLinkStrength.moveToGPU(); + success = success && m_clLinksMassLSC.moveToGPU(); + success = success && m_clLinksRestLengthSquared.moveToGPU(); + success = success && m_clLinksCLength.moveToGPU(); + success = success && m_clLinksLengthRatio.moveToGPU(); + success = success && m_clLinksRestLength.moveToGPU(); + success = success && m_clLinksMaterialLinearStiffnessCoefficient.moveToGPU(); + + if( success ) { + m_onGPU = true; + } + + return success; +} + +bool btSoftBodyLinkDataOpenCL::moveFromAccelerator() +{ + bool success = true; + success = success && m_clLinks.moveFromGPU(); + success = success && m_clLinkStrength.moveFromGPU(); + success = success && m_clLinksMassLSC.moveFromGPU(); + success = success && m_clLinksRestLengthSquared.moveFromGPU(); + success = success && m_clLinksCLength.moveFromGPU(); + success = success && m_clLinksLengthRatio.moveFromGPU(); + success = success && m_clLinksRestLength.moveFromGPU(); + success = success && m_clLinksMaterialLinearStiffnessCoefficient.moveFromGPU(); + + if( success ) { + m_onGPU = false; + } + + return success; +} + +/** + * Generate (and later update) the batching for the entire link set. + * This redoes a lot of work because it batches the entire set when each cloth is inserted. + * In theory we could delay it until just before we need the cloth. + * It's a one-off overhead, though, so that is a later optimisation. + */ +void btSoftBodyLinkDataOpenCL::generateBatches() +{ + int numLinks = getNumLinks(); + + // Do the graph colouring here temporarily + btAlignedObjectArray< int > batchValues; + batchValues.resize( numLinks, 0 ); + + // Find the maximum vertex value internally for now + int maxVertex = 0; + for( int linkIndex = 0; linkIndex < numLinks; ++linkIndex ) + { + int vertex0 = getVertexPair(linkIndex).vertex0; + int vertex1 = getVertexPair(linkIndex).vertex1; + if( vertex0 > maxVertex ) + maxVertex = vertex0; + if( vertex1 > maxVertex ) + maxVertex = vertex1; + } + int numVertices = maxVertex + 1; + + // Set of lists, one for each node, specifying which colours are connected + // to that node. + // No two edges into a node can share a colour. + btAlignedObjectArray< btAlignedObjectArray< int > > vertexConnectedColourLists; + vertexConnectedColourLists.resize(numVertices); + + // Simple algorithm that chooses the lowest batch number + // that none of the links attached to either of the connected + // nodes is in + for( int linkIndex = 0; linkIndex < numLinks; ++linkIndex ) + { + int linkLocation = m_linkAddresses[linkIndex]; + + int vertex0 = getVertexPair(linkLocation).vertex0; + int vertex1 = getVertexPair(linkLocation).vertex1; + + // Get the two node colour lists + btAlignedObjectArray< int > &colourListVertex0( vertexConnectedColourLists[vertex0] ); + btAlignedObjectArray< int > &colourListVertex1( vertexConnectedColourLists[vertex1] ); + + // Choose the minimum colour that is in neither list + int colour = 0; + while( colourListVertex0.findLinearSearch(colour) != colourListVertex0.size() || colourListVertex1.findLinearSearch(colour) != colourListVertex1.size() ) + ++colour; + // i should now be the minimum colour in neither list + // Add to the two lists so that future edges don't share + // And store the colour against this edge + + colourListVertex0.push_back(colour); + colourListVertex1.push_back(colour); + batchValues[linkIndex] = colour; + } + + // Check the colour counts + btAlignedObjectArray< int > batchCounts; + for( int i = 0; i < numLinks; ++i ) + { + int batch = batchValues[i]; + if( batch >= batchCounts.size() ) + batchCounts.push_back(1); + else + ++(batchCounts[batch]); + } + + m_batchStartLengths.resize(batchCounts.size()); + if( m_batchStartLengths.size() > 0 ) + { + m_batchStartLengths.resize(batchCounts.size()); + m_batchStartLengths[0] = std::pair< int, int >( 0, 0 ); + + int sum = 0; + for( int batchIndex = 0; batchIndex < batchCounts.size(); ++batchIndex ) + { + m_batchStartLengths[batchIndex].first = sum; + m_batchStartLengths[batchIndex].second = batchCounts[batchIndex]; + sum += batchCounts[batchIndex]; + } + } + + ///////////////////////////// + // Sort data based on batches + + // Create source arrays by copying originals + btAlignedObjectArray m_links_Backup(m_links); + btAlignedObjectArray m_linkStrength_Backup(m_linkStrength); + btAlignedObjectArray m_linksMassLSC_Backup(m_linksMassLSC); + btAlignedObjectArray m_linksRestLengthSquared_Backup(m_linksRestLengthSquared); + btAlignedObjectArray m_linksCLength_Backup(m_linksCLength); + btAlignedObjectArray m_linksLengthRatio_Backup(m_linksLengthRatio); + btAlignedObjectArray m_linksRestLength_Backup(m_linksRestLength); + btAlignedObjectArray m_linksMaterialLinearStiffnessCoefficient_Backup(m_linksMaterialLinearStiffnessCoefficient); + + + for( int batch = 0; batch < batchCounts.size(); ++batch ) + batchCounts[batch] = 0; + + // Do sort as single pass into destination arrays + for( int linkIndex = 0; linkIndex < numLinks; ++linkIndex ) + { + // To maintain locations run off the original link locations rather than the current position. + // It's not cache efficient, but as we run this rarely that should not matter. + // It's faster than searching the link location array for the current location and then updating it. + // The other alternative would be to unsort before resorting, but this is equivalent to doing that. + int linkLocation = m_linkAddresses[linkIndex]; + + // Obtain batch and calculate target location for the + // next element in that batch, incrementing the batch counter + // afterwards + int batch = batchValues[linkIndex]; + int newLocation = m_batchStartLengths[batch].first + batchCounts[batch]; + + batchCounts[batch] = batchCounts[batch] + 1; + m_links[newLocation] = m_links_Backup[linkLocation]; +#if 1 + m_linkStrength[newLocation] = m_linkStrength_Backup[linkLocation]; + m_linksMassLSC[newLocation] = m_linksMassLSC_Backup[linkLocation]; + m_linksRestLengthSquared[newLocation] = m_linksRestLengthSquared_Backup[linkLocation]; + m_linksLengthRatio[newLocation] = m_linksLengthRatio_Backup[linkLocation]; + m_linksRestLength[newLocation] = m_linksRestLength_Backup[linkLocation]; + m_linksMaterialLinearStiffnessCoefficient[newLocation] = m_linksMaterialLinearStiffnessCoefficient_Backup[linkLocation]; +#endif + // Update the locations array to account for the moved entry + m_linkAddresses[linkIndex] = newLocation; + } + + +} // void generateBatches() + + + + + +btSoftBodyTriangleDataOpenCL::btSoftBodyTriangleDataOpenCL( cl::CommandQueue queue ) : + m_queue( queue ), + m_clVertexIndices( queue, &m_vertexIndices, false ), + m_clArea( queue, &m_area, false ), + m_clNormal( queue, &m_normal, false ) +{ +} + +btSoftBodyTriangleDataOpenCL::~btSoftBodyTriangleDataOpenCL() +{ +} + +/** Allocate enough space in all link-related arrays to fit numLinks links */ +void btSoftBodyTriangleDataOpenCL::createTriangles( int numTriangles ) +{ + int previousSize = getNumTriangles(); + int newSize = previousSize + numTriangles; + + btSoftBodyTriangleData::createTriangles( numTriangles ); + + // Resize the link addresses array as well + m_triangleAddresses.resize( newSize ); +} + +/** Insert the link described into the correct data structures assuming space has already been allocated by a call to createLinks */ +void btSoftBodyTriangleDataOpenCL::setTriangleAt( const btSoftBodyTriangleData::TriangleDescription &triangle, int triangleIndex ) +{ + btSoftBodyTriangleData::setTriangleAt( triangle, triangleIndex ); + + m_triangleAddresses[triangleIndex] = triangleIndex; +} + +bool btSoftBodyTriangleDataOpenCL::onAccelerator() +{ + return m_onGPU; +} + +bool btSoftBodyTriangleDataOpenCL::moveToAccelerator() +{ + bool success = true; + success = success && m_clVertexIndices.moveToGPU(); + success = success && m_clArea.moveToGPU(); + success = success && m_clNormal.moveToGPU(); + + if( success ) + m_onGPU = true; + + return success; +} + +bool btSoftBodyTriangleDataOpenCL::moveFromAccelerator() +{ + bool success = true; + success = success && m_clVertexIndices.moveFromGPU(); + success = success && m_clArea.moveFromGPU(); + success = success && m_clNormal.moveFromGPU(); + + if( success ) + m_onGPU = true; + + return success; +} + +/** + * Generate (and later update) the batching for the entire triangle set. + * This redoes a lot of work because it batches the entire set when each cloth is inserted. + * In theory we could delay it until just before we need the cloth. + * It's a one-off overhead, though, so that is a later optimisation. + */ +void btSoftBodyTriangleDataOpenCL::generateBatches() +{ + int numTriangles = getNumTriangles(); + if( numTriangles == 0 ) + return; + + // Do the graph colouring here temporarily + btAlignedObjectArray< int > batchValues; + batchValues.resize( numTriangles ); + + // Find the maximum vertex value internally for now + int maxVertex = 0; + for( int triangleIndex = 0; triangleIndex < numTriangles; ++triangleIndex ) + { + int vertex0 = getVertexSet(triangleIndex).vertex0; + int vertex1 = getVertexSet(triangleIndex).vertex1; + int vertex2 = getVertexSet(triangleIndex).vertex2; + + if( vertex0 > maxVertex ) + maxVertex = vertex0; + if( vertex1 > maxVertex ) + maxVertex = vertex1; + if( vertex2 > maxVertex ) + maxVertex = vertex2; + } + int numVertices = maxVertex + 1; + + // Set of lists, one for each node, specifying which colours are connected + // to that node. + // No two edges into a node can share a colour. + btAlignedObjectArray< btAlignedObjectArray< int > > vertexConnectedColourLists; + vertexConnectedColourLists.resize(numVertices); + + + //std::cout << "\n"; + // Simple algorithm that chooses the lowest batch number + // that none of the faces attached to either of the connected + // nodes is in + for( int triangleIndex = 0; triangleIndex < numTriangles; ++triangleIndex ) + { + // To maintain locations run off the original link locations rather than the current position. + // It's not cache efficient, but as we run this rarely that should not matter. + // It's faster than searching the link location array for the current location and then updating it. + // The other alternative would be to unsort before resorting, but this is equivalent to doing that. + int triangleLocation = m_triangleAddresses[triangleIndex]; + + int vertex0 = getVertexSet(triangleLocation).vertex0; + int vertex1 = getVertexSet(triangleLocation).vertex1; + int vertex2 = getVertexSet(triangleLocation).vertex2; + + // Get the three node colour lists + btAlignedObjectArray< int > &colourListVertex0( vertexConnectedColourLists[vertex0] ); + btAlignedObjectArray< int > &colourListVertex1( vertexConnectedColourLists[vertex1] ); + btAlignedObjectArray< int > &colourListVertex2( vertexConnectedColourLists[vertex2] ); + + // Choose the minimum colour that is in none of the lists + int colour = 0; + while( + colourListVertex0.findLinearSearch(colour) != colourListVertex0.size() || + colourListVertex1.findLinearSearch(colour) != colourListVertex1.size() || + colourListVertex2.findLinearSearch(colour) != colourListVertex2.size() ) + { + ++colour; + } + // i should now be the minimum colour in neither list + // Add to the three lists so that future edges don't share + // And store the colour against this face + colourListVertex0.push_back(colour); + colourListVertex1.push_back(colour); + colourListVertex2.push_back(colour); + + batchValues[triangleIndex] = colour; + } + + + // Check the colour counts + btAlignedObjectArray< int > batchCounts; + for( int i = 0; i < numTriangles; ++i ) + { + int batch = batchValues[i]; + if( batch >= batchCounts.size() ) + batchCounts.push_back(1); + else + ++(batchCounts[batch]); + } + + + m_batchStartLengths.resize(batchCounts.size()); + m_batchStartLengths[0] = std::pair< int, int >( 0, 0 ); + + + int sum = 0; + for( int batchIndex = 0; batchIndex < batchCounts.size(); ++batchIndex ) + { + m_batchStartLengths[batchIndex].first = sum; + m_batchStartLengths[batchIndex].second = batchCounts[batchIndex]; + sum += batchCounts[batchIndex]; + } + + ///////////////////////////// + // Sort data based on batches + + // Create source arrays by copying originals + btAlignedObjectArray m_vertexIndices_Backup(m_vertexIndices); + btAlignedObjectArray m_area_Backup(m_area); + btAlignedObjectArray m_normal_Backup(m_normal); + + + for( int batch = 0; batch < batchCounts.size(); ++batch ) + batchCounts[batch] = 0; + + // Do sort as single pass into destination arrays + for( int triangleIndex = 0; triangleIndex < numTriangles; ++triangleIndex ) + { + // To maintain locations run off the original link locations rather than the current position. + // It's not cache efficient, but as we run this rarely that should not matter. + // It's faster than searching the link location array for the current location and then updating it. + // The other alternative would be to unsort before resorting, but this is equivalent to doing that. + int triangleLocation = m_triangleAddresses[triangleIndex]; + + // Obtain batch and calculate target location for the + // next element in that batch, incrementing the batch counter + // afterwards + int batch = batchValues[triangleIndex]; + int newLocation = m_batchStartLengths[batch].first + batchCounts[batch]; + + batchCounts[batch] = batchCounts[batch] + 1; + m_vertexIndices[newLocation] = m_vertexIndices_Backup[triangleLocation]; + m_area[newLocation] = m_area_Backup[triangleLocation]; + m_normal[newLocation] = m_normal_Backup[triangleLocation]; + + // Update the locations array to account for the moved entry + m_triangleAddresses[triangleIndex] = newLocation; + } +} // btSoftBodyTriangleDataOpenCL::generateBatches + + + + + + + +btOpenCLSoftBodySolver::btOpenCLSoftBodySolver(const cl::CommandQueue &queue) : + m_linkData(queue), + m_vertexData(queue), + m_triangleData(queue), + m_clPerClothAcceleration(queue, &m_perClothAcceleration, true ), + m_clPerClothWindVelocity(queue, &m_perClothWindVelocity, true ), + m_clPerClothDampingFactor(queue, &m_perClothDampingFactor, true ), + m_clPerClothVelocityCorrectionCoefficient(queue, &m_perClothVelocityCorrectionCoefficient, true ), + m_clPerClothLiftFactor(queue, &m_perClothLiftFactor, true ), + m_clPerClothDragFactor(queue, &m_perClothDragFactor, true ), + m_clPerClothMediumDensity(queue, &m_perClothMediumDensity, true ), + m_queue( queue ) +{ + // Initial we will clearly need to update solver constants + // For now this is global for the cloths linked with this solver - we should probably make this body specific + // for performance in future once we understand more clearly when constants need to be updated + m_updateSolverConstants = true; + + m_shadersInitialized = false; +} + +btOpenCLSoftBodySolver::~btOpenCLSoftBodySolver() +{ +} + +void btOpenCLSoftBodySolver::optimize( btAlignedObjectArray< btSoftBody * > &softBodies ) +{ + if( m_softBodySet.size() != softBodies.size() ) + { + // Have a change in the soft body set so update, reloading all the data + getVertexData().clear(); + getTriangleData().clear(); + getLinkData().clear(); + m_softBodySet.resize(0); + + + for( int softBodyIndex = 0; softBodyIndex < softBodies.size(); ++softBodyIndex ) + { + btSoftBody *softBody = softBodies[ softBodyIndex ]; + using Vectormath::Aos::Matrix3; + using Vectormath::Aos::Point3; + + // Create SoftBody that will store the information within the solver + btAcceleratedSoftBodyInterface *newSoftBody = new btAcceleratedSoftBodyInterface( softBody ); + m_softBodySet.push_back( newSoftBody ); + + m_perClothAcceleration.push_back( toVector3(softBody->getWorldInfo()->m_gravity) ); + m_perClothDampingFactor.push_back(softBody->m_cfg.kDP); + m_perClothVelocityCorrectionCoefficient.push_back( softBody->m_cfg.kVCF ); + m_perClothLiftFactor.push_back( softBody->m_cfg.kLF ); + m_perClothDragFactor.push_back( softBody->m_cfg.kDG ); + m_perClothMediumDensity.push_back(softBody->getWorldInfo()->air_density); + + // Add space for new vertices and triangles in the default solver for now + // TODO: Include space here for tearing too later + int firstVertex = getVertexData().getNumVertices(); + int numVertices = softBody->m_nodes.size(); + int maxVertices = numVertices; + // Allocate space for new vertices in all the vertex arrays + getVertexData().createVertices( maxVertices, softBodyIndex ); + + int firstTriangle = getTriangleData().getNumTriangles(); + int numTriangles = softBody->m_faces.size(); + int maxTriangles = numTriangles; + getTriangleData().createTriangles( maxTriangles ); + + // Copy vertices from softbody into the solver + for( int vertex = 0; vertex < numVertices; ++vertex ) + { + Point3 multPoint(softBody->m_nodes[vertex].m_x.getX(), softBody->m_nodes[vertex].m_x.getY(), softBody->m_nodes[vertex].m_x.getZ()); + btSoftBodyVertexData::VertexDescription desc; + + // TODO: Position in the softbody might be pre-transformed + // or we may need to adapt for the pose. + //desc.setPosition( cloth.getMeshTransform()*multPoint ); + desc.setPosition( multPoint ); + + float vertexInverseMass = softBody->m_nodes[vertex].m_im; + desc.setInverseMass(vertexInverseMass); + getVertexData().setVertexAt( desc, firstVertex + vertex ); + } + + // Copy triangles similarly + // We're assuming here that vertex indices are based on the firstVertex rather than the entire scene + for( int triangle = 0; triangle < numTriangles; ++triangle ) + { + // Note that large array storage is relative to the array not to the cloth + // So we need to add firstVertex to each value + int vertexIndex0 = (softBody->m_faces[triangle].m_n[0] - &(softBody->m_nodes[0])); + int vertexIndex1 = (softBody->m_faces[triangle].m_n[1] - &(softBody->m_nodes[0])); + int vertexIndex2 = (softBody->m_faces[triangle].m_n[2] - &(softBody->m_nodes[0])); + btSoftBodyTriangleData::TriangleDescription newTriangle(vertexIndex0 + firstVertex, vertexIndex1 + firstVertex, vertexIndex2 + firstVertex); + getTriangleData().setTriangleAt( newTriangle, firstTriangle + triangle ); + + // Increase vertex triangle counts for this triangle + getVertexData().getTriangleCount(newTriangle.getVertexSet().vertex0)++; + getVertexData().getTriangleCount(newTriangle.getVertexSet().vertex1)++; + getVertexData().getTriangleCount(newTriangle.getVertexSet().vertex2)++; + } + + int firstLink = getLinkData().getNumLinks(); + int numLinks = softBody->m_links.size(); + int maxLinks = numLinks; + + // Allocate space for the links + getLinkData().createLinks( numLinks ); + + // Add the links + for( int link = 0; link < numLinks; ++link ) + { + int vertexIndex0 = softBody->m_links[link].m_n[0] - &(softBody->m_nodes[0]); + int vertexIndex1 = softBody->m_links[link].m_n[1] - &(softBody->m_nodes[0]); + + btSoftBodyLinkData::LinkDescription newLink(vertexIndex0 + firstVertex, vertexIndex1 + firstVertex, softBody->m_links[link].m_material->m_kLST); + newLink.setLinkStrength(1.f); + getLinkData().setLinkAt(newLink, firstLink + link); + } + + newSoftBody->setFirstVertex( firstVertex ); + newSoftBody->setFirstTriangle( firstTriangle ); + newSoftBody->setNumVertices( numVertices ); + newSoftBody->setMaxVertices( maxVertices ); + newSoftBody->setNumTriangles( numTriangles ); + newSoftBody->setMaxTriangles( maxTriangles ); + newSoftBody->setFirstLink( firstLink ); + newSoftBody->setNumLinks( numLinks ); + } + + + + updateConstants(0.f); + + + m_linkData.generateBatches(); + m_triangleData.generateBatches(); + } +} + + +btSoftBodyLinkData &btOpenCLSoftBodySolver::getLinkData() +{ + // TODO: Consider setting link data to "changed" here + return m_linkData; +} + +btSoftBodyVertexData &btOpenCLSoftBodySolver::getVertexData() +{ + // TODO: Consider setting vertex data to "changed" here + return m_vertexData; +} + +btSoftBodyTriangleData &btOpenCLSoftBodySolver::getTriangleData() +{ + // TODO: Consider setting triangle data to "changed" here + return m_triangleData; +} + + +bool btOpenCLSoftBodySolver::checkInitialized() +{ + return buildShaders(); +} + +void btOpenCLSoftBodySolver::resetNormalsAndAreas( int numVertices ) +{ + resetNormalsAndAreasKernel.kernel.setArg(0, numVertices); + resetNormalsAndAreasKernel.kernel.setArg(1, m_vertexData.m_clVertexNormal.getBuffer()); + resetNormalsAndAreasKernel.kernel.setArg(2, m_vertexData.m_clVertexArea.getBuffer()); + + int numWorkItems = workGroupSize*((numVertices + (workGroupSize-1)) / workGroupSize); + cl_int err = m_queue.enqueueNDRangeKernel(resetNormalsAndAreasKernel.kernel, cl::NullRange, cl::NDRange(numWorkItems), cl::NDRange(workGroupSize)); + if( err != CL_SUCCESS ) + { + btAssert( "enqueueNDRangeKernel(resetNormalsAndAreasKernel)" ); + } +} + +void btOpenCLSoftBodySolver::normalizeNormalsAndAreas( int numVertices ) +{ + normalizeNormalsAndAreasKernel.kernel.setArg(0, numVertices); + normalizeNormalsAndAreasKernel.kernel.setArg(1, m_vertexData.m_clVertexTriangleCount.getBuffer()); + normalizeNormalsAndAreasKernel.kernel.setArg(2, m_vertexData.m_clVertexNormal.getBuffer()); + normalizeNormalsAndAreasKernel.kernel.setArg(3, m_vertexData.m_clVertexArea.getBuffer()); + + int numWorkItems = workGroupSize*((numVertices + (workGroupSize-1)) / workGroupSize); + cl_int err = m_queue.enqueueNDRangeKernel(normalizeNormalsAndAreasKernel.kernel, cl::NullRange, cl::NDRange(numWorkItems), cl::NDRange(workGroupSize)); + if( err != CL_SUCCESS ) + { + btAssert( "enqueueNDRangeKernel(normalizeNormalsAndAreasKernel)"); + } +} + +void btOpenCLSoftBodySolver::executeUpdateSoftBodies( int firstTriangle, int numTriangles ) +{ + updateSoftBodiesKernel.kernel.setArg(0, firstTriangle); + updateSoftBodiesKernel.kernel.setArg(1, numTriangles); + updateSoftBodiesKernel.kernel.setArg(2, m_triangleData.m_clVertexIndices.getBuffer()); + updateSoftBodiesKernel.kernel.setArg(3, m_vertexData.m_clVertexPosition.getBuffer()); + updateSoftBodiesKernel.kernel.setArg(4, m_vertexData.m_clVertexNormal.getBuffer()); + updateSoftBodiesKernel.kernel.setArg(5, m_vertexData.m_clVertexArea.getBuffer()); + updateSoftBodiesKernel.kernel.setArg(6, m_triangleData.m_clNormal.getBuffer()); + updateSoftBodiesKernel.kernel.setArg(7, m_triangleData.m_clArea.getBuffer()); + + + int numWorkItems = workGroupSize*((numTriangles + (workGroupSize-1)) / workGroupSize); + cl_int err = m_queue.enqueueNDRangeKernel(updateSoftBodiesKernel.kernel, cl::NullRange, cl::NDRange(numWorkItems), cl::NDRange(workGroupSize)); + if( err != CL_SUCCESS ) + { + btAssert( "enqueueNDRangeKernel(normalizeNormalsAndAreasKernel)"); + } +} + +void btOpenCLSoftBodySolver::updateSoftBodies() +{ + using namespace Vectormath::Aos; + + + int numVertices = m_vertexData.getNumVertices(); + int numTriangles = m_triangleData.getNumTriangles(); + + // Ensure data is on accelerator + m_vertexData.moveToAccelerator(); + m_triangleData.moveToAccelerator(); + + resetNormalsAndAreas( numVertices ); + + + // Go through triangle batches so updates occur correctly + for( int batchIndex = 0; batchIndex < m_triangleData.m_batchStartLengths.size(); ++batchIndex ) + { + + int startTriangle = m_triangleData.m_batchStartLengths[batchIndex].first; + int numTriangles = m_triangleData.m_batchStartLengths[batchIndex].second; + + executeUpdateSoftBodies( startTriangle, numTriangles ); + } + + + normalizeNormalsAndAreas( numVertices ); +} // updateSoftBodies + + +Vectormath::Aos::Vector3 btOpenCLSoftBodySolver::ProjectOnAxis( const Vectormath::Aos::Vector3 &v, const Vectormath::Aos::Vector3 &a ) +{ + return a*Vectormath::Aos::dot(v, a); +} + +void btOpenCLSoftBodySolver::ApplyClampedForce( float solverdt, const Vectormath::Aos::Vector3 &force, const Vectormath::Aos::Vector3 &vertexVelocity, float inverseMass, Vectormath::Aos::Vector3 &vertexForce ) +{ + float dtInverseMass = solverdt*inverseMass; + if( Vectormath::Aos::lengthSqr(force * dtInverseMass) > Vectormath::Aos::lengthSqr(vertexVelocity) ) + { + vertexForce -= ProjectOnAxis( vertexVelocity, normalize( force ) )/dtInverseMass; + } else { + vertexForce += force; + } +} + +void btOpenCLSoftBodySolver::applyForces( float solverdt ) +{ + // Ensure data is on accelerator + m_vertexData.moveToAccelerator(); + m_clPerClothAcceleration.moveToGPU(); + m_clPerClothLiftFactor.moveToGPU(); + m_clPerClothDragFactor.moveToGPU(); + m_clPerClothMediumDensity.moveToGPU(); + m_clPerClothWindVelocity.moveToGPU(); + + cl_int err; + err = applyForcesKernel.kernel.setArg(0, m_vertexData.getNumVertices()); + if( err != CL_SUCCESS ) + { + btAssert( "enqueueNDRangeKernel(applyForcesKernel)"); + } + err = applyForcesKernel.kernel.setArg(1, solverdt); + if( err != CL_SUCCESS ) + { + btAssert( "enqueueNDRangeKernel(applyForcesKernel)"); + } + err = applyForcesKernel.kernel.setArg(2, FLT_EPSILON); + if( err != CL_SUCCESS ) + { + btAssert( "enqueueNDRangeKernel(applyForcesKernel)"); + } + err = applyForcesKernel.kernel.setArg(3, m_vertexData.m_clClothIdentifier.getBuffer()); + if( err != CL_SUCCESS ) + { + btAssert( "enqueueNDRangeKernel(applyForcesKernel)"); + } + err = applyForcesKernel.kernel.setArg(4, m_vertexData.m_clVertexNormal.getBuffer()); + if( err != CL_SUCCESS ) + { + btAssert( "enqueueNDRangeKernel(applyForcesKernel)"); + } + err = applyForcesKernel.kernel.setArg(5, m_vertexData.m_clVertexArea.getBuffer()); + if( err != CL_SUCCESS ) + { + btAssert( "enqueueNDRangeKernel(applyForcesKernel)"); + } + err = applyForcesKernel.kernel.setArg(6, m_vertexData.m_clVertexInverseMass.getBuffer()); + if( err != CL_SUCCESS ) + { + btAssert( "enqueueNDRangeKernel(applyForcesKernel)"); + } + err = applyForcesKernel.kernel.setArg(7, m_clPerClothLiftFactor.getBuffer()); + if( err != CL_SUCCESS ) + { + btAssert( "enqueueNDRangeKernel(applyForcesKernel)"); + } + err = applyForcesKernel.kernel.setArg(8, m_clPerClothDragFactor.getBuffer()); + if( err != CL_SUCCESS ) + { + btAssert( "enqueueNDRangeKernel(applyForcesKernel)"); + } + err = applyForcesKernel.kernel.setArg(9, m_clPerClothWindVelocity.getBuffer()); + if( err != CL_SUCCESS ) + { + btAssert( "enqueueNDRangeKernel(applyForcesKernel)"); + } + err = applyForcesKernel.kernel.setArg(10, m_clPerClothAcceleration.getBuffer()); + if( err != CL_SUCCESS ) + { + btAssert( "enqueueNDRangeKernel(applyForcesKernel)"); + } + err = applyForcesKernel.kernel.setArg(11, m_clPerClothMediumDensity.getBuffer()); + if( err != CL_SUCCESS ) + { + btAssert( "enqueueNDRangeKernel(applyForcesKernel)"); + } + err = applyForcesKernel.kernel.setArg(12, m_vertexData.m_clVertexForceAccumulator.getBuffer()); + if( err != CL_SUCCESS ) + { + btAssert( "enqueueNDRangeKernel(applyForcesKernel)"); + } + err = applyForcesKernel.kernel.setArg(13, m_vertexData.m_clVertexVelocity.getBuffer()); + if( err != CL_SUCCESS ) + { + btAssert( "enqueueNDRangeKernel(applyForcesKernel)"); + } + + int numWorkItems = workGroupSize*((m_vertexData.getNumVertices() + (workGroupSize-1)) / workGroupSize); + + err = m_queue.enqueueNDRangeKernel(applyForcesKernel.kernel, cl::NullRange, cl::NDRange(numWorkItems), cl::NDRange(workGroupSize)); + if( err != CL_SUCCESS ) + { + btAssert( "enqueueNDRangeKernel(applyForcesKernel)"); + } +} + +/** + * Integrate motion on the solver. + */ +void btOpenCLSoftBodySolver::integrate( float solverdt ) +{ + // Ensure data is on accelerator + m_vertexData.moveToAccelerator(); + + integrateKernel.kernel.setArg(0, m_vertexData.getNumVertices()); + integrateKernel.kernel.setArg(1, solverdt); + integrateKernel.kernel.setArg(2, m_vertexData.m_clVertexInverseMass.getBuffer()); + integrateKernel.kernel.setArg(3, m_vertexData.m_clVertexPosition.getBuffer()); + integrateKernel.kernel.setArg(4, m_vertexData.m_clVertexVelocity.getBuffer()); + integrateKernel.kernel.setArg(5, m_vertexData.m_clVertexPreviousPosition.getBuffer()); + integrateKernel.kernel.setArg(6, m_vertexData.m_clVertexForceAccumulator.getBuffer()); + + int numWorkItems = workGroupSize*((m_vertexData.getNumVertices() + (workGroupSize-1)) / workGroupSize); + cl_int err = m_queue.enqueueNDRangeKernel(integrateKernel.kernel, cl::NullRange, cl::NDRange(numWorkItems), cl::NDRange(workGroupSize)); + if( err != CL_SUCCESS ) + { + btAssert( "enqueueNDRangeKernel(integrateKernel)"); + } + +} + +float btOpenCLSoftBodySolver::computeTriangleArea( + const Vectormath::Aos::Point3 &vertex0, + const Vectormath::Aos::Point3 &vertex1, + const Vectormath::Aos::Point3 &vertex2 ) +{ + Vectormath::Aos::Vector3 a = vertex1 - vertex0; + Vectormath::Aos::Vector3 b = vertex2 - vertex0; + Vectormath::Aos::Vector3 crossProduct = cross(a, b); + float area = length( crossProduct ); + return area; +} + +void btOpenCLSoftBodySolver::updateConstants( float timeStep ) +{ + using namespace Vectormath::Aos; + + if( m_updateSolverConstants ) + { + m_updateSolverConstants = false; + + // Will have to redo this if we change the structure (tear, maybe) or various other possible changes + + // Initialise link constants + const int numLinks = m_linkData.getNumLinks(); + for( int linkIndex = 0; linkIndex < numLinks; ++linkIndex ) + { + btSoftBodyLinkData::LinkNodePair &vertices( m_linkData.getVertexPair(linkIndex) ); + m_linkData.getRestLength(linkIndex) = length((m_vertexData.getPosition( vertices.vertex0 ) - m_vertexData.getPosition( vertices.vertex1 ))); + float invMass0 = m_vertexData.getInverseMass(vertices.vertex0); + float invMass1 = m_vertexData.getInverseMass(vertices.vertex1); + float linearStiffness = m_linkData.getLinearStiffnessCoefficient(linkIndex); + float massLSC = (invMass0 + invMass1)/linearStiffness; + m_linkData.getMassLSC(linkIndex) = massLSC; + float restLength = m_linkData.getRestLength(linkIndex); + float restLengthSquared = restLength*restLength; + m_linkData.getRestLengthSquared(linkIndex) = restLengthSquared; + } + } +} + +void btOpenCLSoftBodySolver::solveConstraints( float solverdt ) +{ + using Vectormath::Aos::Vector3; + using Vectormath::Aos::Point3; + using Vectormath::Aos::lengthSqr; + using Vectormath::Aos::dot; + + // Prepare links + int numLinks = m_linkData.getNumLinks(); + int numVertices = m_vertexData.getNumVertices(); + + float kst = 1.f; + float ti = 0.f; + + + m_clPerClothDampingFactor.moveToGPU(); + m_clPerClothVelocityCorrectionCoefficient.moveToGPU(); + + + // Ensure data is on accelerator + m_linkData.moveToAccelerator(); + m_vertexData.moveToAccelerator(); + + prepareLinks(); + + + + // Prepare anchors + /*for(i=0,ni=m_anchors.size();igetWorldTransform().getBasis()*a.m_local; + a.m_c0 = ImpulseMatrix( m_sst.sdt, + a.m_node->m_im, + a.m_body->getInvMass(), + a.m_body->getInvInertiaTensorWorld(), + ra); + a.m_c1 = ra; + a.m_c2 = m_sst.sdt*a.m_node->m_im; + a.m_body->activate(); + }*/ + + // Really want to combine these into a single loop, don't we? No update in the middle? + + // TODO: Double check what kst is meant to mean - passed in as 1 in the bullet code + + + // Solve drift + for( int iteration = 0; iteration < m_numberOfPositionIterations ; ++iteration ) + { + for( int i = 0; i < m_linkData.m_batchStartLengths.size(); ++i ) + { + int startLink = m_linkData.m_batchStartLengths[i].first; + int numLinks = m_linkData.m_batchStartLengths[i].second; + + solveLinksForPosition( startLink, numLinks, kst, ti ); + } + + } // for( int iteration = 0; iteration < m_numberOfPositionIterations ; ++iteration ) + + + updateVelocitiesFromPositionsWithoutVelocities( 1.f/solverdt ); +} + + +////////////////////////////////////// +// Kernel dispatches +void btOpenCLSoftBodySolver::prepareLinks() +{ + prepareLinksKernel.kernel.setArg(0, m_linkData.getNumLinks()); + prepareLinksKernel.kernel.setArg(1, m_linkData.m_clLinks.getBuffer()); + prepareLinksKernel.kernel.setArg(2, m_linkData.m_clLinksMassLSC.getBuffer()); + prepareLinksKernel.kernel.setArg(3, m_vertexData.m_clVertexPreviousPosition.getBuffer()); + prepareLinksKernel.kernel.setArg(4, m_linkData.m_clLinksLengthRatio.getBuffer()); + prepareLinksKernel.kernel.setArg(5, m_linkData.m_clLinksCLength.getBuffer()); + + int numWorkItems = workGroupSize*((m_linkData.getNumLinks() + (workGroupSize-1)) / workGroupSize); + cl_int err = m_queue.enqueueNDRangeKernel(prepareLinksKernel.kernel, cl::NullRange, cl::NDRange(numWorkItems), cl::NDRange(workGroupSize)); + if( err != CL_SUCCESS ) + { + btAssert( "enqueueNDRangeKernel(prepareLinksKernel)"); + } +} + +void btOpenCLSoftBodySolver::updatePositionsFromVelocities( float solverdt ) +{ + updatePositionsFromVelocitiesKernel.kernel.setArg(0, m_vertexData.getNumVertices()); + updatePositionsFromVelocitiesKernel.kernel.setArg(1, solverdt); + updatePositionsFromVelocitiesKernel.kernel.setArg(2, m_vertexData.m_clVertexVelocity.getBuffer()); + updatePositionsFromVelocitiesKernel.kernel.setArg(3, m_vertexData.m_clVertexPreviousPosition.getBuffer()); + updatePositionsFromVelocitiesKernel.kernel.setArg(4, m_vertexData.m_clVertexPosition.getBuffer()); + + int numWorkItems = workGroupSize*((m_vertexData.getNumVertices() + (workGroupSize-1)) / workGroupSize); + cl_int err = m_queue.enqueueNDRangeKernel(updatePositionsFromVelocitiesKernel.kernel, cl::NullRange, cl::NDRange(numWorkItems), cl::NDRange(workGroupSize)); + if( err != CL_SUCCESS ) + { + btAssert( "enqueueNDRangeKernel(updatePositionsFromVelocitiesKernel)"); + } +} + +void btOpenCLSoftBodySolver::solveLinksForPosition( int startLink, int numLinks, float kst, float ti ) +{ + solvePositionsFromLinksKernel.kernel.setArg(0, startLink); + solvePositionsFromLinksKernel.kernel.setArg(1, numLinks); + solvePositionsFromLinksKernel.kernel.setArg(2, kst); + solvePositionsFromLinksKernel.kernel.setArg(3, ti); + solvePositionsFromLinksKernel.kernel.setArg(4, m_linkData.m_clLinks.getBuffer()); + solvePositionsFromLinksKernel.kernel.setArg(5, m_linkData.m_clLinksMassLSC.getBuffer()); + solvePositionsFromLinksKernel.kernel.setArg(6, m_linkData.m_clLinksRestLengthSquared.getBuffer()); + solvePositionsFromLinksKernel.kernel.setArg(7, m_vertexData.m_clVertexInverseMass.getBuffer()); + solvePositionsFromLinksKernel.kernel.setArg(8, m_vertexData.m_clVertexPosition.getBuffer()); + + int numWorkItems = workGroupSize*((numLinks + (workGroupSize-1)) / workGroupSize); + cl_int err = m_queue.enqueueNDRangeKernel(solvePositionsFromLinksKernel.kernel, cl::NullRange, cl::NDRange(numWorkItems), cl::NDRange(workGroupSize)); + if( err != CL_SUCCESS ) + { + btAssert( "enqueueNDRangeKernel(solvePositionsFromLinksKernel)"); + } +} // solveLinksForPosition + + +void btOpenCLSoftBodySolver::updateVelocitiesFromPositionsWithVelocities( float isolverdt ) +{ + updateVelocitiesFromPositionsWithVelocitiesKernel.kernel.setArg(0, m_vertexData.getNumVertices()); + updateVelocitiesFromPositionsWithVelocitiesKernel.kernel.setArg(1, isolverdt); + updateVelocitiesFromPositionsWithVelocitiesKernel.kernel.setArg(2, m_vertexData.m_clVertexPosition.getBuffer()); + updateVelocitiesFromPositionsWithVelocitiesKernel.kernel.setArg(3, m_vertexData.m_clVertexPreviousPosition.getBuffer()); + updateVelocitiesFromPositionsWithVelocitiesKernel.kernel.setArg(4, m_vertexData.m_clClothIdentifier.getBuffer()); + updateVelocitiesFromPositionsWithVelocitiesKernel.kernel.setArg(5, m_clPerClothVelocityCorrectionCoefficient.getBuffer()); + updateVelocitiesFromPositionsWithVelocitiesKernel.kernel.setArg(6, m_clPerClothDampingFactor.getBuffer()); + updateVelocitiesFromPositionsWithVelocitiesKernel.kernel.setArg(7, m_vertexData.m_clVertexVelocity.getBuffer()); + updateVelocitiesFromPositionsWithVelocitiesKernel.kernel.setArg(8, m_vertexData.m_clVertexForceAccumulator.getBuffer()); + + int numWorkItems = workGroupSize*((m_vertexData.getNumVertices() + (workGroupSize-1)) / workGroupSize); + cl_int err = m_queue.enqueueNDRangeKernel(updateVelocitiesFromPositionsWithVelocitiesKernel.kernel, cl::NullRange, cl::NDRange(numWorkItems), cl::NDRange(workGroupSize)); + if( err != CL_SUCCESS ) + { + btAssert( "enqueueNDRangeKernel(updateVelocitiesFromPositionsWithVelocitiesKernel)"); + } + +} // updateVelocitiesFromPositionsWithVelocities + +void btOpenCLSoftBodySolver::updateVelocitiesFromPositionsWithoutVelocities( float isolverdt ) +{ + updateVelocitiesFromPositionsWithoutVelocitiesKernel.kernel.setArg(0, m_vertexData.getNumVertices()); + updateVelocitiesFromPositionsWithoutVelocitiesKernel.kernel.setArg(1, isolverdt); + updateVelocitiesFromPositionsWithoutVelocitiesKernel.kernel.setArg(2, m_vertexData.m_clVertexPosition.getBuffer()); + updateVelocitiesFromPositionsWithoutVelocitiesKernel.kernel.setArg(3, m_vertexData.m_clVertexPreviousPosition.getBuffer()); + updateVelocitiesFromPositionsWithoutVelocitiesKernel.kernel.setArg(4, m_vertexData.m_clClothIdentifier.getBuffer()); + updateVelocitiesFromPositionsWithoutVelocitiesKernel.kernel.setArg(5, m_clPerClothDampingFactor.getBuffer()); + updateVelocitiesFromPositionsWithoutVelocitiesKernel.kernel.setArg(6, m_vertexData.m_clVertexVelocity.getBuffer()); + updateVelocitiesFromPositionsWithoutVelocitiesKernel.kernel.setArg(7, m_vertexData.m_clVertexForceAccumulator.getBuffer()); + + int numWorkItems = workGroupSize*((m_vertexData.getNumVertices() + (workGroupSize-1)) / workGroupSize); + cl_int err = m_queue.enqueueNDRangeKernel(updateVelocitiesFromPositionsWithoutVelocitiesKernel.kernel, cl::NullRange, cl::NDRange(numWorkItems), cl::NDRange(workGroupSize)); + if( err != CL_SUCCESS ) + { + btAssert( "enqueueNDRangeKernel(updateVelocitiesFromPositionsWithoutVelocitiesKernel)"); + } +} // updateVelocitiesFromPositionsWithoutVelocities + +// End kernel dispatches +///////////////////////////////////// + + +void btOpenCLSoftBodySolver::copySoftBodyToVertexBuffer( const btSoftBody * const softBody, btVertexBufferDescriptor *vertexBuffer ) +{ + // Currently only support CPU output buffers + // TODO: check for DX11 buffers. Take all offsets into the same DX11 buffer + // and use them together on a single kernel call if possible by setting up a + // per-cloth target buffer array for the copy kernel. + + btAcceleratedSoftBodyInterface *currentCloth = findSoftBodyInterface( softBody ); + + if( vertexBuffer->getBufferType() == btVertexBufferDescriptor::CPU_BUFFER ) + { + const int firstVertex = currentCloth->getFirstVertex(); + const int lastVertex = firstVertex + currentCloth->getNumVertices(); + const btCPUVertexBufferDescriptor *cpuVertexBuffer = static_cast< btCPUVertexBufferDescriptor* >(vertexBuffer); + float *basePointer = cpuVertexBuffer->getBasePointer(); + + if( vertexBuffer->hasVertexPositions() ) + { + const int vertexOffset = cpuVertexBuffer->getVertexOffset(); + const int vertexStride = cpuVertexBuffer->getVertexStride(); + float *vertexPointer = basePointer + vertexOffset; + + for( int vertexIndex = firstVertex; vertexIndex < lastVertex; ++vertexIndex ) + { + Vectormath::Aos::Point3 position = m_vertexData.getPosition(vertexIndex); + *(vertexPointer + 0) = position.getX(); + *(vertexPointer + 1) = position.getY(); + *(vertexPointer + 2) = position.getZ(); + vertexPointer += vertexStride; + } + } + if( vertexBuffer->hasNormals() ) + { + const int normalOffset = cpuVertexBuffer->getNormalOffset(); + const int normalStride = cpuVertexBuffer->getNormalStride(); + float *normalPointer = basePointer + normalOffset; + + for( int vertexIndex = firstVertex; vertexIndex < lastVertex; ++vertexIndex ) + { + Vectormath::Aos::Vector3 normal = m_vertexData.getNormal(vertexIndex); + *(normalPointer + 0) = normal.getX(); + *(normalPointer + 1) = normal.getY(); + *(normalPointer + 2) = normal.getZ(); + normalPointer += normalStride; + } + } + } +} // btCPUSoftBodySolver::outputToVertexBuffers + + +btOpenCLSoftBodySolver::KernelDesc btOpenCLSoftBodySolver::compileCLKernelFromString( const char *shaderString, const char *shaderName ) +{ + cl_int err; + + context = m_queue.getInfo(); + device = m_queue.getInfo(); + std::vector< cl::Device > devices; + devices.push_back( device ); + + cl::Program::Sources source(1, std::make_pair(shaderString, strlen(shaderString) + 1)); + cl::Program program(context, source, &err); + if( err != CL_SUCCESS ) + { + btAssert( "program" ); + } + err = program.build(devices); + if (err != CL_SUCCESS) { + //std::string str; + //str = program.getBuildInfo(devices[0]); + //std::cout << "Program Info: " << str; + if( err != CL_SUCCESS ) + { + btAssert( "Program::build()" ); + } + } + cl::Kernel kernel(program, shaderName, &err); + if( err != CL_SUCCESS ) + { + btAssert( "kernel" ); + } + + KernelDesc descriptor; + descriptor.kernel = kernel; + return descriptor; +} + +void btOpenCLSoftBodySolver::predictMotion( float timeStep ) +{ + // Fill the force arrays with current acceleration data etc + m_perClothWindVelocity.resize( m_softBodySet.size() ); + for( int softBodyIndex = 0; softBodyIndex < m_softBodySet.size(); ++softBodyIndex ) + { + btSoftBody *softBody = m_softBodySet[softBodyIndex]->getSoftBody(); + + m_perClothWindVelocity[softBodyIndex] = toVector3(softBody->getWindVelocity()); + } + m_clPerClothWindVelocity.changedOnCPU(); + + // Apply forces that we know about to the cloths + applyForces( timeStep * getTimeScale() ); + + // Itegrate motion for all soft bodies dealt with by the solver + integrate( timeStep * getTimeScale() ); + // End prediction work for solvers +} + + + +btOpenCLSoftBodySolver::btAcceleratedSoftBodyInterface *btOpenCLSoftBodySolver::findSoftBodyInterface( const btSoftBody* const softBody ) +{ + for( int softBodyIndex = 0; softBodyIndex < m_softBodySet.size(); ++softBodyIndex ) + { + btAcceleratedSoftBodyInterface *softBodyInterface = m_softBodySet[softBodyIndex]; + if( softBodyInterface->getSoftBody() == softBody ) + return softBodyInterface; + } + return 0; +} + + +bool btOpenCLSoftBodySolver::buildShaders() +{ + bool returnVal = true; + + if( m_shadersInitialized ) + return true; + + prepareLinksKernel = compileCLKernelFromString( PrepareLinksCLString, "PrepareLinksKernel" ); + updatePositionsFromVelocitiesKernel = compileCLKernelFromString( UpdatePositionsFromVelocitiesCLString, "UpdatePositionsFromVelocitiesKernel" ); + solvePositionsFromLinksKernel = compileCLKernelFromString( SolvePositionsCLString, "SolvePositionsFromLinksKernel" ); + updateVelocitiesFromPositionsWithVelocitiesKernel = compileCLKernelFromString( UpdateNodesCLString, "updateVelocitiesFromPositionsWithVelocitiesKernel" ); + updateVelocitiesFromPositionsWithoutVelocitiesKernel = compileCLKernelFromString( UpdatePositionsCLString, "updateVelocitiesFromPositionsWithoutVelocitiesKernel" ); + integrateKernel = compileCLKernelFromString( IntegrateCLString, "IntegrateKernel" ); + applyForcesKernel = compileCLKernelFromString( ApplyForcesCLString, "ApplyForcesKernel" ); + + // TODO: Rename to UpdateSoftBodies + resetNormalsAndAreasKernel = compileCLKernelFromString( UpdateNormalsCLString, "ResetNormalsAndAreasKernel" ); + normalizeNormalsAndAreasKernel = compileCLKernelFromString( UpdateNormalsCLString, "NormalizeNormalsAndAreasKernel" ); + updateSoftBodiesKernel = compileCLKernelFromString( UpdateNormalsCLString, "UpdateSoftBodiesKernel" ); + //outputToVertexArrayWithNormalsKernel = compileCLKernelFromString( OutputToVertexArrayCLString, "OutputToVertexArrayWithNormalsKernel" ); + //outputToVertexArrayWithoutNormalsKernel = compileCLKernelFromString( OutputToVertexArrayCLString, "OutputToVertexArrayWithoutNormalsKernel" ); + + + if( returnVal ) + m_shadersInitialized = true; + + return returnVal; +} \ No newline at end of file diff --git a/src/BulletMultiThreaded/GpuSoftBodySolvers/OpenCL/btSoftBodySolver_OpenCL.h b/src/BulletMultiThreaded/GpuSoftBodySolvers/OpenCL/btSoftBodySolver_OpenCL.h new file mode 100644 index 000000000..9fd86a854 --- /dev/null +++ b/src/BulletMultiThreaded/GpuSoftBodySolvers/OpenCL/btSoftBodySolver_OpenCL.h @@ -0,0 +1,377 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef BT_SOFT_BODY_SOLVER_OPENCL_H +#define BT_SOFT_BODY_SOLVER_OPENCL_H + +#include "BulletMultiThreaded/vectormath/scalar/cpp/vectormath_aos.h" +#include "BulletMultiThreaded/vectormath/scalar/cpp/mat_aos.h" +#include "BulletMultiThreaded/vectormath/scalar/cpp/vec_aos.h" + +#include "BulletSoftBody/btSoftBodySolvers.h" +#include "BulletSoftBody/solvers/OpenCL/btSoftBodySolverBuffer_OpenCL.h" +#include "BulletSoftBody/solvers/OpenCL/btSoftBodySolverLinkData_OpenCL.h" +#include "BulletSoftBody/solvers/OpenCL/btSoftBodySolverVertexData_OpenCL.h" +#include "BulletSoftBody/solvers/OpenCL/btSoftBodySolverTriangleData_OpenCL.h" + + +class btOpenCLSoftBodySolver : public btSoftBodySolver +{ +private: + /** + * SoftBody class to maintain information about a soft body instance + * within a solver. + * This data addresses the main solver arrays. + */ + class btAcceleratedSoftBodyInterface + { + protected: + /** Current number of vertices that are part of this cloth */ + int m_numVertices; + /** Maximum number of vertices allocated to be part of this cloth */ + int m_maxVertices; + /** Current number of triangles that are part of this cloth */ + int m_numTriangles; + /** Maximum number of triangles allocated to be part of this cloth */ + int m_maxTriangles; + /** Index of first vertex in the world allocated to this cloth */ + int m_firstVertex; + /** Index of first triangle in the world allocated to this cloth */ + int m_firstTriangle; + /** Index of first link in the world allocated to this cloth */ + int m_firstLink; + /** Maximum number of links allocated to this cloth */ + int m_maxLinks; + /** Current number of links allocated to this cloth */ + int m_numLinks; + + /** The actual soft body this data represents */ + btSoftBody *m_softBody; + + + public: + btAcceleratedSoftBodyInterface( btSoftBody *softBody ) : + m_softBody( softBody ) + { + m_numVertices = 0; + m_maxVertices = 0; + m_numTriangles = 0; + m_maxTriangles = 0; + m_firstVertex = 0; + m_firstTriangle = 0; + m_firstLink = 0; + m_maxLinks = 0; + m_numLinks = 0; + } + int getNumVertices() + { + return m_numVertices; + } + + int getNumTriangles() + { + return m_numTriangles; + } + + int getMaxVertices() + { + return m_maxVertices; + } + + int getMaxTriangles() + { + return m_maxTriangles; + } + + int getFirstVertex() + { + return m_firstVertex; + } + + int getFirstTriangle() + { + return m_firstTriangle; + } + + // TODO: All of these set functions will have to do checks and + // update the world because restructuring of the arrays will be necessary + // Reasonable use of "friend"? + void setNumVertices( int numVertices ) + { + m_numVertices = numVertices; + } + + void setNumTriangles( int numTriangles ) + { + m_numTriangles = numTriangles; + } + + void setMaxVertices( int maxVertices ) + { + m_maxVertices = maxVertices; + } + + void setMaxTriangles( int maxTriangles ) + { + m_maxTriangles = maxTriangles; + } + + void setFirstVertex( int firstVertex ) + { + m_firstVertex = firstVertex; + } + + void setFirstTriangle( int firstTriangle ) + { + m_firstTriangle = firstTriangle; + } + + void setMaxLinks( int maxLinks ) + { + m_maxLinks = maxLinks; + } + + void setNumLinks( int numLinks ) + { + m_numLinks = numLinks; + } + + void setFirstLink( int firstLink ) + { + m_firstLink = firstLink; + } + + int getMaxLinks() + { + return m_maxLinks; + } + + int getNumLinks() + { + return m_numLinks; + } + + int getFirstLink() + { + return m_firstLink; + } + + btSoftBody* getSoftBody() + { + return m_softBody; + } + + #if 0 + void setAcceleration( Vectormath::Aos::Vector3 acceleration ) + { + m_currentSolver->setPerClothAcceleration( m_clothIdentifier, acceleration ); + } + + void setWindVelocity( Vectormath::Aos::Vector3 windVelocity ) + { + m_currentSolver->setPerClothWindVelocity( m_clothIdentifier, windVelocity ); + } + + /** + * Set the density of the air in which the cloth is situated. + */ + void setAirDensity( btScalar density ) + { + m_currentSolver->setPerClothMediumDensity( m_clothIdentifier, static_cast(density) ); + } + + /** + * Add a collision object to this soft body. + */ + void addCollisionObject( btCollisionObject *collisionObject ) + { + m_currentSolver->addCollisionObjectForSoftBody( m_clothIdentifier, collisionObject ); + } + #endif + }; + + + class KernelDesc + { + protected: + public: + cl::Kernel kernel; + + KernelDesc() + { + } + + virtual ~KernelDesc() + { + } + }; + + btSoftBodyLinkDataOpenCL m_linkData; + btSoftBodyVertexDataOpenCL m_vertexData; + btSoftBodyTriangleDataOpenCL m_triangleData; + + /** Variable to define whether we need to update solver constants on the next iteration */ + bool m_updateSolverConstants; + + bool m_shadersInitialized; + + /** + * Cloths owned by this solver. + * Only our cloths are in this array. + */ + btAlignedObjectArray< btAcceleratedSoftBodyInterface * > m_softBodySet; + + /** Acceleration value to be applied to all non-static vertices in the solver. + * Index n is cloth n, array sized by number of cloths in the world not the solver. + */ + btAlignedObjectArray< Vectormath::Aos::Vector3 > m_perClothAcceleration; + btOpenCLBuffer m_clPerClothAcceleration; + + /** Wind velocity to be applied normal to all non-static vertices in the solver. + * Index n is cloth n, array sized by number of cloths in the world not the solver. + */ + btAlignedObjectArray< Vectormath::Aos::Vector3 > m_perClothWindVelocity; + btOpenCLBuffer m_clPerClothWindVelocity; + + /** Velocity damping factor */ + btAlignedObjectArray< float > m_perClothDampingFactor; + btOpenCLBuffer m_clPerClothDampingFactor; + + /** Velocity correction coefficient */ + btAlignedObjectArray< float > m_perClothVelocityCorrectionCoefficient; + btOpenCLBuffer m_clPerClothVelocityCorrectionCoefficient; + + /** Lift parameter for wind effect on cloth. */ + btAlignedObjectArray< float > m_perClothLiftFactor; + btOpenCLBuffer m_clPerClothLiftFactor; + + /** Drag parameter for wind effect on cloth. */ + btAlignedObjectArray< float > m_perClothDragFactor; + btOpenCLBuffer m_clPerClothDragFactor; + + /** Density of the medium in which each cloth sits */ + btAlignedObjectArray< float > m_perClothMediumDensity; + btOpenCLBuffer m_clPerClothMediumDensity; + + KernelDesc prepareLinksKernel; + KernelDesc solvePositionsFromLinksKernel; + KernelDesc updateConstantsKernel; + KernelDesc integrateKernel; + KernelDesc addVelocityKernel; + KernelDesc updatePositionsFromVelocitiesKernel; + KernelDesc updateVelocitiesFromPositionsWithoutVelocitiesKernel; + KernelDesc updateVelocitiesFromPositionsWithVelocitiesKernel; + KernelDesc vSolveLinksKernel; + KernelDesc resetNormalsAndAreasKernel; + KernelDesc normalizeNormalsAndAreasKernel; + KernelDesc updateSoftBodiesKernel; + KernelDesc outputToVertexArrayWithNormalsKernel; + KernelDesc outputToVertexArrayWithoutNormalsKernel; + + KernelDesc outputToVertexArrayKernel; + KernelDesc applyForcesKernel; + KernelDesc collideSphereKernel; + KernelDesc collideCylinderKernel; + + static const int workGroupSize = 128; + + cl::CommandQueue m_queue; + cl::Context context; + cl::Device device; + + + /** + * Compile a compute shader kernel from a string and return the appropriate KernelDesc object. + */ + KernelDesc compileCLKernelFromString( const char *shaderString, const char *shaderName ); + + bool buildShaders(); + + void resetNormalsAndAreas( int numVertices ); + + void normalizeNormalsAndAreas( int numVertices ); + + void executeUpdateSoftBodies( int firstTriangle, int numTriangles ); + + Vectormath::Aos::Vector3 ProjectOnAxis( const Vectormath::Aos::Vector3 &v, const Vectormath::Aos::Vector3 &a ); + + void ApplyClampedForce( float solverdt, const Vectormath::Aos::Vector3 &force, const Vectormath::Aos::Vector3 &vertexVelocity, float inverseMass, Vectormath::Aos::Vector3 &vertexForce ); + + btAcceleratedSoftBodyInterface *findSoftBodyInterface( const btSoftBody* const softBody ); + + virtual void applyForces( float solverdt ); + + /** + * Integrate motion on the solver. + */ + virtual void integrate( float solverdt ); + + void updateConstants( float timeStep ); + + float computeTriangleArea( + const Vectormath::Aos::Point3 &vertex0, + const Vectormath::Aos::Point3 &vertex1, + const Vectormath::Aos::Point3 &vertex2 ); + + + ////////////////////////////////////// + // Kernel dispatches + void prepareLinks(); + + void solveLinksForVelocity( int startLink, int numLinks, float kst ); + + void updatePositionsFromVelocities( float solverdt ); + + void solveLinksForPosition( int startLink, int numLinks, float kst, float ti ); + + void updateVelocitiesFromPositionsWithVelocities( float isolverdt ); + + void updateVelocitiesFromPositionsWithoutVelocities( float isolverdt ); + + // End kernel dispatches + ///////////////////////////////////// + + +public: + btOpenCLSoftBodySolver(const cl::CommandQueue &queue); + + virtual ~btOpenCLSoftBodySolver(); + + + + + virtual btSoftBodyLinkData &getLinkData(); + + virtual btSoftBodyVertexData &getVertexData(); + + virtual btSoftBodyTriangleData &getTriangleData(); + + + + + virtual bool checkInitialized(); + + virtual void updateSoftBodies( ); + + virtual void optimize( btAlignedObjectArray< btSoftBody * > &softBodies ); + + virtual void solveConstraints( float solverdt ); + + virtual void predictMotion( float solverdt ); + + virtual void copySoftBodyToVertexBuffer( const btSoftBody *const softBody, btVertexBufferDescriptor *vertexBuffer ); +}; // btOpenCLSoftBodySolver + +#endif #ifndef BT_SOFT_BODY_SOLVER_OPENCL_H \ No newline at end of file