Browse Source

allow custom shaders for directX11

Kolja Strohm 1 year ago
parent
commit
ede3baa968
14 changed files with 9076 additions and 2926 deletions
  1. 9 0
      Bildschirm.cpp
  2. 1 0
      Bildschirm.h
  3. 935 914
      DX11GraphicsApi.cpp
  4. 27 26
      DX11VertexShader.hlsl
  5. 971 967
      DX12GraphicsApi.cpp
  6. 3282 242
      DX12VertexShader.h
  7. 38 37
      DX12VertexShader.hlsl
  8. 67 67
      DXBuffer.h
  9. 200 196
      GraphicsApi.h
  10. 8 0
      Model3D.cpp
  11. 6 0
      Model3D.h
  12. 119 107
      Shader.cpp
  13. 117 115
      Shader.h
  14. 3296 255
      UIVertexShader.h

+ 9 - 0
Bildschirm.cpp

@@ -455,6 +455,15 @@ Bildschirm3D::Bildschirm3D(WFenster* fenster, GraphicApiType apiTyp)
 	api->initialize(dynamic_cast<WFenster*>(fenster->getThis()), fenster->getKörperGröße(), 0);
 }
 
+Bildschirm3D::Bildschirm3D(WFenster* fenster, GraphicsApi* api)
+	: Bildschirm(fenster),
+	kameras(new RCArray< Kam3D >()),
+	rend3D(0)
+{
+	this->api = api;
+	api->initialize(dynamic_cast<WFenster*>(fenster->getThis()), fenster->getKörperGröße(), 0);
+}
+
 // Destruktor 
 Bildschirm3D::~Bildschirm3D()
 {

+ 1 - 0
Bildschirm.h

@@ -203,6 +203,7 @@ namespace Framework
 		//! \param fenster Das Fenster, dessen Inhalt verwaltet werden soll
 		DLLEXPORT Bildschirm3D(WFenster* fenster);
 		DLLEXPORT Bildschirm3D(WFenster* fenster, GraphicApiType apiTyp);
+		DLLEXPORT Bildschirm3D(WFenster* fenster, GraphicsApi* api);
 		//! Destruktor 
 		DLLEXPORT virtual ~Bildschirm3D();
 		//! Fügt dem Bildschirm eine Kamera hinzu

+ 935 - 914
DX11GraphicsApi.cpp

@@ -21,983 +21,1004 @@ using namespace Framework;
 
 struct TexturEffect
 {
-    bool enabled;
-    float percentage;
+	bool enabled;
+	float percentage;
 };
 
 DirectX11::DirectX11()
-    : GraphicsApi( DIRECTX11 ),
-    d3d11Device( 0 ),
-    d3d11Context( 0 ),
-    d3d11SpawChain( 0 ),
-    uiTextur( 0 ),
-    vertexShader( 0 ),
-    pixelShader( 0 ),
-    sampleState( 0 ),
-    rtview( 0 ),
-    dsView( 0 ),
-    depthStencilBuffer( 0 ),
-    depthStencilState( 0 ),
-    depthDisabledStencilState( 0 ),
-    blendStateAlphaBlend( 0 ),
-    vp( 0 ),
-    texturModel( 0 ),
-    texturRegister( new TexturList() ),
-    texturRS( 0 ),
-    meshRS( 0 ),
-    defaultTextur( 0 ),
-    diffuseLights( 0 ),
-    pointLights( 0 )
+	: GraphicsApi(DIRECTX11),
+	d3d11Device(0),
+	d3d11Context(0),
+	d3d11SpawChain(0),
+	uiTextur(0),
+	vertexShader(0),
+	pixelShader(0),
+	sampleState(0),
+	rtview(0),
+	dsView(0),
+	depthStencilBuffer(0),
+	depthStencilState(0),
+	depthDisabledStencilState(0),
+	blendStateAlphaBlend(0),
+	vp(0),
+	texturModel(0),
+	texturRegister(new TexturList()),
+	texturRS(0),
+	meshRS(0),
+	defaultTextur(0),
+	diffuseLights(0),
+	pointLights(0)
 {}
 
 DirectX11::~DirectX11()
 {
-    if( diffuseLights )
-        diffuseLights->release();
-    if( pointLights )
-        pointLights->release();
-    if( defaultTextur )
-        defaultTextur->release();
-    if( texturRS )
-        texturRS->Release();
-    if( meshRS )
-        meshRS->Release();
-    if( texturModel )
-        texturModel->release();
-    texturRegister->release();
-    if( blendStateAlphaBlend )
-    {
-        blendStateAlphaBlend->Release();
-        blendStateAlphaBlend = NULL;
-    }
-    if( uiTextur )
-    {
-        uiTextur->release();
-        uiTextur = NULL;
-    }
-    if( sampleState )
-    {
-        sampleState->Release();
-        sampleState = NULL;
-    }
-    if( pixelShader )
-    {
-        pixelShader->release();
-        pixelShader = NULL;
-    }
-    if( vertexShader )
-    {
-        vertexShader->release();
-        vertexShader = NULL;
-    }
-    if( depthDisabledStencilState )
-    {
-        depthDisabledStencilState->Release();
-        depthDisabledStencilState = NULL;
-    }
-    delete vp;
-    vp = 0;
-    if( dsView )
-    {
-        dsView->Release();
-        dsView = NULL;
-    }
-    if( depthStencilState )
-    {
-        depthStencilState->Release();
-        depthStencilState = NULL;
-    }
-    if( depthStencilBuffer )
-    {
-        depthStencilBuffer->Release();
-        depthStencilBuffer = NULL;
-    }
-    if( rtview )
-    {
-        rtview->Release();
-        rtview = NULL;
-    }
-    if( d3d11SpawChain )
-    {
-        d3d11SpawChain->Release();
-        d3d11SpawChain = NULL;
-    }
-    if( d3d11Device )
-    {
-        d3d11Device->Release();
-        d3d11Device = NULL;
-    }
-    if( d3d11Context )
-    {
-        d3d11Context->Release();
-        d3d11Context = NULL;
-        getDLLRegister()->releaseDLL( "d3d11.dll" );
-    }
+	if (diffuseLights)
+		diffuseLights->release();
+	if (pointLights)
+		pointLights->release();
+	if (defaultTextur)
+		defaultTextur->release();
+	if (texturRS)
+		texturRS->Release();
+	if (meshRS)
+		meshRS->Release();
+	if (texturModel)
+		texturModel->release();
+	texturRegister->release();
+	if (blendStateAlphaBlend)
+	{
+		blendStateAlphaBlend->Release();
+		blendStateAlphaBlend = NULL;
+	}
+	if (uiTextur)
+	{
+		uiTextur->release();
+		uiTextur = NULL;
+	}
+	if (sampleState)
+	{
+		sampleState->Release();
+		sampleState = NULL;
+	}
+	if (pixelShader)
+	{
+		pixelShader->release();
+		pixelShader = NULL;
+	}
+	if (vertexShader)
+	{
+		vertexShader->release();
+		vertexShader = NULL;
+	}
+	if (depthDisabledStencilState)
+	{
+		depthDisabledStencilState->Release();
+		depthDisabledStencilState = NULL;
+	}
+	delete vp;
+	vp = 0;
+	if (dsView)
+	{
+		dsView->Release();
+		dsView = NULL;
+	}
+	if (depthStencilState)
+	{
+		depthStencilState->Release();
+		depthStencilState = NULL;
+	}
+	if (depthStencilBuffer)
+	{
+		depthStencilBuffer->Release();
+		depthStencilBuffer = NULL;
+	}
+	if (rtview)
+	{
+		rtview->Release();
+		rtview = NULL;
+	}
+	if (d3d11SpawChain)
+	{
+		d3d11SpawChain->Release();
+		d3d11SpawChain = NULL;
+	}
+	if (d3d11Device)
+	{
+		d3d11Device->Release();
+		d3d11Device = NULL;
+	}
+	if (d3d11Context)
+	{
+		d3d11Context->Release();
+		d3d11Context = NULL;
+		getDLLRegister()->releaseDLL("d3d11.dll");
+	}
 }
 
-typedef HRESULT( __stdcall* D3D11CreateDeviceAndSwapChainFunction )(IDXGIAdapter*, D3D_DRIVER_TYPE,
-                                                                     HMODULE, UINT, const D3D_FEATURE_LEVEL*,
-                                                                     UINT, UINT, const DXGI_SWAP_CHAIN_DESC*,
-                                                                     IDXGISwapChain**, ID3D11Device**,
-                                                                     D3D_FEATURE_LEVEL*, ID3D11DeviceContext**);
+typedef HRESULT(__stdcall* D3D11CreateDeviceAndSwapChainFunction)(IDXGIAdapter*, D3D_DRIVER_TYPE,
+	HMODULE, UINT, const D3D_FEATURE_LEVEL*,
+	UINT, UINT, const DXGI_SWAP_CHAIN_DESC*,
+	IDXGISwapChain**, ID3D11Device**,
+	D3D_FEATURE_LEVEL*, ID3D11DeviceContext**);
 
-void DirectX11::initialize( WFenster* fenster, Vec2<int> backBufferSize, bool fullScreen )
+void DirectX11::initialize(WFenster* fenster, Vec2<int> backBufferSize, bool fullScreen)
 {
-    if( d3d11Device )
-        return GraphicsApi::initialize( fenster, backBufferSize, fullScreen );
-    GraphicsApi::initialize( fenster, backBufferSize, fullScreen );
-    //--------------------------------------------------------------------
-    // Create Device
-
-    HINSTANCE dll = getDLLRegister()->ladeDLL( "d3d11.dll", "d3d11.dll" );
-    if( !dll )
-    {
-        WMessageBox( fenster->getFensterHandle(), new Text( "Fehler" ), new Text( "DirectX 11 konnte nicht gefunden werden." ), MB_ICONERROR );
-        return;
-    }
-    D3D11CreateDeviceAndSwapChainFunction createDeviceAndSwapChain = (D3D11CreateDeviceAndSwapChainFunction)GetProcAddress( dll, "D3D11CreateDeviceAndSwapChain" );
-    if( !createDeviceAndSwapChain )
-    {
-        getDLLRegister()->releaseDLL( "d3d11.dll" );
-        WMessageBox( fenster->getFensterHandle(), new Text( "Fehler" ), new Text( "Der Einstiegspunkt D3D11CreateDeviceAndSwapChain fon DirectX 11 konnte nicht gefunden werden." ), MB_ICONERROR );
-        return;
-    }
-
-    // create a struct to hold information about the swap chain
-    DXGI_SWAP_CHAIN_DESC scd;
-
-    // clear out the struct for use
-    ZeroMemory( &scd, sizeof( DXGI_SWAP_CHAIN_DESC ) );
-
-    scd.Windowed = !fullScreen;
-    scd.BufferCount = 2;
-    scd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
-    scd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
-    scd.SampleDesc.Count = 1;      //multisampling setting
-    scd.SampleDesc.Quality = 0;    //vendor-specific flag
-    scd.SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL;
-    scd.OutputWindow = fenster ? fenster->getFensterHandle() : 0;
-    scd.BufferDesc.Width = this->backBufferSize.x;
-    scd.BufferDesc.Height = this->backBufferSize.y;                 // windowed/full-screen mode
-
-    D3D_FEATURE_LEVEL featureLevel = D3D_FEATURE_LEVEL_11_0;
-    D3D_FEATURE_LEVEL support = D3D_FEATURE_LEVEL_11_0;
-    // create a device, device context and swap chain using the information in the scd struct
-    UINT flag = 0;
+	if (d3d11Device)
+		return GraphicsApi::initialize(fenster, backBufferSize, fullScreen);
+	GraphicsApi::initialize(fenster, backBufferSize, fullScreen);
+	//--------------------------------------------------------------------
+	// Create Device
+
+	HINSTANCE dll = getDLLRegister()->ladeDLL("d3d11.dll", "d3d11.dll");
+	if (!dll)
+	{
+		WMessageBox(fenster->getFensterHandle(), new Text("Fehler"), new Text("DirectX 11 konnte nicht gefunden werden."), MB_ICONERROR);
+		return;
+	}
+	D3D11CreateDeviceAndSwapChainFunction createDeviceAndSwapChain = (D3D11CreateDeviceAndSwapChainFunction)GetProcAddress(dll, "D3D11CreateDeviceAndSwapChain");
+	if (!createDeviceAndSwapChain)
+	{
+		getDLLRegister()->releaseDLL("d3d11.dll");
+		WMessageBox(fenster->getFensterHandle(), new Text("Fehler"), new Text("Der Einstiegspunkt D3D11CreateDeviceAndSwapChain fon DirectX 11 konnte nicht gefunden werden."), MB_ICONERROR);
+		return;
+	}
+
+	// create a struct to hold information about the swap chain
+	DXGI_SWAP_CHAIN_DESC scd;
+
+	// clear out the struct for use
+	ZeroMemory(&scd, sizeof(DXGI_SWAP_CHAIN_DESC));
+
+	scd.Windowed = !fullScreen;
+	scd.BufferCount = 2;
+	scd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
+	scd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
+	scd.SampleDesc.Count = 1;      //multisampling setting
+	scd.SampleDesc.Quality = 0;    //vendor-specific flag
+	scd.SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL;
+	scd.OutputWindow = fenster ? fenster->getFensterHandle() : 0;
+	scd.BufferDesc.Width = this->backBufferSize.x;
+	scd.BufferDesc.Height = this->backBufferSize.y;                 // windowed/full-screen mode
+
+	D3D_FEATURE_LEVEL featureLevel = D3D_FEATURE_LEVEL_11_0;
+	D3D_FEATURE_LEVEL support = D3D_FEATURE_LEVEL_11_0;
+	// create a device, device context and swap chain using the information in the scd struct
+	UINT flag = 0;
 #ifdef _DEBUG
-    if( debugDX )
-        flag |= D3D11_CREATE_DEVICE_DEBUG;
+	if (debugDX)
+		flag |= D3D11_CREATE_DEVICE_DEBUG;
 #endif
-    HRESULT result = createDeviceAndSwapChain( NULL,
-                                               D3D_DRIVER_TYPE_HARDWARE,
-                                               NULL,
-                                               flag,
-                                               &featureLevel,
-                                               1,
-                                               D3D11_SDK_VERSION,
-                                               &scd,
-                                               &d3d11SpawChain,
-                                               &d3d11Device,
-                                               &support,
-                                               &d3d11Context );
-    if( result != S_OK )
-    {
-        getDLLRegister()->releaseDLL( "d3d11.dll" );
-        std::cout << "ERROR: D3D11CreateDeviceAndSwapChain returned " << result << "\n";
-        WMessageBox( fenster->getFensterHandle(), new Text( "Fehler" ), new Text( "DirectX 11 konnte nicht initialisiert werden." ), MB_ICONERROR );
-        return;
-    }
-    ID3D11Texture2D* backBufferPtr;
-    // Get the pointer to the back buffer.
-    result = d3d11SpawChain->GetBuffer( 0, __uuidof(ID3D11Texture2D), (LPVOID*)&backBufferPtr );
-    if( result != S_OK )
-    {
-        std::cout << "ERROR: d3d11SpawChain->GetBuffer returned " << result << "\n";
-        WMessageBox( fenster->getFensterHandle(), new Text( "Fehler" ), new Text( "DirectX 11 konnte nicht initialisiert werden." ), MB_ICONERROR );
-        return;
-    }
-
-    vp = new D3D11_VIEWPORT();
-    memset( vp, 0, sizeof( D3D11_VIEWPORT ) );
-    vp->Width = (float)this->backBufferSize.x;
-    vp->Height = (float)this->backBufferSize.y;
-    vp->MinDepth = 0.0f;
-    vp->MaxDepth = 1.0f;
-    d3d11Context->RSSetViewports( 1, vp );
-
-    // Create the render target view with the back buffer pointer.
-    result = d3d11Device->CreateRenderTargetView( backBufferPtr, NULL, &rtview );
-    if( result != S_OK )
-    {
-        std::cout << "ERROR: d3d11Device->CreateRenderTargetView returned " << result << "\n";
-        WMessageBox( fenster->getFensterHandle(), new Text( "Fehler" ), new Text( "DirectX 11 konnte nicht initialisiert werden." ), MB_ICONERROR );
-        return;
-    }
-    // Release pointer to the back buffer as we no longer need it.
-    backBufferPtr->Release();
-    // Initialize the description of the depth buffer.
-    D3D11_TEXTURE2D_DESC depthBufferDesc;
-    ZeroMemory( &depthBufferDesc, sizeof( depthBufferDesc ) );
-    // Set up the description of the depth buffer.
-    depthBufferDesc.Width = this->backBufferSize.x;
-    depthBufferDesc.Height = this->backBufferSize.y;
-    depthBufferDesc.MipLevels = 1;
-    depthBufferDesc.ArraySize = 1;
-    depthBufferDesc.Format = DXGI_FORMAT_D24_UNORM_S8_UINT;
-    depthBufferDesc.SampleDesc.Count = 1;
-    depthBufferDesc.Usage = D3D11_USAGE_DEFAULT;
-    depthBufferDesc.BindFlags = D3D11_BIND_DEPTH_STENCIL;
-    // Create the texture for the depth buffer using the filled out description.
-    result = d3d11Device->CreateTexture2D( &depthBufferDesc, NULL, &depthStencilBuffer );
-    if( result != S_OK )
-    {
-        std::cout << "ERROR: d3d11Device->CreateTexture2D returned " << result << "\n";
-        WMessageBox( fenster->getFensterHandle(), new Text( "Fehler" ), new Text( "DirectX 11 konnte nicht initialisiert werden." ), MB_ICONERROR );
-        return;
-    }
-    // Initialize the description of the stencil state.
-    D3D11_DEPTH_STENCIL_DESC depthStencilDesc;
-    ZeroMemory( &depthStencilDesc, sizeof( depthStencilDesc ) );
-
-    // Set up the description of the stencil state.
-    depthStencilDesc.DepthEnable = true;
-    depthStencilDesc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ALL;
-    depthStencilDesc.DepthFunc = D3D11_COMPARISON_LESS_EQUAL;
-    depthStencilDesc.StencilEnable = true;
-    depthStencilDesc.StencilReadMask = 0xFF;
-    depthStencilDesc.StencilWriteMask = 0xFF;
-    // Stencil operations if pixel is front-facing.
-    depthStencilDesc.FrontFace.StencilFailOp = D3D11_STENCIL_OP_KEEP;
-    depthStencilDesc.FrontFace.StencilDepthFailOp = D3D11_STENCIL_OP_DECR;
-    depthStencilDesc.FrontFace.StencilPassOp = D3D11_STENCIL_OP_KEEP;
-    depthStencilDesc.FrontFace.StencilFunc = D3D11_COMPARISON_ALWAYS;
-    // Stencil operations if pixel is back-facing.
-    depthStencilDesc.BackFace.StencilFailOp = D3D11_STENCIL_OP_KEEP;
-    depthStencilDesc.BackFace.StencilDepthFailOp = D3D11_STENCIL_OP_INCR;
-    depthStencilDesc.BackFace.StencilPassOp = D3D11_STENCIL_OP_KEEP;
-    depthStencilDesc.BackFace.StencilFunc = D3D11_COMPARISON_ALWAYS;
-    // Create the depth stencil state.
-    result = d3d11Device->CreateDepthStencilState( &depthStencilDesc, &depthStencilState );
-    if( result != S_OK )
-    {
-        std::cout << "ERROR: d3d11Device->CreateDepthStencilState returned " << result << "\n";
-        WMessageBox( fenster->getFensterHandle(), new Text( "Fehler" ), new Text( "DirectX 11 konnte nicht initialisiert werden." ), MB_ICONERROR );
-        return;
-    }
-    d3d11Context->OMSetDepthStencilState( depthStencilState, 1 );
-
-    // Initialize the depth stencil view.
-    D3D11_DEPTH_STENCIL_VIEW_DESC depthStencilViewDesc;
-    ZeroMemory( &depthStencilViewDesc, sizeof( depthStencilViewDesc ) );
-
-    // Set up the depth stencil view description.
-    depthStencilViewDesc.Format = DXGI_FORMAT_D24_UNORM_S8_UINT;
-    depthStencilViewDesc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D;
-
-    // Create the depth stencil view.
-    result = d3d11Device->CreateDepthStencilView( depthStencilBuffer, &depthStencilViewDesc, &dsView );
-    if( result != S_OK )
-    {
-        std::cout << "ERROR: d3d11Device->CreateDepthStencilView returned " << result << "\n";
-        WMessageBox( fenster->getFensterHandle(), new Text( "Fehler" ), new Text( "DirectX 11 konnte nicht initialisiert werden." ), MB_ICONERROR );
-        return;
-    }
-    d3d11Context->OMSetRenderTargets( 1, &rtview, dsView );
-
-    D3D11_DEPTH_STENCIL_DESC depthDisabledStencilDesc;
-    // Clear the second depth stencil state before setting the parameters.
-    ZeroMemory( &depthDisabledStencilDesc, sizeof( depthDisabledStencilDesc ) );
-
-    // Now create a second depth stencil state which turns off the Z buffer for 2D rendering.  The only difference is 
-    // that DepthEnable is set to false, all other parameters are the same as the other depth stencil state.
-    depthDisabledStencilDesc.DepthEnable = false;
-    depthDisabledStencilDesc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ALL;
-    depthDisabledStencilDesc.DepthFunc = D3D11_COMPARISON_LESS;
-    depthDisabledStencilDesc.StencilEnable = true;
-    depthDisabledStencilDesc.StencilReadMask = 0xFF;
-    depthDisabledStencilDesc.StencilWriteMask = 0xFF;
-    depthDisabledStencilDesc.FrontFace.StencilFailOp = D3D11_STENCIL_OP_KEEP;
-    depthDisabledStencilDesc.FrontFace.StencilDepthFailOp = D3D11_STENCIL_OP_INCR;
-    depthDisabledStencilDesc.FrontFace.StencilPassOp = D3D11_STENCIL_OP_KEEP;
-    depthDisabledStencilDesc.FrontFace.StencilFunc = D3D11_COMPARISON_ALWAYS;
-    depthDisabledStencilDesc.BackFace.StencilFailOp = D3D11_STENCIL_OP_KEEP;
-    depthDisabledStencilDesc.BackFace.StencilDepthFailOp = D3D11_STENCIL_OP_DECR;
-    depthDisabledStencilDesc.BackFace.StencilPassOp = D3D11_STENCIL_OP_KEEP;
-    depthDisabledStencilDesc.BackFace.StencilFunc = D3D11_COMPARISON_ALWAYS;
-
-    // Create the state using the device.
-    result = d3d11Device->CreateDepthStencilState( &depthDisabledStencilDesc, &depthDisabledStencilState );
-    if( result != S_OK )
-    {
-        std::cout << "ERROR: d3d11Device->CreateDepthStencilState returned " << result << "\n";
-        WMessageBox( fenster->getFensterHandle(), new Text( "Fehler" ), new Text( "DirectX 11 konnte nicht initialisiert werden." ), MB_ICONERROR );
-        return;
-    }
-    //-------------------------------------------------
-    // Shaders
-    vertexShader = new DX11VertexShader( d3d11Device, d3d11Context );
-    vertexShader->setCompiledByteArray( (unsigned char*)UIVertexShader, sizeof( UIVertexShader ) );
-
-    pixelShader = new DX11PixelShader( d3d11Device, d3d11Context );
-    pixelShader->setCompiledByteArray( (unsigned char*)UIPixelShader, sizeof( UIPixelShader ) );
-
-    D3D11_INPUT_ELEMENT_DESC polygonLayout[ 4 ];
-    // Create the vertex input layout description.
-    // This setup needs to match the VertexType stucture in the ModelClass and in the shader.
-    polygonLayout[ 0 ].SemanticName = "POSITION";
-    polygonLayout[ 0 ].SemanticIndex = 0;
-    polygonLayout[ 0 ].Format = DXGI_FORMAT_R32G32B32_FLOAT;
-    polygonLayout[ 0 ].InputSlot = 0;
-    polygonLayout[ 0 ].AlignedByteOffset = 0;
-    polygonLayout[ 0 ].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA;
-    polygonLayout[ 0 ].InstanceDataStepRate = 0;
-
-    polygonLayout[ 1 ].SemanticName = "TEXCOORD";
-    polygonLayout[ 1 ].SemanticIndex = 0;
-    polygonLayout[ 1 ].Format = DXGI_FORMAT_R32G32_FLOAT;
-    polygonLayout[ 1 ].InputSlot = 0;
-    polygonLayout[ 1 ].AlignedByteOffset = D3D11_APPEND_ALIGNED_ELEMENT;
-    polygonLayout[ 1 ].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA;
-    polygonLayout[ 1 ].InstanceDataStepRate = 0;
-
-    polygonLayout[ 2 ].SemanticName = "NORMAL";
-    polygonLayout[ 2 ].SemanticIndex = 0;
-    polygonLayout[ 2 ].Format = DXGI_FORMAT_R32G32B32_FLOAT;
-    polygonLayout[ 2 ].InputSlot = 0;
-    polygonLayout[ 2 ].AlignedByteOffset = D3D11_APPEND_ALIGNED_ELEMENT;
-    polygonLayout[ 2 ].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA;
-    polygonLayout[ 2 ].InstanceDataStepRate = 0;
-
-    polygonLayout[ 3 ].SemanticName = "KNOCHEN_ID";
-    polygonLayout[ 3 ].SemanticIndex = 0;
-    polygonLayout[ 3 ].Format = DXGI_FORMAT_R32_UINT;
-    polygonLayout[ 3 ].InputSlot = 0;
-    polygonLayout[ 3 ].AlignedByteOffset = D3D11_APPEND_ALIGNED_ELEMENT;
-    polygonLayout[ 3 ].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA;
-    polygonLayout[ 3 ].InstanceDataStepRate = 0;
-
-    vertexShader->erstelleInputLayout( polygonLayout, 4 );
-    vertexShader->erstelleConstBuffer( sizeof( Mat4< float > ) * MAX_KNOCHEN_ANZ, 0 ); // matrizen für skelett annimationen
-    vertexShader->erstelleConstBuffer( sizeof( Mat4< float > ) * 2, 1 ); // View and Projection Matrix
-
-    pixelShader->erstelleConstBuffer( sizeof( float ) * 3, 0 ); // Kamera Position
-    pixelShader->erstelleConstBuffer( sizeof( float ) * 3, 1 ); // materialkonstanten nach phong model
-    pixelShader->erstelleConstBuffer( sizeof( int ) * 2, 2 );
-    pixelShader->erstelleConstBuffer( sizeof( TexturEffect ), 3 );
-    // TODO: Remove Following Test Code
-    int lc[] = { 0, 0 };
-    pixelShader->füllConstBuffer( (char*)lc, 2, sizeof( int ) * 2 );
-    TexturEffect e = { 0, 0.f };
-    pixelShader->füllConstBuffer( (char*)&e, 3, sizeof( TexturEffect ) );
-
-
-    // Create a texture sampler state description.
-    D3D11_SAMPLER_DESC samplerDesc;
-    samplerDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR;
-    samplerDesc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP;
-    samplerDesc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP;
-    samplerDesc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP;
-    samplerDesc.MipLODBias = 0.0f;
-    samplerDesc.MaxAnisotropy = 1;
-    samplerDesc.ComparisonFunc = D3D11_COMPARISON_ALWAYS;
-    samplerDesc.BorderColor[ 0 ] = 0;
-    samplerDesc.BorderColor[ 1 ] = 0;
-    samplerDesc.BorderColor[ 2 ] = 0;
-    samplerDesc.BorderColor[ 3 ] = 0;
-    samplerDesc.MinLOD = 0;
-    samplerDesc.MaxLOD = D3D11_FLOAT32_MAX;
-
-    // Create the texture sampler state.
-    result = d3d11Device->CreateSamplerState( &samplerDesc, &sampleState );
-    if( result != S_OK )
-    {
-        std::cout << "ERROR: d3d11Device->CreateSamplerState returned " << result << "\n";
-        WMessageBox( fenster->getFensterHandle(), new Text( "Fehler" ), new Text( "DirectX 11 konnte nicht initialisiert werden." ), MB_ICONERROR );
-        return;
-    }
-    //---------------------------------------------------------------
-    // Framework Backbuffer Texture
-    Bild* renderB = new Bild( 1 );
-    renderB->setAlpha3D( 1 );
-    renderB->neuBild( this->backBufferSize.x, this->backBufferSize.y, 0 );
-
-    uiTextur = createOrGetTextur( "_f_Render_Bild", renderB );
-
-    texturModel = new TexturModel( this );
-    texturModel->setSize( this->backBufferSize );
-    texturModel->setTextur( dynamic_cast<Textur*>(uiTextur->getThis()) );
-
-    D3D11_BLEND_DESC blendState;
-    ZeroMemory( &blendState, sizeof( D3D11_BLEND_DESC ) );
-    blendState.AlphaToCoverageEnable = false;
-    blendState.IndependentBlendEnable = false;
-    blendState.RenderTarget[ 0 ].BlendEnable = true;
-    blendState.RenderTarget[ 0 ].SrcBlend = D3D11_BLEND_SRC_ALPHA;
-    blendState.RenderTarget[ 0 ].DestBlend = D3D11_BLEND_INV_SRC_ALPHA;
-    blendState.RenderTarget[ 0 ].BlendOp = D3D11_BLEND_OP_ADD;
-    blendState.RenderTarget[ 0 ].SrcBlendAlpha = D3D11_BLEND_ZERO;
-    blendState.RenderTarget[ 0 ].DestBlendAlpha = D3D11_BLEND_ONE;
-    blendState.RenderTarget[ 0 ].BlendOpAlpha = D3D11_BLEND_OP_ADD;
-    blendState.RenderTarget[ 0 ].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL;
-
-    d3d11Device->CreateBlendState( &blendState, &blendStateAlphaBlend );
-    d3d11Context->OMSetBlendState( blendStateAlphaBlend, 0, 0xFFFFFFFF );
-
-    // Setup Render Objekt
-
-    vertexShader->benutzeShader();
-    d3d11Context->PSSetSamplers( 0, 1, &sampleState );
-    pixelShader->benutzeShader();
-
-    D3D11_RASTERIZER_DESC rasterDesc;
-    ZeroMemory( &rasterDesc, sizeof( rasterDesc ) );
-    rasterDesc.AntialiasedLineEnable = false;
-    rasterDesc.CullMode = D3D11_CULL_BACK;
-    rasterDesc.DepthBiasClamp = 0.0f;
-    rasterDesc.DepthClipEnable = true;
-    rasterDesc.FillMode = D3D11_FILL_SOLID;
-    rasterDesc.FrontCounterClockwise = false;
-    rasterDesc.MultisampleEnable = false;
-    rasterDesc.ScissorEnable = false;
-    rasterDesc.SlopeScaledDepthBias = 0.0f;
-    d3d11Device->CreateRasterizerState( &rasterDesc, &texturRS );
-
-    ZeroMemory( &rasterDesc, sizeof( rasterDesc ) );
-    rasterDesc.AntialiasedLineEnable = false;
-    rasterDesc.CullMode = D3D11_CULL_BACK;
-    rasterDesc.DepthBiasClamp = 0.0f;
-    rasterDesc.DepthClipEnable = true;
-    rasterDesc.FillMode = D3D11_FILL_WIREFRAME;
-    rasterDesc.FrontCounterClockwise = false;
-    rasterDesc.MultisampleEnable = false;
-    rasterDesc.ScissorEnable = false;
-    rasterDesc.SlopeScaledDepthBias = 0.0f;
-    d3d11Device->CreateRasterizerState( &rasterDesc, &meshRS );
-
-    d3d11Context->RSSetState( texturRS );
-
-    Bild* b = new Bild();
-    b->neuBild( 10, 10, 0xFFFFFFFF );
-    defaultTextur = createOrGetTextur( "_default_textur", b );
-
-    diffuseLights = new DX11StructuredBuffer( sizeof( DiffuseLight ), d3d11Device, d3d11Context );
-    pointLights = new DX11StructuredBuffer( sizeof( PointLight ), d3d11Device, d3d11Context );
+	HRESULT result = createDeviceAndSwapChain(NULL,
+		D3D_DRIVER_TYPE_HARDWARE,
+		NULL,
+		flag,
+		&featureLevel,
+		1,
+		D3D11_SDK_VERSION,
+		&scd,
+		&d3d11SpawChain,
+		&d3d11Device,
+		&support,
+		&d3d11Context);
+	if (result != S_OK)
+	{
+		getDLLRegister()->releaseDLL("d3d11.dll");
+		std::cout << "ERROR: D3D11CreateDeviceAndSwapChain returned " << result << "\n";
+		WMessageBox(fenster->getFensterHandle(), new Text("Fehler"), new Text("DirectX 11 konnte nicht initialisiert werden."), MB_ICONERROR);
+		return;
+	}
+	ID3D11Texture2D* backBufferPtr;
+	// Get the pointer to the back buffer.
+	result = d3d11SpawChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID*)&backBufferPtr);
+	if (result != S_OK)
+	{
+		std::cout << "ERROR: d3d11SpawChain->GetBuffer returned " << result << "\n";
+		WMessageBox(fenster->getFensterHandle(), new Text("Fehler"), new Text("DirectX 11 konnte nicht initialisiert werden."), MB_ICONERROR);
+		return;
+	}
+
+	vp = new D3D11_VIEWPORT();
+	memset(vp, 0, sizeof(D3D11_VIEWPORT));
+	vp->Width = (float)this->backBufferSize.x;
+	vp->Height = (float)this->backBufferSize.y;
+	vp->MinDepth = 0.0f;
+	vp->MaxDepth = 1.0f;
+	d3d11Context->RSSetViewports(1, vp);
+
+	// Create the render target view with the back buffer pointer.
+	result = d3d11Device->CreateRenderTargetView(backBufferPtr, NULL, &rtview);
+	if (result != S_OK)
+	{
+		std::cout << "ERROR: d3d11Device->CreateRenderTargetView returned " << result << "\n";
+		WMessageBox(fenster->getFensterHandle(), new Text("Fehler"), new Text("DirectX 11 konnte nicht initialisiert werden."), MB_ICONERROR);
+		return;
+	}
+	// Release pointer to the back buffer as we no longer need it.
+	backBufferPtr->Release();
+	// Initialize the description of the depth buffer.
+	D3D11_TEXTURE2D_DESC depthBufferDesc;
+	ZeroMemory(&depthBufferDesc, sizeof(depthBufferDesc));
+	// Set up the description of the depth buffer.
+	depthBufferDesc.Width = this->backBufferSize.x;
+	depthBufferDesc.Height = this->backBufferSize.y;
+	depthBufferDesc.MipLevels = 1;
+	depthBufferDesc.ArraySize = 1;
+	depthBufferDesc.Format = DXGI_FORMAT_D24_UNORM_S8_UINT;
+	depthBufferDesc.SampleDesc.Count = 1;
+	depthBufferDesc.Usage = D3D11_USAGE_DEFAULT;
+	depthBufferDesc.BindFlags = D3D11_BIND_DEPTH_STENCIL;
+	// Create the texture for the depth buffer using the filled out description.
+	result = d3d11Device->CreateTexture2D(&depthBufferDesc, NULL, &depthStencilBuffer);
+	if (result != S_OK)
+	{
+		std::cout << "ERROR: d3d11Device->CreateTexture2D returned " << result << "\n";
+		WMessageBox(fenster->getFensterHandle(), new Text("Fehler"), new Text("DirectX 11 konnte nicht initialisiert werden."), MB_ICONERROR);
+		return;
+	}
+	// Initialize the description of the stencil state.
+	D3D11_DEPTH_STENCIL_DESC depthStencilDesc;
+	ZeroMemory(&depthStencilDesc, sizeof(depthStencilDesc));
+
+	// Set up the description of the stencil state.
+	depthStencilDesc.DepthEnable = true;
+	depthStencilDesc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ALL;
+	depthStencilDesc.DepthFunc = D3D11_COMPARISON_LESS_EQUAL;
+	depthStencilDesc.StencilEnable = true;
+	depthStencilDesc.StencilReadMask = 0xFF;
+	depthStencilDesc.StencilWriteMask = 0xFF;
+	// Stencil operations if pixel is front-facing.
+	depthStencilDesc.FrontFace.StencilFailOp = D3D11_STENCIL_OP_KEEP;
+	depthStencilDesc.FrontFace.StencilDepthFailOp = D3D11_STENCIL_OP_DECR;
+	depthStencilDesc.FrontFace.StencilPassOp = D3D11_STENCIL_OP_KEEP;
+	depthStencilDesc.FrontFace.StencilFunc = D3D11_COMPARISON_ALWAYS;
+	// Stencil operations if pixel is back-facing.
+	depthStencilDesc.BackFace.StencilFailOp = D3D11_STENCIL_OP_KEEP;
+	depthStencilDesc.BackFace.StencilDepthFailOp = D3D11_STENCIL_OP_INCR;
+	depthStencilDesc.BackFace.StencilPassOp = D3D11_STENCIL_OP_KEEP;
+	depthStencilDesc.BackFace.StencilFunc = D3D11_COMPARISON_ALWAYS;
+	// Create the depth stencil state.
+	result = d3d11Device->CreateDepthStencilState(&depthStencilDesc, &depthStencilState);
+	if (result != S_OK)
+	{
+		std::cout << "ERROR: d3d11Device->CreateDepthStencilState returned " << result << "\n";
+		WMessageBox(fenster->getFensterHandle(), new Text("Fehler"), new Text("DirectX 11 konnte nicht initialisiert werden."), MB_ICONERROR);
+		return;
+	}
+	d3d11Context->OMSetDepthStencilState(depthStencilState, 1);
+
+	// Initialize the depth stencil view.
+	D3D11_DEPTH_STENCIL_VIEW_DESC depthStencilViewDesc;
+	ZeroMemory(&depthStencilViewDesc, sizeof(depthStencilViewDesc));
+
+	// Set up the depth stencil view description.
+	depthStencilViewDesc.Format = DXGI_FORMAT_D24_UNORM_S8_UINT;
+	depthStencilViewDesc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D;
+
+	// Create the depth stencil view.
+	result = d3d11Device->CreateDepthStencilView(depthStencilBuffer, &depthStencilViewDesc, &dsView);
+	if (result != S_OK)
+	{
+		std::cout << "ERROR: d3d11Device->CreateDepthStencilView returned " << result << "\n";
+		WMessageBox(fenster->getFensterHandle(), new Text("Fehler"), new Text("DirectX 11 konnte nicht initialisiert werden."), MB_ICONERROR);
+		return;
+	}
+	d3d11Context->OMSetRenderTargets(1, &rtview, dsView);
+
+	D3D11_DEPTH_STENCIL_DESC depthDisabledStencilDesc;
+	// Clear the second depth stencil state before setting the parameters.
+	ZeroMemory(&depthDisabledStencilDesc, sizeof(depthDisabledStencilDesc));
+
+	// Now create a second depth stencil state which turns off the Z buffer for 2D rendering.  The only difference is 
+	// that DepthEnable is set to false, all other parameters are the same as the other depth stencil state.
+	depthDisabledStencilDesc.DepthEnable = false;
+	depthDisabledStencilDesc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ALL;
+	depthDisabledStencilDesc.DepthFunc = D3D11_COMPARISON_LESS;
+	depthDisabledStencilDesc.StencilEnable = true;
+	depthDisabledStencilDesc.StencilReadMask = 0xFF;
+	depthDisabledStencilDesc.StencilWriteMask = 0xFF;
+	depthDisabledStencilDesc.FrontFace.StencilFailOp = D3D11_STENCIL_OP_KEEP;
+	depthDisabledStencilDesc.FrontFace.StencilDepthFailOp = D3D11_STENCIL_OP_INCR;
+	depthDisabledStencilDesc.FrontFace.StencilPassOp = D3D11_STENCIL_OP_KEEP;
+	depthDisabledStencilDesc.FrontFace.StencilFunc = D3D11_COMPARISON_ALWAYS;
+	depthDisabledStencilDesc.BackFace.StencilFailOp = D3D11_STENCIL_OP_KEEP;
+	depthDisabledStencilDesc.BackFace.StencilDepthFailOp = D3D11_STENCIL_OP_DECR;
+	depthDisabledStencilDesc.BackFace.StencilPassOp = D3D11_STENCIL_OP_KEEP;
+	depthDisabledStencilDesc.BackFace.StencilFunc = D3D11_COMPARISON_ALWAYS;
+
+	// Create the state using the device.
+	result = d3d11Device->CreateDepthStencilState(&depthDisabledStencilDesc, &depthDisabledStencilState);
+	if (result != S_OK)
+	{
+		std::cout << "ERROR: d3d11Device->CreateDepthStencilState returned " << result << "\n";
+		WMessageBox(fenster->getFensterHandle(), new Text("Fehler"), new Text("DirectX 11 konnte nicht initialisiert werden."), MB_ICONERROR);
+		return;
+	}
+	//-------------------------------------------------
+	// Shaders
+
+	vertexShader = initializeVertexShader((unsigned char*)UIVertexShader, sizeof(UIVertexShader));
+	pixelShader = initializePixelShader((unsigned char*)UIPixelShader, sizeof(UIPixelShader));
+
+	// Create a texture sampler state description.
+	D3D11_SAMPLER_DESC samplerDesc;
+	samplerDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR;
+	samplerDesc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP;
+	samplerDesc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP;
+	samplerDesc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP;
+	samplerDesc.MipLODBias = 0.0f;
+	samplerDesc.MaxAnisotropy = 1;
+	samplerDesc.ComparisonFunc = D3D11_COMPARISON_ALWAYS;
+	samplerDesc.BorderColor[0] = 0;
+	samplerDesc.BorderColor[1] = 0;
+	samplerDesc.BorderColor[2] = 0;
+	samplerDesc.BorderColor[3] = 0;
+	samplerDesc.MinLOD = 0;
+	samplerDesc.MaxLOD = D3D11_FLOAT32_MAX;
+
+	// Create the texture sampler state.
+	result = d3d11Device->CreateSamplerState(&samplerDesc, &sampleState);
+	if (result != S_OK)
+	{
+		std::cout << "ERROR: d3d11Device->CreateSamplerState returned " << result << "\n";
+		WMessageBox(fenster->getFensterHandle(), new Text("Fehler"), new Text("DirectX 11 konnte nicht initialisiert werden."), MB_ICONERROR);
+		return;
+	}
+	//---------------------------------------------------------------
+	// Framework Backbuffer Texture
+	Bild* renderB = new Bild(1);
+	renderB->setAlpha3D(1);
+	renderB->neuBild(this->backBufferSize.x, this->backBufferSize.y, 0);
+
+	uiTextur = createOrGetTextur("_f_Render_Bild", renderB);
+
+	texturModel = new TexturModel(this);
+	texturModel->setSize(this->backBufferSize);
+	texturModel->setTextur(dynamic_cast<Textur*>(uiTextur->getThis()));
+
+	D3D11_BLEND_DESC blendState;
+	ZeroMemory(&blendState, sizeof(D3D11_BLEND_DESC));
+	blendState.AlphaToCoverageEnable = false;
+	blendState.IndependentBlendEnable = false;
+	blendState.RenderTarget[0].BlendEnable = true;
+	blendState.RenderTarget[0].SrcBlend = D3D11_BLEND_SRC_ALPHA;
+	blendState.RenderTarget[0].DestBlend = D3D11_BLEND_INV_SRC_ALPHA;
+	blendState.RenderTarget[0].BlendOp = D3D11_BLEND_OP_ADD;
+	blendState.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_ZERO;
+	blendState.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_ONE;
+	blendState.RenderTarget[0].BlendOpAlpha = D3D11_BLEND_OP_ADD;
+	blendState.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL;
+
+	d3d11Device->CreateBlendState(&blendState, &blendStateAlphaBlend);
+	d3d11Context->OMSetBlendState(blendStateAlphaBlend, 0, 0xFFFFFFFF);
+
+	// Setup Render Objekt
+
+	vertexShader->benutzeShader();
+	d3d11Context->PSSetSamplers(0, 1, &sampleState);
+	pixelShader->benutzeShader();
+
+	D3D11_RASTERIZER_DESC rasterDesc;
+	ZeroMemory(&rasterDesc, sizeof(rasterDesc));
+	rasterDesc.AntialiasedLineEnable = false;
+	rasterDesc.CullMode = D3D11_CULL_BACK;
+	rasterDesc.DepthBiasClamp = 0.0f;
+	rasterDesc.DepthClipEnable = true;
+	rasterDesc.FillMode = D3D11_FILL_SOLID;
+	rasterDesc.FrontCounterClockwise = false;
+	rasterDesc.MultisampleEnable = false;
+	rasterDesc.ScissorEnable = false;
+	rasterDesc.SlopeScaledDepthBias = 0.0f;
+	d3d11Device->CreateRasterizerState(&rasterDesc, &texturRS);
+
+	ZeroMemory(&rasterDesc, sizeof(rasterDesc));
+	rasterDesc.AntialiasedLineEnable = false;
+	rasterDesc.CullMode = D3D11_CULL_BACK;
+	rasterDesc.DepthBiasClamp = 0.0f;
+	rasterDesc.DepthClipEnable = true;
+	rasterDesc.FillMode = D3D11_FILL_WIREFRAME;
+	rasterDesc.FrontCounterClockwise = false;
+	rasterDesc.MultisampleEnable = false;
+	rasterDesc.ScissorEnable = false;
+	rasterDesc.SlopeScaledDepthBias = 0.0f;
+	d3d11Device->CreateRasterizerState(&rasterDesc, &meshRS);
+
+	d3d11Context->RSSetState(texturRS);
+
+	Bild* b = new Bild();
+	b->neuBild(10, 10, 0xFFFFFFFF);
+	defaultTextur = createOrGetTextur("_default_textur", b);
+
+	diffuseLights = new DX11StructuredBuffer(sizeof(DiffuseLight), d3d11Device, d3d11Context);
+	pointLights = new DX11StructuredBuffer(sizeof(PointLight), d3d11Device, d3d11Context);
 }
 
 void DirectX11::update()
 {
-    modelList->removeAll();
-    if( texturModel )
-    {
-        texturModel->release();
-        texturModel = 0;
-    }
-    if( pointLights )
-        pointLights = (DX11StructuredBuffer*)pointLights->release();
-    if( diffuseLights )
-        diffuseLights = (DX11StructuredBuffer*)diffuseLights->release();
-    if( texturRS )
-    {
-        texturRS->Release();
-        texturRS = NULL;
-    }
-    if( meshRS )
-    {
-        meshRS->Release();
-        meshRS = NULL;
-    }
-    texturRegister->leeren();
-    if( defaultTextur )
-        defaultTextur = (Textur*)defaultTextur->release();
-    if( blendStateAlphaBlend )
-    {
-        blendStateAlphaBlend->Release();
-        blendStateAlphaBlend = NULL;
-    }
-    if( uiTextur )
-    {
-        uiTextur->release();
-        uiTextur = NULL;
-    }
-    if( sampleState )
-    {
-        sampleState->Release();
-        sampleState = NULL;
-    }
-    if( pixelShader )
-    {
-        pixelShader->release();
-        pixelShader = NULL;
-    }
-    if( vertexShader )
-    {
-        vertexShader->release();
-        vertexShader = NULL;
-    }
-    if( depthDisabledStencilState )
-    {
-        depthDisabledStencilState->Release();
-        depthDisabledStencilState = NULL;
-    }
-    delete vp;
-    vp = 0;
-    if( dsView )
-    {
-        dsView->Release();
-        dsView = NULL;
-    }
-    if( depthStencilState )
-    {
-        depthStencilState->Release();
-        depthStencilState = NULL;
-    }
-    if( depthStencilBuffer )
-    {
-        depthStencilBuffer->Release();
-        depthStencilBuffer = NULL;
-    }
-    if( rtview )
-    {
-        rtview->Release();
-        rtview = NULL;
-    }
-    if( d3d11SpawChain )
-    {
-        d3d11SpawChain->Release();
-        d3d11SpawChain = NULL;
-    }
-    if( d3d11Device )
-    {
-        d3d11Device->Release();
-        d3d11Device = NULL;
-    }
-    if( d3d11Context )
-    {
-        d3d11Context->Release();
-        d3d11Context = NULL;
-    }
-    initialize( dynamic_cast<WFenster*>(fenster->getThis()), backBufferSize, fullScreen );
+	modelList->removeAll();
+	if (texturModel)
+	{
+		texturModel->release();
+		texturModel = 0;
+	}
+	if (pointLights)
+		pointLights = (DX11StructuredBuffer*)pointLights->release();
+	if (diffuseLights)
+		diffuseLights = (DX11StructuredBuffer*)diffuseLights->release();
+	if (texturRS)
+	{
+		texturRS->Release();
+		texturRS = NULL;
+	}
+	if (meshRS)
+	{
+		meshRS->Release();
+		meshRS = NULL;
+	}
+	texturRegister->leeren();
+	if (defaultTextur)
+		defaultTextur = (Textur*)defaultTextur->release();
+	if (blendStateAlphaBlend)
+	{
+		blendStateAlphaBlend->Release();
+		blendStateAlphaBlend = NULL;
+	}
+	if (uiTextur)
+	{
+		uiTextur->release();
+		uiTextur = NULL;
+	}
+	if (sampleState)
+	{
+		sampleState->Release();
+		sampleState = NULL;
+	}
+	if (pixelShader)
+	{
+		pixelShader->release();
+		pixelShader = NULL;
+	}
+	if (vertexShader)
+	{
+		vertexShader->release();
+		vertexShader = NULL;
+	}
+	if (depthDisabledStencilState)
+	{
+		depthDisabledStencilState->Release();
+		depthDisabledStencilState = NULL;
+	}
+	delete vp;
+	vp = 0;
+	if (dsView)
+	{
+		dsView->Release();
+		dsView = NULL;
+	}
+	if (depthStencilState)
+	{
+		depthStencilState->Release();
+		depthStencilState = NULL;
+	}
+	if (depthStencilBuffer)
+	{
+		depthStencilBuffer->Release();
+		depthStencilBuffer = NULL;
+	}
+	if (rtview)
+	{
+		rtview->Release();
+		rtview = NULL;
+	}
+	if (d3d11SpawChain)
+	{
+		d3d11SpawChain->Release();
+		d3d11SpawChain = NULL;
+	}
+	if (d3d11Device)
+	{
+		d3d11Device->Release();
+		d3d11Device = NULL;
+	}
+	if (d3d11Context)
+	{
+		d3d11Context->Release();
+		d3d11Context = NULL;
+	}
+	initialize(dynamic_cast<WFenster*>(fenster->getThis()), backBufferSize, fullScreen);
 }
 
-void DirectX11::beginFrame( bool fill2D, bool fill3D, int fillColor )
+void DirectX11::beginFrame(bool fill2D, bool fill3D, int fillColor)
 {
-    if( fill2D )
-        uiTextur->zBild()->setFarbe( fillColor );
-    if( fill3D || true )
-    {
-        float color[ 4 ];
-        // Setup the color to clear the buffer.
-        color[ 0 ] = ((fillColor >> 16) & 0xFF) / 255.f; // R
-        color[ 1 ] = ((fillColor >> 8) & 0xFF) / 255.f; // G
-        color[ 2 ] = (fillColor & 0xFF) / 255.f; // B
-        color[ 3 ] = ((fillColor >> 24) & 0xFF) / 255.f; // A
-        d3d11Context->ClearRenderTargetView( rtview, color );
-    }
-    // Clear the depth buffer.
-    d3d11Context->ClearDepthStencilView( dsView, D3D11_CLEAR_DEPTH | D3D11_CLEAR_STENCIL, 1, 0 );
-    // Bind the render target view and depth stencil buffer to the output render pipeline.
-    d3d11Context->OMSetRenderTargets( 1, &rtview, dsView );
-    // Set the depth stencil state.
-    d3d11Context->OMSetDepthStencilState( depthStencilState, 1 );
+	if (fill2D)
+		uiTextur->zBild()->setFarbe(fillColor);
+	if (fill3D || true)
+	{
+		float color[4];
+		// Setup the color to clear the buffer.
+		color[0] = ((fillColor >> 16) & 0xFF) / 255.f; // R
+		color[1] = ((fillColor >> 8) & 0xFF) / 255.f; // G
+		color[2] = (fillColor & 0xFF) / 255.f; // B
+		color[3] = ((fillColor >> 24) & 0xFF) / 255.f; // A
+		d3d11Context->ClearRenderTargetView(rtview, color);
+	}
+	// Clear the depth buffer.
+	d3d11Context->ClearDepthStencilView(dsView, D3D11_CLEAR_DEPTH | D3D11_CLEAR_STENCIL, 1, 0);
+	// Bind the render target view and depth stencil buffer to the output render pipeline.
+	d3d11Context->OMSetRenderTargets(1, &rtview, dsView);
+	// Set the depth stencil state.
+	d3d11Context->OMSetDepthStencilState(depthStencilState, 1);
 }
 
-void DirectX11::renderObject( Model3D* zObj )
+void DirectX11::renderObject(Model3D* zObj)
 {
-    if( !zObj->zModelData() )
-        return;
-    int curId = zObj->zModelData()->getId();
-    zObj->zModelData()->updateGPUMemory();
-    Mat4< float > trans = Mat4< float >::identity();
-    int anz = zObj->errechneMatrizen( trans, matrixBuffer );
-    if( vertexShader )
-        vertexShader->füllConstBuffer( (char*)matrixBuffer, 0, sizeof( Mat4< float > ) * anz );
-    float matirialBuffer[ 3 ]; // light factors (phong model)
-    matirialBuffer[ 0 ] = zObj->getAmbientFactor();
-    matirialBuffer[ 1 ] = zObj->getDiffusFactor();
-    matirialBuffer[ 2 ] = zObj->getSpecularFactor();
-    if( pixelShader )
-        pixelShader->füllConstBuffer( (char*)matirialBuffer, 1, sizeof( float ) * 3 );
-    unsigned int offset = 0;
-    unsigned int es = (unsigned)zObj->zModelData()->zDXVertexBuffer()->getElementLength();
-    ID3D11Buffer* vBuffer = ((DX11Buffer*)zObj->zModelData()->zDXVertexBuffer())->zBuffer();
-    d3d11Context->IASetVertexBuffers( 0, 1, &vBuffer, &es, &offset );
-    Model3DTextur* zTextur = zObj->zTextur();
-    int ind = 0;
-    int current = 0;
-    if( zObj->zEffectTextur() )
-    {
-        ID3D11ShaderResourceView* v[ 1 ];
-        DX11Textur* zEffectTextur = (DX11Textur*)zObj->zEffectTextur();
-        if( zEffectTextur && zEffectTextur->brauchtUpdate() )
-            zEffectTextur->updateTextur();
-        v[ 0 ] = *zEffectTextur;
-        d3d11Context->PSSetShaderResources( 3, 1, v );
-        TexturEffect e = { 1, zObj->getEffectPercentage() };
-        if( pixelShader )
-            pixelShader->füllConstBuffer( (char*)&e, 3, sizeof( TexturEffect ) );
-    }
-    else
-    {
-        TexturEffect e = { 0, 0.f };
-        if( pixelShader )
-            pixelShader->füllConstBuffer( (char*)&e, 3, sizeof( TexturEffect ) );
-    }
-    DXGI_FORMAT f = DXGI_FORMAT_R32_UINT;
-    if( zObj->zModelData()->zDXIndexBuffer()->getElementLength() == 2 )
-        f = DXGI_FORMAT_R16_UINT;
-    if( zObj->zModelData()->zDXIndexBuffer()->getElementLength() == 1 )
-        f = DXGI_FORMAT_R8_UINT;
-    d3d11Context->IASetIndexBuffer( ((DX11Buffer*)zObj->zModelData()->zDXIndexBuffer())->zBuffer(), f, 0 );
-    d3d11Context->IASetPrimitiveTopology( D3D10_PRIMITIVE_TOPOLOGY_TRIANGLELIST );
-    for( auto i = zObj->zModelData()->getPolygons(); i; i++ )
-    {
-        if( zObj->needRenderPolygon( ind ) )
-        {
-            Textur* t = zTextur->zPolygonTextur( ind );
-            if( t && t->brauchtUpdate() )
-                t->updateTextur();
-            if( t )
-            {
-                ID3D11ShaderResourceView* v[ 3 ];
-                v[ 0 ] = *(DX11Textur*)t;
-                v[ 1 ] = *diffuseLights;
-                v[ 2 ] = *pointLights;
-                d3d11Context->PSSetShaderResources( 0, 3, v );
-                d3d11Context->DrawIndexed( i->indexAnz, current, 0 );
-            }
-            else
-            {
-                d3d11Context->RSSetState( meshRS );
-                ID3D11ShaderResourceView* v[ 3 ];
-                v[ 0 ] = *(DX11Textur*)defaultTextur;
-                v[ 1 ] = *diffuseLights;
-                v[ 2 ] = *pointLights;
-                d3d11Context->PSSetShaderResources( 0, 3, v );
-                d3d11Context->DrawIndexed( i->indexAnz, current, 0 );
-                d3d11Context->RSSetState( texturRS );
-            }
-        }
-        ind++;
-        current += i->indexAnz;
-    }
+	if (!zObj->zModelData())
+		return;
+	int curId = zObj->zModelData()->getId();
+	zObj->zModelData()->updateGPUMemory();
+	Mat4< float > trans = Mat4< float >::identity();
+	int anz = zObj->errechneMatrizen(trans, matrixBuffer);
+	if (vertexShader)
+		vertexShader->füllConstBuffer((char*)matrixBuffer, 0, sizeof(Mat4< float >) * anz);
+	float matirialBuffer[3]; // light factors (phong model)
+	matirialBuffer[0] = zObj->getAmbientFactor();
+	matirialBuffer[1] = zObj->getDiffusFactor();
+	matirialBuffer[2] = zObj->getSpecularFactor();
+	if (pixelShader)
+		pixelShader->füllConstBuffer((char*)matirialBuffer, 1, sizeof(float) * 3);
+	unsigned int offset = 0;
+	unsigned int es = (unsigned)zObj->zModelData()->zDXVertexBuffer()->getElementLength();
+	ID3D11Buffer* vBuffer = ((DX11Buffer*)zObj->zModelData()->zDXVertexBuffer())->zBuffer();
+	d3d11Context->IASetVertexBuffers(0, 1, &vBuffer, &es, &offset);
+	Model3DTextur* zTextur = zObj->zTextur();
+	int ind = 0;
+	int current = 0;
+	if (zObj->zEffectTextur())
+	{
+		ID3D11ShaderResourceView* v[1];
+		DX11Textur* zEffectTextur = (DX11Textur*)zObj->zEffectTextur();
+		if (zEffectTextur && zEffectTextur->brauchtUpdate())
+			zEffectTextur->updateTextur();
+		v[0] = *zEffectTextur;
+		d3d11Context->PSSetShaderResources(3, 1, v);
+		TexturEffect e = { 1, zObj->getEffectPercentage() };
+		if (pixelShader)
+			pixelShader->füllConstBuffer((char*)&e, 3, sizeof(TexturEffect));
+	}
+	else
+	{
+		TexturEffect e = { 0, 0.f };
+		if (pixelShader)
+			pixelShader->füllConstBuffer((char*)&e, 3, sizeof(TexturEffect));
+	}
+	DXGI_FORMAT f = DXGI_FORMAT_R32_UINT;
+	if (zObj->zModelData()->zDXIndexBuffer()->getElementLength() == 2)
+		f = DXGI_FORMAT_R16_UINT;
+	if (zObj->zModelData()->zDXIndexBuffer()->getElementLength() == 1)
+		f = DXGI_FORMAT_R8_UINT;
+	d3d11Context->IASetIndexBuffer(((DX11Buffer*)zObj->zModelData()->zDXIndexBuffer())->zBuffer(), f, 0);
+	d3d11Context->IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
+	zObj->beforeRender(this, vertexShader, pixelShader);
+	for (auto i = zObj->zModelData()->getPolygons(); i; i++)
+	{
+		if (zObj->needRenderPolygon(ind))
+		{
+			Textur* t = zTextur->zPolygonTextur(ind);
+			if (t && t->brauchtUpdate())
+				t->updateTextur();
+			if (t)
+			{
+				ID3D11ShaderResourceView* v[3];
+				v[0] = *(DX11Textur*)t;
+				v[1] = *diffuseLights;
+				v[2] = *pointLights;
+				d3d11Context->PSSetShaderResources(0, 3, v);
+				d3d11Context->DrawIndexed(i->indexAnz, current, 0);
+			}
+			else
+			{
+				d3d11Context->RSSetState(meshRS);
+				ID3D11ShaderResourceView* v[3];
+				v[0] = *(DX11Textur*)defaultTextur;
+				v[1] = *diffuseLights;
+				v[2] = *pointLights;
+				d3d11Context->PSSetShaderResources(0, 3, v);
+				d3d11Context->DrawIndexed(i->indexAnz, current, 0);
+				d3d11Context->RSSetState(texturRS);
+			}
+		}
+		ind++;
+		current += i->indexAnz;
+	}
+	zObj->afterRender(this, pixelShader, vertexShader);
 }
 
 // Überprüft, ob eine Kugel in dem Sichtbaren Raum der Welt liegt und gezeichnet werden muss
 //  pos: Der Mittelpunkt der Kugel
 //  radius: Der Radius der Kugel
 //  dist: Einen Zeiger auf einen float, in dem das quadrat des Abstands zur Kammeraposition gespeichert wird, falls diese Funktion true zurückgiebt und der Zeiger nicht 0 ist
-bool DirectX11::isInFrustrum( const Vec3< float >& pos, float radius, float* dist ) const
+bool DirectX11::isInFrustrum(const Vec3< float >& pos, float radius, float* dist) const
 {
-    for( int i = 0; i < 6; i++ )
-    {
-        if( frustrum[ i ] * pos + radius < 0 )
-            return 0;
-    }
-    if( dist )
-        *dist = kamPos.abstand( pos );
-    return 1;
+	for (int i = 0; i < 6; i++)
+	{
+		if (frustrum[i] * pos + radius < 0)
+			return 0;
+	}
+	if (dist)
+		*dist = kamPos.abstand(pos);
+	return 1;
 }
 
-void DirectX11::renderKamera( Kam3D* zKamera )
+void DirectX11::renderKamera(Kam3D* zKamera)
 {
-    d3d11Context->RSSetViewports( 1, (D3D11_VIEWPORT*)zKamera->zViewPort() );
-
-    Mat4< float > tmp = zKamera->getProjectionMatrix() * zKamera->getViewMatrix();
-
-    frustrum[ 0 ].x = tmp.elements[ 3 ][ 0 ] + tmp.elements[ 0 ][ 0 ];
-    frustrum[ 0 ].y = tmp.elements[ 3 ][ 1 ] + tmp.elements[ 0 ][ 1 ];
-    frustrum[ 0 ].z = tmp.elements[ 3 ][ 2 ] + tmp.elements[ 0 ][ 2 ];
-    frustrum[ 0 ].w = tmp.elements[ 3 ][ 3 ] + tmp.elements[ 0 ][ 3 ];
-
-    frustrum[ 1 ].x = tmp.elements[ 3 ][ 0 ] - tmp.elements[ 0 ][ 0 ];
-    frustrum[ 1 ].y = tmp.elements[ 3 ][ 1 ] - tmp.elements[ 0 ][ 1 ];
-    frustrum[ 1 ].z = tmp.elements[ 3 ][ 2 ] - tmp.elements[ 0 ][ 2 ];
-    frustrum[ 1 ].w = tmp.elements[ 3 ][ 3 ] - tmp.elements[ 0 ][ 3 ];
-
-    frustrum[ 2 ].x = tmp.elements[ 3 ][ 0 ] - tmp.elements[ 1 ][ 0 ];
-    frustrum[ 2 ].y = tmp.elements[ 3 ][ 1 ] - tmp.elements[ 1 ][ 1 ];
-    frustrum[ 2 ].z = tmp.elements[ 3 ][ 2 ] - tmp.elements[ 1 ][ 2 ];
-    frustrum[ 2 ].w = tmp.elements[ 3 ][ 3 ] - tmp.elements[ 1 ][ 3 ];
-
-    frustrum[ 3 ].x = tmp.elements[ 3 ][ 0 ] + tmp.elements[ 1 ][ 0 ];
-    frustrum[ 3 ].y = tmp.elements[ 3 ][ 1 ] + tmp.elements[ 1 ][ 1 ];
-    frustrum[ 3 ].z = tmp.elements[ 3 ][ 2 ] + tmp.elements[ 1 ][ 2 ];
-    frustrum[ 3 ].w = tmp.elements[ 3 ][ 3 ] + tmp.elements[ 1 ][ 3 ];
-
-    frustrum[ 4 ].x = tmp.elements[ 2 ][ 0 ];
-    frustrum[ 4 ].y = tmp.elements[ 2 ][ 1 ];
-    frustrum[ 4 ].z = tmp.elements[ 2 ][ 2 ];
-    frustrum[ 4 ].w = tmp.elements[ 2 ][ 3 ];
-
-    frustrum[ 5 ].x = tmp.elements[ 3 ][ 0 ] - tmp.elements[ 2 ][ 0 ];
-    frustrum[ 5 ].y = tmp.elements[ 3 ][ 1 ] - tmp.elements[ 2 ][ 1 ];
-    frustrum[ 5 ].z = tmp.elements[ 3 ][ 2 ] - tmp.elements[ 2 ][ 2 ];
-    frustrum[ 5 ].w = tmp.elements[ 3 ][ 3 ] - tmp.elements[ 2 ][ 3 ];
-
-    for( int i = 0; i < 6; i++ )
-        frustrum[ i ].normalize();
-
-    viewAndProj[ 0 ] = zKamera->getViewMatrix();
-    viewAndProj[ 1 ] = zKamera->getProjectionMatrix();
-    kamPos = zKamera->getWorldPosition();
-    if( vertexShader )
-        vertexShader->füllConstBuffer( (char*)viewAndProj, 1, sizeof( Mat4< float > ) * 2 );
-    if( pixelShader )
-        pixelShader->füllConstBuffer( (char*)&kamPos, 0, sizeof( float ) * 3 );
-    Welt3D* w = zKamera->zWelt();
-    w->lock();
-    int lc[] = { w->getDiffuseLightCount(), w->getPointLightCount() };
-    pixelShader->füllConstBuffer( (char*)lc, 2, sizeof( int ) * 2 );
-    w->copyLight( diffuseLights, pointLights );
-    int maxDist = 0;
-    int minDist = 0x7FFFFFFF;
-    Array<Model3D*> alphaModels;
-    w->forAll( [this, &minDist, &maxDist, &alphaModels]( Model3D* obj ) {
-        float dist;
-        if( isInFrustrum( obj->getPos(), obj->getRadius(), &dist ) )
-        {
-            if( (int)dist > maxDist )
-                maxDist = (int)dist;
-            if( (int)dist < minDist )
-                minDist = (int)dist;
-            if( obj->hatAlpha() )
-                alphaModels.add( obj );
-            else
-                renderObject( obj );
-        }
-    } );
-    maxDist++;
-    if( alphaModels.getEintragAnzahl() )
-    {
-        int size = maxDist - minDist;
-        int* index = new int[ size ];
-        memset( index, 0, size * 4 );
-        Model3D** sorted = new Model3D * [ size * alphaModels.getEintragAnzahl() ];
-        for( auto obj : alphaModels )
-        {
-            float dist;
-            dist = kamPos.abstand( obj->getPos() );
-            if( isInFrustrum( obj->getPos(), obj->getRadius(), &dist ) )
-            {
-                int pos = (int)dist - minDist;
-                sorted[ pos * alphaModels.getEintragAnzahl() + index[ pos ]++ ] = obj;
-            }
-        }
-        for( int i = 0; i < size; i++ )
-        {
-            for( int j = 0; j < index[ i ]; j++ )
-            {
-                renderObject( sorted[ i * alphaModels.getEintragAnzahl() + j ] );
-            }
-        }
-        delete[] index;
-        delete[] sorted;
-    }
-    w->unlock();
+	d3d11Context->RSSetViewports(1, (D3D11_VIEWPORT*)zKamera->zViewPort());
+
+	Mat4< float > tmp = zKamera->getProjectionMatrix() * zKamera->getViewMatrix();
+
+	frustrum[0].x = tmp.elements[3][0] + tmp.elements[0][0];
+	frustrum[0].y = tmp.elements[3][1] + tmp.elements[0][1];
+	frustrum[0].z = tmp.elements[3][2] + tmp.elements[0][2];
+	frustrum[0].w = tmp.elements[3][3] + tmp.elements[0][3];
+
+	frustrum[1].x = tmp.elements[3][0] - tmp.elements[0][0];
+	frustrum[1].y = tmp.elements[3][1] - tmp.elements[0][1];
+	frustrum[1].z = tmp.elements[3][2] - tmp.elements[0][2];
+	frustrum[1].w = tmp.elements[3][3] - tmp.elements[0][3];
+
+	frustrum[2].x = tmp.elements[3][0] - tmp.elements[1][0];
+	frustrum[2].y = tmp.elements[3][1] - tmp.elements[1][1];
+	frustrum[2].z = tmp.elements[3][2] - tmp.elements[1][2];
+	frustrum[2].w = tmp.elements[3][3] - tmp.elements[1][3];
+
+	frustrum[3].x = tmp.elements[3][0] + tmp.elements[1][0];
+	frustrum[3].y = tmp.elements[3][1] + tmp.elements[1][1];
+	frustrum[3].z = tmp.elements[3][2] + tmp.elements[1][2];
+	frustrum[3].w = tmp.elements[3][3] + tmp.elements[1][3];
+
+	frustrum[4].x = tmp.elements[2][0];
+	frustrum[4].y = tmp.elements[2][1];
+	frustrum[4].z = tmp.elements[2][2];
+	frustrum[4].w = tmp.elements[2][3];
+
+	frustrum[5].x = tmp.elements[3][0] - tmp.elements[2][0];
+	frustrum[5].y = tmp.elements[3][1] - tmp.elements[2][1];
+	frustrum[5].z = tmp.elements[3][2] - tmp.elements[2][2];
+	frustrum[5].w = tmp.elements[3][3] - tmp.elements[2][3];
+
+	for (int i = 0; i < 6; i++)
+		frustrum[i].normalize();
+
+	viewAndProj[0] = zKamera->getViewMatrix();
+	viewAndProj[1] = zKamera->getProjectionMatrix();
+	kamPos = zKamera->getWorldPosition();
+	if (vertexShader)
+		vertexShader->füllConstBuffer((char*)viewAndProj, 1, sizeof(Mat4< float >) * 2);
+	if (pixelShader)
+		pixelShader->füllConstBuffer((char*)&kamPos, 0, sizeof(float) * 3);
+	Welt3D* w = zKamera->zWelt();
+	w->lock();
+	int lc[] = { w->getDiffuseLightCount(), w->getPointLightCount() };
+	pixelShader->füllConstBuffer((char*)lc, 2, sizeof(int) * 2);
+	w->copyLight(diffuseLights, pointLights);
+	int maxDist = 0;
+	int minDist = 0x7FFFFFFF;
+	Array<Model3D*> alphaModels;
+	w->forAll([this, &minDist, &maxDist, &alphaModels](Model3D* obj)
+		{
+			float dist;
+			if (isInFrustrum(obj->getPos(), obj->getRadius(), &dist))
+			{
+				if ((int)dist > maxDist)
+					maxDist = (int)dist;
+				if ((int)dist < minDist)
+					minDist = (int)dist;
+				if (obj->hatAlpha())
+					alphaModels.add(obj);
+				else
+					renderObject(obj);
+			}
+		});
+	maxDist++;
+	if (alphaModels.getEintragAnzahl())
+	{
+		int size = maxDist - minDist;
+		int* index = new int[size];
+		memset(index, 0, size * 4);
+		Model3D** sorted = new Model3D * [size * alphaModels.getEintragAnzahl()];
+		for (auto obj : alphaModels)
+		{
+			float dist;
+			dist = kamPos.abstand(obj->getPos());
+			if (isInFrustrum(obj->getPos(), obj->getRadius(), &dist))
+			{
+				int pos = (int)dist - minDist;
+				sorted[pos * alphaModels.getEintragAnzahl() + index[pos]++] = obj;
+			}
+		}
+		for (int i = 0; i < size; i++)
+		{
+			for (int j = 0; j < index[i]; j++)
+			{
+				renderObject(sorted[i * alphaModels.getEintragAnzahl() + j]);
+			}
+		}
+		delete[] index;
+		delete[] sorted;
+	}
+	w->unlock();
 }
 
-void DirectX11::renderKamera( Kam3D* zKamera, Textur* zTarget )
+void DirectX11::renderKamera(Kam3D* zKamera, Textur* zTarget)
 {
-    ID3D11RenderTargetView* texturRtView;
-    DX11Textur* d11Textur = dynamic_cast<DX11Textur*>(zTarget);
-    if( !d11Textur )
-        throw "incompatible textur object was passed to renderKamera of DirectX11 GPU API";
-    d11Textur->setRenderTarget( 1 );
-    if( d11Textur->brauchtUpdate() )
-        d11Textur->updateTextur();
-
-    D3D11_TEXTURE2D_DESC depthBufferDesc;
-    ZeroMemory( &depthBufferDesc, sizeof( depthBufferDesc ) );
-    // Set up the description of the depth buffer.
-    depthBufferDesc.Width = zTarget->zBild()->getBreite();
-    depthBufferDesc.Height = zTarget->zBild()->getHeight();
-    depthBufferDesc.MipLevels = 1;
-    depthBufferDesc.ArraySize = 1;
-    depthBufferDesc.Format = DXGI_FORMAT_D24_UNORM_S8_UINT;
-    depthBufferDesc.SampleDesc.Count = 1;
-    depthBufferDesc.Usage = D3D11_USAGE_DEFAULT;
-    depthBufferDesc.BindFlags = D3D11_BIND_DEPTH_STENCIL;
-    ID3D11Texture2D* txtDepthStencilBuffer;
-    // Create the texture for the depth buffer using the filled out description.
-    HRESULT result = d3d11Device->CreateTexture2D( &depthBufferDesc, NULL, &txtDepthStencilBuffer );
-    if( result != S_OK )
-        throw "could not create depth Stencil buffer";
-    // Initialize the depth stencil view.
-    D3D11_DEPTH_STENCIL_VIEW_DESC depthStencilViewDesc;
-    ZeroMemory( &depthStencilViewDesc, sizeof( depthStencilViewDesc ) );
-
-    // Set up the depth stencil view description.
-    depthStencilViewDesc.Format = DXGI_FORMAT_D24_UNORM_S8_UINT;
-    depthStencilViewDesc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D;
-
-    ID3D11DepthStencilView* txtDsView;
-    // Create the depth stencil view.
-    result = d3d11Device->CreateDepthStencilView( txtDepthStencilBuffer, &depthStencilViewDesc, &txtDsView );
-    if( result != S_OK )
-        throw "could not create depth stencil view";
-
-    D3D11_RENDER_TARGET_VIEW_DESC renderTargetViewDesc;
-    renderTargetViewDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM;
-    renderTargetViewDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D;
-    renderTargetViewDesc.Texture2D.MipSlice = 0;
-    result = d3d11Device->CreateRenderTargetView( (ID3D11Texture2D*)*d11Textur, &renderTargetViewDesc, &texturRtView );
-    if( result != S_OK )
-        throw "could not create render target view for given texture";
-    d3d11Context->OMSetRenderTargets( 1, &texturRtView, txtDsView );
-
-    float color[ 4 ] = { 0, 0, 0, 0 };
-    d3d11Context->ClearRenderTargetView( texturRtView, color );
-    d3d11Context->ClearDepthStencilView( txtDsView, D3D11_CLEAR_DEPTH | D3D11_CLEAR_STENCIL, 1, 0 );
-    renderKamera( zKamera );
-    result = d3d11SpawChain->Present( 0, 0 );
-    if( result != S_OK )
-        throw "could not present the rendered content";
-    d3d11Context->OMSetRenderTargets( 1, &rtview, dsView );
-    texturRtView->Release();
-    txtDsView->Release();
-    txtDepthStencilBuffer->Release();
+	ID3D11RenderTargetView* texturRtView;
+	DX11Textur* d11Textur = dynamic_cast<DX11Textur*>(zTarget);
+	if (!d11Textur)
+		throw "incompatible textur object was passed to renderKamera of DirectX11 GPU API";
+	d11Textur->setRenderTarget(1);
+	if (d11Textur->brauchtUpdate())
+		d11Textur->updateTextur();
+
+	D3D11_TEXTURE2D_DESC depthBufferDesc;
+	ZeroMemory(&depthBufferDesc, sizeof(depthBufferDesc));
+	// Set up the description of the depth buffer.
+	depthBufferDesc.Width = zTarget->zBild()->getBreite();
+	depthBufferDesc.Height = zTarget->zBild()->getHeight();
+	depthBufferDesc.MipLevels = 1;
+	depthBufferDesc.ArraySize = 1;
+	depthBufferDesc.Format = DXGI_FORMAT_D24_UNORM_S8_UINT;
+	depthBufferDesc.SampleDesc.Count = 1;
+	depthBufferDesc.Usage = D3D11_USAGE_DEFAULT;
+	depthBufferDesc.BindFlags = D3D11_BIND_DEPTH_STENCIL;
+	ID3D11Texture2D* txtDepthStencilBuffer;
+	// Create the texture for the depth buffer using the filled out description.
+	HRESULT result = d3d11Device->CreateTexture2D(&depthBufferDesc, NULL, &txtDepthStencilBuffer);
+	if (result != S_OK)
+		throw "could not create depth Stencil buffer";
+	// Initialize the depth stencil view.
+	D3D11_DEPTH_STENCIL_VIEW_DESC depthStencilViewDesc;
+	ZeroMemory(&depthStencilViewDesc, sizeof(depthStencilViewDesc));
+
+	// Set up the depth stencil view description.
+	depthStencilViewDesc.Format = DXGI_FORMAT_D24_UNORM_S8_UINT;
+	depthStencilViewDesc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D;
+
+	ID3D11DepthStencilView* txtDsView;
+	// Create the depth stencil view.
+	result = d3d11Device->CreateDepthStencilView(txtDepthStencilBuffer, &depthStencilViewDesc, &txtDsView);
+	if (result != S_OK)
+		throw "could not create depth stencil view";
+
+	D3D11_RENDER_TARGET_VIEW_DESC renderTargetViewDesc;
+	renderTargetViewDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM;
+	renderTargetViewDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D;
+	renderTargetViewDesc.Texture2D.MipSlice = 0;
+	result = d3d11Device->CreateRenderTargetView((ID3D11Texture2D*)*d11Textur, &renderTargetViewDesc, &texturRtView);
+	if (result != S_OK)
+		throw "could not create render target view for given texture";
+	d3d11Context->OMSetRenderTargets(1, &texturRtView, txtDsView);
+
+	float color[4] = { 0, 0, 0, 0 };
+	d3d11Context->ClearRenderTargetView(texturRtView, color);
+	d3d11Context->ClearDepthStencilView(txtDsView, D3D11_CLEAR_DEPTH | D3D11_CLEAR_STENCIL, 1, 0);
+	renderKamera(zKamera);
+	result = d3d11SpawChain->Present(0, 0);
+	if (result != S_OK)
+		throw "could not present the rendered content";
+	d3d11Context->OMSetRenderTargets(1, &rtview, dsView);
+	texturRtView->Release();
+	txtDsView->Release();
+	txtDepthStencilBuffer->Release();
 }
 
 void DirectX11::presentFrame()
 {
-    // Set the depth stencil state.
-    d3d11Context->OMSetDepthStencilState( depthDisabledStencilState, 1 );
-
-    uiTextur->updateTextur();
-
-    d3d11Context->RSSetViewports( 1, vp );
-
-    float screenAspect = (float)backBufferSize.x / (float)backBufferSize.y;
-    Mat4< float > view = view.translation( Vec3< float >( 0.f, 0.f, backBufferSize.y * 1.2075f ) );
-    viewAndProj[ 0 ] = view;
-    viewAndProj[ 1 ] = view.projektion( (float)PI / 4.0f, screenAspect, 0.1f, 10000.f );
-    kamPos = Vec3< float >( 0.f, 0.f, backBufferSize.y * 1.2075f );
-    if( vertexShader )
-        vertexShader->füllConstBuffer( (char*)viewAndProj, 1, sizeof( Mat4< float > ) * 2 );
-    if( pixelShader )
-        pixelShader->füllConstBuffer( (char*)&kamPos, 0, sizeof( float ) * 3 );
-
-    if( fenster && !IsIconic( fenster->getFensterHandle() ) )
-        renderObject( texturModel );
-    HRESULT result = d3d11SpawChain->Present( 0, 0 );
-    if( !SUCCEEDED( result ) )
-    {
-        update();
-        WMessageBox( fenster ? fenster->getFensterHandle() : 0, new Text( "Fehler" ), new Text( "Es ist ein Fehler beim rendern aufgetreten." ), MB_ICONERROR );
-    }
+	// Set the depth stencil state.
+	d3d11Context->OMSetDepthStencilState(depthDisabledStencilState, 1);
+
+	uiTextur->updateTextur();
+
+	d3d11Context->RSSetViewports(1, vp);
+
+	float screenAspect = (float)backBufferSize.x / (float)backBufferSize.y;
+	Mat4< float > view = view.translation(Vec3< float >(0.f, 0.f, backBufferSize.y * 1.2075f));
+	viewAndProj[0] = view;
+	viewAndProj[1] = view.projektion((float)PI / 4.0f, screenAspect, 0.1f, 10000.f);
+	kamPos = Vec3< float >(0.f, 0.f, backBufferSize.y * 1.2075f);
+	if (vertexShader)
+		vertexShader->füllConstBuffer((char*)viewAndProj, 1, sizeof(Mat4< float >) * 2);
+	if (pixelShader)
+		pixelShader->füllConstBuffer((char*)&kamPos, 0, sizeof(float) * 3);
+
+	if (fenster && !IsIconic(fenster->getFensterHandle()))
+		renderObject(texturModel);
+	HRESULT result = d3d11SpawChain->Present(0, 0);
+	if (!SUCCEEDED(result))
+	{
+		update();
+		WMessageBox(fenster ? fenster->getFensterHandle() : 0, new Text("Fehler"), new Text("Es ist ein Fehler beim rendern aufgetreten."), MB_ICONERROR);
+	}
 }
 
 Bild* DirectX11::zUIRenderBild() const
 {
-    return uiTextur->zBild();
+	return uiTextur->zBild();
 }
 
-Textur* DirectX11::createOrGetTextur( const char* name, Bild* b )
+Textur* DirectX11::createOrGetTextur(const char* name, Bild* b)
 {
-    if( !d3d11Device )
-    {
-        if( b )
-            b->release();
-        return 0;
-    }
-    if( texturRegister->hatTextur( name ) )
-    {
-        Textur* ret = texturRegister->getTextur( name );
-        if( b )
-            ret->setBildZ( b );
-        return ret;
-    }
-    Textur* ret = new DX11Textur( d3d11Device, d3d11Context );
-    if( b )
-        ret->setBildZ( b );
-    texturRegister->addTextur( dynamic_cast<Textur*>(ret->getThis()), name );
-    return ret;
+	if (!d3d11Device)
+	{
+		if (b)
+			b->release();
+		return 0;
+	}
+	if (texturRegister->hatTextur(name))
+	{
+		Textur* ret = texturRegister->getTextur(name);
+		if (b)
+			ret->setBildZ(b);
+		return ret;
+	}
+	Textur* ret = new DX11Textur(d3d11Device, d3d11Context);
+	if (b)
+		ret->setBildZ(b);
+	texturRegister->addTextur(dynamic_cast<Textur*>(ret->getThis()), name);
+	return ret;
 }
 
-typedef HRESULT( __stdcall* CreateDXGIFactory2Function )(UINT, REFIID, void**);
+typedef HRESULT(__stdcall* CreateDXGIFactory2Function)(UINT, REFIID, void**);
 
-typedef HRESULT( __stdcall* D3D11CreateDeviceFunction )(IDXGIAdapter*, D3D_DRIVER_TYPE, HMODULE, UINT, D3D_FEATURE_LEVEL*,
-                                                         UINT, UINT, ID3D11Device**, D3D_FEATURE_LEVEL*, ID3D11DeviceContext**);
+typedef HRESULT(__stdcall* D3D11CreateDeviceFunction)(IDXGIAdapter*, D3D_DRIVER_TYPE, HMODULE, UINT, D3D_FEATURE_LEVEL*,
+	UINT, UINT, ID3D11Device**, D3D_FEATURE_LEVEL*, ID3D11DeviceContext**);
 
 bool DirectX11::isAvailable()
 {
-    HINSTANCE dxgiDLL = getDLLRegister()->ladeDLL( "dxgi.dll", "dxgi.dll" );
-    if( !dxgiDLL )
-        return 0;
-    HINSTANCE d3d11DLL = getDLLRegister()->ladeDLL( "d3d11.dll", "d3d11.dll" );
-    if( !d3d11DLL )
-    {
-        getDLLRegister()->releaseDLL( "dxgi.dll" );
-        return 0;
-    }
-    CreateDXGIFactory2Function createFactory = (CreateDXGIFactory2Function)GetProcAddress( dxgiDLL, "CreateDXGIFactory2" );
-    if( !createFactory )
-    {
-        getDLLRegister()->releaseDLL( "dxgi.dll" );
-        getDLLRegister()->releaseDLL( "d3d11.dll" );
-        return 0;
-    }
-    D3D11CreateDeviceFunction createDevice = (D3D11CreateDeviceFunction)GetProcAddress( d3d11DLL, "D3D11CreateDevice" );
-    if( !createDevice )
-    {
-        getDLLRegister()->releaseDLL( "dxgi.dll" );
-        getDLLRegister()->releaseDLL( "d3d11.dll" );
-        return 0;
-    }
-    IDXGIFactory4* factory;
-    UINT createFactoryFlags = 0;
+	HINSTANCE dxgiDLL = getDLLRegister()->ladeDLL("dxgi.dll", "dxgi.dll");
+	if (!dxgiDLL)
+		return 0;
+	HINSTANCE d3d11DLL = getDLLRegister()->ladeDLL("d3d11.dll", "d3d11.dll");
+	if (!d3d11DLL)
+	{
+		getDLLRegister()->releaseDLL("dxgi.dll");
+		return 0;
+	}
+	CreateDXGIFactory2Function createFactory = (CreateDXGIFactory2Function)GetProcAddress(dxgiDLL, "CreateDXGIFactory2");
+	if (!createFactory)
+	{
+		getDLLRegister()->releaseDLL("dxgi.dll");
+		getDLLRegister()->releaseDLL("d3d11.dll");
+		return 0;
+	}
+	D3D11CreateDeviceFunction createDevice = (D3D11CreateDeviceFunction)GetProcAddress(d3d11DLL, "D3D11CreateDevice");
+	if (!createDevice)
+	{
+		getDLLRegister()->releaseDLL("dxgi.dll");
+		getDLLRegister()->releaseDLL("d3d11.dll");
+		return 0;
+	}
+	IDXGIFactory4* factory;
+	UINT createFactoryFlags = 0;
 #if defined(_DEBUG)
-    createFactoryFlags = DXGI_CREATE_FACTORY_DEBUG;
+	createFactoryFlags = DXGI_CREATE_FACTORY_DEBUG;
 #endif
-    HRESULT res = createFactory( createFactoryFlags, __uuidof(IDXGIFactory4), (void**)&factory );
-    if( FAILED( res ) )
-    {
-        getDLLRegister()->releaseDLL( "dxgi.dll" );
-        getDLLRegister()->releaseDLL( "d3d11.dll" );
-        return 0;
-    }
-    int index = 0;
-    UINT flag = 0;
+	HRESULT res = createFactory(createFactoryFlags, __uuidof(IDXGIFactory4), (void**)&factory);
+	if (FAILED(res))
+	{
+		getDLLRegister()->releaseDLL("dxgi.dll");
+		getDLLRegister()->releaseDLL("d3d11.dll");
+		return 0;
+	}
+	int index = 0;
+	UINT flag = 0;
 #ifdef _DEBUG
-    flag |= D3D11_CREATE_DEVICE_DEBUG;
+	flag |= D3D11_CREATE_DEVICE_DEBUG;
 #endif
-    do
-    {
-        IDXGIAdapter1* current;
-        res = factory->EnumAdapters1( index++, &current );
-        if( res == S_OK )
-        {
-            DXGI_ADAPTER_DESC1 dxgiAdapterDesc1;
-            current->GetDesc1( &dxgiAdapterDesc1 );
-            ID3D11Device* device = 0;
-            ID3D11DeviceContext* context = 0;
-            D3D_FEATURE_LEVEL level = D3D_FEATURE_LEVEL_11_0;
-            if( (dxgiAdapterDesc1.Flags & DXGI_ADAPTER_FLAG_SOFTWARE) == 0 &&
-                SUCCEEDED( createDevice( current, D3D_DRIVER_TYPE_UNKNOWN, 0, flag, &level, 1, D3D11_SDK_VERSION, &device, 0, &context ) ) )
-            {
-                context->Release();
-                device->Release();
-                current->Release();
-                factory->Release();
-                getDLLRegister()->releaseDLL( "dxgi.dll" );
-                getDLLRegister()->releaseDLL( "d3d11.dll" );
-                return 1;
-            }
-            current->Release();
-        }
-    } while( res != DXGI_ERROR_NOT_FOUND );
-    factory->Release();
-    getDLLRegister()->releaseDLL( "dxgi.dll" );
-    getDLLRegister()->releaseDLL( "d3d11.dll" );
-    return 0;
+	do
+	{
+		IDXGIAdapter1* current;
+		res = factory->EnumAdapters1(index++, &current);
+		if (res == S_OK)
+		{
+			DXGI_ADAPTER_DESC1 dxgiAdapterDesc1;
+			current->GetDesc1(&dxgiAdapterDesc1);
+			ID3D11Device* device = 0;
+			ID3D11DeviceContext* context = 0;
+			D3D_FEATURE_LEVEL level = D3D_FEATURE_LEVEL_11_0;
+			if ((dxgiAdapterDesc1.Flags & DXGI_ADAPTER_FLAG_SOFTWARE) == 0 &&
+				SUCCEEDED(createDevice(current, D3D_DRIVER_TYPE_UNKNOWN, 0, flag, &level, 1, D3D11_SDK_VERSION, &device, 0, &context)))
+			{
+				context->Release();
+				device->Release();
+				current->Release();
+				factory->Release();
+				getDLLRegister()->releaseDLL("dxgi.dll");
+				getDLLRegister()->releaseDLL("d3d11.dll");
+				return 1;
+			}
+			current->Release();
+		}
+	} while (res != DXGI_ERROR_NOT_FOUND);
+	factory->Release();
+	getDLLRegister()->releaseDLL("dxgi.dll");
+	getDLLRegister()->releaseDLL("d3d11.dll");
+	return 0;
 }
 
 DXBuffer* DirectX11::createIndexBuffer()
 {
-    return new DX11Buffer( sizeof( int ), d3d11Device, d3d11Context, D3D11_BIND_INDEX_BUFFER );
+	return new DX11Buffer(sizeof(int), d3d11Device, d3d11Context, D3D11_BIND_INDEX_BUFFER);
 }
 
 DXBuffer* DirectX11::createVertexBuffer()
 {
-    return new DX11Buffer( sizeof( Vertex3D ), d3d11Device, d3d11Context, D3D11_BIND_VERTEX_BUFFER );
+	return new DX11Buffer(sizeof(Vertex3D), d3d11Device, d3d11Context, D3D11_BIND_VERTEX_BUFFER);
+}
+
+DX11VertexShader* DirectX11::initializeVertexShader(unsigned char* byteCode, int size)
+{
+	DX11VertexShader* vertexShader = new DX11VertexShader(d3d11Device, d3d11Context);
+	vertexShader->setCompiledByteArray(byteCode, size);
+	D3D11_INPUT_ELEMENT_DESC polygonLayout[5];
+	// Create the vertex input layout description.
+	// This setup needs to match the VertexType stucture in the ModelClass and in the shader.
+	polygonLayout[0].SemanticName = "POSITION";
+	polygonLayout[0].SemanticIndex = 0;
+	polygonLayout[0].Format = DXGI_FORMAT_R32G32B32_FLOAT;
+	polygonLayout[0].InputSlot = 0;
+	polygonLayout[0].AlignedByteOffset = 0;
+	polygonLayout[0].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA;
+	polygonLayout[0].InstanceDataStepRate = 0;
+
+	polygonLayout[1].SemanticName = "TEXCOORD";
+	polygonLayout[1].SemanticIndex = 0;
+	polygonLayout[1].Format = DXGI_FORMAT_R32G32_FLOAT;
+	polygonLayout[1].InputSlot = 0;
+	polygonLayout[1].AlignedByteOffset = D3D11_APPEND_ALIGNED_ELEMENT;
+	polygonLayout[1].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA;
+	polygonLayout[1].InstanceDataStepRate = 0;
+
+	polygonLayout[2].SemanticName = "NORMAL";
+	polygonLayout[2].SemanticIndex = 0;
+	polygonLayout[2].Format = DXGI_FORMAT_R32G32B32_FLOAT;
+	polygonLayout[2].InputSlot = 0;
+	polygonLayout[2].AlignedByteOffset = D3D11_APPEND_ALIGNED_ELEMENT;
+	polygonLayout[2].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA;
+	polygonLayout[2].InstanceDataStepRate = 0;
+
+	polygonLayout[3].SemanticName = "KNOCHEN_ID";
+	polygonLayout[3].SemanticIndex = 0;
+	polygonLayout[3].Format = DXGI_FORMAT_R32_UINT;
+	polygonLayout[3].InputSlot = 0;
+	polygonLayout[3].AlignedByteOffset = D3D11_APPEND_ALIGNED_ELEMENT;
+	polygonLayout[3].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA;
+	polygonLayout[3].InstanceDataStepRate = 0;
+
+	polygonLayout[4].SemanticName = "VERTEX_ID";
+	polygonLayout[4].SemanticIndex = 0;
+	polygonLayout[4].Format = DXGI_FORMAT_R16_UINT;
+	polygonLayout[4].InputSlot = 0;
+	polygonLayout[4].AlignedByteOffset = D3D11_APPEND_ALIGNED_ELEMENT;
+	polygonLayout[4].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA;
+	polygonLayout[4].InstanceDataStepRate = 0;
+
+	vertexShader->erstelleInputLayout(polygonLayout, 5);
+	vertexShader->erstelleConstBuffer(sizeof(Mat4< float >) * MAX_KNOCHEN_ANZ, vertexShader->getFirstUninitializedBufferIndex()); // matrizen für skelett annimationen
+	vertexShader->erstelleConstBuffer(sizeof(Mat4< float >) * 2, vertexShader->getFirstUninitializedBufferIndex()); // View and Projection Matrix
+	return vertexShader;
+}
+
+DX11PixelShader* DirectX11::initializePixelShader(unsigned char* byteCode, int size)
+{
+	DX11PixelShader* pixelShader = new DX11PixelShader(d3d11Device, d3d11Context);
+	pixelShader->setCompiledByteArray((unsigned char*)byteCode, size);
+
+	pixelShader->erstelleConstBuffer(sizeof(float) * 3, pixelShader->getFirstUninitializedBufferIndex()); // Kamera Position
+	pixelShader->erstelleConstBuffer(sizeof(float) * 3, pixelShader->getFirstUninitializedBufferIndex()); // materialkonstanten nach phong model
+	pixelShader->erstelleConstBuffer(sizeof(int) * 2, pixelShader->getFirstUninitializedBufferIndex());
+	pixelShader->erstelleConstBuffer(sizeof(TexturEffect), pixelShader->getFirstUninitializedBufferIndex());
+	// TODO: Remove Following Test Code
+	int lc[] = { 0, 0 };
+	pixelShader->füllConstBuffer((char*)lc, 2, sizeof(int) * 2);
+	TexturEffect e = { 0, 0.f };
+	pixelShader->füllConstBuffer((char*)&e, 3, sizeof(TexturEffect));
+	return pixelShader;
 }

+ 27 - 26
DX11VertexShader.hlsl

@@ -1,16 +1,16 @@
 /////////////
 // GLOBALS //
 /////////////
-cbuffer MatrixBuffer : register( b0 )
+cbuffer MatrixBuffer : register(b0)
 {
-    matrix knochenMatrix[ 128 ];
+	matrix knochenMatrix[128];
 };
 
 // The projection and view matrix
-cbuffer Kamera : register( b1 )
+cbuffer Kamera : register(b1)
 {
-    matrix view;
-    matrix projection;
+	matrix view;
+	matrix projection;
 }
 
 //////////////                                                                          
@@ -18,39 +18,40 @@ cbuffer Kamera : register( b1 )
 //////////////                                                                          
 struct VertexInputType
 {
-    float4 position : POSITION;
-    float2 tex : TEXCOORD0;
-    float3 normal : NORMAL;
-    uint knochen : KNOCHEN_ID0;
+	float4 position : POSITION;
+	float2 tex : TEXCOORD0;
+	float3 normal : NORMAL;
+	uint knochen : KNOCHEN_ID0;
+	half id : VERTEX_ID;
 };
 
 struct PixelInputType
 {
-    float4 worldPos : POSITION;
-    float4 position : SV_POSITION;
-    float2 tex : TEXCOORD0;
-    float3 normal : TEXCOORD1;
+	float4 worldPos : POSITION;
+	float4 position : SV_POSITION;
+	float2 tex : TEXCOORD0;
+	float3 normal : TEXCOORD1;
 };
 
 ////////////////////////////////////////////////////////////////////////////////
 // Vertex Shader                                                                
 ////////////////////////////////////////////////////////////////////////////////
-PixelInputType TextureVertexShader( VertexInputType input )
+PixelInputType TextureVertexShader(VertexInputType input)
 {
-    //return input;                                                                     
-    PixelInputType output;
-    output.normal = normalize( mul( input.normal, (float3x3)knochenMatrix[ input.knochen ] ) );
+	//return input;                                                                     
+	PixelInputType output;
+	output.normal = normalize(mul(input.normal, (float3x3)knochenMatrix[input.knochen]));
 
-    // Change the position vector to be 4 units for proper matrix calculations.         
-    input.position.w = 1.0f;
+	// Change the position vector to be 4 units for proper matrix calculations.         
+	input.position.w = 1.0f;
 
-    // Store the texture coordinates for the pixel shader.                              
-    output.tex = input.tex;
+	// Store the texture coordinates for the pixel shader.                              
+	output.tex = input.tex;
 
-    // Calculate the position of the vertex against the world, view, and projection matrices. 
-    output.worldPos = mul( input.position, knochenMatrix[ input.knochen ] );
-    output.position = mul( output.worldPos, view );
-    output.position = mul( output.position, projection );
+	// Calculate the position of the vertex against the world, view, and projection matrices. 
+	output.worldPos = mul(input.position, knochenMatrix[input.knochen]);
+	output.position = mul(output.worldPos, view);
+	output.position = mul(output.position, projection);
 
-    return output;
+	return output;
 }

+ 971 - 967
DX12GraphicsApi.cpp

@@ -26,1045 +26,1049 @@
 using namespace Framework;
 
 DirectX12::DirectX12()
-    : GraphicsApi( DIRECTX12 ),
-    debug( 0 ),
-    device( 0 ),
-    infoQueue( 0 ),
-    directCommandQueue( 0 ),
-    copyCommandQueue( 0 ),
-    computeCommandQueue( 0 ),
-    swapChain( 0 ),
-    rtvHeap( 0 ),
-    dsvHeap( 0 ),
-    shaderBufferHeap( 0 ),
-    depthBuffer( 0 ),
-    backBufferIndex( 0 ),
-    tearing( 0 ),
-    viewPort( 0 ),
-    allowedRenderArea( 0 ),
-    vertexBufferView( 0 ),
-    indexBufferView( 0 ),
-    signature( 0 ),
-    pipeline( 0 ),
-    texturModel( 0 ),
-    uiTextur( 0 ),
-    texturRegister( new TexturList() ),
-    vertexShader( 0 ),
-    pixelShader( 0 )
+	: GraphicsApi(DIRECTX12),
+	debug(0),
+	device(0),
+	infoQueue(0),
+	directCommandQueue(0),
+	copyCommandQueue(0),
+	computeCommandQueue(0),
+	swapChain(0),
+	rtvHeap(0),
+	dsvHeap(0),
+	shaderBufferHeap(0),
+	depthBuffer(0),
+	backBufferIndex(0),
+	tearing(0),
+	viewPort(0),
+	allowedRenderArea(0),
+	vertexBufferView(0),
+	indexBufferView(0),
+	signature(0),
+	pipeline(0),
+	texturModel(0),
+	uiTextur(0),
+	texturRegister(new TexturList()),
+	vertexShader(0),
+	pixelShader(0)
 {
-    for( int i = 0; i < 2; i++ )
-        backBuffer[ i ] = 0;
+	for (int i = 0; i < 2; i++)
+		backBuffer[i] = 0;
 }
 
 DirectX12::~DirectX12()
 {
-    if( directCommandQueue )
-    {
-        directCommandQueue->flush();
-        directCommandQueue->release();
-    }
-    if( copyCommandQueue )
-    {
-        copyCommandQueue->flush();
-        copyCommandQueue->release();
-    }
-    if( computeCommandQueue )
-    {
-        computeCommandQueue->flush();
-        computeCommandQueue->release();
-    }
-    if( depthBuffer )
-        depthBuffer->Release();
-    if( dsvHeap )
-        dsvHeap->Release();
-    if( shaderBufferHeap )
-        shaderBufferHeap->Release();
-    if( vertexShader )
-        vertexShader->release();
-    if( pixelShader )
-        pixelShader->release();
-    texturRegister->release();
-    if( uiTextur )
-        uiTextur->release();
-    if( texturModel )
-        texturModel->release();
-    if( pipeline )
-        pipeline->Release();
-    if( signature )
-        signature->Release();
-    delete indexBufferView;
-    delete vertexBufferView;
-    delete allowedRenderArea;
-    delete viewPort;
-    for( int i = 0; i < 2; i++ )
-    {
-        if( backBuffer[ i ] )
-            backBuffer[ i ]->Release();
-    }
-    if( rtvHeap )
-        rtvHeap->Release();
-    if( swapChain )
-        swapChain->Release();
-    if( infoQueue )
-        infoQueue->Release();
-    if( device )
-    {
-        device->Release();
-        getDLLRegister()->releaseDLL( "dxgi.dll" );
-        getDLLRegister()->releaseDLL( "d3d12.dll" );
-    }
-    if( debug )
-        debug->Release();
+	if (directCommandQueue)
+	{
+		directCommandQueue->flush();
+		directCommandQueue->release();
+	}
+	if (copyCommandQueue)
+	{
+		copyCommandQueue->flush();
+		copyCommandQueue->release();
+	}
+	if (computeCommandQueue)
+	{
+		computeCommandQueue->flush();
+		computeCommandQueue->release();
+	}
+	if (depthBuffer)
+		depthBuffer->Release();
+	if (dsvHeap)
+		dsvHeap->Release();
+	if (shaderBufferHeap)
+		shaderBufferHeap->Release();
+	if (vertexShader)
+		vertexShader->release();
+	if (pixelShader)
+		pixelShader->release();
+	texturRegister->release();
+	if (uiTextur)
+		uiTextur->release();
+	if (texturModel)
+		texturModel->release();
+	if (pipeline)
+		pipeline->Release();
+	if (signature)
+		signature->Release();
+	delete indexBufferView;
+	delete vertexBufferView;
+	delete allowedRenderArea;
+	delete viewPort;
+	for (int i = 0; i < 2; i++)
+	{
+		if (backBuffer[i])
+			backBuffer[i]->Release();
+	}
+	if (rtvHeap)
+		rtvHeap->Release();
+	if (swapChain)
+		swapChain->Release();
+	if (infoQueue)
+		infoQueue->Release();
+	if (device)
+	{
+		device->Release();
+		getDLLRegister()->releaseDLL("dxgi.dll");
+		getDLLRegister()->releaseDLL("d3d12.dll");
+	}
+	if (debug)
+		debug->Release();
 }
 
-typedef HRESULT( __stdcall* CreateDXGIFactory2Function )(UINT, REFIID, void**);
+typedef HRESULT(__stdcall* CreateDXGIFactory2Function)(UINT, REFIID, void**);
 
-typedef HRESULT( __stdcall* D3D12CreateDeviceFunction )(IDXGIAdapter*, D3D_FEATURE_LEVEL,
-                                                         REFIID, void**);
+typedef HRESULT(__stdcall* D3D12CreateDeviceFunction)(IDXGIAdapter*, D3D_FEATURE_LEVEL,
+	REFIID, void**);
 
-typedef HRESULT( __stdcall* D3D12GetDebugInterfaceFunction )(REFIID, void**);
+typedef HRESULT(__stdcall* D3D12GetDebugInterfaceFunction)(REFIID, void**);
 
-typedef HRESULT( __stdcall* DXGIGetDebugInterface1Function )(UINT Flags, REFIID riid, _COM_Outptr_ void** pDebug);
+typedef HRESULT(__stdcall* DXGIGetDebugInterface1Function)(UINT Flags, REFIID riid, _COM_Outptr_ void** pDebug);
 
-void DirectX12::initialize( WFenster* fenster, Vec2<int> backBufferSize, bool fullScreen )
+void DirectX12::initialize(WFenster* fenster, Vec2<int> backBufferSize, bool fullScreen)
 {
-    if( device )
-        return GraphicsApi::initialize( fenster, backBufferSize, fullScreen );
-    GraphicsApi::initialize( fenster, backBufferSize, fullScreen );
-
-    HINSTANCE dxgiDLL = getDLLRegister()->ladeDLL( "dxgi.dll", "dxgi.dll" );
-    if( !dxgiDLL )
-    {
-        WMessageBox( fenster->getFensterHandle(), new Text( "Fehler" ), new Text( "dxgi.dll konnte nicht gefunden werden." ), MB_ICONERROR );
-        return;
-    }
-    HINSTANCE d3d12DLL = getDLLRegister()->ladeDLL( "d3d12.dll", "d3d12.dll" );
-    if( !d3d12DLL )
-    {
-        getDLLRegister()->releaseDLL( "dxgi.dll" );
-        WMessageBox( fenster->getFensterHandle(), new Text( "Fehler" ), new Text( "DirectX 12 konnte nicht gefunden werden." ), MB_ICONERROR );
-        return;
-    }
-    CreateDXGIFactory2Function createFactory = (CreateDXGIFactory2Function)GetProcAddress( dxgiDLL, "CreateDXGIFactory2" );
-    if( !createFactory )
-    {
-        getDLLRegister()->releaseDLL( "dxgi.dll" );
-        getDLLRegister()->releaseDLL( "d3d12.dll" );
-        WMessageBox( fenster->getFensterHandle(), new Text( "Fehler" ), new Text( "Der Einstiegspunkt CreateDXGIFactory2 fon DXGI konnte nicht gefunden werden." ), MB_ICONERROR );
-        return;
-    }
-    D3D12CreateDeviceFunction createDevice = (D3D12CreateDeviceFunction)GetProcAddress( d3d12DLL, "D3D12CreateDevice" );
-    if( !createDevice )
-    {
-        getDLLRegister()->releaseDLL( "dxgi.dll" );
-        getDLLRegister()->releaseDLL( "d3d12.dll" );
-        WMessageBox( fenster->getFensterHandle(), new Text( "Fehler" ), new Text( "Der Einstiegspunkt D3D12CreateDevice fon DirectX 12 konnte nicht gefunden werden." ), MB_ICONERROR );
-        return;
-    }
-    PFN_D3D12_SERIALIZE_VERSIONED_ROOT_SIGNATURE d3d12svrsf = (PFN_D3D12_SERIALIZE_VERSIONED_ROOT_SIGNATURE)GetProcAddress( d3d12DLL, "D3D12SerializeVersionedRootSignature" );
-    PFN_D3D12_SERIALIZE_ROOT_SIGNATURE d3d12srsf = (PFN_D3D12_SERIALIZE_ROOT_SIGNATURE)GetProcAddress( d3d12DLL, "D3D12SerializeRootSignature" );
-    bool debugDXGI = 0;
-    IDXGIInfoQueue* dxgiInfoQueue;
+	if (device)
+		return GraphicsApi::initialize(fenster, backBufferSize, fullScreen);
+	GraphicsApi::initialize(fenster, backBufferSize, fullScreen);
+
+	HINSTANCE dxgiDLL = getDLLRegister()->ladeDLL("dxgi.dll", "dxgi.dll");
+	if (!dxgiDLL)
+	{
+		WMessageBox(fenster->getFensterHandle(), new Text("Fehler"), new Text("dxgi.dll konnte nicht gefunden werden."), MB_ICONERROR);
+		return;
+	}
+	HINSTANCE d3d12DLL = getDLLRegister()->ladeDLL("d3d12.dll", "d3d12.dll");
+	if (!d3d12DLL)
+	{
+		getDLLRegister()->releaseDLL("dxgi.dll");
+		WMessageBox(fenster->getFensterHandle(), new Text("Fehler"), new Text("DirectX 12 konnte nicht gefunden werden."), MB_ICONERROR);
+		return;
+	}
+	CreateDXGIFactory2Function createFactory = (CreateDXGIFactory2Function)GetProcAddress(dxgiDLL, "CreateDXGIFactory2");
+	if (!createFactory)
+	{
+		getDLLRegister()->releaseDLL("dxgi.dll");
+		getDLLRegister()->releaseDLL("d3d12.dll");
+		WMessageBox(fenster->getFensterHandle(), new Text("Fehler"), new Text("Der Einstiegspunkt CreateDXGIFactory2 fon DXGI konnte nicht gefunden werden."), MB_ICONERROR);
+		return;
+	}
+	D3D12CreateDeviceFunction createDevice = (D3D12CreateDeviceFunction)GetProcAddress(d3d12DLL, "D3D12CreateDevice");
+	if (!createDevice)
+	{
+		getDLLRegister()->releaseDLL("dxgi.dll");
+		getDLLRegister()->releaseDLL("d3d12.dll");
+		WMessageBox(fenster->getFensterHandle(), new Text("Fehler"), new Text("Der Einstiegspunkt D3D12CreateDevice fon DirectX 12 konnte nicht gefunden werden."), MB_ICONERROR);
+		return;
+	}
+	PFN_D3D12_SERIALIZE_VERSIONED_ROOT_SIGNATURE d3d12svrsf = (PFN_D3D12_SERIALIZE_VERSIONED_ROOT_SIGNATURE)GetProcAddress(d3d12DLL, "D3D12SerializeVersionedRootSignature");
+	PFN_D3D12_SERIALIZE_ROOT_SIGNATURE d3d12srsf = (PFN_D3D12_SERIALIZE_ROOT_SIGNATURE)GetProcAddress(d3d12DLL, "D3D12SerializeRootSignature");
+	bool debugDXGI = 0;
+	IDXGIInfoQueue* dxgiInfoQueue;
 #ifdef _DEBUG
-    if( debugDX )
-    {
-        D3D12GetDebugInterfaceFunction getDebugInterface = (D3D12GetDebugInterfaceFunction)GetProcAddress( d3d12DLL, "D3D12GetDebugInterface" );
-        if( SUCCEEDED( getDebugInterface( __uuidof(ID3D12Debug), (void**)&debug ) ) )
-            debug->EnableDebugLayer();
-        DXGIGetDebugInterface1Function dxgiDebugInterface = (DXGIGetDebugInterface1Function)GetProcAddress( dxgiDLL, "DXGIGetDebugInterface1" );
-        if( SUCCEEDED( dxgiDebugInterface( 0, __uuidof(IDXGIInfoQueue), (void**)&dxgiInfoQueue ) ) )
-            debugDXGI = 1;
-    }
+	if (debugDX)
+	{
+		D3D12GetDebugInterfaceFunction getDebugInterface = (D3D12GetDebugInterfaceFunction)GetProcAddress(d3d12DLL, "D3D12GetDebugInterface");
+		if (SUCCEEDED(getDebugInterface(__uuidof(ID3D12Debug), (void**)&debug)))
+			debug->EnableDebugLayer();
+		DXGIGetDebugInterface1Function dxgiDebugInterface = (DXGIGetDebugInterface1Function)GetProcAddress(dxgiDLL, "DXGIGetDebugInterface1");
+		if (SUCCEEDED(dxgiDebugInterface(0, __uuidof(IDXGIInfoQueue), (void**)&dxgiInfoQueue)))
+			debugDXGI = 1;
+	}
 #endif
-    IDXGIFactory6* factory;
-    UINT createFactoryFlags = 0;
+	IDXGIFactory6* factory;
+	UINT createFactoryFlags = 0;
 #if defined(_DEBUG)
-    if( debugDX && debugDXGI )
-        createFactoryFlags = DXGI_CREATE_FACTORY_DEBUG;
+	if (debugDX && debugDXGI)
+		createFactoryFlags = DXGI_CREATE_FACTORY_DEBUG;
 #endif
-    HRESULT res = createFactory( createFactoryFlags, __uuidof(IDXGIFactory6), (void**)&factory );
-    if( FAILED( res ) )
-    {
-        getDLLRegister()->releaseDLL( "dxgi.dll" );
-        getDLLRegister()->releaseDLL( "d3d12.dll" );
-        std::cout << "ERROR: createFactory returned " << res << "\n";
-        WMessageBox( fenster->getFensterHandle(), new Text( "Fehler" ), new Text( "createFactory ist Fehlgeschlagen." ), MB_ICONERROR );
-        return;
-    }
-    IDXGIAdapter1* adapter = 0;
-    for( UINT adapterID = 0; DXGI_ERROR_NOT_FOUND != factory->EnumAdapterByGpuPreference( adapterID, DXGI_GPU_PREFERENCE_HIGH_PERFORMANCE, __uuidof(IDXGIAdapter1), (void**)&adapter ); ++adapterID )
-    {
-        DXGI_ADAPTER_DESC1 desc;
-        adapter->GetDesc1( &desc );
-
-        if( desc.Flags & DXGI_ADAPTER_FLAG_SOFTWARE )
-        {
-            // Don't select the Basic Render Driver adapter.
-            continue;
-        }
-
-        // Check to see if the adapter supports Direct3D 12, but don't create the actual device yet.
-        if( SUCCEEDED( createDevice( adapter, D3D_FEATURE_LEVEL_12_1, _uuidof( ID3D12Device ), nullptr ) ) )
-        {
-            wchar_t buff[ 256 ] = {};
-            swprintf_s( buff, L"Direct3D Adapter (%u): VID:%04X, PID:%04X - %ls\n", adapterID, desc.VendorId, desc.DeviceId, desc.Description );
-            std::cout << buff;
-            break;
-        }
-    }
-    if( !adapter )
-    {
-        if( FAILED( factory->EnumWarpAdapter( _uuidof( IDXGIAdapter1 ), (void**)&adapter ) ) )
-            std::cout << "ERROR: WARP12 not available. Enable the 'Graphics Tools' optional feature";
-    }
-    if( !adapter )
-    {
-        factory->Release();
-        getDLLRegister()->releaseDLL( "dxgi.dll" );
-        getDLLRegister()->releaseDLL( "d3d12.dll" );
-        WMessageBox( fenster->getFensterHandle(), new Text( "Fehler" ), new Text( "Es wurde keine passende Grafigkarte gefunden." ), MB_ICONERROR );
-        return;
-    }
-    res = createDevice( adapter, D3D_FEATURE_LEVEL_12_1, __uuidof(ID3D12Device5), (void**)&device );
-    adapter->Release();
-    if( FAILED( res ) )
-    {
-        factory->Release();
-        getDLLRegister()->releaseDLL( "dxgi.dll" );
-        getDLLRegister()->releaseDLL( "d3d12.dll" );
-        std::cout << "ERROR: createDevice returned " << res << "\n";
-        WMessageBox( fenster->getFensterHandle(), new Text( "Fehler" ), new Text( "createDevice ist Fehlgeschlagen." ), MB_ICONERROR );
-        return;
-    }
-    D3D12_FEATURE_DATA_D3D12_OPTIONS5 featureSupportData = {};
-    device->CheckFeatureSupport( D3D12_FEATURE_D3D12_OPTIONS5, &featureSupportData, sizeof( featureSupportData ) );
-    if( featureSupportData.RaytracingTier < D3D12_RAYTRACING_TIER_1_0 )
-    {
-        device->Release();
-        factory->Release();
-        getDLLRegister()->releaseDLL( "dxgi.dll" );
-        getDLLRegister()->releaseDLL( "d3d12.dll" );
-        std::cout << "ERROR: Raytracing is not available\n";
-        WMessageBox( fenster->getFensterHandle(), new Text( "Fehler" ), new Text( "Raytracing ist nicht verfügbar. DirectX12 kann nicht verwendet werden." ), MB_ICONERROR );
-        return;
-    }
-    res = device->QueryInterface( __uuidof(ID3D12InfoQueue), (void**)&infoQueue );
-    if( SUCCEEDED( res ) )
-    {
-        if( debugDX )
-        {
-            infoQueue->SetBreakOnSeverity( D3D12_MESSAGE_SEVERITY_CORRUPTION, TRUE );
-            infoQueue->SetBreakOnSeverity( D3D12_MESSAGE_SEVERITY_ERROR, TRUE );
-            infoQueue->SetBreakOnSeverity( D3D12_MESSAGE_SEVERITY_WARNING, TRUE );
-        }
-
-        // Suppress individual messages by their ID
-        D3D12_MESSAGE_ID DenyIds[] = {
-            // D3D12_MESSAGE_ID_CLEARRENDERTARGETVIEW_MISMATCHINGCLEARVALUE,   // I'm really not sure how to avoid this message.
-             D3D12_MESSAGE_ID_MAP_INVALID_NULLRANGE,                         // This warning occurs when using capture frame while graphics debugging.
-             D3D12_MESSAGE_ID_UNMAP_INVALID_NULLRANGE,                       // This warning occurs when using capture frame while graphics debugging.
-        };
-
-        D3D12_INFO_QUEUE_FILTER NewFilter = {};
-        NewFilter.DenyList.NumSeverities = 0;//_countof( Severities );
-        NewFilter.DenyList.pSeverityList = 0;//Severities;
-        NewFilter.DenyList.NumIDs = _countof( DenyIds );
-        NewFilter.DenyList.pIDList = DenyIds;
-
-        infoQueue->PushStorageFilter( &NewFilter );
-    }
-
-    directCommandQueue = new DX12DirectCommandQueue( device );
-    copyCommandQueue = new DX12CopyCommandQueue( device );
-    computeCommandQueue = new DX12ComputeCommandQueue( device );
-
-    IDXGIFactory5* fac5 = 0;
-    factory->QueryInterface( __uuidof(IDXGIFactory5), (void**)&fac5 );
-    if( fac5 )
-    {
-        res = fac5->CheckFeatureSupport( DXGI_FEATURE_PRESENT_ALLOW_TEARING, &tearing, sizeof( tearing ) );
-        if( FAILED( res ) )
-            tearing = 0;
-        fac5->Release();
-    }
-
-    DXGI_SWAP_CHAIN_DESC1 swapChainDesc = {};
-    swapChainDesc.Width = backBufferSize.x;
-    swapChainDesc.Height = backBufferSize.y;
-    swapChainDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
-    swapChainDesc.Stereo = FALSE;
-    swapChainDesc.SampleDesc = { 1, 0 };
-    swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
-    swapChainDesc.BufferCount = 2;
-    swapChainDesc.Scaling = DXGI_SCALING_STRETCH;
-    swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_DISCARD;
-    swapChainDesc.AlphaMode = DXGI_ALPHA_MODE_IGNORE;
-    swapChainDesc.Flags = tearing ? DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING : 0;
-    IDXGISwapChain1* tmpSwapChain;
-    res = factory->CreateSwapChainForHwnd( directCommandQueue->getQueue(), fenster->getFensterHandle(), &swapChainDesc, 0, 0, &tmpSwapChain );
-    if( FAILED( res ) )
-    {
-        factory->Release();
-        std::cout << "ERROR: CreateSwapChainForHwnd returned " << res << "\n";
-        WMessageBox( fenster->getFensterHandle(), new Text( "Fehler" ), new Text( "CreateSwapChainForHwnd ist Fehlgeschlagen." ), MB_ICONERROR );
-        return;
-    }
-    res = tmpSwapChain->QueryInterface( __uuidof(IDXGISwapChain4), (void**)&swapChain );
-    tmpSwapChain->Release();
-    if( FAILED( res ) )
-    {
-        factory->Release();
-        std::cout << "ERROR: QueryInterface returned " << res << "\n";
-        WMessageBox( fenster->getFensterHandle(), new Text( "Fehler" ), new Text( "QueryInterface ist Fehlgeschlagen." ), MB_ICONERROR );
-        return;
-    }
-    factory->MakeWindowAssociation( fenster->getFensterHandle(), DXGI_MWA_NO_ALT_ENTER );
-
-    D3D12_DESCRIPTOR_HEAP_DESC rtvhdesc = {};
-    rtvhdesc.NumDescriptors = 2; // back buffer count
-    rtvhdesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_RTV;
-    res = device->CreateDescriptorHeap( &rtvhdesc, __uuidof(ID3D12DescriptorHeap), (void**)&rtvHeap );
-    if( FAILED( res ) )
-    {
-        factory->Release();
-        std::cout << "ERROR: CreateDescriptorHeap returned " << res << "\n";
-        WMessageBox( fenster->getFensterHandle(), new Text( "Fehler" ), new Text( "CreateDescriptorHeap ist Fehlgeschlagen." ), MB_ICONERROR );
-        return;
-    }
-
-    auto rtvDescriptorSize = device->GetDescriptorHandleIncrementSize( D3D12_DESCRIPTOR_HEAP_TYPE_RTV );
-    D3D12_CPU_DESCRIPTOR_HANDLE rtvHandle( rtvHeap->GetCPUDescriptorHandleForHeapStart() );
-
-    for( int i = 0; i < 2; i++ )
-    {
-        ID3D12Resource* backBuffer;
-        res = swapChain->GetBuffer( i, __uuidof(ID3D12Resource), (void**)&backBuffer );
-        if( FAILED( res ) )
-        {
-            factory->Release();
-            std::cout << "ERROR: GetBuffer returned " << res << "\n";
-            WMessageBox( fenster->getFensterHandle(), new Text( "Fehler" ), new Text( "GetBuffer ist Fehlgeschlagen." ), MB_ICONERROR );
-            return;
-        }
-
-        device->CreateRenderTargetView( backBuffer, nullptr, rtvHandle );
-
-        this->backBuffer[ i ] = backBuffer;
-
-        rtvHandle.ptr += rtvDescriptorSize;
-    }
-
-    viewPort = new D3D12_VIEWPORT();
-    viewPort->Width = (float)this->backBufferSize.x;
-    viewPort->Height = (float)this->backBufferSize.y;
-    viewPort->MinDepth = 0.0f;
-    viewPort->MaxDepth = 1.0f;
-    viewPort->TopLeftX = 0.0f;
-    viewPort->TopLeftY = 0.0f;
-
-    allowedRenderArea = new D3D12_RECT();
-    allowedRenderArea->left = 0;
-    allowedRenderArea->top = 0;
-    allowedRenderArea->right = LONG_MAX;
-    allowedRenderArea->bottom = LONG_MAX;
-
-    texturModel = new TexturModel( this );
-
-    Bild* renderB = new Bild( 1 );
-    renderB->setAlpha3D( 1 );
-    renderB->neuBild( this->backBufferSize.x, this->backBufferSize.y, 0 );
-    uiTextur = createOrGetTextur( "_f_Render_Bild", renderB );
-
-    texturModel->setSize( Vec2<float>( 2.f, 2.f ) );
-    texturModel->setTextur( dynamic_cast<Textur*>(uiTextur->getThis()) );
-
-    vertexBufferView = new D3D12_VERTEX_BUFFER_VIEW();
-    vertexBufferView->StrideInBytes = sizeof( Vertex3D );
-
-    indexBufferView = new D3D12_INDEX_BUFFER_VIEW();
-    indexBufferView->Format = DXGI_FORMAT_R32_UINT;
-
-    D3D12_CLEAR_VALUE optimizedClearValue = {};
-    optimizedClearValue.Format = DXGI_FORMAT_D32_FLOAT;
-    optimizedClearValue.DepthStencil = { 1.0f, 0 };
-
-    res = device->CreateCommittedResource(
-        &CD3DX12_HEAP_PROPERTIES( D3D12_HEAP_TYPE_DEFAULT ),
-        D3D12_HEAP_FLAG_NONE,
-        &CD3DX12_RESOURCE_DESC::Tex2D( DXGI_FORMAT_D32_FLOAT, this->backBufferSize.x, this->backBufferSize.y,
-                                       1, 0, 1, 0, D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL ),
-        D3D12_RESOURCE_STATE_DEPTH_WRITE,
-        &optimizedClearValue,
-        __uuidof(ID3D12Resource),
-        (void**)&depthBuffer
-    );
-    if( FAILED( res ) )
-    {
-        factory->Release();
-        std::cout << "ERROR: CreateCommittedResource returned " << res << "\n";
-        WMessageBox( fenster->getFensterHandle(), new Text( "Fehler" ), new Text( "CreateCommittedResource ist Fehlgeschlagen." ), MB_ICONERROR );
-        return;
-    }
-
-    D3D12_DESCRIPTOR_HEAP_DESC dsvHeapDesc = {};
-    dsvHeapDesc.NumDescriptors = 1;
-    dsvHeapDesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_DSV;
-    dsvHeapDesc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_NONE;
-    res = device->CreateDescriptorHeap( &dsvHeapDesc, __uuidof(ID3D12DescriptorHeap), (void**)&dsvHeap );
-    if( FAILED( res ) )
-    {
-        factory->Release();
-        std::cout << "ERROR: CreateDescriptorHeap returned " << res << "\n";
-        WMessageBox( fenster->getFensterHandle(), new Text( "Fehler" ), new Text( "CreateDescriptorHeap ist Fehlgeschlagen." ), MB_ICONERROR );
-        return;
-    }
-
-    D3D12_DEPTH_STENCIL_VIEW_DESC dsv = {};
-    dsv.Format = DXGI_FORMAT_D32_FLOAT;
-    dsv.ViewDimension = D3D12_DSV_DIMENSION_TEXTURE2D;
-    dsv.Texture2D.MipSlice = 0;
-    dsv.Flags = D3D12_DSV_FLAG_NONE;
-
-    device->CreateDepthStencilView( depthBuffer, &dsv,
-                                    dsvHeap->GetCPUDescriptorHandleForHeapStart() );
-
-    D3D12_DESCRIPTOR_HEAP_DESC sbheapDesc = {};
-    sbheapDesc.NumDescriptors = 6;
-    sbheapDesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV;
-    sbheapDesc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE;
-    res = device->CreateDescriptorHeap( &sbheapDesc, __uuidof(ID3D12DescriptorHeap), (void**)&shaderBufferHeap );
-    if( FAILED( res ) )
-    {
-        factory->Release();
-        std::cout << "ERROR: CreateDescriptorHeap returned " << res << "\n";
-        WMessageBox( fenster->getFensterHandle(), new Text( "Fehler" ), new Text( "CreateDescriptorHeap ist Fehlgeschlagen." ), MB_ICONERROR );
-        return;
-    }
-
-    vertexShader = new DX12VertexShader( device, copyCommandQueue, directCommandQueue );
-    vertexShader->setCompiledByteArray( (unsigned char*)DX12VertexShaderBytes, sizeof( DX12VertexShaderBytes ) );
-    vertexShader->erstelleConstBuffer( sizeof( Mat4< float > ) * 2, 0 );
-    vertexShader->erstelleConstBuffer( sizeof( Mat4< float > ) * 128, 1 );
-
-    pixelShader = new DX12PixelShader( device, copyCommandQueue, directCommandQueue );
-    pixelShader->setCompiledByteArray( (unsigned char*)DX12PixelShaderBytes, sizeof( DX12PixelShaderBytes ) );
-    pixelShader->erstelleConstBuffer( sizeof( float ) * 4, 2 );
-    pixelShader->erstelleConstBuffer( sizeof( float ) * 3, 3 );
-    pixelShader->erstelleConstBuffer( sizeof( int ) * 2, 4 );
-
-    D3D12_INPUT_ELEMENT_DESC inputLayout[] = {
-    { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, D3D12_APPEND_ALIGNED_ELEMENT, D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0 },
-    { "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, D3D12_APPEND_ALIGNED_ELEMENT, D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0 },
-    { "NORMAL", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, D3D12_APPEND_ALIGNED_ELEMENT, D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0 },
-    { "KNOCHEN_ID", 0, DXGI_FORMAT_R32_UINT, 0, D3D12_APPEND_ALIGNED_ELEMENT, D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0 }
-    };
-
-    vertexShader->erstelleInputLayout( inputLayout, 4 );
-
-    D3D12_FEATURE_DATA_ROOT_SIGNATURE featureData = {};
-    featureData.HighestVersion = D3D_ROOT_SIGNATURE_VERSION_1_1;
-    if( FAILED( device->CheckFeatureSupport( D3D12_FEATURE_ROOT_SIGNATURE, &featureData, sizeof( featureData ) ) ) )
-        featureData.HighestVersion = D3D_ROOT_SIGNATURE_VERSION_1_0;
-
-    D3D12_ROOT_SIGNATURE_FLAGS rootSignatureFlags =
-        D3D12_ROOT_SIGNATURE_FLAG_ALLOW_INPUT_ASSEMBLER_INPUT_LAYOUT |
-        D3D12_ROOT_SIGNATURE_FLAG_DENY_HULL_SHADER_ROOT_ACCESS |
-        D3D12_ROOT_SIGNATURE_FLAG_DENY_DOMAIN_SHADER_ROOT_ACCESS |
-        D3D12_ROOT_SIGNATURE_FLAG_DENY_GEOMETRY_SHADER_ROOT_ACCESS;
-
-    D3D12_DESCRIPTOR_RANGE1 range[ 2 ];
-    range[ 0 ].NumDescriptors = 5;
-    range[ 0 ].BaseShaderRegister = 0;
-    range[ 0 ].RegisterSpace = 0;
-    range[ 0 ].RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_CBV;
-    range[ 0 ].OffsetInDescriptorsFromTableStart = D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND;
-    range[ 0 ].Flags = D3D12_DESCRIPTOR_RANGE_FLAG_NONE;
-    range[ 1 ].NumDescriptors = 1;
-    range[ 1 ].BaseShaderRegister = 0;
-    range[ 1 ].RegisterSpace = 0;
-    range[ 1 ].RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_SRV;
-    range[ 1 ].OffsetInDescriptorsFromTableStart = D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND;
-    range[ 1 ].Flags = D3D12_DESCRIPTOR_RANGE_FLAG_NONE;
-
-    D3D12_ROOT_PARAMETER1 rootParameters[ 1 ];
-    rootParameters[ 0 ].ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE;
-    rootParameters[ 0 ].ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL;
-    rootParameters[ 0 ].DescriptorTable.NumDescriptorRanges = 2;
-    rootParameters[ 0 ].DescriptorTable.pDescriptorRanges = range;
-
-    D3D12_STATIC_SAMPLER_DESC sampler = {};
-    sampler.Filter = D3D12_FILTER_MIN_MAG_MIP_POINT;
-    sampler.AddressU = D3D12_TEXTURE_ADDRESS_MODE_BORDER;
-    sampler.AddressV = D3D12_TEXTURE_ADDRESS_MODE_BORDER;
-    sampler.AddressW = D3D12_TEXTURE_ADDRESS_MODE_BORDER;
-    sampler.MipLODBias = 0;
-    sampler.MaxAnisotropy = 0;
-    sampler.ComparisonFunc = D3D12_COMPARISON_FUNC_NEVER;
-    sampler.BorderColor = D3D12_STATIC_BORDER_COLOR_TRANSPARENT_BLACK;
-    sampler.MinLOD = 0.0f;
-    sampler.MaxLOD = D3D12_FLOAT32_MAX;
-    sampler.ShaderRegister = 0;
-    sampler.RegisterSpace = 0;
-    sampler.ShaderVisibility = D3D12_SHADER_VISIBILITY_PIXEL;
-
-    D3D12_VERSIONED_ROOT_SIGNATURE_DESC rootSignatureDescription;
-    rootSignatureDescription.Version = D3D_ROOT_SIGNATURE_VERSION_1_1;
-    rootSignatureDescription.Desc_1_1.NumParameters = 1;
-    rootSignatureDescription.Desc_1_1.pParameters = rootParameters;
-    rootSignatureDescription.Desc_1_1.NumStaticSamplers = 1;
-    rootSignatureDescription.Desc_1_1.pStaticSamplers = &sampler;
-    rootSignatureDescription.Desc_1_1.Flags = rootSignatureFlags;
-
-    ID3DBlob* rootSignature;
-    ID3DBlob* error;
-    res = D3DX12SerializeVersionedRootSignature( &rootSignatureDescription, featureData.HighestVersion, &rootSignature, &error, d3d12svrsf, d3d12srsf );
-    if( FAILED( res ) )
-    {
-        factory->Release();
-        std::cout << "ERROR: D3DX12SerializeVersionedRootSignature returned " << res << "\n";
-        WMessageBox( fenster->getFensterHandle(), new Text( "Fehler" ), new Text( "D3DX12SerializeVersionedRootSignature ist Fehlgeschlagen." ), MB_ICONERROR );
-        if( error )
-            error->Release();
-        return;
-    }
-
-    res = device->CreateRootSignature( 0, rootSignature->GetBufferPointer(), rootSignature->GetBufferSize(), __uuidof(ID3D12RootSignature), (void**)&signature );
-    if( FAILED( res ) )
-    {
-        factory->Release();
-        std::cout << "ERROR: CreateRootSignature returned " << res << "\n";
-        WMessageBox( fenster->getFensterHandle(), new Text( "Fehler" ), new Text( "CreateRootSignature ist Fehlgeschlagen." ), MB_ICONERROR );
-        return;
-    }
-    rootSignature->Release();
-
-    D3D12_RASTERIZER_DESC rdesc;
-    rdesc.FillMode = D3D12_FILL_MODE_SOLID;
-    rdesc.CullMode = D3D12_CULL_MODE_BACK;
-    rdesc.FrontCounterClockwise = 0;
-    rdesc.DepthBias = 0;
-    rdesc.DepthBiasClamp = 0.f;
-    rdesc.SlopeScaledDepthBias = 0.f;
-    rdesc.DepthClipEnable = 1;
-    rdesc.MultisampleEnable = 0;
-    rdesc.AntialiasedLineEnable = 0;
-    rdesc.ForcedSampleCount = 0;
-    rdesc.ConservativeRaster = D3D12_CONSERVATIVE_RASTERIZATION_MODE_OFF;
-
-    D3D12_GRAPHICS_PIPELINE_STATE_DESC psoDesc = {};
-    psoDesc.InputLayout = { vertexShader->zInputLayout(), (unsigned)vertexShader->getInputLayoutSize() };
-    psoDesc.pRootSignature = signature;
-    psoDesc.VS = { vertexShader->getCompiledShader(), (unsigned __int64)vertexShader->getCompiledLength() };
-    psoDesc.PS = { pixelShader->getCompiledShader(), (unsigned __int64)pixelShader->getCompiledLength() };
-    psoDesc.RasterizerState = rdesc;
-    psoDesc.BlendState = CD3DX12_BLEND_DESC( D3D12_DEFAULT );
-    psoDesc.DepthStencilState.DepthEnable = FALSE;
-    psoDesc.DepthStencilState.StencilEnable = FALSE;
-    psoDesc.SampleMask = UINT_MAX;
-    psoDesc.PrimitiveTopologyType = D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE;
-    psoDesc.NumRenderTargets = 1;
-    psoDesc.RTVFormats[ 0 ] = DXGI_FORMAT_R8G8B8A8_UNORM;
-    psoDesc.SampleDesc.Count = 1;
-
-    D3D12_CPU_DESCRIPTOR_HANDLE sbHeapHandle = shaderBufferHeap->GetCPUDescriptorHandleForHeapStart();
-    unsigned int incr = device->GetDescriptorHandleIncrementSize( D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV );
-    D3D12_CONSTANT_BUFFER_VIEW_DESC desc;
-    vertexShader->getViewDesc( 0, desc );
-    device->CreateConstantBufferView( &desc, sbHeapHandle );
-    res = device->GetDeviceRemovedReason();
-    sbHeapHandle.ptr += incr;
-    vertexShader->getViewDesc( 1, desc );
-    device->CreateConstantBufferView( &desc, sbHeapHandle );
-    sbHeapHandle.ptr += incr;
-    pixelShader->getViewDesc( 2, desc );
-    device->CreateConstantBufferView( &desc, sbHeapHandle );
-    sbHeapHandle.ptr += incr;
-    pixelShader->getViewDesc( 3, desc );
-    device->CreateConstantBufferView( &desc, sbHeapHandle );
-    sbHeapHandle.ptr += incr;
-    pixelShader->getViewDesc( 4, desc );
-    device->CreateConstantBufferView( &desc, sbHeapHandle );
-    sbHeapHandle.ptr += incr;
-
-    uiTextur->updateTextur();
-
-    D3D12_SHADER_RESOURCE_VIEW_DESC vd;
-    vd.Format = DXGI_FORMAT_B8G8R8A8_UNORM;
-    vd.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2D;
-    vd.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING;
-    vd.Texture2D.MipLevels = 1;
-    vd.Texture2D.MostDetailedMip = 0;
-    vd.Texture2D.PlaneSlice = 0;
-    vd.Texture2D.ResourceMinLODClamp = 0;
-    device->CreateShaderResourceView( ((DX12Textur*)uiTextur)->getResource(), &vd, sbHeapHandle );
-
-    directCommandQueue->execute();
-
-    res = device->CreateGraphicsPipelineState( &psoDesc, __uuidof(ID3D12PipelineState), (void**)&pipeline );
-    if( FAILED( res ) )
-    {
-        factory->Release();
-        std::cout << "ERROR: CreatePipelineState returned " << res << "\n";
-        WMessageBox( fenster->getFensterHandle(), new Text( "Fehler" ), new Text( "CreatePipelineState ist Fehlgeschlagen." ), MB_ICONERROR );
-        return;
-    }
-
-    factory->Release();
+	HRESULT res = createFactory(createFactoryFlags, __uuidof(IDXGIFactory6), (void**)&factory);
+	if (FAILED(res))
+	{
+		getDLLRegister()->releaseDLL("dxgi.dll");
+		getDLLRegister()->releaseDLL("d3d12.dll");
+		std::cout << "ERROR: createFactory returned " << res << "\n";
+		WMessageBox(fenster->getFensterHandle(), new Text("Fehler"), new Text("createFactory ist Fehlgeschlagen."), MB_ICONERROR);
+		return;
+	}
+	IDXGIAdapter1* adapter = 0;
+	for (UINT adapterID = 0; DXGI_ERROR_NOT_FOUND != factory->EnumAdapterByGpuPreference(adapterID, DXGI_GPU_PREFERENCE_HIGH_PERFORMANCE, __uuidof(IDXGIAdapter1), (void**)&adapter); ++adapterID)
+	{
+		DXGI_ADAPTER_DESC1 desc;
+		adapter->GetDesc1(&desc);
+
+		if (desc.Flags & DXGI_ADAPTER_FLAG_SOFTWARE)
+		{
+			// Don't select the Basic Render Driver adapter.
+			continue;
+		}
+
+		// Check to see if the adapter supports Direct3D 12, but don't create the actual device yet.
+		if (SUCCEEDED(createDevice(adapter, D3D_FEATURE_LEVEL_12_1, _uuidof(ID3D12Device), nullptr)))
+		{
+			wchar_t buff[256] = {};
+			swprintf_s(buff, L"Direct3D Adapter (%u): VID:%04X, PID:%04X - %ls\n", adapterID, desc.VendorId, desc.DeviceId, desc.Description);
+			std::cout << buff;
+			break;
+		}
+	}
+	if (!adapter)
+	{
+		if (FAILED(factory->EnumWarpAdapter(_uuidof(IDXGIAdapter1), (void**)&adapter)))
+			std::cout << "ERROR: WARP12 not available. Enable the 'Graphics Tools' optional feature";
+	}
+	if (!adapter)
+	{
+		factory->Release();
+		getDLLRegister()->releaseDLL("dxgi.dll");
+		getDLLRegister()->releaseDLL("d3d12.dll");
+		WMessageBox(fenster->getFensterHandle(), new Text("Fehler"), new Text("Es wurde keine passende Grafigkarte gefunden."), MB_ICONERROR);
+		return;
+	}
+	res = createDevice(adapter, D3D_FEATURE_LEVEL_12_1, __uuidof(ID3D12Device5), (void**)&device);
+	adapter->Release();
+	if (FAILED(res))
+	{
+		factory->Release();
+		getDLLRegister()->releaseDLL("dxgi.dll");
+		getDLLRegister()->releaseDLL("d3d12.dll");
+		std::cout << "ERROR: createDevice returned " << res << "\n";
+		WMessageBox(fenster->getFensterHandle(), new Text("Fehler"), new Text("createDevice ist Fehlgeschlagen."), MB_ICONERROR);
+		return;
+	}
+	D3D12_FEATURE_DATA_D3D12_OPTIONS5 featureSupportData = {};
+	device->CheckFeatureSupport(D3D12_FEATURE_D3D12_OPTIONS5, &featureSupportData, sizeof(featureSupportData));
+	if (featureSupportData.RaytracingTier < D3D12_RAYTRACING_TIER_1_0)
+	{
+		device->Release();
+		factory->Release();
+		getDLLRegister()->releaseDLL("dxgi.dll");
+		getDLLRegister()->releaseDLL("d3d12.dll");
+		std::cout << "ERROR: Raytracing is not available\n";
+		WMessageBox(fenster->getFensterHandle(), new Text("Fehler"), new Text("Raytracing ist nicht verfügbar. DirectX12 kann nicht verwendet werden."), MB_ICONERROR);
+		return;
+	}
+	res = device->QueryInterface(__uuidof(ID3D12InfoQueue), (void**)&infoQueue);
+	if (SUCCEEDED(res))
+	{
+		if (debugDX)
+		{
+			infoQueue->SetBreakOnSeverity(D3D12_MESSAGE_SEVERITY_CORRUPTION, TRUE);
+			infoQueue->SetBreakOnSeverity(D3D12_MESSAGE_SEVERITY_ERROR, TRUE);
+			infoQueue->SetBreakOnSeverity(D3D12_MESSAGE_SEVERITY_WARNING, TRUE);
+		}
+
+		// Suppress individual messages by their ID
+		D3D12_MESSAGE_ID DenyIds[] = {
+			// D3D12_MESSAGE_ID_CLEARRENDERTARGETVIEW_MISMATCHINGCLEARVALUE,   // I'm really not sure how to avoid this message.
+			 D3D12_MESSAGE_ID_MAP_INVALID_NULLRANGE,                         // This warning occurs when using capture frame while graphics debugging.
+			 D3D12_MESSAGE_ID_UNMAP_INVALID_NULLRANGE,                       // This warning occurs when using capture frame while graphics debugging.
+		};
+
+		D3D12_INFO_QUEUE_FILTER NewFilter = {};
+		NewFilter.DenyList.NumSeverities = 0;//_countof( Severities );
+		NewFilter.DenyList.pSeverityList = 0;//Severities;
+		NewFilter.DenyList.NumIDs = _countof(DenyIds);
+		NewFilter.DenyList.pIDList = DenyIds;
+
+		infoQueue->PushStorageFilter(&NewFilter);
+	}
+
+	directCommandQueue = new DX12DirectCommandQueue(device);
+	copyCommandQueue = new DX12CopyCommandQueue(device);
+	computeCommandQueue = new DX12ComputeCommandQueue(device);
+
+	IDXGIFactory5* fac5 = 0;
+	factory->QueryInterface(__uuidof(IDXGIFactory5), (void**)&fac5);
+	if (fac5)
+	{
+		res = fac5->CheckFeatureSupport(DXGI_FEATURE_PRESENT_ALLOW_TEARING, &tearing, sizeof(tearing));
+		if (FAILED(res))
+			tearing = 0;
+		fac5->Release();
+	}
+
+	DXGI_SWAP_CHAIN_DESC1 swapChainDesc = {};
+	swapChainDesc.Width = backBufferSize.x;
+	swapChainDesc.Height = backBufferSize.y;
+	swapChainDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
+	swapChainDesc.Stereo = FALSE;
+	swapChainDesc.SampleDesc = { 1, 0 };
+	swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
+	swapChainDesc.BufferCount = 2;
+	swapChainDesc.Scaling = DXGI_SCALING_STRETCH;
+	swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_DISCARD;
+	swapChainDesc.AlphaMode = DXGI_ALPHA_MODE_IGNORE;
+	swapChainDesc.Flags = tearing ? DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING : 0;
+	IDXGISwapChain1* tmpSwapChain;
+	res = factory->CreateSwapChainForHwnd(directCommandQueue->getQueue(), fenster->getFensterHandle(), &swapChainDesc, 0, 0, &tmpSwapChain);
+	if (FAILED(res))
+	{
+		factory->Release();
+		std::cout << "ERROR: CreateSwapChainForHwnd returned " << res << "\n";
+		WMessageBox(fenster->getFensterHandle(), new Text("Fehler"), new Text("CreateSwapChainForHwnd ist Fehlgeschlagen."), MB_ICONERROR);
+		return;
+	}
+	res = tmpSwapChain->QueryInterface(__uuidof(IDXGISwapChain4), (void**)&swapChain);
+	tmpSwapChain->Release();
+	if (FAILED(res))
+	{
+		factory->Release();
+		std::cout << "ERROR: QueryInterface returned " << res << "\n";
+		WMessageBox(fenster->getFensterHandle(), new Text("Fehler"), new Text("QueryInterface ist Fehlgeschlagen."), MB_ICONERROR);
+		return;
+	}
+	factory->MakeWindowAssociation(fenster->getFensterHandle(), DXGI_MWA_NO_ALT_ENTER);
+
+	D3D12_DESCRIPTOR_HEAP_DESC rtvhdesc = {};
+	rtvhdesc.NumDescriptors = 2; // back buffer count
+	rtvhdesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_RTV;
+	res = device->CreateDescriptorHeap(&rtvhdesc, __uuidof(ID3D12DescriptorHeap), (void**)&rtvHeap);
+	if (FAILED(res))
+	{
+		factory->Release();
+		std::cout << "ERROR: CreateDescriptorHeap returned " << res << "\n";
+		WMessageBox(fenster->getFensterHandle(), new Text("Fehler"), new Text("CreateDescriptorHeap ist Fehlgeschlagen."), MB_ICONERROR);
+		return;
+	}
+
+	auto rtvDescriptorSize = device->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_RTV);
+	D3D12_CPU_DESCRIPTOR_HANDLE rtvHandle(rtvHeap->GetCPUDescriptorHandleForHeapStart());
+
+	for (int i = 0; i < 2; i++)
+	{
+		ID3D12Resource* backBuffer;
+		res = swapChain->GetBuffer(i, __uuidof(ID3D12Resource), (void**)&backBuffer);
+		if (FAILED(res))
+		{
+			factory->Release();
+			std::cout << "ERROR: GetBuffer returned " << res << "\n";
+			WMessageBox(fenster->getFensterHandle(), new Text("Fehler"), new Text("GetBuffer ist Fehlgeschlagen."), MB_ICONERROR);
+			return;
+		}
+
+		device->CreateRenderTargetView(backBuffer, nullptr, rtvHandle);
+
+		this->backBuffer[i] = backBuffer;
+
+		rtvHandle.ptr += rtvDescriptorSize;
+	}
+
+	viewPort = new D3D12_VIEWPORT();
+	viewPort->Width = (float)this->backBufferSize.x;
+	viewPort->Height = (float)this->backBufferSize.y;
+	viewPort->MinDepth = 0.0f;
+	viewPort->MaxDepth = 1.0f;
+	viewPort->TopLeftX = 0.0f;
+	viewPort->TopLeftY = 0.0f;
+
+	allowedRenderArea = new D3D12_RECT();
+	allowedRenderArea->left = 0;
+	allowedRenderArea->top = 0;
+	allowedRenderArea->right = LONG_MAX;
+	allowedRenderArea->bottom = LONG_MAX;
+
+	texturModel = new TexturModel(this);
+
+	Bild* renderB = new Bild(1);
+	renderB->setAlpha3D(1);
+	renderB->neuBild(this->backBufferSize.x, this->backBufferSize.y, 0);
+	uiTextur = createOrGetTextur("_f_Render_Bild", renderB);
+
+	texturModel->setSize(Vec2<float>(2.f, 2.f));
+	texturModel->setTextur(dynamic_cast<Textur*>(uiTextur->getThis()));
+
+	vertexBufferView = new D3D12_VERTEX_BUFFER_VIEW();
+	vertexBufferView->StrideInBytes = sizeof(Vertex3D);
+
+	indexBufferView = new D3D12_INDEX_BUFFER_VIEW();
+	indexBufferView->Format = DXGI_FORMAT_R32_UINT;
+
+	D3D12_CLEAR_VALUE optimizedClearValue = {};
+	optimizedClearValue.Format = DXGI_FORMAT_D32_FLOAT;
+	optimizedClearValue.DepthStencil = { 1.0f, 0 };
+
+	res = device->CreateCommittedResource(
+		&CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_DEFAULT),
+		D3D12_HEAP_FLAG_NONE,
+		&CD3DX12_RESOURCE_DESC::Tex2D(DXGI_FORMAT_D32_FLOAT, this->backBufferSize.x, this->backBufferSize.y,
+			1, 0, 1, 0, D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL),
+		D3D12_RESOURCE_STATE_DEPTH_WRITE,
+		&optimizedClearValue,
+		__uuidof(ID3D12Resource),
+		(void**)&depthBuffer
+	);
+	if (FAILED(res))
+	{
+		factory->Release();
+		std::cout << "ERROR: CreateCommittedResource returned " << res << "\n";
+		WMessageBox(fenster->getFensterHandle(), new Text("Fehler"), new Text("CreateCommittedResource ist Fehlgeschlagen."), MB_ICONERROR);
+		return;
+	}
+
+	D3D12_DESCRIPTOR_HEAP_DESC dsvHeapDesc = {};
+	dsvHeapDesc.NumDescriptors = 1;
+	dsvHeapDesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_DSV;
+	dsvHeapDesc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_NONE;
+	res = device->CreateDescriptorHeap(&dsvHeapDesc, __uuidof(ID3D12DescriptorHeap), (void**)&dsvHeap);
+	if (FAILED(res))
+	{
+		factory->Release();
+		std::cout << "ERROR: CreateDescriptorHeap returned " << res << "\n";
+		WMessageBox(fenster->getFensterHandle(), new Text("Fehler"), new Text("CreateDescriptorHeap ist Fehlgeschlagen."), MB_ICONERROR);
+		return;
+	}
+
+	D3D12_DEPTH_STENCIL_VIEW_DESC dsv = {};
+	dsv.Format = DXGI_FORMAT_D32_FLOAT;
+	dsv.ViewDimension = D3D12_DSV_DIMENSION_TEXTURE2D;
+	dsv.Texture2D.MipSlice = 0;
+	dsv.Flags = D3D12_DSV_FLAG_NONE;
+
+	device->CreateDepthStencilView(depthBuffer, &dsv,
+		dsvHeap->GetCPUDescriptorHandleForHeapStart());
+
+	D3D12_DESCRIPTOR_HEAP_DESC sbheapDesc = {};
+	sbheapDesc.NumDescriptors = 6;
+	sbheapDesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV;
+	sbheapDesc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE;
+	res = device->CreateDescriptorHeap(&sbheapDesc, __uuidof(ID3D12DescriptorHeap), (void**)&shaderBufferHeap);
+	if (FAILED(res))
+	{
+		factory->Release();
+		std::cout << "ERROR: CreateDescriptorHeap returned " << res << "\n";
+		WMessageBox(fenster->getFensterHandle(), new Text("Fehler"), new Text("CreateDescriptorHeap ist Fehlgeschlagen."), MB_ICONERROR);
+		return;
+	}
+
+	vertexShader = new DX12VertexShader(device, copyCommandQueue, directCommandQueue);
+	vertexShader->setCompiledByteArray((unsigned char*)DX12VertexShaderBytes, sizeof(DX12VertexShaderBytes));
+	vertexShader->erstelleConstBuffer(sizeof(Mat4< float >) * 2, 0);
+	vertexShader->erstelleConstBuffer(sizeof(Mat4< float >) * 128, 1);
+
+	pixelShader = new DX12PixelShader(device, copyCommandQueue, directCommandQueue);
+	pixelShader->setCompiledByteArray((unsigned char*)DX12PixelShaderBytes, sizeof(DX12PixelShaderBytes));
+	pixelShader->erstelleConstBuffer(sizeof(float) * 4, 2);
+	pixelShader->erstelleConstBuffer(sizeof(float) * 3, 3);
+	pixelShader->erstelleConstBuffer(sizeof(int) * 2, 4);
+
+	D3D12_INPUT_ELEMENT_DESC inputLayout[] = {
+	{ "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, D3D12_APPEND_ALIGNED_ELEMENT, D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0 },
+	{ "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, D3D12_APPEND_ALIGNED_ELEMENT, D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0 },
+	{ "NORMAL", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, D3D12_APPEND_ALIGNED_ELEMENT, D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0 },
+	{ "KNOCHEN_ID", 0, DXGI_FORMAT_R32_UINT, 0, D3D12_APPEND_ALIGNED_ELEMENT, D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0 },
+	{ "KNOCHEN_ID", 0, DXGI_FORMAT_R16_UINT, 0, D3D12_APPEND_ALIGNED_ELEMENT, D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0 }
+	};
+
+	vertexShader->erstelleInputLayout(inputLayout, 5);
+
+	D3D12_FEATURE_DATA_ROOT_SIGNATURE featureData = {};
+	featureData.HighestVersion = D3D_ROOT_SIGNATURE_VERSION_1_1;
+	if (FAILED(device->CheckFeatureSupport(D3D12_FEATURE_ROOT_SIGNATURE, &featureData, sizeof(featureData))))
+		featureData.HighestVersion = D3D_ROOT_SIGNATURE_VERSION_1_0;
+
+	D3D12_ROOT_SIGNATURE_FLAGS rootSignatureFlags =
+		D3D12_ROOT_SIGNATURE_FLAG_ALLOW_INPUT_ASSEMBLER_INPUT_LAYOUT |
+		D3D12_ROOT_SIGNATURE_FLAG_DENY_HULL_SHADER_ROOT_ACCESS |
+		D3D12_ROOT_SIGNATURE_FLAG_DENY_DOMAIN_SHADER_ROOT_ACCESS |
+		D3D12_ROOT_SIGNATURE_FLAG_DENY_GEOMETRY_SHADER_ROOT_ACCESS;
+
+	D3D12_DESCRIPTOR_RANGE1 range[2];
+	range[0].NumDescriptors = 5;
+	range[0].BaseShaderRegister = 0;
+	range[0].RegisterSpace = 0;
+	range[0].RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_CBV;
+	range[0].OffsetInDescriptorsFromTableStart = D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND;
+	range[0].Flags = D3D12_DESCRIPTOR_RANGE_FLAG_NONE;
+	range[1].NumDescriptors = 1;
+	range[1].BaseShaderRegister = 0;
+	range[1].RegisterSpace = 0;
+	range[1].RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_SRV;
+	range[1].OffsetInDescriptorsFromTableStart = D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND;
+	range[1].Flags = D3D12_DESCRIPTOR_RANGE_FLAG_NONE;
+
+	D3D12_ROOT_PARAMETER1 rootParameters[1];
+	rootParameters[0].ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE;
+	rootParameters[0].ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL;
+	rootParameters[0].DescriptorTable.NumDescriptorRanges = 2;
+	rootParameters[0].DescriptorTable.pDescriptorRanges = range;
+
+	D3D12_STATIC_SAMPLER_DESC sampler = {};
+	sampler.Filter = D3D12_FILTER_MIN_MAG_MIP_POINT;
+	sampler.AddressU = D3D12_TEXTURE_ADDRESS_MODE_BORDER;
+	sampler.AddressV = D3D12_TEXTURE_ADDRESS_MODE_BORDER;
+	sampler.AddressW = D3D12_TEXTURE_ADDRESS_MODE_BORDER;
+	sampler.MipLODBias = 0;
+	sampler.MaxAnisotropy = 0;
+	sampler.ComparisonFunc = D3D12_COMPARISON_FUNC_NEVER;
+	sampler.BorderColor = D3D12_STATIC_BORDER_COLOR_TRANSPARENT_BLACK;
+	sampler.MinLOD = 0.0f;
+	sampler.MaxLOD = D3D12_FLOAT32_MAX;
+	sampler.ShaderRegister = 0;
+	sampler.RegisterSpace = 0;
+	sampler.ShaderVisibility = D3D12_SHADER_VISIBILITY_PIXEL;
+
+	D3D12_VERSIONED_ROOT_SIGNATURE_DESC rootSignatureDescription;
+	rootSignatureDescription.Version = D3D_ROOT_SIGNATURE_VERSION_1_1;
+	rootSignatureDescription.Desc_1_1.NumParameters = 1;
+	rootSignatureDescription.Desc_1_1.pParameters = rootParameters;
+	rootSignatureDescription.Desc_1_1.NumStaticSamplers = 1;
+	rootSignatureDescription.Desc_1_1.pStaticSamplers = &sampler;
+	rootSignatureDescription.Desc_1_1.Flags = rootSignatureFlags;
+
+	ID3DBlob* rootSignature;
+	ID3DBlob* error;
+	res = D3DX12SerializeVersionedRootSignature(&rootSignatureDescription, featureData.HighestVersion, &rootSignature, &error, d3d12svrsf, d3d12srsf);
+	if (FAILED(res))
+	{
+		factory->Release();
+		std::cout << "ERROR: D3DX12SerializeVersionedRootSignature returned " << res << "\n";
+		WMessageBox(fenster->getFensterHandle(), new Text("Fehler"), new Text("D3DX12SerializeVersionedRootSignature ist Fehlgeschlagen."), MB_ICONERROR);
+		if (error)
+			error->Release();
+		return;
+	}
+
+	res = device->CreateRootSignature(0, rootSignature->GetBufferPointer(), rootSignature->GetBufferSize(), __uuidof(ID3D12RootSignature), (void**)&signature);
+	if (FAILED(res))
+	{
+		factory->Release();
+		std::cout << "ERROR: CreateRootSignature returned " << res << "\n";
+		WMessageBox(fenster->getFensterHandle(), new Text("Fehler"), new Text("CreateRootSignature ist Fehlgeschlagen."), MB_ICONERROR);
+		return;
+	}
+	rootSignature->Release();
+
+	D3D12_RASTERIZER_DESC rdesc;
+	rdesc.FillMode = D3D12_FILL_MODE_SOLID;
+	rdesc.CullMode = D3D12_CULL_MODE_BACK;
+	rdesc.FrontCounterClockwise = 0;
+	rdesc.DepthBias = 0;
+	rdesc.DepthBiasClamp = 0.f;
+	rdesc.SlopeScaledDepthBias = 0.f;
+	rdesc.DepthClipEnable = 1;
+	rdesc.MultisampleEnable = 0;
+	rdesc.AntialiasedLineEnable = 0;
+	rdesc.ForcedSampleCount = 0;
+	rdesc.ConservativeRaster = D3D12_CONSERVATIVE_RASTERIZATION_MODE_OFF;
+
+	D3D12_GRAPHICS_PIPELINE_STATE_DESC psoDesc = {};
+	psoDesc.InputLayout = { vertexShader->zInputLayout(), (unsigned)vertexShader->getInputLayoutSize() };
+	psoDesc.pRootSignature = signature;
+	psoDesc.VS = { vertexShader->getCompiledShader(), (unsigned __int64)vertexShader->getCompiledLength() };
+	psoDesc.PS = { pixelShader->getCompiledShader(), (unsigned __int64)pixelShader->getCompiledLength() };
+	psoDesc.RasterizerState = rdesc;
+	psoDesc.BlendState = CD3DX12_BLEND_DESC(D3D12_DEFAULT);
+	psoDesc.DepthStencilState.DepthEnable = FALSE;
+	psoDesc.DepthStencilState.StencilEnable = FALSE;
+	psoDesc.SampleMask = UINT_MAX;
+	psoDesc.PrimitiveTopologyType = D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE;
+	psoDesc.NumRenderTargets = 1;
+	psoDesc.RTVFormats[0] = DXGI_FORMAT_R8G8B8A8_UNORM;
+	psoDesc.SampleDesc.Count = 1;
+
+	D3D12_CPU_DESCRIPTOR_HANDLE sbHeapHandle = shaderBufferHeap->GetCPUDescriptorHandleForHeapStart();
+	unsigned int incr = device->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV);
+	D3D12_CONSTANT_BUFFER_VIEW_DESC desc;
+	vertexShader->getViewDesc(0, desc);
+	device->CreateConstantBufferView(&desc, sbHeapHandle);
+	res = device->GetDeviceRemovedReason();
+	sbHeapHandle.ptr += incr;
+	vertexShader->getViewDesc(1, desc);
+	device->CreateConstantBufferView(&desc, sbHeapHandle);
+	sbHeapHandle.ptr += incr;
+	pixelShader->getViewDesc(2, desc);
+	device->CreateConstantBufferView(&desc, sbHeapHandle);
+	sbHeapHandle.ptr += incr;
+	pixelShader->getViewDesc(3, desc);
+	device->CreateConstantBufferView(&desc, sbHeapHandle);
+	sbHeapHandle.ptr += incr;
+	pixelShader->getViewDesc(4, desc);
+	device->CreateConstantBufferView(&desc, sbHeapHandle);
+	sbHeapHandle.ptr += incr;
+
+	uiTextur->updateTextur();
+
+	D3D12_SHADER_RESOURCE_VIEW_DESC vd;
+	vd.Format = DXGI_FORMAT_B8G8R8A8_UNORM;
+	vd.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2D;
+	vd.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING;
+	vd.Texture2D.MipLevels = 1;
+	vd.Texture2D.MostDetailedMip = 0;
+	vd.Texture2D.PlaneSlice = 0;
+	vd.Texture2D.ResourceMinLODClamp = 0;
+	device->CreateShaderResourceView(((DX12Textur*)uiTextur)->getResource(), &vd, sbHeapHandle);
+
+	directCommandQueue->execute();
+
+	res = device->CreateGraphicsPipelineState(&psoDesc, __uuidof(ID3D12PipelineState), (void**)&pipeline);
+	if (FAILED(res))
+	{
+		factory->Release();
+		std::cout << "ERROR: CreatePipelineState returned " << res << "\n";
+		WMessageBox(fenster->getFensterHandle(), new Text("Fehler"), new Text("CreatePipelineState ist Fehlgeschlagen."), MB_ICONERROR);
+		return;
+	}
+
+	factory->Release();
 }
 
 void DirectX12::update()
 {
-    if( !device || !swapChain || !directCommandQueue )
-        return;
-    directCommandQueue->flush();
-    copyCommandQueue->flush();
-    computeCommandQueue->flush();
-    modelList->removeAll();
-    HINSTANCE dxgiDLL = getDLLRegister()->ladeDLL( "dxgi.dll", "dxgi.dll" );
-    if( !dxgiDLL )
-    {
-        WMessageBox( fenster->getFensterHandle(), new Text( "Fehler" ), new Text( "dxgi.dll konnte nicht gefunden werden." ), MB_ICONERROR );
-        return;
-    }
-    CreateDXGIFactory2Function createFactory = (CreateDXGIFactory2Function)GetProcAddress( dxgiDLL, "CreateDXGIFactory2" );
-    if( !createFactory )
-    {
-        getDLLRegister()->releaseDLL( "dxgi.dll" );
-        WMessageBox( fenster->getFensterHandle(), new Text( "Fehler" ), new Text( "Der Einstiegspunkt CreateDXGIFactory2 fon DXGI konnte nicht gefunden werden." ), MB_ICONERROR );
-        return;
-    }
-    DXGI_SWAP_CHAIN_DESC swapChainDesc = {};
-    HRESULT res = swapChain->GetDesc( &swapChainDesc );
-    if( FAILED( res ) )
-    {
-        getDLLRegister()->releaseDLL( "dxgi.dll" );
-        std::cout << "ERROR: GetDesc returned " << res << "\n";
-        WMessageBox( fenster->getFensterHandle(), new Text( "Fehler" ), new Text( "GetDesc ist Fehlgeschlagen." ), MB_ICONERROR );
-        return;
-    }
-    IDXGIFactory4* factory;
-    UINT createFactoryFlags = 0;
+	if (!device || !swapChain || !directCommandQueue)
+		return;
+	directCommandQueue->flush();
+	copyCommandQueue->flush();
+	computeCommandQueue->flush();
+	modelList->removeAll();
+	HINSTANCE dxgiDLL = getDLLRegister()->ladeDLL("dxgi.dll", "dxgi.dll");
+	if (!dxgiDLL)
+	{
+		WMessageBox(fenster->getFensterHandle(), new Text("Fehler"), new Text("dxgi.dll konnte nicht gefunden werden."), MB_ICONERROR);
+		return;
+	}
+	CreateDXGIFactory2Function createFactory = (CreateDXGIFactory2Function)GetProcAddress(dxgiDLL, "CreateDXGIFactory2");
+	if (!createFactory)
+	{
+		getDLLRegister()->releaseDLL("dxgi.dll");
+		WMessageBox(fenster->getFensterHandle(), new Text("Fehler"), new Text("Der Einstiegspunkt CreateDXGIFactory2 fon DXGI konnte nicht gefunden werden."), MB_ICONERROR);
+		return;
+	}
+	DXGI_SWAP_CHAIN_DESC swapChainDesc = {};
+	HRESULT res = swapChain->GetDesc(&swapChainDesc);
+	if (FAILED(res))
+	{
+		getDLLRegister()->releaseDLL("dxgi.dll");
+		std::cout << "ERROR: GetDesc returned " << res << "\n";
+		WMessageBox(fenster->getFensterHandle(), new Text("Fehler"), new Text("GetDesc ist Fehlgeschlagen."), MB_ICONERROR);
+		return;
+	}
+	IDXGIFactory4* factory;
+	UINT createFactoryFlags = 0;
 #if defined(_DEBUG)
-    createFactoryFlags = DXGI_CREATE_FACTORY_DEBUG;
+	createFactoryFlags = DXGI_CREATE_FACTORY_DEBUG;
 #endif
-    res = createFactory( createFactoryFlags, __uuidof(IDXGIFactory4), (void**)&factory );
-    if( FAILED( res ) )
-    {
-        getDLLRegister()->releaseDLL( "dxgi.dll" );
-        std::cout << "ERROR: createFactory returned " << res << "\n";
-        WMessageBox( fenster->getFensterHandle(), new Text( "Fehler" ), new Text( "createFactory ist Fehlgeschlagen." ), MB_ICONERROR );
-        return;
-    }
-    for( int i = 0; i < 2; ++i )
-    {
-        backBuffer[ i ]->Release();
-        backBuffer[ i ] = 0;
-    }
-    res = swapChain->ResizeBuffers( 2, backBufferSize.x, backBufferSize.y,
-                                    swapChainDesc.BufferDesc.Format, swapChainDesc.Flags );
-    backBufferIndex = swapChain->GetCurrentBackBufferIndex();
-
-    auto rtvDescriptorSize = device->GetDescriptorHandleIncrementSize( D3D12_DESCRIPTOR_HEAP_TYPE_RTV );
-    D3D12_CPU_DESCRIPTOR_HANDLE rtvHandle( rtvHeap->GetCPUDescriptorHandleForHeapStart() );
-
-    for( int i = 0; i < 2; i++ )
-    {
-        ID3D12Resource* backBuffer;
-        res = swapChain->GetBuffer( i, __uuidof(ID3D12Resource), (void**)&backBuffer );
-        if( FAILED( res ) )
-        {
-            getDLLRegister()->releaseDLL( "dxgi.dll" );
-            factory->Release();
-            std::cout << "ERROR: GetBuffer returned " << res << "\n";
-            WMessageBox( fenster->getFensterHandle(), new Text( "Fehler" ), new Text( "GetBuffer ist Fehlgeschlagen." ), MB_ICONERROR );
-            return;
-        }
-
-        device->CreateRenderTargetView( backBuffer, nullptr, rtvHandle );
-
-        this->backBuffer[ i ] = backBuffer;
-
-        rtvHandle.ptr += rtvDescriptorSize;
-    }
-    getDLLRegister()->releaseDLL( "dxgi.dll" );
-
-    delete viewPort;
-    viewPort = new D3D12_VIEWPORT();
-    viewPort->Width = (float)this->backBufferSize.x;
-    viewPort->Height = (float)this->backBufferSize.y;
-    viewPort->MinDepth = 0.0f;
-    viewPort->MaxDepth = 1.0f;
-    viewPort->TopLeftX = 0.0f;
-    viewPort->TopLeftY = 0.0f;
-
-    depthBuffer->Release();
-
-    D3D12_CLEAR_VALUE optimizedClearValue = {};
-    optimizedClearValue.Format = DXGI_FORMAT_D32_FLOAT;
-    optimizedClearValue.DepthStencil = { 1.0f, 0 };
-
-    res = device->CreateCommittedResource(
-        &CD3DX12_HEAP_PROPERTIES( D3D12_HEAP_TYPE_DEFAULT ),
-        D3D12_HEAP_FLAG_NONE,
-        &CD3DX12_RESOURCE_DESC::Tex2D( DXGI_FORMAT_D32_FLOAT, this->backBufferSize.x, this->backBufferSize.y,
-                                       1, 0, 1, 0, D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL ),
-        D3D12_RESOURCE_STATE_DEPTH_WRITE,
-        0,
-        __uuidof(ID3D12Resource),
-        (void**)&depthBuffer
-    );
-    if( FAILED( res ) )
-    {
-        factory->Release();
-        std::cout << "ERROR: CreateCommittedResource returned " << res << "\n";
-        WMessageBox( fenster->getFensterHandle(), new Text( "Fehler" ), new Text( "CreateCommittedResource ist Fehlgeschlagen." ), MB_ICONERROR );
-        return;
-    }
-
-    D3D12_DEPTH_STENCIL_VIEW_DESC dsv = {};
-    dsv.Format = DXGI_FORMAT_D32_FLOAT;
-    dsv.ViewDimension = D3D12_DSV_DIMENSION_TEXTURE2D;
-    dsv.Texture2D.MipSlice = 0;
-    dsv.Flags = D3D12_DSV_FLAG_NONE;
-
-    device->CreateDepthStencilView( depthBuffer, &dsv,
-                                    dsvHeap->GetCPUDescriptorHandleForHeapStart() );
-
-    if( uiTextur )
-        uiTextur->release();
-
-    Bild* renderB = new Bild( 1 );
-    renderB->setAlpha3D( 1 );
-    renderB->neuBild( this->backBufferSize.x, this->backBufferSize.y, 0 );
-    uiTextur = createOrGetTextur( "_f_Render_Bild", renderB );
-
-    texturModel->setTextur( dynamic_cast<Textur*>(uiTextur->getThis()) );
-
-    factory->Release();
+	res = createFactory(createFactoryFlags, __uuidof(IDXGIFactory4), (void**)&factory);
+	if (FAILED(res))
+	{
+		getDLLRegister()->releaseDLL("dxgi.dll");
+		std::cout << "ERROR: createFactory returned " << res << "\n";
+		WMessageBox(fenster->getFensterHandle(), new Text("Fehler"), new Text("createFactory ist Fehlgeschlagen."), MB_ICONERROR);
+		return;
+	}
+	for (int i = 0; i < 2; ++i)
+	{
+		backBuffer[i]->Release();
+		backBuffer[i] = 0;
+	}
+	res = swapChain->ResizeBuffers(2, backBufferSize.x, backBufferSize.y,
+		swapChainDesc.BufferDesc.Format, swapChainDesc.Flags);
+	backBufferIndex = swapChain->GetCurrentBackBufferIndex();
+
+	auto rtvDescriptorSize = device->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_RTV);
+	D3D12_CPU_DESCRIPTOR_HANDLE rtvHandle(rtvHeap->GetCPUDescriptorHandleForHeapStart());
+
+	for (int i = 0; i < 2; i++)
+	{
+		ID3D12Resource* backBuffer;
+		res = swapChain->GetBuffer(i, __uuidof(ID3D12Resource), (void**)&backBuffer);
+		if (FAILED(res))
+		{
+			getDLLRegister()->releaseDLL("dxgi.dll");
+			factory->Release();
+			std::cout << "ERROR: GetBuffer returned " << res << "\n";
+			WMessageBox(fenster->getFensterHandle(), new Text("Fehler"), new Text("GetBuffer ist Fehlgeschlagen."), MB_ICONERROR);
+			return;
+		}
+
+		device->CreateRenderTargetView(backBuffer, nullptr, rtvHandle);
+
+		this->backBuffer[i] = backBuffer;
+
+		rtvHandle.ptr += rtvDescriptorSize;
+	}
+	getDLLRegister()->releaseDLL("dxgi.dll");
+
+	delete viewPort;
+	viewPort = new D3D12_VIEWPORT();
+	viewPort->Width = (float)this->backBufferSize.x;
+	viewPort->Height = (float)this->backBufferSize.y;
+	viewPort->MinDepth = 0.0f;
+	viewPort->MaxDepth = 1.0f;
+	viewPort->TopLeftX = 0.0f;
+	viewPort->TopLeftY = 0.0f;
+
+	depthBuffer->Release();
+
+	D3D12_CLEAR_VALUE optimizedClearValue = {};
+	optimizedClearValue.Format = DXGI_FORMAT_D32_FLOAT;
+	optimizedClearValue.DepthStencil = { 1.0f, 0 };
+
+	res = device->CreateCommittedResource(
+		&CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_DEFAULT),
+		D3D12_HEAP_FLAG_NONE,
+		&CD3DX12_RESOURCE_DESC::Tex2D(DXGI_FORMAT_D32_FLOAT, this->backBufferSize.x, this->backBufferSize.y,
+			1, 0, 1, 0, D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL),
+		D3D12_RESOURCE_STATE_DEPTH_WRITE,
+		0,
+		__uuidof(ID3D12Resource),
+		(void**)&depthBuffer
+	);
+	if (FAILED(res))
+	{
+		factory->Release();
+		std::cout << "ERROR: CreateCommittedResource returned " << res << "\n";
+		WMessageBox(fenster->getFensterHandle(), new Text("Fehler"), new Text("CreateCommittedResource ist Fehlgeschlagen."), MB_ICONERROR);
+		return;
+	}
+
+	D3D12_DEPTH_STENCIL_VIEW_DESC dsv = {};
+	dsv.Format = DXGI_FORMAT_D32_FLOAT;
+	dsv.ViewDimension = D3D12_DSV_DIMENSION_TEXTURE2D;
+	dsv.Texture2D.MipSlice = 0;
+	dsv.Flags = D3D12_DSV_FLAG_NONE;
+
+	device->CreateDepthStencilView(depthBuffer, &dsv,
+		dsvHeap->GetCPUDescriptorHandleForHeapStart());
+
+	if (uiTextur)
+		uiTextur->release();
+
+	Bild* renderB = new Bild(1);
+	renderB->setAlpha3D(1);
+	renderB->neuBild(this->backBufferSize.x, this->backBufferSize.y, 0);
+	uiTextur = createOrGetTextur("_f_Render_Bild", renderB);
+
+	texturModel->setTextur(dynamic_cast<Textur*>(uiTextur->getThis()));
+
+	factory->Release();
 }
 
-void DirectX12::beginFrame( bool fill2D, bool fill3D, int fillColor )
+void DirectX12::beginFrame(bool fill2D, bool fill3D, int fillColor)
 {
-    D3D12_RESOURCE_BARRIER barrier;
-    ZeroMemory( &barrier, sizeof( barrier ) );
-    barrier.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION;
-    barrier.Flags = D3D12_RESOURCE_BARRIER_FLAG_NONE;
-    barrier.Transition.pResource = this->backBuffer[ backBufferIndex ];
-    barrier.Transition.StateBefore = D3D12_RESOURCE_STATE_PRESENT;
-    barrier.Transition.StateAfter = D3D12_RESOURCE_STATE_RENDER_TARGET;
-    barrier.Transition.Subresource = D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES;
-
-    directCommandQueue->getCommandList()->ResourceBarrier( 1, &barrier );
-
-    if( fill2D )
-        uiTextur->zBild()->setFarbe( fillColor );
-    if( fill3D )
-    {
-        float color[ 4 ];
-        // Setup the color to clear the buffer.
-        color[ 0 ] = ((fillColor >> 16) & 0xFF) / 255.f; // R
-        color[ 1 ] = ((fillColor >> 8) & 0xFF) / 255.f; // G
-        color[ 2 ] = (fillColor & 0xFF) / 255.f; // B
-        color[ 3 ] = ((fillColor >> 24) & 0xFF) / 255.f; // A
-
-        auto rtvDescriptorSize = device->GetDescriptorHandleIncrementSize( D3D12_DESCRIPTOR_HEAP_TYPE_RTV );
-        D3D12_CPU_DESCRIPTOR_HANDLE rtv = rtvHeap->GetCPUDescriptorHandleForHeapStart();
-        rtv.ptr += rtvDescriptorSize * backBufferIndex;
-
-        directCommandQueue->getCommandList()->OMSetRenderTargets( 1, &rtv, 0, 0 );
-        directCommandQueue->getCommandList()->ClearRenderTargetView( rtv, color, 0, 0 );
-    }
-    int lc[] = { 0, 0 };
-    pixelShader->füllConstBuffer( (char*)lc, 4, sizeof( int ) * 2 );
+	D3D12_RESOURCE_BARRIER barrier;
+	ZeroMemory(&barrier, sizeof(barrier));
+	barrier.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION;
+	barrier.Flags = D3D12_RESOURCE_BARRIER_FLAG_NONE;
+	barrier.Transition.pResource = this->backBuffer[backBufferIndex];
+	barrier.Transition.StateBefore = D3D12_RESOURCE_STATE_PRESENT;
+	barrier.Transition.StateAfter = D3D12_RESOURCE_STATE_RENDER_TARGET;
+	barrier.Transition.Subresource = D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES;
+
+	directCommandQueue->getCommandList()->ResourceBarrier(1, &barrier);
+
+	if (fill2D)
+		uiTextur->zBild()->setFarbe(fillColor);
+	if (fill3D)
+	{
+		float color[4];
+		// Setup the color to clear the buffer.
+		color[0] = ((fillColor >> 16) & 0xFF) / 255.f; // R
+		color[1] = ((fillColor >> 8) & 0xFF) / 255.f; // G
+		color[2] = (fillColor & 0xFF) / 255.f; // B
+		color[3] = ((fillColor >> 24) & 0xFF) / 255.f; // A
+
+		auto rtvDescriptorSize = device->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_RTV);
+		D3D12_CPU_DESCRIPTOR_HANDLE rtv = rtvHeap->GetCPUDescriptorHandleForHeapStart();
+		rtv.ptr += rtvDescriptorSize * backBufferIndex;
+
+		directCommandQueue->getCommandList()->OMSetRenderTargets(1, &rtv, 0, 0);
+		directCommandQueue->getCommandList()->ClearRenderTargetView(rtv, color, 0, 0);
+	}
+	int lc[] = { 0, 0 };
+	pixelShader->füllConstBuffer((char*)lc, 4, sizeof(int) * 2);
 }
 
-void DirectX12::renderObject( Model3D* zObj )
+void DirectX12::renderObject(Model3D* zObj)
 {
-    Mat4< float > trans = Mat4< float >::identity();
-    zObj->zModelData()->zDXVertexBuffer()->copieren();
-    zObj->zModelData()->zDXIndexBuffer()->copieren();
-    int anz = zObj->errechneMatrizen( trans, matrixBuffer );
-    if( vertexShader )
-        vertexShader->füllConstBuffer( (char*)matrixBuffer, 1, sizeof( Mat4< float > ) * anz );
-    float matirialBuffer[ 3 ]; // light factors (phong model)
-    matirialBuffer[ 0 ] = zObj->getAmbientFactor();
-    matirialBuffer[ 1 ] = zObj->getDiffusFactor();
-    matirialBuffer[ 2 ] = zObj->getSpecularFactor();
-    if( pixelShader )
-        pixelShader->füllConstBuffer( (char*)matirialBuffer, 3, sizeof( float ) * 3 );
-    unsigned int offset = 0;
-    unsigned int es = (unsigned)zObj->zModelData()->zDXVertexBuffer()->getElementLength();
-    Model3DTextur* zTextur = zObj->zTextur();
-    int ind = 0;
-    for( auto i = zObj->zModelData()->getPolygons(); i; i++ )
-    {
-        if( zObj->needRenderPolygon( ind ) )
-        {
-            Textur* t = zTextur->zPolygonTextur( ind );
-            //if( t &&t->brauchtUpdate() )
-            //    t->updateTextur();
-            DXGI_FORMAT f = DXGI_FORMAT_R32_UINT;
-            if( zObj->zModelData()->zDXIndexBuffer()->getElementLength() == 2 )
-                f = DXGI_FORMAT_R16_UINT;
-            if( zObj->zModelData()->zDXIndexBuffer()->getElementLength() == 1 )
-                f = DXGI_FORMAT_R8_UINT;
-            indexBufferView->Format = f;
-            if( t )
-            {
-                /*ID3D11ShaderResourceView *v[ 3 ];
-                v[ 0 ] = *(DX11Textur *)t;
-                v[ 1 ] = *diffuseLights;
-                v[ 2 ] = *pointLights;
-                d3d11Context->PSSetShaderResources( 0, 3, v );
-                d3d11Context->DrawIndexed( indexBuffer->getElementAnzahl(), 0, 0 );*/
-                directCommandQueue->getCommandList()->SetPipelineState( pipeline );
-                directCommandQueue->getCommandList()->SetGraphicsRootSignature( signature );
-                directCommandQueue->getCommandList()->SetDescriptorHeaps( 1, &shaderBufferHeap );
-                directCommandQueue->getCommandList()->SetGraphicsRootDescriptorTable( 0, shaderBufferHeap->GetGPUDescriptorHandleForHeapStart() );
-                directCommandQueue->getCommandList()->RSSetViewports( 1, viewPort );
-                directCommandQueue->getCommandList()->RSSetScissorRects( 1, allowedRenderArea );
-                auto rtvDescriptorSize = device->GetDescriptorHandleIncrementSize( D3D12_DESCRIPTOR_HEAP_TYPE_RTV );
-                D3D12_CPU_DESCRIPTOR_HANDLE rtv = rtvHeap->GetCPUDescriptorHandleForHeapStart();
-                rtv.ptr += rtvDescriptorSize * backBufferIndex;
-                directCommandQueue->getCommandList()->OMSetRenderTargets( 1, &rtv, 0, 0 );
-                indexBufferView->SizeInBytes = zObj->zModelData()->zDXIndexBuffer()->getElementAnzahl() * zObj->zModelData()->zDXIndexBuffer()->getElementLength();
-                indexBufferView->BufferLocation = ((DX12Buffer*)zObj->zModelData()->zDXIndexBuffer())->zBuffer()->GetGPUVirtualAddress();
-                directCommandQueue->getCommandList()->IASetIndexBuffer( indexBufferView );
-                vertexBufferView->SizeInBytes = zObj->zModelData()->zDXVertexBuffer()->getElementAnzahl() * zObj->zModelData()->zDXVertexBuffer()->getElementLength();
-                vertexBufferView->BufferLocation = ((DX12Buffer*)zObj->zModelData()->zDXVertexBuffer())->zBuffer()->GetGPUVirtualAddress();
-                directCommandQueue->getCommandList()->IASetVertexBuffers( 0, 1, vertexBufferView );
-                directCommandQueue->getCommandList()->IASetPrimitiveTopology( D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST );
-                directCommandQueue->getCommandList()->DrawIndexedInstanced( zObj->zModelData()->zDXIndexBuffer()->getElementAnzahl(), 1, 0, 0, 0 );
-            }
-            else
-            {
-                /*d3d11Context->RSSetState( meshRS );
-                ID3D11ShaderResourceView *v[ 3 ];
-                v[ 0 ] = *(DX11Textur *)defaultTextur;
-                v[ 1 ] = *diffuseLights;
-                v[ 2 ] = *pointLights;
-                d3d11Context->PSSetShaderResources( 0, 3, v );
-                d3d11Context->DrawIndexed( indexBuffer->getElementAnzahl(), 0, 0 );
-                d3d11Context->RSSetState( texturRS );*/
-                //directCommandQueue->getCommandList()->DrawIndexedInstanced( indexBuffer->getElementAnzahl(), 1, 0, 0, 0 );
-            }
-        }
-        ind++;
-    }
+	Mat4< float > trans = Mat4< float >::identity();
+	zObj->zModelData()->zDXVertexBuffer()->copieren();
+	zObj->zModelData()->zDXIndexBuffer()->copieren();
+	int anz = zObj->errechneMatrizen(trans, matrixBuffer);
+	if (vertexShader)
+		vertexShader->füllConstBuffer((char*)matrixBuffer, 1, sizeof(Mat4< float >) * anz);
+	float matirialBuffer[3]; // light factors (phong model)
+	matirialBuffer[0] = zObj->getAmbientFactor();
+	matirialBuffer[1] = zObj->getDiffusFactor();
+	matirialBuffer[2] = zObj->getSpecularFactor();
+	if (pixelShader)
+		pixelShader->füllConstBuffer((char*)matirialBuffer, 3, sizeof(float) * 3);
+	unsigned int offset = 0;
+	unsigned int es = (unsigned)zObj->zModelData()->zDXVertexBuffer()->getElementLength();
+	Model3DTextur* zTextur = zObj->zTextur();
+	int ind = 0;
+	zObj->beforeRender(this, vertexShader, pixelShader);
+	for (auto i = zObj->zModelData()->getPolygons(); i; i++)
+	{
+		if (zObj->needRenderPolygon(ind))
+		{
+			Textur* t = zTextur->zPolygonTextur(ind);
+			//if( t &&t->brauchtUpdate() )
+			//    t->updateTextur();
+			DXGI_FORMAT f = DXGI_FORMAT_R32_UINT;
+			if (zObj->zModelData()->zDXIndexBuffer()->getElementLength() == 2)
+				f = DXGI_FORMAT_R16_UINT;
+			if (zObj->zModelData()->zDXIndexBuffer()->getElementLength() == 1)
+				f = DXGI_FORMAT_R8_UINT;
+			indexBufferView->Format = f;
+			if (t)
+			{
+				/*ID3D11ShaderResourceView *v[ 3 ];
+				v[ 0 ] = *(DX11Textur *)t;
+				v[ 1 ] = *diffuseLights;
+				v[ 2 ] = *pointLights;
+				d3d11Context->PSSetShaderResources( 0, 3, v );
+				d3d11Context->DrawIndexed( indexBuffer->getElementAnzahl(), 0, 0 );*/
+				directCommandQueue->getCommandList()->SetPipelineState(pipeline);
+				directCommandQueue->getCommandList()->SetGraphicsRootSignature(signature);
+				directCommandQueue->getCommandList()->SetDescriptorHeaps(1, &shaderBufferHeap);
+				directCommandQueue->getCommandList()->SetGraphicsRootDescriptorTable(0, shaderBufferHeap->GetGPUDescriptorHandleForHeapStart());
+				directCommandQueue->getCommandList()->RSSetViewports(1, viewPort);
+				directCommandQueue->getCommandList()->RSSetScissorRects(1, allowedRenderArea);
+				auto rtvDescriptorSize = device->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_RTV);
+				D3D12_CPU_DESCRIPTOR_HANDLE rtv = rtvHeap->GetCPUDescriptorHandleForHeapStart();
+				rtv.ptr += rtvDescriptorSize * backBufferIndex;
+				directCommandQueue->getCommandList()->OMSetRenderTargets(1, &rtv, 0, 0);
+				indexBufferView->SizeInBytes = zObj->zModelData()->zDXIndexBuffer()->getElementAnzahl() * zObj->zModelData()->zDXIndexBuffer()->getElementLength();
+				indexBufferView->BufferLocation = ((DX12Buffer*)zObj->zModelData()->zDXIndexBuffer())->zBuffer()->GetGPUVirtualAddress();
+				directCommandQueue->getCommandList()->IASetIndexBuffer(indexBufferView);
+				vertexBufferView->SizeInBytes = zObj->zModelData()->zDXVertexBuffer()->getElementAnzahl() * zObj->zModelData()->zDXVertexBuffer()->getElementLength();
+				vertexBufferView->BufferLocation = ((DX12Buffer*)zObj->zModelData()->zDXVertexBuffer())->zBuffer()->GetGPUVirtualAddress();
+				directCommandQueue->getCommandList()->IASetVertexBuffers(0, 1, vertexBufferView);
+				directCommandQueue->getCommandList()->IASetPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
+				directCommandQueue->getCommandList()->DrawIndexedInstanced(zObj->zModelData()->zDXIndexBuffer()->getElementAnzahl(), 1, 0, 0, 0);
+			}
+			else
+			{
+				/*d3d11Context->RSSetState( meshRS );
+				ID3D11ShaderResourceView *v[ 3 ];
+				v[ 0 ] = *(DX11Textur *)defaultTextur;
+				v[ 1 ] = *diffuseLights;
+				v[ 2 ] = *pointLights;
+				d3d11Context->PSSetShaderResources( 0, 3, v );
+				d3d11Context->DrawIndexed( indexBuffer->getElementAnzahl(), 0, 0 );
+				d3d11Context->RSSetState( texturRS );*/
+				//directCommandQueue->getCommandList()->DrawIndexedInstanced( indexBuffer->getElementAnzahl(), 1, 0, 0, 0 );
+			}
+		}
+		ind++;
+	}
+	zObj->afterRender(this, pixelShader, vertexShader);
 }
 
 // Überprüft, ob eine Kugel in dem Sichtbaren Raum der Welt liegt und gezeichnet werden muss
 //  pos: Der Mittelpunkt der Kugel
 //  radius: Der Radius der Kugel
 //  dist: Einen Zeiger auf einen float, in dem das quadrat des Abstands zur Kammeraposition gespeichert wird, falls diese Funktion true zurückgiebt und der Zeiger nicht 0 ist
-bool DirectX12::isInFrustrum( const Vec3< float >& pos, float radius, float* dist ) const
+bool DirectX12::isInFrustrum(const Vec3< float >& pos, float radius, float* dist) const
 {
-    for( int i = 0; i < 6; i++ )
-    {
-        if( frustrum[ i ] * pos + radius < 0 )
-            return 0;
-    }
-    if( dist )
-        *dist = kamPos.abstand( pos );
-    return 1;
+	for (int i = 0; i < 6; i++)
+	{
+		if (frustrum[i] * pos + radius < 0)
+			return 0;
+	}
+	if (dist)
+		*dist = kamPos.abstand(pos);
+	return 1;
 }
 
-void DirectX12::renderKamera( Kam3D* zKamera )
+void DirectX12::renderKamera(Kam3D* zKamera)
 {
-    directCommandQueue->getCommandList()->RSSetViewports( 1, (D3D12_VIEWPORT*)zKamera->zViewPort() );
-
-    Mat4< float > tmp = zKamera->getProjectionMatrix() * zKamera->getViewMatrix();
-
-    frustrum[ 0 ].x = tmp.elements[ 3 ][ 0 ] + tmp.elements[ 0 ][ 0 ];
-    frustrum[ 0 ].y = tmp.elements[ 3 ][ 1 ] + tmp.elements[ 0 ][ 1 ];
-    frustrum[ 0 ].z = tmp.elements[ 3 ][ 2 ] + tmp.elements[ 0 ][ 2 ];
-    frustrum[ 0 ].w = tmp.elements[ 3 ][ 3 ] + tmp.elements[ 0 ][ 3 ];
-
-    frustrum[ 1 ].x = tmp.elements[ 3 ][ 0 ] - tmp.elements[ 0 ][ 0 ];
-    frustrum[ 1 ].y = tmp.elements[ 3 ][ 1 ] - tmp.elements[ 0 ][ 1 ];
-    frustrum[ 1 ].z = tmp.elements[ 3 ][ 2 ] - tmp.elements[ 0 ][ 2 ];
-    frustrum[ 1 ].w = tmp.elements[ 3 ][ 3 ] - tmp.elements[ 0 ][ 3 ];
-
-    frustrum[ 2 ].x = tmp.elements[ 3 ][ 0 ] - tmp.elements[ 1 ][ 0 ];
-    frustrum[ 2 ].y = tmp.elements[ 3 ][ 1 ] - tmp.elements[ 1 ][ 1 ];
-    frustrum[ 2 ].z = tmp.elements[ 3 ][ 2 ] - tmp.elements[ 1 ][ 2 ];
-    frustrum[ 2 ].w = tmp.elements[ 3 ][ 3 ] - tmp.elements[ 1 ][ 3 ];
-
-    frustrum[ 3 ].x = tmp.elements[ 3 ][ 0 ] + tmp.elements[ 1 ][ 0 ];
-    frustrum[ 3 ].y = tmp.elements[ 3 ][ 1 ] + tmp.elements[ 1 ][ 1 ];
-    frustrum[ 3 ].z = tmp.elements[ 3 ][ 2 ] + tmp.elements[ 1 ][ 2 ];
-    frustrum[ 3 ].w = tmp.elements[ 3 ][ 3 ] + tmp.elements[ 1 ][ 3 ];
-
-    frustrum[ 4 ].x = tmp.elements[ 2 ][ 0 ];
-    frustrum[ 4 ].y = tmp.elements[ 2 ][ 1 ];
-    frustrum[ 4 ].z = tmp.elements[ 2 ][ 2 ];
-    frustrum[ 4 ].w = tmp.elements[ 2 ][ 3 ];
-
-    frustrum[ 5 ].x = tmp.elements[ 3 ][ 0 ] - tmp.elements[ 2 ][ 0 ];
-    frustrum[ 5 ].y = tmp.elements[ 3 ][ 1 ] - tmp.elements[ 2 ][ 1 ];
-    frustrum[ 5 ].z = tmp.elements[ 3 ][ 2 ] - tmp.elements[ 2 ][ 2 ];
-    frustrum[ 5 ].w = tmp.elements[ 3 ][ 3 ] - tmp.elements[ 2 ][ 3 ];
-
-    for( int i = 0; i < 6; i++ )
-        frustrum[ i ].normalize();
-
-    viewAndProj[ 0 ] = zKamera->getViewMatrix();
-    viewAndProj[ 1 ] = zKamera->getProjectionMatrix();
-    kamPos = zKamera->getWorldPosition();
-    if( vertexShader )
-        vertexShader->füllConstBuffer( (char*)viewAndProj, 0, sizeof( Mat4< float > ) * 2 );
-    if( pixelShader )
-        pixelShader->füllConstBuffer( (char*)&kamPos, 2, sizeof( float ) * 3 );
-    Welt3D* w = zKamera->zWelt();
-    w->forAll( [this]( Model3D* obj ) {
-        if( isInFrustrum( obj->getPos(), obj->getRadius() ) )
-            renderObject( obj );
-    } );
+	directCommandQueue->getCommandList()->RSSetViewports(1, (D3D12_VIEWPORT*)zKamera->zViewPort());
+
+	Mat4< float > tmp = zKamera->getProjectionMatrix() * zKamera->getViewMatrix();
+
+	frustrum[0].x = tmp.elements[3][0] + tmp.elements[0][0];
+	frustrum[0].y = tmp.elements[3][1] + tmp.elements[0][1];
+	frustrum[0].z = tmp.elements[3][2] + tmp.elements[0][2];
+	frustrum[0].w = tmp.elements[3][3] + tmp.elements[0][3];
+
+	frustrum[1].x = tmp.elements[3][0] - tmp.elements[0][0];
+	frustrum[1].y = tmp.elements[3][1] - tmp.elements[0][1];
+	frustrum[1].z = tmp.elements[3][2] - tmp.elements[0][2];
+	frustrum[1].w = tmp.elements[3][3] - tmp.elements[0][3];
+
+	frustrum[2].x = tmp.elements[3][0] - tmp.elements[1][0];
+	frustrum[2].y = tmp.elements[3][1] - tmp.elements[1][1];
+	frustrum[2].z = tmp.elements[3][2] - tmp.elements[1][2];
+	frustrum[2].w = tmp.elements[3][3] - tmp.elements[1][3];
+
+	frustrum[3].x = tmp.elements[3][0] + tmp.elements[1][0];
+	frustrum[3].y = tmp.elements[3][1] + tmp.elements[1][1];
+	frustrum[3].z = tmp.elements[3][2] + tmp.elements[1][2];
+	frustrum[3].w = tmp.elements[3][3] + tmp.elements[1][3];
+
+	frustrum[4].x = tmp.elements[2][0];
+	frustrum[4].y = tmp.elements[2][1];
+	frustrum[4].z = tmp.elements[2][2];
+	frustrum[4].w = tmp.elements[2][3];
+
+	frustrum[5].x = tmp.elements[3][0] - tmp.elements[2][0];
+	frustrum[5].y = tmp.elements[3][1] - tmp.elements[2][1];
+	frustrum[5].z = tmp.elements[3][2] - tmp.elements[2][2];
+	frustrum[5].w = tmp.elements[3][3] - tmp.elements[2][3];
+
+	for (int i = 0; i < 6; i++)
+		frustrum[i].normalize();
+
+	viewAndProj[0] = zKamera->getViewMatrix();
+	viewAndProj[1] = zKamera->getProjectionMatrix();
+	kamPos = zKamera->getWorldPosition();
+	if (vertexShader)
+		vertexShader->füllConstBuffer((char*)viewAndProj, 0, sizeof(Mat4< float >) * 2);
+	if (pixelShader)
+		pixelShader->füllConstBuffer((char*)&kamPos, 2, sizeof(float) * 3);
+	Welt3D* w = zKamera->zWelt();
+	w->forAll([this](Model3D* obj)
+		{
+			if (isInFrustrum(obj->getPos(), obj->getRadius()))
+				renderObject(obj);
+		});
 }
 
 void DirectX12::presentFrame()
 {
-    directCommandQueue->getCommandList()->RSSetViewports( 1, viewPort );
+	directCommandQueue->getCommandList()->RSSetViewports(1, viewPort);
 
-    viewAndProj[ 0 ] = Mat4<float>::identity();
-    viewAndProj[ 1 ] = Mat4<float>::identity();
-    if( vertexShader )
-        vertexShader->füllConstBuffer( (char*)viewAndProj, 0, sizeof( Mat4< float > ) * 2 );
+	viewAndProj[0] = Mat4<float>::identity();
+	viewAndProj[1] = Mat4<float>::identity();
+	if (vertexShader)
+		vertexShader->füllConstBuffer((char*)viewAndProj, 0, sizeof(Mat4< float >) * 2);
 
-    uiTextur->updateTextur();
+	uiTextur->updateTextur();
 
-    if( fenster && !IsIconic( fenster->getFensterHandle() ) )
-        renderObject( texturModel );
+	if (fenster && !IsIconic(fenster->getFensterHandle()))
+		renderObject(texturModel);
 
-    D3D12_RESOURCE_BARRIER barrier;
-    ZeroMemory( &barrier, sizeof( barrier ) );
-    barrier.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION;
-    barrier.Flags = D3D12_RESOURCE_BARRIER_FLAG_NONE;
-    barrier.Transition.pResource = this->backBuffer[ backBufferIndex ];
-    barrier.Transition.StateBefore = D3D12_RESOURCE_STATE_RENDER_TARGET;
-    barrier.Transition.StateAfter = D3D12_RESOURCE_STATE_PRESENT;
-    barrier.Transition.Subresource = D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES;
+	D3D12_RESOURCE_BARRIER barrier;
+	ZeroMemory(&barrier, sizeof(barrier));
+	barrier.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION;
+	barrier.Flags = D3D12_RESOURCE_BARRIER_FLAG_NONE;
+	barrier.Transition.pResource = this->backBuffer[backBufferIndex];
+	barrier.Transition.StateBefore = D3D12_RESOURCE_STATE_RENDER_TARGET;
+	barrier.Transition.StateAfter = D3D12_RESOURCE_STATE_PRESENT;
+	barrier.Transition.Subresource = D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES;
 
-    directCommandQueue->getCommandList()->ResourceBarrier( 1, &barrier );
-    copyCommandQueue->execute();
-    directCommandQueue->execute();
+	directCommandQueue->getCommandList()->ResourceBarrier(1, &barrier);
+	copyCommandQueue->execute();
+	directCommandQueue->execute();
 
-    swapChain->Present( 0, 0 );
+	swapChain->Present(0, 0);
 
-    backBufferIndex = swapChain->GetCurrentBackBufferIndex();
+	backBufferIndex = swapChain->GetCurrentBackBufferIndex();
 }
 
-Textur* DirectX12::createOrGetTextur( const char* name, Bild* b )
+Textur* DirectX12::createOrGetTextur(const char* name, Bild* b)
 {
-    if( !device )
-    {
-        if( b )
-            b->release();
-        return 0;
-    }
-    if( texturRegister->hatTextur( name ) )
-    {
-        Textur* ret = texturRegister->getTextur( name );
-        if( b )
-            ret->setBildZ( b );
-        return ret;
-    }
-    Textur* ret = new DX12Textur( device, copyCommandQueue, directCommandQueue );
-    if( b )
-        ret->setBildZ( b );
-    texturRegister->addTextur( dynamic_cast<Textur*>(ret->getThis()), name );
-    ret->updateTextur();
-    copyCommandQueue->execute();
-    directCommandQueue->execute();
-    return ret;
+	if (!device)
+	{
+		if (b)
+			b->release();
+		return 0;
+	}
+	if (texturRegister->hatTextur(name))
+	{
+		Textur* ret = texturRegister->getTextur(name);
+		if (b)
+			ret->setBildZ(b);
+		return ret;
+	}
+	Textur* ret = new DX12Textur(device, copyCommandQueue, directCommandQueue);
+	if (b)
+		ret->setBildZ(b);
+	texturRegister->addTextur(dynamic_cast<Textur*>(ret->getThis()), name);
+	ret->updateTextur();
+	copyCommandQueue->execute();
+	directCommandQueue->execute();
+	return ret;
 }
 
 Bild* DirectX12::zUIRenderBild() const
 {
-    return uiTextur ? uiTextur->zBild() : 0;
+	return uiTextur ? uiTextur->zBild() : 0;
 }
 
 bool DirectX12::isAvailable()
 {
-    HINSTANCE dxgiDLL = getDLLRegister()->ladeDLL( "dxgi.dll", "dxgi.dll" );
-    if( !dxgiDLL )
-        return 0;
-    HINSTANCE d3d12DLL = getDLLRegister()->ladeDLL( "d3d12.dll", "d3d12.dll" );
-    if( !d3d12DLL )
-    {
-        getDLLRegister()->releaseDLL( "dxgi.dll" );
-        return 0;
-    }
-    CreateDXGIFactory2Function createFactory = (CreateDXGIFactory2Function)GetProcAddress( dxgiDLL, "CreateDXGIFactory2" );
-    if( !createFactory )
-    {
-        getDLLRegister()->releaseDLL( "dxgi.dll" );
-        getDLLRegister()->releaseDLL( "d3d12.dll" );
-        return 0;
-    }
-    D3D12CreateDeviceFunction createDevice = (D3D12CreateDeviceFunction)GetProcAddress( d3d12DLL, "D3D12CreateDevice" );
-    if( !createDevice )
-    {
-        getDLLRegister()->releaseDLL( "dxgi.dll" );
-        getDLLRegister()->releaseDLL( "d3d12.dll" );
-        return 0;
-    }
+	HINSTANCE dxgiDLL = getDLLRegister()->ladeDLL("dxgi.dll", "dxgi.dll");
+	if (!dxgiDLL)
+		return 0;
+	HINSTANCE d3d12DLL = getDLLRegister()->ladeDLL("d3d12.dll", "d3d12.dll");
+	if (!d3d12DLL)
+	{
+		getDLLRegister()->releaseDLL("dxgi.dll");
+		return 0;
+	}
+	CreateDXGIFactory2Function createFactory = (CreateDXGIFactory2Function)GetProcAddress(dxgiDLL, "CreateDXGIFactory2");
+	if (!createFactory)
+	{
+		getDLLRegister()->releaseDLL("dxgi.dll");
+		getDLLRegister()->releaseDLL("d3d12.dll");
+		return 0;
+	}
+	D3D12CreateDeviceFunction createDevice = (D3D12CreateDeviceFunction)GetProcAddress(d3d12DLL, "D3D12CreateDevice");
+	if (!createDevice)
+	{
+		getDLLRegister()->releaseDLL("dxgi.dll");
+		getDLLRegister()->releaseDLL("d3d12.dll");
+		return 0;
+	}
 #ifdef _DEBUG
-    D3D12GetDebugInterfaceFunction getDebugInterface = (D3D12GetDebugInterfaceFunction)GetProcAddress( d3d12DLL, "D3D12GetDebugInterface" );
-    ID3D12Debug* debug = 0;
-    getDebugInterface( __uuidof(ID3D12Debug), (void**)&debug );
-    debug->EnableDebugLayer();
+	D3D12GetDebugInterfaceFunction getDebugInterface = (D3D12GetDebugInterfaceFunction)GetProcAddress(d3d12DLL, "D3D12GetDebugInterface");
+	ID3D12Debug* debug = 0;
+	getDebugInterface(__uuidof(ID3D12Debug), (void**)&debug);
+	debug->EnableDebugLayer();
 #endif
-    IDXGIFactory4* factory;
-    UINT createFactoryFlags = 0;
+	IDXGIFactory4* factory;
+	UINT createFactoryFlags = 0;
 #ifdef _DEBUG
-    createFactoryFlags = DXGI_CREATE_FACTORY_DEBUG;
+	createFactoryFlags = DXGI_CREATE_FACTORY_DEBUG;
 #endif
-    HRESULT res = createFactory( createFactoryFlags, __uuidof(IDXGIFactory4), (void**)&factory );
-    if( FAILED( res ) )
-    {
-        getDLLRegister()->releaseDLL( "dxgi.dll" );
-        getDLLRegister()->releaseDLL( "d3d12.dll" );
-        return 0;
-    }
-    int index = 0;
-    do
-    {
-        IDXGIAdapter1* current;
-        res = factory->EnumAdapters1( index++, &current );
-        if( res == S_OK )
-        {
-            DXGI_ADAPTER_DESC1 dxgiAdapterDesc1;
-            current->GetDesc1( &dxgiAdapterDesc1 );
-            ID3D12Device5* device = 0;
-            if( (dxgiAdapterDesc1.Flags & DXGI_ADAPTER_FLAG_SOFTWARE) == 0 &&
-                SUCCEEDED( createDevice( current, D3D_FEATURE_LEVEL_12_1, __uuidof(ID3D12Device5), (void**)&device ) ) )
-            {
-                device->Release();
-                current->Release();
-                factory->Release();
+	HRESULT res = createFactory(createFactoryFlags, __uuidof(IDXGIFactory4), (void**)&factory);
+	if (FAILED(res))
+	{
+		getDLLRegister()->releaseDLL("dxgi.dll");
+		getDLLRegister()->releaseDLL("d3d12.dll");
+		return 0;
+	}
+	int index = 0;
+	do
+	{
+		IDXGIAdapter1* current;
+		res = factory->EnumAdapters1(index++, &current);
+		if (res == S_OK)
+		{
+			DXGI_ADAPTER_DESC1 dxgiAdapterDesc1;
+			current->GetDesc1(&dxgiAdapterDesc1);
+			ID3D12Device5* device = 0;
+			if ((dxgiAdapterDesc1.Flags & DXGI_ADAPTER_FLAG_SOFTWARE) == 0 &&
+				SUCCEEDED(createDevice(current, D3D_FEATURE_LEVEL_12_1, __uuidof(ID3D12Device5), (void**)&device)))
+			{
+				device->Release();
+				current->Release();
+				factory->Release();
 #ifdef _DEBUG
-                debug->Release();
+				debug->Release();
 #endif
-                getDLLRegister()->releaseDLL( "dxgi.dll" );
-                getDLLRegister()->releaseDLL( "d3d12.dll" );
-                return 1;
-            }
-            current->Release();
-        }
-    } while( res != DXGI_ERROR_NOT_FOUND );
-    factory->Release();
-    getDLLRegister()->releaseDLL( "dxgi.dll" );
-    getDLLRegister()->releaseDLL( "d3d12.dll" );
-    return 0;
+				getDLLRegister()->releaseDLL("dxgi.dll");
+				getDLLRegister()->releaseDLL("d3d12.dll");
+				return 1;
+			}
+			current->Release();
+		}
+	} while (res != DXGI_ERROR_NOT_FOUND);
+	factory->Release();
+	getDLLRegister()->releaseDLL("dxgi.dll");
+	getDLLRegister()->releaseDLL("d3d12.dll");
+	return 0;
 }
 
 DXBuffer* DirectX12::createIndexBuffer()
 {
-    return new DX12IndexBuffer( sizeof( int ), device, copyCommandQueue, directCommandQueue );
+	return new DX12IndexBuffer(sizeof(int), device, copyCommandQueue, directCommandQueue);
 }
 
 DXBuffer* DirectX12::createVertexBuffer()
 {
-    return new DX12VertexBuffer( sizeof( Vertex3D ), device, copyCommandQueue, directCommandQueue );
+	return new DX12VertexBuffer(sizeof(Vertex3D), device, copyCommandQueue, directCommandQueue);
 }

+ 3282 - 242
DX12VertexShader.h

@@ -48,6 +48,7 @@
 // TEXCOORD                 0   xy          1     NONE   float   xy  
 // NORMAL                   0   xyz         2     NONE   float   xyz 
 // KNOCHEN_ID               0   x           3     NONE    uint   x   
+// VERTEX_ID                0   x           4     NONE   float       
 //
 //
 // Output signature:
@@ -60,7 +61,7 @@
 // NORMAL                   0   xyz         3     NONE   float   xyz 
 //
 vs_5_1
-dcl_globalFlags refactoringAllowed
+dcl_globalFlags refactoringAllowed | skipOptimization
 dcl_constantbuffer CB0[0:0][8], immediateIndexed, space=0
 dcl_constantbuffer CB1[1:1][512], dynamicIndexed, space=0
 dcl_input v0.xyz
@@ -71,358 +72,410 @@ dcl_output o0.xyzw
 dcl_output_siv o1.xyzw, position
 dcl_output o2.xy
 dcl_output o3.xyz
-dcl_temps 3
-ishl r0.x, v3.x, l(2)
+dcl_temps 5
+//
+// Initial variable locations:
+//   v0.x <- input.position.x; v0.y <- input.position.y; v0.z <- input.position.z; 
+//   v1.x <- input.tex.x; v1.y <- input.tex.y; 
+//   v2.x <- input.normal.x; v2.y <- input.normal.y; v2.z <- input.normal.z; 
+//   v3.x <- input.knochen; 
+//   v4.x <- input.id; 
+//   o3.x <- <main return value>.normal.x; o3.y <- <main return value>.normal.y; o3.z <- <main return value>.normal.z; 
+//   o2.x <- <main return value>.tex.x; o2.y <- <main return value>.tex.y; 
+//   o1.x <- <main return value>.position.x; o1.y <- <main return value>.position.y; o1.z <- <main return value>.position.z; o1.w <- <main return value>.position.w; 
+//   o0.x <- <main return value>.worldPos.x; o0.y <- <main return value>.worldPos.y; o0.z <- <main return value>.worldPos.z; o0.w <- <main return value>.worldPos.w
+//
+#line 65 "C:\Users\kolja\Desktop\Kolja-Strohm-Games\Allgemein\Framework\DX12VertexShader.hlsl"
+imul null, r0.x, v3.x, l(4)
 dp3 r1.x, v2.xyzx, CB1[1][r0.x + 0].xyzx
 dp3 r1.y, v2.xyzx, CB1[1][r0.x + 1].xyzx
 dp3 r1.z, v2.xyzx, CB1[1][r0.x + 2].xyzx
-dp3 r0.y, r1.xyzx, r1.xyzx
-rsq r0.y, r0.y
-mul o3.xyz, r0.yyyy, r1.xyzx
-mov r1.xyz, v0.xyzx
-mov r1.w, l(1.000000)
-dp4 r2.x, r1.xyzw, CB1[1][r0.x + 0].xyzw
-dp4 r2.y, r1.xyzw, CB1[1][r0.x + 1].xyzw
-dp4 r2.z, r1.xyzw, CB1[1][r0.x + 2].xyzw
-dp4 r2.w, r1.xyzw, CB1[1][r0.x + 3].xyzw
-dp4 r0.x, r2.xyzw, CB0[0][0].xyzw
-dp4 r0.y, r2.xyzw, CB0[0][1].xyzw
-dp4 r0.z, r2.xyzw, CB0[0][2].xyzw
-dp4 r0.w, r2.xyzw, CB0[0][3].xyzw
-dp4 o1.x, r0.xyzw, CB0[0][4].xyzw
-dp4 o1.y, r0.xyzw, CB0[0][5].xyzw
-dp4 o1.z, r0.xyzw, CB0[0][6].xyzw
-dp4 o1.w, r0.xyzw, CB0[0][7].xyzw
-mov o0.xyzw, r2.xyzw
-mov o2.xy, v1.xyxx
+dp3 r0.x, r1.xyzx, r1.xyzx
+rsq r0.x, r0.x
+mul r0.xyz, r0.xxxx, r1.xyzx  // r0.x <- output.normal.x; r0.y <- output.normal.y; r0.z <- output.normal.z
+
+#line 68
+mov r1.xyz, v0.xyzx  // r1.x <- position.x; r1.y <- position.y; r1.z <- position.z
+mov r1.w, l(1.000000)  // r1.w <- position.w
+
+#line 70
+mov r2.xy, v1.xyxx  // r2.x <- output.tex.x; r2.y <- output.tex.y
+
+#line 73
+imul null, r0.w, v3.x, l(4)
+dp4 r3.x, r1.xyzw, CB1[1][r0.w + 0].xyzw  // r3.x <- output.worldPos.x
+dp4 r3.y, r1.xyzw, CB1[1][r0.w + 1].xyzw  // r3.y <- output.worldPos.y
+dp4 r3.z, r1.xyzw, CB1[1][r0.w + 2].xyzw  // r3.z <- output.worldPos.z
+dp4 r3.w, r1.xyzw, CB1[1][r0.w + 3].xyzw  // r3.w <- output.worldPos.w
+
+#line 74
+dp4 r1.x, r3.xyzw, CB0[0][0].xyzw  // r1.x <- output.position.x
+dp4 r1.y, r3.xyzw, CB0[0][1].xyzw  // r1.y <- output.position.y
+dp4 r1.z, r3.xyzw, CB0[0][2].xyzw  // r1.z <- output.position.z
+dp4 r1.w, r3.xyzw, CB0[0][3].xyzw  // r1.w <- output.position.w
+
+#line 75
+dp4 r4.x, r1.xyzw, CB0[0][4].xyzw  // r4.x <- output.position.x
+dp4 r4.y, r1.xyzw, CB0[0][5].xyzw  // r4.y <- output.position.y
+dp4 r4.z, r1.xyzw, CB0[0][6].xyzw  // r4.z <- output.position.z
+dp4 r4.w, r1.xyzw, CB0[0][7].xyzw  // r4.w <- output.position.w
+
+#line 76
+mov o0.xyzw, r3.xyzw
+mov o1.xyzw, r4.xyzw
+mov o3.xyz, r0.xyzx
+mov o2.xy, r2.xyxx
 ret 
-// Approximately 24 instruction slots used
+// Approximately 28 instruction slots used
 #endif
 
 const BYTE DX12VertexShaderBytes[] =
 {
-     68,  88,  66,  67, 189,  31, 
-    198,  11, 194, 238,  54,  18, 
-    222, 139,  23, 227, 122,  64, 
-     97, 214,   1,   0,   0,   0, 
-      0,   8,   0,   0,   5,   0, 
-      0,   0,  52,   0,   0,   0, 
-    120,   2,   0,   0,  12,   3, 
-      0,   0, 164,   3,   0,   0, 
-    100,   7,   0,   0,  82,  68, 
-     69,  70,  60,   2,   0,   0, 
-      2,   0,   0,   0, 156,   0, 
-      0,   0,   2,   0,   0,   0, 
-     60,   0,   0,   0,   1,   5, 
-    254, 255,   0,   5,   0,   0, 
-     20,   2,   0,   0,  19,  19, 
-     68,  37,  60,   0,   0,   0, 
-     24,   0,   0,   0,  40,   0, 
+     68,  88,  66,  67, 143, 159, 
+     51, 206, 204, 188,  60, 216, 
+    255,  63,  38,  66,  48, 142, 
+      9,  17,   1,   0,   0,   0, 
+    144,  78,   0,   0,   6,   0, 
+      0,   0,  56,   0,   0,   0, 
+    124,   2,   0,   0,  52,   3, 
+      0,   0, 204,   3,   0,   0, 
+    236,   7,   0,   0, 136,   8, 
+      0,   0,  82,  68,  69,  70, 
+     60,   2,   0,   0,   2,   0, 
+      0,   0, 156,   0,   0,   0, 
+      2,   0,   0,   0,  60,   0, 
+      0,   0,   1,   5, 254, 255, 
+      5,   5,   0,   0,  20,   2, 
+      0,   0,  19,  19,  68,  37, 
+     60,   0,   0,   0,  24,   0, 
       0,   0,  40,   0,   0,   0, 
-     36,   0,   0,   0,  12,   0, 
+     40,   0,   0,   0,  36,   0, 
+      0,   0,  12,   0,   0,   0, 
+      0,   0,   0,   0, 140,   0, 
       0,   0,   0,   0,   0,   0, 
-    140,   0,   0,   0,   0,   0, 
       0,   0,   0,   0,   0,   0, 
       0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   1,   0, 
       0,   0,   0,   0,   0,   0, 
-      1,   0,   0,   0,   0,   0, 
       0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0, 147,   0, 
+      0,   0, 147,   0,   0,   0, 
       0,   0,   0,   0,   0,   0, 
       0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,   1,   0,   0,   0, 
       0,   0,   0,   0,   0,   0, 
-      1,   0,   0,   0,   1,   0, 
+      0,   0,   1,   0,   0,   0, 
+     75,  97, 109, 101, 114,  97, 
+      0,  83, 107, 101, 108, 101, 
+    116, 116,   0, 171, 140,   0, 
+      0,   0,   1,   0,   0,   0, 
+    204,   0,   0,   0, 128,   0, 
       0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,  75,  97, 109, 101, 
-    114,  97,   0,  83, 107, 101, 
-    108, 101, 116, 116,   0, 171, 
-    140,   0,   0,   0,   1,   0, 
-      0,   0, 204,   0,   0,   0, 
-    128,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-    147,   0,   0,   0,   1,   0, 
-      0,   0, 124,   1,   0,   0, 
-      0,  32,   0,   0,   0,   0, 
+      0,   0,   0,   0, 147,   0, 
+      0,   0,   1,   0,   0,   0, 
+    124,   1,   0,   0,   0,  32, 
       0,   0,   0,   0,   0,   0, 
-    140,   0,   0,   0,   0,   0, 
-      0,   0, 128,   0,   0,   0, 
-      2,   0,   0,   0,  88,   1, 
+      0,   0,   0,   0, 140,   0, 
       0,   0,   0,   0,   0,   0, 
+    128,   0,   0,   0,   2,   0, 
+      0,   0,  88,   1,   0,   0, 
+      0,   0,   0,   0, 255, 255, 
+    255, 255,   0,   0,   0,   0, 
     255, 255, 255, 255,   0,   0, 
-      0,   0, 255, 255, 255, 255, 
-      0,   0,   0,   0,  75,  97, 
-    109, 101, 114,  97,  66, 117, 
-    102, 102, 101, 114,   0, 118, 
-    105, 101, 119,   0, 102, 108, 
-    111,  97, 116,  52, 120,  52, 
-      0, 171,   3,   0,   3,   0, 
-      4,   0,   4,   0,   0,   0, 
+      0,   0,  75,  97, 109, 101, 
+    114,  97,  66, 117, 102, 102, 
+    101, 114,   0, 118, 105, 101, 
+    119,   0, 102, 108, 111,  97, 
+    116,  52, 120,  52,   0, 171, 
+      3,   0,   3,   0,   4,   0, 
+      4,   0,   0,   0,   0,   0, 
       0,   0,   0,   0,   0,   0, 
       0,   0,   0,   0,   0,   0, 
       0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   6,   1, 
-      0,   0, 112, 114, 111, 106, 
-    101,  99, 116, 105, 111, 110, 
-      0, 171,   1,   1,   0,   0, 
-     16,   1,   0,   0,   0,   0, 
-      0,   0,  52,   1,   0,   0, 
-     16,   1,   0,   0,  64,   0, 
-      0,   0,   5,   0,   0,   0, 
-      1,   0,  32,   0,   0,   0, 
-      2,   0,  64,   1,   0,   0, 
+      0,   0,   6,   1,   0,   0, 
+    112, 114, 111, 106, 101,  99, 
+    116, 105, 111, 110,   0, 171, 
+      1,   1,   0,   0,  16,   1, 
       0,   0,   0,   0,   0,   0, 
+     52,   1,   0,   0,  16,   1, 
+      0,   0,  64,   0,   0,   0, 
+      5,   0,   0,   0,   1,   0, 
+     32,   0,   0,   0,   2,   0, 
+     64,   1,   0,   0,   0,   0, 
       0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0, 244,   0, 
-      0,   0, 147,   0,   0,   0, 
-      0,   0,   0,   0,   0,  32, 
-      0,   0,   2,   0,   0,   0, 
-    240,   1,   0,   0,   0,   0, 
-      0,   0, 255, 255, 255, 255, 
-      0,   0,   0,   0, 255, 255, 
-    255, 255,   0,   0,   0,   0, 
-     77,  97, 116, 114, 105, 120, 
-     66, 117, 102, 102, 101, 114, 
-      0, 107, 110, 111,  99, 104, 
-    101, 110,  77,  97, 116, 114, 
-    105, 120,   0, 171,   3,   0, 
-      3,   0,   4,   0,   4,   0, 
-    128,   0,   0,   0,   0,   0, 
       0,   0,   0,   0,   0,   0, 
+      0,   0, 244,   0,   0,   0, 
+    147,   0,   0,   0,   0,   0, 
+      0,   0,   0,  32,   0,   0, 
+      2,   0,   0,   0, 240,   1, 
       0,   0,   0,   0,   0,   0, 
+    255, 255, 255, 255,   0,   0, 
+      0,   0, 255, 255, 255, 255, 
+      0,   0,   0,   0,  77,  97, 
+    116, 114, 105, 120,  66, 117, 
+    102, 102, 101, 114,   0, 107, 
+    110, 111,  99, 104, 101, 110, 
+     77,  97, 116, 114, 105, 120, 
+      0, 171,   3,   0,   3,   0, 
+      4,   0,   4,   0, 128,   0, 
       0,   0,   0,   0,   0,   0, 
-      6,   1,   0,   0, 177,   1, 
-      0,   0, 192,   1,   0,   0, 
-      0,   0,   0,   0,   5,   0, 
-      0,   0,   1,   0,   0,   8, 
-      0,   0,   1,   0, 228,   1, 
       0,   0,   0,   0,   0,   0, 
       0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   6,   1, 
+      0,   0, 177,   1,   0,   0, 
+    192,   1,   0,   0,   0,   0, 
+      0,   0,   5,   0,   0,   0, 
+      1,   0,   0,   8,   0,   0, 
+      1,   0, 228,   1,   0,   0, 
       0,   0,   0,   0,   0,   0, 
-    164,   1,   0,   0,  77, 105, 
-     99, 114, 111, 115, 111, 102, 
-    116,  32,  40,  82,  41,  32, 
-     72,  76,  83,  76,  32,  83, 
-    104,  97, 100, 101, 114,  32, 
-     67, 111, 109, 112, 105, 108, 
-    101, 114,  32,  49,  48,  46, 
-     49,   0,  73,  83,  71,  78, 
-    140,   0,   0,   0,   4,   0, 
-      0,   0,   8,   0,   0,   0, 
-    104,   0,   0,   0,   0,   0, 
       0,   0,   0,   0,   0,   0, 
-      3,   0,   0,   0,   0,   0, 
-      0,   0,   7,   7,   0,   0, 
-    113,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      3,   0,   0,   0,   1,   0, 
-      0,   0,   3,   3,   0,   0, 
-    122,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      3,   0,   0,   0,   2,   0, 
-      0,   0,   7,   7,   0,   0, 
-    129,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      1,   0,   0,   0,   3,   0, 
-      0,   0,   1,   1,   0,   0, 
-     80,  79,  83,  73,  84,  73, 
-     79,  78,   0,  84,  69,  88, 
-     67,  79,  79,  82,  68,   0, 
-     78,  79,  82,  77,  65,  76, 
-      0,  75,  78,  79,  67,  72, 
-     69,  78,  95,  73,  68,   0, 
-     79,  83,  71,  78, 144,   0, 
-      0,   0,   4,   0,   0,   0, 
-      8,   0,   0,   0, 104,   0, 
+      0,   0,   0,   0, 164,   1, 
+      0,   0,  77, 105,  99, 114, 
+    111, 115, 111, 102, 116,  32, 
+     40,  82,  41,  32,  72,  76, 
+     83,  76,  32,  83, 104,  97, 
+    100, 101, 114,  32,  67, 111, 
+    109, 112, 105, 108, 101, 114, 
+     32,  49,  48,  46,  49,   0, 
+     73,  83,  71,  78, 176,   0, 
+      0,   0,   5,   0,   0,   0, 
+      8,   0,   0,   0, 128,   0, 
       0,   0,   0,   0,   0,   0, 
       0,   0,   0,   0,   3,   0, 
       0,   0,   0,   0,   0,   0, 
-     15,   0,   0,   0, 113,   0, 
+      7,   7,   0,   0, 137,   0, 
       0,   0,   0,   0,   0,   0, 
-      1,   0,   0,   0,   3,   0, 
+      0,   0,   0,   0,   3,   0, 
       0,   0,   1,   0,   0,   0, 
-     15,   0,   0,   0, 125,   0, 
+      3,   3,   0,   0, 146,   0, 
       0,   0,   0,   0,   0,   0, 
       0,   0,   0,   0,   3,   0, 
       0,   0,   2,   0,   0,   0, 
-      3,  12,   0,   0, 134,   0, 
+      7,   7,   0,   0, 153,   0, 
       0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   3,   0, 
+      0,   0,   0,   0,   1,   0, 
       0,   0,   3,   0,   0,   0, 
-      7,   8,   0,   0,  80,  79, 
-     83,  73,  84,  73,  79,  78, 
-      0,  83,  86,  95,  80,  79, 
+      1,   1,   0,   0, 164,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   3,   0, 
+      0,   0,   4,   0,   0,   0, 
+      1,   0,   0,   0,  80,  79, 
      83,  73,  84,  73,  79,  78, 
       0,  84,  69,  88,  67,  79, 
      79,  82,  68,   0,  78,  79, 
-     82,  77,  65,  76,   0, 171, 
-    171, 171,  83,  72,  69,  88, 
-    184,   3,   0,   0,  81,   0, 
-      1,   0, 238,   0,   0,   0, 
-    106,   8,   0,   1,  89,   0, 
-      0,   7,  70, 142,  48,   0, 
+     82,  77,  65,  76,   0,  75, 
+     78,  79,  67,  72,  69,  78, 
+     95,  73,  68,   0,  86,  69, 
+     82,  84,  69,  88,  95,  73, 
+     68,   0, 171, 171,  79,  83, 
+     71,  78, 144,   0,   0,   0, 
+      4,   0,   0,   0,   8,   0, 
+      0,   0, 104,   0,   0,   0, 
       0,   0,   0,   0,   0,   0, 
+      0,   0,   3,   0,   0,   0, 
+      0,   0,   0,   0,  15,   0, 
+      0,   0, 113,   0,   0,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,   3,   0,   0,   0, 
+      1,   0,   0,   0,  15,   0, 
+      0,   0, 125,   0,   0,   0, 
       0,   0,   0,   0,   0,   0, 
-      8,   0,   0,   0,   0,   0, 
-      0,   0,  89,   8,   0,   7, 
-     70, 142,  48,   0,   1,   0, 
-      0,   0,   1,   0,   0,   0, 
-      1,   0,   0,   0,   0,   2, 
+      0,   0,   3,   0,   0,   0, 
+      2,   0,   0,   0,   3,  12, 
+      0,   0, 134,   0,   0,   0, 
       0,   0,   0,   0,   0,   0, 
-     95,   0,   0,   3, 114,  16, 
-     16,   0,   0,   0,   0,   0, 
-     95,   0,   0,   3,  50,  16, 
-     16,   0,   1,   0,   0,   0, 
-     95,   0,   0,   3, 114,  16, 
-     16,   0,   2,   0,   0,   0, 
-     95,   0,   0,   3,  18,  16, 
-     16,   0,   3,   0,   0,   0, 
-    101,   0,   0,   3, 242,  32, 
-     16,   0,   0,   0,   0,   0, 
-    103,   0,   0,   4, 242,  32, 
+      0,   0,   3,   0,   0,   0, 
+      3,   0,   0,   0,   7,   8, 
+      0,   0,  80,  79,  83,  73, 
+     84,  73,  79,  78,   0,  83, 
+     86,  95,  80,  79,  83,  73, 
+     84,  73,  79,  78,   0,  84, 
+     69,  88,  67,  79,  79,  82, 
+     68,   0,  78,  79,  82,  77, 
+     65,  76,   0, 171, 171, 171, 
+     83,  72,  69,  88,  24,   4, 
+      0,   0,  81,   0,   1,   0, 
+      6,   1,   0,   0, 106, 136, 
+      0,   1,  89,   0,   0,   7, 
+     70, 142,  48,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   8,   0, 
+      0,   0,   0,   0,   0,   0, 
+     89,   8,   0,   7,  70, 142, 
+     48,   0,   1,   0,   0,   0, 
+      1,   0,   0,   0,   1,   0, 
+      0,   0,   0,   2,   0,   0, 
+      0,   0,   0,   0,  95,   0, 
+      0,   3, 114,  16,  16,   0, 
+      0,   0,   0,   0,  95,   0, 
+      0,   3,  50,  16,  16,   0, 
+      1,   0,   0,   0,  95,   0, 
+      0,   3, 114,  16,  16,   0, 
+      2,   0,   0,   0,  95,   0, 
+      0,   3,  18,  16,  16,   0, 
+      3,   0,   0,   0, 101,   0, 
+      0,   3, 242,  32,  16,   0, 
+      0,   0,   0,   0, 103,   0, 
+      0,   4, 242,  32,  16,   0, 
+      1,   0,   0,   0,   1,   0, 
+      0,   0, 101,   0,   0,   3, 
+     50,  32,  16,   0,   2,   0, 
+      0,   0, 101,   0,   0,   3, 
+    114,  32,  16,   0,   3,   0, 
+      0,   0, 104,   0,   0,   2, 
+      5,   0,   0,   0,  38,   0, 
+      0,   8,   0, 208,   0,   0, 
+     18,   0,  16,   0,   0,   0, 
+      0,   0,  10,  16,  16,   0, 
+      3,   0,   0,   0,   1,  64, 
+      0,   0,   4,   0,   0,   0, 
+     16,   0,   0,  10,  18,   0, 
      16,   0,   1,   0,   0,   0, 
-      1,   0,   0,   0, 101,   0, 
-      0,   3,  50,  32,  16,   0, 
-      2,   0,   0,   0, 101,   0, 
-      0,   3, 114,  32,  16,   0, 
-      3,   0,   0,   0, 104,   0, 
-      0,   2,   3,   0,   0,   0, 
-     41,   0,   0,   7,  18,   0, 
-     16,   0,   0,   0,   0,   0, 
-     10,  16,  16,   0,   3,   0, 
-      0,   0,   1,  64,   0,   0, 
-      2,   0,   0,   0,  16,   0, 
-      0,  10,  18,   0,  16,   0, 
-      1,   0,   0,   0,  70,  18, 
-     16,   0,   2,   0,   0,   0, 
-     70, 130,  48,  32,   1,   0, 
-      0,   0,   1,   0,   0,   0, 
-     10,   0,  16,   0,   0,   0, 
-      0,   0,  16,   0,   0,  11, 
-     34,   0,  16,   0,   1,   0, 
-      0,   0,  70,  18,  16,   0, 
-      2,   0,   0,   0,  70, 130, 
-     48,  48,   1,   0,   0,   0, 
+     70,  18,  16,   0,   2,   0, 
+      0,   0,  70, 130,  48,  32, 
       1,   0,   0,   0,   1,   0, 
       0,   0,  10,   0,  16,   0, 
       0,   0,   0,   0,  16,   0, 
-      0,  11,  66,   0,  16,   0, 
+      0,  11,  34,   0,  16,   0, 
       1,   0,   0,   0,  70,  18, 
      16,   0,   2,   0,   0,   0, 
      70, 130,  48,  48,   1,   0, 
       0,   0,   1,   0,   0,   0, 
-      2,   0,   0,   0,  10,   0, 
-     16,   0,   0,   0,   0,   0, 
-     16,   0,   0,   7,  34,   0, 
-     16,   0,   0,   0,   0,   0, 
-     70,   2,  16,   0,   1,   0, 
-      0,   0,  70,   2,  16,   0, 
-      1,   0,   0,   0,  68,   0, 
-      0,   5,  34,   0,  16,   0, 
-      0,   0,   0,   0,  26,   0, 
+      1,   0,   0,   0,  10,   0, 
      16,   0,   0,   0,   0,   0, 
-     56,   0,   0,   7, 114,  32, 
-     16,   0,   3,   0,   0,   0, 
-     86,   5,  16,   0,   0,   0, 
+     16,   0,   0,  11,  66,   0, 
+     16,   0,   1,   0,   0,   0, 
+     70,  18,  16,   0,   2,   0, 
+      0,   0,  70, 130,  48,  48, 
+      1,   0,   0,   0,   1,   0, 
+      0,   0,   2,   0,   0,   0, 
+     10,   0,  16,   0,   0,   0, 
+      0,   0,  16,   0,   0,   7, 
+     18,   0,  16,   0,   0,   0, 
       0,   0,  70,   2,  16,   0, 
-      1,   0,   0,   0,  54,   0, 
-      0,   5, 114,   0,  16,   0, 
-      1,   0,   0,   0,  70,  18, 
+      1,   0,   0,   0,  70,   2, 
+     16,   0,   1,   0,   0,   0, 
+     68,   0,   0,   5,  18,   0, 
      16,   0,   0,   0,   0,   0, 
-     54,   0,   0,   5, 130,   0, 
+     10,   0,  16,   0,   0,   0, 
+      0,   0,  56,   0,   0,   7, 
+    114,   0,  16,   0,   0,   0, 
+      0,   0,   6,   0,  16,   0, 
+      0,   0,   0,   0,  70,   2, 
+     16,   0,   1,   0,   0,   0, 
+     54,   0,   0,   5, 114,   0, 
+     16,   0,   1,   0,   0,   0, 
+     70,  18,  16,   0,   0,   0, 
+      0,   0,  54,   0,   0,   5, 
+    130,   0,  16,   0,   1,   0, 
+      0,   0,   1,  64,   0,   0, 
+      0,   0, 128,  63,  54,   0, 
+      0,   5,  50,   0,  16,   0, 
+      2,   0,   0,   0,  70,  16, 
      16,   0,   1,   0,   0,   0, 
-      1,  64,   0,   0,   0,   0, 
-    128,  63,  17,   0,   0,  10, 
-     18,   0,  16,   0,   2,   0, 
+     38,   0,   0,   8,   0, 208, 
+      0,   0, 130,   0,  16,   0, 
+      0,   0,   0,   0,  10,  16, 
+     16,   0,   3,   0,   0,   0, 
+      1,  64,   0,   0,   4,   0, 
+      0,   0,  17,   0,   0,  10, 
+     18,   0,  16,   0,   3,   0, 
       0,   0,  70,  14,  16,   0, 
       1,   0,   0,   0,  70, 142, 
      48,  32,   1,   0,   0,   0, 
-      1,   0,   0,   0,  10,   0, 
+      1,   0,   0,   0,  58,   0, 
      16,   0,   0,   0,   0,   0, 
      17,   0,   0,  11,  34,   0, 
-     16,   0,   2,   0,   0,   0, 
+     16,   0,   3,   0,   0,   0, 
      70,  14,  16,   0,   1,   0, 
       0,   0,  70, 142,  48,  48, 
       1,   0,   0,   0,   1,   0, 
       0,   0,   1,   0,   0,   0, 
-     10,   0,  16,   0,   0,   0, 
+     58,   0,  16,   0,   0,   0, 
       0,   0,  17,   0,   0,  11, 
-     66,   0,  16,   0,   2,   0, 
+     66,   0,  16,   0,   3,   0, 
       0,   0,  70,  14,  16,   0, 
       1,   0,   0,   0,  70, 142, 
      48,  48,   1,   0,   0,   0, 
       1,   0,   0,   0,   2,   0, 
-      0,   0,  10,   0,  16,   0, 
+      0,   0,  58,   0,  16,   0, 
       0,   0,   0,   0,  17,   0, 
       0,  11, 130,   0,  16,   0, 
-      2,   0,   0,   0,  70,  14, 
+      3,   0,   0,   0,  70,  14, 
      16,   0,   1,   0,   0,   0, 
      70, 142,  48,  48,   1,   0, 
       0,   0,   1,   0,   0,   0, 
-      3,   0,   0,   0,  10,   0, 
+      3,   0,   0,   0,  58,   0, 
      16,   0,   0,   0,   0,   0, 
      17,   0,   0,   9,  18,   0, 
-     16,   0,   0,   0,   0,   0, 
-     70,  14,  16,   0,   2,   0, 
+     16,   0,   1,   0,   0,   0, 
+     70,  14,  16,   0,   3,   0, 
       0,   0,  70, 142,  48,   0, 
       0,   0,   0,   0,   0,   0, 
       0,   0,   0,   0,   0,   0, 
      17,   0,   0,   9,  34,   0, 
-     16,   0,   0,   0,   0,   0, 
-     70,  14,  16,   0,   2,   0, 
+     16,   0,   1,   0,   0,   0, 
+     70,  14,  16,   0,   3,   0, 
       0,   0,  70, 142,  48,   0, 
       0,   0,   0,   0,   0,   0, 
       0,   0,   1,   0,   0,   0, 
      17,   0,   0,   9,  66,   0, 
-     16,   0,   0,   0,   0,   0, 
-     70,  14,  16,   0,   2,   0, 
+     16,   0,   1,   0,   0,   0, 
+     70,  14,  16,   0,   3,   0, 
       0,   0,  70, 142,  48,   0, 
       0,   0,   0,   0,   0,   0, 
       0,   0,   2,   0,   0,   0, 
      17,   0,   0,   9, 130,   0, 
-     16,   0,   0,   0,   0,   0, 
-     70,  14,  16,   0,   2,   0, 
+     16,   0,   1,   0,   0,   0, 
+     70,  14,  16,   0,   3,   0, 
       0,   0,  70, 142,  48,   0, 
       0,   0,   0,   0,   0,   0, 
       0,   0,   3,   0,   0,   0, 
-     17,   0,   0,   9,  18,  32, 
-     16,   0,   1,   0,   0,   0, 
-     70,  14,  16,   0,   0,   0, 
+     17,   0,   0,   9,  18,   0, 
+     16,   0,   4,   0,   0,   0, 
+     70,  14,  16,   0,   1,   0, 
       0,   0,  70, 142,  48,   0, 
       0,   0,   0,   0,   0,   0, 
       0,   0,   4,   0,   0,   0, 
-     17,   0,   0,   9,  34,  32, 
-     16,   0,   1,   0,   0,   0, 
-     70,  14,  16,   0,   0,   0, 
+     17,   0,   0,   9,  34,   0, 
+     16,   0,   4,   0,   0,   0, 
+     70,  14,  16,   0,   1,   0, 
       0,   0,  70, 142,  48,   0, 
       0,   0,   0,   0,   0,   0, 
       0,   0,   5,   0,   0,   0, 
-     17,   0,   0,   9,  66,  32, 
-     16,   0,   1,   0,   0,   0, 
-     70,  14,  16,   0,   0,   0, 
+     17,   0,   0,   9,  66,   0, 
+     16,   0,   4,   0,   0,   0, 
+     70,  14,  16,   0,   1,   0, 
       0,   0,  70, 142,  48,   0, 
       0,   0,   0,   0,   0,   0, 
       0,   0,   6,   0,   0,   0, 
-     17,   0,   0,   9, 130,  32, 
-     16,   0,   1,   0,   0,   0, 
-     70,  14,  16,   0,   0,   0, 
+     17,   0,   0,   9, 130,   0, 
+     16,   0,   4,   0,   0,   0, 
+     70,  14,  16,   0,   1,   0, 
       0,   0,  70, 142,  48,   0, 
       0,   0,   0,   0,   0,   0, 
       0,   0,   7,   0,   0,   0, 
      54,   0,   0,   5, 242,  32, 
      16,   0,   0,   0,   0,   0, 
-     70,  14,  16,   0,   2,   0, 
+     70,  14,  16,   0,   3,   0, 
       0,   0,  54,   0,   0,   5, 
-     50,  32,  16,   0,   2,   0, 
-      0,   0,  70,  16,  16,   0, 
-      1,   0,   0,   0,  62,   0, 
-      0,   1,  83,  84,  65,  84, 
-    148,   0,   0,   0,  24,   0, 
-      0,   0,   3,   0,   0,   0, 
-      0,   0,   0,   0,   8,   0, 
-      0,   0,  18,   0,   0,   0, 
+    242,  32,  16,   0,   1,   0, 
+      0,   0,  70,  14,  16,   0, 
+      4,   0,   0,   0,  54,   0, 
+      0,   5, 114,  32,  16,   0, 
+      3,   0,   0,   0,  70,   2, 
+     16,   0,   0,   0,   0,   0, 
+     54,   0,   0,   5,  50,  32, 
+     16,   0,   2,   0,   0,   0, 
+     70,   0,  16,   0,   2,   0, 
+      0,   0,  62,   0,   0,   1, 
+     83,  84,  65,  84, 148,   0, 
+      0,   0,  28,   0,   0,   0, 
+      5,   0,   0,   0,   0,   0, 
+      0,   0,   8,   0,   0,   0, 
+     18,   0,   0,   0,   2,   0, 
+      0,   0,   0,   0,   0,   0, 
       1,   0,   0,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
       0,   0,   0,   0,   0,   0, 
       0,   0,   0,   0,   0,   0, 
       0,   0,   0,   0,   0,   0, 
@@ -430,7 +483,2994 @@ const BYTE DX12VertexShaderBytes[] =
       0,   0,   0,   0,   0,   0, 
       0,   0,   0,   0,   0,   0, 
       0,   0,   0,   0,   0,   0, 
-      0,   0,   4,   0,   0,   0, 
+      7,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+     83,  80,  68,  66,   0,  70, 
+      0,   0,  77, 105,  99, 114, 
+    111, 115, 111, 102, 116,  32, 
+     67,  47,  67,  43,  43,  32, 
+     77,  83,  70,  32,  55,  46, 
+     48,  48,  13,  10,  26,  68, 
+     83,   0,   0,   0,   0,   2, 
+      0,   0,   2,   0,   0,   0, 
+     35,   0,   0,   0, 176,   0, 
+      0,   0,   0,   0,   0,   0, 
+     33,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0, 192, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+     56,   0,   0,   0, 252, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255,   5,   0,   0,   0, 
+     32,   0,   0,   0,  60,   0, 
+      0,   0,   0,   0,   0,   0, 
+    255, 255, 255, 255,   0,   0, 
+      0,   0,   6,   0,   0,   0, 
+      5,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   3,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+    148,  46,  49,   1, 150, 135, 
+    134,  98,   1,   0,   0,   0, 
+     43,  99,  30, 242, 214, 145, 
+    140,  68, 175, 159,  85, 170, 
+    134,  57, 241, 115,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      1,   0,   0,   0,   1,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0, 220,  81,  51,   1, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0, 117,  99, 116,  32, 
+     75,  97, 109, 101, 114,  97, 
+     66, 117, 102, 102, 101, 114, 
+     50,  13,  10, 123,  13,  10, 
+      9, 102, 108, 111,  97, 116, 
+     52,  32, 107,  80, 111, 115, 
+    105, 116, 105, 111, 110,  59, 
+     13,  10, 125,  59,  13,  10, 
+     13,  10,  47,  47,  32, 116, 
+    104, 101, 115, 101,  32, 118, 
+     97, 108, 117, 101, 115,  32, 
+    115, 104, 111, 117, 108, 100, 
+     32, 115, 117, 109,  32, 117, 
+    112,  32, 116, 111,  32,  49, 
+     13,  10, 115, 116, 114, 117, 
+     99, 116,  32,  77,  97, 116, 
+    101, 114, 105,  97, 108,  13, 
+     10, 123,  13,  10,   9, 102, 
+    108, 111,  97, 116,  32,  97, 
+    109,  98, 105, 101, 110, 116, 
+     70,  97,  99, 116, 111, 114, 
+     59,  13,  10,   9, 102, 108, 
+    111,  97, 116,  32, 100, 105, 
+    102, 102, 117, 115,  70,  97, 
+     99, 116, 111, 114,  59,  13, 
+     10,   9, 102, 108, 111,  97, 
+    116,  32, 115, 112, 101,  99, 
+    117, 108,  97, 114,  70,  97, 
+     99, 116, 111, 114,  59,  13, 
+     10, 125,  59,  13,  10,  13, 
+     10, 115, 116, 114, 117,  99, 
+    116,  32,  76, 105, 103, 104, 
+    116,  67, 111, 117, 110, 116, 
+     13,  10, 123,  13,  10,   9, 
+    105, 110, 116,  32, 100, 105, 
+    102, 102, 117, 115, 101,  76, 
+    105, 103, 104, 116,  67, 111, 
+    117, 110, 116,  59,  13,  10, 
+      9, 105, 110, 116,  32, 112, 
+    111, 105, 110, 116,  76, 105, 
+    103, 104, 116,  67, 111, 117, 
+    110, 116,  59,  13,  10, 125, 
+     59,  13,  10,  13,  10,  67, 
+    111, 110, 115, 116,  97, 110, 
+    116,  66, 117, 102, 102, 101, 
+    114,  60,  75,  97, 109, 101, 
+    114,  97,  66, 117, 102, 102, 
+    101, 114,  62,  32,  75,  97, 
+    109, 101, 114,  97,  32,  58, 
+     32, 114, 101, 103, 105, 115, 
+    116, 101, 114,  40,  98,  48, 
+     41,  59,  13,  10,  67, 111, 
+    110, 115, 116,  97, 110, 116, 
+     66, 117, 102, 102, 101, 114, 
+     60,  77,  97, 116, 114, 105, 
+    120,  66, 117, 102, 102, 101, 
+    114,  62,  32,  83, 107, 101, 
+    108, 101, 116, 116,  32,  58, 
+     32, 114, 101, 103, 105, 115, 
+    116, 101, 114,  40,  98,  49, 
+     41,  59,  13,  10,  67, 111, 
+    110, 115, 116,  97, 110, 116, 
+     66, 117, 102, 102, 101, 114, 
+     60,  75,  97, 109, 101, 114, 
+     97,  66, 117, 102, 102, 101, 
+    114,  50,  62,  32,  75,  97, 
+    109, 101, 114,  97,  50,  32, 
+     58,  32, 114, 101, 103, 105, 
+    115, 116, 101, 114,  40,  98, 
+     50,  41,  59,  13,  10,  67, 
+    111, 110, 115, 116,  97, 110, 
+    116,  66, 117, 102, 102, 101, 
+    114,  60,  77,  97, 116, 101, 
+    114, 105,  97, 108,  62,  32, 
+     79,  98, 106, 101,  99, 116, 
+     32,  58,  32, 114, 101, 103, 
+    105, 115, 116, 101, 114,  40, 
+     98,  51,  41,  59,  13,  10, 
+     67, 111, 110, 115, 116,  97, 
+    110, 116,  66, 117, 102, 102, 
+    101, 114,  60,  76, 105, 103, 
+    104, 116,  67, 111, 117, 110, 
+    116,  62,  32,  76, 105, 103, 
+    104, 116,  32,  58,  32, 114, 
+    101, 103, 105, 115, 116, 101, 
+    114,  40,  98,  52,  76, 232, 
+      3,   0, 117, 131,   1,   0, 
+    108, 145,   3,   0, 146, 183, 
+      2,   0,  38, 247,   2,   0, 
+    198,  90,   0,   0,   4,  71, 
+      2,   0,  43, 236,   3,   0, 
+    217,  42,   2,   0,  18,  44, 
+      0,   0, 103, 159,   1,   0, 
+    179, 120,   1,   0, 238,  97, 
+      2,   0,  90,  28,   0,   0, 
+     90, 114,   1,   0,  53, 174, 
+      3,   0, 206,  21,   0,   0, 
+    193, 205,   3,   0, 207, 193, 
+      1,   0,  62,   3,   3,   0, 
+    223,  60,   0,   0, 118, 199, 
+      0,   0,   0,  16,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+     13,  10,  84, 101, 120, 116, 
+    117, 114, 101,  50,  68,  32, 
+    115, 104,  97, 100, 101, 114, 
+     84, 101, 120, 116, 117, 114, 
+    101,  32,  58,  32, 114, 101, 
+    103, 105, 115, 116, 101, 114, 
+     40, 116,  48,  41,  59,  13, 
+     10,  83,  97, 109, 112, 108, 
+    101, 114,  83, 116,  97, 116, 
+    101,  32,  83,  97, 109, 112, 
+    108, 101,  84, 121, 112, 101, 
+     32,  58,  32, 114, 101, 103, 
+    105, 115, 116, 101, 114,  40, 
+    115,  48,  41,  59,  13,  10, 
+     13,  10,  47,  47,  32,  77, 
+     97, 116, 114, 105, 122, 101, 
+    110,  32, 102, 252, 114,  32, 
+    100, 105, 101,  32, 101, 105, 
+    110, 122, 101, 108, 110, 101, 
+    110,  32,  75, 110, 111,  99, 
+    104, 101, 110,  32, 100, 101, 
+    115,  32,  77, 111, 100, 101, 
+    108, 108, 115,  13,  10, 115, 
+    116, 114, 117,  99, 116,  32, 
+     77,  97, 116, 114, 105, 120, 
+     66, 117, 102, 102, 101, 114, 
+     13,  10, 123,  13,  10,   9, 
+    109,  97, 116, 114, 105, 120, 
+     32, 107, 110, 111,  99, 104, 
+    101, 110,  77,  97, 116, 114, 
+    105, 120,  91,  49,  50,  56, 
+     93,  59,  13,  10, 125,  59, 
+     13,  10,  13,  10,  47,  47, 
+     32,  84, 104, 101,  32, 112, 
+    114, 111, 106, 101,  99, 116, 
+    105, 111, 110,  32,  97, 110, 
+    100,  32, 118, 105, 101, 119, 
+     32, 109,  97, 116, 114, 105, 
+    120,  13,  10, 115, 116, 114, 
+    117,  99, 116,  32,  75,  97, 
+    109, 101, 114,  97,  66, 117, 
+    102, 102, 101, 114,  13,  10, 
+    123,  13,  10,   9, 109,  97, 
+    116, 114, 105, 120,  32, 118, 
+    105, 101, 119,  59,  13,  10, 
+      9, 109,  97, 116, 114, 105, 
+    120,  32, 112, 114, 111, 106, 
+    101,  99, 116, 105, 111, 110, 
+     59,  13,  10, 125,  59,  13, 
+     10,  13,  10,  47,  47,  32, 
+     84, 104, 101,  32, 112, 111, 
+    115, 105, 116, 105, 111, 110, 
+     32, 111, 102,  32, 116, 104, 
+    101,  32, 107,  97, 109, 101, 
+    114,  97,  13,  10, 115, 116, 
+    114, 117,  99, 116,  32,  75, 
+     97, 109, 101, 114,  97,  66, 
+    117, 102, 102, 101, 114,  50, 
+     13,  10, 123,  13,  10,   9, 
+    102, 108, 111,  97, 116,  52, 
+     32, 107,  80, 111, 115, 105, 
+    116, 105, 111, 110,  59,  13, 
+     10, 125,  59,  13,  10,  13, 
+     10,  47,  47,  32, 116, 104, 
+    101, 115, 101,  32, 118,  97, 
+    108, 117, 101, 115,  32, 115, 
+    104, 111, 117, 108, 100,  32, 
+    115, 117, 109,  32, 117, 112, 
+     32, 116, 111,  32,  49,  13, 
+     10, 115, 116, 114, 117,  99, 
+    116,  32,  77,  97, 116, 101, 
+    114, 105,  97, 108,  13,  10, 
+    123,  13,  10,   9, 102, 108, 
+    111,  97, 116,  32,  97, 109, 
+     98, 105, 101, 110, 116,  70, 
+     97,  99, 116, 111, 114,  59, 
+     13,  10,   9, 102, 108, 111, 
+     97, 116,  32, 100, 105, 102, 
+    102, 117, 115,  70,  97,  99, 
+    116, 111, 114,  59,  13,  10, 
+      9, 102, 108, 111,  97, 116, 
+     32, 115, 112, 101,  99, 117, 
+    108,  97, 114,  70,  97,  99, 
+    116, 111, 114,  59,  13,  10, 
+    125,  59,  13,  10,  13,  10, 
+    115, 116, 114, 117,  99, 116, 
+     32,  76, 105, 103, 104, 116, 
+     67, 111, 117, 110, 116,  13, 
+     10, 123,  13,  10,   9, 105, 
+    110, 116,  32, 100, 105, 102, 
+    102, 117, 115, 101,  76, 105, 
+    103, 104, 116,  67, 111, 117, 
+    110, 116,  59,  13,  10,   9, 
+    105, 110, 116,  32, 112, 111, 
+    105, 110, 116,  76, 105, 103, 
+    104, 116,  67, 111, 117, 110, 
+    116,  59,  13,  10, 125,  59, 
+     13,  10,  13,  10,  67, 111, 
+    110, 115, 116,  97, 110, 116, 
+     66, 117, 102, 102, 101, 114, 
+     60,  75,  97, 109, 101, 114, 
+     97,  66, 117, 102, 102, 101, 
+    114,  62,  32,  75,  97, 109, 
+    101, 114,  97,  32,  58,  32, 
+    114, 101, 103, 105, 115, 116, 
+    101, 114,  40,  98,  48,  41, 
+     59,  13,  10,  67, 111, 110, 
+    115, 116,  97, 110, 116,  66, 
+    117, 102, 102, 101, 114,  60, 
+     77,  97, 116, 114, 105, 120, 
+     66, 117, 102, 102, 101, 114, 
+     62,  32,  83, 107, 101, 108, 
+    101, 116, 116,  32,  58,  32, 
+    114, 101, 103, 105, 115, 116, 
+    101, 114,  40,  98,  49,  41, 
+     59,  13,  10,  67, 111, 110, 
+    115, 116,  97, 110, 116,  66, 
+    117, 102, 102, 101, 114,  60, 
+     75,  97, 109, 101, 114,  97, 
+     66, 117, 102, 102, 101, 114, 
+     50,  62,  32,  75,  97, 109, 
+    101, 114,  97,  50,  32,  58, 
+     32, 114, 101, 103, 105, 115, 
+    116, 101, 114,  40,  98,  50, 
+     41,  59,  13,  10,  67, 111, 
+    110, 115, 116,  97, 110, 116, 
+     66, 117, 102, 102, 101, 114, 
+     60,  77,  97, 116, 101, 114, 
+    105,  97, 108,  62,  32,  79, 
+     98, 106, 101,  99, 116,  32, 
+     58,  32, 114, 101, 103, 105, 
+    115, 116, 101, 114,  40,  98, 
+     51,  41,  59,  13,  10,  67, 
+    111, 110, 115, 116,  97, 110, 
+    116,  66, 117, 102, 102, 101, 
+    114,  60,  76, 105, 103, 104, 
+    116,  67, 111, 117, 110, 116, 
+     62,  32,  76, 105, 103, 104, 
+    116,  32,  58,  32, 114, 101, 
+    103, 105, 115, 116, 101, 114, 
+     40,  98,  52,  41,  59,  13, 
+     10,  13,  10, 115, 116, 114, 
+    117,  99, 116,  32,  86, 101, 
+    114, 116, 101, 120,  73, 110, 
+    112, 117, 116,  84, 121, 112, 
+    101,  13,  10, 123,  13,  10, 
+      9, 102, 108, 111,  97, 116, 
+     51,  32, 112, 111, 115, 105, 
+    116, 105, 111, 110,  32,  58, 
+     32,  80,  79,  83,  73,  84, 
+     73,  79,  78,  59,  13,  10, 
+      9, 102, 108, 111,  97, 116, 
+     50,  32, 116, 101, 120,  32, 
+     58,  32,  84,  69,  88,  67, 
+     79,  79,  82,  68,  59,  13, 
+     10,   9, 102, 108, 111,  97, 
+    116,  51,  32, 110, 111, 114, 
+    109,  97, 108,  32,  58,  32, 
+     78,  79,  82,  77,  65,  76, 
+     59,  13,  10,   9, 117, 105, 
+    110, 116,  32, 107, 110, 111, 
+     99, 104, 101, 110,  32,  58, 
+     32,  75,  78,  79,  67,  72, 
+     69,  78,  95,  73,  68,  59, 
+     13,  10,   9, 104,  97, 108, 
+    102,  32, 105, 100,  32,  58, 
+     32,  86,  69,  82,  84,  69, 
+     88,  95,  73,  68,  59,  13, 
+     10, 125,  59,  13,  10,  13, 
+     10, 115, 116, 114, 117,  99, 
+    116,  32,  80, 105, 120, 101, 
+    108,  73, 110, 112, 117, 116, 
+     84, 121, 112, 101,  13,  10, 
+    123,  13,  10,   9, 102, 108, 
+    111,  97, 116,  52,  32, 119, 
+    111, 114, 108, 100,  80, 111, 
+    115,  32,  58,  32,  80,  79, 
+     83,  73,  84,  73,  79,  78, 
+     59,  13,  10,   9, 102, 108, 
+    111,  97, 116,  52,  32, 112, 
+    111, 115, 105, 116, 105, 111, 
+    110,  32,  58,  32,  83,  86, 
+     95,  80,  79,  83,  73,  84, 
+     73,  79,  78,  59,  13,  10, 
+      9, 102, 108, 111,  97, 116, 
+     50,  32, 116, 101, 120,  32, 
+     58,  32,  84,  69,  88,  67, 
+     79,  79,  82,  68,  59,  13, 
+     10,   9, 102, 108, 111,  97, 
+    116,  51,  32, 110, 111, 114, 
+    109,  97, 108,  32,  58,  32, 
+     78,  79,  82,  77,  65,  76, 
+     59,  13,  10, 125,  59,  13, 
+     10,  13,  10,  80, 105, 120, 
+    101, 108,  73, 110, 112, 117, 
+    116,  84, 121, 112, 101,  32, 
+    109,  97, 105, 110,  40,  86, 
+    101, 114, 116, 101, 120,  73, 
+    110, 112, 117, 116,  84, 121, 
+    112, 101,  32, 105, 110, 112, 
+    117, 116,  41,  13,  10, 123, 
+     13,  10,   9,  47,  47, 114, 
+    101, 116, 117, 114, 110,  32, 
+    105, 110, 112, 117, 116,  59, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  13,  10,   9, 
+     80, 105, 120, 101, 108,  73, 
+    110, 112, 117, 116,  84, 121, 
+    112, 101,  32, 111, 117, 116, 
+    112, 117, 116,  59,  13,  10, 
+      9, 111, 117, 116, 112, 117, 
+    116,  46, 110, 111, 114, 109, 
+     97, 108,  32,  61,  32, 110, 
+    111, 114, 109,  97, 108, 105, 
+    122, 101,  40, 109, 117, 108, 
+     40, 105, 110, 112, 117, 116, 
+     46, 110, 111, 114, 109,  97, 
+    108,  44,  32,  40, 102, 108, 
+    111,  97, 116,  51, 120,  51, 
+     41,  83, 107, 101, 108, 101, 
+    116, 116,  46, 107, 110, 111, 
+     99, 104, 101, 110,  77,  97, 
+    116, 114, 105, 120,  91, 105, 
+    110, 112, 117, 116,  46, 107, 
+    110, 111,  99, 104, 101, 110, 
+     93,  41,  41,  59,  13,  10, 
+     13,  10,   9,  47,  47,  32, 
+     67, 104,  97, 110, 103, 101, 
+     32, 116, 104, 101,  32, 112, 
+    111, 115, 105, 116, 105, 111, 
+    110,  32, 118, 101,  99, 116, 
+    111, 114,  32, 116, 111,  32, 
+     98, 101,  32,  52,  32, 117, 
+    110, 105, 116, 115,  32, 102, 
+    111, 114,  32, 112, 114, 111, 
+    112, 101, 114,  32, 109,  97, 
+    116, 114, 105, 120,  32,  99, 
+     97, 108,  99, 117, 108,  97, 
+    116, 105, 111, 110, 115,  46, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  13,  10,   9, 
+    102, 108, 111,  97, 116,  52, 
+     32, 112, 111, 115, 105, 116, 
+    105, 111, 110,  32,  61,  32, 
+    102, 108, 111,  97, 116,  52, 
+     40, 105, 110, 112, 117, 116, 
+     46, 112, 111, 115, 105, 116, 
+    105, 111, 110,  46, 120,  44, 
+     32, 105, 110, 112, 117, 116, 
+     46, 112, 111, 115, 105, 116, 
+    105, 111, 110,  46, 121,  44, 
+     32, 105, 110, 112, 117, 116, 
+     46, 112, 111, 115, 105, 116, 
+    105, 111, 110,  46, 122,  44, 
+     32,  49,  46, 102,  41,  59, 
+     13,  10,   9,  47,  47,  32, 
+     83, 116, 111, 114, 101,  32, 
+    116, 104, 101,  32, 116, 101, 
+    120, 116, 117, 114, 101,  32, 
+     99, 111, 111, 114, 100, 105, 
+    110,  97, 116, 101, 115,  32, 
+    102, 111, 114,  32, 116, 104, 
+    101,  32, 112, 105, 120, 101, 
+    108,  32, 115, 104,  97, 100, 
+    101, 114,  46,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  13,  10,   9, 
+    111, 117, 116, 112, 117, 116, 
+     46, 116, 101, 120,  32,  61, 
+     32, 105, 110, 112, 117, 116, 
+     46, 116, 101, 120,  59,  13, 
+     10,  13,  10,   9,  47,  47, 
+     32,  67,  97, 108,  99, 117, 
+    108,  97, 116, 101,  32, 116, 
+    104, 101,  32, 112, 111, 115, 
+    105, 116, 105, 111, 110,  32, 
+    111, 102,  32, 116, 104, 101, 
+     32, 118, 101, 114, 116, 101, 
+    120,  32,  97, 103,  97, 105, 
+    110, 115, 116,  32, 116, 104, 
+    101,  32, 119, 111, 114, 108, 
+    100,  44,  32, 118, 105, 101, 
+    119,  44,  32,  97, 110, 100, 
+     32, 112, 114, 111, 106, 101, 
+     99, 116, 105, 111, 110,  32, 
+    109,  97, 116, 114, 105,  99, 
+    101, 115,  46,  32,  13,  10, 
+      9, 111, 117, 116, 112, 117, 
+    116,  46, 119, 111, 114, 108, 
+    100,  80, 111, 115,  32,  61, 
+     32, 109, 117, 108,  40, 112, 
+    111, 115, 105, 116, 105, 111, 
+    110,  44,  32,  83, 107, 101, 
+    108, 101, 116, 116,  46, 107, 
+    110, 111,  99, 104, 101, 110, 
+     77,  97, 116, 114, 105, 120, 
+     91, 105, 110, 112, 117, 116, 
+     46, 107, 110, 111,  99, 104, 
+    101, 110,  93,  41,  59,  13, 
+     10,   9, 111, 117, 116, 112, 
+    117, 116,  46, 112, 111, 115, 
+    105, 116, 105, 111, 110,  32, 
+     61,  32, 109, 117, 108,  40, 
+    111, 117, 116, 112, 117, 116, 
+     46, 119, 111, 114, 108, 100, 
+     80, 111, 115,  44,  32,  75, 
+     97, 109, 101, 114,  97,  46, 
+    118, 105, 101, 119,  41,  59, 
+     13,  10,   9, 111, 117, 116, 
+    112, 117, 116,  46, 112, 111, 
+    115, 105, 116, 105, 111, 110, 
+     32,  61,  32, 109, 117, 108, 
+     40, 111, 117, 116, 112, 117, 
+    116,  46, 112, 111, 115, 105, 
+    116, 105, 111, 110,  44,  32, 
+     75,  97, 109, 101, 114,  97, 
+     46, 112, 114, 111, 106, 101, 
+     99, 116, 105, 111, 110,  41, 
+     59,  13,  10,   9, 114, 101, 
+    116, 117, 114, 110,  32, 111, 
+    117, 116, 112, 117, 116,  59, 
+     13,  10, 125,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0, 254, 239, 254, 239, 
+      1,   0,   0,   0, 129,   8, 
+      0,   0,   0,  67,  58,  92, 
+     85, 115, 101, 114, 115,  92, 
+    107, 111, 108, 106,  97,  92, 
+     68, 101, 115, 107, 116, 111, 
+    112,  92,  75, 111, 108, 106, 
+     97,  45,  83, 116, 114, 111, 
+    104, 109,  45,  71,  97, 109, 
+    101, 115,  92,  65, 108, 108, 
+    103, 101, 109, 101, 105, 110, 
+     92,  70, 114,  97, 109, 101, 
+    119, 111, 114, 107,  92,  68, 
+     88,  49,  50,  86, 101, 114, 
+    116, 101, 120,  83, 104,  97, 
+    100, 101, 114,  46, 104, 108, 
+    115, 108,   0,   0,  99,  58, 
+     92, 117, 115, 101, 114, 115, 
+     92, 107, 111, 108, 106,  97, 
+     92, 100, 101, 115, 107, 116, 
+    111, 112,  92, 107, 111, 108, 
+    106,  97,  45, 115, 116, 114, 
+    111, 104, 109,  45, 103,  97, 
+    109, 101, 115,  92,  97, 108, 
+    108, 103, 101, 109, 101, 105, 
+    110,  92, 102, 114,  97, 109, 
+    101, 119, 111, 114, 107,  92, 
+    100, 120,  49,  50, 118, 101, 
+    114, 116, 101, 120, 115, 104, 
+     97, 100, 101, 114,  46, 104, 
+    108, 115, 108,   0,  13,  10, 
+     84, 101, 120, 116, 117, 114, 
+    101,  50,  68,  32, 115, 104, 
+     97, 100, 101, 114,  84, 101, 
+    120, 116, 117, 114, 101,  32, 
+     58,  32, 114, 101, 103, 105, 
+    115, 116, 101, 114,  40, 116, 
+     48,  41,  59,  13,  10,  83, 
+     97, 109, 112, 108, 101, 114, 
+     83, 116,  97, 116, 101,  32, 
+     83,  97, 109, 112, 108, 101, 
+     84, 121, 112, 101,  32,  58, 
+     32, 114, 101, 103, 105, 115, 
+    116, 101, 114,  40, 115,  48, 
+     41,  59,  13,  10,  13,  10, 
+     47,  47,  32,  77,  97, 116, 
+    114, 105, 122, 101, 110,  32, 
+    102, 114,  32, 100, 105, 101, 
+     32, 101, 105, 110, 122, 101, 
+    108, 110, 101, 110,  32,  75, 
+    110, 111,  99, 104, 101, 110, 
+     32, 100, 101, 115,  32,  77, 
+    111, 100, 101, 108, 108, 115, 
+     13,  10, 115, 116, 114, 117, 
+     99, 116,  32,  77,  97, 116, 
+    114, 105, 120,  66, 117, 102, 
+    102, 101, 114,  13,  10, 123, 
+     13,  10,   9, 109,  97, 116, 
+    114, 105, 120,  32, 107, 110, 
+    111,  99, 104, 101, 110,  77, 
+     97, 116, 114, 105, 120,  91, 
+     49,  50,  56,  93,  59,  13, 
+     10, 125,  59,  13,  10,  13, 
+     10,  47,  47,  32,  84, 104, 
+    101,  32, 112, 114, 111, 106, 
+    101,  99, 116, 105, 111, 110, 
+     32,  97, 110, 100,  32, 118, 
+    105, 101, 119,  32, 109,  97, 
+    116, 114, 105, 120,  13,  10, 
+    115, 116, 114, 117,  99, 116, 
+     32,  75,  97, 109, 101, 114, 
+     97,  66, 117, 102, 102, 101, 
+    114,  13,  10, 123,  13,  10, 
+      9, 109,  97, 116, 114, 105, 
+    120,  32, 118, 105, 101, 119, 
+     59,  13,  10,   9, 109,  97, 
+    116, 114, 105, 120,  32, 112, 
+    114, 111, 106, 101,  99, 116, 
+    105, 111, 110,  59,  13,  10, 
+    125,  59,  13,  10,  13,  10, 
+     47,  47,  32,  84, 104, 101, 
+     32, 112, 111, 115, 105, 116, 
+    105, 111, 110,  32, 111, 102, 
+     32, 116, 104, 101,  32, 107, 
+     97, 109, 101, 114,  97,  13, 
+     10, 115, 116, 114,  27, 226, 
+     48,   1, 128,   0,   0,   0, 
+    178,  39, 107, 109, 171, 107, 
+    216,   1,   1,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+      2,   0,   0,   0,   1,   0, 
+      0,   0,   1,   0,   0,   0, 
+      0,   0,   0,   0,  86,   0, 
+      0,   0,  40,   0,   0,   0, 
+     27, 226,  48,   1,  16, 142, 
+     44, 141, 215,   7,   0,   0, 
+      1,   0,   0,   0,  85,   0, 
+      0,   0,  86,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      4,   0,   0,   0,  66,   0, 
+     60,  17,  16,   1,   0,   0, 
+      0,   1,  10,   0,   1,   0, 
+    173,   2,  97,  74,  10,   0, 
+      1,   0, 173,   2,  97,  74, 
+     77, 105,  99, 114, 111, 115, 
+    111, 102, 116,  32,  40,  82, 
+     41,  32,  72,  76,  83,  76, 
+     32,  83, 104,  97, 100, 101, 
+    114,  32,  67, 111, 109, 112, 
+    105, 108, 101, 114,  32,  49, 
+     48,  46,  49,   0,   0,   0, 
+     54,   0,  61,  17,   1, 104, 
+    108, 115, 108,  70, 108,  97, 
+    103, 115,   0,  48, 120,  53, 
+      0, 104, 108, 115, 108,  84, 
+     97, 114, 103, 101, 116,   0, 
+    118, 115,  95,  53,  95,  49, 
+      0, 104, 108, 115, 108,  69, 
+    110, 116, 114, 121,   0, 109, 
+     97, 105, 110,   0,   0,   0, 
+      0,   0,  42,   0,  16,  17, 
+      0,   0,   0,   0, 152,   5, 
+      0,   0,   0,   0,   0,   0, 
+    104,   3,   0,   0,   0,   0, 
+      0,   0, 104,   3,   0,   0, 
+      9,  16,   0,   0, 176,   0, 
+      0,   0,   1,   0, 160, 109, 
+     97, 105, 110,   0,  46,   0, 
+     62,  17,   3,  16,   0,   0, 
+      9,   0, 105, 110, 112, 117, 
+    116,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,  22,   0, 
+     80,  17,   1,   0,   5,   0, 
+      0,   0,   4,   0, 176,   0, 
+      0,   0,   1,   0, 104,   3, 
+      0,   0,   0,   0,  22,   0, 
+     80,  17,   1,   0,   5,   0, 
+      4,   0,   4,   0, 176,   0, 
+      0,   0,   1,   0, 104,   3, 
+      4,   0,   0,   0,  22,   0, 
+     80,  17,   1,   0,   5,   0, 
+      8,   0,   4,   0, 176,   0, 
+      0,   0,   1,   0, 104,   3, 
+      8,   0,   0,   0,  22,   0, 
+     80,  17,   1,   0,   5,   0, 
+     12,   0,   4,   0, 176,   0, 
+      0,   0,   1,   0, 104,   3, 
+     16,   0,   0,   0,  22,   0, 
+     80,  17,   1,   0,   5,   0, 
+     16,   0,   4,   0, 176,   0, 
+      0,   0,   1,   0, 104,   3, 
+     20,   0,   0,   0,  22,   0, 
+     80,  17,   1,   0,   5,   0, 
+     20,   0,   4,   0, 176,   0, 
+      0,   0,   1,   0, 104,   3, 
+     32,   0,   0,   0,  22,   0, 
+     80,  17,   1,   0,   5,   0, 
+     24,   0,   4,   0, 176,   0, 
+      0,   0,   1,   0, 104,   3, 
+     36,   0,   0,   0,  22,   0, 
+     80,  17,   1,   0,   5,   0, 
+     28,   0,   4,   0, 176,   0, 
+      0,   0,   1,   0, 104,   3, 
+     40,   0,   0,   0,  22,   0, 
+     80,  17,   1,   0,   5,   0, 
+     32,   0,   4,   0, 176,   0, 
+      0,   0,   1,   0, 104,   3, 
+     48,   0,   0,   0,  22,   0, 
+     80,  17,   1,   0,   5,   0, 
+     36,   0,   4,   0, 176,   0, 
+      0,   0,   1,   0, 104,   3, 
+     64,   0,   0,   0,  58,   0, 
+     62,  17,   8,  16,   0,   0, 
+    136,   0,  60, 109,  97, 105, 
+    110,  32, 114, 101, 116, 117, 
+    114, 110,  32, 118,  97, 108, 
+    117, 101,  62,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,  22,   0, 
+     80,  17,   2,   0,   5,   0, 
+     40,   0,   4,   0, 176,   0, 
+      0,   0,   1,   0, 104,   3, 
+     48,   0,   0,   0,  22,   0, 
+     80,  17,   2,   0,   5,   0, 
+     44,   0,   4,   0, 176,   0, 
+      0,   0,   1,   0, 104,   3, 
+     52,   0,   0,   0,  22,   0, 
+     80,  17,   2,   0,   5,   0, 
+     48,   0,   4,   0, 176,   0, 
+      0,   0,   1,   0, 104,   3, 
+     56,   0,   0,   0,  22,   0, 
+     80,  17,   2,   0,   5,   0, 
+     32,   0,   4,   0, 176,   0, 
+      0,   0,   1,   0, 104,   3, 
+     32,   0,   0,   0,  22,   0, 
+     80,  17,   2,   0,   5,   0, 
+     36,   0,   4,   0, 176,   0, 
+      0,   0,   1,   0, 104,   3, 
+     36,   0,   0,   0,  22,   0, 
+     80,  17,   2,   0,   5,   0, 
+     16,   0,   4,   0, 176,   0, 
+      0,   0,   1,   0, 104,   3, 
+     16,   0,   0,   0,  22,   0, 
+     80,  17,   2,   0,   5,   0, 
+     20,   0,   4,   0, 176,   0, 
+      0,   0,   1,   0, 104,   3, 
+     20,   0,   0,   0,  22,   0, 
+     80,  17,   2,   0,   5,   0, 
+     24,   0,   4,   0, 176,   0, 
+      0,   0,   1,   0, 104,   3, 
+     24,   0,   0,   0,  22,   0, 
+     80,  17,   2,   0,   5,   0, 
+     28,   0,   4,   0, 176,   0, 
+      0,   0,   1,   0, 104,   3, 
+     28,   0,   0,   0,  22,   0, 
+     80,  17,   2,   0,   5,   0, 
+      0,   0,   4,   0, 176,   0, 
+      0,   0,   1,   0, 104,   3, 
+      0,   0,   0,   0,  22,   0, 
+     80,  17,   2,   0,   5,   0, 
+      4,   0,   4,   0, 176,   0, 
+      0,   0,   1,   0, 104,   3, 
+      4,   0,   0,   0,  22,   0, 
+     80,  17,   2,   0,   5,   0, 
+      8,   0,   4,   0, 176,   0, 
+      0,   0,   1,   0, 104,   3, 
+      8,   0,   0,   0,  22,   0, 
+     80,  17,   2,   0,   5,   0, 
+     12,   0,   4,   0, 176,   0, 
+      0,   0,   1,   0, 104,   3, 
+     12,   0,   0,   0,  46,   0, 
+     62,  17,   7,  16,   0,   0, 
+      8,   0, 111, 117, 116, 112, 
+    117, 116,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,  22,   0, 
+     80,  17,   0,   0,   5,   0, 
+     40,   0,   4,   0, 156,   1, 
+      0,   0,   1,   0, 124,   2, 
+      0,   0,   0,   0,  22,   0, 
+     80,  17,   0,   0,   5,   0, 
+     44,   0,   4,   0, 156,   1, 
+      0,   0,   1,   0, 124,   2, 
+      4,   0,   0,   0,  22,   0, 
+     80,  17,   0,   0,   5,   0, 
+     48,   0,   4,   0, 156,   1, 
+      0,   0,   1,   0, 124,   2, 
+      8,   0,   0,   0,  22,   0, 
+     80,  17,   0,   0,   5,   0, 
+     32,   0,   4,   0, 216,   1, 
+      0,   0,   1,   0,  64,   2, 
+     32,   0,   0,   0,  22,   0, 
+     80,  17,   0,   0,   5,   0, 
+     36,   0,   4,   0, 216,   1, 
+      0,   0,   1,   0,  64,   2, 
+     36,   0,   0,   0,  22,   0, 
+     80,  17,   0,   0,   5,   0, 
+      0,   0,   4,   0,  32,   2, 
+      0,   0,   1,   0, 248,   1, 
+     48,   0,   0,   0,  22,   0, 
+     80,  17,   0,   0,   5,   0, 
+      4,   0,   4,   0,  76,   2, 
+      0,   0,   1,   0, 204,   1, 
+     52,   0,   0,   0,  22,   0, 
+     80,  17,   0,   0,   5,   0, 
+      8,   0,   4,   0, 120,   2, 
+      0,   0,   1,   0, 160,   1, 
+     56,   0,   0,   0,  22,   0, 
+     80,  17,   0,   0,   5,   0, 
+     12,   0,   4,   0, 164,   2, 
+      0,   0,   1,   0, 116,   1, 
+     60,   0,   0,   0,  22,   0, 
+     80,  17,   0,   0,   5,   0, 
+     16,   0,   4,   0, 200,   2, 
+      0,   0,   1,   0, 144,   0, 
+     16,   0,   0,   0,  22,   0, 
+     80,  17,   0,   0,   5,   0, 
+     20,   0,   4,   0, 236,   2, 
+      0,   0,   1,   0, 144,   0, 
+     20,   0,   0,   0,  22,   0, 
+     80,  17,   0,   0,   5,   0, 
+     24,   0,   4,   0,  16,   3, 
+      0,   0,   1,   0, 144,   0, 
+     24,   0,   0,   0,  22,   0, 
+     80,  17,   0,   0,   5,   0, 
+     28,   0,   4,   0,  52,   3, 
+      0,   0,   1,   0, 144,   0, 
+     28,   0,   0,   0,  22,   0, 
+     80,  17,   0,   0,   5,   0, 
+     16,   0,   4,   0,  88,   3, 
+      0,   0,   1,   0, 192,   0, 
+     64,   0,   0,   0,  22,   0, 
+     80,  17,   0,   0,   5,   0, 
+     20,   0,   4,   0, 124,   3, 
+      0,   0,   1,   0, 156,   0, 
+     68,   0,   0,   0,  22,   0, 
+     80,  17,   0,   0,   5,   0, 
+     24,   0,   4,   0, 160,   3, 
+      0,   0,   1,   0, 120,   0, 
+     72,   0,   0,   0,  22,   0, 
+     80,  17,   0,   0,   5,   0, 
+     28,   0,   4,   0, 196,   3, 
+      0,   0,   1,   0,  84,   0, 
+     76,   0,   0,   0,  46,   0, 
+     62,  17,   5,  16,   0,   0, 
+      8,   0, 112, 111, 115, 105, 
+    116, 105, 111, 110,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,  22,   0, 
+     80,  17,   0,   0,   5,   0, 
+      0,   0,   4,   0, 176,   1, 
+      0,   0,   1,   0,  24,   1, 
+     16,   0,   0,   0,  22,   0, 
+     80,  17,   0,   0,   5,   0, 
+      4,   0,   4,   0, 176,   1, 
+      0,   0,   1,   0,  60,   1, 
+     20,   0,   0,   0,  22,   0, 
+     80,  17,   0,   0,   5,   0, 
+      8,   0,   4,   0, 176,   1, 
+      0,   0,   1,   0,  96,   1, 
+     24,   0,   0,   0,  22,   0, 
+     80,  17,   0,   0,   5,   0, 
+     12,   0,   4,   0, 196,   1, 
+      0,   0,   1,   0, 112,   1, 
+     28,   0,   0,   0,   2,   0, 
+      6,   0, 244,   0,   0,   0, 
+     24,   0,   0,   0,   1,   0, 
+      0,   0,  16,   1, 102,  69, 
+    175,  92,  30, 209, 161, 171, 
+    118,  48,  78,  96, 181, 158, 
+    219, 137,   0,   0, 242,   0, 
+      0,   0, 184,   2,   0,   0, 
+      0,   0,   0,   0,   1,   0, 
+      1,   0,  24,   4,   0,   0, 
+      0,   0,   0,   0,  56,   0, 
+      0,   0, 172,   2,   0,   0, 
+    176,   0,   0,   0,  65,   0, 
+      0, 128, 176,   0,   0,   0, 
+     65,   0,   0,   0, 208,   0, 
+      0,   0,  65,   0,   0, 128, 
+    208,   0,   0,   0,  65,   0, 
+      0,   0, 248,   0,   0,   0, 
+     65,   0,   0, 128, 248,   0, 
+      0,   0,  65,   0,   0,   0, 
+     36,   1,   0,   0,  65,   0, 
+      0, 128,  36,   1,   0,   0, 
+     65,   0,   0,   0,  80,   1, 
+      0,   0,  65,   0,   0, 128, 
+     80,   1,   0,   0,  65,   0, 
+      0,   0, 108,   1,   0,   0, 
+     65,   0,   0, 128, 108,   1, 
+      0,   0,  65,   0,   0,   0, 
+    128,   1,   0,   0,  65,   0, 
+      0, 128, 128,   1,   0,   0, 
+     65,   0,   0,   0, 156,   1, 
+      0,   0,  68,   0,   0, 128, 
+    156,   1,   0,   0,  68,   0, 
+      0,   0, 176,   1,   0,   0, 
+     68,   0,   0, 128, 176,   1, 
+      0,   0,  68,   0,   0,   0, 
+    196,   1,   0,   0,  70,   0, 
+      0, 128, 196,   1,   0,   0, 
+     70,   0,   0,   0, 216,   1, 
+      0,   0,  73,   0,   0, 128, 
+    216,   1,   0,   0,  73,   0, 
+      0,   0, 248,   1,   0,   0, 
+     73,   0,   0, 128, 248,   1, 
+      0,   0,  73,   0,   0,   0, 
+     32,   2,   0,   0,  73,   0, 
+      0, 128,  32,   2,   0,   0, 
+     73,   0,   0,   0,  76,   2, 
+      0,   0,  73,   0,   0, 128, 
+     76,   2,   0,   0,  73,   0, 
+      0,   0, 120,   2,   0,   0, 
+     73,   0,   0, 128, 120,   2, 
+      0,   0,  73,   0,   0,   0, 
+    164,   2,   0,   0,  74,   0, 
+      0, 128, 164,   2,   0,   0, 
+     74,   0,   0,   0, 200,   2, 
+      0,   0,  74,   0,   0, 128, 
+    200,   2,   0,   0,  74,   0, 
+      0,   0, 236,   2,   0,   0, 
+     74,   0,   0, 128, 236,   2, 
+      0,   0,  74,   0,   0,   0, 
+     16,   3,   0,   0,  74,   0, 
+      0, 128,  16,   3,   0,   0, 
+     74,   0,   0,   0,  52,   3, 
+      0,   0,  75,   0,   0, 128, 
+     52,   3,   0,   0,  75,   0, 
+      0,   0,  88,   3,   0,   0, 
+     75,   0,   0, 128,  88,   3, 
+      0,   0,  75,   0,   0,   0, 
+    124,   3,   0,   0,  75,   0, 
+      0, 128, 124,   3,   0,   0, 
+     75,   0,   0,   0, 160,   3, 
+      0,   0,  75,   0,   0, 128, 
+    160,   3,   0,   0,  75,   0, 
+      0,   0, 196,   3,   0,   0, 
+     76,   0,   0, 128, 196,   3, 
+      0,   0,  76,   0,   0,   0, 
+    216,   3,   0,   0,  76,   0, 
+      0, 128, 216,   3,   0,   0, 
+     76,   0,   0,   0, 236,   3, 
+      0,   0,  76,   0,   0, 128, 
+    236,   3,   0,   0,  76,   0, 
+      0,   0,   0,   4,   0,   0, 
+     76,   0,   0, 128,   0,   4, 
+      0,   0,  76,   0,   0,   0, 
+     20,   4,   0,   0,  76,   0, 
+      0, 128,  20,   4,   0,   0, 
+     76,   0,   0,   0,   2,   0, 
+     94,   0,  56,   0,  91,   0, 
+      2,   0,  94,   0,  28,   0, 
+     92,   0,   2,   0,  94,   0, 
+     28,   0,  92,   0,   2,   0, 
+     94,   0,  28,   0,  92,   0, 
+      2,   0,  94,   0,  18,   0, 
+     93,   0,   2,   0,  94,   0, 
+     18,   0,  93,   0,   2,   0, 
+     94,   0,  18,   0,  93,   0, 
+      2,   0,  85,   0,   9,   0, 
+     84,   0,   2,   0,  85,   0, 
+      9,   0,  84,   0,   2,   0, 
+     24,   0,   2,   0,  23,   0, 
+      2,   0,  71,   0,  34,   0, 
+     69,   0,   2,   0,  71,   0, 
+     20,   0,  70,   0,   2,   0, 
+     71,   0,  20,   0,  70,   0, 
+      2,   0,  71,   0,  20,   0, 
+     70,   0,   2,   0,  71,   0, 
+     20,   0,  70,   0,   2,   0, 
+     53,   0,  20,   0,  52,   0, 
+      2,   0,  53,   0,  20,   0, 
+     52,   0,   2,   0,  53,   0, 
+     20,   0,  52,   0,   2,   0, 
+     53,   0,  20,   0,  52,   0, 
+      2,   0,  59,   0,  20,   0, 
+     58,   0,   2,   0,  59,   0, 
+     20,   0,  58,   0,   2,   0, 
+     59,   0,  20,   0,  58,   0, 
+      2,   0,  59,   0,  20,   0, 
+     58,   0,   2,   0,  15,   0, 
+      2,   0,  15,   0,   2,   0, 
+     15,   0,   2,   0,  15,   0, 
+      2,   0,  15,   0,   2,   0, 
+     15,   0,   2,   0,  15,   0, 
+      2,   0,  15,   0,   2,   0, 
+     15,   0,   2,   0,  15,   0, 
+    246,   0,   0,   0,   4,   0, 
+      0,   0,   0,   0,   0,   0, 
+     12,   0,   0,   0,   0,   0, 
+      0,   0,  20,   0,   0,   0, 
+     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,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+    128,   0,  75,  97, 109, 101, 
+    114,  97,  66, 117, 102, 102, 
+    101, 114,   0, 241,  10,   0, 
+     24,  21,  12,  16,   0,   0, 
+      1,   0,   1,   0,  14,   0, 
+     23,  21,  13,  16,   0,   0, 
+     36,   2, 128, 110,   0,   0, 
+    242, 241,  10,   0,  24,  21, 
+     14,  16,   0,   0,   1,   0, 
+      0,   2,  18,   0,  22,  21, 
+     10,  16,   0,   0,  34,   0, 
+      0,   0,   1,   0,   0,   0, 
+      0,   0,   0, 241,  26,   0, 
+      3,  18,  13,  21,   3,   0, 
+     16,  16,   0,   0,   0,   0, 
+    107, 110, 111,  99, 104, 101, 
+    110,  77,  97, 116, 114, 105, 
+    120,   0,  34,   0,   5,  21, 
+      1,   0,   0,   0,  17,  16, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,  32, 
+     77,  97, 116, 114, 105, 120, 
+     66, 117, 102, 102, 101, 114, 
+      0, 241,  10,   0,  24,  21, 
+     18,  16,   0,   0,   1,   0, 
+      1,   0,  14,   0,  23,  21, 
+     19,  16,   0,   0,  36,   2, 
+      0, 128,   0,   0, 242, 241, 
+     10,   0,  24,  21,  20,  16, 
+      0,   0,   1,   0,   0,   2, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+     11, 202,  49,   1,  56,   0, 
+      0,   0,   0,  16,   0,   0, 
+     22,  16,   0,   0, 132,   2, 
+      0,   0,  10,   0, 255, 255, 
+      4,   0,   0,   0, 255, 255, 
+      3,   0,   0,   0,   0,   0, 
+     88,   0,   0,   0,  88,   0, 
+      0,   0,   8,   0,   0,   0, 
+     96,   0,   0,   0,   0,   0, 
+      0,   0,  22,   0,  27,  21, 
+     64,   0,   0,   0,   3,   0, 
+      0,   0,  12,   0, 102, 108, 
+    111,  97, 116,  51,   0, 243, 
+    242, 241,  22,   0,  27,  21, 
+     64,   0,   0,   0,   2,   0, 
+      0,   0,   8,   0, 102, 108, 
+    111,  97, 116,  50,   0, 243, 
+    242, 241,  94,   0,   3,  18, 
+     13,  21,   3,   0,   0,  16, 
+      0,   0,   0,   0, 112, 111, 
+    115, 105, 116, 105, 111, 110, 
+      0, 241,  13,  21,   3,   0, 
+      1,  16,   0,   0,  12,   0, 
+    116, 101, 120,   0, 242, 241, 
+     13,  21,   3,   0,   0,  16, 
+      0,   0,  20,   0, 110, 111, 
+    114, 109,  97, 108,   0, 243, 
+    242, 241,  13,  21,   3,   0, 
+    117,   0,   0,   0,  32,   0, 
+    107, 110, 111,  99, 104, 101, 
+    110,   0, 242, 241,  13,  21, 
+      3,   0,  69,   0,   0,   0, 
+     36,   0, 105, 100,   0, 243, 
+    242, 241,  38,   0,   5,  21, 
+      5,   0,   0,   0,   2,  16, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,  40,   0, 
+     86, 101, 114, 116, 101, 120, 
+     73, 110, 112, 117, 116,  84, 
+    121, 112, 101,   0, 242, 241, 
+     10,   0,   1,  18,   1,   0, 
+      0,   0,   3,  16,   0,   0, 
+     22,   0,  27,  21,  64,   0, 
+      0,   0,   4,   0,   0,   0, 
+     16,   0, 102, 108, 111,  97, 
+    116,  52,   0, 243, 242, 241, 
+     78,   0,   3,  18,  13,  21, 
+      3,   0,   5,  16,   0,   0, 
+      0,   0, 119, 111, 114, 108, 
+    100,  80, 111, 115,   0, 241, 
+     13,  21,   3,   0,   5,  16, 
+      0,   0,  16,   0, 112, 111, 
+    115, 105, 116, 105, 111, 110, 
+      0, 241,  13,  21,   3,   0, 
+      1,  16,   0,   0,  32,   0, 
+    116, 101, 120,   0, 242, 241, 
+     13,  21,   3,   0,   0,  16, 
+      0,   0,  40,   0, 110, 111, 
+    114, 109,  97, 108,   0, 243, 
+    242, 241,  38,   0,   5,  21, 
+      4,   0,   0,   0,   6,  16, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,  52,   0, 
+     80, 105, 120, 101, 108,  73, 
+    110, 112, 117, 116,  84, 121, 
+    112, 101,   0, 243, 242, 241, 
+     10,   0,  24,  21,   7,  16, 
+      0,   0,   1,   0,   1,   0, 
+     14,   0,   8,  16,   8,  16, 
+      0,   0,  23,   0,   1,   0, 
+      4,  16,   0,   0,  30,   0, 
+     28,  21,  64,   0,   0,   0, 
+      4,   0,   0,   0,   4,   0, 
+      0,   0,  16,   0,   0,   0, 
+      0,  64,   0, 102, 108, 111, 
+     97, 116,  52, 120,  52,   0, 
+     42,   0,   3,  18,  13,  21, 
+      3,   0,  10,  16,   0,   0, 
+      0,   0, 118, 105, 101, 119, 
+      0, 241,  13,  21,   3,   0, 
+     10,  16,   0,   0,  64,   0, 
+    112, 114, 111, 106, 101,  99, 
+    116, 105, 111, 110,   0, 243, 
+    242, 241,  34,   0,   5,  21, 
+      2,   0,   0,   0,  11,  16, 
+      0,   0,  11, 202,  49,   1, 
+     56,   0,   0,   0,   0,  16, 
+      0,   0,   0,  16,   0,   0, 
+      0,   0,   0,   0,  11,   0, 
+    255, 255,   4,   0,   0,   0, 
+    255, 255,   3,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,  41,  59, 
+     13,  10,  13,  10, 115, 116, 
+    114, 117,  99, 116,  32,  86, 
+    101, 114, 116, 101, 120,  73, 
+    110, 112, 117, 116,  84, 121, 
+    112, 101,  13,  10, 123,  13, 
+     10,   9, 102, 108, 111,  97, 
+    116,  51,  32, 112, 111, 115, 
+    105, 116, 105, 111, 110,  32, 
+     58,  32,  80,  79,  83,  73, 
+     84,  73,  79,  78,  59,  13, 
+     10,   9, 102, 108, 111,  97, 
+    116,  50,  32, 116, 101, 120, 
+     32,  58,  32,  84,  69,  88, 
+     67,  79,  79,  82,  68,  59, 
+     13,  10,   9, 102, 108, 111, 
+     97, 116,  51,  32, 110, 111, 
+    114, 109,  97, 108,  32,  58, 
+     32,  78,  79,  82,  77,  65, 
+     76,  59,  13,  10,   9, 117, 
+    105, 110, 116,  32, 107, 110, 
+    111,  99, 104, 101, 110,  32, 
+     58,  32,  75,  78,  79,  67, 
+     72,  69,  78,  95,  73,  68, 
+     59,  13,  10,   9, 104,  97, 
+    108, 102,  32, 105, 100,  32, 
+     58,  32,  86,  69,  82,  84, 
+     69,  88,  95,  73,  68,  59, 
+     13,  10, 125,  59,  13,  10, 
+     13,  10, 115, 116, 114, 117, 
+     99, 116,  32,  80, 105, 120, 
+    101, 108,  73, 110, 112, 117, 
+    116,  84, 121, 112, 101,  13, 
+     10, 123,  13,  10,   9, 102, 
+    108, 111,  97, 116,  52,  32, 
+    119, 111, 114, 108, 100,  80, 
+    111, 115,  32,  58,  32,  80, 
+     79,  83,  73,  84,  73,  79, 
+     78,  59,  13,  10,   9, 102, 
+    108, 111,  97, 116,  52,  32, 
+    112, 111, 115, 105, 116, 105, 
+    111, 110,  32,  58,  32,  83, 
+     86,  95,  80,  79,  83,  73, 
+     84,  73,  79,  78,  59,  13, 
+     10,   9, 102, 108, 111,  97, 
+    116,  50,  32, 116, 101, 120, 
+     32,  58,  32,  84,  69,  88, 
+     67,  79,  79,  82,  68,  59, 
+     13,  10,   9, 102, 108, 111, 
+     97, 116,  51,  32, 110, 111, 
+    114, 109,  97, 108,  32,  58, 
+     32,  78,  79,  82,  77,  65, 
+     76,  59,  13,  10, 125,  59, 
+     13,  10,  13,  10,  80, 105, 
+    120, 101, 108,  73, 110, 112, 
+    117, 116,  84, 121, 112, 101, 
+     32, 109,  97, 105, 110,  40, 
+     86, 101, 114, 116, 101, 120, 
+     73, 110, 112, 117, 116,  84, 
+    121, 112, 101,  32, 105, 110, 
+    112, 117, 116,  41,  13,  10, 
+    123,  13,  10,   9,  47,  47, 
+    114, 101, 116, 117, 114, 110, 
+     32, 105, 110, 112, 117, 116, 
+     59,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  13,  10, 
+      9,  80, 105, 120, 101, 108, 
+     73, 110, 112, 117, 116,  84, 
+    121, 112, 101,  32, 111, 117, 
+    116, 112, 117, 116,  59,  13, 
+     10,   9, 111, 117, 116, 112, 
+    117, 116,  46, 110, 111, 114, 
+    109,  97, 108,  32,  61,  32, 
+    110, 111, 114, 109,  97, 108, 
+    105, 122, 101,  40, 109, 117, 
+    108,  40, 105, 110, 112, 117, 
+    116,  46, 110, 111, 114, 109, 
+     97, 108,  44,  32,  40, 102, 
+    108, 111,  97, 116,  51, 120, 
+     51,  41,  83, 107, 101, 108, 
+    101, 116, 116,  46, 107, 110, 
+    111,  99, 104, 101, 110,  77, 
+     97, 116, 114, 105, 120,  91, 
+    105, 110, 112, 117, 116,  46, 
+    107, 110, 111,  99, 104, 101, 
+    110,  93,  41,  41,  59,  13, 
+     10,  13,  10,   9,  47,  47, 
+     32,  67, 104,  97, 110, 103, 
+    101,  32, 116, 104, 101,  32, 
+    112, 111, 115, 105, 116, 105, 
+    111, 110,  32, 118, 101,  99, 
+    116, 111, 114,  32, 116, 111, 
+     32,  98, 101,  32,  52,  32, 
+    117, 110, 105, 116, 115,  32, 
+    102, 111, 114,  32, 112, 114, 
+    111, 112, 101, 114,  32, 109, 
+     97, 116, 114, 105, 120,  32, 
+     99,  97, 108,  99, 117, 108, 
+     97, 116, 105, 111, 110, 115, 
+     46,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  13,  10, 
+      9, 102, 108, 111,  97, 116, 
+     52,  32, 112, 111, 115, 105, 
+    116, 105, 111, 110,  32,  61, 
+     32, 102, 108, 111,  97, 116, 
+     52,  40, 105, 110, 112, 117, 
+    116,  46, 112, 111, 115, 105, 
+    116, 105, 111, 110,  46, 120, 
+     44,  32, 105, 110, 112, 117, 
+    116,  46, 112, 111, 115, 105, 
+    116, 105, 111, 110,  46, 121, 
+     44,  32, 105, 110, 112, 117, 
+    116,  46, 112, 111, 115, 105, 
+    116, 105, 111, 110,  46, 122, 
+     44,  32,  49,  46, 102,  41, 
+     59,  13,  10,   9,  47,  47, 
+     32,  83, 116, 111, 114, 101, 
+     32, 116, 104, 101,  32, 116, 
+    101, 120, 116, 117, 114, 101, 
+     32,  99, 111, 111, 114, 100, 
+    105, 110,  97, 116, 101, 115, 
+     32, 102, 111, 114,  32, 116, 
+    104, 101,  32, 112, 105, 120, 
+    101, 108,  32, 115, 104,  97, 
+    100, 101, 114,  46,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  13,  10, 
+      9, 111, 117, 116, 112, 117, 
+    116,  46, 116, 101, 120,  32, 
+     61,  32, 105, 110, 112, 117, 
+    116,  46, 116, 101, 120,  59, 
+     13,  10,  13,  10,   9,  47, 
+     47,  32,  67,  97, 108,  99, 
+    117, 108,  97, 116, 101,  32, 
+    116, 104, 101,  32, 112, 111, 
+    115, 105, 116, 105, 111, 110, 
+     32, 111, 102,  32, 116, 104, 
+    101,  32, 118, 101, 114, 116, 
+    101, 120,  32,  97, 103,  97, 
+    105, 110, 115, 116,  32, 116, 
+    104, 101,  32, 119, 111, 114, 
+    108, 100,  44,  32, 118, 105, 
+    101, 119,  44,  32,  97, 110, 
+    100,  32, 112, 114, 111, 106, 
+    101,  99, 116, 105, 111, 110, 
+     32, 109,  97, 116, 114, 105, 
+     99, 101, 115,  46,  32,  13, 
+     10,   9, 111, 117, 116, 112, 
+    117, 116,  46, 119, 111, 114, 
+    108, 100,  80, 111, 115,  32, 
+     61,  32, 109, 117, 108,  40, 
+    112, 111, 115, 105, 116, 105, 
+    111, 110,  44,  32,  83, 107, 
+    101, 108, 101, 116, 116,  46, 
+    107, 110, 111,  99, 104, 101, 
+    110,  77,  97, 116, 114, 105, 
+    120,  91, 105, 110, 112, 117, 
+    116,  46, 107, 110, 111,  99, 
+    104, 101, 110,  93,  41,  59, 
+     13,  10,   9, 111, 117, 116, 
+    112, 117, 116,  46, 112, 111, 
+    115, 105, 116, 105, 111, 110, 
+     32,  61,  32, 109, 117, 108, 
+     40, 111, 117, 116, 112, 117, 
+    116,  46, 119, 111, 114, 108, 
+    100,  80, 111, 115,  44,  32, 
+     75,  97, 109, 101, 114,  97, 
+     46, 118, 105, 101, 119,  41, 
+     59,  13,  10,   9, 111, 117, 
+    116, 112, 117, 116,  46, 112, 
+    111, 115, 105, 116, 105, 111, 
+    110,  32,  61,  32, 109, 117, 
+    108,  40, 111, 117, 116, 112, 
+    117, 116,  46, 112, 111, 115, 
+    105, 116, 105, 111, 110,  44, 
+     32,  75,  97, 109, 101, 114, 
+     97,  46, 112, 114, 111, 106, 
+    101,  99, 116, 105, 111, 110, 
+     41,  59,  13,  10,   9, 114, 
+    101, 116, 117, 114, 110,  32, 
+    111, 117, 116, 112, 117, 116, 
+     59,  13,  10, 125,   0,   7, 
+      0,   0,   0,   0,   0,   0, 
+      0,  85,   0,   0,   0, 170, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   1, 
+      0,   0,   0,  86,   0,   0, 
+      0,   4,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,  68,  51, 
+     68,  83,  72,  68,  82,   0, 
+     24,   4,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,  32,   0, 
+      0,  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,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+    255, 255, 255, 255,  26,   9, 
+     47, 241,  24,   0,   0,   0, 
+     16,   2,   0,   0,   1,   0, 
+      0,   0,   1,   0,   0,   0, 
+     21,   0,   0,   0,   1,   0, 
+      0,   0,  57,   0,   0,   0, 
+      1,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+     32,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,  16,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,  32,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,  12,   0,   0,   0, 
+     24,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,  18,   0, 
+     37,  17,   0,   0,   0,   0, 
+    128,   0,   0,   0,   1,   0, 
+    109,  97, 105, 110,   0,   0, 
+     34,   0, 100,  17,  15,  16, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      8,   0,  75,  97, 109, 101, 
+    114,  97,   0,   0,   0,   0, 
+     34,   0, 100,  17,  21,  16, 
+      0,   0,   1,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+      8,   0,  83, 107, 101, 108, 
+    101, 116, 116,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+     16,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0, 255, 255, 
+    255, 255,  26,   9,  47, 241, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0, 148,  46,  49,   1, 
+    150, 135, 134,  98,   1,   0, 
+      0,   0,  43,  99,  30, 242, 
+    214, 145, 140,  68, 175, 159, 
+     85, 170, 134,  57, 241, 115, 
+    129,   0,   0,   0,  47,  76, 
+    105, 110, 107,  73, 110, 102, 
+    111,   0,  47, 110,  97, 109, 
+    101, 115,   0,  47, 115, 114, 
+     99,  47, 104, 101,  97, 100, 
+    101, 114,  98, 108, 111,  99, 
+    107,   0,  47, 115, 114,  99, 
+     47, 102, 105, 108, 101, 115, 
+     47,  99,  58,  92, 117, 115, 
+    101, 114, 115,  92, 107, 111, 
+    108, 106,  97,  92, 100, 101, 
+    115, 107, 116, 111, 112,  92, 
+    107, 111, 108, 106,  97,  45, 
+    115, 116, 114, 111, 104, 109, 
+     45, 103,  97, 109, 101, 115, 
+     92,  97, 108, 108, 103, 101, 
+    109, 101, 105, 110,  92, 102, 
+    114,  97, 109, 101, 119, 111, 
+    114, 107,  92, 100, 120,  49, 
+     50, 118, 101, 114, 116, 101, 
+    120, 115, 104,  97, 100, 101, 
+    114,  46, 104, 108, 115, 108, 
+      0,   4,   0,   0,   0,   6, 
+      0,   0,   0,   1,   0,   0, 
+      0,  58,   0,   0,   0,   0, 
+      0,   0,   0,  17,   0,   0, 
+      0,   7,   0,   0,   0,  10, 
+      0,   0,   0,   6,   0,   0, 
+      0,   0,   0,   0,   0,   5, 
+      0,   0,   0,  34,   0,   0, 
+      0,   8,   0,   0,   0,   0, 
+      0,   0,   0, 220,  81,  51, 
+      1,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0, 255, 255, 
+    255, 255, 119,   9,  49,   1, 
+      1,   0,   0,   0,  13,   0, 
+      0, 142,  14,   0,  63,  92, 
+     15,   0,   0,   0,  76,   0, 
+      0,   0,  32,   0,   0,   0, 
+     44,   0,   0,   0,  96,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,  22,   0, 
+      0,   0,  25,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      1,   0,   0,   0,   0,   0, 
+      0,   0,  24,   4,   0,   0, 
+     32,   0,   0,  96,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   2,   0, 
+      9,   0, 156,   5,   0,   0, 
+      0,   0,   0,   0, 236,   2, 
+      0,   0,   1,   0,  85, 110, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+    109,  97, 105, 110,   0, 110, 
+    111, 110, 101,   0,   0,   0, 
+     45, 186,  46, 241,   1,   0, 
+      0,   0,   0,   0,   0,   0, 
+     24,   4,   0,   0,  32,   0, 
+      0,  96,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   2,   0,   2,   0, 
+      7,   0,   0,   0,   0,   0, 
+      1,   0, 255, 255, 255, 255, 
+      0,   0,   0,   0,  24,   4, 
+      0,   0,   8,   2,   0,   0, 
+      0,   0,   0,   0, 255, 255, 
+    255, 255,   0,   0,   0,   0, 
+    255, 255, 255, 255,   1,   0, 
+      1,   0,   0,   0,   1,   0, 
+      0,   0,   0,   0,  67,  58, 
+     92,  85, 115, 101, 114, 115, 
+     92, 107, 111, 108, 106,  97, 
+     92,  68, 101, 115, 107, 116, 
+    111, 112,  92,  75, 111, 108, 
+    106,  97,  45,  83, 116, 114, 
+    111, 104, 109,  45,  71,  97, 
+    109, 101, 115,  92,  65, 108, 
+    108, 103, 101, 109, 101, 105, 
+    110,  92,  70, 114,  97, 109, 
+    101, 119, 111, 114, 107,  92, 
+     68,  88,  49,  50,  86, 101, 
+    114, 116, 101, 120,  83, 104, 
+     97, 100, 101, 114,  46, 104, 
+    108, 115, 108,   0, 254, 239, 
+    254, 239,   1,   0,   0,   0, 
+      1,   0,   0,   0,   0,   1, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255,  12,   0, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+     16,   0,   0,   0,  32,   0, 
+      0,   0, 221,   0,   0,   0, 
+    188,   2,   0,   0, 103,   1, 
+      0,   0,  56,   0,   0,   0, 
+      0,   0,   0,   0, 177,   8, 
+      0,   0, 128,   0,   0,   0, 
+    215,   7,   0,   0, 152,   8, 
+      0,   0,  96,   0,   0,   0, 
+      0,   0,   0,   0,  40,   0, 
+      0,   0,  56,   2,   0,   0, 
+     44,   0,   0,   0,  92,   0, 
+      0,   0,   3,   0,   0,   0, 
+     30,   0,   0,   0,  20,   0, 
+      0,   0,  19,   0,   0,   0, 
+     31,   0,   0,   0,  21,   0, 
+      0,   0,  12,   0,   0,   0, 
+      6,   0,   0,   0,  22,   0, 
+      0,   0,  23,   0,   0,   0, 
+     24,   0,   0,   0,  13,   0, 
+      0,   0,   8,   0,   0,   0, 
+      9,   0,   0,   0,  10,   0, 
+      0,   0,  11,   0,   0,   0, 
+     14,   0,   0,   0,  15,   0, 
+      0,   0,  16,   0,   0,   0, 
+     17,   0,   0,   0,  18,   0, 
+      0,   0,   7,   0,   0,   0, 
+     25,   0,   0,   0,  26,   0, 
+      0,   0,  27,   0,   0,   0, 
+     29,   0,   0,   0,  28,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,  32,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
       0,   0,   0,   0,   0,   0, 
       0,   0,   0,   0,   0,   0, 
       0,   0,   0,   0,   0,   0, 
@@ -442,5 +3482,5 @@ const BYTE DX12VertexShaderBytes[] =
       0,   0,   0,   0,   0,   0, 
       0,   0,   0,   0,   0,   0, 
       0,   0,   0,   0,   0,   0, 
-      0,   0
+      0,   0,   0,   0,   0,   0
 };

+ 38 - 37
DX12VertexShader.hlsl

@@ -1,76 +1,77 @@
 
-Texture2D shaderTexture : register( t0 );
-SamplerState SampleType : register( s0 );
+Texture2D shaderTexture : register(t0);
+SamplerState SampleType : register(s0);
 
 // Matrizen für die einzelnen Knochen des Modells
 struct MatrixBuffer
 {
-    matrix knochenMatrix[ 128 ];
+	matrix knochenMatrix[128];
 };
 
 // The projection and view matrix
 struct KameraBuffer
 {
-    matrix view;
-    matrix projection;
+	matrix view;
+	matrix projection;
 };
 
 // The position of the kamera
 struct KameraBuffer2
 {
-    float4 kPosition;
+	float4 kPosition;
 };
 
 // these values should sum up to 1
 struct Material
 {
-    float ambientFactor;
-    float diffusFactor;
-    float specularFactor;
+	float ambientFactor;
+	float diffusFactor;
+	float specularFactor;
 };
 
 struct LightCount
 {
-    int diffuseLightCount;
-    int pointLightCount;
+	int diffuseLightCount;
+	int pointLightCount;
 };
 
-ConstantBuffer<KameraBuffer> Kamera : register( b0 );
-ConstantBuffer<MatrixBuffer> Skelett : register( b1 );
-ConstantBuffer<KameraBuffer2> Kamera2 : register( b2 );
-ConstantBuffer<Material> Object : register( b3 );
-ConstantBuffer<LightCount> Light : register( b4 );
+ConstantBuffer<KameraBuffer> Kamera : register(b0);
+ConstantBuffer<MatrixBuffer> Skelett : register(b1);
+ConstantBuffer<KameraBuffer2> Kamera2 : register(b2);
+ConstantBuffer<Material> Object : register(b3);
+ConstantBuffer<LightCount> Light : register(b4);
 
 struct VertexInputType
 {
-    float3 position : POSITION;
-    float2 tex : TEXCOORD;
-    float3 normal : NORMAL;
-    uint knochen : KNOCHEN_ID;
+	float3 position : POSITION;
+	float2 tex : TEXCOORD;
+	float3 normal : NORMAL;
+	uint knochen : KNOCHEN_ID;
+	half id : VERTEX_ID;
 };
 
 struct PixelInputType
 {
-    float4 worldPos : POSITION;
-    float4 position : SV_POSITION;
-    float2 tex : TEXCOORD;
-    float3 normal : NORMAL;
+	float4 worldPos : POSITION;
+	float4 position : SV_POSITION;
+	float2 tex : TEXCOORD;
+	float3 normal : NORMAL;
 };
 
-PixelInputType main( VertexInputType input )
+PixelInputType main(VertexInputType input)
 {
-    //return input;                                                                     
-    PixelInputType output;
-    output.normal = normalize( mul( input.normal, ( float3x3 )Skelett.knochenMatrix[ input.knochen ] ) );
+	//return input;                                                                     
+	PixelInputType output;
+	output.normal = normalize(mul(input.normal, (float3x3)Skelett.knochenMatrix[input.knochen]));
 
-    // Change the position vector to be 4 units for proper matrix calculations.         
-    float4 position = float4( input.position.x, input.position.y, input.position.z, 1.f );
-    // Store the texture coordinates for the pixel shader.                              
-    output.tex = input.tex;
+	// Change the position vector to be 4 units for proper matrix calculations.         
+	float4 position = float4(input.position.x, input.position.y, input.position.z, 1.f);
+	// Store the texture coordinates for the pixel shader.                              
+	output.tex = input.tex;
 
-    // Calculate the position of the vertex against the world, view, and projection matrices. 
-    output.worldPos = mul( position, Skelett.knochenMatrix[ input.knochen ] );
-    output.position = mul( output.worldPos, Kamera.view );
-    output.position = mul( output.position, Kamera.projection );
-    return output;
+	// Calculate the position of the vertex against the world, view, and projection matrices. 
+	output.worldPos = mul(position, Skelett.knochenMatrix[input.knochen]);
+	output.position = mul(output.worldPos, Kamera.view);
+	output.position = mul(output.position, Kamera.projection);
+	return output;
 }

+ 67 - 67
DXBuffer.h

@@ -13,77 +13,77 @@ struct ID3D11DeviceContext;
 
 namespace Framework
 {
-    class DX12CopyCommandQueue;
-    class DX12DirectCommandQueue;
+	class DX12CopyCommandQueue;
+	class DX12DirectCommandQueue;
 
-    //! Eine Schnittstelle zwischen dem Arbeitsspeicher und dem Grafikspeicher
-    class DXBuffer : public virtual ReferenceCounter
-    {
-    protected:
-        void* data;
-        bool changed;
-        int len;
-        int elLen;
+	//! Eine Schnittstelle zwischen dem Arbeitsspeicher und dem Grafikspeicher
+	class DXBuffer : public virtual ReferenceCounter
+	{
+	protected:
+		void* data;
+		bool changed;
+		int len;
+		int elLen;
 
-    public:
-        //! Konstruktor
-        //! \param bind Der verwendungszweck des Buffers. Beispiel: D3D11_BIND_INDEX_BUFFER, D3D11_BIND_VERTEX_BUFFER.
-        //! \param eLen Länge eines einzelnen Elements in Bytes
-        DLLEXPORT DXBuffer( int eLen );
-        //! Destruktor
-        DLLEXPORT virtual ~DXBuffer();
-        //! Setzt den geändert fläg, so das beim nächsten auruf von 'kopieren' die daten neu kopiert werden
-        DLLEXPORT void setChanged();
-        //! Ändert die länge des Buffers beim nächsten aufruf von 'kopieren'
-        //! \param len Die Länge in Bytes
-        DLLEXPORT void setLength( int len );
-        //! Legt fest, was beim nächsten aufruf von 'kopieren' kopiert wird
-        //! \param data Ein zeiger auf die Daten
-        DLLEXPORT void setData( void* data );
-        //! Kopiert die Daten in den Buffer, fals sie sich verändert haben
-        DLLEXPORT virtual void copieren( int byteCount = -1 ) = 0;
-        //! Gibt die Länge eines Elementes in bytes zurück
-        DLLEXPORT int getElementLength() const;
-        //! Gibt die Anzahl der Elemente im Buffer zurück
-        DLLEXPORT int getElementAnzahl() const;
-    };
+	public:
+		//! Konstruktor
+		//! \param bind Der verwendungszweck des Buffers. Beispiel: D3D11_BIND_INDEX_BUFFER, D3D11_BIND_VERTEX_BUFFER.
+		//! \param eLen Länge eines einzelnen Elements in Bytes
+		DLLEXPORT DXBuffer(int eLen);
+		//! Destruktor
+		DLLEXPORT virtual ~DXBuffer();
+		//! Setzt den geändert fläg, so das beim nächsten auruf von 'kopieren' die daten neu kopiert werden
+		DLLEXPORT void setChanged();
+		//! Ändert die länge des Buffers beim nächsten aufruf von 'kopieren'
+		//! \param len Die Länge in Bytes
+		DLLEXPORT void setLength(int len);
+		//! Legt fest, was beim nächsten aufruf von 'kopieren' kopiert wird
+		//! \param data Ein zeiger auf die Daten
+		DLLEXPORT void setData(void* data);
+		//! Kopiert die Daten in den Buffer, fals sie sich verändert haben
+		DLLEXPORT virtual void copieren(int byteCount = -1) = 0;
+		//! Gibt die Länge eines Elementes in bytes zurück
+		DLLEXPORT int getElementLength() const;
+		//! Gibt die Anzahl der Elemente im Buffer zurück
+		DLLEXPORT int getElementAnzahl() const;
+	};
 
 #ifdef WIN32
-    //! Ein Buffer mit Daten im Grafikspeicher
-    class DX11Buffer : public DXBuffer
-    {
-    protected:
-        D3D11_BUFFER_DESC* description;
-        ID3D11Buffer* buffer;
-        ID3D11Device* device;
-        ID3D11DeviceContext* context;
-    public:
-        //! Konstruktor
-        //! eSize: Die Länge eines Elementes in Bytes
-        DLLEXPORT DX11Buffer( int eSize, ID3D11Device* device, ID3D11DeviceContext* context, int bindFlags );
-        //! Destruktor
-        DLLEXPORT virtual ~DX11Buffer();
-        //! Kopiert die Daten in den Buffer, fals sie sich verändert haben
-        DLLEXPORT void copieren( int byteCount = -1 ) override;
-        //! Gibt den Buffer zurück
-        DLLEXPORT ID3D11Buffer* zBuffer() const;
-    };
+	//! Ein Buffer mit Daten im Grafikspeicher
+	class DX11Buffer : public DXBuffer
+	{
+	protected:
+		D3D11_BUFFER_DESC* description;
+		ID3D11Buffer* buffer;
+		ID3D11Device* device;
+		ID3D11DeviceContext* context;
+	public:
+		//! Konstruktor
+		//! eSize: Die Länge eines Elementes in Bytes
+		DLLEXPORT DX11Buffer(int eSize, ID3D11Device* device, ID3D11DeviceContext* context, int bindFlags);
+		//! Destruktor
+		DLLEXPORT virtual ~DX11Buffer();
+		//! Kopiert die Daten in den Buffer, fals sie sich verändert haben
+		DLLEXPORT void copieren(int byteCount = -1) override;
+		//! Gibt den Buffer zurück
+		DLLEXPORT ID3D11Buffer* zBuffer() const;
+	};
 
-    //! Ein Buffer von Indizes aus dem Buffer mit Eckpunkten, wovon immer drei ein Dreieck ergeben, das gezeichnet wird
-    class DX11StructuredBuffer : public DX11Buffer
-    {
-    private:
-        ID3D11ShaderResourceView* view;
-    public:
-        //! Konstruktor
-        //! eSize: Die Länge eines Elementes in Bytes
-        DLLEXPORT DX11StructuredBuffer( int eSize, ID3D11Device* device, ID3D11DeviceContext* context );
-        //! Destruktor
-        DLLEXPORT virtual ~DX11StructuredBuffer();
-        //! Kopiert die Daten in den Buffer, fals sie sich verändert haben
-        DLLEXPORT void copieren( int byteCount = -1 ) override;
-        //! Gibt die verwendtete Shader Resource View zurück
-        DLLEXPORT operator ID3D11ShaderResourceView* () const;
-    };
+	//! Ein Buffer von Indizes aus dem Buffer mit Eckpunkten, wovon immer drei ein Dreieck ergeben, das gezeichnet wird
+	class DX11StructuredBuffer : public DX11Buffer
+	{
+	private:
+		ID3D11ShaderResourceView* view;
+	public:
+		//! Konstruktor
+		//! eSize: Die Länge eines Elementes in Bytes
+		DLLEXPORT DX11StructuredBuffer(int eSize, ID3D11Device* device, ID3D11DeviceContext* context);
+		//! Destruktor
+		DLLEXPORT virtual ~DX11StructuredBuffer();
+		//! Kopiert die Daten in den Buffer, fals sie sich verändert haben
+		DLLEXPORT void copieren(int byteCount = -1) override;
+		//! Gibt die verwendtete Shader Resource View zurück
+		DLLEXPORT operator ID3D11ShaderResourceView* () const;
+	};
 #endif
 }

+ 200 - 196
GraphicsApi.h

@@ -48,218 +48,222 @@ struct tagRECT;
 
 namespace Framework
 {
-    class WFenster;
-    class Bild;
-    class Textur;
-    class DX11PixelShader;
-    class DX11VertexShader;
-    class TexturModel;
-    class Render3D;
-    class TexturList;
-    class Kam3D;
-    class Model3D;
-    class DX11Buffer;
-    class DX11StructuredBuffer;
-    class DX12Buffer;
-    class DX12DirectCommandQueue;
-    class DX12CopyCommandQueue;
-    class DX12ComputeCommandQueue;
-    class DX12PixelShader;
-    class DX12VertexShader;
-    class DX12VertexBuffer;
-    class DX12IndexBuffer;
-    class Model3DList;
-    class DXBuffer;
-    class Model3DData;
+	class WFenster;
+	class Bild;
+	class Textur;
+	class DX11PixelShader;
+	class DX11VertexShader;
+	class TexturModel;
+	class Render3D;
+	class TexturList;
+	class Kam3D;
+	class Model3D;
+	class DX11Buffer;
+	class DX11StructuredBuffer;
+	class DX12Buffer;
+	class DX12DirectCommandQueue;
+	class DX12CopyCommandQueue;
+	class DX12ComputeCommandQueue;
+	class DX12PixelShader;
+	class DX12VertexShader;
+	class DX12VertexBuffer;
+	class DX12IndexBuffer;
+	class Model3DList;
+	class DXBuffer;
+	class Model3DData;
 
-    enum GraphicApiType;
+	enum GraphicApiType;
 
-    struct DiffuseLight
-    {
-        Vec3<float> direction;
-        Vec3<float> color;
-    };
+	struct DiffuseLight
+	{
+		Vec3<float> direction;
+		Vec3<float> color;
+	};
 
-    struct PointLight
-    {
-        Vec3<float> position;
-        Vec3<float> color;
-        float radius;
-    };
+	struct PointLight
+	{
+		Vec3<float> position;
+		Vec3<float> color;
+		float radius;
+	};
 
-    class GraphicsApi : public virtual ReferenceCounter
-    {
-    protected:
-        GraphicApiType typ;
-        WFenster* fenster;
-        Vec2<int> backBufferSize;
-        Model3DList* modelList;
-        int nextModelId;
-        Critical cs;
+	class GraphicsApi : public virtual ReferenceCounter
+	{
+	protected:
+		GraphicApiType typ;
+		WFenster* fenster;
+		Vec2<int> backBufferSize;
+		Model3DList* modelList;
+		int nextModelId;
+		Critical cs;
 
-        bool fullScreen;
+		bool fullScreen;
 
-        DLLEXPORT virtual DXBuffer* createIndexBuffer() = 0;
-        DLLEXPORT virtual DXBuffer* createVertexBuffer() = 0;
+		DLLEXPORT virtual DXBuffer* createIndexBuffer() = 0;
+		DLLEXPORT virtual DXBuffer* createVertexBuffer() = 0;
 
-    public:
-        DLLEXPORT GraphicsApi( GraphicApiType typ );
-        DLLEXPORT virtual ~GraphicsApi();
-        DLLEXPORT virtual void initialize( WFenster* fenster, Vec2<int> backBufferSize, bool fullScreen );
-        DLLEXPORT virtual void setBackBufferSize( Vec2< int > size );
-        DLLEXPORT virtual void setFullScreen( bool fullScreen );
-        DLLEXPORT virtual void update() = 0;
-        DLLEXPORT virtual void beginFrame( bool fill2D = 0, bool fill3D = 0, int fillColor = 0 );
-        DLLEXPORT virtual void renderKamera( Kam3D* zKamera );
-        DLLEXPORT virtual void renderKamera( Kam3D* zKamera, Textur* zTarget );
-        DLLEXPORT virtual void presentFrame() = 0;
-        DLLEXPORT virtual Textur* createOrGetTextur( const char* name, Bild* b = 0 );
-        DLLEXPORT GraphicApiType getTyp() const;
-        DLLEXPORT Vec2< int > getBackBufferSize() const;
-        DLLEXPORT bool isFullScreen() const;
-        DLLEXPORT virtual Bild* zUIRenderBild() const = 0;
-        // returns the specified model without increased reference counter
-        DLLEXPORT virtual Model3DData* zModel( const char* name );
-        // returns the specified model with increased reference counter
-        DLLEXPORT virtual Model3DData* getModel( const char* name );
-        // creates a new empty Model3DData object if the model does not exist yet
-        DLLEXPORT virtual Model3DData* createModel( const char* name );
-        // check if a model exists
-        DLLEXPORT virtual bool hasModel( const char* name );
-    };
+	public:
+		DLLEXPORT GraphicsApi(GraphicApiType typ);
+		DLLEXPORT virtual ~GraphicsApi();
+		DLLEXPORT virtual void initialize(WFenster* fenster, Vec2<int> backBufferSize, bool fullScreen);
+		DLLEXPORT virtual void setBackBufferSize(Vec2< int > size);
+		DLLEXPORT virtual void setFullScreen(bool fullScreen);
+		DLLEXPORT virtual void update() = 0;
+		DLLEXPORT virtual void beginFrame(bool fill2D = 0, bool fill3D = 0, int fillColor = 0);
+		DLLEXPORT virtual void renderKamera(Kam3D* zKamera);
+		DLLEXPORT virtual void renderKamera(Kam3D* zKamera, Textur* zTarget);
+		DLLEXPORT virtual void presentFrame() = 0;
+		DLLEXPORT virtual Textur* createOrGetTextur(const char* name, Bild* b = 0);
+		DLLEXPORT GraphicApiType getTyp() const;
+		DLLEXPORT Vec2< int > getBackBufferSize() const;
+		DLLEXPORT bool isFullScreen() const;
+		DLLEXPORT virtual Bild* zUIRenderBild() const = 0;
+		// returns the specified model without increased reference counter
+		DLLEXPORT virtual Model3DData* zModel(const char* name);
+		// returns the specified model with increased reference counter
+		DLLEXPORT virtual Model3DData* getModel(const char* name);
+		// creates a new empty Model3DData object if the model does not exist yet
+		DLLEXPORT virtual Model3DData* createModel(const char* name);
+		// check if a model exists
+		DLLEXPORT virtual bool hasModel(const char* name);
+	};
 
-    class DirectX9 : public GraphicsApi
-    {
-    private:
-        IDirect3D9* pDirect3D;
-        IDirect3DDevice9* pDevice;
-        IDirect3DSurface9* pBackBuffer;
-        _D3DLOCKED_RECT* backRect;
-        Bild* uiBild;
+	class DirectX9 : public GraphicsApi
+	{
+	private:
+		IDirect3D9* pDirect3D;
+		IDirect3DDevice9* pDevice;
+		IDirect3DSurface9* pBackBuffer;
+		_D3DLOCKED_RECT* backRect;
+		Bild* uiBild;
 
-        DLLEXPORT virtual DXBuffer* createIndexBuffer() override;
-        DLLEXPORT virtual DXBuffer* createVertexBuffer() override;
+		DLLEXPORT virtual DXBuffer* createIndexBuffer() override;
+		DLLEXPORT virtual DXBuffer* createVertexBuffer() override;
 
-    public:
-        DLLEXPORT DirectX9();
-        DLLEXPORT ~DirectX9();
-        DLLEXPORT void initialize( WFenster* fenster, Vec2<int> backBufferSize, bool fullScreen ) override;
-        DLLEXPORT void update() override;
-        DLLEXPORT void beginFrame( bool fill2D, bool fill3D, int fillColor ) override;
-        DLLEXPORT void renderKamera( Kam3D* zKamera ) override;
-        DLLEXPORT void presentFrame() override;
-        DLLEXPORT Textur* createOrGetTextur( const char* name, Bild* b ) override;
-        DLLEXPORT Bild* zUIRenderBild() const override;
-    };
+	public:
+		DLLEXPORT DirectX9();
+		DLLEXPORT ~DirectX9();
+		DLLEXPORT void initialize(WFenster* fenster, Vec2<int> backBufferSize, bool fullScreen) override;
+		DLLEXPORT void update() override;
+		DLLEXPORT void beginFrame(bool fill2D, bool fill3D, int fillColor) override;
+		DLLEXPORT void renderKamera(Kam3D* zKamera) override;
+		DLLEXPORT void presentFrame() override;
+		DLLEXPORT Textur* createOrGetTextur(const char* name, Bild* b) override;
+		DLLEXPORT Bild* zUIRenderBild() const override;
+	};
 
-    class DirectX11 : public GraphicsApi
-    {
-    private:
-        ID3D11Device* d3d11Device;
-        ID3D11DeviceContext* d3d11Context;
-        IDXGISwapChain* d3d11SpawChain;
-        Textur* uiTextur;
-        DX11VertexShader* vertexShader;
-        DX11PixelShader* pixelShader;
-        ID3D11SamplerState* sampleState;
-        ID3D11RenderTargetView* rtview;
-        ID3D11DepthStencilView* dsView;
-        ID3D11Texture2D* depthStencilBuffer;
-        ID3D11DepthStencilState* depthStencilState;
-        ID3D11DepthStencilState* depthDisabledStencilState;
-        ID3D11BlendState* blendStateAlphaBlend;
-        D3D11_VIEWPORT* vp;
-        TexturModel* texturModel;
-        TexturList* texturRegister;
-        ID3D11RasterizerState* texturRS;
-        ID3D11RasterizerState* meshRS;
-        Textur* defaultTextur;
-        DX11StructuredBuffer* diffuseLights;
-        DX11StructuredBuffer* pointLights;
-        Mat4< float > matrixBuffer[ MAX_KNOCHEN_ANZ ];
-        Mat4< float > viewAndProj[ 2 ];
-        Vec3< float > kamPos;
-        Ebene3D< float > frustrum[ 6 ];
-        int lastModelId = -1;
+	class DirectX11 : public GraphicsApi
+	{
+	private:
+		ID3D11Device* d3d11Device;
+		ID3D11DeviceContext* d3d11Context;
+		IDXGISwapChain* d3d11SpawChain;
+		Textur* uiTextur;
+		DX11VertexShader* vertexShader;
+		DX11PixelShader* pixelShader;
+		ID3D11SamplerState* sampleState;
+		ID3D11RenderTargetView* rtview;
+		ID3D11DepthStencilView* dsView;
+		ID3D11Texture2D* depthStencilBuffer;
+		ID3D11DepthStencilState* depthStencilState;
+		ID3D11DepthStencilState* depthDisabledStencilState;
+		ID3D11BlendState* blendStateAlphaBlend;
+		D3D11_VIEWPORT* vp;
+		TexturModel* texturModel;
+		TexturList* texturRegister;
+		ID3D11RasterizerState* texturRS;
+		ID3D11RasterizerState* meshRS;
+		Textur* defaultTextur;
+		DX11StructuredBuffer* diffuseLights;
+		DX11StructuredBuffer* pointLights;
+		Mat4< float > matrixBuffer[MAX_KNOCHEN_ANZ];
+		Mat4< float > viewAndProj[2];
+		Vec3< float > kamPos;
+		Ebene3D< float > frustrum[6];
+		int lastModelId = -1;
 
-        void renderObject( Model3D* zObj );
-        //! Überprüft, ob eine Kugel in dem Sichtbaren Raum der Welt liegt und gezeichnet werden muss
-        //! \param pos Der Mittelpunkt der Kugel
-        //! \param radius Der Radius der Kugel
-        //! \param dist Einen Zeiger auf einen float, in dem das quadrat des Abstands zur Kammeraposition gespeichert wird, falls diese Funktion true zurückgiebt und der Zeiger nicht 0 ist
-        bool isInFrustrum( const Vec3< float >& pos, float radius, float* dist = 0 ) const;
-        DLLEXPORT virtual DXBuffer* createIndexBuffer() override;
-        DLLEXPORT virtual DXBuffer* createVertexBuffer() override;
+		void renderObject(Model3D* zObj);
+		//! Überprüft, ob eine Kugel in dem Sichtbaren Raum der Welt liegt und gezeichnet werden muss
+		//! \param pos Der Mittelpunkt der Kugel
+		//! \param radius Der Radius der Kugel
+		//! \param dist Einen Zeiger auf einen float, in dem das quadrat des Abstands zur Kammeraposition gespeichert wird, falls diese Funktion true zurückgiebt und der Zeiger nicht 0 ist
+		bool isInFrustrum(const Vec3< float >& pos, float radius, float* dist = 0) const;
+		DLLEXPORT virtual DXBuffer* createIndexBuffer() override;
+		DLLEXPORT virtual DXBuffer* createVertexBuffer() override;
 
-    public:
-        DLLEXPORT DirectX11();
-        DLLEXPORT ~DirectX11();
-        DLLEXPORT void initialize( WFenster* fenster, Vec2<int> backBufferSize, bool fullScreen ) override;
-        DLLEXPORT void update() override;
-        DLLEXPORT void beginFrame( bool fill2D, bool fill3D, int fillColor ) override;
-        DLLEXPORT void renderKamera( Kam3D* zKamera ) override;
-        DLLEXPORT void renderKamera( Kam3D* zKamera, Textur* zTarget ) override;
-        DLLEXPORT void presentFrame() override;
-        DLLEXPORT Textur* createOrGetTextur( const char* name, Bild* b ) override;
-        DLLEXPORT Bild* zUIRenderBild() const override;
+	protected:
+		DLLEXPORT virtual DX11VertexShader* initializeVertexShader(unsigned char* byteCode, int size);
+		DLLEXPORT virtual DX11PixelShader* initializePixelShader(unsigned char* byteCode, int size);
 
-        DLLEXPORT static bool isAvailable();
-    };
+	public:
+		DLLEXPORT DirectX11();
+		DLLEXPORT ~DirectX11();
+		DLLEXPORT void initialize(WFenster* fenster, Vec2<int> backBufferSize, bool fullScreen) override;
+		DLLEXPORT void update() override;
+		DLLEXPORT void beginFrame(bool fill2D, bool fill3D, int fillColor) override;
+		DLLEXPORT void renderKamera(Kam3D* zKamera) override;
+		DLLEXPORT void renderKamera(Kam3D* zKamera, Textur* zTarget) override;
+		DLLEXPORT void presentFrame() override;
+		DLLEXPORT Textur* createOrGetTextur(const char* name, Bild* b) override;
+		DLLEXPORT Bild* zUIRenderBild() const override;
 
-    class DirectX12 : public GraphicsApi
-    {
-    private:
-        ID3D12Debug* debug;
-        ID3D12Device* device;
-        ID3D12InfoQueue* infoQueue;
-        DX12DirectCommandQueue* directCommandQueue;
-        DX12CopyCommandQueue* copyCommandQueue;
-        DX12ComputeCommandQueue* computeCommandQueue;
-        IDXGISwapChain4* swapChain;
-        ID3D12DescriptorHeap* rtvHeap;
-        ID3D12DescriptorHeap* dsvHeap;
-        ID3D12DescriptorHeap* shaderBufferHeap;
-        ID3D12Resource* depthBuffer;
-        ID3D12Resource* backBuffer[ 2 ];
-        int backBufferIndex;
-        int tearing;
-        D3D12_VIEWPORT* viewPort;
-        tagRECT* allowedRenderArea;
-        D3D12_VERTEX_BUFFER_VIEW* vertexBufferView;
-        D3D12_INDEX_BUFFER_VIEW* indexBufferView;
-        ID3D12RootSignature* signature;
-        ID3D12PipelineState* pipeline;
-        Mat4< float > matrixBuffer[ MAX_KNOCHEN_ANZ ];
-        Mat4< float > viewAndProj[ 2 ];
-        Vec3< float > kamPos;
-        Ebene3D< float > frustrum[ 6 ];
-        TexturModel* texturModel;
-        Textur* uiTextur;
-        TexturList* texturRegister;
-        DX12VertexShader* vertexShader;
-        DX12PixelShader* pixelShader;
+		DLLEXPORT static bool isAvailable();
+	};
 
-        void renderObject( Model3D* zObj );
-        //! Überprüft, ob eine Kugel in dem Sichtbaren Raum der Welt liegt und gezeichnet werden muss
-        //! \param pos Der Mittelpunkt der Kugel
-        //! \param radius Der Radius der Kugel
-        //! \param dist Einen Zeiger auf einen float, in dem das quadrat des Abstands zur Kammeraposition gespeichert wird, falls diese Funktion true zurückgiebt und der Zeiger nicht 0 ist
-        bool isInFrustrum( const Vec3< float >& pos, float radius, float* dist = 0 ) const;
-        DLLEXPORT virtual DXBuffer* createIndexBuffer() override;
-        DLLEXPORT virtual DXBuffer* createVertexBuffer() override;
+	class DirectX12 : public GraphicsApi
+	{
+	private:
+		ID3D12Debug* debug;
+		ID3D12Device* device;
+		ID3D12InfoQueue* infoQueue;
+		DX12DirectCommandQueue* directCommandQueue;
+		DX12CopyCommandQueue* copyCommandQueue;
+		DX12ComputeCommandQueue* computeCommandQueue;
+		IDXGISwapChain4* swapChain;
+		ID3D12DescriptorHeap* rtvHeap;
+		ID3D12DescriptorHeap* dsvHeap;
+		ID3D12DescriptorHeap* shaderBufferHeap;
+		ID3D12Resource* depthBuffer;
+		ID3D12Resource* backBuffer[2];
+		int backBufferIndex;
+		int tearing;
+		D3D12_VIEWPORT* viewPort;
+		tagRECT* allowedRenderArea;
+		D3D12_VERTEX_BUFFER_VIEW* vertexBufferView;
+		D3D12_INDEX_BUFFER_VIEW* indexBufferView;
+		ID3D12RootSignature* signature;
+		ID3D12PipelineState* pipeline;
+		Mat4< float > matrixBuffer[MAX_KNOCHEN_ANZ];
+		Mat4< float > viewAndProj[2];
+		Vec3< float > kamPos;
+		Ebene3D< float > frustrum[6];
+		TexturModel* texturModel;
+		Textur* uiTextur;
+		TexturList* texturRegister;
+		DX12VertexShader* vertexShader;
+		DX12PixelShader* pixelShader;
 
-    public:
-        DLLEXPORT DirectX12();
-        DLLEXPORT ~DirectX12();
-        DLLEXPORT void initialize( WFenster* fenster, Vec2<int> backBufferSize, bool fullScreen ) override;
-        DLLEXPORT void update() override;
-        DLLEXPORT void beginFrame( bool fill2D, bool fill3D, int fillColor ) override;
-        DLLEXPORT void renderKamera( Kam3D* zKamera ) override;
-        // TODO: DLLEXPORT void renderKamera( Kam3D* zKamera, Textur* zTarget ) override;
-        DLLEXPORT void presentFrame() override;
-        DLLEXPORT Textur* createOrGetTextur( const char* name, Bild* b ) override;
-        DLLEXPORT Bild* zUIRenderBild() const override;
+		void renderObject(Model3D* zObj);
+		//! Überprüft, ob eine Kugel in dem Sichtbaren Raum der Welt liegt und gezeichnet werden muss
+		//! \param pos Der Mittelpunkt der Kugel
+		//! \param radius Der Radius der Kugel
+		//! \param dist Einen Zeiger auf einen float, in dem das quadrat des Abstands zur Kammeraposition gespeichert wird, falls diese Funktion true zurückgiebt und der Zeiger nicht 0 ist
+		bool isInFrustrum(const Vec3< float >& pos, float radius, float* dist = 0) const;
+		DLLEXPORT virtual DXBuffer* createIndexBuffer() override;
+		DLLEXPORT virtual DXBuffer* createVertexBuffer() override;
 
-        DLLEXPORT static bool isAvailable();
-    };
+	public:
+		DLLEXPORT DirectX12();
+		DLLEXPORT ~DirectX12();
+		DLLEXPORT void initialize(WFenster* fenster, Vec2<int> backBufferSize, bool fullScreen) override;
+		DLLEXPORT void update() override;
+		DLLEXPORT void beginFrame(bool fill2D, bool fill3D, int fillColor) override;
+		DLLEXPORT void renderKamera(Kam3D* zKamera) override;
+		// TODO: DLLEXPORT void renderKamera( Kam3D* zKamera, Textur* zTarget ) override;
+		DLLEXPORT void presentFrame() override;
+		DLLEXPORT Textur* createOrGetTextur(const char* name, Bild* b) override;
+		DLLEXPORT Bild* zUIRenderBild() const override;
+
+		DLLEXPORT static bool isAvailable();
+	};
 }

+ 8 - 0
Model3D.cpp

@@ -391,6 +391,7 @@ void Model3DData::setVertecies(Vertex3D* vertexList, int anz)
 			maxPos.y = vertexList[i].pos.y;
 		if (vertexList[i].pos.z > maxPos.z)
 			maxPos.z = vertexList[i].pos.z;
+		vertexList[i].id = i;
 	}
 	dxVertexBuffer->setLength((int)(anz * sizeof(Vertex3D)));
 	dxVertexBuffer->setData(vertexList);
@@ -805,6 +806,13 @@ bool Model3D::tick(double tickval)
 	return Zeichnung3D::tick(tickval);
 }
 
+//! zum aktualisieren der shader daten
+void Model3D::beforeRender(GraphicsApi* api, Shader* zVertexShader, Shader* zPixelShader)
+{}
+
+void Model3D::afterRender(GraphicsApi* api, Shader* zVertexShader, Shader* zPixelShader)
+{}
+
 // Gibt die Textur zurück
 Model3DTextur* Model3D::getTextur()
 {

+ 6 - 0
Model3D.h

@@ -19,6 +19,8 @@ namespace Framework
 	class Animation3D; //! Animation3D.h
 	class Welt3D; //! Welt3D.h
 	class DXBuffer;
+	class Shader;
+	class GraphicsApi;
 
 	//! Repräsentiert einen Knochen eines 3D Models. Kann annimiert werden
 	class Knochen
@@ -120,6 +122,7 @@ namespace Framework
 		Vec2< float > tPos; //! Die Textur Koordinaten der Ecke
 		Vec3< float > normal; //! Die Normale (zeigt nach außen und steht senkrecht auf der Oberfläche des models)
 		int knochenId; //! Die Id des Knochens, mit dem sich die Ecke bei einer Annimation mitbewegt
+		short id;//! Der index des vertexes im vertex buffer
 	};
 
 	//! Eine Struktur, die alle Dreiecke eines 3D Polygons speichert
@@ -316,6 +319,9 @@ namespace Framework
 		//! \param tickval Die zeit in sekunden, die seit dem letzten Aufruf der Funktion vergangen ist
 		//! \return true, wenn sich das Objekt verändert hat, false sonnst.
 		DLLEXPORT virtual bool tick(double tickval) override;
+		//! zum aktualisieren der shader daten
+		DLLEXPORT virtual void beforeRender(GraphicsApi* api, Shader* zVertexShader, Shader* zPixelShader);
+		DLLEXPORT virtual void afterRender(GraphicsApi* api, Shader* zVertexShader, Shader* zPixelShader);
 		//! Gibt die Textur zurück
 		DLLEXPORT Model3DTextur* getTextur();
 		//! Gibt die Textur zurück (ohne erhöhten Reference Counter)

+ 119 - 107
Shader.cpp

@@ -12,27 +12,27 @@ using namespace Framework;
 
 // Konstruktor
 Shader::Shader()
-    : ReferenceCounter()
+	: ReferenceCounter()
 {
-    type = UNBEKANNT;
-    constBuffers = new RCArray< DXBuffer >();
+	type = UNBEKANNT;
+	constBuffers = new RCArray< DXBuffer >();
 }
 
 // Destruktor
 Shader::~Shader()
 {
-    constBuffers->release();
+	constBuffers->release();
 }
 
 // Löscht einen constanten Buffer
 //  index: der Index des Buffers, der gelöscht werden soll. Buffer 0 kann nicht gelöscht werden, solange Buffer 1 noch existiert usw.
-bool Shader::removeConstBuffer( int index )
+bool Shader::removeConstBuffer(int index)
 {
-    if( index < 0 )
-        return 0;
-    bool ok = 1;
-    constBuffers->set( 0, index );
-    return 1;
+	if (index < 0)
+		return 0;
+	bool ok = 1;
+	constBuffers->set(0, index);
+	return 1;
 }
 
 // Kopiert daten in einen constanten buffer
@@ -40,43 +40,55 @@ bool Shader::removeConstBuffer( int index )
 //  data: Einen zeiger auf en byte Array der größe des Buffers
 //  index: Der Index des Buffers
 //  län: Die Länge der Daten in Bytes (-1 für die maximale größe des Buffers)
-bool Shader::füllConstBuffer( char* data, int index, int len )
+bool Shader::füllConstBuffer(char* data, int index, int len)
 {
-    if( index < 0 || index > constBuffers->getLastIndex() )
-        return 0;
-    DXBuffer* zB = constBuffers->z( index );
-    if( !zB )
-        return 0;
-    if( len < 0 )
-        len = zB->getElementAnzahl() * zB->getElementLength();
-    zB->setData( data );
-    zB->copieren( len );
-    return 1;
+	if (index < 0 || index > constBuffers->getLastIndex())
+		return 0;
+	DXBuffer* zB = constBuffers->z(index);
+	if (!zB)
+		return 0;
+	if (len < 0)
+		len = zB->getElementAnzahl() * zB->getElementLength();
+	zB->setData(data);
+	zB->copieren(len);
+	return 1;
 }
 
 // Gibt die Länge eines constanten Buffers zurück
 //  index: Der Index des Buffers
-int Shader::getConstBufferLänge( int index ) const
+int Shader::getConstBufferLänge(int index) const
 {
-    if( index < 0 || index > constBuffers->getLastIndex() )
-        return 0;
-    DXBuffer* zB = constBuffers->z( index );
-    if( !zB )
-        return 0;
-    return zB->getElementAnzahl() * zB->getElementLength();
+	if (index < 0 || index > constBuffers->getLastIndex())
+		return 0;
+	DXBuffer* zB = constBuffers->z(index);
+	if (!zB)
+		return 0;
+	return zB->getElementAnzahl() * zB->getElementLength();
 }
 
 // Gibt den Shadertyp zurück
 ShaderType Shader::getType() const
 {
-    return type;
+	return type;
 }
 
-DX11Shader::DX11Shader( ID3D11Device* device, ID3D11DeviceContext* context )
-    : Shader()
+//! Gibt den index des ersten nicht initialisierten buffers zurück
+int Shader::getFirstUninitializedBufferIndex() const
 {
-    this->device = device;
-    this->context = context;
+	for (int index = 0; index < constBuffers->getEintragAnzahl(); index++)
+	{
+		if (!constBuffers->hat(index) || !constBuffers->z(index))
+			return index;
+	}
+	return constBuffers->getEintragAnzahl();
+}
+
+
+DX11Shader::DX11Shader(ID3D11Device* device, ID3D11DeviceContext* context)
+	: Shader()
+{
+	this->device = device;
+	this->context = context;
 }
 
 DX11Shader::~DX11Shader()
@@ -87,97 +99,97 @@ DX11Shader::~DX11Shader()
 //  zD3d11Device: Das Device, mit dem der Buffer erstellt werden soll
 //  größe: Die größe des buffers in byte
 //  index: Die position des Buffers im Buffer Array. Bereits vorhanderner Buffer wird ersetzt. Buffer 1 kann nicht erstellt werden, wenn Buffer 0 noch nicht erstellt wurde usw.
-bool DX11Shader::erstelleConstBuffer( int größe, int index )
+bool DX11Shader::erstelleConstBuffer(int größe, int index)
 {
-    if( index < 0 || index >= 14 )
-        return 0;
-    bool ok = 1;
-    while( (größe / 16) * 16 != größe ) // es sind nur vielfache von 16 als größe erlaubt
-        größe++;
-    while( !constBuffers->hat( index ) )
-        constBuffers->add( 0 );
-    constBuffers->set( new DX11Buffer( 1, device, context, D3D11_BIND_CONSTANT_BUFFER ), index );
-    constBuffers->z( index )->setLength( größe );
-    return 1;
+	if (index < 0 || index >= 14)
+		return 0;
+	bool ok = 1;
+	while ((größe / 16) * 16 != größe) // es sind nur vielfache von 16 als größe erlaubt
+		größe++;
+	while (!constBuffers->hat(index))
+		constBuffers->add(0);
+	constBuffers->set(new DX11Buffer(1, device, context, D3D11_BIND_CONSTANT_BUFFER), index);
+	constBuffers->z(index)->setLength(größe);
+	return 1;
 }
 
 
 // Inhalt der PixelShader Klasse
 
 // Konstruktor
-DX11PixelShader::DX11PixelShader( ID3D11Device* device, ID3D11DeviceContext* context )
-    : DX11Shader( device, context )
+DX11PixelShader::DX11PixelShader(ID3D11Device* device, ID3D11DeviceContext* context)
+	: DX11Shader(device, context)
 {
-    pixelShader = 0;
+	pixelShader = 0;
 }
 
 // Destruktor
 DX11PixelShader::~DX11PixelShader()
 {
-    if( pixelShader )
-        pixelShader->Release();
+	if (pixelShader)
+		pixelShader->Release();
 }
 
 // Setzt den Compilierten Shader
 //  bytes: Die Bytes des compilierten codes
 //  length: die Länge des bytearrays
 //  return: true, wenn bytes gültig ist, false sonst
-bool DX11PixelShader::setCompiledByteArray( unsigned char* bytes, int length )
+bool DX11PixelShader::setCompiledByteArray(unsigned char* bytes, int length)
 {
-    HRESULT result = device->CreatePixelShader( bytes, length, 0, &pixelShader );
-    return result == S_OK;
+	HRESULT result = device->CreatePixelShader(bytes, length, 0, &pixelShader);
+	return result == S_OK;
 }
 
 // Nach dem Aufruf dieser Funktion wird dieser Shader als Pixel Shader benutzt
 //  zD3d11Context: Das Context Objekt, mit dem der Shader verwendet werden soll
 void DX11PixelShader::benutzeShader()
 {
-    int maxI = constBuffers->getLastIndex();
-    for( int i = 0; i <= maxI; i++ )
-    {
-        if( !constBuffers->z( i ) )
-            continue;
-        if( !((DX11Buffer*)constBuffers->z( i ))->zBuffer() )
-            constBuffers->z( i )->copieren();
-        ID3D11Buffer* buf = ((DX11Buffer*)constBuffers->z( i ))->zBuffer();
-        context->PSSetConstantBuffers( i, 1, &buf );
-    }
-    if( pixelShader )
-        context->PSSetShader( pixelShader, 0, 0 );
+	int maxI = constBuffers->getLastIndex();
+	for (int i = 0; i <= maxI; i++)
+	{
+		if (!constBuffers->z(i))
+			continue;
+		if (!((DX11Buffer*)constBuffers->z(i))->zBuffer())
+			constBuffers->z(i)->copieren();
+		ID3D11Buffer* buf = ((DX11Buffer*)constBuffers->z(i))->zBuffer();
+		context->PSSetConstantBuffers(i, 1, &buf);
+	}
+	if (pixelShader)
+		context->PSSetShader(pixelShader, 0, 0);
 }
 
 
 // Inhalt der VertexShader Klasse
 
 // Konstruktor
-DX11VertexShader::DX11VertexShader( ID3D11Device* device, ID3D11DeviceContext* context )
-    : DX11Shader( device, context )
+DX11VertexShader::DX11VertexShader(ID3D11Device* device, ID3D11DeviceContext* context)
+	: DX11Shader(device, context)
 {
-    vertexShader = 0;
-    inputLayout = 0;
-    shaderByteBuffer = 0;
-    byteBufferSize = 0;
+	vertexShader = 0;
+	inputLayout = 0;
+	shaderByteBuffer = 0;
+	byteBufferSize = 0;
 }
 
 // Destruktor
 DX11VertexShader::~DX11VertexShader()
 {
-    if( vertexShader )
-        vertexShader->Release();
-    if( inputLayout )
-        inputLayout->Release();
+	if (vertexShader)
+		vertexShader->Release();
+	if (inputLayout)
+		inputLayout->Release();
 }
 
 // Setzt den Compilierten Shader
 //  bytes: Die Bytes des compilierten codes
 //  length: die Länge des bytearrays
 //  return: true, wenn bytes gültig ist, false sonst
-bool DX11VertexShader::setCompiledByteArray( unsigned char* bytes, int length )
+bool DX11VertexShader::setCompiledByteArray(unsigned char* bytes, int length)
 {
-    shaderByteBuffer = (unsigned char*)bytes;
-    byteBufferSize = length;
-    HRESULT result = device->CreateVertexShader( bytes, length, 0, &vertexShader );
-    return result == S_OK;
+	shaderByteBuffer = (unsigned char*)bytes;
+	byteBufferSize = length;
+	HRESULT result = device->CreateVertexShader(bytes, length, 0, &vertexShader);
+	return result == S_OK;
 }
 
 // erstellt ein InputLayout für den Shader
@@ -185,38 +197,38 @@ bool DX11VertexShader::setCompiledByteArray( unsigned char* bytes, int length )
 //  zD3d11Device: Das Device, mit dem das Layout erstellt werden soll
 //  descArray: Ein Array mit initialisierungsdaten
 //  anz: Die Anzahl der Elemente im Array
-bool DX11VertexShader::erstelleInputLayout( D3D11_INPUT_ELEMENT_DESC* descArray, int anz )
-{
-    if( !shaderByteBuffer )
-        return 0;
-    if( inputLayout )
-        inputLayout->Release();
-    inputLayout = 0;
-    HRESULT res = device->CreateInputLayout( descArray, anz, shaderByteBuffer, byteBufferSize, &inputLayout );
-    if( res == S_OK )
-    {
-        shaderByteBuffer = 0;
-        byteBufferSize = 0;
-    }
-    return res == S_OK;
+bool DX11VertexShader::erstelleInputLayout(D3D11_INPUT_ELEMENT_DESC* descArray, int anz)
+{
+	if (!shaderByteBuffer)
+		return 0;
+	if (inputLayout)
+		inputLayout->Release();
+	inputLayout = 0;
+	HRESULT res = device->CreateInputLayout(descArray, anz, shaderByteBuffer, byteBufferSize, &inputLayout);
+	if (res == S_OK)
+	{
+		shaderByteBuffer = 0;
+		byteBufferSize = 0;
+	}
+	return res == S_OK;
 }
 
 // Nach dem Aufruf dieser Funktion wird dieser Shader als Vertex Shader benutzt
 //  zD3d11Context: Das Context Objekt, mit dem der Shader verwendet werden soll
 void DX11VertexShader::benutzeShader()
 {
-    int maxI = constBuffers->getLastIndex();
-    for( int i = 0; i <= maxI; i++ )
-    {
-        if( !constBuffers->z( i ) )
-            continue;
-        if( !((DX11Buffer*)constBuffers->z( i ))->zBuffer() )
-            constBuffers->z( i )->copieren();
-        ID3D11Buffer* buf = ((DX11Buffer*)constBuffers->z( i ))->zBuffer();
-        context->VSSetConstantBuffers( i, 1, &buf );
-    }
-    if( inputLayout )
-        context->IASetInputLayout( inputLayout );
-    if( vertexShader )
-        context->VSSetShader( vertexShader, 0, 0 );
+	int maxI = constBuffers->getLastIndex();
+	for (int i = 0; i <= maxI; i++)
+	{
+		if (!constBuffers->z(i))
+			continue;
+		if (!((DX11Buffer*)constBuffers->z(i))->zBuffer())
+			constBuffers->z(i)->copieren();
+		ID3D11Buffer* buf = ((DX11Buffer*)constBuffers->z(i))->zBuffer();
+		context->VSSetConstantBuffers(i, 1, &buf);
+	}
+	if (inputLayout)
+		context->IASetInputLayout(inputLayout);
+	if (vertexShader)
+		context->VSSetShader(vertexShader, 0, 0);
 }

+ 117 - 115
Shader.h

@@ -13,128 +13,130 @@ struct ID3D11InputLayout;
 
 namespace Framework
 {
-    class Text;
-    class DXBuffer;
-    class DX12CopyCommandQueue;
-    class DX12DirectCommandQueue;
+	class Text;
+	class DXBuffer;
+	class DX12CopyCommandQueue;
+	class DX12DirectCommandQueue;
 
-    enum ShaderType
-    {
-        UNBEKANNT,
-        VERTEX,
-        PIXEL
-    };
+	enum ShaderType
+	{
+		UNBEKANNT,
+		VERTEX,
+		PIXEL
+	};
 
-    //! Eine Shader Klasse, die alle Constanten Buffers eines Shaders verwaltet
-    class Shader : public virtual ReferenceCounter
-    {
-    protected:
-        ShaderType type;
-        RCArray< DXBuffer >* constBuffers;
+	//! Eine Shader Klasse, die alle Constanten Buffers eines Shaders verwaltet
+	class Shader : public virtual ReferenceCounter
+	{
+	protected:
+		ShaderType type;
+		RCArray< DXBuffer >* constBuffers;
 
-    public:
-        //! Konstruktor
-        Shader();
-        //! Destruktor
-        virtual ~Shader();
-        //! Setzt den Compilierten Shader
-        //!  zD3d11Device: Das Device, mit welchem der Shader erstellt werden soll
-        //! \param bytes Die Bytes des compilierten codes
-        //! \param length die Länge des bytearrays
-        //! \return true, wenn bytes gültig ist, false sonst
-        virtual bool setCompiledByteArray( unsigned char* bytes, int length ) = 0;
-        //! Nach dem Aufruf dieser Funktion wird dieser Shader als Pixel Shader benutzt
-        //!  zD3d11Context: Das Context Objekt, mit dem der Shader verwendet werden soll
-        virtual void benutzeShader() = 0;
-        //! erstellt ein constanten Buffer, der constante daten an den Shader übergibt
-        //! es können maximal 14 Buffer erstellt werden
-        //!  zD3d11Device: Das Device, mit dem der Buffer erstellt werden soll
-        //! \param size Die größe des buffers in byte
-        //! \param index Die position des Buffers im Buffer Array. Bereits vorhanderner Buffer wird ersetzt. Buffer 1 kann nicht erstellt werden, wenn Buffer 0 noch nicht erstellt wurde usw.
-        virtual bool erstelleConstBuffer( int size, int index ) = 0;
-        //! Löscht einen constanten Buffer
-        //! \param index der Index des Buffers, der gelöscht werden soll. Buffer 0 kann nicht gelöscht werden, solange Buffer 1 noch existiert usw.
-        bool removeConstBuffer( int index );
-        //! Kopiert daten in einen constanten buffer
-        //!  zD3d11Context: Das Context Objekt, das zum kopieren verwendt werden soll
-        //! \param data Einen zeiger auf en byte Array der größe des Buffers
-        //! \param index Der Index des Buffers
-        //! \param len Die Länge der Daten in Bytes (-1 für die maximale größe des Buffers)
-        bool füllConstBuffer( char* data, int index, int len = -1 );
-        //! Gibt die Länge eines constanten Buffers zurück
-        //! \param index Der Index des Buffers
-        int getConstBufferLänge( int index ) const;
-        //! Gibt den Shadertyp zurück
-        ShaderType getType() const;
-    };
+	public:
+		//! Konstruktor
+		DLLEXPORT Shader();
+		//! Destruktor
+		DLLEXPORT virtual ~Shader();
+		//! Setzt den Compilierten Shader
+		//!  zD3d11Device: Das Device, mit welchem der Shader erstellt werden soll
+		//! \param bytes Die Bytes des compilierten codes
+		//! \param length die Länge des bytearrays
+		//! \return true, wenn bytes gültig ist, false sonst
+		virtual bool setCompiledByteArray(unsigned char* bytes, int length) = 0;
+		//! Nach dem Aufruf dieser Funktion wird dieser Shader als Pixel Shader benutzt
+		//!  zD3d11Context: Das Context Objekt, mit dem der Shader verwendet werden soll
+		virtual void benutzeShader() = 0;
+		//! erstellt ein constanten Buffer, der constante daten an den Shader übergibt
+		//! es können maximal 14 Buffer erstellt werden
+		//!  zD3d11Device: Das Device, mit dem der Buffer erstellt werden soll
+		//! \param size Die größe des buffers in byte
+		//! \param index Die position des Buffers im Buffer Array. Bereits vorhanderner Buffer wird ersetzt. Buffer 1 kann nicht erstellt werden, wenn Buffer 0 noch nicht erstellt wurde usw.
+		virtual bool erstelleConstBuffer(int size, int index) = 0;
+		//! Löscht einen constanten Buffer
+		//! \param index der Index des Buffers, der gelöscht werden soll. Buffer 0 kann nicht gelöscht werden, solange Buffer 1 noch existiert usw.
+		DLLEXPORT bool removeConstBuffer(int index);
+		//! Kopiert daten in einen constanten buffer
+		//!  zD3d11Context: Das Context Objekt, das zum kopieren verwendt werden soll
+		//! \param data Einen zeiger auf en byte Array der größe des Buffers
+		//! \param index Der Index des Buffers
+		//! \param len Die Länge der Daten in Bytes (-1 für die maximale größe des Buffers)
+		DLLEXPORT bool füllConstBuffer(char* data, int index, int len = -1);
+		//! Gibt die Länge eines constanten Buffers zurück
+		//! \param index Der Index des Buffers
+		DLLEXPORT int getConstBufferLänge(int index) const;
+		//! Gibt den Shadertyp zurück
+		DLLEXPORT ShaderType getType() const;
+		//! Gibt den index des ersten nicht initialisierten buffers zurück
+		DLLEXPORT int getFirstUninitializedBufferIndex() const;
+	};
 
-    class DX11Shader : public Shader
-    {
-    protected:
-        ID3D11Device* device;
-        ID3D11DeviceContext* context;
+	class DX11Shader : public Shader
+	{
+	protected:
+		ID3D11Device* device;
+		ID3D11DeviceContext* context;
 
-    public:
-        DX11Shader( ID3D11Device* device, ID3D11DeviceContext* context );
-        virtual ~DX11Shader();
-        //! erstellt ein constanten Buffer, der constante daten an den Shader übergibt
-        //! es können maximal 14 Buffer erstellt werden
-        //!  zD3d11Device: Das Device, mit dem der Buffer erstellt werden soll
-        //! \param size Die größe des buffers in byte
-        //! \param index Die position des Buffers im Buffer Array. Bereits vorhanderner Buffer wird ersetzt. Buffer 1 kann nicht erstellt werden, wenn Buffer 0 noch nicht erstellt wurde usw.
-        virtual bool erstelleConstBuffer( int size, int index ) override;
-    };
+	public:
+		DLLEXPORT DX11Shader(ID3D11Device* device, ID3D11DeviceContext* context);
+		DLLEXPORT virtual ~DX11Shader();
+		//! erstellt ein constanten Buffer, der constante daten an den Shader übergibt
+		//! es können maximal 14 Buffer erstellt werden
+		//!  zD3d11Device: Das Device, mit dem der Buffer erstellt werden soll
+		//! \param size Die größe des buffers in byte
+		//! \param index Die position des Buffers im Buffer Array. Bereits vorhanderner Buffer wird ersetzt. Buffer 1 kann nicht erstellt werden, wenn Buffer 0 noch nicht erstellt wurde usw.
+		DLLEXPORT virtual bool erstelleConstBuffer(int size, int index) override;
+	};
 
-    //! Verwaltet einen Pixel Shader
-    class DX11PixelShader : public DX11Shader
-    {
-    private:
-        ID3D11PixelShader* pixelShader;
+	//! Verwaltet einen Pixel Shader
+	class DX11PixelShader : public DX11Shader
+	{
+	private:
+		ID3D11PixelShader* pixelShader;
 
-    public:
-        //! Konstruktor
-        DX11PixelShader( ID3D11Device* device, ID3D11DeviceContext* context );
-        //! Destruktor
-        ~DX11PixelShader();
-        //! Setzt den Compilierten Shader
-        //!  zD3d11Device: Das Device, mit welchem der Shader erstellt werden soll
-        //! \param bytes Die Bytes des compilierten codes
-        //! \param length die Länge des bytearrays
-        //! \return true, wenn bytes gültig ist, false sonst
-        bool setCompiledByteArray( unsigned char* bytes, int length ) override;
-        //! Nach dem Aufruf dieser Funktion wird dieser Shader als Pixel Shader benutzt
-        //!  zD3d11Context: Das Context Objekt, mit dem der Shader verwendet werden soll
-        void benutzeShader() override;
-    };
+	public:
+		//! Konstruktor
+		DLLEXPORT DX11PixelShader(ID3D11Device* device, ID3D11DeviceContext* context);
+		//! Destruktor
+		DLLEXPORT ~DX11PixelShader();
+		//! Setzt den Compilierten Shader
+		//!  zD3d11Device: Das Device, mit welchem der Shader erstellt werden soll
+		//! \param bytes Die Bytes des compilierten codes
+		//! \param length die Länge des bytearrays
+		//! \return true, wenn bytes gültig ist, false sonst
+		DLLEXPORT bool setCompiledByteArray(unsigned char* bytes, int length) override;
+		//! Nach dem Aufruf dieser Funktion wird dieser Shader als Pixel Shader benutzt
+		//!  zD3d11Context: Das Context Objekt, mit dem der Shader verwendet werden soll
+		DLLEXPORT void benutzeShader() override;
+	};
 
-    //! Verwaltet einen Vertex Shader
-    class DX11VertexShader : public DX11Shader
-    {
-    private:
-        ID3D11VertexShader* vertexShader;
-        ID3D11InputLayout* inputLayout;
-        unsigned char* shaderByteBuffer;
-        int byteBufferSize;
+	//! Verwaltet einen Vertex Shader
+	class DX11VertexShader : public DX11Shader
+	{
+	private:
+		ID3D11VertexShader* vertexShader;
+		ID3D11InputLayout* inputLayout;
+		unsigned char* shaderByteBuffer;
+		int byteBufferSize;
 
-    public:
-        //! Konstruktor
-        DX11VertexShader( ID3D11Device* device, ID3D11DeviceContext* context );
-        //! Destruktor
-        ~DX11VertexShader();
-        //! Setzt den Compilierten Shader
-        //!  zD3d11Device: Das Device, mit welchem der Shader erstellt werden soll
-        //! \param bytes Die Bytes des compilierten codes
-        //! \param length die Länge des bytearrays
-        //! \return true, wenn bytes gültig ist, false sonst
-        bool setCompiledByteArray( unsigned char* bytes, int length ) override;
-        //! erstellt ein InputLayout für den Shader
-        //! Darf erst nach compile aufgerufen werden
-        //!  zD3d11Device: Das Device, mit dem das Layout erstellt werden soll
-        //! \param descArray Ein Array mit initialisierungsdaten
-        //! \param anz Die Anzahl der Elemente im Array
-        bool erstelleInputLayout( D3D11_INPUT_ELEMENT_DESC* descArray, int anz );
-        //! Nach dem Aufruf dieser Funktion wird dieser Shader als Vertex Shader benutzt
-        //!  zD3d11Context: Das Context Objekt, mit dem der Shader verwendet werden soll
-        void benutzeShader() override;
-    };
+	public:
+		//! Konstruktor
+		DLLEXPORT DX11VertexShader(ID3D11Device* device, ID3D11DeviceContext* context);
+		//! Destruktor
+		DLLEXPORT ~DX11VertexShader();
+		//! Setzt den Compilierten Shader
+		//!  zD3d11Device: Das Device, mit welchem der Shader erstellt werden soll
+		//! \param bytes Die Bytes des compilierten codes
+		//! \param length die Länge des bytearrays
+		//! \return true, wenn bytes gültig ist, false sonst
+		DLLEXPORT bool setCompiledByteArray(unsigned char* bytes, int length) override;
+		//! erstellt ein InputLayout für den Shader
+		//! Darf erst nach compile aufgerufen werden
+		//!  zD3d11Device: Das Device, mit dem das Layout erstellt werden soll
+		//! \param descArray Ein Array mit initialisierungsdaten
+		//! \param anz Die Anzahl der Elemente im Array
+		DLLEXPORT bool erstelleInputLayout(D3D11_INPUT_ELEMENT_DESC* descArray, int anz);
+		//! Nach dem Aufruf dieser Funktion wird dieser Shader als Vertex Shader benutzt
+		//!  zD3d11Context: Das Context Objekt, mit dem der Shader verwendet werden soll
+		DLLEXPORT void benutzeShader() override;
+	};
 }

+ 3296 - 255
UIVertexShader.h

@@ -38,6 +38,7 @@
 // TEXCOORD                 0   xy          1     NONE   float   xy  
 // NORMAL                   0   xyz         2     NONE   float   xyz 
 // KNOCHEN_ID               0   x           3     NONE    uint   x   
+// VERTEX_ID                0   x           4     NONE   float       
 //
 //
 // Output signature:
@@ -50,7 +51,7 @@
 // TEXCOORD                 1   xyz         3     NONE   float   xyz 
 //
 vs_5_0
-dcl_globalFlags refactoringAllowed
+dcl_globalFlags refactoringAllowed | skipOptimization
 dcl_constantbuffer CB0[512], dynamicIndexed
 dcl_constantbuffer CB1[8], immediateIndexed
 dcl_input v0.xyz
@@ -61,325 +62,377 @@ dcl_output o0.xyzw
 dcl_output_siv o1.xyzw, position
 dcl_output o2.xy
 dcl_output o3.xyz
-dcl_temps 3
-mov r0.xyz, v0.xyzx
-mov r0.w, l(1.000000)
-ishl r1.x, v3.x, l(2)
-dp4 r2.x, r0.xyzw, cb0[r1.x + 0].xyzw
-dp4 r2.y, r0.xyzw, cb0[r1.x + 1].xyzw
-dp4 r2.z, r0.xyzw, cb0[r1.x + 2].xyzw
-dp4 r2.w, r0.xyzw, cb0[r1.x + 3].xyzw
-mov o0.xyzw, r2.xyzw
-dp4 r0.x, r2.xyzw, cb1[0].xyzw
-dp4 r0.y, r2.xyzw, cb1[1].xyzw
-dp4 r0.z, r2.xyzw, cb1[2].xyzw
-dp4 r0.w, r2.xyzw, cb1[3].xyzw
-dp4 o1.x, r0.xyzw, cb1[4].xyzw
-dp4 o1.y, r0.xyzw, cb1[5].xyzw
-dp4 o1.z, r0.xyzw, cb1[6].xyzw
-dp4 o1.w, r0.xyzw, cb1[7].xyzw
-mov o2.xy, v1.xyxx
-dp3 r0.x, v2.xyzx, cb0[r1.x + 0].xyzx
-dp3 r0.y, v2.xyzx, cb0[r1.x + 1].xyzx
-dp3 r0.z, v2.xyzx, cb0[r1.x + 2].xyzx
-dp3 r0.w, r0.xyzx, r0.xyzx
-rsq r0.w, r0.w
-mul o3.xyz, r0.wwww, r0.xyzx
+dcl_temps 5
+//
+// Initial variable locations:
+//   v0.x <- input.position.x; v0.y <- input.position.y; v0.z <- input.position.z; v0.w <- input.position.w; 
+//   v1.x <- input.tex.x; v1.y <- input.tex.y; 
+//   v2.x <- input.normal.x; v2.y <- input.normal.y; v2.z <- input.normal.z; 
+//   v3.x <- input.knochen; 
+//   v4.x <- input.id; 
+//   o3.x <- <TextureVertexShader return value>.normal.x; o3.y <- <TextureVertexShader return value>.normal.y; o3.z <- <TextureVertexShader return value>.normal.z; 
+//   o2.x <- <TextureVertexShader return value>.tex.x; o2.y <- <TextureVertexShader return value>.tex.y; 
+//   o1.x <- <TextureVertexShader return value>.position.x; o1.y <- <TextureVertexShader return value>.position.y; o1.z <- <TextureVertexShader return value>.position.z; o1.w <- <TextureVertexShader return value>.position.w; 
+//   o0.x <- <TextureVertexShader return value>.worldPos.x; o0.y <- <TextureVertexShader return value>.worldPos.y; o0.z <- <TextureVertexShader return value>.worldPos.z; o0.w <- <TextureVertexShader return value>.worldPos.w
+//
+#line 43 "C:\Users\kolja\Desktop\Kolja-Strohm-Games\Allgemein\Framework\DX11VertexShader.hlsl"
+imul null, r0.x, v3.x, l(4)
+dp3 r1.x, v2.xyzx, cb0[r0.x + 0].xyzx
+dp3 r1.y, v2.xyzx, cb0[r0.x + 1].xyzx
+dp3 r1.z, v2.xyzx, cb0[r0.x + 2].xyzx
+dp3 r0.x, r1.xyzx, r1.xyzx
+rsq r0.x, r0.x
+mul r0.xyz, r0.xxxx, r1.xyzx  // r0.x <- output.normal.x; r0.y <- output.normal.y; r0.z <- output.normal.z
+
+#line 46
+mov r1.w, l(1.000000)  // r1.w <- input.position.w
+
+#line 49
+mov r2.xy, v1.xyxx  // r2.x <- output.tex.x; r2.y <- output.tex.y
+
+#line 52
+imul null, r0.w, v3.x, l(4)
+mov r1.xyz, v0.xyzx
+dp4 r3.x, r1.xyzw, cb0[r0.w + 0].xyzw  // r3.x <- output.worldPos.x
+dp4 r3.y, r1.xyzw, cb0[r0.w + 1].xyzw  // r3.y <- output.worldPos.y
+dp4 r3.z, r1.xyzw, cb0[r0.w + 2].xyzw  // r3.z <- output.worldPos.z
+dp4 r3.w, r1.xyzw, cb0[r0.w + 3].xyzw  // r3.w <- output.worldPos.w
+
+#line 53
+dp4 r1.x, r3.xyzw, cb1[0].xyzw  // r1.x <- output.position.x
+dp4 r1.y, r3.xyzw, cb1[1].xyzw  // r1.y <- output.position.y
+dp4 r1.z, r3.xyzw, cb1[2].xyzw  // r1.z <- output.position.z
+dp4 r1.w, r3.xyzw, cb1[3].xyzw  // r1.w <- output.position.w
+
+#line 54
+dp4 r4.x, r1.xyzw, cb1[4].xyzw  // r4.x <- output.position.x
+dp4 r4.y, r1.xyzw, cb1[5].xyzw  // r4.y <- output.position.y
+dp4 r4.z, r1.xyzw, cb1[6].xyzw  // r4.z <- output.position.z
+dp4 r4.w, r1.xyzw, cb1[7].xyzw  // r4.w <- output.position.w
+
+#line 56
+mov o0.xyzw, r3.xyzw
+mov o1.xyzw, r4.xyzw
+mov o3.xyz, r0.xyzx
+mov o2.xy, r2.xyxx
 ret 
-// Approximately 24 instruction slots used
+// Approximately 28 instruction slots used
 #endif
 
 const BYTE UIVertexShader[] =
 {
-     68,  88,  66,  67,  32, 205, 
-     91, 125,  70,  56, 194, 166, 
-    120,   6,  24, 104,   5, 136, 
-     94, 169,   1,   0,   0,   0, 
-     60,   7,   0,   0,   5,   0, 
-      0,   0,  52,   0,   0,   0, 
-     16,   2,   0,   0, 164,   2, 
-      0,   0,  52,   3,   0,   0, 
-    160,   6,   0,   0,  82,  68, 
-     69,  70, 212,   1,   0,   0, 
-      2,   0,   0,   0, 144,   0, 
-      0,   0,   2,   0,   0,   0, 
-     60,   0,   0,   0,   0,   5, 
-    254, 255,   0,   1,   0,   0, 
-    171,   1,   0,   0,  82,  68, 
-     49,  49,  60,   0,   0,   0, 
-     24,   0,   0,   0,  32,   0, 
-      0,   0,  40,   0,   0,   0, 
-     36,   0,   0,   0,  12,   0, 
-      0,   0,   0,   0,   0,   0, 
-    124,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
+     68,  88,  66,  67, 191, 147, 
+    153, 193,  42, 181,  58, 113, 
+    254, 145, 239,  15,  38, 200, 
+     31,  92,   1,   0,   0,   0, 
+    204,  77,   0,   0,   6,   0, 
+      0,   0,  56,   0,   0,   0, 
+     20,   2,   0,   0, 204,   2, 
+      0,   0,  92,   3,   0,   0, 
+     40,   7,   0,   0, 196,   7, 
+      0,   0,  82,  68,  69,  70, 
+    212,   1,   0,   0,   2,   0, 
+      0,   0, 144,   0,   0,   0, 
+      2,   0,   0,   0,  60,   0, 
+      0,   0,   0,   5, 254, 255, 
+      5,   1,   0,   0, 171,   1, 
+      0,   0,  82,  68,  49,  49, 
+     60,   0,   0,   0,  24,   0, 
+      0,   0,  32,   0,   0,   0, 
+     40,   0,   0,   0,  36,   0, 
+      0,   0,  12,   0,   0,   0, 
+      0,   0,   0,   0, 124,   0, 
       0,   0,   0,   0,   0,   0, 
       0,   0,   0,   0,   0,   0, 
-      1,   0,   0,   0,   1,   0, 
-      0,   0, 137,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
       0,   0,   0,   0,   0,   0, 
       0,   0,   0,   0,   1,   0, 
       0,   0,   1,   0,   0,   0, 
-      1,   0,   0,   0,  77,  97, 
-    116, 114, 105, 120,  66, 117, 
-    102, 102, 101, 114,   0,  75, 
-     97, 109, 101, 114,  97,   0, 
-    124,   0,   0,   0,   1,   0, 
-      0,   0, 192,   0,   0,   0, 
-      0,  32,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-    137,   0,   0,   0,   2,   0, 
-      0,   0,  36,   1,   0,   0, 
-    128,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-    232,   0,   0,   0,   0,   0, 
-      0,   0,   0,  32,   0,   0, 
-      2,   0,   0,   0,   0,   1, 
+    137,   0,   0,   0,   0,   0, 
       0,   0,   0,   0,   0,   0, 
-    255, 255, 255, 255,   0,   0, 
-      0,   0, 255, 255, 255, 255, 
-      0,   0,   0,   0, 107, 110, 
-    111,  99, 104, 101, 110,  77, 
-     97, 116, 114, 105, 120,   0, 
-    102, 108, 111,  97, 116,  52, 
-    120,  52,   0, 171,   3,   0, 
-      3,   0,   4,   0,   4,   0, 
-    128,   0,   0,   0,   0,   0, 
       0,   0,   0,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+      1,   0,   0,   0,   1,   0, 
+      0,   0,  77,  97, 116, 114, 
+    105, 120,  66, 117, 102, 102, 
+    101, 114,   0,  75,  97, 109, 
+    101, 114,  97,   0, 124,   0, 
+      0,   0,   1,   0,   0,   0, 
+    192,   0,   0,   0,   0,  32, 
       0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0, 137,   0, 
+      0,   0,   2,   0,   0,   0, 
+     36,   1,   0,   0, 128,   0, 
       0,   0,   0,   0,   0,   0, 
-    246,   0,   0,   0, 116,   1, 
+      0,   0,   0,   0, 232,   0, 
       0,   0,   0,   0,   0,   0, 
-     64,   0,   0,   0,   2,   0, 
-      0,   0, 124,   1,   0,   0, 
+      0,  32,   0,   0,   2,   0, 
+      0,   0,   0,   1,   0,   0, 
       0,   0,   0,   0, 255, 255, 
     255, 255,   0,   0,   0,   0, 
     255, 255, 255, 255,   0,   0, 
-      0,   0, 160,   1,   0,   0, 
-     64,   0,   0,   0,  64,   0, 
+      0,   0, 107, 110, 111,  99, 
+    104, 101, 110,  77,  97, 116, 
+    114, 105, 120,   0, 102, 108, 
+    111,  97, 116,  52, 120,  52, 
+      0, 171,   3,   0,   3,   0, 
+      4,   0,   4,   0, 128,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0, 246,   0, 
+      0,   0, 116,   1,   0,   0, 
+      0,   0,   0,   0,  64,   0, 
       0,   0,   2,   0,   0,   0, 
     124,   1,   0,   0,   0,   0, 
       0,   0, 255, 255, 255, 255, 
       0,   0,   0,   0, 255, 255, 
     255, 255,   0,   0,   0,   0, 
-    118, 105, 101, 119,   0, 171, 
-    171, 171,   3,   0,   3,   0, 
-      4,   0,   4,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0, 246,   0, 
-      0,   0, 112, 114, 111, 106, 
-    101,  99, 116, 105, 111, 110, 
-      0,  77, 105,  99, 114, 111, 
-    115, 111, 102, 116,  32,  40, 
-     82,  41,  32,  72,  76,  83, 
-     76,  32,  83, 104,  97, 100, 
-    101, 114,  32,  67, 111, 109, 
-    112, 105, 108, 101, 114,  32, 
-     49,  48,  46,  49,   0, 171, 
-     73,  83,  71,  78, 140,   0, 
-      0,   0,   4,   0,   0,   0, 
-      8,   0,   0,   0, 104,   0, 
+    160,   1,   0,   0,  64,   0, 
+      0,   0,  64,   0,   0,   0, 
+      2,   0,   0,   0, 124,   1, 
       0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   3,   0, 
+    255, 255, 255, 255,   0,   0, 
+      0,   0, 255, 255, 255, 255, 
+      0,   0,   0,   0, 118, 105, 
+    101, 119,   0, 171, 171, 171, 
+      3,   0,   3,   0,   4,   0, 
+      4,   0,   0,   0,   0,   0, 
       0,   0,   0,   0,   0,   0, 
-     15,   7,   0,   0, 113,   0, 
       0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   3,   0, 
-      0,   0,   1,   0,   0,   0, 
-      3,   3,   0,   0, 122,   0, 
       0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   3,   0, 
-      0,   0,   2,   0,   0,   0, 
-      7,   7,   0,   0, 129,   0, 
+      0,   0, 246,   0,   0,   0, 
+    112, 114, 111, 106, 101,  99, 
+    116, 105, 111, 110,   0,  77, 
+    105,  99, 114, 111, 115, 111, 
+    102, 116,  32,  40,  82,  41, 
+     32,  72,  76,  83,  76,  32, 
+     83, 104,  97, 100, 101, 114, 
+     32,  67, 111, 109, 112, 105, 
+    108, 101, 114,  32,  49,  48, 
+     46,  49,   0, 171,  73,  83, 
+     71,  78, 176,   0,   0,   0, 
+      5,   0,   0,   0,   8,   0, 
+      0,   0, 128,   0,   0,   0, 
       0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   1,   0, 
       0,   0,   3,   0,   0,   0, 
-      1,   1,   0,   0,  80,  79, 
-     83,  73,  84,  73,  79,  78, 
-      0,  84,  69,  88,  67,  79, 
-     79,  82,  68,   0,  78,  79, 
-     82,  77,  65,  76,   0,  75, 
-     78,  79,  67,  72,  69,  78, 
-     95,  73,  68,   0,  79,  83, 
-     71,  78, 136,   0,   0,   0, 
-      4,   0,   0,   0,   8,   0, 
-      0,   0, 104,   0,   0,   0, 
+      0,   0,   0,   0,  15,   7, 
+      0,   0, 137,   0,   0,   0, 
       0,   0,   0,   0,   0,   0, 
       0,   0,   3,   0,   0,   0, 
-      0,   0,   0,   0,  15,   0, 
-      0,   0, 113,   0,   0,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,   3,   0,   0,   0, 
-      1,   0,   0,   0,  15,   0, 
-      0,   0, 125,   0,   0,   0, 
+      1,   0,   0,   0,   3,   3, 
+      0,   0, 146,   0,   0,   0, 
       0,   0,   0,   0,   0,   0, 
       0,   0,   3,   0,   0,   0, 
-      2,   0,   0,   0,   3,  12, 
-      0,   0, 125,   0,   0,   0, 
-      1,   0,   0,   0,   0,   0, 
+      2,   0,   0,   0,   7,   7, 
+      0,   0, 153,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+      3,   0,   0,   0,   1,   1, 
+      0,   0, 164,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
       0,   0,   3,   0,   0,   0, 
-      3,   0,   0,   0,   7,   8, 
+      4,   0,   0,   0,   1,   0, 
       0,   0,  80,  79,  83,  73, 
-     84,  73,  79,  78,   0,  83, 
-     86,  95,  80,  79,  83,  73, 
      84,  73,  79,  78,   0,  84, 
      69,  88,  67,  79,  79,  82, 
-     68,   0, 171, 171,  83,  72, 
-     69,  88, 100,   3,   0,   0, 
-     80,   0,   1,   0, 217,   0, 
-      0,   0, 106,   8,   0,   1, 
-     89,   8,   0,   4,  70, 142, 
-     32,   0,   0,   0,   0,   0, 
-      0,   2,   0,   0,  89,   0, 
-      0,   4,  70, 142,  32,   0, 
-      1,   0,   0,   0,   8,   0, 
-      0,   0,  95,   0,   0,   3, 
-    114,  16,  16,   0,   0,   0, 
-      0,   0,  95,   0,   0,   3, 
-     50,  16,  16,   0,   1,   0, 
-      0,   0,  95,   0,   0,   3, 
-    114,  16,  16,   0,   2,   0, 
-      0,   0,  95,   0,   0,   3, 
-     18,  16,  16,   0,   3,   0, 
-      0,   0, 101,   0,   0,   3, 
-    242,  32,  16,   0,   0,   0, 
-      0,   0, 103,   0,   0,   4, 
-    242,  32,  16,   0,   1,   0, 
+     68,   0,  78,  79,  82,  77, 
+     65,  76,   0,  75,  78,  79, 
+     67,  72,  69,  78,  95,  73, 
+     68,   0,  86,  69,  82,  84, 
+     69,  88,  95,  73,  68,   0, 
+    171, 171,  79,  83,  71,  78, 
+    136,   0,   0,   0,   4,   0, 
+      0,   0,   8,   0,   0,   0, 
+    104,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      3,   0,   0,   0,   0,   0, 
+      0,   0,  15,   0,   0,   0, 
+    113,   0,   0,   0,   0,   0, 
       0,   0,   1,   0,   0,   0, 
-    101,   0,   0,   3,  50,  32, 
+      3,   0,   0,   0,   1,   0, 
+      0,   0,  15,   0,   0,   0, 
+    125,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      3,   0,   0,   0,   2,   0, 
+      0,   0,   3,  12,   0,   0, 
+    125,   0,   0,   0,   1,   0, 
+      0,   0,   0,   0,   0,   0, 
+      3,   0,   0,   0,   3,   0, 
+      0,   0,   7,   8,   0,   0, 
+     80,  79,  83,  73,  84,  73, 
+     79,  78,   0,  83,  86,  95, 
+     80,  79,  83,  73,  84,  73, 
+     79,  78,   0,  84,  69,  88, 
+     67,  79,  79,  82,  68,   0, 
+    171, 171,  83,  72,  69,  88, 
+    196,   3,   0,   0,  80,   0, 
+      1,   0, 241,   0,   0,   0, 
+    106, 136,   0,   1,  89,   8, 
+      0,   4,  70, 142,  32,   0, 
+      0,   0,   0,   0,   0,   2, 
+      0,   0,  89,   0,   0,   4, 
+     70, 142,  32,   0,   1,   0, 
+      0,   0,   8,   0,   0,   0, 
+     95,   0,   0,   3, 114,  16, 
+     16,   0,   0,   0,   0,   0, 
+     95,   0,   0,   3,  50,  16, 
+     16,   0,   1,   0,   0,   0, 
+     95,   0,   0,   3, 114,  16, 
      16,   0,   2,   0,   0,   0, 
-    101,   0,   0,   3, 114,  32, 
+     95,   0,   0,   3,  18,  16, 
      16,   0,   3,   0,   0,   0, 
-    104,   0,   0,   2,   3,   0, 
-      0,   0,  54,   0,   0,   5, 
-    114,   0,  16,   0,   0,   0, 
+    101,   0,   0,   3, 242,  32, 
+     16,   0,   0,   0,   0,   0, 
+    103,   0,   0,   4, 242,  32, 
+     16,   0,   1,   0,   0,   0, 
+      1,   0,   0,   0, 101,   0, 
+      0,   3,  50,  32,  16,   0, 
+      2,   0,   0,   0, 101,   0, 
+      0,   3, 114,  32,  16,   0, 
+      3,   0,   0,   0, 104,   0, 
+      0,   2,   5,   0,   0,   0, 
+     38,   0,   0,   8,   0, 208, 
+      0,   0,  18,   0,  16,   0, 
+      0,   0,   0,   0,  10,  16, 
+     16,   0,   3,   0,   0,   0, 
+      1,  64,   0,   0,   4,   0, 
+      0,   0,  16,   0,   0,   9, 
+     18,   0,  16,   0,   1,   0, 
       0,   0,  70,  18,  16,   0, 
-      0,   0,   0,   0,  54,   0, 
-      0,   5, 130,   0,  16,   0, 
-      0,   0,   0,   0,   1,  64, 
-      0,   0,   0,   0, 128,  63, 
-     41,   0,   0,   7,  18,   0, 
+      2,   0,   0,   0,  70, 130, 
+     32,   4,   0,   0,   0,   0, 
+     10,   0,  16,   0,   0,   0, 
+      0,   0,  16,   0,   0,  10, 
+     34,   0,  16,   0,   1,   0, 
+      0,   0,  70,  18,  16,   0, 
+      2,   0,   0,   0,  70, 130, 
+     32,   6,   0,   0,   0,   0, 
+      1,   0,   0,   0,  10,   0, 
+     16,   0,   0,   0,   0,   0, 
+     16,   0,   0,  10,  66,   0, 
+     16,   0,   1,   0,   0,   0, 
+     70,  18,  16,   0,   2,   0, 
+      0,   0,  70, 130,  32,   6, 
+      0,   0,   0,   0,   2,   0, 
+      0,   0,  10,   0,  16,   0, 
+      0,   0,   0,   0,  16,   0, 
+      0,   7,  18,   0,  16,   0, 
+      0,   0,   0,   0,  70,   2, 
      16,   0,   1,   0,   0,   0, 
-     10,  16,  16,   0,   3,   0, 
+     70,   2,  16,   0,   1,   0, 
+      0,   0,  68,   0,   0,   5, 
+     18,   0,  16,   0,   0,   0, 
+      0,   0,  10,   0,  16,   0, 
+      0,   0,   0,   0,  56,   0, 
+      0,   7, 114,   0,  16,   0, 
+      0,   0,   0,   0,   6,   0, 
+     16,   0,   0,   0,   0,   0, 
+     70,   2,  16,   0,   1,   0, 
+      0,   0,  54,   0,   0,   5, 
+    130,   0,  16,   0,   1,   0, 
       0,   0,   1,  64,   0,   0, 
-      2,   0,   0,   0,  17,   0, 
+      0,   0, 128,  63,  54,   0, 
+      0,   5,  50,   0,  16,   0, 
+      2,   0,   0,   0,  70,  16, 
+     16,   0,   1,   0,   0,   0, 
+     38,   0,   0,   8,   0, 208, 
+      0,   0, 130,   0,  16,   0, 
+      0,   0,   0,   0,  10,  16, 
+     16,   0,   3,   0,   0,   0, 
+      1,  64,   0,   0,   4,   0, 
+      0,   0,  54,   0,   0,   5, 
+    114,   0,  16,   0,   1,   0, 
+      0,   0,  70,  18,  16,   0, 
+      0,   0,   0,   0,  17,   0, 
       0,   9,  18,   0,  16,   0, 
-      2,   0,   0,   0,  70,  14, 
-     16,   0,   0,   0,   0,   0, 
+      3,   0,   0,   0,  70,  14, 
+     16,   0,   1,   0,   0,   0, 
      70, 142,  32,   4,   0,   0, 
-      0,   0,  10,   0,  16,   0, 
-      1,   0,   0,   0,  17,   0, 
+      0,   0,  58,   0,  16,   0, 
+      0,   0,   0,   0,  17,   0, 
       0,  10,  34,   0,  16,   0, 
-      2,   0,   0,   0,  70,  14, 
-     16,   0,   0,   0,   0,   0, 
+      3,   0,   0,   0,  70,  14, 
+     16,   0,   1,   0,   0,   0, 
      70, 142,  32,   6,   0,   0, 
       0,   0,   1,   0,   0,   0, 
-     10,   0,  16,   0,   1,   0, 
+     58,   0,  16,   0,   0,   0, 
       0,   0,  17,   0,   0,  10, 
-     66,   0,  16,   0,   2,   0, 
+     66,   0,  16,   0,   3,   0, 
       0,   0,  70,  14,  16,   0, 
-      0,   0,   0,   0,  70, 142, 
+      1,   0,   0,   0,  70, 142, 
      32,   6,   0,   0,   0,   0, 
-      2,   0,   0,   0,  10,   0, 
-     16,   0,   1,   0,   0,   0, 
+      2,   0,   0,   0,  58,   0, 
+     16,   0,   0,   0,   0,   0, 
      17,   0,   0,  10, 130,   0, 
-     16,   0,   2,   0,   0,   0, 
-     70,  14,  16,   0,   0,   0, 
+     16,   0,   3,   0,   0,   0, 
+     70,  14,  16,   0,   1,   0, 
       0,   0,  70, 142,  32,   6, 
       0,   0,   0,   0,   3,   0, 
-      0,   0,  10,   0,  16,   0, 
-      1,   0,   0,   0,  54,   0, 
-      0,   5, 242,  32,  16,   0, 
-      0,   0,   0,   0,  70,  14, 
-     16,   0,   2,   0,   0,   0, 
-     17,   0,   0,   8,  18,   0, 
-     16,   0,   0,   0,   0,   0, 
-     70,  14,  16,   0,   2,   0, 
-      0,   0,  70, 142,  32,   0, 
-      1,   0,   0,   0,   0,   0, 
-      0,   0,  17,   0,   0,   8, 
-     34,   0,  16,   0,   0,   0, 
-      0,   0,  70,  14,  16,   0, 
-      2,   0,   0,   0,  70, 142, 
-     32,   0,   1,   0,   0,   0, 
-      1,   0,   0,   0,  17,   0, 
-      0,   8,  66,   0,  16,   0, 
-      0,   0,   0,   0,  70,  14, 
-     16,   0,   2,   0,   0,   0, 
+      0,   0,  58,   0,  16,   0, 
+      0,   0,   0,   0,  17,   0, 
+      0,   8,  18,   0,  16,   0, 
+      1,   0,   0,   0,  70,  14, 
+     16,   0,   3,   0,   0,   0, 
      70, 142,  32,   0,   1,   0, 
-      0,   0,   2,   0,   0,   0, 
-     17,   0,   0,   8, 130,   0, 
-     16,   0,   0,   0,   0,   0, 
-     70,  14,  16,   0,   2,   0, 
+      0,   0,   0,   0,   0,   0, 
+     17,   0,   0,   8,  34,   0, 
+     16,   0,   1,   0,   0,   0, 
+     70,  14,  16,   0,   3,   0, 
       0,   0,  70, 142,  32,   0, 
-      1,   0,   0,   0,   3,   0, 
+      1,   0,   0,   0,   1,   0, 
       0,   0,  17,   0,   0,   8, 
-     18,  32,  16,   0,   1,   0, 
+     66,   0,  16,   0,   1,   0, 
       0,   0,  70,  14,  16,   0, 
-      0,   0,   0,   0,  70, 142, 
+      3,   0,   0,   0,  70, 142, 
      32,   0,   1,   0,   0,   0, 
-      4,   0,   0,   0,  17,   0, 
-      0,   8,  34,  32,  16,   0, 
+      2,   0,   0,   0,  17,   0, 
+      0,   8, 130,   0,  16,   0, 
       1,   0,   0,   0,  70,  14, 
-     16,   0,   0,   0,   0,   0, 
+     16,   0,   3,   0,   0,   0, 
      70, 142,  32,   0,   1,   0, 
-      0,   0,   5,   0,   0,   0, 
-     17,   0,   0,   8,  66,  32, 
-     16,   0,   1,   0,   0,   0, 
-     70,  14,  16,   0,   0,   0, 
+      0,   0,   3,   0,   0,   0, 
+     17,   0,   0,   8,  18,   0, 
+     16,   0,   4,   0,   0,   0, 
+     70,  14,  16,   0,   1,   0, 
       0,   0,  70, 142,  32,   0, 
-      1,   0,   0,   0,   6,   0, 
+      1,   0,   0,   0,   4,   0, 
       0,   0,  17,   0,   0,   8, 
-    130,  32,  16,   0,   1,   0, 
+     34,   0,  16,   0,   4,   0, 
       0,   0,  70,  14,  16,   0, 
-      0,   0,   0,   0,  70, 142, 
+      1,   0,   0,   0,  70, 142, 
      32,   0,   1,   0,   0,   0, 
-      7,   0,   0,   0,  54,   0, 
-      0,   5,  50,  32,  16,   0, 
-      2,   0,   0,   0,  70,  16, 
-     16,   0,   1,   0,   0,   0, 
-     16,   0,   0,   9,  18,   0, 
-     16,   0,   0,   0,   0,   0, 
-     70,  18,  16,   0,   2,   0, 
-      0,   0,  70, 130,  32,   4, 
-      0,   0,   0,   0,  10,   0, 
+      5,   0,   0,   0,  17,   0, 
+      0,   8,  66,   0,  16,   0, 
+      4,   0,   0,   0,  70,  14, 
      16,   0,   1,   0,   0,   0, 
-     16,   0,   0,  10,  34,   0, 
-     16,   0,   0,   0,   0,   0, 
-     70,  18,  16,   0,   2,   0, 
-      0,   0,  70, 130,  32,   6, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,  10,   0,  16,   0, 
-      1,   0,   0,   0,  16,   0, 
-      0,  10,  66,   0,  16,   0, 
-      0,   0,   0,   0,  70,  18, 
-     16,   0,   2,   0,   0,   0, 
-     70, 130,  32,   6,   0,   0, 
-      0,   0,   2,   0,   0,   0, 
-     10,   0,  16,   0,   1,   0, 
-      0,   0,  16,   0,   0,   7, 
-    130,   0,  16,   0,   0,   0, 
-      0,   0,  70,   2,  16,   0, 
-      0,   0,   0,   0,  70,   2, 
-     16,   0,   0,   0,   0,   0, 
-     68,   0,   0,   5, 130,   0, 
-     16,   0,   0,   0,   0,   0, 
-     58,   0,  16,   0,   0,   0, 
-      0,   0,  56,   0,   0,   7, 
-    114,  32,  16,   0,   3,   0, 
-      0,   0, 246,  15,  16,   0, 
-      0,   0,   0,   0,  70,   2, 
-     16,   0,   0,   0,   0,   0, 
-     62,   0,   0,   1,  83,  84, 
-     65,  84, 148,   0,   0,   0, 
-     24,   0,   0,   0,   3,   0, 
-      0,   0,   0,   0,   0,   0, 
-      8,   0,   0,   0,  18,   0, 
+     70, 142,  32,   0,   1,   0, 
+      0,   0,   6,   0,   0,   0, 
+     17,   0,   0,   8, 130,   0, 
+     16,   0,   4,   0,   0,   0, 
+     70,  14,  16,   0,   1,   0, 
+      0,   0,  70, 142,  32,   0, 
+      1,   0,   0,   0,   7,   0, 
+      0,   0,  54,   0,   0,   5, 
+    242,  32,  16,   0,   0,   0, 
+      0,   0,  70,  14,  16,   0, 
+      3,   0,   0,   0,  54,   0, 
+      0,   5, 242,  32,  16,   0, 
+      1,   0,   0,   0,  70,  14, 
+     16,   0,   4,   0,   0,   0, 
+     54,   0,   0,   5, 114,  32, 
+     16,   0,   3,   0,   0,   0, 
+     70,   2,  16,   0,   0,   0, 
+      0,   0,  54,   0,   0,   5, 
+     50,  32,  16,   0,   2,   0, 
+      0,   0,  70,   0,  16,   0, 
+      2,   0,   0,   0,  62,   0, 
+      0,   1,  83,  84,  65,  84, 
+    148,   0,   0,   0,  28,   0, 
+      0,   0,   5,   0,   0,   0, 
+      0,   0,   0,   0,   8,   0, 
+      0,   0,  18,   0,   0,   0, 
+      2,   0,   0,   0,   0,   0, 
       0,   0,   1,   0,   0,   0, 
-      0,   0,   0,   0,   1,   0, 
       0,   0,   0,   0,   0,   0, 
       0,   0,   0,   0,   0,   0, 
       0,   0,   0,   0,   0,   0, 
@@ -387,7 +440,2995 @@ const BYTE UIVertexShader[] =
       0,   0,   0,   0,   0,   0, 
       0,   0,   0,   0,   0,   0, 
       0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   4,   0, 
+      0,   0,   7,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,  83,  80,  68,  66, 
+      0,  70,   0,   0,  77, 105, 
+     99, 114, 111, 115, 111, 102, 
+    116,  32,  67,  47,  67,  43, 
+     43,  32,  77,  83,  70,  32, 
+     55,  46,  48,  48,  13,  10, 
+     26,  68,  83,   0,   0,   0, 
+      0,   2,   0,   0,   2,   0, 
+      0,   0,  35,   0,   0,   0, 
+    172,   0,   0,   0,   0,   0, 
+      0,   0,  32,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+    192, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255,  56,   0,   0,   0, 
+    254, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255, 255, 255, 255,   5,   0, 
+      0,   0,  32,   0,   0,   0, 
+     60,   0,   0,   0,   0,   0, 
+      0,   0, 255, 255, 255, 255, 
+      0,   0,   0,   0,   6,   0, 
+      0,   0,   5,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      3,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0, 148,  46,  49,   1, 
+     16, 136, 134,  98,   1,   0, 
+      0,   0, 100, 237, 204,  20, 
+     18, 103,  42,  79, 183,  95, 
+     33,  23,  64, 184, 115,   3, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+      1,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0, 220,  81, 
+     51,   1,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,  83,  32, 
+     47,  47,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  13,  10, 
+     47,  47,  47,  47,  47,  47, 
+     47,  47,  47,  47,  47,  47, 
+     47,  47,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  13,  10, 
+    115, 116, 114, 117,  99, 116, 
+     32,  86, 101, 114, 116, 101, 
+    120,  73, 110, 112, 117, 116, 
+     84, 121, 112, 101,  13,  10, 
+    123,  13,  10,   9, 102, 108, 
+    111,  97, 116,  52,  32, 112, 
+    111, 115, 105, 116, 105, 111, 
+    110,  32,  58,  32,  80,  79, 
+     83,  73,  84,  73,  79,  78, 
+     59,  13,  10,   9, 102, 108, 
+    111,  97, 116,  50,  32, 116, 
+    101, 120,  32,  58,  32,  84, 
+     69,  88,  67,  79,  79,  82, 
+     68,  48,  59,  13,  10,   9, 
+    102, 108, 111,  97, 116,  51, 
+     32, 110, 111, 114, 109,  97, 
+    108,  32,  58,  32,  78,  79, 
+     82,  77,  65,  76,  59,  13, 
+     10,   9, 117, 105, 110, 116, 
+     32, 107, 110, 111,  99, 104, 
+    101, 110,  32,  58,  32,  75, 
+     78,  79,  67,  72,  69,  78, 
+     95,  73,  68,  48,  59,  13, 
+     10,   9, 104,  97, 108, 102, 
+     32, 105, 100,  32,  58,  32, 
+     86,  69,  82,  84,  69,  88, 
+     95,  73,  68,  59,  13,  10, 
+    125,  59,  13,  10,  13,  10, 
+    115, 116, 114, 117,  99, 116, 
+     32,  80, 105, 120, 101, 108, 
+     73, 110, 112, 117, 116,  84, 
+    121, 112, 101,  13,  10, 123, 
+     13,  10,   9, 102, 108, 111, 
+     97, 116,  52,  32, 119, 111, 
+    114, 108, 100,  80, 111, 115, 
+     32,  58,  32,  80,  79,  83, 
+     73,  84,  73,  79,  78,  59, 
+     13,  10,   9, 102, 108, 111, 
+     97, 116,  52,  32, 112, 111, 
+    115, 105, 116, 105, 111, 110, 
+     32,  58,  32,  83,  86,  95, 
+     80,  79,  83,  73,  84,  73, 
+     79,  78,  59,  13,  10,   9, 
+    102, 108, 111,  97, 116,  50, 
+     32, 116, 101, 120,  32,  58, 
+     32,  84,  69,  88,  67,  79, 
+     79,  82,  68,  48,  59,  13, 
+     10,   9, 102, 108, 111,  97, 
+    116,  51,  32, 110, 111, 114, 
+    109,  97, 108,  32,  58,  32, 
+     84,  69,  88,  67,  79,  79, 
+     82,  68,  49,  59,  13,  10, 
+    125,  59,  13,  10,  13,  10, 
+     47,  47,  47,  47,  47,  47, 
+     47,  47,  47,  47,  47,  47, 
+     47,  47,  47,  47,  47,  47, 
+     47,  47,  47,  47,  47,  47, 
+    198,  90,   0,   0, 117, 131, 
+      1,   0,  76, 232,   3,   0, 
+     75, 158,   0,   0, 146, 183, 
+      2,   0,  28,  19,   2,   0, 
+    242,  56,   1,   0,  43, 236, 
+      3,   0, 217,  42,   2,   0, 
+     38, 107,   0,   0, 103, 159, 
+      1,   0,  73,  20,   1,   0, 
+     19,  54,   2,   0,  65, 185, 
+      2,   0, 153, 189,   3,   0, 
+      0,  16,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,  47,  47,  47,  47, 
+     47,  47,  47,  47,  47,  47, 
+     47,  47,  47,  13,  10,  47, 
+     47,  32,  71,  76,  79,  66, 
+     65,  76,  83,  32,  47,  47, 
+     13,  10,  47,  47,  47,  47, 
+     47,  47,  47,  47,  47,  47, 
+     47,  47,  47,  13,  10,  99, 
+     98, 117, 102, 102, 101, 114, 
+     32,  77,  97, 116, 114, 105, 
+    120,  66, 117, 102, 102, 101, 
+    114,  32,  58,  32, 114, 101, 
+    103, 105, 115, 116, 101, 114, 
+     40,  98,  48,  41,  13,  10, 
+    123,  13,  10,   9, 109,  97, 
+    116, 114, 105, 120,  32, 107, 
+    110, 111,  99, 104, 101, 110, 
+     77,  97, 116, 114, 105, 120, 
+     91,  49,  50,  56,  93,  59, 
+     13,  10, 125,  59,  13,  10, 
+     13,  10,  47,  47,  32,  84, 
+    104, 101,  32, 112, 114, 111, 
+    106, 101,  99, 116, 105, 111, 
+    110,  32,  97, 110, 100,  32, 
+    118, 105, 101, 119,  32, 109, 
+     97, 116, 114, 105, 120,  13, 
+     10,  99,  98, 117, 102, 102, 
+    101, 114,  32,  75,  97, 109, 
+    101, 114,  97,  32,  58,  32, 
+    114, 101, 103, 105, 115, 116, 
+    101, 114,  40,  98,  49,  41, 
+     13,  10, 123,  13,  10,   9, 
+    109,  97, 116, 114, 105, 120, 
+     32, 118, 105, 101, 119,  59, 
+     13,  10,   9, 109,  97, 116, 
+    114, 105, 120,  32, 112, 114, 
+    111, 106, 101,  99, 116, 105, 
+    111, 110,  59,  13,  10, 125, 
+     13,  10,  13,  10,  47,  47, 
+     47,  47,  47,  47,  47,  47, 
+     47,  47,  47,  47,  47,  47, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  13,  10,  47,  47, 
+     32,  84,  89,  80,  69,  68, 
+     69,  70,  83,  32,  47,  47, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  13,  10,  47,  47, 
+     47,  47,  47,  47,  47,  47, 
+     47,  47,  47,  47,  47,  47, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  13,  10, 115, 116, 
+    114, 117,  99, 116,  32,  86, 
+    101, 114, 116, 101, 120,  73, 
+    110, 112, 117, 116,  84, 121, 
+    112, 101,  13,  10, 123,  13, 
+     10,   9, 102, 108, 111,  97, 
+    116,  52,  32, 112, 111, 115, 
+    105, 116, 105, 111, 110,  32, 
+     58,  32,  80,  79,  83,  73, 
+     84,  73,  79,  78,  59,  13, 
+     10,   9, 102, 108, 111,  97, 
+    116,  50,  32, 116, 101, 120, 
+     32,  58,  32,  84,  69,  88, 
+     67,  79,  79,  82,  68,  48, 
+     59,  13,  10,   9, 102, 108, 
+    111,  97, 116,  51,  32, 110, 
+    111, 114, 109,  97, 108,  32, 
+     58,  32,  78,  79,  82,  77, 
+     65,  76,  59,  13,  10,   9, 
+    117, 105, 110, 116,  32, 107, 
+    110, 111,  99, 104, 101, 110, 
+     32,  58,  32,  75,  78,  79, 
+     67,  72,  69,  78,  95,  73, 
+     68,  48,  59,  13,  10,   9, 
+    104,  97, 108, 102,  32, 105, 
+    100,  32,  58,  32,  86,  69, 
+     82,  84,  69,  88,  95,  73, 
+     68,  59,  13,  10, 125,  59, 
+     13,  10,  13,  10, 115, 116, 
+    114, 117,  99, 116,  32,  80, 
+    105, 120, 101, 108,  73, 110, 
+    112, 117, 116,  84, 121, 112, 
+    101,  13,  10, 123,  13,  10, 
+      9, 102, 108, 111,  97, 116, 
+     52,  32, 119, 111, 114, 108, 
+    100,  80, 111, 115,  32,  58, 
+     32,  80,  79,  83,  73,  84, 
+     73,  79,  78,  59,  13,  10, 
+      9, 102, 108, 111,  97, 116, 
+     52,  32, 112, 111, 115, 105, 
+    116, 105, 111, 110,  32,  58, 
+     32,  83,  86,  95,  80,  79, 
+     83,  73,  84,  73,  79,  78, 
+     59,  13,  10,   9, 102, 108, 
+    111,  97, 116,  50,  32, 116, 
+    101, 120,  32,  58,  32,  84, 
+     69,  88,  67,  79,  79,  82, 
+     68,  48,  59,  13,  10,   9, 
+    102, 108, 111,  97, 116,  51, 
+     32, 110, 111, 114, 109,  97, 
+    108,  32,  58,  32,  84,  69, 
+     88,  67,  79,  79,  82,  68, 
+     49,  59,  13,  10, 125,  59, 
+     13,  10,  13,  10,  47,  47, 
+     47,  47,  47,  47,  47,  47, 
+     47,  47,  47,  47,  47,  47, 
+     47,  47,  47,  47,  47,  47, 
+     47,  47,  47,  47,  47,  47, 
+     47,  47,  47,  47,  47,  47, 
+     47,  47,  47,  47,  47,  47, 
+     47,  47,  47,  47,  47,  47, 
+     47,  47,  47,  47,  47,  47, 
+     47,  47,  47,  47,  47,  47, 
+     47,  47,  47,  47,  47,  47, 
+     47,  47,  47,  47,  47,  47, 
+     47,  47,  47,  47,  47,  47, 
+     47,  47,  47,  47,  47,  47, 
+     13,  10,  47,  47,  32,  86, 
+    101, 114, 116, 101, 120,  32, 
+     83, 104,  97, 100, 101, 114, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  13,  10, 
+     47,  47,  47,  47,  47,  47, 
+     47,  47,  47,  47,  47,  47, 
+     47,  47,  47,  47,  47,  47, 
+     47,  47,  47,  47,  47,  47, 
+     47,  47,  47,  47,  47,  47, 
+     47,  47,  47,  47,  47,  47, 
+     47,  47,  47,  47,  47,  47, 
+     47,  47,  47,  47,  47,  47, 
+     47,  47,  47,  47,  47,  47, 
+     47,  47,  47,  47,  47,  47, 
+     47,  47,  47,  47,  47,  47, 
+     47,  47,  47,  47,  47,  47, 
+     47,  47,  47,  47,  47,  47, 
+     47,  47,  13,  10,  80, 105, 
+    120, 101, 108,  73, 110, 112, 
+    117, 116,  84, 121, 112, 101, 
+     32,  84, 101, 120, 116, 117, 
+    114, 101,  86, 101, 114, 116, 
+    101, 120,  83, 104,  97, 100, 
+    101, 114,  40,  86, 101, 114, 
+    116, 101, 120,  73, 110, 112, 
+    117, 116,  84, 121, 112, 101, 
+     32, 105, 110, 112, 117, 116, 
+     41,  13,  10, 123,  13,  10, 
+      9,  47,  47, 114, 101, 116, 
+    117, 114, 110,  32, 105, 110, 
+    112, 117, 116,  59,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  13,  10,   9,  80, 105, 
+    120, 101, 108,  73, 110, 112, 
+    117, 116,  84, 121, 112, 101, 
+     32, 111, 117, 116, 112, 117, 
+    116,  59,  13,  10,   9, 111, 
+    117, 116, 112, 117, 116,  46, 
+    110, 111, 114, 109,  97, 108, 
+     32,  61,  32, 110, 111, 114, 
+    109,  97, 108, 105, 122, 101, 
+     40, 109, 117, 108,  40, 105, 
+    110, 112, 117, 116,  46, 110, 
+    111, 114, 109,  97, 108,  44, 
+     32,  40, 102, 108, 111,  97, 
+    116,  51, 120,  51,  41, 107, 
+    110, 111,  99, 104, 101, 110, 
+     77,  97, 116, 114, 105, 120, 
+     91, 105, 110, 112, 117, 116, 
+     46, 107, 110, 111,  99, 104, 
+    101, 110,  93,  41,  41,  59, 
+     13,  10,  13,  10,   9,  47, 
+     47,  32,  67, 104,  97, 110, 
+    103, 101,  32, 116, 104, 101, 
+     32, 112, 111, 115, 105, 116, 
+    105, 111, 110,  32, 118, 101, 
+     99, 116, 111, 114,  32, 116, 
+    111,  32,  98, 101,  32,  52, 
+     32, 117, 110, 105, 116, 115, 
+     32, 102, 111, 114,  32, 112, 
+    114, 111, 112, 101, 114,  32, 
+    109,  97, 116, 114, 105, 120, 
+     32,  99,  97, 108,  99, 117, 
+    108,  97, 116, 105, 111, 110, 
+    115,  46,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  13, 
+     10,   9, 105, 110, 112, 117, 
+    116,  46, 112, 111, 115, 105, 
+    116, 105, 111, 110,  46, 119, 
+     32,  61,  32,  49,  46,  48, 
+    102,  59,  13,  10,  13,  10, 
+      9,  47,  47,  32,  83, 116, 
+    111, 114, 101,  32, 116, 104, 
+    101,  32, 116, 101, 120, 116, 
+    117, 114, 101,  32,  99, 111, 
+    111, 114, 100, 105, 110,  97, 
+    116, 101, 115,  32, 102, 111, 
+    114,  32, 116, 104, 101,  32, 
+    112, 105, 120, 101, 108,  32, 
+    115, 104,  97, 100, 101, 114, 
+     46,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  13,  10,   9, 111, 117, 
+    116, 112, 117, 116,  46, 116, 
+    101, 120,  32,  61,  32, 105, 
+    110, 112, 117, 116,  46, 116, 
+    101, 120,  59,  13,  10,  13, 
+     10,   9,  47,  47,  32,  67, 
+     97, 108,  99, 117, 108,  97, 
+    116, 101,  32, 116, 104, 101, 
+     32, 112, 111, 115, 105, 116, 
+    105, 111, 110,  32, 111, 102, 
+     32, 116, 104, 101,  32, 118, 
+    101, 114, 116, 101, 120,  32, 
+     97, 103,  97, 105, 110, 115, 
+    116,  32, 116, 104, 101,  32, 
+    119, 111, 114, 108, 100,  44, 
+     32, 118, 105, 101, 119,  44, 
+     32,  97, 110, 100,  32, 112, 
+    114, 111, 106, 101,  99, 116, 
+    105, 111, 110,  32, 109,  97, 
+    116, 114, 105,  99, 101, 115, 
+     46,  32,  13,  10,   9, 111, 
+    117, 116, 112, 117, 116,  46, 
+    119, 111, 114, 108, 100,  80, 
+    111, 115,  32,  61,  32, 109, 
+    117, 108,  40, 105, 110, 112, 
+    117, 116,  46, 112, 111, 115, 
+    105, 116, 105, 111, 110,  44, 
+     32, 107, 110, 111,  99, 104, 
+    101, 110,  77,  97, 116, 114, 
+    105, 120,  91, 105, 110, 112, 
+    117, 116,  46, 107, 110, 111, 
+     99, 104, 101, 110,  93,  41, 
+     59,  13,  10,   9, 111, 117, 
+    116, 112, 117, 116,  46, 112, 
+    111, 115, 105, 116, 105, 111, 
+    110,  32,  61,  32, 109, 117, 
+    108,  40, 111, 117, 116, 112, 
+    117, 116,  46, 119, 111, 114, 
+    108, 100,  80, 111, 115,  44, 
+     32, 118, 105, 101, 119,  41, 
+     59,  13,  10,   9, 111, 117, 
+    116, 112, 117, 116,  46, 112, 
+    111, 115, 105, 116, 105, 111, 
+    110,  32,  61,  32, 109, 117, 
+    108,  40, 111, 117, 116, 112, 
+    117, 116,  46, 112, 111, 115, 
+    105, 116, 105, 111, 110,  44, 
+     32, 112, 114, 111, 106, 101, 
+     99, 116, 105, 111, 110,  41, 
+     59,  13,  10,  13,  10,   9, 
+    114, 101, 116, 117, 114, 110, 
+     32, 111, 117, 116, 112, 117, 
+    116,  59,  13,  10, 125,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0, 254, 239, 
+    254, 239,   1,   0,   0,   0, 
+    224,   7,   0,   0,   0,  67, 
+     58,  92,  85, 115, 101, 114, 
+    115,  92, 107, 111, 108, 106, 
+     97,  92,  68, 101, 115, 107, 
+    116, 111, 112,  92,  75, 111, 
+    108, 106,  97,  45,  83, 116, 
+    114, 111, 104, 109,  45,  71, 
+     97, 109, 101, 115,  92,  65, 
+    108, 108, 103, 101, 109, 101, 
+    105, 110,  92,  70, 114,  97, 
+    109, 101, 119, 111, 114, 107, 
+     92,  68,  88,  49,  49,  86, 
+    101, 114, 116, 101, 120,  83, 
+    104,  97, 100, 101, 114,  46, 
+    104, 108, 115, 108,   0,   0, 
+     99,  58,  92, 117, 115, 101, 
+    114, 115,  92, 107, 111, 108, 
+    106,  97,  92, 100, 101, 115, 
+    107, 116, 111, 112,  92, 107, 
+    111, 108, 106,  97,  45, 115, 
+    116, 114, 111, 104, 109,  45, 
+    103,  97, 109, 101, 115,  92, 
+     97, 108, 108, 103, 101, 109, 
+    101, 105, 110,  92, 102, 114, 
+     97, 109, 101, 119, 111, 114, 
+    107,  92, 100, 120,  49,  49, 
+    118, 101, 114, 116, 101, 120, 
+    115, 104,  97, 100, 101, 114, 
+     46, 104, 108, 115, 108,   0, 
+     47,  47,  47,  47,  47,  47, 
+     47,  47,  47,  47,  47,  47, 
+     47,  13,  10,  47,  47,  32, 
+     71,  76,  79,  66,  65,  76, 
+     83,  32,  47,  47,  13,  10, 
+     47,  47,  47,  47,  47,  47, 
+     47,  47,  47,  47,  47,  47, 
+     47,  13,  10,  99,  98, 117, 
+    102, 102, 101, 114,  32,  77, 
+     97, 116, 114, 105, 120,  66, 
+    117, 102, 102, 101, 114,  32, 
+     58,  32, 114, 101, 103, 105, 
+    115, 116, 101, 114,  40,  98, 
+     48,  41,  13,  10, 123,  13, 
+     10,   9, 109,  97, 116, 114, 
+    105, 120,  32, 107, 110, 111, 
+     99, 104, 101, 110,  77,  97, 
+    116, 114, 105, 120,  91,  49, 
+     50,  56,  93,  59,  13,  10, 
+    125,  59,  13,  10,  13,  10, 
+     47,  47,  32,  84, 104, 101, 
+     32, 112, 114, 111, 106, 101, 
+     99, 116, 105, 111, 110,  32, 
+     97, 110, 100,  32, 118, 105, 
+    101, 119,  32, 109,  97, 116, 
+    114, 105, 120,  13,  10,  99, 
+     98, 117, 102, 102, 101, 114, 
+     32,  75,  97, 109, 101, 114, 
+     97,  32,  58,  32, 114, 101, 
+    103, 105, 115, 116, 101, 114, 
+     40,  98,  49,  41,  13,  10, 
+    123,  13,  10,   9, 109,  97, 
+    116, 114, 105, 120,  32, 118, 
+    105, 101, 119,  59,  13,  10, 
+      9, 109,  97, 116, 114, 105, 
+    120,  32, 112, 114, 111, 106, 
+    101,  99, 116, 105, 111, 110, 
+     59,  13,  10, 125,  13,  10, 
+     13,  10,  47,  47,  47,  47, 
+     47,  47,  47,  47,  47,  47, 
+     47,  47,  47,  47,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     13,  10,  47,  47,  32,  84, 
+     89,  80,  69,  68,  69,  70, 
+     27, 226,  48,   1, 128,   0, 
+      0,   0, 198, 121, 217, 181, 
+    171, 107, 216,   1,   1,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,   2,   0,   0,   0, 
+      1,   0,   0,   0,   1,   0, 
+      0,   0,   0,   0,   0,   0, 
+     86,   0,   0,   0,  40,   0, 
+      0,   0,  27, 226,  48,   1, 
+     43, 114, 116,  65,  53,   7, 
+      0,   0,   1,   0,   0,   0, 
+     85,   0,   0,   0,  86,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   4,   0,   0,   0, 
+     66,   0,  60,  17,  16,   1, 
+      0,   0,   0,   1,  10,   0, 
+      1,   0, 173,   2,  97,  74, 
+     10,   0,   1,   0, 173,   2, 
+     97,  74,  77, 105,  99, 114, 
+    111, 115, 111, 102, 116,  32, 
+     40,  82,  41,  32,  72,  76, 
+     83,  76,  32,  83, 104,  97, 
+    100, 101, 114,  32,  67, 111, 
+    109, 112, 105, 108, 101, 114, 
+     32,  49,  48,  46,  49,   0, 
+      0,   0,  66,   0,  61,  17, 
+      1, 104, 108, 115, 108,  70, 
+    108,  97, 103, 115,   0,  48, 
+    120,  53,   0, 104, 108, 115, 
+    108,  84,  97, 114, 103, 101, 
+    116,   0, 118, 115,  95,  53, 
+     95,  48,   0, 104, 108, 115, 
+    108,  69, 110, 116, 114, 121, 
+      0,  84, 101, 120, 116, 117, 
+    114, 101,  86, 101, 114, 116, 
+    101, 120,  83, 104,  97, 100, 
+    101, 114,   0,   0,  58,   0, 
+     16,  17,   0,   0,   0,   0, 
+    100,   5,   0,   0,   0,   0, 
+      0,   0,  44,   3,   0,   0, 
+      0,   0,   0,   0,  44,   3, 
+      0,   0,   9,  16,   0,   0, 
+    152,   0,   0,   0,   1,   0, 
+    160,  84, 101, 120, 116, 117, 
+    114, 101,  86, 101, 114, 116, 
+    101, 120,  83, 104,  97, 100, 
+    101, 114,   0,   0,  46,   0, 
+     62,  17,   4,  16,   0,   0, 
+      9,   0, 105, 110, 112, 117, 
+    116,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,  22,   0, 
+     80,  17,   1,   0,   5,   0, 
+      0,   0,   4,   0, 152,   0, 
+      0,   0,   1,   0,  44,   3, 
+      0,   0,   0,   0,  22,   0, 
+     80,  17,   1,   0,   5,   0, 
+      4,   0,   4,   0, 152,   0, 
+      0,   0,   1,   0,  44,   3, 
+      4,   0,   0,   0,  22,   0, 
+     80,  17,   1,   0,   5,   0, 
+      8,   0,   4,   0, 152,   0, 
+      0,   0,   1,   0,  44,   3, 
+      8,   0,   0,   0,  22,   0, 
+     80,  17,   1,   0,   5,   0, 
+     12,   0,   4,   0, 152,   0, 
+      0,   0,   1,   0,  44,   3, 
+     12,   0,   0,   0,  22,   0, 
+     80,  17,   1,   0,   5,   0, 
+     16,   0,   4,   0, 152,   0, 
+      0,   0,   1,   0,  44,   3, 
+     16,   0,   0,   0,  22,   0, 
+     80,  17,   1,   0,   5,   0, 
+     20,   0,   4,   0, 152,   0, 
+      0,   0,   1,   0,  44,   3, 
+     20,   0,   0,   0,  22,   0, 
+     80,  17,   1,   0,   5,   0, 
+     24,   0,   4,   0, 152,   0, 
+      0,   0,   1,   0,  44,   3, 
+     32,   0,   0,   0,  22,   0, 
+     80,  17,   1,   0,   5,   0, 
+     28,   0,   4,   0, 152,   0, 
+      0,   0,   1,   0,  44,   3, 
+     36,   0,   0,   0,  22,   0, 
+     80,  17,   1,   0,   5,   0, 
+     32,   0,   4,   0, 152,   0, 
+      0,   0,   1,   0,  44,   3, 
+     40,   0,   0,   0,  22,   0, 
+     80,  17,   1,   0,   5,   0, 
+     36,   0,   4,   0, 152,   0, 
+      0,   0,   1,   0,  44,   3, 
+     48,   0,   0,   0,  22,   0, 
+     80,  17,   1,   0,   5,   0, 
+     40,   0,   4,   0, 152,   0, 
+      0,   0,   1,   0,  44,   3, 
+     64,   0,   0,   0,  22,   0, 
+     80,  17,   0,   0,   5,   0, 
+     12,   0,   4,   0, 140,   1, 
+      0,   0,   1,   0, 100,   1, 
+     28,   0,   0,   0,  74,   0, 
+     62,  17,   8,  16,   0,   0, 
+    136,   0,  60,  84, 101, 120, 
+    116, 117, 114, 101,  86, 101, 
+    114, 116, 101, 120,  83, 104, 
+     97, 100, 101, 114,  32, 114, 
+    101, 116, 117, 114, 110,  32, 
+    118,  97, 108, 117, 101,  62, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,  22,   0,  80,  17, 
+      2,   0,   5,   0,  40,   0, 
+      4,   0, 152,   0,   0,   0, 
+      1,   0,  44,   3,  48,   0, 
+      0,   0,  22,   0,  80,  17, 
+      2,   0,   5,   0,  44,   0, 
+      4,   0, 152,   0,   0,   0, 
+      1,   0,  44,   3,  52,   0, 
+      0,   0,  22,   0,  80,  17, 
+      2,   0,   5,   0,  48,   0, 
+      4,   0, 152,   0,   0,   0, 
+      1,   0,  44,   3,  56,   0, 
+      0,   0,  22,   0,  80,  17, 
+      2,   0,   5,   0,  32,   0, 
+      4,   0, 152,   0,   0,   0, 
+      1,   0,  44,   3,  32,   0, 
+      0,   0,  22,   0,  80,  17, 
+      2,   0,   5,   0,  36,   0, 
+      4,   0, 152,   0,   0,   0, 
+      1,   0,  44,   3,  36,   0, 
+      0,   0,  22,   0,  80,  17, 
+      2,   0,   5,   0,  16,   0, 
+      4,   0, 152,   0,   0,   0, 
+      1,   0,  44,   3,  16,   0, 
+      0,   0,  22,   0,  80,  17, 
+      2,   0,   5,   0,  20,   0, 
+      4,   0, 152,   0,   0,   0, 
+      1,   0,  44,   3,  20,   0, 
+      0,   0,  22,   0,  80,  17, 
+      2,   0,   5,   0,  24,   0, 
+      4,   0, 152,   0,   0,   0, 
+      1,   0,  44,   3,  24,   0, 
+      0,   0,  22,   0,  80,  17, 
+      2,   0,   5,   0,  28,   0, 
+      4,   0, 152,   0,   0,   0, 
+      1,   0,  44,   3,  28,   0, 
+      0,   0,  22,   0,  80,  17, 
+      2,   0,   5,   0,   0,   0, 
+      4,   0, 152,   0,   0,   0, 
+      1,   0,  44,   3,   0,   0, 
+      0,   0,  22,   0,  80,  17, 
+      2,   0,   5,   0,   4,   0, 
+      4,   0, 152,   0,   0,   0, 
+      1,   0,  44,   3,   4,   0, 
+      0,   0,  22,   0,  80,  17, 
+      2,   0,   5,   0,   8,   0, 
+      4,   0, 152,   0,   0,   0, 
+      1,   0,  44,   3,   8,   0, 
+      0,   0,  22,   0,  80,  17, 
+      2,   0,   5,   0,  12,   0, 
+      4,   0, 152,   0,   0,   0, 
+      1,   0,  44,   3,  12,   0, 
+      0,   0,  46,   0,  62,  17, 
+      7,  16,   0,   0,   8,   0, 
+    111, 117, 116, 112, 117, 116, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,  22,   0,  80,  17, 
+      0,   0,   5,   0,  40,   0, 
+      4,   0, 120,   1,   0,   0, 
+      1,   0,  76,   2,   0,   0, 
+      0,   0,  22,   0,  80,  17, 
+      0,   0,   5,   0,  44,   0, 
+      4,   0, 120,   1,   0,   0, 
+      1,   0,  76,   2,   4,   0, 
+      0,   0,  22,   0,  80,  17, 
+      0,   0,   5,   0,  48,   0, 
+      4,   0, 120,   1,   0,   0, 
+      1,   0,  76,   2,   8,   0, 
+      0,   0,  22,   0,  80,  17, 
+      0,   0,   5,   0,  32,   0, 
+      4,   0, 160,   1,   0,   0, 
+      1,   0,  36,   2,  32,   0, 
+      0,   0,  22,   0,  80,  17, 
+      0,   0,   5,   0,  36,   0, 
+      4,   0, 160,   1,   0,   0, 
+      1,   0,  36,   2,  36,   0, 
+      0,   0,  22,   0,  80,  17, 
+      0,   0,   5,   0,   0,   0, 
+      4,   0, 248,   1,   0,   0, 
+      1,   0, 204,   1,  48,   0, 
+      0,   0,  22,   0,  80,  17, 
+      0,   0,   5,   0,   4,   0, 
+      4,   0,  32,   2,   0,   0, 
+      1,   0, 164,   1,  52,   0, 
+      0,   0,  22,   0,  80,  17, 
+      0,   0,   5,   0,   8,   0, 
+      4,   0,  72,   2,   0,   0, 
+      1,   0, 124,   1,  56,   0, 
+      0,   0,  22,   0,  80,  17, 
+      0,   0,   5,   0,  12,   0, 
+      4,   0, 112,   2,   0,   0, 
+      1,   0,  84,   1,  60,   0, 
+      0,   0,  22,   0,  80,  17, 
+      0,   0,   5,   0,  16,   0, 
+      4,   0, 144,   2,   0,   0, 
+      1,   0, 128,   0,  16,   0, 
+      0,   0,  22,   0,  80,  17, 
+      0,   0,   5,   0,  20,   0, 
+      4,   0, 176,   2,   0,   0, 
+      1,   0, 128,   0,  20,   0, 
+      0,   0,  22,   0,  80,  17, 
+      0,   0,   5,   0,  24,   0, 
+      4,   0, 208,   2,   0,   0, 
+      1,   0, 128,   0,  24,   0, 
+      0,   0,  22,   0,  80,  17, 
+      0,   0,   5,   0,  28,   0, 
+      4,   0, 240,   2,   0,   0, 
+      1,   0, 128,   0,  28,   0, 
+      0,   0,  22,   0,  80,  17, 
+      0,   0,   5,   0,  16,   0, 
+      4,   0,  16,   3,   0,   0, 
+      1,   0, 180,   0,  64,   0, 
+      0,   0,  22,   0,  80,  17, 
+      0,   0,   5,   0,  20,   0, 
+      4,   0,  48,   3,   0,   0, 
+      1,   0, 148,   0,  68,   0, 
+      0,   0,  22,   0,  80,  17, 
+      0,   0,   5,   0,  24,   0, 
+      4,   0,  80,   3,   0,   0, 
+      1,   0, 116,   0,  72,   0, 
+      0,   0,  22,   0,  80,  17, 
+      0,   0,   5,   0,  28,   0, 
+      4,   0, 112,   3,   0,   0, 
+      1,   0,  84,   0,  76,   0, 
+      0,   0,   2,   0,   6,   0, 
+    244,   0,   0,   0,  24,   0, 
+      0,   0,   1,   0,   0,   0, 
+     16,   1, 157, 231,  29,  75, 
+    165, 229, 222, 233,  59, 165, 
+     98,  93,  19, 150, 219,  51, 
+      0,   0, 242,   0,   0,   0, 
+    184,   2,   0,   0,   0,   0, 
+      0,   0,   1,   0,   1,   0, 
+    196,   3,   0,   0,   0,   0, 
+      0,   0,  56,   0,   0,   0, 
+    172,   2,   0,   0, 152,   0, 
+      0,   0,  43,   0,   0, 128, 
+    152,   0,   0,   0,  43,   0, 
+      0,   0, 184,   0,   0,   0, 
+     43,   0,   0, 128, 184,   0, 
+      0,   0,  43,   0,   0,   0, 
+    220,   0,   0,   0,  43,   0, 
+      0, 128, 220,   0,   0,   0, 
+     43,   0,   0,   0,   4,   1, 
+      0,   0,  43,   0,   0, 128, 
+      4,   1,   0,   0,  43,   0, 
+      0,   0,  44,   1,   0,   0, 
+     43,   0,   0, 128,  44,   1, 
+      0,   0,  43,   0,   0,   0, 
+     72,   1,   0,   0,  43,   0, 
+      0, 128,  72,   1,   0,   0, 
+     43,   0,   0,   0,  92,   1, 
+      0,   0,  43,   0,   0, 128, 
+     92,   1,   0,   0,  43,   0, 
+      0,   0, 120,   1,   0,   0, 
+     46,   0,   0, 128, 120,   1, 
+      0,   0,  46,   0,   0,   0, 
+    140,   1,   0,   0,  49,   0, 
+      0, 128, 140,   1,   0,   0, 
+     49,   0,   0,   0, 160,   1, 
+      0,   0,  52,   0,   0, 128, 
+    160,   1,   0,   0,  52,   0, 
+      0,   0, 192,   1,   0,   0, 
+     52,   0,   0, 128, 192,   1, 
+      0,   0,  52,   0,   0,   0, 
+    212,   1,   0,   0,  52,   0, 
+      0, 128, 212,   1,   0,   0, 
+     52,   0,   0,   0, 248,   1, 
+      0,   0,  52,   0,   0, 128, 
+    248,   1,   0,   0,  52,   0, 
+      0,   0,  32,   2,   0,   0, 
+     52,   0,   0, 128,  32,   2, 
+      0,   0,  52,   0,   0,   0, 
+     72,   2,   0,   0,  52,   0, 
+      0, 128,  72,   2,   0,   0, 
+     52,   0,   0,   0, 112,   2, 
+      0,   0,  53,   0,   0, 128, 
+    112,   2,   0,   0,  53,   0, 
+      0,   0, 144,   2,   0,   0, 
+     53,   0,   0, 128, 144,   2, 
+      0,   0,  53,   0,   0,   0, 
+    176,   2,   0,   0,  53,   0, 
+      0, 128, 176,   2,   0,   0, 
+     53,   0,   0,   0, 208,   2, 
+      0,   0,  53,   0,   0, 128, 
+    208,   2,   0,   0,  53,   0, 
+      0,   0, 240,   2,   0,   0, 
+     54,   0,   0, 128, 240,   2, 
+      0,   0,  54,   0,   0,   0, 
+     16,   3,   0,   0,  54,   0, 
+      0, 128,  16,   3,   0,   0, 
+     54,   0,   0,   0,  48,   3, 
+      0,   0,  54,   0,   0, 128, 
+     48,   3,   0,   0,  54,   0, 
+      0,   0,  80,   3,   0,   0, 
+     54,   0,   0, 128,  80,   3, 
+      0,   0,  54,   0,   0,   0, 
+    112,   3,   0,   0,  56,   0, 
+      0, 128, 112,   3,   0,   0, 
+     56,   0,   0,   0, 132,   3, 
+      0,   0,  56,   0,   0, 128, 
+    132,   3,   0,   0,  56,   0, 
+      0,   0, 152,   3,   0,   0, 
+     56,   0,   0, 128, 152,   3, 
+      0,   0,  56,   0,   0,   0, 
+    172,   3,   0,   0,  56,   0, 
+      0, 128, 172,   3,   0,   0, 
+     56,   0,   0,   0, 192,   3, 
+      0,   0,  56,   0,   0, 128, 
+    192,   3,   0,   0,  56,   0, 
+      0,   0,   2,   0,  86,   0, 
+     56,   0,  83,   0,   2,   0, 
+     86,   0,  28,   0,  84,   0, 
+      2,   0,  86,   0,  28,   0, 
+     84,   0,   2,   0,  86,   0, 
+     28,   0,  84,   0,   2,   0, 
+     86,   0,  18,   0,  85,   0, 
+      2,   0,  86,   0,  18,   0, 
+     85,   0,   2,   0,  86,   0, 
+     18,   0,  85,   0,   2,   0, 
+     25,   0,   2,   0,  24,   0, 
+      2,   0,  24,   0,   2,   0, 
+     23,   0,   2,   0,  69,   0, 
+     40,   0,  67,   0,   2,   0, 
+     69,   0,  20,   0,  68,   0, 
+      2,   0,  69,   0,  20,   0, 
+     68,   0,   2,   0,  69,   0, 
+     20,   0,  68,   0,   2,   0, 
+     69,   0,  20,   0,  68,   0, 
+      2,   0,  69,   0,  20,   0, 
+     68,   0,   2,   0,  46,   0, 
+     20,   0,  45,   0,   2,   0, 
+     46,   0,  20,   0,  45,   0, 
+      2,   0,  46,   0,  20,   0, 
+     45,   0,   2,   0,  46,   0, 
+     20,   0,  45,   0,   2,   0, 
+     52,   0,  20,   0,  51,   0, 
+      2,   0,  52,   0,  20,   0, 
+     51,   0,   2,   0,  52,   0, 
+     20,   0,  51,   0,   2,   0, 
+     52,   0,  20,   0,  51,   0, 
+      2,   0,  15,   0,   2,   0, 
+     15,   0,   2,   0,  15,   0, 
+      2,   0,  15,   0,   2,   0, 
+     15,   0,   2,   0,  15,   0, 
+      2,   0,  15,   0,   2,   0, 
+     15,   0,   2,   0,  15,   0, 
+      2,   0,  15,   0, 246,   0, 
+      0,   0,   4,   0,   0,   0, 
+      0,   0,   0,   0,  16,   0, 
+      0,   0,   0,   0,   0,   0, 
+     36,   0,   0,   0,  72,   0, 
+      0,   0, 100,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+     11, 202,  49,   1,  56,   0, 
+      0,   0,   0,  16,   0,   0, 
+     15,  16,   0,   0, 200,   1, 
+      0,   0,  10,   0, 255, 255, 
+      4,   0,   0,   0, 255, 255, 
+      3,   0,   0,   0,   0,   0, 
+     60,   0,   0,   0,  60,   0, 
+      0,   0,   8,   0,   0,   0, 
+     68,   0,   0,   0,   0,   0, 
+      0,   0,  22,   0,  27,  21, 
+     64,   0,   0,   0,   4,   0, 
+      0,   0,  16,   0, 102, 108, 
+    111,  97, 116,  52,   0, 243, 
+    242, 241,  22,   0,  27,  21, 
+     64,   0,   0,   0,   2,   0, 
+      0,   0,   8,   0, 102, 108, 
+    111,  97, 116,  50,   0, 243, 
+    242, 241,  22,   0,  27,  21, 
+     64,   0,   0,   0,   3,   0, 
+      0,   0,  12,   0, 102, 108, 
+    111,  97, 116,  51,   0, 243, 
+    242, 241,  94,   0,   3,  18, 
+     13,  21,   3,   0,   0,  16, 
+      0,   0,   0,   0, 112, 111, 
+    115, 105, 116, 105, 111, 110, 
+      0, 241,  13,  21,   3,   0, 
+      1,  16,   0,   0,  16,   0, 
+    116, 101, 120,   0, 242, 241, 
+     13,  21,   3,   0,   2,  16, 
+      0,   0,  24,   0, 110, 111, 
+    114, 109,  97, 108,   0, 243, 
+    242, 241,  13,  21,   3,   0, 
+    117,   0,   0,   0,  36,   0, 
+    107, 110, 111,  99, 104, 101, 
+    110,   0, 242, 241,  13,  21, 
+      3,   0,  69,   0,   0,   0, 
+     40,   0, 105, 100,   0, 243, 
+    242, 241,  38,   0,   5,  21, 
+      5,   0,   0,   0,   3,  16, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,  44,   0, 
+     86, 101, 114, 116, 101, 120, 
+     73, 110, 112, 117, 116,  84, 
+    121, 112, 101,   0, 242, 241, 
+     10,   0,   1,  18,   1,   0, 
+      0,   0,   4,  16,   0,   0, 
+     78,   0,   3,  18,  13,  21, 
+      3,   0,   0,  16,   0,   0, 
+      0,   0, 119, 111, 114, 108, 
+    100,  80, 111, 115,   0, 241, 
+     13,  21,   3,   0,   0,  16, 
+      0,   0,  16,   0, 112, 111, 
+    115, 105, 116, 105, 111, 110, 
+      0, 241,  13,  21,   3,   0, 
+      1,  16,   0,   0,  32,   0, 
+    116, 101, 120,   0, 242, 241, 
+     13,  21,   3,   0,   2,  16, 
+      0,   0,  40,   0, 110, 111, 
+    114, 109,  97, 108,   0, 243, 
+    242, 241,  38,   0,   5,  21, 
+      4,   0,   0,   0,   6,  16, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,  52,   0, 
+     80, 105, 120, 101, 108,  73, 
+    110, 112, 117, 116,  84, 121, 
+    112, 101,   0, 243, 242, 241, 
+     10,   0,  24,  21,   7,  16, 
+      0,   0,   1,   0,   1,   0, 
+     14,   0,   8,  16,   8,  16, 
+      0,   0,  23,   0,   1,   0, 
+      5,  16,   0,   0,  30,   0, 
+     28,  21,  64,   0,   0,   0, 
+      4,   0,   0,   0,   4,   0, 
+      0,   0,  16,   0,   0,   0, 
+      0,  64,   0, 102, 108, 111, 
+     97, 116,  52, 120,  52,   0, 
+     10,   0,  24,  21,  10,  16, 
+      0,   0,   1,   0,   1,   0, 
+     18,   0,  22,  21,  11,  16, 
+      0,   0,  34,   0,   0,   0, 
+     64,   0,   0,   0,   0,  32, 
+      0, 241,  10,   0,  24,  21, 
+     12,  16,   0,   0,   1,   0, 
+      0,   2,  10,   0,  24,  21, 
+     11,  16,   0,   0,   1,   0, 
+      0,   2,  11, 202,  49,   1, 
+     56,   0,   0,   0,   0,  16, 
+      0,   0,   0,  16,   0,   0, 
+      0,   0,   0,   0,  11,   0, 
+    255, 255,   4,   0,   0,   0, 
+    255, 255,   3,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,  47,  47, 
+     47,  47,  47,  47,  47,  47, 
+     47,  47,  47,  47,  47,  47, 
+     47,  47,  47,  47,  47,  47, 
+     47,  47,  47,  47,  47,  47, 
+     47,  47,  47,  47,  47,  47, 
+     47,  47,  47,  47,  47,  47, 
+     47,  47,  47,  47,  47,  47, 
+     47,  47,  47,  47,  47,  47, 
+     47,  47,  47,  47,  47,  47, 
+     13,  10,  47,  47,  32,  86, 
+    101, 114, 116, 101, 120,  32, 
+     83, 104,  97, 100, 101, 114, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  13,  10, 
+     47,  47,  47,  47,  47,  47, 
+     47,  47,  47,  47,  47,  47, 
+     47,  47,  47,  47,  47,  47, 
+     47,  47,  47,  47,  47,  47, 
+     47,  47,  47,  47,  47,  47, 
+     47,  47,  47,  47,  47,  47, 
+     47,  47,  47,  47,  47,  47, 
+     47,  47,  47,  47,  47,  47, 
+     47,  47,  47,  47,  47,  47, 
+     47,  47,  47,  47,  47,  47, 
+     47,  47,  47,  47,  47,  47, 
+     47,  47,  47,  47,  47,  47, 
+     47,  47,  47,  47,  47,  47, 
+     47,  47,  13,  10,  80, 105, 
+    120, 101, 108,  73, 110, 112, 
+    117, 116,  84, 121, 112, 101, 
+     32,  84, 101, 120, 116, 117, 
+    114, 101,  86, 101, 114, 116, 
+    101, 120,  83, 104,  97, 100, 
+    101, 114,  40,  86, 101, 114, 
+    116, 101, 120,  73, 110, 112, 
+    117, 116,  84, 121, 112, 101, 
+     32, 105, 110, 112, 117, 116, 
+     41,  13,  10, 123,  13,  10, 
+      9,  47,  47, 114, 101, 116, 
+    117, 114, 110,  32, 105, 110, 
+    112, 117, 116,  59,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  13,  10,   9,  80, 105, 
+    120, 101, 108,  73, 110, 112, 
+    117, 116,  84, 121, 112, 101, 
+     32, 111, 117, 116, 112, 117, 
+    116,  59,  13,  10,   9, 111, 
+    117, 116, 112, 117, 116,  46, 
+    110, 111, 114, 109,  97, 108, 
+     32,  61,  32, 110, 111, 114, 
+    109,  97, 108, 105, 122, 101, 
+     40, 109, 117, 108,  40, 105, 
+    110, 112, 117, 116,  46, 110, 
+    111, 114, 109,  97, 108,  44, 
+     32,  40, 102, 108, 111,  97, 
+    116,  51, 120,  51,  41, 107, 
+    110, 111,  99, 104, 101, 110, 
+     77,  97, 116, 114, 105, 120, 
+     91, 105, 110, 112, 117, 116, 
+     46, 107, 110, 111,  99, 104, 
+    101, 110,  93,  41,  41,  59, 
+     13,  10,  13,  10,   9,  47, 
+     47,  32,  67, 104,  97, 110, 
+    103, 101,  32, 116, 104, 101, 
+     32, 112, 111, 115, 105, 116, 
+    105, 111, 110,  32, 118, 101, 
+     99, 116, 111, 114,  32, 116, 
+    111,  32,  98, 101,  32,  52, 
+     32, 117, 110, 105, 116, 115, 
+     32, 102, 111, 114,  32, 112, 
+    114, 111, 112, 101, 114,  32, 
+    109,  97, 116, 114, 105, 120, 
+     32,  99,  97, 108,  99, 117, 
+    108,  97, 116, 105, 111, 110, 
+    115,  46,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  13, 
+     10,   9, 105, 110, 112, 117, 
+    116,  46, 112, 111, 115, 105, 
+    116, 105, 111, 110,  46, 119, 
+     32,  61,  32,  49,  46,  48, 
+    102,  59,  13,  10,  13,  10, 
+      9,  47,  47,  32,  83, 116, 
+    111, 114, 101,  32, 116, 104, 
+    101,  32, 116, 101, 120, 116, 
+    117, 114, 101,  32,  99, 111, 
+    111, 114, 100, 105, 110,  97, 
+    116, 101, 115,  32, 102, 111, 
+    114,  32, 116, 104, 101,  32, 
+    112, 105, 120, 101, 108,  32, 
+    115, 104,  97, 100, 101, 114, 
+     46,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  32,  32,  32,  32,  32, 
+     32,  13,  10,   9, 111, 117, 
+    116, 112, 117, 116,  46, 116, 
+    101, 120,  32,  61,  32, 105, 
+    110, 112, 117, 116,  46, 116, 
+    101, 120,  59,  13,  10,  13, 
+     10,   9,  47,  47,  32,  67, 
+     97, 108,  99, 117, 108,  97, 
+    116, 101,  32, 116, 104, 101, 
+     32, 112, 111, 115, 105, 116, 
+    105, 111, 110,  32, 111, 102, 
+     32, 116, 104, 101,  32, 118, 
+    101, 114, 116, 101, 120,  32, 
+     97, 103,  97, 105, 110, 115, 
+    116,  32, 116, 104, 101,  32, 
+    119, 111, 114, 108, 100,  44, 
+     32, 118, 105, 101, 119,  44, 
+     32,  97, 110, 100,  32, 112, 
+    114, 111, 106, 101,  99, 116, 
+    105, 111, 110,  32, 109,  97, 
+    116, 114, 105,  99, 101, 115, 
+     46,  32,  13,  10,   9, 111, 
+    117, 116, 112, 117, 116,  46, 
+    119, 111, 114, 108, 100,  80, 
+    111, 115,  32,  61,  32, 109, 
+    117, 108,  40, 105, 110, 112, 
+    117, 116,  46, 112, 111, 115, 
+    105, 116, 105, 111, 110,  44, 
+     32, 107, 110, 111,  99, 104, 
+    101, 110,  77,  97, 116, 114, 
+    105, 120,  91, 105, 110, 112, 
+    117, 116,  46, 107, 110, 111, 
+     99, 104, 101, 110,  93,  41, 
+     59,  13,  10,   9, 111, 117, 
+    116, 112, 117, 116,  46, 112, 
+    111, 115, 105, 116, 105, 111, 
+    110,  32,  61,  32, 109, 117, 
+    108,  40, 111, 117, 116, 112, 
+    117, 116,  46, 119, 111, 114, 
+    108, 100,  80, 111, 115,  44, 
+     32, 118, 105, 101, 119,  41, 
+     59,  13,  10,   9, 111, 117, 
+    116, 112, 117, 116,  46, 112, 
+    111, 115, 105, 116, 105, 111, 
+    110,  32,  61,  32, 109, 117, 
+    108,  40, 111, 117, 116, 112, 
+    117, 116,  46, 112, 111, 115, 
+    105, 116, 105, 111, 110,  44, 
+     32, 112, 114, 111, 106, 101, 
+     99, 116, 105, 111, 110,  41, 
+     59,  13,  10,  13,  10,   9, 
+    114, 101, 116, 117, 114, 110, 
+     32, 111, 117, 116, 112, 117, 
+    116,  59,  13,  10, 125,   0, 
+      7,   0,   0,   0,   0,   0, 
+      0,   0,  85,   0,   0,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,  86,   0,   0,   0, 
+      0,   0,   0,   0, 170,   0, 
+      0,   0,   4,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,  68,  51, 
+     68,  83,  72,  68,  82,   0, 
+    196,   3,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,  32,   0, 
+      0,  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,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+    255, 255, 255, 255,  26,   9, 
+     47, 241,  32,   0,   0,   0, 
+     20,   2,   0,   0,   1,   0, 
+      0,   0,   1,   0,   0,   0, 
+     73,   0,   0,   0,   1,   0, 
+      0,   0,  37,   0,   0,   0, 
+      1,   0,   0,   0, 101,   0, 
+      0,   0,   1,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      2,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   4, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   4,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,  12,   0, 
+      0,   0,  24,   0,   0,   0, 
+     36,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,  34,   0, 
+     37,  17,   0,   0,   0,   0, 
+    140,   0,   0,   0,   1,   0, 
+     84, 101, 120, 116, 117, 114, 
+    101,  86, 101, 114, 116, 101, 
+    120,  83, 104,  97, 100, 101, 
+    114,   0,   0,   0,  34,   0, 
+     81,  17,  13,  16,   0,   0, 
+      8,   0,   0,   0,   0,   0, 
+    255, 255, 255, 255, 255, 255, 
+    107, 110, 111,  99, 104, 101, 
+    110,  77,  97, 116, 114, 105, 
+    120,   0,   0,   0,  26,   0, 
+     81,  17,  14,  16,   0,   0, 
+      8,   0,   1,   0,   0,   0, 
+    255, 255, 255, 255, 255, 255, 
+    118, 105, 101, 119,   0,   0, 
+      0,   0,  30,   0,  81,  17, 
+     14,  16,   0,   0,   8,   0, 
+      1,   0,  64,   0, 255, 255, 
+    255, 255, 255, 255, 112, 114, 
+    111, 106, 101,  99, 116, 105, 
+    111, 110,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+     16,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0, 255, 255, 
+    255, 255,  26,   9,  47, 241, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0, 148,  46,  49,   1, 
+     16, 136, 134,  98,   1,   0, 
+      0,   0, 100, 237, 204,  20, 
+     18, 103,  42,  79, 183,  95, 
+     33,  23,  64, 184, 115,   3, 
+    129,   0,   0,   0,  47,  76, 
+    105, 110, 107,  73, 110, 102, 
+    111,   0,  47, 110,  97, 109, 
+    101, 115,   0,  47, 115, 114, 
+     99,  47, 104, 101,  97, 100, 
+    101, 114,  98, 108, 111,  99, 
+    107,   0,  47, 115, 114,  99, 
+     47, 102, 105, 108, 101, 115, 
+     47,  99,  58,  92, 117, 115, 
+    101, 114, 115,  92, 107, 111, 
+    108, 106,  97,  92, 100, 101, 
+    115, 107, 116, 111, 112,  92, 
+    107, 111, 108, 106,  97,  45, 
+    115, 116, 114, 111, 104, 109, 
+     45, 103,  97, 109, 101, 115, 
+     92,  97, 108, 108, 103, 101, 
+    109, 101, 105, 110,  92, 102, 
+    114,  97, 109, 101, 119, 111, 
+    114, 107,  92, 100, 120,  49, 
+     49, 118, 101, 114, 116, 101, 
+    120, 115, 104,  97, 100, 101, 
+    114,  46, 104, 108, 115, 108, 
+      0,   4,   0,   0,   0,   6, 
+      0,   0,   0,   1,   0,   0, 
+      0,  30,   0,   0,   0,   0, 
+      0,   0,   0,  17,   0,   0, 
+      0,   7,   0,   0,   0,  34, 
+      0,   0,   0,   8,   0,   0, 
+      0,  10,   0,   0,   0,   6, 
+      0,   0,   0,   0,   0,   0, 
+      0,   5,   0,   0,   0,   0, 
+      0,   0,   0, 220,  81,  51, 
+      1,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0, 255, 255, 
+    255, 255, 119,   9,  49,   1, 
+      1,   0,   0,   0,  13,   0, 
+      0, 142,  14,   0,  63,  92, 
+     15,   0,   0,   0,  92,   0, 
+      0,   0,  32,   0,   0,   0, 
+     44,   0,   0,   0,  96,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,  22,   0, 
+      0,   0,  25,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      1,   0,   0,   0,   0,   0, 
+      0,   0, 196,   3,   0,   0, 
+     32,   0,   0,  96,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   2,   0, 
+      9,   0, 104,   5,   0,   0, 
+      0,   0,   0,   0, 236,   2, 
+      0,   0,   1,   0, 153,  34, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+     84, 101, 120, 116, 117, 114, 
+    101,  86, 101, 114, 116, 101, 
+    120,  83, 104,  97, 100, 101, 
+    114,   0, 110, 111, 110, 101, 
+      0,   0,   0,   0,  45, 186, 
+     46, 241,   1,   0,   0,   0, 
+      0,   0,   0,   0, 196,   3, 
+      0,   0,  32,   0,   0,  96, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      2,   0,   2,   0,   7,   0, 
+      0,   0,   0,   0,   1,   0, 
+    255, 255, 255, 255,   0,   0, 
+      0,   0, 196,   3,   0,   0, 
+      8,   2,   0,   0,   0,   0, 
+      0,   0, 255, 255, 255, 255, 
+      0,   0,   0,   0, 255, 255, 
+    255, 255,   1,   0,   1,   0, 
+      0,   0,   1,   0,   0,   0, 
+      0,   0,  67,  58,  92,  85, 
+    115, 101, 114, 115,  92, 107, 
+    111, 108, 106,  97,  92,  68, 
+    101, 115, 107, 116, 111, 112, 
+     92,  75, 111, 108, 106,  97, 
+     45,  83, 116, 114, 111, 104, 
+    109,  45,  71,  97, 109, 101, 
+    115,  92,  65, 108, 108, 103, 
+    101, 109, 101, 105, 110,  92, 
+     70, 114,  97, 109, 101, 119, 
+    111, 114, 107,  92,  68,  88, 
+     49,  49,  86, 101, 114, 116, 
+    101, 120,  83, 104,  97, 100, 
+    101, 114,  46, 104, 108, 115, 
+    108,   0, 254, 239, 254, 239, 
+      1,   0,   0,   0,   1,   0, 
+      0,   0,   0,   1,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255,  12,   0, 255, 255, 255, 
+    255, 255, 255, 255, 255, 255, 
+    255,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+     16,   0,   0,   0,  32,   0, 
+      0,   0, 221,   0,   0,   0, 
+      0,   2,   0,   0, 119,   1, 
+      0,   0,  56,   0,   0,   0, 
+      0,   0,   0,   0,  16,   8, 
+      0,   0, 128,   0,   0,   0, 
+     53,   7,   0,   0, 104,   8, 
+      0,   0,  68,   0,   0,   0, 
+      0,   0,   0,   0,  40,   0, 
+      0,   0,  68,   2,   0,   0, 
+     44,   0,   0,   0, 132,   0, 
+      0,   0,   3,   0,   0,   0, 
+     29,   0,   0,   0,  19,   0, 
+      0,   0,  30,   0,   0,   0, 
+     20,   0,   0,   0,  12,   0, 
+      0,   0,   6,   0,   0,   0, 
+     21,   0,   0,   0,  22,   0, 
+      0,   0,  23,   0,   0,   0, 
+     13,   0,   0,   0,   8,   0, 
+      0,   0,   9,   0,   0,   0, 
+     10,   0,   0,   0,  11,   0, 
+      0,   0,  14,   0,   0,   0, 
+     15,   0,   0,   0,  16,   0, 
+      0,   0,  17,   0,   0,   0, 
+     18,   0,   0,   0,   7,   0, 
+      0,   0,  24,   0,   0,   0, 
+     25,   0,   0,   0,  26,   0, 
+      0,   0,  28,   0,   0,   0, 
+     27,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,  31,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
       0,   0,   0,   0,   0,   0, 
       0,   0,   0,   0,   0,   0, 
       0,   0,   0,   0,   0,   0, 
@@ -399,5 +3440,5 @@ const BYTE UIVertexShader[] =
       0,   0,   0,   0,   0,   0, 
       0,   0,   0,   0,   0,   0, 
       0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0
+      0,   0
 };