diff --git a/include/Nazara/Renderer/Enums.hpp b/include/Nazara/Renderer/Enums.hpp index a5760a454..4d1198391 100644 --- a/include/Nazara/Renderer/Enums.hpp +++ b/include/Nazara/Renderer/Enums.hpp @@ -240,6 +240,7 @@ enum nzShaderUniform nzShaderUniform_ProjMatrix, nzShaderUniform_SceneAmbient, nzShaderUniform_TargetSize, + nzShaderUniform_VertexDepth, nzShaderUniform_ViewMatrix, nzShaderUniform_ViewProjMatrix, nzShaderUniform_WorldMatrix, diff --git a/src/Nazara/Graphics/ColorBackground.cpp b/src/Nazara/Graphics/ColorBackground.cpp index e7732f8d4..0672cffba 100644 --- a/src/Nazara/Graphics/ColorBackground.cpp +++ b/src/Nazara/Graphics/ColorBackground.cpp @@ -13,7 +13,11 @@ namespace NzRenderStates BuildRenderStates() { NzRenderStates states; - states.parameters[nzRendererParameter_DepthBuffer] = false; + states.depthFunc = nzRendererComparison_Equal; + states.faceCulling = nzFaceSide_Front; + states.parameters[nzRendererParameter_DepthBuffer] = true; + states.parameters[nzRendererParameter_DepthWrite] = false; + states.parameters[nzRendererParameter_FaceCulling] = true; return states; } @@ -30,6 +34,8 @@ m_color(color) params.fullscreenQuad.diffuseMapping = false; m_program = NzShaderProgramManager::Get(params); + m_program->SendColor(m_program->GetUniformLocation(nzShaderUniform_MaterialDiffuse), m_color); + m_program->SendFloat(m_program->GetUniformLocation(nzShaderUniform_VertexDepth), 1.f); } void NzColorBackground::Draw(const NzScene* scene) const @@ -38,8 +44,6 @@ void NzColorBackground::Draw(const NzScene* scene) const static NzRenderStates states(BuildRenderStates()); - m_program->SendColor(m_program->GetUniformLocation(nzShaderUniform_MaterialDiffuse), m_color); - NzRenderer::SetRenderStates(states); NzRenderer::SetShaderProgram(m_program); @@ -59,5 +63,6 @@ NzColor NzColorBackground::GetColor() const void NzColorBackground::SetColor(const NzColor& color) { m_color = color; + m_program->SendColor(m_program->GetUniformLocation(nzShaderUniform_MaterialDiffuse), m_color); } diff --git a/src/Nazara/Graphics/SkyboxBackground.cpp b/src/Nazara/Graphics/SkyboxBackground.cpp index 20c2b8f05..a95a5d07f 100644 --- a/src/Nazara/Graphics/SkyboxBackground.cpp +++ b/src/Nazara/Graphics/SkyboxBackground.cpp @@ -47,28 +47,43 @@ namespace { const char* fragmentSource110 = "#version 110\n" + "varying vec3 vTexCoord;\n" + "uniform samplerCube Skybox;\n" + "uniform float VertexDepth;\n" + "void main()\n" "{\n" " gl_FragColor = textureCube(Skybox, vTexCoord);\n" + " gl_FragDepth = VertexDepth;\n" "}\n"; const char* fragmentSource140 = "#version 140\n" + "in vec3 vTexCoord;\n" + "out vec4 RenderTarget0;\n" + "uniform samplerCube Skybox;\n" + "uniform float VertexDepth;\n" + "void main()\n" "{\n" " RenderTarget0 = texture(Skybox, vTexCoord);\n" + " gl_FragDepth = VertexDepth;\n" "}\n"; const char* vertexSource110 = "#version 110\n" + "attribute vec3 VertexPosition;\n" + "varying vec3 vTexCoord;\n" + "uniform mat4 WorldViewProjMatrix;\n" + "void main()\n" "{\n" " gl_Position = WorldViewProjMatrix * vec4(VertexPosition, 1.0);\n" @@ -77,9 +92,13 @@ namespace const char* vertexSource140 = "#version 140\n" + "in vec3 VertexPosition;\n" + "out vec3 vTexCoord;\n" + "uniform mat4 WorldViewProjMatrix;\n" + "void main()\n" "{\n" " gl_Position = WorldViewProjMatrix * vec4(VertexPosition, 1.0);\n" @@ -110,15 +129,19 @@ namespace return nullptr; } + program->SendInteger(program->GetUniformLocation("Skybox"), 0); + return program.release(); } NzRenderStates BuildRenderStates() { NzRenderStates states; - states.parameters[nzRendererParameter_DepthBuffer] = false; + states.depthFunc = nzRendererComparison_Equal; + states.faceCulling = nzFaceSide_Front; + states.parameters[nzRendererParameter_DepthBuffer] = true; + states.parameters[nzRendererParameter_DepthWrite] = false; states.parameters[nzRendererParameter_FaceCulling] = true; - states.faceCulling = nzFaceCulling_Front; return states; } @@ -152,7 +175,6 @@ namespace static NzIndexBuffer* s_indexBuffer = nullptr; static NzShaderProgram* s_program = nullptr; static NzVertexBuffer* s_vertexBuffer = nullptr; - static unsigned int s_skyboxLocation; } NzSkyboxBackground::NzSkyboxBackground() @@ -161,10 +183,7 @@ NzSkyboxBackground::NzSkyboxBackground() s_indexBuffer = BuildIndexBuffer(); if (!s_program) - { s_program = BuildProgram(); - s_skyboxLocation = s_program->GetUniformLocation("Skybox"); - } if (!s_vertexBuffer) s_vertexBuffer = BuildVertexBuffer(); @@ -197,8 +216,6 @@ void NzSkyboxBackground::Draw(const NzScene* scene) const { static NzRenderStates states(BuildRenderStates()); - s_program->SendInteger(s_skyboxLocation, 0); - NzAbstractViewer* viewer = scene->GetViewer(); NzMatrix4f skyboxMatrix(viewer->GetViewMatrix()); diff --git a/src/Nazara/Graphics/TextureBackground.cpp b/src/Nazara/Graphics/TextureBackground.cpp index e452d16b2..921c4666a 100644 --- a/src/Nazara/Graphics/TextureBackground.cpp +++ b/src/Nazara/Graphics/TextureBackground.cpp @@ -13,7 +13,11 @@ namespace NzRenderStates BuildRenderStates() { NzRenderStates states; - states.parameters[nzRendererParameter_DepthBuffer] = false; + states.depthFunc = nzRendererComparison_Equal; + states.faceCulling = nzFaceSide_Front; + states.parameters[nzRendererParameter_DepthBuffer] = true; + states.parameters[nzRendererParameter_DepthWrite] = false; + states.parameters[nzRendererParameter_FaceCulling] = true; return states; } @@ -29,6 +33,9 @@ NzTextureBackground::NzTextureBackground() params.fullscreenQuad.diffuseMapping = true; m_program = NzShaderProgramManager::Get(params); + m_program->SendColor(m_program->GetUniformLocation(nzShaderUniform_MaterialDiffuse), NzColor::White); + m_program->SendFloat(m_program->GetUniformLocation(nzShaderUniform_VertexDepth), 1.f); + m_program->SendInteger(m_program->GetUniformLocation(nzShaderUniform_MaterialDiffuseMap), 0); } NzTextureBackground::NzTextureBackground(NzTexture* texture) : @@ -43,9 +50,6 @@ void NzTextureBackground::Draw(const NzScene* scene) const static NzRenderStates states(BuildRenderStates()); - m_program->SendColor(m_program->GetUniformLocation(nzShaderUniform_MaterialDiffuse), NzColor::White); - m_program->SendInteger(m_program->GetUniformLocation(nzShaderUniform_MaterialDiffuseMap), 0); - NzRenderer::SetRenderStates(states); NzRenderer::SetShaderProgram(m_program); NzRenderer::SetTexture(0, m_texture); diff --git a/src/Nazara/Renderer/GLSLProgram.cpp b/src/Nazara/Renderer/GLSLProgram.cpp index 7749763a8..641bd4d82 100644 --- a/src/Nazara/Renderer/GLSLProgram.cpp +++ b/src/Nazara/Renderer/GLSLProgram.cpp @@ -627,6 +627,7 @@ bool NzGLSLProgram::PostLinkage() CacheUniform(ProjMatrix); CacheUniform(SceneAmbient); CacheUniform(TargetSize); + CacheUniform(VertexDepth); CacheUniform(ViewMatrix); CacheUniform(ViewProjMatrix); CacheUniform(WorldMatrix); diff --git a/src/Nazara/Renderer/Shaders/FullscreenQuad/compatibility.vert b/src/Nazara/Renderer/Shaders/FullscreenQuad/compatibility.vert index 1ebe209a4..b61607ce0 100644 --- a/src/Nazara/Renderer/Shaders/FullscreenQuad/compatibility.vert +++ b/src/Nazara/Renderer/Shaders/FullscreenQuad/compatibility.vert @@ -13,11 +13,12 @@ uniform sampler2D MaterialAlphaMap; uniform float MaterialAlphaThreshold; uniform vec4 MaterialDiffuse; uniform sampler2D MaterialDiffuseMap; +uniform float VertexDepth; /********************Fonctions********************/ void main() { - gl_Position = vec4(VertexPosition, 0.0, 1.0); + gl_Position = vec4(VertexPosition, VertexDepth, 1.0); #if ALPHA_MAPPING || DIFFUSE_MAPPING #if FLAG_FLIP_UVS diff --git a/src/Nazara/Renderer/Shaders/FullscreenQuad/compatibility.vert.h b/src/Nazara/Renderer/Shaders/FullscreenQuad/compatibility.vert.h index 183242f5e..42c8b5ce0 100644 --- a/src/Nazara/Renderer/Shaders/FullscreenQuad/compatibility.vert.h +++ b/src/Nazara/Renderer/Shaders/FullscreenQuad/compatibility.vert.h @@ -1 +1 @@ -35,105,102,32,70,76,65,71,95,68,69,70,69,82,82,69,68,10,9,35,101,114,114,111,114,32,68,101,102,101,114,114,101,100,32,83,104,97,100,105,110,103,32,110,101,101,100,115,32,99,111,114,101,32,112,114,111,102,105,108,101,10,35,101,110,100,105,102,10,10,47,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,69,110,116,114,97,110,116,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,47,10,118,97,114,121,105,110,103,32,118,101,99,50,32,86,101,114,116,101,120,80,111,115,105,116,105,111,110,59,10,10,47,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,83,111,114,116,97,110,116,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,47,10,118,97,114,121,105,110,103,32,118,101,99,50,32,118,84,101,120,67,111,111,114,100,59,10,10,47,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,85,110,105,102,111,114,109,101,115,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,47,10,117,110,105,102,111,114,109,32,115,97,109,112,108,101,114,50,68,32,77,97,116,101,114,105,97,108,65,108,112,104,97,77,97,112,59,10,117,110,105,102,111,114,109,32,102,108,111,97,116,32,77,97,116,101,114,105,97,108,65,108,112,104,97,84,104,114,101,115,104,111,108,100,59,10,117,110,105,102,111,114,109,32,118,101,99,52,32,77,97,116,101,114,105,97,108,68,105,102,102,117,115,101,59,10,117,110,105,102,111,114,109,32,115,97,109,112,108,101,114,50,68,32,77,97,116,101,114,105,97,108,68,105,102,102,117,115,101,77,97,112,59,10,10,47,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,70,111,110,99,116,105,111,110,115,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,47,10,118,111,105,100,32,109,97,105,110,40,41,10,123,10,9,103,108,95,80,111,115,105,116,105,111,110,32,61,32,118,101,99,52,40,86,101,114,116,101,120,80,111,115,105,116,105,111,110,44,32,48,46,48,44,32,49,46,48,41,59,10,10,35,105,102,32,65,76,80,72,65,95,77,65,80,80,73,78,71,32,124,124,32,68,73,70,70,85,83,69,95,77,65,80,80,73,78,71,10,9,35,105,102,32,70,76,65,71,95,70,76,73,80,95,85,86,83,10,9,118,84,101,120,67,111,111,114,100,32,61,32,118,101,99,50,40,40,86,101,114,116,101,120,80,111,115,105,116,105,111,110,46,120,32,43,32,49,46,48,41,42,48,46,53,44,32,48,46,53,32,45,32,86,101,114,116,101,120,80,111,115,105,116,105,111,110,46,121,42,48,46,53,59,10,9,35,101,108,115,101,10,9,118,84,101,120,67,111,111,114,100,32,61,32,118,101,99,50,40,40,86,101,114,116,101,120,80,111,115,105,116,105,111,110,46,120,32,43,32,49,46,48,41,42,48,46,53,44,32,40,86,101,114,116,101,120,80,111,115,105,116,105,111,110,46,121,32,43,32,49,46,48,41,42,48,46,53,41,59,10,9,35,101,110,100,105,102,32,47,47,32,70,76,65,71,95,70,76,73,80,95,85,86,83,10,35,101,110,100,105,102,10,125,10, \ No newline at end of file +35,105,102,32,70,76,65,71,95,68,69,70,69,82,82,69,68,10,9,35,101,114,114,111,114,32,68,101,102,101,114,114,101,100,32,83,104,97,100,105,110,103,32,110,101,101,100,115,32,99,111,114,101,32,112,114,111,102,105,108,101,10,35,101,110,100,105,102,10,10,47,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,69,110,116,114,97,110,116,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,47,10,118,97,114,121,105,110,103,32,118,101,99,50,32,86,101,114,116,101,120,80,111,115,105,116,105,111,110,59,10,10,47,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,83,111,114,116,97,110,116,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,47,10,118,97,114,121,105,110,103,32,118,101,99,50,32,118,84,101,120,67,111,111,114,100,59,10,10,47,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,85,110,105,102,111,114,109,101,115,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,47,10,117,110,105,102,111,114,109,32,115,97,109,112,108,101,114,50,68,32,77,97,116,101,114,105,97,108,65,108,112,104,97,77,97,112,59,10,117,110,105,102,111,114,109,32,102,108,111,97,116,32,77,97,116,101,114,105,97,108,65,108,112,104,97,84,104,114,101,115,104,111,108,100,59,10,117,110,105,102,111,114,109,32,118,101,99,52,32,77,97,116,101,114,105,97,108,68,105,102,102,117,115,101,59,10,117,110,105,102,111,114,109,32,115,97,109,112,108,101,114,50,68,32,77,97,116,101,114,105,97,108,68,105,102,102,117,115,101,77,97,112,59,10,117,110,105,102,111,114,109,32,102,108,111,97,116,32,86,101,114,116,101,120,68,101,112,116,104,59,10,10,47,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,70,111,110,99,116,105,111,110,115,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,47,10,118,111,105,100,32,109,97,105,110,40,41,10,123,10,9,103,108,95,80,111,115,105,116,105,111,110,32,61,32,118,101,99,52,40,86,101,114,116,101,120,80,111,115,105,116,105,111,110,44,32,86,101,114,116,101,120,68,101,112,116,104,44,32,49,46,48,41,59,10,10,35,105,102,32,65,76,80,72,65,95,77,65,80,80,73,78,71,32,124,124,32,68,73,70,70,85,83,69,95,77,65,80,80,73,78,71,10,9,35,105,102,32,70,76,65,71,95,70,76,73,80,95,85,86,83,10,9,118,84,101,120,67,111,111,114,100,32,61,32,118,101,99,50,40,40,86,101,114,116,101,120,80,111,115,105,116,105,111,110,46,120,32,43,32,49,46,48,41,42,48,46,53,44,32,48,46,53,32,45,32,86,101,114,116,101,120,80,111,115,105,116,105,111,110,46,121,42,48,46,53,59,10,9,35,101,108,115,101,10,9,118,84,101,120,67,111,111,114,100,32,61,32,118,101,99,50,40,40,86,101,114,116,101,120,80,111,115,105,116,105,111,110,46,120,32,43,32,49,46,48,41,42,48,46,53,44,32,40,86,101,114,116,101,120,80,111,115,105,116,105,111,110,46,121,32,43,32,49,46,48,41,42,48,46,53,41,59,10,9,35,101,110,100,105,102,32,47,47,32,70,76,65,71,95,70,76,73,80,95,85,86,83,10,35,101,110,100,105,102,10,125,10, \ No newline at end of file diff --git a/src/Nazara/Renderer/Shaders/FullscreenQuad/core.vert b/src/Nazara/Renderer/Shaders/FullscreenQuad/core.vert index b86136ef2..38f43fe07 100644 --- a/src/Nazara/Renderer/Shaders/FullscreenQuad/core.vert +++ b/src/Nazara/Renderer/Shaders/FullscreenQuad/core.vert @@ -13,11 +13,12 @@ uniform sampler2D MaterialAlphaMap; uniform float MaterialAlphaThreshold; uniform vec4 MaterialDiffuse; uniform sampler2D MaterialDiffuseMap; +uniform float VertexDepth; /********************Fonctions********************/ void main() { - gl_Position = vec4(VertexPosition, 0.0, 1.0); + gl_Position = vec4(VertexPosition, VertexDepth, 1.0); #if ALPHA_MAPPING || DIFFUSE_MAPPING #if FLAG_FLIP_UVS diff --git a/src/Nazara/Renderer/Shaders/FullscreenQuad/core.vert.h b/src/Nazara/Renderer/Shaders/FullscreenQuad/core.vert.h index 764b9629b..08bf9058f 100644 --- a/src/Nazara/Renderer/Shaders/FullscreenQuad/core.vert.h +++ b/src/Nazara/Renderer/Shaders/FullscreenQuad/core.vert.h @@ -1 +1 @@ -35,105,102,32,70,76,65,71,95,68,69,70,69,82,82,69,68,10,9,35,101,114,114,111,114,32,68,101,102,101,114,114,101,100,32,83,104,97,100,105,110,103,32,110,101,101,100,115,32,99,111,114,101,32,112,114,111,102,105,108,101,10,35,101,110,100,105,102,10,10,47,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,69,110,116,114,97,110,116,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,47,10,105,110,32,118,101,99,50,32,86,101,114,116,101,120,80,111,115,105,116,105,111,110,59,10,10,47,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,83,111,114,116,97,110,116,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,47,10,111,117,116,32,118,101,99,50,32,118,84,101,120,67,111,111,114,100,59,10,10,47,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,85,110,105,102,111,114,109,101,115,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,47,10,117,110,105,102,111,114,109,32,115,97,109,112,108,101,114,50,68,32,77,97,116,101,114,105,97,108,65,108,112,104,97,77,97,112,59,10,117,110,105,102,111,114,109,32,102,108,111,97,116,32,77,97,116,101,114,105,97,108,65,108,112,104,97,84,104,114,101,115,104,111,108,100,59,10,117,110,105,102,111,114,109,32,118,101,99,52,32,77,97,116,101,114,105,97,108,68,105,102,102,117,115,101,59,10,117,110,105,102,111,114,109,32,115,97,109,112,108,101,114,50,68,32,77,97,116,101,114,105,97,108,68,105,102,102,117,115,101,77,97,112,59,10,10,47,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,70,111,110,99,116,105,111,110,115,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,47,10,118,111,105,100,32,109,97,105,110,40,41,10,123,10,9,103,108,95,80,111,115,105,116,105,111,110,32,61,32,118,101,99,52,40,86,101,114,116,101,120,80,111,115,105,116,105,111,110,44,32,48,46,48,44,32,49,46,48,41,59,10,10,35,105,102,32,65,76,80,72,65,95,77,65,80,80,73,78,71,32,124,124,32,68,73,70,70,85,83,69,95,77,65,80,80,73,78,71,10,9,35,105,102,32,70,76,65,71,95,70,76,73,80,95,85,86,83,10,9,118,84,101,120,67,111,111,114,100,32,61,32,118,101,99,50,40,40,86,101,114,116,101,120,80,111,115,105,116,105,111,110,46,120,32,43,32,49,46,48,41,42,48,46,53,44,32,48,46,53,32,45,32,86,101,114,116,101,120,80,111,115,105,116,105,111,110,46,121,42,48,46,53,59,10,9,35,101,108,115,101,10,9,118,84,101,120,67,111,111,114,100,32,61,32,118,101,99,50,40,40,86,101,114,116,101,120,80,111,115,105,116,105,111,110,46,120,32,43,32,49,46,48,41,42,48,46,53,44,32,40,86,101,114,116,101,120,80,111,115,105,116,105,111,110,46,121,32,43,32,49,46,48,41,42,48,46,53,41,59,10,9,35,101,110,100,105,102,32,47,47,32,70,76,65,71,95,70,76,73,80,95,85,86,83,10,35,101,110,100,105,102,10,125,10, \ No newline at end of file +35,105,102,32,70,76,65,71,95,68,69,70,69,82,82,69,68,10,9,35,101,114,114,111,114,32,68,101,102,101,114,114,101,100,32,83,104,97,100,105,110,103,32,110,101,101,100,115,32,99,111,114,101,32,112,114,111,102,105,108,101,10,35,101,110,100,105,102,10,10,47,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,69,110,116,114,97,110,116,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,47,10,105,110,32,118,101,99,50,32,86,101,114,116,101,120,80,111,115,105,116,105,111,110,59,10,10,47,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,83,111,114,116,97,110,116,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,47,10,111,117,116,32,118,101,99,50,32,118,84,101,120,67,111,111,114,100,59,10,10,47,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,85,110,105,102,111,114,109,101,115,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,47,10,117,110,105,102,111,114,109,32,115,97,109,112,108,101,114,50,68,32,77,97,116,101,114,105,97,108,65,108,112,104,97,77,97,112,59,10,117,110,105,102,111,114,109,32,102,108,111,97,116,32,77,97,116,101,114,105,97,108,65,108,112,104,97,84,104,114,101,115,104,111,108,100,59,10,117,110,105,102,111,114,109,32,118,101,99,52,32,77,97,116,101,114,105,97,108,68,105,102,102,117,115,101,59,10,117,110,105,102,111,114,109,32,115,97,109,112,108,101,114,50,68,32,77,97,116,101,114,105,97,108,68,105,102,102,117,115,101,77,97,112,59,10,117,110,105,102,111,114,109,32,102,108,111,97,116,32,86,101,114,116,101,120,68,101,112,116,104,59,10,10,47,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,70,111,110,99,116,105,111,110,115,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,47,10,118,111,105,100,32,109,97,105,110,40,41,10,123,10,9,103,108,95,80,111,115,105,116,105,111,110,32,61,32,118,101,99,52,40,86,101,114,116,101,120,80,111,115,105,116,105,111,110,44,32,86,101,114,116,101,120,68,101,112,116,104,44,32,49,46,48,41,59,10,10,35,105,102,32,65,76,80,72,65,95,77,65,80,80,73,78,71,32,124,124,32,68,73,70,70,85,83,69,95,77,65,80,80,73,78,71,10,9,35,105,102,32,70,76,65,71,95,70,76,73,80,95,85,86,83,10,9,118,84,101,120,67,111,111,114,100,32,61,32,118,101,99,50,40,40,86,101,114,116,101,120,80,111,115,105,116,105,111,110,46,120,32,43,32,49,46,48,41,42,48,46,53,44,32,48,46,53,32,45,32,86,101,114,116,101,120,80,111,115,105,116,105,111,110,46,121,42,48,46,53,59,10,9,35,101,108,115,101,10,9,118,84,101,120,67,111,111,114,100,32,61,32,118,101,99,50,40,40,86,101,114,116,101,120,80,111,115,105,116,105,111,110,46,120,32,43,32,49,46,48,41,42,48,46,53,44,32,40,86,101,114,116,101,120,80,111,115,105,116,105,111,110,46,121,32,43,32,49,46,48,41,42,48,46,53,41,59,10,9,35,101,110,100,105,102,32,47,47,32,70,76,65,71,95,70,76,73,80,95,85,86,83,10,35,101,110,100,105,102,10,125,10, \ No newline at end of file