diff --git a/common/KVMFR.h b/common/KVMFR.h index 7576ea6e..a884206f 100644 --- a/common/KVMFR.h +++ b/common/KVMFR.h @@ -21,12 +21,13 @@ Place, Suite 330, Boston, MA 02111-1307 USA #include #define KVMFR_HEADER_MAGIC "[[KVMFR]]" -#define KVMFR_HEADER_VERSION 6 +#define KVMFR_HEADER_VERSION 7 typedef enum FrameType { FRAME_TYPE_INVALID , FRAME_TYPE_ARGB , // ABGR interleaved: A,R,G,B 32bpp + FRAME_TYPE_NV12 , // NV12 FRAME_TYPE_H264 , // H264 compressed FRAME_TYPE_MAX , // sentinel value } diff --git a/host/Capture/DXGI.cpp b/host/Capture/DXGI.cpp index fef153ad..2d704958 100644 --- a/host/Capture/DXGI.cpp +++ b/host/Capture/DXGI.cpp @@ -120,6 +120,7 @@ bool DXGI::Initialize(CaptureOptions * options) D3D_FEATURE_LEVEL_9_1 }; + #define DEBUG 1 #if DEBUG #define CREATE_FLAGS (D3D11_CREATE_DEVICE_DEBUG) #else @@ -147,30 +148,29 @@ bool DXGI::Initialize(CaptureOptions * options) return false; } - bool h264 = false; + + m_frameType = FRAME_TYPE_ARGB; for(CaptureOptions::const_iterator it = m_options->cbegin(); it != m_options->cend(); ++it) { - if (_stricmp(*it, "h264") == 0) h264 = true; + if (_stricmp(*it, "h264") == 0) m_frameType = FRAME_TYPE_H264; + if (_stricmp(*it, "nv12") == 0) m_frameType = FRAME_TYPE_NV12; } - if (h264) - { + if (m_frameType == FRAME_TYPE_H264) DEBUG_WARN("Enabling experimental H.264 compression"); - m_frameType = FRAME_TYPE_H264; - if (!InitH264Capture()) - { - DeInitialize(); - return false; - } - } - else + + bool ok = false; + switch (m_frameType) { - m_frameType = FRAME_TYPE_ARGB; - if (!InitRawCapture()) - { - DeInitialize(); - return false; - } + case FRAME_TYPE_ARGB: ok = InitRawCapture (); break; + case FRAME_TYPE_NV12: ok = InitNV12Capture(); break; + case FRAME_TYPE_H264: ok = InitH264Capture(); break; + } + + if (!ok) + { + DeInitialize(); + return false; } IDXGIDevicePtr dxgi; @@ -231,15 +231,45 @@ bool DXGI::InitRawCapture() return true; } -bool DXGI::InitH264Capture() +bool DXGI::InitNV12Capture() { - m_h264 = new MFT::H264(); - if (!m_h264->Initialize(m_device, m_width, m_height)) + D3D11_TEXTURE2D_DESC texDesc; + ZeroMemory(&texDesc, sizeof(texDesc)); + texDesc.Width = m_width; + texDesc.Height = m_height; + texDesc.MipLevels = 1; + texDesc.ArraySize = 1; + texDesc.SampleDesc.Count = 1; + texDesc.SampleDesc.Quality = 0; + texDesc.Usage = D3D11_USAGE_STAGING; + texDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM; + texDesc.BindFlags = 0; + texDesc.CPUAccessFlags = D3D11_CPU_ACCESS_READ; + texDesc.MiscFlags = 0; + + HRESULT status = m_device->CreateTexture2D(&texDesc, NULL, &m_texture); + if (FAILED(status)) { - delete m_h264; - m_h264 = NULL; + DEBUG_WINERROR("Failed to create texture", status); return false; } + + m_textureConverter = new TextureConverter(); + if (!m_textureConverter->Initialize(m_deviceContext, m_device, m_width, m_height, DXGI_FORMAT_NV12)) + return false; + + return true; +} + +bool DXGI::InitH264Capture() +{ + m_textureConverter = new TextureConverter(); + if (!m_textureConverter->Initialize(m_deviceContext, m_device, m_width, m_height, DXGI_FORMAT_NV12)) + return false; + + m_h264 = new MFT::H264(); + if (!m_h264->Initialize(m_device, m_width, m_height)) + return false; return true; } @@ -252,6 +282,12 @@ void DXGI::DeInitialize() m_h264 = NULL; } + if (m_textureConverter) + { + delete m_textureConverter; + m_textureConverter = NULL; + } + ReleaseFrame(); if (m_pointer) @@ -500,6 +536,57 @@ GrabStatus Capture::DXGI::GrabFrameRaw(FrameInfo & frame, struct CursorInfo & cu return GRAB_STATUS_OK; } +GrabStatus Capture::DXGI::GrabFrameNV12(struct FrameInfo & frame, struct CursorInfo & cursor) +{ + GrabStatus result; + ID3D11Texture2DPtr texture; + bool timeout; + + result = GrabFrameTexture(frame, cursor, texture, timeout); + if (timeout) + return GRAB_STATUS_TIMEOUT; + + if (result != GRAB_STATUS_OK) + return result; + + if (!m_textureConverter->Convert(texture)) + { + SafeRelease(&texture); + return GRAB_STATUS_ERROR; + } + + if (m_surfaceMapped) + { + m_deviceContext->Unmap(m_texture, 0); + m_surfaceMapped = false; + } + + m_deviceContext->CopyResource(m_texture, texture); + SafeRelease(&texture); + + result = ReleaseFrame(); + if (result != GRAB_STATUS_OK) + return result; + + HRESULT status; + status = m_deviceContext->Map(m_texture, 0, D3D11_MAP_READ, 0, &m_mapping); + if (FAILED(status)) + { + DEBUG_WINERROR("Failed to map the texture", status); + DeInitialize(); + return GRAB_STATUS_ERROR; + } + m_surfaceMapped = true; + + frame.pitch = m_mapping.RowPitch; + frame.stride = m_mapping.RowPitch >> 2; + + const unsigned int size = m_height * m_mapping.RowPitch; + memcpySSE(frame.buffer, m_mapping.pData, LG_MIN(size, frame.bufferSize)); + + return GRAB_STATUS_OK; +} + GrabStatus Capture::DXGI::GrabFrameH264(struct FrameInfo & frame, struct CursorInfo & cursor) { while(true) @@ -515,22 +602,24 @@ GrabStatus Capture::DXGI::GrabFrameH264(struct FrameInfo & frame, struct CursorI bool timeout; result = GrabFrameTexture(frame, cursor, texture, timeout); - if (timeout) - { - // FIXME: this is wrong, we need to encode the last frame again - return GRAB_STATUS_TIMEOUT; - } - if (result != GRAB_STATUS_OK) { ReleaseFrame(); - return result; + continue; + } + + if (!timeout) + { + if (!m_textureConverter->Convert(texture)) + { + SafeRelease(&texture); + return GRAB_STATUS_ERROR; + } } if (!m_h264->ProvideFrame(texture)) return GRAB_STATUS_ERROR; - SafeRelease(&texture); ReleaseFrame(); } @@ -549,8 +638,10 @@ GrabStatus DXGI::GrabFrame(struct FrameInfo & frame, struct CursorInfo & cursor) frame.width = m_width; frame.height = m_height; - if (m_frameType == FRAME_TYPE_H264) - return GrabFrameH264(frame, cursor); - else - return GrabFrameRaw(frame, cursor); + switch (m_frameType) + { + case FRAME_TYPE_ARGB: return GrabFrameRaw (frame, cursor); + case FRAME_TYPE_NV12: return GrabFrameNV12(frame, cursor); + case FRAME_TYPE_H264: return GrabFrameH264(frame, cursor); + } } \ No newline at end of file diff --git a/host/Capture/DXGI.h b/host/Capture/DXGI.h index 3f6048e2..452e47b1 100644 --- a/host/Capture/DXGI.h +++ b/host/Capture/DXGI.h @@ -21,6 +21,7 @@ Place, Suite 330, Boston, MA 02111-1307 USA #include "ICapture.h" #include "Com.h" +#include "TextureConverter.h" #include "MFT/H264.h" #define W32_LEAN_AND_MEAN @@ -59,11 +60,13 @@ namespace Capture private: bool InitRawCapture(); + bool InitNV12Capture(); bool InitH264Capture(); GrabStatus GrabFrameTexture(struct FrameInfo & frame, struct CursorInfo & cursor, ID3D11Texture2DPtr & texture, bool & timeout); GrabStatus ReleaseFrame(); GrabStatus GrabFrameRaw (struct FrameInfo & frame, struct CursorInfo & cursor); + GrabStatus GrabFrameNV12 (struct FrameInfo & frame, struct CursorInfo & cursor); GrabStatus GrabFrameH264 (struct FrameInfo & frame, struct CursorInfo & cursor); CaptureOptions * m_options; @@ -83,6 +86,7 @@ namespace Capture ID3D11Texture2DPtr m_texture; D3D11_MAPPED_SUBRESOURCE m_mapping; bool m_surfaceMapped; + TextureConverter * m_textureConverter; MFT::H264 * m_h264; BYTE * m_pointer; diff --git a/host/Com.h b/host/Com.h index dbfdd602..38f4bfb5 100644 --- a/host/Com.h +++ b/host/Com.h @@ -23,27 +23,36 @@ Place, Suite 330, Boston, MA 02111-1307 USA #include #include -_COM_SMARTPTR_TYPEDEF(IDXGIFactory1 , __uuidof(IDXGIFactory1 )); -_COM_SMARTPTR_TYPEDEF(ID3D11Device , __uuidof(ID3D11Device )); -_COM_SMARTPTR_TYPEDEF(ID3D11DeviceContext , __uuidof(ID3D11DeviceContext )); -_COM_SMARTPTR_TYPEDEF(IDXGIDevice , __uuidof(IDXGIDevice )); -_COM_SMARTPTR_TYPEDEF(IDXGIOutput1 , __uuidof(IDXGIOutput1 )); -_COM_SMARTPTR_TYPEDEF(IDXGIOutput , __uuidof(IDXGIOutput )); -_COM_SMARTPTR_TYPEDEF(IDXGIAdapter1 , __uuidof(IDXGIAdapter1 )); -_COM_SMARTPTR_TYPEDEF(IDXGIOutputDuplication, __uuidof(IDXGIOutputDuplication)); -_COM_SMARTPTR_TYPEDEF(ID3D11Texture2D , __uuidof(ID3D11Texture2D )); -_COM_SMARTPTR_TYPEDEF(IDXGIResource , __uuidof(IDXGIResource )); +_COM_SMARTPTR_TYPEDEF(IDXGIFactory1 , __uuidof(IDXGIFactory1 )); +_COM_SMARTPTR_TYPEDEF(ID3D11Device , __uuidof(ID3D11Device )); +_COM_SMARTPTR_TYPEDEF(ID3D11DeviceContext , __uuidof(ID3D11DeviceContext )); +_COM_SMARTPTR_TYPEDEF(IDXGIDevice , __uuidof(IDXGIDevice )); +_COM_SMARTPTR_TYPEDEF(IDXGIOutput1 , __uuidof(IDXGIOutput1 )); +_COM_SMARTPTR_TYPEDEF(IDXGIOutput , __uuidof(IDXGIOutput )); +_COM_SMARTPTR_TYPEDEF(IDXGIAdapter1 , __uuidof(IDXGIAdapter1 )); +_COM_SMARTPTR_TYPEDEF(IDXGIOutputDuplication , __uuidof(IDXGIOutputDuplication )); +_COM_SMARTPTR_TYPEDEF(ID3D11Texture2D , __uuidof(ID3D11Texture2D )); +_COM_SMARTPTR_TYPEDEF(IDXGIResource , __uuidof(IDXGIResource )); -_COM_SMARTPTR_TYPEDEF(ID3D10Multithread , __uuidof(ID3D10Multithread )); -_COM_SMARTPTR_TYPEDEF(IMFActivate , __uuidof(IMFActivate )); -_COM_SMARTPTR_TYPEDEF(IMFAttributes , __uuidof(IMFAttributes )); -_COM_SMARTPTR_TYPEDEF(IMFDXGIDeviceManager , __uuidof(IMFDXGIDeviceManager )); -_COM_SMARTPTR_TYPEDEF(IMFTransform , __uuidof(IMFTransform )); -_COM_SMARTPTR_TYPEDEF(IMFMediaEventGenerator, __uuidof(IMFMediaEventGenerator)); -_COM_SMARTPTR_TYPEDEF(IMFMediaType , __uuidof(IMFMediaType )); -_COM_SMARTPTR_TYPEDEF(IMFSample , __uuidof(IMFSample )); -_COM_SMARTPTR_TYPEDEF(IMFMediaBuffer , __uuidof(IMFMediaBuffer )); -_COM_SMARTPTR_TYPEDEF(IMF2DBuffer , __uuidof(IMF2DBuffer )); +_COM_SMARTPTR_TYPEDEF(ID3D10Multithread , __uuidof(ID3D10Multithread )); +_COM_SMARTPTR_TYPEDEF(IMFActivate , __uuidof(IMFActivate )); +_COM_SMARTPTR_TYPEDEF(IMFAttributes , __uuidof(IMFAttributes )); +_COM_SMARTPTR_TYPEDEF(IMFDXGIDeviceManager , __uuidof(IMFDXGIDeviceManager )); +_COM_SMARTPTR_TYPEDEF(IMFTransform , __uuidof(IMFTransform )); +_COM_SMARTPTR_TYPEDEF(IMFMediaEventGenerator , __uuidof(IMFMediaEventGenerator )); +_COM_SMARTPTR_TYPEDEF(IMFMediaType , __uuidof(IMFMediaType )); +_COM_SMARTPTR_TYPEDEF(IMFSample , __uuidof(IMFSample )); +_COM_SMARTPTR_TYPEDEF(IMFMediaBuffer , __uuidof(IMFMediaBuffer )); +_COM_SMARTPTR_TYPEDEF(IMF2DBuffer , __uuidof(IMF2DBuffer )); + +_COM_SMARTPTR_TYPEDEF(ID3D11RenderTargetView , __uuidof(ID3D11RenderTargetView )); +_COM_SMARTPTR_TYPEDEF(ID3D11ShaderResourceView, __uuidof(ID3D11ShaderResourceView)); +_COM_SMARTPTR_TYPEDEF(ID3D11DepthStencilView , __uuidof(ID3D11DepthStencilView )); +_COM_SMARTPTR_TYPEDEF(ID3D11InputLayout , __uuidof(ID3D11InputLayout )); +_COM_SMARTPTR_TYPEDEF(ID3D11VertexShader , __uuidof(ID3D11VertexShader )); +_COM_SMARTPTR_TYPEDEF(ID3D11PixelShader , __uuidof(ID3D11PixelShader )); +_COM_SMARTPTR_TYPEDEF(ID3D11SamplerState , __uuidof(ID3D11SamplerState )); +_COM_SMARTPTR_TYPEDEF(ID3D11Buffer , __uuidof(ID3D11Buffer )); template void SafeRelease(T **ppT) diff --git a/host/MFT/H264.cpp b/host/MFT/H264.cpp index cae9ef44..dcaf85f8 100644 --- a/host/MFT/H264.cpp +++ b/host/MFT/H264.cpp @@ -58,7 +58,6 @@ MFT::H264::~H264() bool MFT::H264::Initialize(ID3D11DevicePtr device, unsigned int width, unsigned int height) { DeInitialize(); - HRESULT status; MFT_REGISTER_TYPE_INFO typeInfo; @@ -348,12 +347,7 @@ bool MFT::H264::GetFrame(void * buffer, const size_t bufferSize, unsigned int & } DWORD outStatus; - MFT_OUTPUT_DATA_BUFFER outDataBuffer; - outDataBuffer.dwStreamID = 0; - outDataBuffer.dwStatus = 0; - outDataBuffer.pEvents = NULL; - outDataBuffer.pSample = NULL; - + MFT_OUTPUT_DATA_BUFFER outDataBuffer = { 0 }; status = m_mfTransform->ProcessOutput(0, 1, &outDataBuffer, &outStatus); if (FAILED(status)) { @@ -362,17 +356,17 @@ bool MFT::H264::GetFrame(void * buffer, const size_t bufferSize, unsigned int & } IMFMediaBufferPtr mb; - MFCreateAlignedMemoryBuffer((DWORD)bufferSize, MF_128_BYTE_ALIGNMENT, &mb); - outDataBuffer.pSample->CopyToBuffer(mb); - SafeRelease(&outDataBuffer.pEvents); - SafeRelease(&outDataBuffer.pSample); + outDataBuffer.pSample->ConvertToContiguousBuffer(&mb); BYTE *pixels; DWORD maxLen, curLen; - mb->Lock(&pixels, &maxLen, &curLen); - memcpySSE(buffer, pixels, curLen); + mb->Lock(&pixels, NULL, &curLen); + memcpy(buffer, pixels, curLen); mb->Unlock(); + SafeRelease(&mb); + SafeRelease(&outDataBuffer.pSample); + SafeRelease(&outDataBuffer.pEvents); dataLen = curLen; return true; diff --git a/host/Shaders/BGRAtoNV12.h b/host/Shaders/BGRAtoNV12.h new file mode 100644 index 00000000..5cfca896 --- /dev/null +++ b/host/Shaders/BGRAtoNV12.h @@ -0,0 +1,3163 @@ +#if 0 +// +// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384 +// +// +// Resource Bindings: +// +// Name Type Format Dim Slot Elements +// ------------------------------ ---------- ------- ----------- ---- -------- +// texSampler sampler NA NA 0 1 +// texTexture texture float4 2d 0 1 +// +// +// +// Input signature: +// +// Name Index Mask Register SysValue Format Used +// -------------------- ----- ------ -------- -------- ------- ------ +// SV_Position 0 xyzw 0 POS float +// TEXCOORD 0 xy 1 NONE float xy +// +// +// Output signature: +// +// Name Index Mask Register SysValue Format Used +// -------------------- ----- ------ -------- -------- ------- ------ +// SV_TARGET 0 xyzw 0 TARGET float xyzw +// +// +// Sampler/Resource to DX9 shader sampler mappings: +// +// Target Sampler Source Sampler Source Resource +// -------------- --------------- ---------------- +// s0 s0 t0 +// +// +// Level9 shader bytecode: +// + ps_2_x + def c0, 0.212599993, 0.715200007, 0.0722000003, 0.538909256 + def c1, 0.635001242, 0.5, 0, 0 + dcl t0.xy // input<4,5> + dcl_2d s0 + +#line 23 "C:\Users\Geoffrey McRae\Documents\Visual Studio 2015\Projects\LookingGlass\host\Shaders\BGRAtoNV12.hlsl" + texld r0, t0, s0 // ::rgba<0,1,2,3> + nop + mov r0, r0 // RGBtoYUV::rgba<0,1,2,3> + +#line 13 + mul r1.w, r0.x, c0.x + mul r0.y, r0.y, c0.y + add r0.y, r0.y, r1.w + mul r1.x, r0.z, c0.z + add r1.x, r0.y, r1.x // ::yuva<0> + mov r0.y, -r1.x + add r0.y, r0.y, r0.z + mul r0.y, r0.y, c0.w // ::yuva<1> + mov r2.w, -r1.x + add r0.x, r0.x, r2.w + mul r0.z, r0.x, c1.x // ::yuva<2> + mov r1.w, r0.w // ::yuva<3> + add r1.yz, r0, c1.y // ::yuva<1,2> + mov r1.x, r1.x // ::RGBtoYUV<0> + mov r1.yz, r1 // ::RGBtoYUV<1,2> + mov r1.w, r1.w // ::RGBtoYUV<3> + +#line 24 + mov r1, r1 // ::yuva<0,1,2,3> + mov r1, r1 // ::main<0,1,2,3> + +#line 21 + mov oC0, r1 // ::main<0,1,2,3> + +// approximately 21 instruction slots used (1 texture, 20 arithmetic) +ps_4_0 +dcl_sampler s0, mode_default +dcl_resource_texture2d (float,float,float,float) t0 +dcl_input_ps linear v1.xy +dcl_output o0.xyzw +dcl_temps 3 +// +// Initial variable locations: +// v0.x <- input.pos.x; v0.y <- input.pos.y; v0.z <- input.pos.z; v0.w <- input.pos.w; +// v1.x <- input.tex.x; v1.y <- input.tex.y; +// o0.x <-
.x; o0.y <-
.y; o0.z <-
.z; o0.w <-
.w +// +#line 23 "C:\Users\Geoffrey McRae\Documents\Visual Studio 2015\Projects\LookingGlass\host\Shaders\BGRAtoNV12.hlsl" +sample r0.xyzw, v1.xyxx, t0.xyzw, s0 // r0.x <- rgba.x; r0.y <- rgba.y; r0.z <- rgba.z; r0.w <- rgba.w +nop +mov r0.xyzw, r0.xyzw + +#line 13 +mul r1.x, r0.x, l(0.212600) +mul r0.y, r0.y, l(0.715200) +add r0.y, r0.y, r1.x +mul r1.x, r0.z, l(0.072200) +add r1.x, r0.y, r1.x // r1.x <- yuva.x +mov r0.y, -r1.x +add r0.y, r0.y, r0.z +div r0.y, r0.y, l(1.855600) // r0.y <- yuva.y +mov r2.x, -r1.x +add r0.x, r0.x, r2.x +div r0.z, r0.x, l(1.574800) // r0.z <- yuva.z +mov r1.w, r0.w // r1.w <- yuva.w +add r1.yz, r0.yyzy, l(0.000000, 0.500000, 0.500000, 0.000000) // r1.y <- yuva.y; r1.z <- yuva.z +mov r1.x, r1.x // r1.x <- .x +mov r1.yz, r1.yyzy // r1.y <- .y; r1.z <- .z +mov r1.w, r1.w // r1.w <- .w + +#line 24 +mov r1.xyzw, r1.xyzw // r1.x <- yuva.x; r1.y <- yuva.y; r1.z <- yuva.z; r1.w <- yuva.w +mov o0.xyzw, r1.xyzw +ret +// Approximately 22 instruction slots used +#endif + +const BYTE g_BGRAtoNV12[] = +{ + 68, 88, 66, 67, 124, 188, + 104, 3, 95, 155, 203, 160, + 241, 185, 204, 54, 224, 220, + 73, 249, 1, 0, 0, 0, + 80, 71, 0, 0, 7, 0, + 0, 0, 60, 0, 0, 0, + 60, 5, 0, 0, 148, 7, + 0, 0, 156, 69, 0, 0, + 24, 70, 0, 0, 196, 70, + 0, 0, 28, 71, 0, 0, + 65, 111, 110, 57, 248, 4, + 0, 0, 248, 4, 0, 0, + 0, 2, 255, 255, 208, 4, + 0, 0, 40, 0, 0, 0, + 0, 0, 40, 0, 0, 0, + 40, 0, 0, 0, 40, 0, + 1, 0, 36, 0, 0, 0, + 40, 0, 0, 0, 0, 0, + 1, 2, 255, 255, 254, 255, + 212, 0, 68, 66, 85, 71, + 40, 0, 0, 0, 24, 3, + 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 144, 0, + 0, 0, 26, 0, 0, 0, + 148, 0, 0, 0, 7, 0, + 0, 0, 140, 2, 0, 0, + 164, 1, 0, 0, 67, 58, + 92, 85, 115, 101, 114, 115, + 92, 71, 101, 111, 102, 102, + 114, 101, 121, 32, 77, 99, + 82, 97, 101, 92, 68, 111, + 99, 117, 109, 101, 110, 116, + 115, 92, 86, 105, 115, 117, + 97, 108, 32, 83, 116, 117, + 100, 105, 111, 32, 50, 48, + 49, 53, 92, 80, 114, 111, + 106, 101, 99, 116, 115, 92, + 76, 111, 111, 107, 105, 110, + 103, 71, 108, 97, 115, 115, + 92, 104, 111, 115, 116, 92, + 83, 104, 97, 100, 101, 114, + 115, 92, 66, 71, 82, 65, + 116, 111, 78, 86, 49, 50, + 46, 104, 108, 115, 108, 0, + 40, 0, 0, 0, 0, 0, + 255, 255, 88, 3, 0, 0, + 0, 0, 255, 255, 112, 3, + 0, 0, 0, 0, 255, 255, + 136, 3, 0, 0, 0, 0, + 255, 255, 148, 3, 0, 0, + 23, 0, 0, 0, 160, 3, + 0, 0, 24, 0, 0, 0, + 176, 3, 0, 0, 24, 0, + 0, 0, 180, 3, 0, 0, + 13, 0, 0, 0, 192, 3, + 0, 0, 13, 0, 0, 0, + 208, 3, 0, 0, 13, 0, + 0, 0, 224, 3, 0, 0, + 13, 0, 0, 0, 240, 3, + 0, 0, 13, 0, 0, 0, + 0, 4, 0, 0, 14, 0, + 0, 0, 16, 4, 0, 0, + 14, 0, 0, 0, 28, 4, + 0, 0, 14, 0, 0, 0, + 44, 4, 0, 0, 15, 0, + 0, 0, 60, 4, 0, 0, + 15, 0, 0, 0, 72, 4, + 0, 0, 15, 0, 0, 0, + 88, 4, 0, 0, 16, 0, + 0, 0, 104, 4, 0, 0, + 17, 0, 0, 0, 116, 4, + 0, 0, 18, 0, 0, 0, + 132, 4, 0, 0, 18, 0, + 0, 0, 144, 4, 0, 0, + 18, 0, 0, 0, 156, 4, + 0, 0, 24, 0, 0, 0, + 168, 4, 0, 0, 25, 0, + 0, 0, 180, 4, 0, 0, + 21, 0, 0, 0, 192, 4, + 0, 0, 82, 71, 66, 116, + 111, 89, 85, 86, 0, 171, + 171, 171, 1, 0, 3, 0, + 1, 0, 4, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 20, 0, 0, 0, 0, 0, + 255, 255, 255, 255, 255, 255, + 21, 0, 0, 0, 255, 255, + 1, 0, 2, 0, 255, 255, + 22, 0, 0, 0, 255, 255, + 255, 255, 255, 255, 3, 0, + 109, 97, 105, 110, 0, 105, + 110, 112, 117, 116, 0, 112, + 111, 115, 0, 171, 1, 0, + 3, 0, 1, 0, 4, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 116, 101, 120, 0, + 1, 0, 3, 0, 1, 0, + 2, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 175, 1, + 0, 0, 180, 1, 0, 0, + 196, 1, 0, 0, 200, 1, + 0, 0, 5, 0, 0, 0, + 1, 0, 6, 0, 1, 0, + 2, 0, 216, 1, 0, 0, + 2, 0, 0, 0, 4, 0, + 5, 0, 255, 255, 255, 255, + 24, 0, 0, 0, 0, 0, + 1, 0, 2, 0, 3, 0, + 25, 0, 0, 0, 0, 0, + 1, 0, 2, 0, 3, 0, + 114, 103, 98, 97, 0, 171, + 171, 171, 6, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 3, 0, 4, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 3, 0, 121, 117, 118, 97, + 0, 171, 171, 171, 11, 0, + 0, 0, 0, 0, 255, 255, + 255, 255, 255, 255, 14, 0, + 0, 0, 255, 255, 1, 0, + 255, 255, 255, 255, 17, 0, + 0, 0, 255, 255, 255, 255, + 2, 0, 255, 255, 18, 0, + 0, 0, 255, 255, 255, 255, + 255, 255, 3, 0, 19, 0, + 0, 0, 255, 255, 1, 0, + 2, 0, 255, 255, 23, 0, + 0, 0, 0, 0, 1, 0, + 2, 0, 3, 0, 0, 0, + 0, 0, 100, 1, 0, 0, + 112, 1, 0, 0, 3, 0, + 0, 0, 128, 1, 0, 0, + 164, 1, 0, 0, 169, 1, + 0, 0, 232, 1, 0, 0, + 1, 0, 0, 0, 248, 1, + 0, 0, 0, 0, 0, 0, + 164, 1, 0, 0, 112, 1, + 0, 0, 2, 0, 0, 0, + 4, 2, 0, 0, 100, 1, + 0, 0, 28, 2, 0, 0, + 180, 1, 0, 0, 1, 0, + 0, 0, 36, 2, 0, 0, + 0, 0, 0, 0, 28, 2, + 0, 0, 112, 1, 0, 0, + 1, 0, 0, 0, 48, 2, + 0, 0, 0, 0, 0, 0, + 60, 2, 0, 0, 180, 1, + 0, 0, 5, 0, 0, 0, + 68, 2, 0, 0, 0, 0, + 0, 0, 60, 2, 0, 0, + 112, 1, 0, 0, 1, 0, + 0, 0, 128, 2, 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, 54, + 46, 51, 46, 57, 54, 48, + 48, 46, 49, 54, 51, 56, + 52, 0, 171, 171, 81, 0, + 0, 5, 0, 0, 15, 160, + 208, 179, 89, 62, 89, 23, + 55, 63, 152, 221, 147, 61, + 245, 245, 9, 63, 81, 0, + 0, 5, 1, 0, 15, 160, + 113, 143, 34, 63, 0, 0, + 0, 63, 0, 0, 0, 0, + 0, 0, 0, 0, 31, 0, + 0, 2, 0, 0, 0, 128, + 0, 0, 3, 176, 31, 0, + 0, 2, 0, 0, 0, 144, + 0, 8, 15, 160, 66, 0, + 0, 3, 0, 0, 15, 128, + 0, 0, 228, 176, 0, 8, + 228, 160, 0, 0, 0, 0, + 1, 0, 0, 2, 0, 0, + 15, 128, 0, 0, 228, 128, + 5, 0, 0, 3, 1, 0, + 8, 128, 0, 0, 0, 128, + 0, 0, 0, 160, 5, 0, + 0, 3, 0, 0, 2, 128, + 0, 0, 85, 128, 0, 0, + 85, 160, 2, 0, 0, 3, + 0, 0, 2, 128, 0, 0, + 85, 128, 1, 0, 255, 128, + 5, 0, 0, 3, 1, 0, + 1, 128, 0, 0, 170, 128, + 0, 0, 170, 160, 2, 0, + 0, 3, 1, 0, 1, 128, + 0, 0, 85, 128, 1, 0, + 0, 128, 1, 0, 0, 2, + 0, 0, 2, 128, 1, 0, + 0, 129, 2, 0, 0, 3, + 0, 0, 2, 128, 0, 0, + 85, 128, 0, 0, 170, 128, + 5, 0, 0, 3, 0, 0, + 2, 128, 0, 0, 85, 128, + 0, 0, 255, 160, 1, 0, + 0, 2, 2, 0, 8, 128, + 1, 0, 0, 129, 2, 0, + 0, 3, 0, 0, 1, 128, + 0, 0, 0, 128, 2, 0, + 255, 128, 5, 0, 0, 3, + 0, 0, 4, 128, 0, 0, + 0, 128, 1, 0, 0, 160, + 1, 0, 0, 2, 1, 0, + 8, 128, 0, 0, 255, 128, + 2, 0, 0, 3, 1, 0, + 6, 128, 0, 0, 228, 128, + 1, 0, 85, 160, 1, 0, + 0, 2, 1, 0, 1, 128, + 1, 0, 0, 128, 1, 0, + 0, 2, 1, 0, 6, 128, + 1, 0, 228, 128, 1, 0, + 0, 2, 1, 0, 8, 128, + 1, 0, 255, 128, 1, 0, + 0, 2, 1, 0, 15, 128, + 1, 0, 228, 128, 1, 0, + 0, 2, 1, 0, 15, 128, + 1, 0, 228, 128, 1, 0, + 0, 2, 0, 8, 15, 128, + 1, 0, 228, 128, 255, 255, + 0, 0, 83, 72, 68, 82, + 80, 2, 0, 0, 64, 0, + 0, 0, 148, 0, 0, 0, + 90, 0, 0, 3, 0, 96, + 16, 0, 0, 0, 0, 0, + 88, 24, 0, 4, 0, 112, + 16, 0, 0, 0, 0, 0, + 85, 85, 0, 0, 98, 16, + 0, 3, 50, 16, 16, 0, + 1, 0, 0, 0, 101, 0, + 0, 3, 242, 32, 16, 0, + 0, 0, 0, 0, 104, 0, + 0, 2, 3, 0, 0, 0, + 69, 0, 0, 9, 242, 0, + 16, 0, 0, 0, 0, 0, + 70, 16, 16, 0, 1, 0, + 0, 0, 70, 126, 16, 0, + 0, 0, 0, 0, 0, 96, + 16, 0, 0, 0, 0, 0, + 58, 0, 0, 1, 54, 0, + 0, 5, 242, 0, 16, 0, + 0, 0, 0, 0, 70, 14, + 16, 0, 0, 0, 0, 0, + 56, 0, 0, 7, 18, 0, + 16, 0, 1, 0, 0, 0, + 10, 0, 16, 0, 0, 0, + 0, 0, 1, 64, 0, 0, + 208, 179, 89, 62, 56, 0, + 0, 7, 34, 0, 16, 0, + 0, 0, 0, 0, 26, 0, + 16, 0, 0, 0, 0, 0, + 1, 64, 0, 0, 89, 23, + 55, 63, 0, 0, 0, 7, + 34, 0, 16, 0, 0, 0, + 0, 0, 26, 0, 16, 0, + 0, 0, 0, 0, 10, 0, + 16, 0, 1, 0, 0, 0, + 56, 0, 0, 7, 18, 0, + 16, 0, 1, 0, 0, 0, + 42, 0, 16, 0, 0, 0, + 0, 0, 1, 64, 0, 0, + 152, 221, 147, 61, 0, 0, + 0, 7, 18, 0, 16, 0, + 1, 0, 0, 0, 26, 0, + 16, 0, 0, 0, 0, 0, + 10, 0, 16, 0, 1, 0, + 0, 0, 54, 0, 0, 6, + 34, 0, 16, 0, 0, 0, + 0, 0, 10, 0, 16, 128, + 65, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 7, + 34, 0, 16, 0, 0, 0, + 0, 0, 26, 0, 16, 0, + 0, 0, 0, 0, 42, 0, + 16, 0, 0, 0, 0, 0, + 14, 0, 0, 7, 34, 0, + 16, 0, 0, 0, 0, 0, + 26, 0, 16, 0, 0, 0, + 0, 0, 1, 64, 0, 0, + 77, 132, 237, 63, 54, 0, + 0, 6, 18, 0, 16, 0, + 2, 0, 0, 0, 10, 0, + 16, 128, 65, 0, 0, 0, + 1, 0, 0, 0, 0, 0, + 0, 7, 18, 0, 16, 0, + 0, 0, 0, 0, 10, 0, + 16, 0, 0, 0, 0, 0, + 10, 0, 16, 0, 2, 0, + 0, 0, 14, 0, 0, 7, + 66, 0, 16, 0, 0, 0, + 0, 0, 10, 0, 16, 0, + 0, 0, 0, 0, 1, 64, + 0, 0, 12, 147, 201, 63, + 54, 0, 0, 5, 130, 0, + 16, 0, 1, 0, 0, 0, + 58, 0, 16, 0, 0, 0, + 0, 0, 0, 0, 0, 10, + 98, 0, 16, 0, 1, 0, + 0, 0, 86, 6, 16, 0, + 0, 0, 0, 0, 2, 64, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 63, 0, 0, + 0, 63, 0, 0, 0, 0, + 54, 0, 0, 5, 18, 0, + 16, 0, 1, 0, 0, 0, + 10, 0, 16, 0, 1, 0, + 0, 0, 54, 0, 0, 5, + 98, 0, 16, 0, 1, 0, + 0, 0, 86, 6, 16, 0, + 1, 0, 0, 0, 54, 0, + 0, 5, 130, 0, 16, 0, + 1, 0, 0, 0, 58, 0, + 16, 0, 1, 0, 0, 0, + 54, 0, 0, 5, 242, 0, + 16, 0, 1, 0, 0, 0, + 70, 14, 16, 0, 1, 0, + 0, 0, 54, 0, 0, 5, + 242, 32, 16, 0, 0, 0, + 0, 0, 70, 14, 16, 0, + 1, 0, 0, 0, 62, 0, + 0, 1, 83, 80, 68, 66, + 0, 62, 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, 31, 0, 0, 0, + 156, 0, 0, 0, 0, 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, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 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, 224, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 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, + 121, 169, 90, 91, 1, 0, + 0, 0, 179, 242, 207, 250, + 226, 64, 227, 73, 186, 206, + 192, 227, 242, 133, 240, 250, + 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, 65, 145, + 50, 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, 98, 32, + 61, 32, 40, 114, 103, 98, + 97, 46, 114, 32, 45, 32, + 121, 117, 118, 97, 46, 114, + 41, 32, 47, 32, 49, 46, + 53, 55, 52, 56, 59, 13, + 10, 32, 32, 121, 117, 118, + 97, 46, 97, 32, 61, 32, + 114, 103, 98, 97, 46, 97, + 59, 13, 10, 32, 32, 121, + 117, 118, 97, 46, 103, 98, + 32, 43, 61, 32, 48, 46, + 53, 59, 13, 10, 32, 32, + 114, 101, 116, 117, 114, 110, + 32, 121, 117, 118, 97, 59, + 13, 10, 125, 13, 10, 13, + 10, 102, 108, 111, 97, 116, + 52, 32, 109, 97, 105, 110, + 40, 86, 83, 32, 105, 110, + 112, 117, 116, 41, 32, 58, + 32, 83, 86, 95, 84, 65, + 82, 71, 69, 84, 13, 10, + 123, 13, 10, 32, 32, 99, + 111, 110, 115, 116, 32, 102, + 108, 111, 97, 116, 52, 32, + 114, 103, 98, 97, 32, 61, + 32, 116, 101, 120, 84, 101, + 120, 116, 117, 114, 101, 46, + 83, 97, 109, 112, 108, 101, + 40, 116, 101, 120, 83, 97, + 109, 112, 108, 101, 114, 44, + 32, 105, 110, 112, 117, 116, + 46, 116, 101, 120, 41, 59, + 13, 10, 32, 32, 99, 111, + 110, 115, 116, 32, 102, 108, + 111, 97, 116, 52, 32, 121, + 117, 118, 97, 32, 61, 32, + 82, 71, 66, 116, 111, 89, + 85, 86, 40, 114, 103, 98, + 97, 41, 59, 13, 10, 32, + 32, 114, 101, 116, 117, 114, + 110, 32, 121, 117, 118, 97, + 59, 13, 10, 125, 0, 7, + 0, 0, 0, 0, 0, 0, + 0, 105, 0, 0, 0, 0, + 0, 0, 0, 210, 0, 0, + 0, 1, 0, 0, 0, 106, + 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, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 119, 115, 0, 0, 47, 44, + 0, 0, 210, 103, 0, 0, + 135, 22, 0, 0, 210, 65, + 0, 0, 138, 110, 0, 0, + 173, 34, 0, 0, 120, 62, + 0, 0, 190, 125, 0, 0, + 123, 69, 0, 0, 131, 56, + 0, 0, 224, 19, 0, 0, + 77, 117, 0, 0, 33, 119, + 0, 0, 135, 50, 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, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 84, 101, 120, 116, + 117, 114, 101, 50, 68, 32, + 32, 32, 32, 116, 101, 120, + 84, 101, 120, 116, 117, 114, + 101, 59, 13, 10, 83, 97, + 109, 112, 108, 101, 114, 83, + 116, 97, 116, 101, 32, 116, + 101, 120, 83, 97, 109, 112, + 108, 101, 114, 59, 13, 10, + 13, 10, 115, 116, 114, 117, + 99, 116, 32, 86, 83, 13, + 10, 123, 13, 10, 32, 32, + 102, 108, 111, 97, 116, 52, + 32, 112, 111, 115, 32, 58, + 32, 83, 86, 95, 80, 111, + 115, 105, 116, 105, 111, 110, + 59, 13, 10, 32, 32, 102, + 108, 111, 97, 116, 50, 32, + 116, 101, 120, 32, 58, 32, + 84, 69, 88, 67, 79, 79, + 82, 68, 59, 13, 10, 125, + 59, 13, 10, 13, 10, 102, + 108, 111, 97, 116, 52, 32, + 82, 71, 66, 116, 111, 89, + 85, 86, 40, 102, 108, 111, + 97, 116, 52, 32, 114, 103, + 98, 97, 41, 13, 10, 123, + 13, 10, 32, 32, 102, 108, + 111, 97, 116, 52, 32, 121, + 117, 118, 97, 59, 13, 10, + 32, 32, 121, 117, 118, 97, + 46, 114, 32, 61, 32, 114, + 103, 98, 97, 46, 114, 32, + 42, 32, 48, 46, 50, 49, + 50, 54, 32, 43, 32, 48, + 46, 55, 49, 53, 50, 32, + 42, 32, 114, 103, 98, 97, + 46, 103, 32, 43, 32, 48, + 46, 48, 55, 50, 50, 32, + 42, 32, 114, 103, 98, 97, + 46, 98, 59, 13, 10, 32, + 32, 121, 117, 118, 97, 46, + 103, 32, 61, 32, 40, 114, + 103, 98, 97, 46, 98, 32, + 45, 32, 121, 117, 118, 97, + 46, 114, 41, 32, 47, 32, + 49, 46, 56, 53, 53, 54, + 59, 13, 10, 32, 32, 121, + 117, 118, 97, 46, 98, 32, + 61, 32, 40, 114, 103, 98, + 97, 46, 114, 32, 45, 32, + 121, 117, 118, 97, 46, 114, + 41, 32, 47, 32, 49, 46, + 53, 55, 52, 56, 59, 13, + 10, 32, 32, 121, 117, 118, + 97, 46, 97, 32, 61, 32, + 114, 103, 98, 97, 46, 97, + 59, 13, 10, 32, 32, 121, + 117, 118, 97, 46, 103, 98, + 32, 43, 61, 32, 48, 46, + 53, 59, 13, 10, 32, 32, + 114, 101, 116, 117, 114, 110, + 32, 121, 117, 118, 97, 59, + 13, 10, 125, 13, 10, 13, + 10, 102, 108, 111, 97, 116, + 52, 32, 109, 97, 105, 110, + 40, 86, 83, 32, 105, 110, + 112, 117, 116, 41, 32, 58, + 32, 83, 86, 95, 84, 65, + 82, 71, 69, 84, 13, 10, + 123, 13, 10, 32, 32, 99, + 111, 110, 115, 116, 32, 102, + 108, 111, 97, 116, 52, 32, + 114, 103, 98, 97, 32, 61, + 32, 116, 101, 120, 84, 101, + 120, 116, 117, 114, 101, 46, + 83, 97, 109, 112, 108, 101, + 40, 116, 101, 120, 83, 97, + 109, 112, 108, 101, 114, 44, + 32, 105, 110, 112, 117, 116, + 46, 116, 101, 120, 41, 59, + 13, 10, 32, 32, 99, 111, + 110, 115, 116, 32, 102, 108, + 111, 97, 116, 52, 32, 121, + 117, 118, 97, 32, 61, 32, + 82, 71, 66, 116, 111, 89, + 85, 86, 40, 114, 103, 98, + 97, 41, 59, 13, 10, 32, + 32, 114, 101, 116, 117, 114, + 110, 32, 121, 117, 118, 97, + 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, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 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, 241, 2, 0, 0, + 0, 67, 58, 92, 85, 115, + 101, 114, 115, 92, 71, 101, + 111, 102, 102, 114, 101, 121, + 32, 77, 99, 82, 97, 101, + 92, 68, 111, 99, 117, 109, + 101, 110, 116, 115, 92, 86, + 105, 115, 117, 97, 108, 32, + 83, 116, 117, 100, 105, 111, + 32, 50, 48, 49, 53, 92, + 80, 114, 111, 106, 101, 99, + 116, 115, 92, 76, 111, 111, + 107, 105, 110, 103, 71, 108, + 97, 115, 115, 92, 104, 111, + 115, 116, 92, 83, 104, 97, + 100, 101, 114, 115, 92, 66, + 71, 82, 65, 116, 111, 78, + 86, 49, 50, 46, 104, 108, + 115, 108, 0, 0, 99, 58, + 92, 117, 115, 101, 114, 115, + 92, 103, 101, 111, 102, 102, + 114, 101, 121, 32, 109, 99, + 114, 97, 101, 92, 100, 111, + 99, 117, 109, 101, 110, 116, + 115, 92, 118, 105, 115, 117, + 97, 108, 32, 115, 116, 117, + 100, 105, 111, 32, 50, 48, + 49, 53, 92, 112, 114, 111, + 106, 101, 99, 116, 115, 92, + 108, 111, 111, 107, 105, 110, + 103, 103, 108, 97, 115, 115, + 92, 104, 111, 115, 116, 92, + 115, 104, 97, 100, 101, 114, + 115, 92, 98, 103, 114, 97, + 116, 111, 110, 118, 49, 50, + 46, 104, 108, 115, 108, 0, + 84, 101, 120, 116, 117, 114, + 101, 50, 68, 32, 32, 32, + 32, 116, 101, 120, 84, 101, + 120, 116, 117, 114, 101, 59, + 13, 10, 83, 97, 109, 112, + 108, 101, 114, 83, 116, 97, + 116, 101, 32, 116, 101, 120, + 83, 97, 109, 112, 108, 101, + 114, 59, 13, 10, 13, 10, + 115, 116, 114, 117, 99, 116, + 32, 86, 83, 13, 10, 123, + 13, 10, 32, 32, 102, 108, + 111, 97, 116, 52, 32, 112, + 111, 115, 32, 58, 32, 83, + 86, 95, 80, 111, 115, 105, + 116, 105, 111, 110, 59, 13, + 10, 32, 32, 102, 108, 111, + 97, 116, 50, 32, 116, 101, + 120, 32, 58, 32, 84, 69, + 88, 67, 79, 79, 82, 68, + 59, 13, 10, 125, 59, 13, + 10, 13, 10, 102, 108, 111, + 97, 116, 52, 32, 82, 71, + 66, 116, 111, 89, 85, 86, + 40, 102, 108, 111, 97, 116, + 52, 32, 114, 103, 98, 97, + 41, 13, 10, 123, 13, 10, + 32, 32, 102, 108, 111, 97, + 116, 52, 32, 121, 117, 118, + 97, 59, 13, 10, 32, 32, + 121, 117, 118, 97, 46, 114, + 32, 61, 32, 114, 103, 98, + 97, 46, 114, 32, 42, 32, + 48, 46, 50, 49, 50, 54, + 32, 43, 32, 48, 46, 55, + 49, 53, 50, 32, 42, 32, + 114, 103, 98, 97, 46, 103, + 32, 43, 32, 48, 46, 48, + 55, 50, 50, 32, 42, 32, + 114, 103, 98, 97, 46, 98, + 59, 13, 10, 32, 32, 121, + 117, 118, 97, 46, 103, 32, + 61, 32, 40, 114, 103, 98, + 97, 46, 98, 32, 45, 32, + 121, 117, 118, 97, 46, 114, + 41, 32, 47, 32, 49, 46, + 56, 53, 53, 54, 59, 13, + 10, 32, 32, 121, 117, 118, + 97, 46, 27, 226, 48, 1, + 128, 0, 0, 0, 116, 233, + 69, 66, 104, 37, 212, 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, 106, 0, 0, 0, + 40, 0, 0, 0, 27, 226, + 48, 1, 211, 205, 208, 238, + 30, 2, 0, 0, 1, 0, + 0, 0, 105, 0, 0, 0, + 106, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 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, 74, 0, 60, 17, + 16, 1, 0, 0, 0, 1, + 6, 0, 3, 0, 0, 64, + 128, 37, 6, 0, 3, 0, + 0, 64, 128, 37, 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, 54, 46, 51, + 46, 57, 54, 48, 48, 46, + 49, 54, 51, 56, 52, 0, + 62, 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, + 112, 115, 95, 52, 95, 48, + 95, 108, 101, 118, 101, 108, + 95, 57, 95, 51, 0, 104, + 108, 115, 108, 69, 110, 116, + 114, 121, 0, 109, 97, 105, + 110, 0, 0, 0, 42, 0, + 16, 17, 0, 0, 0, 0, + 168, 5, 0, 0, 0, 0, + 0, 0, 12, 2, 0, 0, + 0, 0, 0, 0, 12, 2, + 0, 0, 6, 16, 0, 0, + 68, 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, + 68, 0, 0, 0, 1, 0, + 12, 2, 0, 0, 0, 0, + 22, 0, 80, 17, 1, 0, + 5, 0, 4, 0, 4, 0, + 68, 0, 0, 0, 1, 0, + 12, 2, 4, 0, 0, 0, + 22, 0, 80, 17, 1, 0, + 5, 0, 8, 0, 4, 0, + 68, 0, 0, 0, 1, 0, + 12, 2, 8, 0, 0, 0, + 22, 0, 80, 17, 1, 0, + 5, 0, 12, 0, 4, 0, + 68, 0, 0, 0, 1, 0, + 12, 2, 12, 0, 0, 0, + 22, 0, 80, 17, 1, 0, + 5, 0, 16, 0, 4, 0, + 68, 0, 0, 0, 1, 0, + 12, 2, 16, 0, 0, 0, + 22, 0, 80, 17, 1, 0, + 5, 0, 20, 0, 4, 0, + 68, 0, 0, 0, 1, 0, + 12, 2, 20, 0, 0, 0, + 58, 0, 62, 17, 5, 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, 0, 0, 4, 0, + 68, 0, 0, 0, 1, 0, + 12, 2, 0, 0, 0, 0, + 22, 0, 80, 17, 2, 0, + 5, 0, 4, 0, 4, 0, + 68, 0, 0, 0, 1, 0, + 12, 2, 4, 0, 0, 0, + 22, 0, 80, 17, 2, 0, + 5, 0, 8, 0, 4, 0, + 68, 0, 0, 0, 1, 0, + 12, 2, 8, 0, 0, 0, + 22, 0, 80, 17, 2, 0, + 5, 0, 12, 0, 4, 0, + 68, 0, 0, 0, 1, 0, + 12, 2, 12, 0, 0, 0, + 42, 0, 62, 17, 5, 16, + 0, 0, 8, 0, 114, 103, + 98, 97, 0, 0, 0, 0, + 0, 0, 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, 104, 0, 0, 0, + 1, 0, 40, 1, 0, 0, + 0, 0, 22, 0, 80, 17, + 0, 0, 5, 0, 4, 0, + 4, 0, 104, 0, 0, 0, + 1, 0, 80, 0, 4, 0, + 0, 0, 22, 0, 80, 17, + 0, 0, 5, 0, 8, 0, + 4, 0, 104, 0, 0, 0, + 1, 0, 68, 1, 8, 0, + 0, 0, 22, 0, 80, 17, + 0, 0, 5, 0, 12, 0, + 4, 0, 104, 0, 0, 0, + 1, 0, 232, 1, 12, 0, + 0, 0, 42, 0, 62, 17, + 5, 16, 0, 0, 8, 0, + 121, 117, 118, 97, 0, 0, + 0, 0, 0, 0, 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, 56, 2, + 0, 0, 1, 0, 24, 0, + 16, 0, 0, 0, 22, 0, + 80, 17, 0, 0, 5, 0, + 4, 0, 4, 0, 56, 2, + 0, 0, 1, 0, 24, 0, + 20, 0, 0, 0, 22, 0, + 80, 17, 0, 0, 5, 0, + 8, 0, 4, 0, 56, 2, + 0, 0, 1, 0, 24, 0, + 24, 0, 0, 0, 22, 0, + 80, 17, 0, 0, 5, 0, + 12, 0, 4, 0, 56, 2, + 0, 0, 1, 0, 24, 0, + 28, 0, 0, 0, 138, 0, + 77, 17, 144, 0, 0, 0, + 164, 5, 0, 0, 0, 16, + 0, 0, 7, 0, 9, 3, + 13, 63, 6, 4, 3, 60, + 13, 38, 6, 2, 3, 128, + 140, 6, 2, 3, 80, 13, + 18, 6, 2, 3, 80, 13, + 17, 6, 2, 3, 20, 13, + 14, 6, 2, 12, 60, 40, + 8, 0, 9, 12, 13, 26, + 1, 128, 128, 6, 11, 3, + 0, 9, 30, 13, 44, 3, + 28, 9, 12, 3, 28, 9, + 48, 13, 62, 3, 28, 9, + 12, 3, 28, 9, 13, 13, + 27, 6, 2, 3, 28, 9, + 12, 13, 37, 3, 52, 9, + 13, 13, 27, 6, 2, 3, + 28, 9, 12, 13, 37, 3, + 52, 9, 3, 13, 17, 6, + 2, 3, 28, 13, 16, 6, + 2, 3, 20, 13, 14, 6, + 2, 12, 60, 40, 0, 0, + 62, 0, 62, 17, 5, 16, + 0, 0, 136, 0, 60, 82, + 71, 66, 116, 111, 89, 85, + 86, 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, 0, 0, 5, 0, + 0, 0, 4, 0, 252, 1, + 0, 0, 1, 0, 60, 0, + 16, 0, 0, 0, 22, 0, + 80, 17, 0, 0, 5, 0, + 4, 0, 4, 0, 16, 2, + 0, 0, 1, 0, 40, 0, + 20, 0, 0, 0, 22, 0, + 80, 17, 0, 0, 5, 0, + 8, 0, 4, 0, 16, 2, + 0, 0, 1, 0, 40, 0, + 24, 0, 0, 0, 22, 0, + 80, 17, 0, 0, 5, 0, + 12, 0, 4, 0, 36, 2, + 0, 0, 1, 0, 20, 0, + 28, 0, 0, 0, 42, 0, + 62, 17, 0, 16, 0, 0, + 9, 0, 114, 103, 98, 97, + 0, 0, 0, 0, 0, 0, + 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, + 128, 0, 0, 0, 1, 0, + 16, 1, 0, 0, 0, 0, + 22, 0, 80, 17, 0, 0, + 5, 0, 4, 0, 4, 0, + 128, 0, 0, 0, 1, 0, + 56, 0, 4, 0, 0, 0, + 22, 0, 80, 17, 0, 0, + 5, 0, 8, 0, 4, 0, + 128, 0, 0, 0, 1, 0, + 44, 1, 8, 0, 0, 0, + 22, 0, 80, 17, 0, 0, + 5, 0, 12, 0, 4, 0, + 128, 0, 0, 0, 1, 0, + 184, 1, 12, 0, 0, 0, + 42, 0, 62, 17, 0, 16, + 0, 0, 8, 0, 121, 117, + 118, 97, 0, 0, 0, 0, + 0, 0, 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, 12, 1, 0, 0, + 1, 0, 44, 1, 16, 0, + 0, 0, 22, 0, 80, 17, + 0, 0, 5, 0, 4, 0, + 4, 0, 92, 1, 0, 0, + 1, 0, 140, 0, 4, 0, + 0, 0, 22, 0, 80, 17, + 0, 0, 5, 0, 8, 0, + 4, 0, 172, 1, 0, 0, + 1, 0, 60, 0, 8, 0, + 0, 0, 22, 0, 80, 17, + 0, 0, 5, 0, 12, 0, + 4, 0, 192, 1, 0, 0, + 1, 0, 120, 0, 28, 0, + 0, 0, 22, 0, 80, 17, + 0, 0, 5, 0, 4, 0, + 4, 0, 232, 1, 0, 0, + 1, 0, 80, 0, 20, 0, + 0, 0, 22, 0, 80, 17, + 0, 0, 5, 0, 8, 0, + 4, 0, 232, 1, 0, 0, + 1, 0, 80, 0, 24, 0, + 0, 0, 2, 0, 78, 17, + 2, 0, 6, 0, 244, 0, + 0, 0, 24, 0, 0, 0, + 1, 0, 0, 0, 16, 1, + 75, 114, 45, 155, 78, 180, + 104, 255, 31, 221, 159, 124, + 47, 39, 251, 124, 0, 0, + 242, 0, 0, 0, 40, 2, + 0, 0, 0, 0, 0, 0, + 1, 0, 1, 0, 80, 2, + 0, 0, 0, 0, 0, 0, + 44, 0, 0, 0, 28, 2, + 0, 0, 68, 0, 0, 0, + 23, 0, 0, 128, 68, 0, + 0, 0, 23, 0, 0, 0, + 104, 0, 0, 0, 24, 0, + 0, 128, 104, 0, 0, 0, + 24, 0, 0, 0, 108, 0, + 0, 0, 24, 0, 0, 128, + 108, 0, 0, 0, 24, 0, + 0, 0, 128, 0, 0, 0, + 24, 0, 0, 128, 128, 0, + 0, 0, 24, 0, 0, 0, + 156, 0, 0, 0, 24, 0, + 0, 128, 156, 0, 0, 0, + 24, 0, 0, 0, 184, 0, + 0, 0, 24, 0, 0, 128, + 184, 0, 0, 0, 24, 0, + 0, 0, 212, 0, 0, 0, + 24, 0, 0, 128, 212, 0, + 0, 0, 24, 0, 0, 0, + 240, 0, 0, 0, 24, 0, + 0, 128, 240, 0, 0, 0, + 24, 0, 0, 0, 12, 1, + 0, 0, 24, 0, 0, 128, + 12, 1, 0, 0, 24, 0, + 0, 0, 36, 1, 0, 0, + 24, 0, 0, 128, 36, 1, + 0, 0, 24, 0, 0, 0, + 64, 1, 0, 0, 24, 0, + 0, 128, 64, 1, 0, 0, + 24, 0, 0, 0, 92, 1, + 0, 0, 24, 0, 0, 128, + 92, 1, 0, 0, 24, 0, + 0, 0, 116, 1, 0, 0, + 24, 0, 0, 128, 116, 1, + 0, 0, 24, 0, 0, 0, + 144, 1, 0, 0, 24, 0, + 0, 128, 144, 1, 0, 0, + 24, 0, 0, 0, 172, 1, + 0, 0, 24, 0, 0, 128, + 172, 1, 0, 0, 24, 0, + 0, 0, 192, 1, 0, 0, + 24, 0, 0, 128, 192, 1, + 0, 0, 24, 0, 0, 0, + 232, 1, 0, 0, 24, 0, + 0, 128, 232, 1, 0, 0, + 24, 0, 0, 0, 252, 1, + 0, 0, 24, 0, 0, 128, + 252, 1, 0, 0, 24, 0, + 0, 0, 16, 2, 0, 0, + 24, 0, 0, 128, 16, 2, + 0, 0, 24, 0, 0, 0, + 36, 2, 0, 0, 24, 0, + 0, 128, 36, 2, 0, 0, + 24, 0, 0, 0, 56, 2, + 0, 0, 25, 0, 0, 128, + 56, 2, 0, 0, 25, 0, + 0, 0, 76, 2, 0, 0, + 25, 0, 0, 128, 76, 2, + 0, 0, 25, 0, 0, 0, + 3, 0, 63, 0, 23, 0, + 62, 0, 3, 0, 37, 0, + 23, 0, 36, 0, 3, 0, + 37, 0, 23, 0, 36, 0, + 3, 0, 37, 0, 23, 0, + 36, 0, 3, 0, 37, 0, + 23, 0, 36, 0, 3, 0, + 37, 0, 23, 0, 36, 0, + 3, 0, 37, 0, 23, 0, + 36, 0, 3, 0, 37, 0, + 23, 0, 36, 0, 3, 0, + 37, 0, 23, 0, 36, 0, + 3, 0, 37, 0, 23, 0, + 36, 0, 3, 0, 37, 0, + 23, 0, 36, 0, 3, 0, + 37, 0, 23, 0, 36, 0, + 3, 0, 37, 0, 23, 0, + 36, 0, 3, 0, 37, 0, + 23, 0, 36, 0, 3, 0, + 37, 0, 23, 0, 36, 0, + 3, 0, 37, 0, 23, 0, + 36, 0, 3, 0, 37, 0, + 23, 0, 36, 0, 3, 0, + 37, 0, 23, 0, 36, 0, + 3, 0, 37, 0, 23, 0, + 36, 0, 3, 0, 37, 0, + 16, 0, 36, 0, 3, 0, + 14, 0, 3, 0, 14, 0, + 3, 0, 14, 0, 3, 0, + 14, 0, 246, 0, 0, 0, + 16, 0, 0, 0, 0, 0, + 0, 0, 0, 16, 0, 0, + 0, 0, 0, 0, 11, 0, + 0, 0, 12, 0, 0, 0, + 0, 0, 0, 0, 20, 0, + 0, 0, 52, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 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, + 4, 1, 0, 0, 10, 0, + 255, 255, 4, 0, 0, 0, + 3, 128, 0, 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, 34, 0, + 3, 18, 13, 21, 3, 0, + 0, 16, 0, 0, 0, 0, + 112, 111, 115, 0, 242, 241, + 13, 21, 3, 0, 1, 16, + 0, 0, 16, 0, 116, 101, + 120, 0, 242, 241, 26, 0, + 5, 21, 2, 0, 0, 0, + 2, 16, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 24, 0, 86, 83, 0, 243, + 242, 241, 10, 0, 1, 18, + 1, 0, 0, 0, 3, 16, + 0, 0, 10, 0, 24, 21, + 0, 16, 0, 0, 1, 0, + 1, 0, 14, 0, 8, 16, + 5, 16, 0, 0, 23, 0, + 1, 0, 4, 16, 0, 0, + 10, 0, 1, 18, 1, 0, + 0, 0, 0, 16, 0, 0, + 14, 0, 8, 16, 5, 16, + 0, 0, 23, 0, 1, 0, + 7, 16, 0, 0, 14, 0, + 23, 21, 0, 16, 0, 0, + 3, 2, 176, 3, 0, 0, + 242, 241, 10, 0, 24, 21, + 9, 16, 0, 0, 1, 0, + 1, 0, 10, 0, 24, 21, + 10, 16, 0, 0, 1, 0, + 0, 2, 14, 0, 23, 21, + 0, 0, 0, 0, 10, 2, + 0, 0, 0, 0, 242, 241, + 10, 0, 24, 21, 12, 16, + 0, 0, 1, 0, 1, 0, + 10, 0, 24, 21, 13, 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, 220, 63, + 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, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 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, + 1, 16, 0, 0, 24, 0, + 0, 0, 11, 0, 255, 255, + 4, 0, 0, 0, 3, 128, + 0, 0, 0, 0, 0, 0, + 4, 0, 0, 0, 4, 0, + 0, 0, 8, 0, 0, 0, + 12, 0, 0, 0, 0, 0, + 0, 0, 22, 0, 1, 22, + 0, 0, 0, 0, 8, 16, + 0, 0, 82, 71, 66, 116, + 111, 89, 85, 86, 0, 243, + 242, 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, 68, 51, 68, 83, + 72, 68, 82, 0, 80, 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, 32, 0, 0, 96, + 4, 0, 0, 0, 8, 0, + 0, 0, 12, 0, 0, 0, + 0, 0, 0, 0, 22, 0, + 1, 22, 0, 0, 0, 0, + 8, 16, 0, 0, 82, 71, + 66, 116, 111, 89, 85, 86, + 0, 243, 242, 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, 255, 255, + 255, 255, 26, 9, 47, 241, + 24, 0, 0, 0, 16, 2, + 0, 0, 53, 0, 0, 0, + 1, 0, 0, 0, 1, 0, + 0, 0, 1, 0, 0, 0, + 21, 0, 0, 0, 1, 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, 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, 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, + 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, 144, 0, + 0, 0, 1, 0, 109, 97, + 105, 110, 0, 0, 30, 0, + 81, 17, 11, 16, 0, 0, + 7, 0, 255, 255, 255, 255, + 0, 0, 255, 255, 255, 255, + 116, 101, 120, 84, 101, 120, + 116, 117, 114, 101, 0, 0, + 30, 0, 81, 17, 14, 16, + 0, 0, 6, 0, 255, 255, + 255, 255, 255, 255, 0, 0, + 255, 255, 116, 101, 120, 83, + 97, 109, 112, 108, 101, 114, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 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, + 255, 255, 255, 255, 119, 9, + 49, 1, 1, 0, 0, 0, + 13, 0, 0, 139, 14, 0, + 183, 195, 15, 0, 0, 0, + 76, 0, 0, 0, 32, 0, + 0, 0, 44, 0, 0, 0, + 116, 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, 80, 2, + 0, 0, 32, 0, 0, 96, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 2, 0, 9, 0, 172, 5, + 0, 0, 0, 0, 0, 0, + 104, 2, 0, 0, 1, 0, + 0, 0, 208, 135, 214, 3, + 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, 80, 2, 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, + 80, 2, 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, 71, 101, 111, + 102, 102, 114, 101, 121, 32, + 77, 99, 82, 97, 101, 92, + 68, 111, 99, 117, 109, 101, + 110, 116, 115, 92, 86, 105, + 115, 117, 97, 108, 32, 83, + 116, 117, 100, 105, 111, 32, + 50, 48, 49, 53, 92, 80, + 114, 111, 106, 101, 99, 116, + 115, 92, 76, 111, 111, 107, + 105, 110, 103, 71, 108, 97, + 115, 115, 92, 104, 111, 115, + 116, 92, 83, 104, 97, 100, + 101, 114, 115, 92, 66, 71, + 82, 65, 116, 111, 78, 86, + 49, 50, 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, 148, 46, 49, 1, + 121, 169, 90, 91, 1, 0, + 0, 0, 179, 242, 207, 250, + 226, 64, 227, 73, 186, 206, + 192, 227, 242, 133, 240, 250, + 149, 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, 103, 101, + 111, 102, 102, 114, 101, 121, + 32, 109, 99, 114, 97, 101, + 92, 100, 111, 99, 117, 109, + 101, 110, 116, 115, 92, 118, + 105, 115, 117, 97, 108, 32, + 115, 116, 117, 100, 105, 111, + 32, 50, 48, 49, 53, 92, + 112, 114, 111, 106, 101, 99, + 116, 115, 92, 108, 111, 111, + 107, 105, 110, 103, 103, 108, + 97, 115, 115, 92, 104, 111, + 115, 116, 92, 115, 104, 97, + 100, 101, 114, 115, 92, 98, + 103, 114, 97, 116, 111, 110, + 118, 49, 50, 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, 65, + 145, 50, 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, 16, 0, + 0, 0, 32, 0, 0, 0, + 241, 0, 0, 0, 60, 1, + 0, 0, 123, 1, 0, 0, + 80, 0, 0, 0, 0, 0, + 0, 0, 33, 3, 0, 0, + 128, 0, 0, 0, 30, 2, + 0, 0, 36, 8, 0, 0, + 68, 0, 0, 0, 12, 0, + 0, 0, 40, 0, 0, 0, + 56, 2, 0, 0, 44, 0, + 0, 0, 84, 0, 0, 0, + 3, 0, 0, 0, 26, 0, + 0, 0, 17, 0, 0, 0, + 25, 0, 0, 0, 19, 0, + 0, 0, 10, 0, 0, 0, + 6, 0, 0, 0, 11, 0, + 0, 0, 8, 0, 0, 0, + 9, 0, 0, 0, 12, 0, + 0, 0, 13, 0, 0, 0, + 14, 0, 0, 0, 15, 0, + 0, 0, 16, 0, 0, 0, + 7, 0, 0, 0, 18, 0, + 0, 0, 20, 0, 0, 0, + 21, 0, 0, 0, 22, 0, + 0, 0, 24, 0, 0, 0, + 23, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 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, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 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, 84, 65, 84, 116, 0, + 0, 0, 22, 0, 0, 0, + 3, 0, 0, 0, 0, 0, + 0, 0, 2, 0, 0, 0, + 12, 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, 1, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 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, 82, 68, + 69, 70, 164, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 2, 0, 0, 0, + 28, 0, 0, 0, 0, 4, + 255, 255, 5, 1, 0, 0, + 114, 0, 0, 0, 92, 0, + 0, 0, 3, 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, + 103, 0, 0, 0, 2, 0, + 0, 0, 5, 0, 0, 0, + 4, 0, 0, 0, 255, 255, + 255, 255, 0, 0, 0, 0, + 1, 0, 0, 0, 12, 0, + 0, 0, 116, 101, 120, 83, + 97, 109, 112, 108, 101, 114, + 0, 116, 101, 120, 84, 101, + 120, 116, 117, 114, 101, 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, 54, + 46, 51, 46, 57, 54, 48, + 48, 46, 49, 54, 51, 56, + 52, 0, 73, 83, 71, 78, + 80, 0, 0, 0, 2, 0, + 0, 0, 8, 0, 0, 0, + 56, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, + 3, 0, 0, 0, 0, 0, + 0, 0, 15, 0, 0, 0, + 68, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 1, 0, + 0, 0, 3, 3, 0, 0, + 83, 86, 95, 80, 111, 115, + 105, 116, 105, 111, 110, 0, + 84, 69, 88, 67, 79, 79, + 82, 68, 0, 171, 171, 171, + 79, 83, 71, 78, 44, 0, + 0, 0, 1, 0, 0, 0, + 8, 0, 0, 0, 32, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 0, 0, + 15, 0, 0, 0, 83, 86, + 95, 84, 65, 82, 71, 69, + 84, 0, 171, 171 +}; diff --git a/host/Shaders/BGRAtoNV12.hlsl b/host/Shaders/BGRAtoNV12.hlsl new file mode 100644 index 00000000..88dce5cd --- /dev/null +++ b/host/Shaders/BGRAtoNV12.hlsl @@ -0,0 +1,26 @@ +Texture2D texTexture; +SamplerState texSampler; + +struct VS +{ + float4 pos : SV_Position; + float2 tex : TEXCOORD; +}; + +float4 RGBtoYUV(float4 rgba) +{ + float4 yuva; + yuva.r = rgba.r * 0.2126 + 0.7152 * rgba.g + 0.0722 * rgba.b; + yuva.g = (rgba.b - yuva.r) / 1.8556; + yuva.b = (rgba.r - yuva.r) / 1.5748; + yuva.a = rgba.a; + yuva.gb += 0.5; + return yuva; +} + +float4 main(VS input) : SV_TARGET +{ + const float4 rgba = texTexture.Sample(texSampler, input.tex); + const float4 yuva = RGBtoYUV(rgba); + return yuva; +} \ No newline at end of file diff --git a/host/Shaders/Vertex.h b/host/Shaders/Vertex.h new file mode 100644 index 00000000..cc83a5dd --- /dev/null +++ b/host/Shaders/Vertex.h @@ -0,0 +1,2232 @@ +#if 0 +// +// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384 +// +// +// +// Input signature: +// +// Name Index Mask Register SysValue Format Used +// -------------------- ----- ------ -------- -------- ------- ------ +// POSITION 0 xyzw 0 NONE float xyzw +// TEXCOORD 0 xy 1 NONE float xy +// +// +// Output signature: +// +// Name Index Mask Register SysValue Format Used +// -------------------- ----- ------ -------- -------- ------- ------ +// SV_Position 0 xyzw 0 POS float xyzw +// TEXCOORD 0 xy 1 NONE float xy +// +// +// Runtime generated constant mappings: +// +// Target Reg Constant Description +// ---------- -------------------------------------------------- +// c0 Vertex Shader position offset +// +// +// Level9 shader bytecode: +// + vs_2_x + dcl_texcoord v0 // input<0,1,2,3> + dcl_texcoord1 v1 // input<4,5> + +#line 15 "C:\Users\Geoffrey McRae\Documents\Visual Studio 2015\Projects\LookingGlass\host\Shaders\Vertex.hlsl" + mov r0.xy, v0 // ::main<0,1> + mov r0.zw, v0 // ::main<2,3> + mov oT0.xy, v1 // ::main<4,5> + mul r1.xy, r0.w, c0 + add oPos.xy, r0, r1 // ::main<0,1> + mov oPos.zw, r0 // ::main<2,3> + +// approximately 6 instruction slots used +vs_4_0 +dcl_input v0.xyzw +dcl_input v1.xy +dcl_output_siv o0.xyzw, position +dcl_output o1.xy +// +// Initial variable locations: +// v0.x <- input.pos.x; v0.y <- input.pos.y; v0.z <- input.pos.z; v0.w <- input.pos.w; +// v1.x <- input.tex.x; v1.y <- input.tex.y; +// o1.x <-
.tex.x; o1.y <-
.tex.y; +// o0.x <-
.pos.x; o0.y <-
.pos.y; o0.z <-
.pos.z; o0.w <-
.pos.w +// +#line 15 "C:\Users\Geoffrey McRae\Documents\Visual Studio 2015\Projects\LookingGlass\host\Shaders\Vertex.hlsl" +mov o0.xyzw, v0.xyzw +mov o1.xy, v1.xyxx +ret +// Approximately 3 instruction slots used +#endif + +const BYTE g_Vertex[] = +{ + 68, 88, 66, 67, 11, 239, + 74, 182, 24, 230, 53, 56, + 147, 198, 210, 245, 239, 138, + 28, 36, 1, 0, 0, 0, + 192, 50, 0, 0, 7, 0, + 0, 0, 60, 0, 0, 0, + 200, 2, 0, 0, 56, 3, + 0, 0, 64, 49, 0, 0, + 188, 49, 0, 0, 20, 50, + 0, 0, 104, 50, 0, 0, + 65, 111, 110, 57, 132, 2, + 0, 0, 132, 2, 0, 0, + 0, 2, 254, 255, 92, 2, + 0, 0, 40, 0, 0, 0, + 0, 0, 36, 0, 0, 0, + 36, 0, 0, 0, 36, 0, + 0, 0, 36, 0, 1, 0, + 36, 0, 0, 0, 0, 0, + 1, 2, 254, 255, 254, 255, + 122, 0, 68, 66, 85, 71, + 40, 0, 0, 0, 176, 1, + 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 140, 0, + 0, 0, 8, 0, 0, 0, + 144, 0, 0, 0, 2, 0, + 0, 0, 136, 1, 0, 0, + 208, 0, 0, 0, 67, 58, + 92, 85, 115, 101, 114, 115, + 92, 71, 101, 111, 102, 102, + 114, 101, 121, 32, 77, 99, + 82, 97, 101, 92, 68, 111, + 99, 117, 109, 101, 110, 116, + 115, 92, 86, 105, 115, 117, + 97, 108, 32, 83, 116, 117, + 100, 105, 111, 32, 50, 48, + 49, 53, 92, 80, 114, 111, + 106, 101, 99, 116, 115, 92, + 76, 111, 111, 107, 105, 110, + 103, 71, 108, 97, 115, 115, + 92, 104, 111, 115, 116, 92, + 83, 104, 97, 100, 101, 114, + 115, 92, 86, 101, 114, 116, + 101, 120, 46, 104, 108, 115, + 108, 0, 40, 0, 0, 0, + 0, 0, 255, 255, 240, 1, + 0, 0, 0, 0, 255, 255, + 252, 1, 0, 0, 15, 0, + 0, 0, 8, 2, 0, 0, + 15, 0, 0, 0, 20, 2, + 0, 0, 15, 0, 0, 0, + 32, 2, 0, 0, 13, 0, + 0, 0, 44, 2, 0, 0, + 13, 0, 0, 0, 60, 2, + 0, 0, 13, 0, 0, 0, + 76, 2, 0, 0, 109, 97, + 105, 110, 0, 105, 110, 112, + 117, 116, 0, 112, 111, 115, + 0, 171, 1, 0, 3, 0, + 1, 0, 4, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 116, 101, 120, 0, 1, 0, + 3, 0, 1, 0, 2, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 219, 0, 0, 0, + 224, 0, 0, 0, 240, 0, + 0, 0, 244, 0, 0, 0, + 5, 0, 0, 0, 1, 0, + 6, 0, 1, 0, 2, 0, + 4, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, + 2, 0, 3, 0, 1, 0, + 0, 0, 4, 0, 5, 0, + 255, 255, 255, 255, 5, 0, + 0, 0, 1, 0, 6, 0, + 1, 0, 2, 0, 4, 1, + 0, 0, 2, 0, 0, 0, + 0, 0, 1, 0, 255, 255, + 255, 255, 3, 0, 0, 0, + 255, 255, 255, 255, 2, 0, + 3, 0, 4, 0, 0, 0, + 4, 0, 5, 0, 255, 255, + 255, 255, 6, 0, 0, 0, + 0, 0, 1, 0, 255, 255, + 255, 255, 7, 0, 0, 0, + 255, 255, 255, 255, 2, 0, + 3, 0, 208, 0, 0, 0, + 213, 0, 0, 0, 20, 1, + 0, 0, 2, 0, 0, 0, + 36, 1, 0, 0, 0, 0, + 0, 0, 208, 0, 0, 0, + 60, 1, 0, 0, 5, 0, + 0, 0, 76, 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, 54, + 46, 51, 46, 57, 54, 48, + 48, 46, 49, 54, 51, 56, + 52, 0, 171, 171, 31, 0, + 0, 2, 5, 0, 0, 128, + 0, 0, 15, 144, 31, 0, + 0, 2, 5, 0, 1, 128, + 1, 0, 15, 144, 1, 0, + 0, 2, 0, 0, 3, 128, + 0, 0, 228, 144, 1, 0, + 0, 2, 0, 0, 12, 128, + 0, 0, 228, 144, 1, 0, + 0, 2, 0, 0, 3, 224, + 1, 0, 228, 144, 5, 0, + 0, 3, 1, 0, 3, 128, + 0, 0, 255, 128, 0, 0, + 228, 160, 2, 0, 0, 3, + 0, 0, 3, 192, 0, 0, + 228, 128, 1, 0, 228, 128, + 1, 0, 0, 2, 0, 0, + 12, 192, 0, 0, 228, 128, + 255, 255, 0, 0, 83, 72, + 68, 82, 104, 0, 0, 0, + 64, 0, 1, 0, 26, 0, + 0, 0, 95, 0, 0, 3, + 242, 16, 16, 0, 0, 0, + 0, 0, 95, 0, 0, 3, + 50, 16, 16, 0, 1, 0, + 0, 0, 103, 0, 0, 4, + 242, 32, 16, 0, 0, 0, + 0, 0, 1, 0, 0, 0, + 101, 0, 0, 3, 50, 32, + 16, 0, 1, 0, 0, 0, + 54, 0, 0, 5, 242, 32, + 16, 0, 0, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 54, 0, 0, 5, + 50, 32, 16, 0, 1, 0, + 0, 0, 70, 16, 16, 0, + 1, 0, 0, 0, 62, 0, + 0, 1, 83, 80, 68, 66, + 0, 46, 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, 23, 0, 0, 0, + 132, 0, 0, 0, 0, 0, + 0, 0, 22, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 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, 128, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 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, + 0, 92, 90, 91, 1, 0, + 0, 0, 147, 79, 63, 46, + 193, 181, 137, 76, 130, 48, + 65, 199, 152, 88, 161, 73, + 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, 65, 145, + 50, 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, 68, 51, + 68, 83, 72, 68, 82, 0, + 104, 0, 0, 0, 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, + 119, 115, 0, 0, 47, 44, + 0, 0, 210, 103, 0, 0, + 135, 22, 0, 0, 210, 65, + 0, 0, 133, 22, 0, 0, + 226, 35, 0, 0, 78, 62, + 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, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 115, 116, 114, 117, + 99, 116, 32, 86, 83, 13, + 10, 123, 13, 10, 32, 32, + 102, 108, 111, 97, 116, 52, + 32, 112, 111, 115, 32, 58, + 32, 80, 79, 83, 73, 84, + 73, 79, 78, 59, 13, 10, + 32, 32, 102, 108, 111, 97, + 116, 50, 32, 116, 101, 120, + 32, 58, 32, 84, 69, 88, + 67, 79, 79, 82, 68, 59, + 32, 13, 10, 125, 59, 13, + 10, 13, 10, 115, 116, 114, + 117, 99, 116, 32, 80, 83, + 13, 10, 123, 13, 10, 32, + 32, 102, 108, 111, 97, 116, + 52, 32, 112, 111, 115, 32, + 58, 32, 83, 86, 95, 80, + 111, 115, 105, 116, 105, 111, + 110, 59, 13, 10, 32, 32, + 102, 108, 111, 97, 116, 50, + 32, 116, 101, 120, 32, 58, + 32, 84, 69, 88, 67, 79, + 79, 82, 68, 59, 13, 10, + 125, 59, 13, 10, 13, 10, + 80, 83, 32, 109, 97, 105, + 110, 40, 86, 83, 32, 105, + 110, 112, 117, 116, 41, 13, + 10, 123, 13, 10, 32, 32, + 114, 101, 116, 117, 114, 110, + 32, 105, 110, 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, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 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, + 135, 1, 0, 0, 0, 67, + 58, 92, 85, 115, 101, 114, + 115, 92, 71, 101, 111, 102, + 102, 114, 101, 121, 32, 77, + 99, 82, 97, 101, 92, 68, + 111, 99, 117, 109, 101, 110, + 116, 115, 92, 86, 105, 115, + 117, 97, 108, 32, 83, 116, + 117, 100, 105, 111, 32, 50, + 48, 49, 53, 92, 80, 114, + 111, 106, 101, 99, 116, 115, + 92, 76, 111, 111, 107, 105, + 110, 103, 71, 108, 97, 115, + 115, 92, 104, 111, 115, 116, + 92, 83, 104, 97, 100, 101, + 114, 115, 92, 86, 101, 114, + 116, 101, 120, 46, 104, 108, + 115, 108, 0, 0, 99, 58, + 92, 117, 115, 101, 114, 115, + 92, 103, 101, 111, 102, 102, + 114, 101, 121, 32, 109, 99, + 114, 97, 101, 92, 100, 111, + 99, 117, 109, 101, 110, 116, + 115, 92, 118, 105, 115, 117, + 97, 108, 32, 115, 116, 117, + 100, 105, 111, 32, 50, 48, + 49, 53, 92, 112, 114, 111, + 106, 101, 99, 116, 115, 92, + 108, 111, 111, 107, 105, 110, + 103, 103, 108, 97, 115, 115, + 92, 104, 111, 115, 116, 92, + 115, 104, 97, 100, 101, 114, + 115, 92, 118, 101, 114, 116, + 101, 120, 46, 104, 108, 115, + 108, 0, 115, 116, 114, 117, + 99, 116, 32, 86, 83, 13, + 10, 123, 13, 10, 32, 32, + 102, 108, 111, 97, 116, 52, + 32, 112, 111, 115, 32, 58, + 32, 80, 79, 83, 73, 84, + 73, 79, 78, 59, 13, 10, + 32, 32, 102, 108, 111, 97, + 116, 50, 32, 116, 101, 120, + 32, 58, 32, 84, 69, 88, + 67, 79, 79, 82, 68, 59, + 32, 13, 10, 125, 59, 13, + 10, 13, 10, 115, 116, 114, + 117, 99, 116, 32, 80, 83, + 13, 10, 123, 13, 10, 32, + 32, 102, 108, 111, 97, 116, + 52, 32, 112, 111, 115, 32, + 58, 32, 83, 86, 95, 80, + 111, 115, 105, 116, 105, 111, + 110, 59, 13, 10, 32, 32, + 102, 108, 111, 97, 116, 50, + 32, 116, 101, 120, 32, 58, + 32, 84, 69, 88, 67, 79, + 79, 82, 68, 59, 13, 10, + 125, 59, 13, 10, 13, 10, + 80, 83, 32, 109, 97, 105, + 110, 40, 86, 83, 32, 105, + 110, 112, 117, 116, 41, 13, + 10, 123, 13, 10, 32, 32, + 114, 101, 116, 117, 114, 110, + 32, 105, 110, 112, 117, 116, + 59, 13, 10, 125, 0, 7, + 0, 0, 0, 1, 0, 0, + 0, 101, 0, 0, 0, 102, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 202, 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, + 27, 226, 48, 1, 128, 0, + 0, 0, 107, 100, 154, 20, + 58, 37, 212, 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, + 102, 0, 0, 0, 40, 0, + 0, 0, 27, 226, 48, 1, + 164, 66, 182, 98, 188, 0, + 0, 0, 1, 0, 0, 0, + 101, 0, 0, 0, 102, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 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, + 74, 0, 60, 17, 16, 1, + 0, 0, 0, 1, 6, 0, + 3, 0, 0, 64, 128, 37, + 6, 0, 3, 0, 0, 64, + 128, 37, 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, 54, 46, 51, 46, 57, + 54, 48, 48, 46, 49, 54, + 51, 56, 52, 0, 62, 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, 52, 95, 48, 95, 108, + 101, 118, 101, 108, 95, 57, + 95, 51, 0, 104, 108, 115, + 108, 69, 110, 116, 114, 121, + 0, 109, 97, 105, 110, 0, + 0, 0, 42, 0, 16, 17, + 0, 0, 0, 0, 72, 2, + 0, 0, 0, 0, 0, 0, + 44, 0, 0, 0, 0, 0, + 0, 0, 44, 0, 0, 0, + 7, 16, 0, 0, 60, 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, 60, 0, + 0, 0, 1, 0, 44, 0, + 0, 0, 0, 0, 22, 0, + 80, 17, 1, 0, 5, 0, + 4, 0, 4, 0, 60, 0, + 0, 0, 1, 0, 44, 0, + 4, 0, 0, 0, 22, 0, + 80, 17, 1, 0, 5, 0, + 8, 0, 4, 0, 60, 0, + 0, 0, 1, 0, 44, 0, + 8, 0, 0, 0, 22, 0, + 80, 17, 1, 0, 5, 0, + 12, 0, 4, 0, 60, 0, + 0, 0, 1, 0, 44, 0, + 12, 0, 0, 0, 22, 0, + 80, 17, 1, 0, 5, 0, + 16, 0, 4, 0, 60, 0, + 0, 0, 1, 0, 44, 0, + 16, 0, 0, 0, 22, 0, + 80, 17, 1, 0, 5, 0, + 20, 0, 4, 0, 60, 0, + 0, 0, 1, 0, 44, 0, + 20, 0, 0, 0, 58, 0, + 62, 17, 6, 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, + 16, 0, 4, 0, 60, 0, + 0, 0, 1, 0, 44, 0, + 16, 0, 0, 0, 22, 0, + 80, 17, 2, 0, 5, 0, + 20, 0, 4, 0, 60, 0, + 0, 0, 1, 0, 44, 0, + 20, 0, 0, 0, 22, 0, + 80, 17, 2, 0, 5, 0, + 0, 0, 4, 0, 60, 0, + 0, 0, 1, 0, 44, 0, + 0, 0, 0, 0, 22, 0, + 80, 17, 2, 0, 5, 0, + 4, 0, 4, 0, 60, 0, + 0, 0, 1, 0, 44, 0, + 4, 0, 0, 0, 22, 0, + 80, 17, 2, 0, 5, 0, + 8, 0, 4, 0, 60, 0, + 0, 0, 1, 0, 44, 0, + 8, 0, 0, 0, 22, 0, + 80, 17, 2, 0, 5, 0, + 12, 0, 4, 0, 60, 0, + 0, 0, 1, 0, 44, 0, + 12, 0, 0, 0, 2, 0, + 6, 0, 244, 0, 0, 0, + 24, 0, 0, 0, 1, 0, + 0, 0, 16, 1, 131, 54, + 189, 217, 64, 7, 34, 68, + 114, 237, 138, 243, 229, 218, + 133, 6, 0, 0, 242, 0, + 0, 0, 96, 0, 0, 0, + 0, 0, 0, 0, 1, 0, + 1, 0, 104, 0, 0, 0, + 0, 0, 0, 0, 6, 0, + 0, 0, 84, 0, 0, 0, + 60, 0, 0, 0, 15, 0, + 0, 128, 60, 0, 0, 0, + 15, 0, 0, 0, 80, 0, + 0, 0, 15, 0, 0, 128, + 80, 0, 0, 0, 15, 0, + 0, 0, 100, 0, 0, 0, + 15, 0, 0, 128, 100, 0, + 0, 0, 15, 0, 0, 0, + 3, 0, 15, 0, 3, 0, + 15, 0, 3, 0, 15, 0, + 3, 0, 15, 0, 3, 0, + 15, 0, 3, 0, 15, 0, + 246, 0, 0, 0, 4, 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, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 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, + 8, 16, 0, 0, 180, 0, + 0, 0, 10, 0, 255, 255, + 4, 0, 0, 0, 3, 128, + 0, 0, 0, 0, 0, 0, + 32, 0, 0, 0, 32, 0, + 0, 0, 8, 0, 0, 0, + 40, 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, 34, 0, 3, 18, + 13, 21, 3, 0, 0, 16, + 0, 0, 0, 0, 112, 111, + 115, 0, 242, 241, 13, 21, + 3, 0, 1, 16, 0, 0, + 16, 0, 116, 101, 120, 0, + 242, 241, 26, 0, 5, 21, + 2, 0, 0, 0, 2, 16, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 24, 0, + 86, 83, 0, 243, 242, 241, + 10, 0, 1, 18, 1, 0, + 0, 0, 3, 16, 0, 0, + 26, 0, 5, 21, 2, 0, + 0, 0, 2, 16, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 24, 0, 80, 83, + 0, 243, 242, 241, 10, 0, + 24, 21, 5, 16, 0, 0, + 1, 0, 1, 0, 14, 0, + 8, 16, 6, 16, 0, 0, + 23, 0, 1, 0, 4, 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, 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, + 3, 128, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 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, + 8, 0, 0, 0, 8, 2, + 0, 0, 1, 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, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 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, 144, 0, + 0, 0, 1, 0, 109, 97, + 105, 110, 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, 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, + 255, 255, 255, 255, 119, 9, + 49, 1, 1, 0, 0, 0, + 13, 0, 0, 139, 14, 0, + 183, 195, 15, 0, 0, 0, + 76, 0, 0, 0, 32, 0, + 0, 0, 44, 0, 0, 0, + 112, 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, 104, 0, + 0, 0, 32, 0, 0, 96, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 2, 0, 9, 0, 76, 2, + 0, 0, 0, 0, 0, 0, + 148, 0, 0, 0, 1, 0, + 0, 0, 72, 54, 239, 3, + 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, 104, 0, 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, + 104, 0, 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, 71, 101, 111, + 102, 102, 114, 101, 121, 32, + 77, 99, 82, 97, 101, 92, + 68, 111, 99, 117, 109, 101, + 110, 116, 115, 92, 86, 105, + 115, 117, 97, 108, 32, 83, + 116, 117, 100, 105, 111, 32, + 50, 48, 49, 53, 92, 80, + 114, 111, 106, 101, 99, 116, + 115, 92, 76, 111, 111, 107, + 105, 110, 103, 71, 108, 97, + 115, 115, 92, 104, 111, 115, + 116, 92, 83, 104, 97, 100, + 101, 114, 115, 92, 86, 101, + 114, 116, 101, 120, 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, 148, 46, 49, 1, + 0, 92, 90, 91, 1, 0, + 0, 0, 147, 79, 63, 46, + 193, 181, 137, 76, 130, 48, + 65, 199, 152, 88, 161, 73, + 145, 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, 103, 101, + 111, 102, 102, 114, 101, 121, + 32, 109, 99, 114, 97, 101, + 92, 100, 111, 99, 117, 109, + 101, 110, 116, 115, 92, 118, + 105, 115, 117, 97, 108, 32, + 115, 116, 117, 100, 105, 111, + 32, 50, 48, 49, 53, 92, + 112, 114, 111, 106, 101, 99, + 116, 115, 92, 108, 111, 111, + 107, 105, 110, 103, 103, 108, + 97, 115, 115, 92, 104, 111, + 115, 116, 92, 115, 104, 97, + 100, 101, 114, 115, 92, 118, + 101, 114, 116, 101, 120, 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, 65, 145, 50, 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, 16, 0, + 0, 0, 32, 0, 0, 0, + 237, 0, 0, 0, 236, 0, + 0, 0, 119, 1, 0, 0, + 56, 0, 0, 0, 0, 0, + 0, 0, 183, 1, 0, 0, + 128, 0, 0, 0, 188, 0, + 0, 0, 232, 2, 0, 0, + 40, 0, 0, 0, 0, 0, + 0, 0, 40, 0, 0, 0, + 32, 2, 0, 0, 44, 0, + 0, 0, 20, 0, 0, 0, + 3, 0, 0, 0, 20, 0, + 0, 0, 13, 0, 0, 0, + 19, 0, 0, 0, 14, 0, + 0, 0, 9, 0, 0, 0, + 10, 0, 0, 0, 8, 0, + 0, 0, 11, 0, 0, 0, + 12, 0, 0, 0, 7, 0, + 0, 0, 6, 0, 0, 0, + 15, 0, 0, 0, 16, 0, + 0, 0, 18, 0, 0, 0, + 17, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 21, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 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, 84, 65, 84, + 116, 0, 0, 0, 3, 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, 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, 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, + 82, 68, 69, 70, 80, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 28, 0, 0, 0, + 0, 4, 254, 255, 5, 1, + 0, 0, 28, 0, 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, 54, + 46, 51, 46, 57, 54, 48, + 48, 46, 49, 54, 51, 56, + 52, 0, 171, 171, 73, 83, + 71, 78, 76, 0, 0, 0, + 2, 0, 0, 0, 8, 0, + 0, 0, 56, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 15, 15, + 0, 0, 65, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 1, 0, 0, 0, 3, 3, + 0, 0, 80, 79, 83, 73, + 84, 73, 79, 78, 0, 84, + 69, 88, 67, 79, 79, 82, + 68, 0, 171, 171, 79, 83, + 71, 78, 80, 0, 0, 0, + 2, 0, 0, 0, 8, 0, + 0, 0, 56, 0, 0, 0, + 0, 0, 0, 0, 1, 0, + 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 15, 0, + 0, 0, 68, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 1, 0, 0, 0, 3, 12, + 0, 0, 83, 86, 95, 80, + 111, 115, 105, 116, 105, 111, + 110, 0, 84, 69, 88, 67, + 79, 79, 82, 68, 0, 171, + 171, 171 +}; diff --git a/host/Shaders/Vertex.hlsl b/host/Shaders/Vertex.hlsl new file mode 100644 index 00000000..6b5248be --- /dev/null +++ b/host/Shaders/Vertex.hlsl @@ -0,0 +1,16 @@ +struct VS +{ + float4 pos : POSITION; + float2 tex : TEXCOORD; +}; + +struct PS +{ + float4 pos : SV_Position; + float2 tex : TEXCOORD; +}; + +PS main(VS input) +{ + return input; +} \ No newline at end of file diff --git a/host/TextureConverter.cpp b/host/TextureConverter.cpp new file mode 100644 index 00000000..25fc529e --- /dev/null +++ b/host/TextureConverter.cpp @@ -0,0 +1,344 @@ +/* +Looking Glass - KVM FrameRelay (KVMFR) Client +Copyright (C) 2017 Geoffrey McRae +https://looking-glass.hostfission.com + +This program is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free Software +Foundation; either version 2 of the License, or (at your option) any later +version. + +This program is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +PARTICULAR PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along with +this program; if not, write to the Free Software Foundation, Inc., 59 Temple +Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "TextureConverter.h" +#include "common\debug.h" + +#include "Shaders\Vertex.h" +#include "Shaders\BGRAtoNV12.h" + +TextureConverter::TextureConverter() +{ +} + +TextureConverter::~TextureConverter() +{ + DeInitialize(); +} + +bool TextureConverter::Initialize( + ID3D11DeviceContextPtr deviceContext, + ID3D11DevicePtr device, + const unsigned int width, + const unsigned int height, + DXGI_FORMAT format +) +{ + HRESULT result; + D3D11_TEXTURE2D_DESC texDesc; + D3D11_RENDER_TARGET_VIEW_DESC viewDesc; + D3D11_SHADER_RESOURCE_VIEW_DESC shaderDesc; + D3D11_SAMPLER_DESC samplerDesc; + + m_deviceContext = deviceContext; + m_device = device; + m_width = width; + m_height = height; + m_format = format; + + switch (format) + { + case DXGI_FORMAT_NV12: + result = device->CreatePixelShader(g_BGRAtoNV12, sizeof(g_BGRAtoNV12), NULL, &m_pixelShader); + break; + + default: + DEBUG_ERROR("Unsupported format"); + return false; + } + + if (FAILED(result)) + { + DeInitialize(); + DEBUG_ERROR("Failed to create the pixel shader"); + return false; + } + + const D3D11_INPUT_ELEMENT_DESC inputDesc[] = + { + { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 }, + { "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT , 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 } + }; + + result = device->CreateInputLayout(inputDesc, _countof(inputDesc), g_Vertex, sizeof(g_Vertex), &m_layout); + if (FAILED(result)) + { + DeInitialize(); + DEBUG_ERROR("Failed to create the input layout"); + return false; + } + + result = device->CreateVertexShader(g_Vertex, sizeof(g_Vertex), NULL, &m_vertexShader); + if (FAILED(result)) + { + DeInitialize(); + DEBUG_ERROR("Failed to create the vertex shader"); + return false; + } + + ZeroMemory(&texDesc , sizeof(texDesc )); + ZeroMemory(&viewDesc , sizeof(viewDesc )); + ZeroMemory(&shaderDesc , sizeof(shaderDesc )); + ZeroMemory(&samplerDesc, sizeof(samplerDesc)); + + texDesc.Width = width; + texDesc.Height = height; + texDesc.MipLevels = 1; + texDesc.ArraySize = 1; + texDesc.SampleDesc.Count = 1; + texDesc.Usage = D3D11_USAGE_DEFAULT; + texDesc.CPUAccessFlags = 0; + texDesc.MiscFlags = 0; + + texDesc.Format = DXGI_FORMAT_D24_UNORM_S8_UINT; + texDesc.BindFlags = D3D11_BIND_DEPTH_STENCIL; + result = device->CreateTexture2D(&texDesc, NULL, &m_depthTexture); + if (FAILED(result)) + { + DeInitialize(); + DEBUG_ERROR("Failed to create the depth/stencil texture"); + return false; + } + + result = device->CreateDepthStencilView(m_depthTexture, NULL, &m_depthView); + if (FAILED(result)) + { + DeInitialize(); + DEBUG_ERROR("Failed to create the depth stencil view"); + return false; + } + + texDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM; + texDesc.BindFlags = D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE; + result = device->CreateTexture2D(&texDesc, NULL, &m_targetTexture); + if (FAILED(result)) + { + DeInitialize(); + DEBUG_ERROR("Failed to create the render texture"); + return false; + } + + viewDesc.Format = texDesc.Format; + viewDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D; + viewDesc.Texture2D.MipSlice = 0; + result = device->CreateRenderTargetView(m_targetTexture, &viewDesc, &m_renderView); + if (FAILED(result)) + { + DeInitialize(); + DEBUG_ERROR("Failed to create the render view"); + return false; + } + + shaderDesc.Format = texDesc.Format; + shaderDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; + shaderDesc.Texture2D.MostDetailedMip = 0; + shaderDesc.Texture2D.MipLevels = 1; + + result = device->CreateShaderResourceView(m_targetTexture, &shaderDesc, &m_shaderView); + if (FAILED(result)) + { + DeInitialize(); + DEBUG_ERROR("Failed to create shader resource view"); + return false; + } + + samplerDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR; + samplerDesc.AddressU = D3D11_TEXTURE_ADDRESS_CLAMP; + samplerDesc.AddressV = D3D11_TEXTURE_ADDRESS_CLAMP; + samplerDesc.AddressW = D3D11_TEXTURE_ADDRESS_CLAMP; + samplerDesc.MipLODBias = 0.0f; + samplerDesc.MaxAnisotropy = 1; + samplerDesc.ComparisonFunc = D3D11_COMPARISON_NEVER; + samplerDesc.BorderColor[0] = 1.0f; + samplerDesc.BorderColor[1] = 1.0f; + samplerDesc.BorderColor[2] = 1.0f; + samplerDesc.MinLOD = -FLT_MAX; + samplerDesc.MaxLOD = FLT_MAX; + + result = device->CreateSamplerState(&samplerDesc, &m_samplerState); + if (FAILED(result)) + { + DeInitialize(); + DEBUG_ERROR("Failed to create sampler state"); + return false; + } + + return IntializeBuffers(); +} + +bool TextureConverter::IntializeBuffers() +{ + struct VS_INPUT * verticies; + unsigned long * indicies; + HRESULT result; + D3D11_BUFFER_DESC vertexDesc, indexDesc; + D3D11_SUBRESOURCE_DATA vertexData, indexData; + + m_vertexCount = 4; + m_indexCount = 4; + + verticies = new struct VS_INPUT[m_vertexCount]; + if (!verticies) + { + DeInitialize(); + DEBUG_ERROR("new failure"); + return false; + } + + indicies = new unsigned long[m_indexCount]; + if (!indicies) + { + DeInitialize(); + DEBUG_ERROR("new failure"); + return false; + } + + verticies[0].pos = DirectX::XMFLOAT3(-1.0f, -1.0f, 0.5f); //BL + verticies[1].pos = DirectX::XMFLOAT3(-1.0f, 1.0f, 0.5f); //TL + verticies[2].pos = DirectX::XMFLOAT3( 1.0f, -1.0f, 0.5f); //BR + verticies[3].pos = DirectX::XMFLOAT3( 1.0f, 1.0f, 0.5f); //TR + verticies[0].tex = DirectX::XMFLOAT2(0.0f, 1.0f); + verticies[1].tex = DirectX::XMFLOAT2(0.0f, 0.0f); + verticies[2].tex = DirectX::XMFLOAT2(1.0f, 1.0f); + verticies[3].tex = DirectX::XMFLOAT2(1.0f, 0.0f); + indicies[0] = 0; + indicies[1] = 1; + indicies[2] = 2; + indicies[3] = 3; + + vertexDesc.Usage = D3D11_USAGE_DEFAULT; + vertexDesc.ByteWidth = sizeof(struct VS_INPUT) * m_vertexCount; + vertexDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER; + vertexDesc.CPUAccessFlags = 0; + vertexDesc.MiscFlags = 0; + vertexDesc.StructureByteStride = 0; + + vertexData.pSysMem = verticies; + vertexData.SysMemPitch = 0; + vertexData.SysMemSlicePitch = 0; + + result = m_device->CreateBuffer(&vertexDesc, &vertexData, &m_vertexBuffer); + if (FAILED(result)) + { + delete[] indicies; + delete[] verticies; + DeInitialize(); + DEBUG_ERROR("Failed to create vertex buffer"); + return false; + } + + indexDesc.Usage = D3D11_USAGE_DEFAULT; + indexDesc.ByteWidth = sizeof(unsigned long) * m_indexCount; + indexDesc.BindFlags = D3D11_BIND_INDEX_BUFFER; + indexDesc.CPUAccessFlags = 0; + indexDesc.MiscFlags = 0; + indexDesc.StructureByteStride = 0; + + indexData.pSysMem = indicies; + indexData.SysMemPitch = 0; + indexData.SysMemSlicePitch = 0; + + result = m_device->CreateBuffer(&indexDesc, &indexData, &m_indexBuffer); + if (FAILED(result)) + { + delete[] indicies; + delete[] verticies; + DeInitialize(); + DEBUG_ERROR("Failed to create index buffer"); + return false; + } + + delete[] indicies; + delete[] verticies; + return true; +} + +void TextureConverter::DeInitialize() +{ + SafeRelease(&m_samplerState ); + SafeRelease(&m_indexBuffer ); + SafeRelease(&m_vertexBuffer ); + SafeRelease(&m_shaderView ); + SafeRelease(&m_renderView ); + SafeRelease(&m_depthTexture ); + SafeRelease(&m_targetTexture); + SafeRelease(&m_vertexShader ); + SafeRelease(&m_pixelShader ); + SafeRelease(&m_layout ); +} + +bool TextureConverter::Convert(ID3D11Texture2DPtr &texture) +{ + unsigned int stride; + unsigned int offset; + float color[4] = { 0.0f, 0.0f, 0.0f, 1.0f }; + + HRESULT result; + D3D11_TEXTURE2D_DESC texDesc; + D3D11_SHADER_RESOURCE_VIEW_DESC shaderDesc; + ID3D11ShaderResourceViewPtr textureView; + texture->GetDesc(&texDesc); + shaderDesc.Format = texDesc.Format; + shaderDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; + shaderDesc.Texture2D.MostDetailedMip = 0; + shaderDesc.Texture2D.MipLevels = 1; + + result = m_device->CreateShaderResourceView(texture, &shaderDesc, &textureView); + if (FAILED(result)) + { + DeInitialize(); + DEBUG_ERROR("Failed to create shader resource view"); + return false; + } + + + ID3D11Buffer *buffers [] = { m_vertexBuffer.GetInterfacePtr() }; + ID3D11RenderTargetView *renderViews [] = { m_renderView .GetInterfacePtr() }; + ID3D11SamplerState *samplerStates[] = { m_samplerState.GetInterfacePtr() }; + ID3D11ShaderResourceView *shaderViews [] = { textureView .GetInterfacePtr() }; + D3D11_VIEWPORT viewPorts [] = { { + 0.0f, 0.0f, + (float)m_width, (float)m_height, + 0.0f, 1.0f + } }; + + m_deviceContext->OMSetRenderTargets(1, renderViews, NULL); + m_deviceContext->ClearRenderTargetView(m_renderView, color); + m_deviceContext->ClearDepthStencilView(m_depthView , D3D11_CLEAR_DEPTH | D3D11_CLEAR_STENCIL, 1.0f, 0); + + stride = sizeof(VS_INPUT); + offset = 0; + + m_deviceContext->RSSetViewports (_countof(viewPorts), viewPorts); + m_deviceContext->IASetInputLayout (m_layout); + m_deviceContext->IASetVertexBuffers (0, _countof(buffers), buffers, &stride, &offset); + m_deviceContext->IASetIndexBuffer (m_indexBuffer, DXGI_FORMAT_R32_UINT, 0); + m_deviceContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP); + m_deviceContext->VSSetShader (m_vertexShader, NULL, 0); + m_deviceContext->PSSetSamplers (0, _countof(samplerStates), samplerStates); + m_deviceContext->PSSetShaderResources (0, _countof(shaderViews ), shaderViews ); + m_deviceContext->PSSetShader (m_pixelShader , NULL, 0); + + m_deviceContext->DrawIndexed(m_indexCount, 0, 0); + + SafeRelease(&textureView); + SafeRelease(&texture); + texture = m_targetTexture; + return true; +} diff --git a/host/TextureConverter.h b/host/TextureConverter.h new file mode 100644 index 00000000..9679d6af --- /dev/null +++ b/host/TextureConverter.h @@ -0,0 +1,73 @@ +/* +Looking Glass - KVM FrameRelay (KVMFR) Client +Copyright (C) 2017 Geoffrey McRae +https://looking-glass.hostfission.com + +This program is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free Software +Foundation; either version 2 of the License, or (at your option) any later +version. + +This program is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +PARTICULAR PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along with +this program; if not, write to the Free Software Foundation, Inc., 59 Temple +Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#pragma once + +#include "Com.h" + +#include + +class TextureConverter +{ +public: + TextureConverter(); + ~TextureConverter(); + + bool Initialize( + ID3D11DeviceContextPtr deviceContext, + ID3D11DevicePtr device, + const unsigned int width, + const unsigned int height, + DXGI_FORMAT format + ); + + void DeInitialize(); + + bool Convert(ID3D11Texture2DPtr &texture); + +private: + struct VS_INPUT + { + DirectX::XMFLOAT3 pos; + DirectX::XMFLOAT2 tex; + }; + + bool IntializeBuffers(); + + ID3D11DeviceContextPtr m_deviceContext; + ID3D11DevicePtr m_device; + unsigned int m_width, m_height; + DXGI_FORMAT m_format; + + ID3D11Texture2DPtr m_targetTexture; + ID3D11Texture2DPtr m_depthTexture; + ID3D11DepthStencilViewPtr m_depthView; + ID3D11RenderTargetViewPtr m_renderView; + ID3D11ShaderResourceViewPtr m_shaderView; + ID3D11InputLayoutPtr m_layout; + ID3D11VertexShaderPtr m_vertexShader; + ID3D11PixelShaderPtr m_pixelShader; + ID3D11SamplerStatePtr m_samplerState; + + ID3D11BufferPtr m_vertexBuffer; + unsigned int m_vertexCount; + ID3D11BufferPtr m_indexBuffer; + unsigned int m_indexCount; +}; + diff --git a/host/looking-glass-host.vcxproj b/host/looking-glass-host.vcxproj index 7f4e4be8..aa45f046 100644 --- a/host/looking-glass-host.vcxproj +++ b/host/looking-glass-host.vcxproj @@ -337,6 +337,7 @@ + @@ -349,6 +350,7 @@ + @@ -356,6 +358,19 @@ + + + HLSL + Pixel + g_BGRAtoNV12 + Shaders\BGRAtoNV12.h + + + Vertex + g_Vertex + Shaders\Vertex.h + + diff --git a/host/looking-glass-host.vcxproj.filters b/host/looking-glass-host.vcxproj.filters index 1641ab82..e17a89fb 100644 --- a/host/looking-glass-host.vcxproj.filters +++ b/host/looking-glass-host.vcxproj.filters @@ -25,6 +25,9 @@ {fead4000-1954-4480-8ee7-b817d7042761} + + {afb06b60-4959-4447-92ec-75cc07995a8f} + @@ -54,6 +57,9 @@ Source Files\MFT + + Source Files + @@ -89,10 +95,21 @@ Header Files + + Header Files + Source Files + + + Source Files\Shaders + + + Source Files\Shaders + + \ No newline at end of file