diff --git a/third_party/ktx-src/tests/loadtests/appfwSDL/AppBaseSDL.cpp b/third_party/ktx-src/tests/loadtests/appfwSDL/AppBaseSDL.cpp new file mode 100644 index 0000000000000000000000000000000000000000..003e319be592582458d66062a2cf53b60077c13f --- /dev/null +++ b/third_party/ktx-src/tests/loadtests/appfwSDL/AppBaseSDL.cpp @@ -0,0 +1,138 @@ +/* -*- tab-width: 4; -*- */ +/* vi: set sw=2 ts=4 expandtab: */ + +/* $Id: f63e0a9e6eed51ed84a8eea1eff0708c8a6af22b $ */ + +/* + * Copyright 2015-2020 Mark Callow. + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @internal + * @file + * @~English + * + * @brief Base class for SDL applications. + */ + +#include "AppBaseSDL.h" +#include +#include +#include + +bool +AppBaseSDL::initialize(Args& /*args*/) +{ + const char* basePath = SDL_GetBasePath(); + // SDL_GetBasePath returns directory of the app, except for + // iOS & macOS app bundles where it returns the Resources + // directory. + if (basePath == NULL) + basePath = SDL_strdup("./"); + sBasePath = basePath; +#if SDL_PLATFORM_LINUX + // TODO figure out best way to handle these resources + sBasePath += "../resources/"; +#endif +#if SDL_PLATFORM_WINDOWS + // Ditto + sBasePath += "resources/"; +#endif + return true; +} + + +void +AppBaseSDL::initializeFPSTimer() +{ + lastFrameTime = 0; + fpsCounter.numFrames = 0; + fpsCounter.lastFPS = 0; + startTicks = fpsCounter.startTicks = SDL_GetPerformanceCounter(); +} + + +void +AppBaseSDL::finalize() { + +} + + +bool +AppBaseSDL::doEvent(SDL_Event* event) +{ + switch (event->type) { + case SDL_EVENT_QUIT: + finalize(); + exit(0); + } + return true; +} + + +void +AppBaseSDL::onFPSUpdate() +{ + +} + + +// Protected, non-virtual +void +AppBaseSDL::drawFrame() +{ + ticks_t ticks = SDL_GetPerformanceCounter(); + Uint64 tps = SDL_GetPerformanceFrequency(); + uint32_t msTicksSinceStart = (uint32_t)((ticks - startTicks) * 1000 / tps); + + drawFrame(msTicksSinceStart); + + ticks_t endTicks = SDL_GetPerformanceCounter(); + lastFrameTime = (1000.0f * (endTicks - ticks)) / tps; + fpsCounter.numFrames++; + if (endTicks - fpsCounter.startTicks > tps) { + fpsCounter.lastFPS = (float)(fpsCounter.numFrames * tps) + / (endTicks - fpsCounter.startTicks); + onFPSUpdate(); // Notify listeners that fps value has been updated. + fpsCounter.startTicks = endTicks; + fpsCounter.numFrames = 0; + } +} + +//---------------------------------------------------------------------- +// Window title and text overlay functions +//---------------------------------------------------------------------- + + +void +AppBaseSDL::setAppTitle(const char* const szExtra) +{ + appTitle = name(); + if (szExtra != NULL && szExtra[0] != '\0') { + appTitle += ": "; + appTitle += szExtra; + } + setWindowTitle(); +} + + +void +AppBaseSDL::setWindowTitle() +{ + std::stringstream ss; + std::string wt; + + ss << std::fixed << std::setprecision(2) + << lastFrameTime << "ms (" << fpsCounter.lastFPS << " fps)" << " "; + wt = ss.str(); + wt += appTitle; + SDL_SetWindowTitle(pswMainWindow, wt.c_str()); +} + + +const char* appName() +{ + return theApp->name(); +} + diff --git a/third_party/ktx-src/tests/loadtests/appfwSDL/AppBaseSDL.h b/third_party/ktx-src/tests/loadtests/appfwSDL/AppBaseSDL.h new file mode 100644 index 0000000000000000000000000000000000000000..11cc09ce44a76044623403d05199d4597fc215d8 --- /dev/null +++ b/third_party/ktx-src/tests/loadtests/appfwSDL/AppBaseSDL.h @@ -0,0 +1,85 @@ +/* -*- tab-width: 4; -*- */ +/* vi: set sw=2 ts=4 expandtab: */ + +#ifndef APP_BASE_SDL_H_1456211087 +#define APP_BASE_SDL_H_1456211087 + +/* $Id: f63e0a9e6eed51ed84a8eea1eff0708c8a6af22b $ */ + +/* + * Copyright 2015-2020 Mark Callow. + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @internal + * @file + * @~English + * + * @brief Declarations for App framework using SDL. + */ + +#include +#include +#include + +class AppBaseSDL { + public: + typedef Uint64 ticks_t; + typedef std::vector Args; + AppBaseSDL(const char* const name) : szName(name), appTitle(name) { } + virtual bool initialize(Args& args); + virtual void finalize(); + // Ticks in milliseconds since start. + virtual void drawFrame(uint32_t) { } + // When used with SDL_SetEventWatch, return value is ignored. When used + // with SDL_SetEventFilter, 1 causes event to be added to SDL's internal + // event queue, 0 causes it to be dropped. + virtual bool doEvent(SDL_Event* event); + virtual void onFPSUpdate(); + virtual SDL_Window* getMainWindow() { return pswMainWindow; } + + void drawFrame(); + void initializeFPSTimer(); + const char* name() { return szName; } + const std::string getAssetPath() { return sBasePath; } + + // Sets title to be used on window title bar. Content of szExtra ia + // appended to the app name. + virtual void setAppTitle(const char* const szExtra); + + static bool onEvent(void* userdata, SDL_Event* event) { + return ((AppBaseSDL *)userdata)->doEvent(event); + } + + static void onDrawFrame(void* userdata) { + ((AppBaseSDL *)userdata)->drawFrame(); + } + + protected: + // Sets text on window title bar. Fps value is preprended to appTitle. + virtual void setWindowTitle(); + + ticks_t startTicks; + float lastFrameTime; // ms + struct fpsCounter { + ticks_t startTicks; + int numFrames; + float lastFPS; + } fpsCounter; + + SDL_Window* pswMainWindow; + + const char* const szName; + std::string appTitle; + std::string sBasePath; + +}; + +extern class AppBaseSDL* theApp; + +#endif /* APP_BASE_SDL_H_1456211087 */ + + + + diff --git a/third_party/ktx-src/tests/loadtests/appfwSDL/GLAppSDL.cpp b/third_party/ktx-src/tests/loadtests/appfwSDL/GLAppSDL.cpp new file mode 100644 index 0000000000000000000000000000000000000000..c1a0cb593686dc8e1d9c03a939bd07872fa51640 --- /dev/null +++ b/third_party/ktx-src/tests/loadtests/appfwSDL/GLAppSDL.cpp @@ -0,0 +1,330 @@ +/* -*- tab-width: 4; -*- */ +/* vi: set sw=2 ts=4 expandtab: */ + +/* $Id: ac63511da134f2c25a9e1da86a36bc27b6198ae3 $ */ + +/* + * Copyright 2015-2020 Mark Callow. + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @internal + * @file + * @~English + * + * @brief GLAppSDL app class. + */ + +#if defined(_WIN32) + #if _MSC_VER < 1900 + #define snprintf _snprintf + #endif + #define _CRT_SECURE_NO_WARNINGS + #define WIN32_LEAN_AND_MEAN + #include "windows.h" + #include "GL/glew.h" + #include "SDL3/SDL_loadso.h" +#else + #define GL_GLEXT_PROTOTYPES 1 + #include "GL/glcorearb.h" // for glEnable and FRAMEBUFFER_RGB +#endif + +#include +#include +#include + +#include "GLAppSDL.h" + +#if SDL_PLATFORM_WINDOWS +void setWindowsIcon(SDL_Window *sdlWindow); +#endif + +bool +GLAppSDL::initialize(Args& args) +{ + if (!AppBaseSDL::initialize(args)) + return false; + + SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, profile); + SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, majorVersion); + SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, minorVersion); + // On SDL3 this defaults to 8. On SDL2 it was 0. + SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 0); +#if !defined(EMSCRIPTEN) + if (majorVersion >= 3) + SDL_GL_SetAttribute(SDL_GL_FRAMEBUFFER_SRGB_CAPABLE, 1); +#endif +#if defined(DEBUG) && !defined(EMSCRIPTEN) + SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, SDL_GL_CONTEXT_DEBUG_FLAG); +#endif + + if (profile == SDL_GL_CONTEXT_PROFILE_ES) { +#if 0 + int numVideoDrivers = SDL_GetNumVideoDrivers(); + int i; + const char** drivers; + + drivers = (const char**)SDL_malloc(sizeof(const char*) * numVideoDrivers); + for (i = 0; i < numVideoDrivers; i++) { + drivers[i] = SDL_GetVideoDriver(i); + } +#endif + + // Only the indicated platforms pay attention to these hints + // but they could be set on any platform. +#if SDL_PLATFORM_WINDOWS || SDL_PLATFORM_LINUX + SDL_SetHint(SDL_HINT_OPENGL_ES_DRIVER, "1"); +#endif + +#if SDL_PLATFORM_WINDOWS + // If using ANGLE copied from Chrome should set to "d3dcompiler_46.dll" + // Should set value via compiler -D definition from gyp file. + SDL_SetHint(SDL_HINT_VIDEO_WIN_D3DCOMPILER, "none"); +#endif + } + + SDL_SetHint(SDL_HINT_MAC_CTRL_CLICK_EMULATE_RIGHT_CLICK, "1"); + // CAUTION: Setting this to 0 (the default) on macOS causes loss of all touch events + // from a trackpad not just those corresponding to mouse clicks. + SDL_SetHint(SDL_HINT_MOUSE_TOUCH_EVENTS, "1"); + +#if 0 + const char* mt = SDL_GetHint(SDL_HINT_MOUSE_TOUCH_EVENTS); + SDL_Log("MOUSE_TOUCH_EVENTS = %s", mt); + const char* tm = SDL_GetHint(SDL_HINT_TOUCH_MOUSE_EVENTS); + SDL_Log("TOUCH_MOUSE_EVENTS = %s", tm); + const char* tto = SDL_GetHint(SDL_HINT_TRACKPAD_IS_TOUCH_ONLY); + SDL_Log("TRACKPAD_IS_TOUCH_ONLY = %s", tto); +#endif + + pswMainWindow = SDL_CreateWindow( + szName, + w_width, w_height, + SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE + ); + + if (pswMainWindow == NULL) { + (void)SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, szName, SDL_GetError(), NULL); + return false; + } +#if SDL_PLATFORM_WINDOWS + // Set the application's own icon in place of the Windows default set by SDL. + // Needs to be done here to avoid change being visible. + setWindowsIcon(pswMainWindow); +#endif + + sgcGLContext = SDL_GL_CreateContext(pswMainWindow); + // Work around bug in SDL. It returns a 2.x context when 3.x is requested. + // It does though internally record an error. + const char* error = SDL_GetError(); + if (sgcGLContext == NULL + || (error[0] != '\0' + && majorVersion >= 3 + && (profile == SDL_GL_CONTEXT_PROFILE_CORE + || profile == SDL_GL_CONTEXT_PROFILE_COMPATIBILITY)) + ) { + (void)SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, szName, SDL_GetError(), NULL); + return false; + } + +#if SDL_PLATFORM_WINDOWS + if (profile != SDL_GL_CONTEXT_PROFILE_ES) + { + // No choice but to use GLEW for GL on Windows; there is no .lib with static + // bindings. For ES we use one of the hardware vendor SDKs all of which have + // static bindings. + // TODO: Figure out how to support {GLX,WGL}_EXT_create_context_es2_profile + // were there are no static bindings. Need a GLEW equivalent for ES and + // different compile options. Perhaps can borrow function loading stuff + // from SDL's testgles2.c. + + // So one build of this library can be linked in to applications using GLEW and + // applications not using GLEW, do not call any GLEW functions directly. + // Call via queried function pointers. + SDL_SharedObject* glewdll; +#if defined(_DEBUG) + glewdll = SDL_LoadObject("glew32d.dll"); + // KTX-Software repo only contains non-debug library for x64 hence this. + if (glewdll == NULL) { + glewdll = SDL_LoadObject("glew32.dll"); + } +#else + glewdll = SDL_LoadObject("glew32.dll"); +#endif + if (glewdll == NULL) { + std::string sName(szName); + + (void)SDL_ShowSimpleMessageBox( + SDL_MESSAGEBOX_ERROR, + szName, + SDL_GetError(), + NULL); + return false; + } + + typedef GLenum(GLEWAPIENTRY PFNGLEWINIT)(void); + typedef const GLubyte * GLEWAPIENTRY PFNGLEWGETERRORSTRING(GLenum error); + PFNGLEWINIT* pGlewInit; + PFNGLEWGETERRORSTRING* pGlewGetErrorString = nullptr; + bool loadError = true; +#define STR(s) #s +#if defined(_M_IX86) + /* Win32 GLEW uses __stdcall. */ + #define DNAMESTR(x,n) STR(_##x##@##n) +#else + /* x64 uses __cdecl. */ + #define DNAMESTR(x,n) STR(x) +#endif + pGlewInit = (PFNGLEWINIT*)SDL_LoadFunction(glewdll, DNAMESTR(glewInit,0)); + if (pGlewInit != NULL) { + pGlewGetErrorString = (PFNGLEWGETERRORSTRING*)SDL_LoadFunction( + glewdll, DNAMESTR(glewGetErrorString,4)); + if (pGlewGetErrorString != NULL) { + loadError = false; + } + } + + if (loadError) { + std::string sName(szName); + + (void)SDL_ShowSimpleMessageBox( + SDL_MESSAGEBOX_ERROR, + szName, + SDL_GetError(), + NULL); + return false; + } + int iResult = pGlewInit(); + if (iResult != GLEW_OK) { + std::string sName(szName); + + (void)SDL_ShowSimpleMessageBox( + SDL_MESSAGEBOX_ERROR, + szName, + (const char*)pGlewGetErrorString(iResult), + NULL); + return false; + } + } +#endif + + int srgb; + SDL_GL_GetAttribute(SDL_GL_FRAMEBUFFER_SRGB_CAPABLE, &srgb); + if (srgb && profile != SDL_GL_CONTEXT_PROFILE_ES) + glEnable(GL_FRAMEBUFFER_SRGB); + + // In case the window is created with a different size than specified. + int actualWidth, actualHeight; + SDL_GetWindowSizeInPixels(pswMainWindow, &actualWidth, &actualHeight); + resizeWindow(actualWidth, actualHeight); + + initializeFPSTimer(); + return true; +} + + +void +GLAppSDL::finalize() +{ + SDL_GL_DestroyContext(sgcGLContext); +} + + +bool +GLAppSDL::doEvent(SDL_Event* event) +{ + switch (event->type) { + case SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED: + resizeWindow(event->window.data1, event->window.data2); + return 0; + break; + } + return AppBaseSDL::doEvent(event); +} + + +void +GLAppSDL::drawFrame(uint32_t /*msTicks*/) +{ + SDL_GL_SwapWindow(pswMainWindow); +} + + +void +GLAppSDL::windowResized() +{ + // Derived class can override as necessary. +} + + +void +GLAppSDL::resizeWindow(int width, int height) +{ + w_width = width; + w_height = height; + windowResized(); +} + + +void +GLAppSDL::onFPSUpdate() +{ + // Using onFPSUpdate avoids rewriting the title every frame. + setWindowTitle(); +} + +#if 0 +void +GLAppSDL::setAppTitle(const char* const szExtra) +{ + appTitle = name(); + if (szExtra != NULL && szExtra[0] != '\0') { + appTitle += ": "; + appTitle += szExtra; + } + setWindowTitle(); +} + + +void +GLAppSDL::setWindowTitle(const char* const szExtra) +{ + std::stringstream ss; + + ss << std::fixed << std::setprecision(2) + << lastFrameTime << "ms (" << fpsCounter.lastFPS << " fps)" + << " - " << szName; + + if (szExtra != NULL && szExtra[0] != '\0') { + ss << ": " << szExtra; + } + SDL_SetWindowTitle(pswMainWindow, ss.str().c_str()); +} + +void +GLAppSDL::setWindowTitle() +{ + SDL_SetWindowTitle(pswMainWindow, appTitle.c_str()); +} +#endif + +#if SDL_PLATFORM_WINDOWS +// Windows specific code to use icon in module +void +setWindowsIcon(SDL_Window *sdlWindow) { + HINSTANCE handle = ::GetModuleHandle(nullptr); + // Identify icon by name rather than IDI_ macro to avoid having to + // include application's resource.h. + HICON icon = ::LoadIcon(handle, "MAIN_ICON");// MAKEINTRESOURCE(IDI_ICON1)); + if (icon != nullptr){ + HWND hwnd = (HWND)SDL_GetPointerProperty(SDL_GetWindowProperties(sdlWindow), SDL_PROP_WINDOW_WIN32_HWND_POINTER, NULL); + if (hwnd) { + ::SetClassLongPtr(hwnd, GCLP_HICON, reinterpret_cast(icon)); + } + } +} +#endif + +// } + diff --git a/third_party/ktx-src/tests/loadtests/appfwSDL/GLAppSDL.h b/third_party/ktx-src/tests/loadtests/appfwSDL/GLAppSDL.h new file mode 100644 index 0000000000000000000000000000000000000000..a65617552de4608bed267236dd3031e02ef20b40 --- /dev/null +++ b/third_party/ktx-src/tests/loadtests/appfwSDL/GLAppSDL.h @@ -0,0 +1,59 @@ +/* -*- tab-width: 4; -*- */ +/* vi: set sw=2 ts=4 expandtab: */ + +#ifndef GL_APP_SDL_H_1456211188 +#define GL_APP_SDL_H_1456211188 + +/* $Id: ac63511da134f2c25a9e1da86a36bc27b6198ae3 $ */ + +/* + * Copyright 2015-2020 Mark Callow. + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @internal + * @file + * @~English + * + * @brief Declaration of GLAppSDL base class for GL apps. + */ + +#include "AppBaseSDL.h" + + +class GLAppSDL : public AppBaseSDL { + public: + GLAppSDL(const char* const name, + int width, int height, + const SDL_GLProfile profile, + const int majorVersion, + const int minorVersion) + : AppBaseSDL(name), + profile(profile), + majorVersion(majorVersion), minorVersion(minorVersion) + { + appTitle = name; + w_width = width; + w_height = height; + }; + virtual bool doEvent(SDL_Event* event); + virtual void drawFrame(uint32_t msTicks); + virtual void finalize(); + virtual bool initialize(Args& args); + virtual void onFPSUpdate(); + virtual void resizeWindow(int width, int height); + virtual void windowResized(); + + protected: + SDL_GLContext sgcGLContext; + + int w_width; + int w_height; + + const SDL_GLProfile profile; + const int majorVersion; + const int minorVersion; +}; + +#endif /* GL_APP_SDL_H_1456211188 */ diff --git a/third_party/ktx-src/tests/loadtests/appfwSDL/VulkanAppSDL/VulkanAppSDL.cpp b/third_party/ktx-src/tests/loadtests/appfwSDL/VulkanAppSDL/VulkanAppSDL.cpp new file mode 100644 index 0000000000000000000000000000000000000000..406f87f911844f82ef573b4f0d8d2a0042d470e6 --- /dev/null +++ b/third_party/ktx-src/tests/loadtests/appfwSDL/VulkanAppSDL/VulkanAppSDL.cpp @@ -0,0 +1,1748 @@ +/* -*- tab-width: 4; -*- */ +/* vi: set sw=2 ts=4 expandtab: */ + +/* + * Copyright 2017-2020 Mark Callow. + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @internal + * @class VulkanAppSDL + * @~English + * + * @brief Framework for Vulkan apps using SDL windows. + * + * @author Mark Callow, github.com/MarkCallow. + */ + + +#if defined(_WIN32) + #if _MSC_VER < 1900 + #define snprintf _snprintf + #endif + #define _CRT_SECURE_NO_WARNINGS +#endif + +#include +#include +#include +#include +#include +#include + +#include "VulkanAppSDL.h" + +// Include this when vulkantools is removed. +//#include "vulkancheckres.h" + +#define ARRAY_LEN(a) (sizeof(a) / sizeof(a[0])) + +#define ERROR_RETURN(msg) \ + (void)SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, szName, msg, NULL); \ + return false; + +#define WARNING(msg) \ + (void)SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_WARNING, szName, msg, NULL); + +#define GET_INSTANCE_PROC_ADDR(inst, entrypoint) \ + { \ + pfn##entrypoint = \ + (PFN_vk##entrypoint)vkGetInstanceProcAddr(inst, "vk" #entrypoint); \ + if (pfn##entrypoint == NULL) { \ + ERROR_RETURN("vkGetInstanceProcAddr: unable to find vk" #entrypoint); \ + } \ + } + +#define GET_DEVICE_PROC_ADDR(device, entrypoint) \ + { \ + pfn##entrypoint = \ + (PFN_vk##entrypoint)vkGetDeviceProcAddr(device, "vk" #entrypoint); \ + if (pfn##entrypoint == NULL) { \ + ERROR_RETURN("vkGetDeviceProcAddr: unable to find vk" #entrypoint); \ + } \ + } + +#if SDL_PLATFORM_WINDOWS +void setWindowsIcon(SDL_Window *sdlWindow); +#endif + +VulkanAppSDL::~VulkanAppSDL() +{ + +} + + +bool +VulkanAppSDL::initialize(Args& args) +{ + for (uint32_t i = 1; i < args.size(); i++) { + if (args[i].compare("--validate") == 0) { + validate = true; + args.erase(args.begin() + i); + break; + } + } + if (!AppBaseSDL::initialize(args)) + return false; + + SDL_SetHint(SDL_HINT_MAC_CTRL_CLICK_EMULATE_RIGHT_CLICK, "1"); + // CAUTION: Setting this to 0 (the default) on macOS causes loss of all touch events + // from a trackpad not just those corresponding to mouse clicks. + SDL_SetHint(SDL_HINT_MOUSE_TOUCH_EVENTS, "1"); + // Create window. + // Vulkan samples do not pass any information from Vulkan initialization + // to window creation so creating the window first should be ok... + pswMainWindow = SDL_CreateWindow( + szName, + w_width, w_height, + SDL_WINDOW_VULKAN | SDL_WINDOW_RESIZABLE | SDL_WINDOW_HIGH_PIXEL_DENSITY + ); + + if (pswMainWindow == NULL) { + (void)SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, szName, + SDL_GetError(), NULL); + return false; + } + +#if SDL_PLATFORM_WINDOWS + // Set the application's own icon in place of the Windows default set by SDL. + // Needs to be done here to avoid change being visible. + setWindowsIcon(pswMainWindow); +#endif + + if (!initializeVulkan()) { + return false; + } + + initializeFPSTimer(); + return true; +} + + +void +VulkanAppSDL::finalize() +{ + if (vkctx.descriptorPool) + { + vkctx.device.destroyDescriptorPool(vkctx.descriptorPool, nullptr); + } + vkDestroyPipelineCache((VkDevice)vkctx.device, vkctx.pipelineCache, nullptr); + + vkctx.swapchain.cleanup(); + for (auto& shaderModule : shaderModules) + { + vkctx.device.destroyShaderModule(shaderModule); + } + if (enableTextOverlay) + { + delete textOverlay; + } + + vkctx.device.destroyCommandPool(vkctx.commandPool); + //vkctx.device.destroy(); + if (vsSurface != VK_NULL_HANDLE) { + // Destroy + } + //vkctx.instance.destroy(); +} + + +bool +VulkanAppSDL::doEvent(SDL_Event* event) +{ + switch (event->type) { + case SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED: + resizeWindow(event->window.data1, event->window.data2); + return 0; + break; + } + return AppBaseSDL::doEvent(event); +} + + +void +VulkanAppSDL::drawFrame(uint32_t /*msTicks*/) +{ + if (!prepared) + return; + + prepareFrame(); + + vkctx.drawCmdSubmitInfo.commandBufferCount = 1; + vkctx.drawCmdSubmitInfo.pCommandBuffers = + &vkctx.drawCmdBuffers[currentBuffer]; + + // Submit to queue + VK_CHECK_RESULT(vkQueueSubmit(vkctx.queue, 1, + &vkctx.drawCmdSubmitInfo, VK_NULL_HANDLE)); + + submitFrame(); +} + + +void +VulkanAppSDL::windowResized() +{ + // Derived class can override as necessary. +} + +void +VulkanAppSDL::resizeWindow(int width, int height) +{ + // XXX Necessary? Get out-of-date errors from vkAcquireNextImage regardless + // of whether this guard is used. This guard doesn't seem to make them any + // less likely. +#define GUARD 0 +#if GUARD + if (!prepared) + { + return; + } + prepared = false; +#endif + + // Recreate swap chain. + + w_width = width; + w_height = height; + + // This destroys any existing swapchain and makes a new one. + createSwapchain(); + + vkDestroyImageView(vkctx.device, vkctx.depthBuffer.view, nullptr); + vkDestroyImage(vkctx.device, vkctx.depthBuffer.image, nullptr); + vkFreeMemory(vkctx.device, vkctx.depthBuffer.mem, nullptr); + + // Recreate the frame buffers + for (uint32_t i = 0; i < vkctx.framebuffers.size(); i++) + { + vkDestroyFramebuffer(vkctx.device, vkctx.framebuffers[i], nullptr); + } + + // XXX Is this necessary? Is Willems doing this? + vkDestroyRenderPass(vkctx.device, vkctx.renderPass, NULL); + + vkctx.destroyPresentCommandBuffers(); + (void)(prepareDepthBuffer() // XXX Call it DepthStencil? + && vkctx.createPresentCommandBuffers() + && preparePresentCommandBuffers() + && prepareRenderPass() + && prepareFramebuffers()); + + flushInitialCommands(); + if (enableTextOverlay) + { + textOverlay->reallocateCommandBuffers(); + updateTextOverlay(); + } + // Notify derived class. + windowResized(); +#if GUARD + prepared = true; +#endif +} + + +void +VulkanAppSDL::onFPSUpdate() +{ + if (!enableTextOverlay) { + setWindowTitle(); + } + updateTextOverlay(); + // Using onFPSUpdate avoids rewriting the title every frame. +} + + +//---------------------------------------------------------------------- +// Frame draw utilities +//---------------------------------------------------------------------- + + +void +VulkanAppSDL::prepareFrame() +{ + // Acquire the next image from the swap chain + VkResult err; + err = vkctx.swapchain.acquireNextImage(semaphores.presentComplete, + ¤tBuffer); + + if (err == VK_ERROR_OUT_OF_DATE_KHR) { + // Swap chain is out of date (e.g. the window was resized). + // Re-create it. + //resize(); + //draw(demo); + return; + } else if (err == VK_SUBOPTIMAL_KHR) { + // demo->swapchain is not as optimal as it could be, but the platform's + // presentation engine will still present the image correctly. + } else { + assert(!err); + } + + // Submit post present image barrier to transform the image back to a + // color attachment that our render pass can write to + VkSubmitInfo submitInfo = {}; + submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; + submitInfo.pNext = NULL; + submitInfo.commandBufferCount = 1; + submitInfo.pCommandBuffers = &vkctx.postPresentCmdBuffers[currentBuffer]; + VK_CHECK_RESULT(vkQueueSubmit(vkctx.queue, 1, + &submitInfo, VK_NULL_HANDLE)); +} + + +void +VulkanAppSDL::submitFrame() +{ + bool submitTextOverlay = enableTextOverlay && textOverlay->visible; + + if (submitTextOverlay) + { + // Wait for color attachment output to finish before rendering the + // text overlay + VkPipelineStageFlags stageFlags + = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; + vkctx.drawCmdSubmitInfo.pWaitDstStageMask = &stageFlags; + + // Set semaphores + // Wait for render complete semaphore + vkctx.drawCmdSubmitInfo.waitSemaphoreCount = 1; + vkctx.drawCmdSubmitInfo.pWaitSemaphores = &semaphores.renderComplete; + // Signal ready with text overlay complete semaphore + vkctx.drawCmdSubmitInfo.signalSemaphoreCount = 1; + vkctx.drawCmdSubmitInfo.pSignalSemaphores + = &semaphores.textOverlayComplete; + + // Submit current text overlay command buffer + vkctx.drawCmdSubmitInfo.commandBufferCount = 1; + vkctx.drawCmdSubmitInfo.pCommandBuffers + = &textOverlay->cmdBuffers[currentBuffer]; + VK_CHECK_RESULT(vkQueueSubmit(vkctx.queue, 1, &vkctx.drawCmdSubmitInfo, + VK_NULL_HANDLE)); + + // Reset stage mask + vkctx.drawCmdSubmitInfo.pWaitDstStageMask = &vkctx.submitPipelineStages; + // Reset wait and signal semaphores for rendering next frame + // Wait for swap chain presentation to finish + vkctx.drawCmdSubmitInfo.waitSemaphoreCount = 1; + vkctx.drawCmdSubmitInfo.pWaitSemaphores = &semaphores.presentComplete; + // Signal ready with offscreen semaphore + vkctx.drawCmdSubmitInfo.signalSemaphoreCount = 1; + vkctx.drawCmdSubmitInfo.pSignalSemaphores = &semaphores.renderComplete; + } + // Submit pre-present image barrier to transform the image from color + // attachment to present(khr) for presenting to the swap chain. + VkSubmitInfo submitInfo = {}; + submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; + submitInfo.pNext = NULL; + submitInfo.commandBufferCount = 1; + submitInfo.pCommandBuffers = &vkctx.prePresentCmdBuffers[currentBuffer]; + VK_CHECK_RESULT(vkQueueSubmit(vkctx.queue, 1, &submitInfo, VK_NULL_HANDLE)); + + VkResult err = + vkctx.swapchain.queuePresent(vkctx.queue, currentBuffer, + submitTextOverlay ? + semaphores.textOverlayComplete : semaphores.renderComplete); + + if (err == VK_ERROR_OUT_OF_DATE_KHR) { + // swapchain is out of date (e.g. the window was resized) and + // must be recreated: + //resize(); + } else if (err == VK_SUBOPTIMAL_KHR) { + if (!subOptimalPresentWarned) { + SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_WARNING, szName, + "Suboptimal present of framebuffer.", + NULL); + } + } else + assert(!err); + + // This is necessary because the text overlay's command buffer changes + // every frame and, although the other command buffers are the same + // every frame, they aren't marked for simultaneous use. + VK_CHECK_RESULT(vkQueueWaitIdle(vkctx.queue)); +} + + +//---------------------------------------------------------------------- +// Vulkan Initialization +//---------------------------------------------------------------------- + + +bool +VulkanAppSDL::initializeVulkan() +{ + if (createInstance() + && findGpu() + && setupDebugReporting() + && vkctx.swapchain.connectInstance(vkctx.instance, vkctx.gpu) + && createSurface() + && createDevice() + && vkctx.swapchain.connectDevice(vkctx.device) + && createSemaphores() + && createSwapchain() + && prepareDepthBuffer() + && vkctx.createPresentCommandBuffers() + && preparePresentCommandBuffers() + && prepareRenderPass() + && createPipelineCache() + && prepareFramebuffers()) { + // Functions above most likely generate pipeline commands + // that need to be flushed before beginning the render loop. + flushInitialCommands(); + prepareTextOverlay(); + + return true; + } else { + return false; + } +} + + +bool +VulkanAppSDL::createInstance() +{ + MAYBE_UNUSED VkResult err; + uint32_t instanceLayerCount = 0; + std::vector* instanceValidationLayers = nullptr; + + std::vector instanceValidationLayers_alt1 = { + "VK_LAYER_KHRONOS_validation" + }; + + std::vector instanceValidationLayers_alt2 = { + "VK_LAYER_LUNARG_standard_validation" + }; + + // Look for validation layers. + bool validationFound = 0; + if (validate) { + err = vkEnumerateInstanceLayerProperties(&instanceLayerCount, NULL); + assert(err == VK_SUCCESS); + + if (instanceLayerCount > 0) { + VkLayerProperties* instanceLayers + = new VkLayerProperties[instanceLayerCount]; + err = vkEnumerateInstanceLayerProperties(&instanceLayerCount, + instanceLayers); + assert(err == VK_SUCCESS); + + validationFound = checkLayers( + (uint32_t)instanceValidationLayers_alt1.size(), + instanceValidationLayers_alt1.data(), + instanceLayerCount, + instanceLayers); + if (validationFound) { + instanceValidationLayers = &instanceValidationLayers_alt1; + } else { + // Use alternative set of validation layers. + validationFound = checkLayers( + (uint32_t)instanceValidationLayers_alt2.size(), + instanceValidationLayers_alt2.data(), + instanceLayerCount, + instanceLayers); + instanceValidationLayers = &instanceValidationLayers_alt2; + } + if (validationFound) { + for (uint32_t i = 0; i < instanceValidationLayers->size(); i++) + { + deviceValidationLayers.push_back( + instanceValidationLayers->data()[i]); + } + } + delete [] instanceLayers; + } + + if (!validationFound) { + WARNING("vkEnumerateInstanceLayerProperties failed to find " + "requested validation layers.\n"); + } + } + + + /* Build list of needed extensions */ + uint32_t rec; + const char* const* requiredExtensionNames = SDL_Vulkan_GetInstanceExtensions(&rec); + if (requiredExtensionNames == nullptr) { + std::string title; + std::stringstream msg; + title = szName; + title += ": SDL_Vulkan_GetInstanceExtensions Failure"; + msg << "Could not retrieve instance extensions: " + << SDL_GetError(); + + (void)SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, title.c_str(), + msg.str().c_str(), NULL); + return false; + } + + // Find out if device_properties2 is available. If so, enable it + // as it is required for ASTC HDR and also if we later find we + // are running on a Portability Subset device. + std::vector availableExtensions = + vk::enumerateInstanceExtensionProperties(nullptr); + for (auto& extension : availableExtensions) { + if (!strncmp(extension.extensionName, + VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, + VK_MAX_EXTENSION_NAME_SIZE)) { + extensionNames.push_back( + VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME + ); + } +#if VK_KHR_portability_subset + if (!strncmp(extension.extensionName, + VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME, + VK_MAX_EXTENSION_NAME_SIZE)) { + extensionNames.push_back( + VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME + ); + } +#endif + } + + if (validate) + extensionNames.push_back(VK_EXT_DEBUG_REPORT_EXTENSION_NAME); + + for (uint32_t i = 0; i < rec; i++) { + extensionNames.push_back(requiredExtensionNames[i]); + } + + const vk::ApplicationInfo app(szName, 0, szName, 0, vkVersion); + + vk::InstanceCreateInfo instanceInfo( + {}, + &app, + (uint32_t)deviceValidationLayers.size(), + (const char *const *)deviceValidationLayers.data(), + (uint32_t)extensionNames.size(), + (const char *const *)extensionNames.data()); +#if VK_KHR_portability_subset + instanceInfo.setFlags(vk::InstanceCreateFlagBits::eEnumeratePortabilityKHR); +#endif + + /* + * This is info for a temp callback to use during CreateInstance. + * After the instance is created, we use the instance-based + * function to register the final callback. + */ + VkDebugReportCallbackCreateInfoEXT dbgCreateInfo = { }; + if (validate) { + dbgCreateInfo.sType = VK_STRUCTURE_TYPE_DEBUG_REPORT_CREATE_INFO_EXT; + dbgCreateInfo.pNext = NULL; + dbgCreateInfo.pfnCallback = debugFunc; + dbgCreateInfo.pUserData = this; + dbgCreateInfo.flags = + VK_DEBUG_REPORT_ERROR_BIT_EXT | VK_DEBUG_REPORT_WARNING_BIT_EXT + | VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT; + //| VK_DEBUG_REPORT_INFORMATION_BIT_EXT + //| VK_DEBUG_REPORT_DEBUG_BIT_EXT; + instanceInfo.pNext = &dbgCreateInfo; + } + + //err = vkCreateInstance(&instanceInfo, NULL, &vkctx.instance); + vk::Result cerr; + cerr = vk::createInstance(&instanceInfo, nullptr, &vkctx.instance); + + if (cerr != vk::Result::eSuccess) { + std::string title; + std::stringstream msg; + title = szName; + title += ": vkCreateInstance Failure"; + if (cerr == vk::Result::eErrorIncompatibleDriver) { + msg << "Cannot find a compatible Vulkan installable client " + "driver (ICD)."; + } else if (cerr == vk::Result::eErrorExtensionNotPresent) { + // Figure out which extension(s) are missing. + uint32_t instanceExtensionCount = 0; + + err = vkEnumerateInstanceExtensionProperties( + NULL, + &instanceExtensionCount, + NULL); + VkExtensionProperties* instanceExtensions + = new VkExtensionProperties[instanceExtensionCount]; + + assert(err == VK_SUCCESS); + if (instanceExtensionCount > 0) { + err = vkEnumerateInstanceExtensionProperties( + NULL, + &instanceExtensionCount, + instanceExtensions); + assert(err == VK_SUCCESS); + } + msg << "Cannot find the following extensions:\n"; + for (uint32_t j = 0; j < extensionNames.size(); j++) { + uint32_t k; + for (k = 0; k < instanceExtensionCount; k++) { + if (!strcmp(extensionNames[j], + instanceExtensions[k].extensionName)) + break; + } + if (k == instanceExtensionCount) { + // Not found + msg << " " << extensionNames[j] << "\n"; + } + } + msg << "\nMake sure your layers path is set appropriately."; + delete [] instanceExtensions; + } else { + msg << "vkCreateInstance: unexpected failure, code = " + << cerr << ".\n\nDo you have a compatible Vulkan " + "installable client driver (ICD) installed?"; + } + (void)SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, title.c_str(), + msg.str().c_str(), NULL); + return false; + } + + return true; +} // createInstance + + +bool +VulkanAppSDL::findGpu() +{ + MAYBE_UNUSED vk::Result err; + uint32_t gpuCount; + + // Make initial call to query gpu_count, then second call for gpu info. + err = vkctx.instance.enumeratePhysicalDevices(&gpuCount, + (vk::PhysicalDevice*)nullptr); + assert(err == vk::Result::eSuccess); + + if (gpuCount > 0) { + std::vector gpus; + gpus.resize(gpuCount); + err = vkctx.instance.enumeratePhysicalDevices(&gpuCount, gpus.data()); + assert(err == vk::Result::eSuccess); + // For now just grab the first physical device */ + vkctx.gpu = gpus[0]; + // Store properties and features so apps can query them. + vkctx.gpu.getProperties(&vkctx.gpuProperties); +#if 0 + vk::PhysicalDeviceFeatures2 gpuFeatures2; + vkctx.gpu.getFeatures2(&gpuFeatures2); + vkctx.gpuFeatures = gpuFeatures2.features; +#else + vkctx.gpu.getFeatures(&vkctx.gpuFeatures); +#endif + // Get Memory information and properties + vkctx.gpu.getMemoryProperties(&vkctx.memoryProperties); + + } else { + std::string msg; + ERROR_RETURN( + "vkEnumeratePhysicalDevices reported zero accessible devices.\n\n" + "Do you have a compatible Vulkan installable client driver (ICD) " + "installed?"); + } + + return true; +} // findGpu + + +bool +VulkanAppSDL::setupDebugReporting() +{ + if (validate) { + GET_INSTANCE_PROC_ADDR(vkctx.instance, CreateDebugReportCallbackEXT); + GET_INSTANCE_PROC_ADDR(vkctx.instance, DestroyDebugReportCallbackEXT); + GET_INSTANCE_PROC_ADDR(vkctx.instance, DebugReportMessageEXT); + VkDebugReportCallbackCreateInfoEXT dbgCreateInfo; + dbgCreateInfo.sType = VK_STRUCTURE_TYPE_DEBUG_REPORT_CREATE_INFO_EXT; + dbgCreateInfo.pNext = NULL; + dbgCreateInfo.pfnCallback = debugFunc; + dbgCreateInfo.pUserData = this; + dbgCreateInfo.flags = + VK_DEBUG_REPORT_ERROR_BIT_EXT | VK_DEBUG_REPORT_WARNING_BIT_EXT; + VkResult err = pfnCreateDebugReportCallbackEXT(vkctx.instance, + &dbgCreateInfo, NULL, + &msgCallback); + switch (err) { + case VK_SUCCESS: + return true; + break; + case VK_ERROR_OUT_OF_HOST_MEMORY: + ERROR_RETURN("CreateDebugReportCallback: out of host memory."); + break; + default: + { + std::stringstream msg; + msg << "CreateDebugReportCallback: unexpected failure, result code " + << err << "."; + ERROR_RETURN(msg.str().c_str()); + break; + } + } + } + return true; +} // setupDebugReporting + + +bool +VulkanAppSDL::createSurface() +{ + vkctx.swapchain.initSurface(pswMainWindow); + return true; +} // createSurface + + +bool +VulkanAppSDL::createDevice() +{ + typedef enum { optional, required } ext_need; + struct extension { + std::string name; + ext_need need; + }; + std::vector wantedExtensions; + std::vector extensionsToEnable; + + wantedExtensions.push_back({VK_KHR_SWAPCHAIN_EXTENSION_NAME, required}); + wantedExtensions.push_back({VK_KHR_MAINTENANCE1_EXTENSION_NAME, required}); +#if VK_KHR_portability_subset + // Portability must be enabled, if present. + wantedExtensions.push_back({VK_KHR_PORTABILITY_SUBSET_EXTENSION_NAME, optional}); +#endif + // And if present and enabled it requires this to be enabled. + wantedExtensions.push_back({VK_IMG_FORMAT_PVRTC_EXTENSION_NAME, optional}); +#if VK_EXT_texture_compression_astc_hdr + wantedExtensions.push_back( + {VK_EXT_TEXTURE_COMPRESSION_ASTC_HDR_EXTENSION_NAME, optional} + ); +#endif +#if 0 + wantedExtensions.push_back( + {TEXTURE_COMPRESSION_ASTC_3D_EXTENSION_NAME, optional} + ); +#endif + + vk::Result err; + + // Figure out if we have the required extensions and remove missing + // optional extensions from the list. If anyone wonders why we don't + // just request enablement and ignore the eErrorExtensionNotPresent + // for optional extensions, 2 answers: the debug layer and (some?) Vulkan + // implementations crash when you create a command buffer on the affected + // device. + uint32_t deviceExtensionCount = 0; + + err = vkctx.gpu.enumerateDeviceExtensionProperties( + NULL, + &deviceExtensionCount, + (vk::ExtensionProperties*)nullptr); + assert(err == vk::Result::eSuccess); + + std::vector deviceExtensions; + deviceExtensions.resize(deviceExtensionCount); + + if (deviceExtensionCount > 0) { + err = vkctx.gpu.enumerateDeviceExtensionProperties( + NULL, + &deviceExtensionCount, + deviceExtensions.data()); + assert(err == vk::Result::eSuccess); + } + + std::vector missingExtensions; + for (uint32_t i = 0; i < wantedExtensions.size(); i++) { + uint32_t j; + for (j = 0; j < deviceExtensions.size(); j++) { + if (!wantedExtensions[i].name.compare(static_cast(deviceExtensions[j].extensionName))) { + extensionsToEnable.push_back(wantedExtensions[i].name.c_str()); + if (!wantedExtensions[i].name.compare(VK_IMG_FORMAT_PVRTC_EXTENSION_NAME)) { + vkctx.enabledDeviceExtensions.pvrtc = true; + + } +#if VK_EXT_texture_compression_astc_hdr + if (!wantedExtensions[i].name.compare(VK_EXT_TEXTURE_COMPRESSION_ASTC_HDR_EXTENSION_NAME)) { + vkctx.enabledDeviceExtensions.astc_hdr = true; + } +#endif +#if VK_KHR_portability_subset + if (!wantedExtensions[i].name.compare(VK_KHR_PORTABILITY_SUBSET_EXTENSION_NAME)) { + vkctx.gpuIsPortabilitySubsetDevice = true; + } +#endif + break; + } + } + if (j == deviceExtensionCount) { + // Not found + if (wantedExtensions[i].need == required) { + missingExtensions.push_back(wantedExtensions[i].name); + } + } + } + + if (missingExtensions.size() > 0) { + std::string title; + std::stringstream msg; + std::vector::const_iterator it; + + title = szName; + title += ": Vulkan Extensions not Found"; + msg << "The following required device extensions were not found:\n"; + for (it = missingExtensions.begin(); it < missingExtensions.end(); it++) + msg << " " << *it << "\n"; + + msg << "\n\nDo you have a compatible Vulkan " + "installable client driver (ICD) installed?"; + (void)SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, title.c_str(), + msg.str().c_str(), NULL); + return false; + } + + float queue_priorities[1] = {0.0}; + const vk::DeviceQueueCreateInfo queueInfo( + {}, + vkctx.swapchain.queueIndex, + 1, + queue_priorities + ); + + vk::PhysicalDeviceFeatures deviceFeaturesToEnable; + // Enable specific required and available features here. + if (vkctx.gpuFeatures.samplerAnisotropy) + deviceFeaturesToEnable.samplerAnisotropy = true; + if (vkctx.gpuFeatures.textureCompressionASTC_LDR) + deviceFeaturesToEnable.textureCompressionASTC_LDR = true; + if (vkctx.gpuFeatures.textureCompressionBC) + deviceFeaturesToEnable.textureCompressionBC = true; + if (vkctx.gpuFeatures.textureCompressionETC2) + deviceFeaturesToEnable.textureCompressionETC2 = true; + +#if VK_KHR_portability_subset + if (vkctx.gpuIsPortabilitySubsetDevice) { + vk::PhysicalDeviceFeatures2 deviceFeatures; + deviceFeatures.pNext = &vkctx.gpuPortabilityFeatures; + vkctx.gpu.getFeatures2(&deviceFeatures); + } +#endif + +#if 0 + // This needs PhysicaldeviceFeaturesToEnable2 and proper understanding of how to + // navigate a structure chain. Maybe something also was necessary when the + // gpuFeatures were queried. + vk::BaseOutStructure* dfs = reinterpret_cast(&vkctx.gpuFeatures); + while (dfs->pNext != NULL) { + if (dfs->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXTURE_COMPRESSION_ASTC_HDR_FEATURES_EXT) { + vk::PhysicalDeviceTextureCompressionASTCHDRFeaturesEXT* ahf = dfs; + if (afs->textureCompressionASTC_HDR) { + // Add one of these structs to the requested deviceFeaturesToEnable we + // are passing in and enable this feature. + } + } + if (dfs->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXTURE_COMPRESSION_ASTC_3D_FEATURES_EXT) { + vk::PhysicalDeviceTextureCompressionASTC3DFeaturesEXT* ahf = dfs; + if (afs->textureCompressionASTC_HDR) { + // Add one of these structs to the requested deviceFeaturesToEnable we + // are passing in and enable this feature. + } + } +#endif + + vk::DeviceCreateInfo deviceInfo( + {}, + 1, + &queueInfo, + (uint32_t)deviceValidationLayers.size(), + (const char *const *)((validate) + ? deviceValidationLayers.data() + : NULL), + (uint32_t)extensionsToEnable.size(), + (const char *const *)extensionsToEnable.data(), + &deviceFeaturesToEnable); + +#if VK_KHR_portability_subset + if (vkctx.gpuIsPortabilitySubsetDevice) { + // Enable all available portability features. + deviceInfo.pNext = &vkctx.gpuPortabilityFeatures; + } +#endif + + err = vkctx.gpu.createDevice(&deviceInfo, NULL, &vkctx.device); + if (err != vk::Result::eSuccess) { + assert(err != vk::Result::eErrorExtensionNotPresent); + + std::string title; + std::stringstream msg; + title = szName; + title += ": vkCreateDevice Failure"; + msg << "vkCreateDevice: unexpected failure: "; + msg << to_string(err) << "."; + (void)SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, title.c_str(), + msg.str().c_str(), NULL); + return false; + } + + const vk::CommandPoolCreateInfo cmdPoolInfo( + vk::CommandPoolCreateFlagBits::eResetCommandBuffer, + vkctx.swapchain.queueIndex + ); + err = vkctx.device.createCommandPool(&cmdPoolInfo, + nullptr, &vkctx.commandPool); + assert(err == vk::Result::eSuccess); + + vkctx.device.getQueue(vkctx.swapchain.queueIndex, 0, &vkctx.queue); + + return true; +} // createDevice + + +// Create synchronization objects +bool +VulkanAppSDL::createSemaphores() +{ + VkSemaphoreCreateInfo semaphoreCreateInfo = {}; + semaphoreCreateInfo.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO; + semaphoreCreateInfo.pNext = NULL; + semaphoreCreateInfo.flags = 0; + + // Semaphore used to synchronize image presentation. + // Ensures that the image is displayed before we start submitting new + // commands to the queue. + VK_CHECK_RESULT(vkCreateSemaphore(vkctx.device, + &semaphoreCreateInfo, + nullptr, + &semaphores.presentComplete)); + // Semaphore used to synchronize render command submission. + // Ensures that the image is not presented until all render commands have + // been submitted and executed. + VK_CHECK_RESULT(vkCreateSemaphore(vkctx.device, + &semaphoreCreateInfo, + nullptr, + &semaphores.renderComplete)); + // Semaphore used to synchronize text overlay command submission. + // Ensures that the image is not presented until all commands for the + // text overlay have been submitted and executed. Will be inserted after + // the render complete semaphore if the text overlay is enabled. + VK_CHECK_RESULT(vkCreateSemaphore(vkctx.device, + &semaphoreCreateInfo, + nullptr, + &semaphores.textOverlayComplete)); + + // Set up submit info structure + // Semaphores will stay the same during application lifetime + // Command buffer submission info is set by each example + vkctx.drawCmdSubmitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; + vkctx.drawCmdSubmitInfo.pNext = NULL; + vkctx.drawCmdSubmitInfo.pWaitDstStageMask = &vkctx.submitPipelineStages; + vkctx.drawCmdSubmitInfo.waitSemaphoreCount = 1; + vkctx.drawCmdSubmitInfo.pWaitSemaphores = &semaphores.presentComplete; + vkctx.drawCmdSubmitInfo.signalSemaphoreCount = 1; + vkctx.drawCmdSubmitInfo.pSignalSemaphores = &semaphores.renderComplete; + return true; +} + + +bool +VulkanAppSDL::createSwapchain() +{ + vkctx.swapchain.create(&w_width, &w_height, enableVSync); + return true; +} // createSwapchain + + +bool +VulkanAppSDL::prepareDepthBuffer() +{ + vk::Format depthFormat; + vk::ImageAspectFlags aspectMask; + + if (!getSupportedDepthFormat(vkctx.gpu, eNoStencil, e24bits, + vk::ImageTiling::eOptimal, + depthFormat, aspectMask)) + return false; + vkctx.depthBuffer.format = static_cast(depthFormat); + + VkImageCreateInfo image = {}; + image.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO; + image.pNext = NULL; + image.imageType = VK_IMAGE_TYPE_2D; + image.format = static_cast(depthFormat); + image.extent.width = w_width; + image.extent.height = w_height; + image.extent.depth = 1; + image.mipLevels = 1; + image.arrayLayers = 1; + image.samples = VK_SAMPLE_COUNT_1_BIT; + image.tiling = VK_IMAGE_TILING_OPTIMAL; + image.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT + | VK_IMAGE_USAGE_TRANSFER_SRC_BIT; + image.flags = 0; + + VkImageViewCreateInfo view = { }; + view.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO; + view.pNext = NULL; + view.image = VK_NULL_HANDLE; + view.format = static_cast(depthFormat); + // Set just DEPTH_BIT as we're not using stencil. This is okay even if a + // packed depth-stencil format was selected by getSupportedDepthFormat. + view.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT; + view.subresourceRange.baseMipLevel = 0; + view.subresourceRange.levelCount = 1; + view.subresourceRange.baseArrayLayer = 0; + view.subresourceRange.layerCount = 1; + view.flags = 0; + view.viewType = VK_IMAGE_VIEW_TYPE_2D; + + VkMemoryRequirements mem_reqs; + U_ASSERT_ONLY VkResult err; + U_ASSERT_ONLY bool pass; + + /* create image */ + err = vkCreateImage(vkctx.device, &image, NULL, &vkctx.depthBuffer.image); + assert(!err); + + vkGetImageMemoryRequirements(vkctx.device, vkctx.depthBuffer.image, + &mem_reqs); + + vkctx.depthBuffer.memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO; + vkctx.depthBuffer.memAlloc.pNext = NULL; + vkctx.depthBuffer.memAlloc.allocationSize = mem_reqs.size; + vkctx.depthBuffer.memAlloc.memoryTypeIndex = 0; + + pass = vkctx.getMemoryType(mem_reqs.memoryTypeBits, + vk::MemoryPropertyFlagBits::eDeviceLocal, + &vkctx.depthBuffer.memAlloc.memoryTypeIndex); + assert(pass); + + /* allocate memory */ + err = vkAllocateMemory(vkctx.device, &vkctx.depthBuffer.memAlloc, NULL, + &vkctx.depthBuffer.mem); + assert(!err); + + /* bind memory */ + err = + vkBindImageMemory(vkctx.device, vkctx.depthBuffer.image, + vkctx.depthBuffer.mem, 0); + assert(!err); + + setImageLayout(vkctx.depthBuffer.image, + static_cast(aspectMask), + VK_IMAGE_LAYOUT_UNDEFINED, + VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, + (VkAccessFlags)0); + + /* create image view */ + view.image = vkctx.depthBuffer.image; + err = vkCreateImageView(vkctx.device, &view, NULL, &vkctx.depthBuffer.view); + assert(!err); + + return true; +} // prepareDepthBuffer + + +bool +VulkanAppSDL::preparePresentCommandBuffers() +{ + VkCommandBufferBeginInfo cmdBufferBeginInfo = {}; + cmdBufferBeginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; + cmdBufferBeginInfo.pNext = NULL; + + for (uint32_t i = 0; i < vkctx.swapchain.imageCount; i++) + { + // Command buffer for post present barrier + + // Insert a post present image barrier to transform the image back to a + // color attachment that our render pass can write to. We always use + // undefined image layout as the source as it doesn't actually matter + // what is done with the previous image contents + + VK_CHECK_RESULT(vkBeginCommandBuffer(vkctx.postPresentCmdBuffers[i], + &cmdBufferBeginInfo)); + + VkImageMemoryBarrier postPresentBarrier = { }; + postPresentBarrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER; + postPresentBarrier.pNext = NULL; + postPresentBarrier.srcAccessMask = 0; + postPresentBarrier.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; + postPresentBarrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED; + postPresentBarrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; + postPresentBarrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; + postPresentBarrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; + postPresentBarrier.subresourceRange = + { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 }; + postPresentBarrier.image = vkctx.swapchain.buffers[i].image; + + vkCmdPipelineBarrier( + vkctx.postPresentCmdBuffers[i], + VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, + VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, + 0, + 0, nullptr, + 0, nullptr, + 1, &postPresentBarrier); + + VK_CHECK_RESULT(vkEndCommandBuffer(vkctx.postPresentCmdBuffers[i])); + + // Command buffer for pre present barrier + + // Submit a pre present image barrier to the queue. + // Transforms the (framebuffer) image layout from color attachment to + // present(khr) for presenting to the swap chain. + + VK_CHECK_RESULT(vkBeginCommandBuffer(vkctx.prePresentCmdBuffers[i], + &cmdBufferBeginInfo)); + + VkImageMemoryBarrier prePresentBarrier = { }; + prePresentBarrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER; + prePresentBarrier.pNext = NULL; + prePresentBarrier.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; + prePresentBarrier.dstAccessMask = VK_ACCESS_MEMORY_READ_BIT; + prePresentBarrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; + prePresentBarrier.newLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR; + prePresentBarrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; + prePresentBarrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; + prePresentBarrier.subresourceRange = { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 }; + prePresentBarrier.image = vkctx.swapchain.buffers[i].image; + + vkCmdPipelineBarrier( + vkctx.prePresentCmdBuffers[i], + VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, + VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, + 0, + 0, nullptr, // No memory barriers, + 0, nullptr, // No buffer barriers, + 1, &prePresentBarrier); + + VK_CHECK_RESULT(vkEndCommandBuffer(vkctx.prePresentCmdBuffers[i])); + } + return true; +} + + +bool +VulkanAppSDL::prepareDescriptorLayout() +{ + return true; +} + + +bool +VulkanAppSDL::prepareRenderPass() +{ + VkAttachmentDescription attachments[2] = { }; + attachments[0].format = vkctx.swapchain.colorFormat; + attachments[0].samples = VK_SAMPLE_COUNT_1_BIT; + attachments[0].loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR; + attachments[0].storeOp = VK_ATTACHMENT_STORE_OP_STORE; + attachments[0].stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; + attachments[0].stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE; + attachments[0].initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; + attachments[0].finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; + + attachments[1].format = vkctx.depthBuffer.format; + attachments[1].samples = VK_SAMPLE_COUNT_1_BIT; + attachments[1].loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR; + attachments[1].storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE; + attachments[1].stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; + attachments[1].stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE; + attachments[1].initialLayout = + VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL; + attachments[1].finalLayout = + VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL; + + const VkAttachmentReference color_reference = { + 0, + VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, + }; + const VkAttachmentReference depth_reference = { + 1, + VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, + }; + const VkSubpassDescription subpass = { + 0, + VK_PIPELINE_BIND_POINT_GRAPHICS, + 0, + NULL, + 1, + &color_reference, + NULL, + &depth_reference, + 0, + NULL, + }; + const VkRenderPassCreateInfo rp_info = { + VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, + NULL, + 0, + 2, + attachments, + 1, + &subpass, + 0, + NULL, + }; + U_ASSERT_ONLY VkResult err; + + err = vkCreateRenderPass(vkctx.device, &rp_info, NULL, &vkctx.renderPass); + assert(!err); + return true; +} + + +bool +VulkanAppSDL::createPipelineCache() +{ + VkPipelineCacheCreateInfo pipelineCacheCreateInfo = {}; + pipelineCacheCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO; + VK_CHECK_RESULT(vkCreatePipelineCache(vkctx.device, + &pipelineCacheCreateInfo, + nullptr, &vkctx.pipelineCache)); + return true; +} + + +bool +VulkanAppSDL::preparePipeline() +{ + return true; +} + + +bool +VulkanAppSDL::prepareDescriptorSet() +{ + return true; +} + + +bool +VulkanAppSDL::prepareFramebuffers() +{ + VkImageView attachments[2]; + attachments[1] = vkctx.depthBuffer.view; + + const VkFramebufferCreateInfo fb_info = { + VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, + NULL, + 0, + vkctx.renderPass, + 2, + attachments, + w_width, + w_height, + 1, + }; + U_ASSERT_ONLY VkResult err; + uint32_t i; + + vkctx.framebuffers.resize(vkctx.swapchain.imageCount); + for (i = 0; i < vkctx.framebuffers.size(); i++) { + attachments[0] = vkctx.swapchain.buffers[i].view; + err = vkCreateFramebuffer(vkctx.device, &fb_info, NULL, + &vkctx.framebuffers[i]); + assert(!err); + } + return true; +} + + +void +VulkanAppSDL::flushInitialCommands() +{ + U_ASSERT_ONLY VkResult err; + + if (setupCmdBuffer == VK_NULL_HANDLE) + return; + + err = vkEndCommandBuffer(setupCmdBuffer); + assert(!err); + + const VkCommandBuffer cmd_bufs[] = { setupCmdBuffer }; + VkFence nullFence = VK_NULL_HANDLE; + VkSubmitInfo sInfo; + sInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; + sInfo.pNext = NULL; + sInfo.waitSemaphoreCount = 0; + sInfo.pWaitSemaphores = NULL; + sInfo.pWaitDstStageMask = NULL; + sInfo.commandBufferCount = 1; + sInfo.pCommandBuffers = cmd_bufs; + sInfo.signalSemaphoreCount = 0; + sInfo.pSignalSemaphores = NULL; + + err = vkQueueSubmit(vkctx.queue, 1, &sInfo, nullFence); + assert(!err); + + err = vkQueueWaitIdle(vkctx.queue); + assert(!err); + + vkFreeCommandBuffers(vkctx.device, vkctx.commandPool, 1, cmd_bufs); + setupCmdBuffer = VK_NULL_HANDLE; + +} + + +//---------------------------------------------------------------------- +// Window title and text overlay functions +//---------------------------------------------------------------------- + + +void +VulkanAppSDL::setWindowTitle() +{ + if (!enableTextOverlay) { + std::stringstream ss; + std::string wt; + + ss << std::fixed << std::setprecision(2) + << lastFrameTime << "ms (" << fpsCounter.lastFPS << " fps)" << " "; + wt = ss.str(); + wt += appTitle; + SDL_SetWindowTitle(pswMainWindow, wt.c_str()); + } else { + SDL_SetWindowTitle(pswMainWindow, appTitle.c_str()); + } +} + + +void +VulkanAppSDL::prepareTextOverlay() +{ + if (enableTextOverlay) { + // Load the text rendering shaders + std::vector shaderStages; + VkPipelineShaderStageCreateInfo shaderStage; + std::string filepath = getAssetPath() + "textoverlay.vert.spv"; + shaderStage = static_cast(vkctx.loadShader(filepath, vk::ShaderStageFlagBits::eVertex)); + shaderStages.push_back(shaderStage); + shaderModules.push_back(shaderStage.module); + filepath = getAssetPath() + "textoverlay.frag.spv"; + shaderStage = static_cast(vkctx.loadShader(filepath, vk::ShaderStageFlagBits::eFragment)); + shaderStages.push_back(shaderStage); + shaderModules.push_back(shaderStage.module); + + textOverlay = new VulkanTextOverlay( + vkctx.gpu, + vkctx.device, + vkctx.queue, + vkctx.framebuffers, + vkctx.swapchain.colorFormat, + vkctx.depthBuffer.format, + &w_width, + &w_height, + shaderStages + ); + updateTextOverlay(); + } +} + + +void VulkanAppSDL::updateTextOverlay() +{ + if (!enableTextOverlay) + return; + + textOverlay->beginTextUpdate(); + + textOverlay->addText(appTitle, 5.0f, 5.0f, VulkanTextOverlay::alignLeft); + + std::stringstream ss; + ss << std::fixed << std::setprecision(2) + << lastFrameTime << "ms (" << fpsCounter.lastFPS << " fps)"; + textOverlay->addText(ss.str(), 5.0f, 25.0f, VulkanTextOverlay::alignLeft); + + // Cast is a workaround for a change in Vulkan SDK 1.2.141 to the + // declaration of deviceName in PhysicalDeviceProperties from a char + // array to use an Array1D template. + textOverlay->addText((char*)vkctx.gpuProperties.deviceName, 5.0f, 45.0f, + VulkanTextOverlay::alignLeft); + + // Leave a blank line between us and the derived class's text. + getOverlayText(85.0f); + + textOverlay->endTextUpdate(); +} + + +void VulkanAppSDL::getOverlayText(float /*yOffset*/) +{ + // Can be overriden in derived class +} + + +//---------------------------------------------------------------------- +// Utility functions +//---------------------------------------------------------------------- + +// @brief Find suitable depth format to use. +// +// All depth formats are optional. This finds a supported format with at +// least the required number of bits and without stencil, if possible and +// not required. +bool +VulkanAppSDL::getSupportedDepthFormat(vk::PhysicalDevice gpu, + stencilRequirement requiredStencil, + depthRequirement requiredDepth, + vk::ImageTiling tiling, + vk::Format& depthFormat, + vk::ImageAspectFlags& aspectMask) +{ + struct depthFormatDescriptor { + stencilRequirement stencil; + depthRequirement depth; + vk::Format vkformat; + }; + std::vector depthFormats = { + { eNoStencil, e16bits, vk::Format::eD16Unorm }, + { eStencil, e16bits, vk::Format::eD16UnormS8Uint }, + { eStencil, e24bits, vk::Format::eD24UnormS8Uint }, + { eNoStencil, e32bits, vk::Format::eD32Sfloat }, + { eStencil, e32bits, vk::Format::eD32SfloatS8Uint } + }; + + for (auto& format : depthFormats) + { + if (format.depth >= requiredDepth + && format.stencil >= requiredStencil) { + vk::FormatProperties formatProps; + gpu.getFormatProperties(format.vkformat, &formatProps); + // Format must support depth stencil attachment for tiling + vk::FormatFeatureFlags features; + if (tiling == vk::ImageTiling::eOptimal) + features = formatProps.optimalTilingFeatures; + else + features = formatProps.linearTilingFeatures; + if (features & vk::FormatFeatureFlagBits::eDepthStencilAttachment) { + depthFormat = format.vkformat; + if (format.stencil == eStencil) + aspectMask = vk::ImageAspectFlagBits::eDepth | vk::ImageAspectFlagBits::eStencil; + else + aspectMask = vk::ImageAspectFlagBits::eDepth; + return true; + } + } + } + (void)SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, szName, + "The VkPhysicalDevice does not support a suitable depth buffer.", + NULL); + return false; +} + +void +VulkanAppSDL::setImageLayout(VkImage image, VkImageAspectFlags aspectMask, + VkImageLayout old_image_layout, + VkImageLayout new_image_layout, + VkImageAspectFlags srcAccessMask) +{ + U_ASSERT_ONLY VkResult err; + + if (setupCmdBuffer == VK_NULL_HANDLE) { + const VkCommandBufferAllocateInfo cbaInfo = { + VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, + NULL, + vkctx.commandPool, + VK_COMMAND_BUFFER_LEVEL_PRIMARY, + 1, + }; + + err = vkAllocateCommandBuffers(vkctx.device, &cbaInfo, + &setupCmdBuffer); + assert(!err); + + VkCommandBufferInheritanceInfo cmdBufHInfo = { }; + cmdBufHInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO; + cmdBufHInfo.pNext = NULL; + cmdBufHInfo.renderPass = VK_NULL_HANDLE; + cmdBufHInfo.subpass = 0; + cmdBufHInfo.framebuffer = VK_NULL_HANDLE; + cmdBufHInfo.occlusionQueryEnable = VK_FALSE; + cmdBufHInfo.queryFlags = 0; + cmdBufHInfo.pipelineStatistics = 0; + + VkCommandBufferBeginInfo cmdBufInfo = { }; + cmdBufInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; + cmdBufInfo.pNext = NULL; + cmdBufInfo.flags = 0; + cmdBufInfo.pInheritanceInfo = &cmdBufHInfo; + + err = vkBeginCommandBuffer(setupCmdBuffer, &cmdBufInfo); + assert(!err); + } + + VkImageMemoryBarrier imageMemoryBarrier = { }; + imageMemoryBarrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER; + imageMemoryBarrier.pNext = NULL; + imageMemoryBarrier.srcAccessMask = srcAccessMask; + imageMemoryBarrier.dstAccessMask = 0; + imageMemoryBarrier.oldLayout = old_image_layout; + imageMemoryBarrier.newLayout = new_image_layout; + imageMemoryBarrier.image = image; + imageMemoryBarrier.subresourceRange.aspectMask = aspectMask; + imageMemoryBarrier.subresourceRange.baseMipLevel = 0; + imageMemoryBarrier.subresourceRange.levelCount = 1; + imageMemoryBarrier.subresourceRange.baseArrayLayer = 0; + imageMemoryBarrier.subresourceRange.layerCount = 1; + + if (new_image_layout == VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL) { + /* Make sure anything that was copying from this image has completed */ + imageMemoryBarrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT; + } + + if (new_image_layout == VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL) { + imageMemoryBarrier.dstAccessMask = + VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; + } + + if (new_image_layout == VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL) { + imageMemoryBarrier.dstAccessMask = + VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT; + } + + if (new_image_layout == VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL) { + /* Make sure any Copy or CPU writes to image are flushed */ + imageMemoryBarrier.dstAccessMask = + VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_INPUT_ATTACHMENT_READ_BIT; + } + + VkPipelineStageFlags src_stages = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT; + VkPipelineStageFlags dest_stages = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT; + + vkCmdPipelineBarrier(setupCmdBuffer, src_stages, dest_stages, 0, 0, + NULL, 0, NULL, 1, &imageMemoryBarrier); +} // setImageLayout + + +/* + * @internal + * @~English + * @brief Check if all layer names specified in @p names can be + * found in the given layer properties. + * + * @return true if all layer names can be found, false otherwise. + */ +bool +VulkanAppSDL::checkLayers(uint32_t nameCount, const char **names, + uint32_t layerCount, + VkLayerProperties *layers) +{ + for (uint32_t i = 0; i < nameCount; i++) { + bool found = 0; + for (uint32_t j = 0; j < layerCount; j++) { + if (!strcmp(names[i], layers[j].layerName)) { + found = 1; + break; + } + } + if (!found) { + fprintf(stderr, "Cannot find layer: %s\n", names[i]); + return 0; + } + } + return 1; +} + + +VKAPI_ATTR VkBool32 VKAPI_CALL +VulkanAppSDL::debugFunc(VkDebugReportFlagsEXT msgFlags, + VkDebugReportObjectTypeEXT objType, + uint64_t srcObject, size_t location, int32_t msgCode, + const char *pLayerPrefix, const char *pMsg, + void *pUserData) +{ + VulkanAppSDL* app = (VulkanAppSDL*)pUserData; + return app->debugFunc(msgFlags, objType, srcObject, location, msgCode, + pLayerPrefix, pMsg); +} + + +VKAPI_ATTR VkBool32 VKAPI_CALL +VulkanAppSDL::debugFunc(VkDebugReportFlagsEXT msgFlags, + VkDebugReportObjectTypeEXT /*objType*/, + uint64_t /*srcObject*/, size_t /*location*/, int32_t msgCode, + const char *pLayerPrefix, const char *pMsg) +{ + + std::string title = szName; + std::string text(pMsg); + std::string prefix(""); + std::stringstream message; + uint32_t mbFlags = SDL_MESSAGEBOX_INFORMATION; + + // Errors may cause undefined behaviour or a crash. + if (msgFlags & VK_DEBUG_REPORT_ERROR_BIT_EXT) { + mbFlags = SDL_MESSAGEBOX_ERROR; + prefix += "ERROR:"; + } + // Warnings indicate use of Vulkan that may expose an app bug + if (msgFlags & VK_DEBUG_REPORT_WARNING_BIT_EXT) { + // We know that we're submitting queues without fences, ignore this + // warning + // XXX Check this + if (strstr(pMsg, + "vkQueueSubmit parameter, VkFence fence, is null pointer")) { + return false; + } + mbFlags = SDL_MESSAGEBOX_WARNING; + prefix += "WARNING:"; + } + // Performance warnings indicate sub-optimal usage of the API + if (msgFlags & VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT) + { + mbFlags = SDL_MESSAGEBOX_WARNING; + prefix += "PERFORMANCE:"; + }; + // Information that may be handy during debugging. + if (msgFlags & VK_DEBUG_REPORT_INFORMATION_BIT_EXT) + { + mbFlags = SDL_MESSAGEBOX_INFORMATION; + prefix += "INFO:"; + } + // Diagnostic info from the Vulkan loader and layers. +#if 0 + // Usually not helpful in terms of API usage, but may help to debug layer + // and loader problems + if (msgFlags & VK_DEBUG_REPORT_DEBUG_BIT_EXT) + { + mbFlags = SDL_MESSAGEBOX_INFORMATION; + prefix += "DEBUG:"; + } +#endif + message << prefix << " [" << pLayerPrefix << "] Code " + << std::showbase << std::internal << std::setfill('0') << std::hex + << std::setw(8) << msgCode << ": " << std::endl << text; + + title += " Debug Report"; + if (showDebugReport(mbFlags, title, message.str(), prepared)) { + SDL_Event sdlevent; + sdlevent.type = SDL_EVENT_QUIT; + sdlevent.quit.timestamp = SDL_GetTicks(); + + (void)SDL_PushEvent(&sdlevent); + } + + /* + * false indicates that layer should not bail-out of an + * API call that had validation failures. This may mean that the + * app dies inside the driver due to invalid parameter(s). + * That's what would happen without validation layers, so we'll + * keep that behavior here. + */ + return false; +} + + +std::string& +VulkanAppSDL::wrapText(std::string& source, size_t width, + const std::string& whitespace) +{ + if (source.length() <= width) + return source; + + // Find the longest "word" and possibly set @a width to that. The + // message box width is set from the longest line and many of + // the debug messages contain a long URL reference which could + // easily be wider than @a width. + size_t ws = source.find_first_not_of(whitespace); + size_t we = 0; + size_t maxWordLength = 0; + for (; ws < source.length(); ws = we + 1) { + size_t wl; + we = source.find_first_of(whitespace, ws); + if (we == std::string::npos) we = source.length(); + wl = we - ws; + if (wl > maxWordLength) maxWordLength = wl; + } + if (maxWordLength > width) + width = maxWordLength; + + // If the string is one long word, nothing further to do. + if (source.length() == width) + return source; + + size_t endPos = width, startPos = 0; + while (startPos < source.length()) + { + size_t breakPos, sizeToElim; + + endPos = source.find_last_of(whitespace, endPos); + if (endPos == std::string::npos) + break; + if (endPos > startPos) { + breakPos = source.find_last_not_of(whitespace, endPos) + 1; + if (breakPos == std::string::npos) + break; + endPos = source.find_first_not_of(whitespace, ++endPos); + sizeToElim = endPos - breakPos; + source.replace( breakPos, sizeToElim , "\n"); + startPos = endPos; + } else { // have to tolerate a long line + startPos += width; + } + endPos += width; + } + return source; +} + + +uint32_t +VulkanAppSDL::showDebugReport(uint32_t mbFlags, const std::string title, + std::string message, bool enableAbort) +{ + const SDL_MessageBoxButtonData buttons[] = { + /* .flags, .buttonid, .text */ + { SDL_MESSAGEBOX_BUTTON_RETURNKEY_DEFAULT, 0, "Continue" }, + { SDL_MESSAGEBOX_BUTTON_ESCAPEKEY_DEFAULT, 1, "Abort" }, + }; +#if 0 + const SDL_MessageBoxColorScheme colorScheme = { + { /* .colors (.r, .g, .b) */ + /* [SDL_MESSAGEBOX_COLOR_BACKGROUND] */ + { 255, 0, 0 }, + /* [SDL_MESSAGEBOX_COLOR_TEXT] */ + { 0, 255, 0 }, + /* [SDL_MESSAGEBOX_COLOR_BUTTON_BORDER] */ + { 255, 255, 0 }, + /* [SDL_MESSAGEBOX_COLOR_BUTTON_BACKGROUND] */ + { 0, 0, 255 }, + /* [SDL_MESSAGEBOX_COLOR_BUTTON_SELECTED] */ + { 255, 0, 255 } + } + }; +#endif + wrapText(message, 70, " \t\r"); + const SDL_MessageBoxData messageboxdata = { + mbFlags, // .flags + NULL, // .window + title.c_str(), // .title + message.c_str(), // .message + (int)(enableAbort ? SDL_arraysize(buttons) : 1), // .numbuttons + buttons, // .buttons + NULL //&colorScheme // .colorScheme + }; + int buttonid; + if (!SDL_ShowMessageBox(&messageboxdata, &buttonid)) { + SDL_Log("error displaying message box"); + } + if (buttonid == -1) { + SDL_Log("no selection"); + return 0; + } else { + return buttonid; + } +} + +#if SDL_PLATFORM_WINDOWS + // Windows specific code to use icon in module + #define WIN32_LEAN_AND_MEAN + #include +void setWindowsIcon(SDL_Window *sdlWindow) { + HINSTANCE handle = ::GetModuleHandle(nullptr); + // Identify icon by name rather than IDI_ macro to avoid having to + // include application's resource.h. + HICON icon = ::LoadIcon(handle, "MAIN_ICON"); // MAKEINTRESOURCE(IDI_ICON1)); + if (icon != nullptr) { + HWND hwnd = (HWND)SDL_GetPointerProperty(SDL_GetWindowProperties(sdlWindow), + SDL_PROP_WINDOW_WIN32_HWND_POINTER, NULL); + if (hwnd) { + ::SetClassLongPtr(hwnd, GCLP_HICON, reinterpret_cast(icon)); + } + } +} +#endif + diff --git a/third_party/ktx-src/tests/loadtests/appfwSDL/VulkanAppSDL/VulkanAppSDL.h b/third_party/ktx-src/tests/loadtests/appfwSDL/VulkanAppSDL/VulkanAppSDL.h new file mode 100644 index 0000000000000000000000000000000000000000..31b2159ea04dc76ea69603dabb6938a13ec90606 --- /dev/null +++ b/third_party/ktx-src/tests/loadtests/appfwSDL/VulkanAppSDL/VulkanAppSDL.h @@ -0,0 +1,172 @@ +/* -*- tab-width: 4; -*- */ +/* vi: set sw=2 ts=4 expandtab: */ + +#ifndef VULKAN_APP_SDL_H_1456211188 +#define VULKAN_APP_SDL_H_1456211188 + +/* + * Copyright 2017-2020 Mark Callow. + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include +#include +#include +#define VK_ENABLE_BETA_EXTENSIONS 1 +#include +#include // Must be after vulkan.hpp. + +#include "AppBaseSDL.h" +#include "VulkanContext.h" +#include "VulkanSwapchain.h" +#include "vulkantextoverlay.hpp" +#include "unused.h" + +class VulkanAppSDL : public AppBaseSDL { + public: + VulkanAppSDL(const char* const name, + int width, int height, + const uint32_t version, + bool enableTextOverlay) + : AppBaseSDL(name), w_width(width), w_height(height), + subOptimalPresentWarned(false), validate(false), + vkVersion(version), + enableTextOverlay(enableTextOverlay), + textOverlay(nullptr) + { + // The overridden new below will zero the storage. Thus + // we avoid a long list of initializers. + appTitle = name; + }; + virtual ~VulkanAppSDL(); + virtual bool doEvent(SDL_Event* event); + virtual void drawFrame(uint32_t msTicks); + virtual void finalize(); + virtual bool initialize(Args& args); + virtual void onFPSUpdate(); + virtual void resizeWindow(int width, int height); + virtual void windowResized(); + + static void* operator new(size_t size) { + void* storage = ::operator new(size); + memset(storage, 0, size); + return storage; + } + + static void operator delete(void* storage, size_t) { + ::operator delete(storage); + } + + void updateTextOverlay(); + + // Called when the text overlay is updating + // Can be overridden in derived class to add custom text to the overlay + virtual void getOverlayText(float yOffset); + + protected: + bool createDevice(); + bool createInstance(); + bool createPipelineCache(); + bool createSemaphores(); + bool createSurface(); + bool createSwapchain(); + bool findGpu(); + void flushInitialCommands(); + bool initializeVulkan(); + bool prepareColorBuffers(); + bool prepareCommandBuffers(); + bool prepareDepthBuffer(); + bool prepareDescriptorLayout(); + void prepareFrame(); + bool preparePresentCommandBuffers(); + bool prepareRenderPass(); + bool preparePipeline(); + bool prepareDescriptorSet(); + bool prepareFramebuffers(); + void prepareTextOverlay(); + void submitFrame(); + + bool setupDebugReporting(); + + enum stencilRequirement { eNoStencil = 0, eStencil = 1 }; + enum depthRequirement { e16bits = 0, e24bits = 1, e32bits = 2 }; + bool getSupportedDepthFormat(vk::PhysicalDevice gpu, + stencilRequirement requiredStencil, + depthRequirement requiredDepth, + vk::ImageTiling tiling, + vk::Format& pFormat, + vk::ImageAspectFlags& pAspectMask); + + // Sets text on window title bar. + void setWindowTitle(); + + void setImageLayout(VkImage image, VkImageAspectFlags aspectMask, + VkImageLayout old_image_layout, + VkImageLayout new_image_layout, + VkAccessFlags srcAccessMask); + + VKAPI_ATTR VkBool32 VKAPI_CALL + debugFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType, + uint64_t srcObject, size_t location, int32_t msgCode, + const char *pLayerPrefix, const char *pMsg); + std::string& wrapText(std::string& source, size_t width = 70, + const std::string& whitespace = " \t\r"); + uint32_t showDebugReport(uint32_t mbFlags, const std::string title, + std::string message, bool enableAbort); + + static bool checkLayers(uint32_t nameCount, const char **names, + uint32_t layerCount, VkLayerProperties *layers); + static VKAPI_ATTR VkBool32 VKAPI_CALL + debugFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType, + uint64_t srcObject, size_t location, int32_t msgCode, + const char *pLayerPrefix, const char *pMsg, void *pUserData); + + bool prepared = false; + // Set true if want presents v-sync'ed. + bool enableVSync = false; + + uint32_t w_width; + uint32_t w_height; + + bool subOptimalPresentWarned; + bool validate; + + std::vector extensionNames; + std::vector deviceValidationLayers; + + VkCommandBuffer setupCmdBuffer; + VkSurfaceKHR vsSurface; + + VulkanContext vkctx; + + // Index of active framebuffer. + uint32_t currentBuffer; + + // Synchronization semaphores + struct { + // Swap chain image presentation + VkSemaphore presentComplete; + // Command buffer submission and execution + VkSemaphore renderComplete; + // Text overlay submission and execution + VkSemaphore textOverlayComplete; + } semaphores; + + const uint32_t vkVersion; + + // Saved for clean-up + std::vector shaderModules; + + bool enableTextOverlay = false; + VulkanTextOverlay *textOverlay; + // List of shader modules created (stored for cleanup) + + VkDebugReportCallbackEXT msgCallback; + + PFN_vkCreateDebugReportCallbackEXT pfnCreateDebugReportCallbackEXT; + PFN_vkDestroyDebugReportCallbackEXT pfnDestroyDebugReportCallbackEXT; + PFN_vkDebugReportMessageEXT pfnDebugReportMessageEXT; +}; + +#endif /* VULKAN_APP_SDL_H_1456211188 */ diff --git a/third_party/ktx-src/tests/loadtests/appfwSDL/VulkanAppSDL/VulkanContext.cpp b/third_party/ktx-src/tests/loadtests/appfwSDL/VulkanAppSDL/VulkanContext.cpp new file mode 100644 index 0000000000000000000000000000000000000000..f8fb4833588da4f15d6b8c1b1769f3a8713676b0 --- /dev/null +++ b/third_party/ktx-src/tests/loadtests/appfwSDL/VulkanAppSDL/VulkanContext.cpp @@ -0,0 +1,363 @@ +/* -*- tab-width: 4; -*- */ +/* vi: set sw=2 ts=4 expandtab: */ + +/* + * Copyright 2017-2020 Mark Callow. + * SPDX-License-Identifier: Apache-2.0 + */ + + +/** + * @internal + * @class VulkanContext + * @~English + * + * @brief Class for holding and passing Vulkan context info to applications. + * + * @author Mark Callow, github.com/MarkCallow. + */ + +#include +#include +#include +#include +#include "VulkanContext.h" +// Until exceptions are used everywhere... +#include "vulkancheckres.h" +#include "ltexceptions.h" +#include "unused.h" + +vk::CommandBuffer +VulkanContext::createCommandBuffer(vk::CommandBufferLevel level, bool begin) +{ + vk::CommandBuffer cmdBuffer; + + vk::CommandBufferAllocateInfo cmdBufAllocateInfo( + commandPool, + level, + 1); + + vk::Result res + = device.allocateCommandBuffers(&cmdBufAllocateInfo, &cmdBuffer); + + if (res != vk::Result::eSuccess) { + throw bad_vulkan_alloc((int)res, "device.allocateCommandBuffers"); + } + + // If requested, also start the new command buffer + if (begin) + { + vk::CommandBufferBeginInfo cmdBufInfo; + res = cmdBuffer.begin(&cmdBufInfo); + if (res != vk::Result::eSuccess) { + throw bad_vulkan_alloc((int)res, "cmdBuffer.begin"); + } + } + + return cmdBuffer; +} + + +void +VulkanContext::flushCommandBuffer(vk::CommandBuffer& cmdBuffer, + bool free) +{ + if (!cmdBuffer) { + return; + } + + cmdBuffer.end(); + + vk::SubmitInfo submitInfo; + submitInfo.commandBufferCount = 1; + submitInfo.pCommandBuffers = &cmdBuffer; + + vk::Result res = queue.submit(1, &submitInfo, nullptr); + if (res != vk::Result::eSuccess) { + if (res == vk::Result::eErrorDeviceLost) { + throw std::runtime_error("Vulkan device lost."); + } else { + throw bad_vulkan_alloc((int)res, "queue.submit"); + } + } + + queue.waitIdle(); + + if (free) { + device.freeCommandBuffers(commandPool, 1, &cmdBuffer); + } +} + +bool +VulkanContext::createDrawCommandBuffers() +{ + VkCommandBufferAllocateInfo aInfo; + aInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO; + aInfo.pNext = NULL; + aInfo.commandPool = commandPool; + aInfo.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY; + aInfo.commandBufferCount = 1; + + drawCmdBuffers.resize(swapchain.imageCount); + for (uint32_t i = 0; i < swapchain.imageCount; i++) { + VK_CHECK_RESULT(vkAllocateCommandBuffers(device, &aInfo, + &drawCmdBuffers[i])); + } + return true; +} + +bool +VulkanContext::createPresentCommandBuffers() +{ + VkCommandBufferAllocateInfo aInfo; + aInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO; + aInfo.pNext = NULL; + aInfo.commandPool = commandPool; + aInfo.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY; + aInfo.commandBufferCount = 1; + + prePresentCmdBuffers.resize(swapchain.imageCount); + postPresentCmdBuffers.resize(swapchain.imageCount); + for (uint32_t i = 0; i < swapchain.imageCount; i++) { + VK_CHECK_RESULT(vkAllocateCommandBuffers(device, &aInfo, + &prePresentCmdBuffers[i])); + VK_CHECK_RESULT(vkAllocateCommandBuffers(device, &aInfo, + &postPresentCmdBuffers[i])); + } + return true; +} + +void +VulkanContext::destroyDrawCommandBuffers() +{ + if (drawCmdBuffers.size() > 0) { + vkFreeCommandBuffers(device, commandPool, + static_cast(drawCmdBuffers.size()), + drawCmdBuffers.data()); + } + for (uint32_t i = 0; i < drawCmdBuffers.size(); ++i) { + drawCmdBuffers[i] = nullptr; + } + +} + +void +VulkanContext::destroyPresentCommandBuffers() +{ + vkFreeCommandBuffers(device, commandPool, + static_cast(drawCmdBuffers.size()), + prePresentCmdBuffers.data()); + vkFreeCommandBuffers(device, commandPool, + static_cast(drawCmdBuffers.size()), + postPresentCmdBuffers.data()); +} + +bool +VulkanContext::checkDrawCommandBuffers() +{ + for (auto& cmdBuffer : drawCmdBuffers) + { + if (cmdBuffer == VK_NULL_HANDLE) + { + return false; + } + } + return true; +} + +bool +VulkanContext::createBuffer(vk::BufferUsageFlags usageFlags, + vk::MemoryPropertyFlags memoryPropertyFlags, + vk::DeviceSize size, + void * data, + vk::Buffer* buffer, + vk::DeviceMemory* memory) +{ + vk::MemoryRequirements memReqs; + vk::MemoryAllocateInfo memAlloc(0, 0); + vk::BufferCreateInfo bufferCreateInfo({}, size, usageFlags); + + vk::Result res = device.createBuffer(&bufferCreateInfo, nullptr, buffer); + if (res != vk::Result::eSuccess) { + return false; + } + + device.getBufferMemoryRequirements(*buffer, &memReqs); + memAlloc.allocationSize = memReqs.size; + memAlloc.memoryTypeIndex = getMemoryType(memReqs.memoryTypeBits, + memoryPropertyFlags); + res = device.allocateMemory(&memAlloc, nullptr, memory); + if (res == vk::Result::eSuccess) { + if (data != nullptr) + { + void *mapped; + mapped = device.mapMemory(*memory, 0, size, {}); + memcpy(mapped, data, (size_t)size); + device.unmapMemory(*memory); + } + device.bindBufferMemory(*buffer, *memory, 0); + + return true; + } else + return false; +} + +bool +VulkanContext::createBuffer(vk::BufferUsageFlags usage, + vk::DeviceSize size, + void* data, + vk::Buffer* buffer, + vk::DeviceMemory* memory) +{ + return createBuffer(usage, vk::MemoryPropertyFlagBits::eHostVisible, + size, data, buffer, memory); +} + +bool +VulkanContext::createBuffer(vk::BufferUsageFlags usage, + vk::DeviceSize size, + void* data, + vk::Buffer* buffer, + vk::DeviceMemory* memory, + vk::DescriptorBufferInfo* descriptor) +{ + bool res = createBuffer(usage, size, data, buffer, memory); + if (res) + { + descriptor->offset = 0; + descriptor->buffer = *buffer; + descriptor->range = size; + return true; + } + else + { + return false; + } +} + +bool +VulkanContext::createBuffer(vk::BufferUsageFlags usage, + vk::MemoryPropertyFlags memoryPropertyFlags, + vk::DeviceSize size, + void* data, + vk::Buffer* buffer, + vk::DeviceMemory* memory, + vk::DescriptorBufferInfo* descriptor) +{ + bool res = createBuffer(usage, memoryPropertyFlags, size, data, buffer, memory); + if (res) + { + descriptor->offset = 0; + descriptor->buffer = *buffer; + descriptor->range = size; + return true; + } + else + { + return false; + } +} + +bool +VulkanContext::getMemoryType(uint32_t typeBits, + vk::MemoryPropertyFlags requirementsMask, + uint32_t *typeIndex) const +{ + // Search memtypes to find first index with desired properties + for (uint32_t i = 0; i < VK_MAX_MEMORY_TYPES; i++) { + if ((typeBits & 1) == 1) { + // Type is available, does it match user properties? + if ((memoryProperties.memoryTypes[i].propertyFlags & + requirementsMask) == requirementsMask) { + *typeIndex = i; + return true; + } + } + typeBits >>= 1; + } + // No memory types matched, return failure + return false; +} + +uint32_t +VulkanContext::getMemoryType(uint32_t typeBits, + vk::MemoryPropertyFlags requirementsMask) const +{ + // Search memtypes to find first index with desired properties + for (uint32_t i = 0; i < VK_MAX_MEMORY_TYPES; i++) { + if ((typeBits & 1) == 1) { + // Type is available, does it match user properties? + if ((memoryProperties.memoryTypes[i].propertyFlags & + requirementsMask) == requirementsMask) { + return i; + } + } + typeBits >>= 1; + } + // No memory types matched, return failure + // TODO throw error + return 0; +} + +vk::PipelineShaderStageCreateInfo +VulkanContext::loadShader(std::string filename, + vk::ShaderStageFlagBits stage, + const char* const modname) +{ + vk::PipelineShaderStageCreateInfo shaderStage({}, stage); + shaderStage.module = loadShader(filename); + shaderStage.pName = modname; + return shaderStage; +} + +vk::ShaderModule +VulkanContext::loadShader(std::string filename) +{ + size_t codeSize; + uint32_t* shaderCode; + + shaderCode = readSpv(filename.c_str(), &codeSize); + + vk::ShaderModule shaderModule; + vk::ShaderModuleCreateInfo moduleCreateInfo({}, codeSize, shaderCode); + + vk::Result res + = device.createShaderModule(&moduleCreateInfo, NULL, &shaderModule); + if (res != vk::Result::eSuccess) { + throw bad_vulkan_alloc((int)res, "device.createShaderModule"); + } + + delete[] shaderCode; + + assert(shaderModule); + return shaderModule; +} + +uint32_t* +VulkanContext::readSpv(const char *filename, size_t *pSize) { + size_t size; + U_ASSERT_ONLY size_t retval; + uint32_t* shader_code; + + SDL_IOStream* io = SDL_IOFromFile(filename, "rb"); + if (!io) { + std::stringstream message; + + // String returned by SDL_GetError() includes file name. + message << "Open of shader failed: " << SDL_GetError(); + throw std::runtime_error(message.str()); + } + + size = (size_t)SDL_GetIOSize(io); + + // Round-up to next 4-byte size. + shader_code = new uint32_t[(size + 3)/4]; + retval = SDL_ReadIO(io, shader_code, size); + assert(retval == size); + + *pSize = size; + + SDL_CloseIO(io); + return shader_code; +} + diff --git a/third_party/ktx-src/tests/loadtests/appfwSDL/VulkanAppSDL/VulkanContext.h b/third_party/ktx-src/tests/loadtests/appfwSDL/VulkanAppSDL/VulkanContext.h new file mode 100644 index 0000000000000000000000000000000000000000..b91e714a1826e7ec1535e97801095a9c4574e463 --- /dev/null +++ b/third_party/ktx-src/tests/loadtests/appfwSDL/VulkanAppSDL/VulkanContext.h @@ -0,0 +1,134 @@ +/* -*- tab-width: 4; -*- */ +/* vi: set sw=2 ts=4 expandtab: */ + +#ifndef VULKAN_TEXTURE_H_229895365400979164311947449304284143508 +#define VULKAN_TEXTURE_H_229895365400979164311947449304284143508 + +/* + * Copyright 2017-2020 Mark Callow. + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#define VK_ENABLE_BETA_EXTENSIONS 1 +#include +#include "VulkanSwapchain.h" + +struct VulkanDepthBuffer { + VkFormat format; + VkImage image; + VkMemoryAllocateInfo memAlloc; + VkDeviceMemory mem; + VkImageView view; +}; + +struct VulkanContext { + vk::Instance instance; + vk::PhysicalDevice gpu; + vk::PhysicalDeviceFeatures gpuFeatures; +#if VK_KHR_portability_subset + vk::PhysicalDevicePortabilitySubsetFeaturesKHR gpuPortabilityFeatures; +#endif + vk::PhysicalDeviceProperties gpuProperties; + vk::PhysicalDeviceMemoryProperties memoryProperties; + vk::Device device; + vk::CommandPool commandPool; + vk::Queue queue; + + bool gpuIsPortabilitySubsetDevice = false; + + struct { + bool pvrtc = false; + bool astc_hdr = false; + bool astc_3d = false; + } enabledDeviceExtensions; + std::vector drawCmdBuffers; + std::vector postPresentCmdBuffers; + std::vector prePresentCmdBuffers; + VkRenderPass renderPass; + // Pipeline stage flags for the submit info structure + const VkPipelineStageFlags submitPipelineStages = + VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT; + // Contains command buffers and semaphores to be presented to the queue + VkSubmitInfo drawCmdSubmitInfo; + + vk::DescriptorPool descriptorPool; + VkPipelineCache pipelineCache; + + VulkanSwapchain swapchain; + // List of frame buffers (same as number of swap chain images) + std::vectorframebuffers; + VulkanDepthBuffer depthBuffer; + + // Create a new command buffer, opening it for command entry, + // if requested. + vk::CommandBuffer createCommandBuffer(vk::CommandBufferLevel level, + bool begin); + // End a command buffer, submit it to the queue and free, if requested. + // Note : Waits for the queue to become idle + void flushCommandBuffer(vk::CommandBuffer& commandBuffer, bool free); + + // Create a command buffer for each image in the swap chain. + bool createDrawCommandBuffers(); + bool createPresentCommandBuffers(); + bool checkDrawCommandBuffers(); + void destroyDrawCommandBuffers(); + void destroyPresentCommandBuffers(); + + + bool getMemoryType(uint32_t typeBits, + vk::MemoryPropertyFlags requirementsMask, + uint32_t *typeIndex) const; + uint32_t getMemoryType(uint32_t typeBits, + vk::MemoryPropertyFlags requirementsMask) const; + + // Create a buffer, fill it with data (if != NULL) and bind buffer memory + bool createBuffer( + vk::BufferUsageFlags usageFlags, + vk::MemoryPropertyFlags memoryPropertyFlags, + vk::DeviceSize size, + void *data, + vk::Buffer *buffer, + vk::DeviceMemory *memory); + // This version always uses HOST_VISIBLE memory + bool createBuffer( + vk::BufferUsageFlags usage, + vk::DeviceSize size, + void *data, + vk::Buffer *buffer, + vk::DeviceMemory *memory); + // Overload that assigns buffer info to descriptor + bool createBuffer( + vk::BufferUsageFlags usage, + vk::DeviceSize size, + void* data, + vk::Buffer* buffer, + vk::DeviceMemory* memory, + vk::DescriptorBufferInfo* descriptor); + // Overload to pass memory property flags + bool createBuffer( + vk::BufferUsageFlags usage, + vk::MemoryPropertyFlags memoryPropertyFlags, + vk::DeviceSize size, + void* data, + vk::Buffer* buffer, + vk::DeviceMemory* memory, + vk::DescriptorBufferInfo* descriptor); + + vk::PipelineShaderStageCreateInfo loadShader(std::string filename, + vk::ShaderStageFlagBits stage, + const char* const modname = "main"); + vk::ShaderModule loadShader(std::string filename); + uint32_t* readSpv(const char *filename, size_t *pSize); + + bool gpuSupportsSwizzle() { +#if VK_KHR_portability_subset + return !gpuIsPortabilitySubsetDevice + || gpuPortabilityFeatures.imageViewFormatSwizzle; +#else + return true; +#endif + } +}; + +#endif /* VULKAN_TEXTURE_H_229895365400979164311947449304284143508 */ diff --git a/third_party/ktx-src/tests/loadtests/appfwSDL/VulkanAppSDL/VulkanSwapchain.cpp b/third_party/ktx-src/tests/loadtests/appfwSDL/VulkanAppSDL/VulkanSwapchain.cpp new file mode 100644 index 0000000000000000000000000000000000000000..df9b0a9e0de2ed210b22281b077470024f0a01e1 --- /dev/null +++ b/third_party/ktx-src/tests/loadtests/appfwSDL/VulkanAppSDL/VulkanSwapchain.cpp @@ -0,0 +1,434 @@ +/* -*- tab-width: 4; -*- */ +/* vi: set sw=2 ts=4 expandtab: */ + +/* + * Copyright 2017-2020 Mark Callow. + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @internal + * @class VulkanSwapchain + * @~English + * + * @brief Manage the swapchain for a Vulkan app. + * + * A swap chain is a collection of image buffers used for rendering + * The images can then be presented to the windowing system for display. + * + * @author Mark Callow, github.com/MarkCallow. + */ + +#include +#include +#include +#include +#include +#include +#ifdef _WIN32 +#include +#include +#include +#else +#endif + +#include "VulkanSwapchain.h" + +#include +#include +#include "AppBaseSDL.h" +#include "unused.h" + +#define ERROR_RETURN(msg) \ + (void)SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, theApp->name(), \ + msg, NULL); \ + return false; + +#define GET_INSTANCE_PROC_ADDR(inst, entrypoint) \ + { \ + pfn##entrypoint = \ + (PFN_vk##entrypoint)vkGetInstanceProcAddr(inst, "vk"#entrypoint); \ + if (pfn##entrypoint == NULL) { \ + ERROR_RETURN("vkGetInstanceProcAddr: unable to find vk"#entrypoint); \ + } \ + } + +#define GET_DEVICE_PROC_ADDR(device, entrypoint) \ + { \ + pfn##entrypoint = \ + (PFN_vk##entrypoint)vkGetDeviceProcAddr(device, "vk"#entrypoint); \ + if (pfn##entrypoint == NULL) { \ + ERROR_RETURN("vkGetDeviceProcAddr: unable to find vk"#entrypoint); \ + } \ + } + +// Creates an os specific surface +// Tries to find a graphics and a present queue +bool +VulkanSwapchain::initSurface(SDL_Window* window) +{ + U_ASSERT_ONLY VkResult err; + + if (!SDL_Vulkan_CreateSurface(window, instance, nullptr, &surface)) { + std::string msg = "SDL_CreateVulkanSurface failed: "; + msg += SDL_GetError(); + ERROR_RETURN(msg.c_str()); + } + + // Get available queue family properties + uint32_t queueCount; + vkGetPhysicalDeviceQueueFamilyProperties(physicalDevice, &queueCount, NULL); + assert(queueCount >= 1); + + std::vector queueProps(queueCount); + vkGetPhysicalDeviceQueueFamilyProperties(physicalDevice, &queueCount, + queueProps.data()); + + // Iterate over the queues looking for ones which support presenting. + std::vector supportsPresent(queueCount); + for (uint32_t i = 0; i < queueCount; i++) { + vkGetPhysicalDeviceSurfaceSupportKHR(physicalDevice, i, surface, + &supportsPresent[i]); + } + + // Search for a graphics- and present-capable queue. + uint32_t graphicsQueueIndex = UINT32_MAX; + uint32_t presentQueueIndex = UINT32_MAX; + for (uint32_t i = 0; i < queueCount; i++) { + if ((queueProps[i].queueFlags & VK_QUEUE_GRAPHICS_BIT) != 0) + { + if (graphicsQueueIndex == UINT32_MAX) + { + graphicsQueueIndex = i; + } + + if (supportsPresent[i] == VK_TRUE) + { + graphicsQueueIndex = i; + presentQueueIndex = i; + break; + } + } + } + if (presentQueueIndex == UINT32_MAX) { + // If there's no queue that supports both present and graphics + // try to find a separate present queue + for (uint32_t i = 0; i < queueCount; ++i) + { + if (supportsPresent[i] == VK_TRUE) + { + presentQueueIndex = i; + break; + } + } + } + + // Exit if either a graphics or a presenting queue hasn't been found + if (graphicsQueueIndex == UINT32_MAX + || presentQueueIndex == UINT32_MAX) + { + ERROR_RETURN("Could not find a graphics or presenting queue!"); + } + + // TODO: Add support for separate graphics and presenting queue + if (graphicsQueueIndex != presentQueueIndex) + { + ERROR_RETURN("Separate graphics and present queues not yet supported!"); + } + + queueIndex = graphicsQueueIndex; + + // Get list of supported surface formats + uint32_t formatCount; + err = vkGetPhysicalDeviceSurfaceFormatsKHR(physicalDevice, surface, + &formatCount, NULL); + assert(err == VK_SUCCESS); + assert(formatCount > 0); + + std::vector surfaceFormats(formatCount); + err = vkGetPhysicalDeviceSurfaceFormatsKHR(physicalDevice, surface, + &formatCount, + surfaceFormats.data()); + assert(err == VK_SUCCESS); + + // If the surface format list only includes one entry with + // VK_FORMAT_UNDEFINED, there is no preferred format. + // Assume VK_FORMAT_B8G8R8A8_RGB. + // TODO: Consider passing in desired format from app. + if ((formatCount == 1) && (surfaceFormats[0].format == VK_FORMAT_UNDEFINED)) + { + colorFormat = VK_FORMAT_B8G8R8A8_SRGB; + } + else + { + assert(formatCount >= 1); + uint32_t i; + for (i = 0; i < formatCount; i++) { + if (surfaceFormats[i].format == VK_FORMAT_B8G8R8A8_SRGB) { + break; + } + } + if (i == formatCount) { + // Pick the first available, if no SRGB. + // FIXME probably should raise an error... + i = 0; + } + colorFormat = surfaceFormats[i].format; + } + colorSpace = surfaceFormats[0].colorSpace; + return true; +} + + +// Connect to the instance and device and get all required function pointers +bool +VulkanSwapchain::connectDevice(VkDevice targetDevice) +{ + this->device = targetDevice; +#if USE_FUNCPTRS_FOR_KHR_EXTS + GET_DEVICE_PROC_ADDR(device, CreateSwapchainKHR); + GET_DEVICE_PROC_ADDR(device, DestroySwapchainKHR); + GET_DEVICE_PROC_ADDR(device, GetSwapchainImagesKHR); + GET_DEVICE_PROC_ADDR(device, AcquireNextImageKHR); + GET_DEVICE_PROC_ADDR(device, QueuePresentKHR); +#endif + return true; +} + + +// Connect to the instance and device and get all required function pointers +bool +VulkanSwapchain::connectInstance(VkInstance targetInstance, + VkPhysicalDevice targetPhysicalDevice) +{ + this->instance = targetInstance; + this->physicalDevice = targetPhysicalDevice; +#if USE_FUNCPTRS_FOR_KHR_EXTS + GET_INSTANCE_PROC_ADDR(instance, GetPhysicalDeviceSurfaceSupportKHR); + GET_INSTANCE_PROC_ADDR(instance, GetPhysicalDeviceSurfaceCapabilitiesKHR); + GET_INSTANCE_PROC_ADDR(instance, GetPhysicalDeviceSurfaceFormatsKHR); + GET_INSTANCE_PROC_ADDR(instance, GetPhysicalDeviceSurfacePresentModesKHR); +#endif + return true; +} + + +// Create the swap chain and get images with given width and height +void +VulkanSwapchain::create(uint32_t *width, uint32_t *height, + bool vsync) +{ + U_ASSERT_ONLY VkResult err; + VkSwapchainKHR oldSwapchain = swapchain; + + // Get physical device surface properties and formats + VkSurfaceCapabilitiesKHR surfCaps; + err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(physicalDevice, surface, + &surfCaps); + assert(err == VK_SUCCESS); + + // Get available present modes + uint32_t presentModeCount; + err = vkGetPhysicalDeviceSurfacePresentModesKHR(physicalDevice, surface, + &presentModeCount, NULL); + assert(err == VK_SUCCESS); + assert(presentModeCount > 0); + + std::vector presentModes(presentModeCount); + + err = vkGetPhysicalDeviceSurfacePresentModesKHR(physicalDevice, surface, + &presentModeCount, + presentModes.data()); + assert(err == VK_SUCCESS); + + VkExtent2D swapchainExtent = {}; + // width and height are either both 0xFFFFFFFF, or both not 0xFFFFFFFF. + if (surfCaps.currentExtent.width == UINT32_MAX) + { + // If the surface size is undefined, the size is set to + // the size of the images requested. + swapchainExtent.width = *width; + swapchainExtent.height = *height; + } + else + { + swapchainExtent = surfCaps.currentExtent; + *width = surfCaps.currentExtent.width; + *height = surfCaps.currentExtent.height; + } + + + // Select a present mode for the swapchain + + // The VK_PRESENT_MODE_FIFO_KHR mode must always be present as per spec + // This mode waits for the vertical blank ("v-sync") + VkPresentModeKHR swapchainPresentMode = VK_PRESENT_MODE_FIFO_KHR; + + // If v-sync is not requested, try to find a mailbox mode if present + // It's the lowest latency non-tearing present mode available + if (!vsync) + { + for (size_t i = 0; i < presentModeCount; i++) + { + if (presentModes[i] == VK_PRESENT_MODE_MAILBOX_KHR) + { + swapchainPresentMode = VK_PRESENT_MODE_MAILBOX_KHR; + break; + } + if ((swapchainPresentMode != VK_PRESENT_MODE_MAILBOX_KHR) + && (presentModes[i] == VK_PRESENT_MODE_IMMEDIATE_KHR)) + { + swapchainPresentMode = VK_PRESENT_MODE_IMMEDIATE_KHR; + } + } + } + + // Determine the number of images + uint32_t desiredNumberOfSwapchainImages = surfCaps.minImageCount + 1; + if ((surfCaps.maxImageCount > 0) + && (desiredNumberOfSwapchainImages > surfCaps.maxImageCount)) + { + desiredNumberOfSwapchainImages = surfCaps.maxImageCount; + } + + VkSurfaceTransformFlagsKHR preTransform; + if (surfCaps.supportedTransforms & VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR) { + preTransform = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR; + } else { + preTransform = surfCaps.currentTransform; + } + + VkSwapchainCreateInfoKHR swapchainCI = {}; + swapchainCI.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR; + swapchainCI.pNext = NULL; + swapchainCI.surface = surface; + swapchainCI.minImageCount = desiredNumberOfSwapchainImages; + swapchainCI.imageFormat = colorFormat; + swapchainCI.imageColorSpace = colorSpace; + swapchainCI.imageExtent = { swapchainExtent.width, swapchainExtent.height }; + swapchainCI.imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT; + swapchainCI.preTransform = (VkSurfaceTransformFlagBitsKHR)preTransform; + swapchainCI.imageArrayLayers = 1; + swapchainCI.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE; + swapchainCI.queueFamilyIndexCount = 0; + swapchainCI.pQueueFamilyIndices = NULL; + swapchainCI.presentMode = swapchainPresentMode; + swapchainCI.oldSwapchain = oldSwapchain; + swapchainCI.clipped = true; + swapchainCI.compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR; + + err = vkCreateSwapchainKHR(device, &swapchainCI, nullptr, &swapchain); + assert(err == VK_SUCCESS); + + // If an existing swap chain is re-created, destroy the old swap chain + // This also cleans up all the presentable images + if (oldSwapchain != VK_NULL_HANDLE) + { + for (uint32_t i = 0; i < imageCount; i++) + { + vkDestroyImageView(device, buffers[i].view, nullptr); + } + vkDestroySwapchainKHR(device, oldSwapchain, nullptr); + } + + err = vkGetSwapchainImagesKHR(device, swapchain, &imageCount, NULL); + assert(err == VK_SUCCESS); + + // Get the swap chain images + images.resize(imageCount); + err = vkGetSwapchainImagesKHR(device, swapchain, + &imageCount, images.data()); + assert(err == VK_SUCCESS); + + // Get the swap chain buffers containing the image and imageview + buffers.resize(imageCount); + for (uint32_t i = 0; i < imageCount; i++) + { + VkImageViewCreateInfo colorAttachmentView = {}; + colorAttachmentView.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO; + colorAttachmentView.pNext = NULL; + colorAttachmentView.format = colorFormat; + colorAttachmentView.components = { + VK_COMPONENT_SWIZZLE_IDENTITY, + VK_COMPONENT_SWIZZLE_IDENTITY, + VK_COMPONENT_SWIZZLE_IDENTITY, + VK_COMPONENT_SWIZZLE_IDENTITY + }; + colorAttachmentView.subresourceRange.aspectMask + = VK_IMAGE_ASPECT_COLOR_BIT; + colorAttachmentView.subresourceRange.baseMipLevel = 0; + colorAttachmentView.subresourceRange.levelCount = 1; + colorAttachmentView.subresourceRange.baseArrayLayer = 0; + colorAttachmentView.subresourceRange.layerCount = 1; + colorAttachmentView.viewType = VK_IMAGE_VIEW_TYPE_2D; + colorAttachmentView.flags = 0; + + buffers[i].image = images[i]; + + colorAttachmentView.image = buffers[i].image; + + err = vkCreateImageView(device, &colorAttachmentView, nullptr, + &buffers[i].view); + assert(err == VK_SUCCESS); + } +} + + +// Acquires the next image in the swap chain +VkResult +VulkanSwapchain::acquireNextImage(VkSemaphore presentCompleteSemaphore, + uint32_t *currentBuffer) +{ + return vkAcquireNextImageKHR(device, swapchain, UINT64_MAX, + presentCompleteSemaphore, + (VkFence)nullptr, + currentBuffer); +} + + +// Present the current image to the queue +VkResult +VulkanSwapchain::queuePresent(VkQueue queue, uint32_t currentBuffer) +{ + VkPresentInfoKHR presentInfo = {}; + presentInfo.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR; + presentInfo.pNext = NULL; + presentInfo.swapchainCount = 1; + presentInfo.pSwapchains = &swapchain; + presentInfo.pImageIndices = ¤tBuffer; + return vkQueuePresentKHR(queue, &presentInfo); +} + + +// Present the current image to the queue when semaphore signaled. +VkResult +VulkanSwapchain::queuePresent(VkQueue queue, uint32_t currentBuffer, + VkSemaphore waitSemaphore) +{ + VkPresentInfoKHR presentInfo = {}; + presentInfo.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR; + presentInfo.pNext = NULL; + presentInfo.swapchainCount = 1; + presentInfo.pSwapchains = &swapchain; + presentInfo.pImageIndices = ¤tBuffer; + if (waitSemaphore != VK_NULL_HANDLE) + { + presentInfo.pWaitSemaphores = &waitSemaphore; + presentInfo.waitSemaphoreCount = 1; + } + return vkQueuePresentKHR(queue, &presentInfo); +} + + +// Free all Vulkan resources used by the swap chain +void +VulkanSwapchain::cleanup() +{ + for (uint32_t i = 0; i < imageCount; i++) + { + vkDestroyImageView(device, buffers[i].view, nullptr); + } + vkDestroySwapchainKHR(device, swapchain, nullptr); + vkDestroySurfaceKHR(instance, surface, nullptr); +} + diff --git a/third_party/ktx-src/tests/loadtests/appfwSDL/VulkanAppSDL/VulkanSwapchain.h b/third_party/ktx-src/tests/loadtests/appfwSDL/VulkanAppSDL/VulkanSwapchain.h new file mode 100644 index 0000000000000000000000000000000000000000..409867a5cd9de7c28e07cf0117d75e3390ed9ea6 --- /dev/null +++ b/third_party/ktx-src/tests/loadtests/appfwSDL/VulkanAppSDL/VulkanSwapchain.h @@ -0,0 +1,105 @@ +/* -*- tab-width: 4; -*- */ +/* vi: set sw=2 ts=4 expandtab: */ + +/* + * Copyright 2017-2020 Mark Callow. + * SPDX-License-Identifier: Apache-2.0 + */ + +#pragma once + +#include + +#include + +#if !defined(USE_FUNCPTRS_FOR_KHR_EXTS) +#define USE_FUNCPTRS_FOR_KHR_EXTS 0 +#endif + +typedef struct _SwapchainBuffers { + VkImage image; + VkImageView view; +} SwapchainBuffer; + +class VulkanSwapchain +{ + public: + VkFormat colorFormat; + VkColorSpaceKHR colorSpace; + + VkSwapchainKHR swapchain = VK_NULL_HANDLE; + + uint32_t imageCount; + std::vector images; + std::vector buffers; + + // Index of the detected graphics- and present-capable device queue. + uint32_t queueIndex = UINT32_MAX; + + // Creates an OS specific surface. + // Looks for a graphics and a present queue + bool initSurface(struct SDL_Window* window); + + // Connect to device and get required device function pointers. + bool connectDevice(VkDevice device); + + // Connect to instance and get required instance function pointers. + bool connectInstance(VkInstance instance, + VkPhysicalDevice physicalDevice); + + // Create the swap chain and get images with given width and height + void create(uint32_t *width, uint32_t *height, + bool vsync = false); + + // Acquires the next image in the swap chain + VkResult acquireNextImage(VkSemaphore presentCompleteSemaphore, + uint32_t *currentBuffer); + + // Present the current image to the queue + VkResult queuePresent(VkQueue queue, uint32_t currentBuffer); + + // Present the current image to the queue + VkResult queuePresent(VkQueue queue, uint32_t currentBuffer, + VkSemaphore waitSemaphore); + + + // Free all Vulkan resources used by the swap chain + void cleanup(); + + private: + VkInstance instance; + VkDevice device; + VkPhysicalDevice physicalDevice; + VkSurfaceKHR surface; +#if USE_FUNCPTRS_FOR_KHR_EXTS + PFN_vkGetPhysicalDeviceSurfaceSupportKHR + pfnGetPhysicalDeviceSurfaceSupportKHR; + PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR + pfnGetPhysicalDeviceSurfaceCapabilitiesKHR; + PFN_vkGetPhysicalDeviceSurfaceFormatsKHR + pfnGetPhysicalDeviceSurfaceFormatsKHR; + PFN_vkGetPhysicalDeviceSurfacePresentModesKHR + pfnGetPhysicalDeviceSurfacePresentModesKHR; + + PFN_vkCreateSwapchainKHR pfnCreateSwapchainKHR; + PFN_vkDestroySwapchainKHR pfnDestroySwapchainKHR; + PFN_vkGetSwapchainImagesKHR pfnGetSwapchainImagesKHR; + PFN_vkAcquireNextImageKHR pfnAcquireNextImageKHR; + PFN_vkQueuePresentKHR pfnQueuePresentKHR; + +#define vkGetPhysicalDeviceSurfaceSupportKHR \ + pfnGetPhysicalDeviceSurfaceSupportKHR +#define vkGetPhysicalDeviceSurfaceCapabilitiesKHR \ + pfnGetPhysicalDeviceSurfaceCapabilitiesKHR +#define vkGetPhysicalDeviceSurfaceFormatsKHR \ + pfnGetPhysicalDeviceSurfaceFormatsKHR +#define vkGetPhysicalDeviceSurfacePresentModesKHR \ + pfnGetPhysicalDeviceSurfacePresentModesKHR + +#define vkCreateSwapchainKHR pfnCreateSwapchainKHR +#define vkDestroySwapchainKHR pfnDestroySwapchainKHR +#define vkGetSwapchainImagesKHR pfnGetSwapchainImagesKHR +#define vkAcquireNextImageKHR pfnAcquireNextImageKHR +#define vkQueuePresentKHR pfnQueuePresentKHR +#endif +}; diff --git a/third_party/ktx-src/tests/loadtests/appfwSDL/VulkanAppSDL/mac/vulkan/README.md b/third_party/ktx-src/tests/loadtests/appfwSDL/VulkanAppSDL/mac/vulkan/README.md new file mode 100644 index 0000000000000000000000000000000000000000..7372a5267ff61ae70d0fce4d1d5ba0ac5ef4bb4e --- /dev/null +++ b/third_party/ktx-src/tests/loadtests/appfwSDL/VulkanAppSDL/mac/vulkan/README.md @@ -0,0 +1,8 @@ + + + +# Vulkan ICD and Explicit Layer Manifest Files + +These were copied from `macOS/share/vulkan` in the Vulkan SDK and have been +modified for inclusion in a macOS application bundle to cause the Vulkan loader +to find the libraries within the bundle. diff --git a/third_party/ktx-src/tests/loadtests/appfwSDL/VulkanAppSDL/mac/vulkan/explicit_layer.d/VkLayer_khronos_validation.json b/third_party/ktx-src/tests/loadtests/appfwSDL/VulkanAppSDL/mac/vulkan/explicit_layer.d/VkLayer_khronos_validation.json new file mode 100644 index 0000000000000000000000000000000000000000..bb82adb0eafe3befb0248cfcedaf13b97ffc419b --- /dev/null +++ b/third_party/ktx-src/tests/loadtests/appfwSDL/VulkanAppSDL/mac/vulkan/explicit_layer.d/VkLayer_khronos_validation.json @@ -0,0 +1,1709 @@ +{ + "file_format_version": "1.2.0", + "layer": { + "name": "VK_LAYER_KHRONOS_validation", + "type": "GLOBAL", + "library_path": "../../../Frameworks/libVkLayer_khronos_validation.dylib", + "api_version": "1.3.283", + "implementation_version": "1", + "description": "Khronos Validation Layer", + "introduction": "The main, comprehensive Khronos validation layer.\n\nVulkan is an Explicit API, enabling direct control over how GPUs actually work. By design, minimal error checking is done inside a Vulkan driver. Applications have full control and responsibility for correct operation. Any errors in how Vulkan is used can result in a crash. \n\nThe Khronos Valiation Layer can be enabled to assist development by enabling developers to verify their applications correctly use the Vulkan API.", + "platforms": [ + "WINDOWS", + "LINUX", + "ANDROID", + "MACOS" + ], + "url": "https://vulkan.lunarg.com/doc/sdk/latest/windows/khronos_validation_layer.html", + "instance_extensions": [ + { + "name": "VK_EXT_debug_report", + "spec_version": "9" + }, + { + "name": "VK_EXT_debug_utils", + "spec_version": "1" + }, + { + "name": "VK_EXT_layer_settings", + "spec_version": "2" + }, + { + "name": "VK_EXT_validation_features", + "spec_version": "2" + } + ], + "device_extensions": [ + { + "name": "VK_EXT_debug_marker", + "spec_version": "4", + "entrypoints": [ + "vkDebugMarkerSetObjectTagEXT", + "vkDebugMarkerSetObjectNameEXT", + "vkCmdDebugMarkerBeginEXT", + "vkCmdDebugMarkerEndEXT", + "vkCmdDebugMarkerInsertEXT" + ] + }, + { + "name": "VK_EXT_validation_cache", + "spec_version": "1", + "entrypoints": [ + "vkCreateValidationCacheEXT", + "vkDestroyValidationCacheEXT", + "vkGetValidationCacheDataEXT", + "vkMergeValidationCachesEXT" + ] + }, + { + "name": "VK_EXT_tooling_info", + "spec_version": "1", + "entrypoints": [ + "vkGetPhysicalDeviceToolPropertiesEXT" + ] + } + ], + "features": { + "presets": [ + { + "label": "Standard", + "description": "Good default validation setup that balance validation coverage and performance.", + "platforms": [ + "WINDOWS", + "LINUX", + "MACOS", + "ANDROID" + ], + "status": "STABLE", + "settings": [ + { + "key": "validate_core", + "value": true + }, + { + "key": "check_image_layout", + "value": true + }, + { + "key": "check_command_buffer", + "value": true + }, + { + "key": "check_object_in_use", + "value": true + }, + { + "key": "check_query", + "value": true + }, + { + "key": "check_shaders", + "value": true + }, + { + "key": "check_shaders_caching", + "value": true + }, + { + "key": "unique_handles", + "value": true + }, + { + "key": "object_lifetime", + "value": true + }, + { + "key": "stateless_param", + "value": true + }, + { + "key": "thread_safety", + "value": false + }, + { + "key": "validate_sync", + "value": false + }, + { + "key": "validate_gpu_based", + "value": "GPU_BASED_NONE" + }, + { + "key": "validate_best_practices", + "value": false + }, + { + "key": "report_flags", + "value": [ + "error" + ] + } + ] + }, + { + "label": "Reduced-Overhead", + "description": "Disables some checks in the interest of better performance.", + "platforms": [ + "WINDOWS", + "LINUX", + "MACOS" + ], + "status": "STABLE", + "settings": [ + { + "key": "validate_core", + "value": true + }, + { + "key": "check_image_layout", + "value": false + }, + { + "key": "check_command_buffer", + "value": false + }, + { + "key": "check_object_in_use", + "value": false + }, + { + "key": "check_query", + "value": false + }, + { + "key": "check_shaders", + "value": true + }, + { + "key": "check_shaders_caching", + "value": true + }, + { + "key": "unique_handles", + "value": false + }, + { + "key": "object_lifetime", + "value": true + }, + { + "key": "stateless_param", + "value": true + }, + { + "key": "thread_safety", + "value": false + }, + { + "key": "validate_sync", + "value": false + }, + { + "key": "validate_gpu_based", + "value": "GPU_BASED_NONE" + }, + { + "key": "validate_best_practices", + "value": false + }, + { + "key": "report_flags", + "value": [ + "error" + ] + } + ] + }, + { + "label": "Best Practices", + "description": "Provides warnings on valid API usage that is potential API misuse.", + "platforms": [ + "WINDOWS", + "LINUX", + "MACOS", + "ANDROID" + ], + "status": "STABLE", + "settings": [ + { + "key": "validate_core", + "value": false + }, + { + "key": "check_image_layout", + "value": false + }, + { + "key": "check_command_buffer", + "value": false + }, + { + "key": "check_object_in_use", + "value": false + }, + { + "key": "check_query", + "value": false + }, + { + "key": "check_shaders", + "value": false + }, + { + "key": "check_shaders_caching", + "value": false + }, + { + "key": "unique_handles", + "value": false + }, + { + "key": "object_lifetime", + "value": false + }, + { + "key": "stateless_param", + "value": false + }, + { + "key": "thread_safety", + "value": false + }, + { + "key": "validate_sync", + "value": false + }, + { + "key": "validate_gpu_based", + "value": "GPU_BASED_NONE" + }, + { + "key": "validate_best_practices", + "value": true + }, + { + "key": "report_flags", + "value": [ + "error", + "warn", + "perf" + ] + } + ] + }, + { + "label": "Synchronization", + "description": "Identify resource access conflicts due to missing or incorrect synchronization operations between actions reading or writing the same regions of memory.", + "platforms": [ + "WINDOWS", + "LINUX", + "MACOS", + "ANDROID" + ], + "status": "STABLE", + "settings": [ + { + "key": "validate_core", + "value": false + }, + { + "key": "check_image_layout", + "value": false + }, + { + "key": "check_command_buffer", + "value": false + }, + { + "key": "check_object_in_use", + "value": false + }, + { + "key": "check_query", + "value": false + }, + { + "key": "check_shaders", + "value": false + }, + { + "key": "check_shaders_caching", + "value": false + }, + { + "key": "unique_handles", + "value": true + }, + { + "key": "object_lifetime", + "value": false + }, + { + "key": "stateless_param", + "value": false + }, + { + "key": "thread_safety", + "value": true + }, + { + "key": "validate_sync", + "value": true + }, + { + "key": "sync_queue_submit", + "value": true + }, + { + "key": "validate_gpu_based", + "value": "GPU_BASED_NONE" + }, + { + "key": "validate_best_practices", + "value": false + }, + { + "key": "report_flags", + "value": [ + "error" + ] + } + ] + }, + { + "label": "GPU-Assisted", + "description": "Check for API usage errors at shader execution time.", + "platforms": [ + "WINDOWS", + "LINUX" + ], + "status": "STABLE", + "settings": [ + { + "key": "validate_core", + "value": false + }, + { + "key": "check_image_layout", + "value": false + }, + { + "key": "check_command_buffer", + "value": false + }, + { + "key": "check_object_in_use", + "value": false + }, + { + "key": "check_query", + "value": false + }, + { + "key": "check_shaders", + "value": false + }, + { + "key": "check_shaders_caching", + "value": false + }, + { + "key": "unique_handles", + "value": false + }, + { + "key": "object_lifetime", + "value": false + }, + { + "key": "stateless_param", + "value": false + }, + { + "key": "thread_safety", + "value": false + }, + { + "key": "validate_sync", + "value": false + }, + { + "key": "validate_gpu_based", + "value": "GPU_BASED_GPU_ASSISTED" + }, + { + "key": "gpuav_reserve_binding_slot", + "value": true + }, + { + "key": "validate_best_practices", + "value": false + }, + { + "key": "report_flags", + "value": [ + "error" + ] + } + ] + }, + { + "label": "Debug Printf", + "description": "Debug shader code by \"printing\" any values of interest to the debug callback or stdout.", + "platforms": [ + "WINDOWS", + "LINUX" + ], + "status": "STABLE", + "settings": [ + { + "key": "validate_core", + "value": false + }, + { + "key": "check_image_layout", + "value": false + }, + { + "key": "check_command_buffer", + "value": false + }, + { + "key": "check_object_in_use", + "value": false + }, + { + "key": "check_query", + "value": false + }, + { + "key": "check_shaders", + "value": false + }, + { + "key": "check_shaders_caching", + "value": false + }, + { + "key": "unique_handles", + "value": false + }, + { + "key": "object_lifetime", + "value": false + }, + { + "key": "stateless_param", + "value": false + }, + { + "key": "thread_safety", + "value": false + }, + { + "key": "validate_sync", + "value": false + }, + { + "key": "validate_gpu_based", + "value": "GPU_BASED_DEBUG_PRINTF" + }, + { + "key": "validate_best_practices", + "value": false + }, + { + "key": "report_flags", + "value": [ + "error" + ] + } + ] + } + ], + "settings": [ + { + "key": "validation_control", + "label": "Validation Areas", + "description": "Control of the Validation layer validation", + "type": "GROUP", + "expanded": true, + "settings": [ + { + "key": "fine_grained_locking", + "env": "VK_LAYER_FINE_GRAINED_LOCKING", + "label": "Fine Grained Locking", + "description": "Enable fine grained locking for Core Validation, which should improve performance in multithreaded applications. This setting allows the optimization to be disabled for debugging.", + "type": "BOOL", + "default": true, + "platforms": [ + "WINDOWS", + "LINUX", + "MACOS", + "ANDROID" + ] + }, + { + "key": "validate_core", + "label": "Core", + "description": "The main, heavy-duty validation checks. This may be valuable early in the development cycle to reduce validation output while correcting parameter/object usage errors.", + "type": "BOOL", + "default": true, + "settings": [ + { + "key": "check_image_layout", + "label": "Image Layout", + "description": "Check that the layout of each image subresource is correct whenever it is used by a command buffer. These checks are very CPU intensive for some applications.", + "type": "BOOL", + "default": true, + "dependence": { + "mode": "ALL", + "settings": [ + { + "key": "validate_core", + "value": true + } + ] + } + }, + { + "key": "check_command_buffer", + "label": "Command Buffer State", + "description": "Check that all Vulkan objects used by a command buffer have not been destroyed. These checks can be CPU intensive for some applications.", + "type": "BOOL", + "default": true, + "dependence": { + "mode": "ALL", + "settings": [ + { + "key": "validate_core", + "value": true + } + ] + } + }, + { + "key": "check_object_in_use", + "label": "Object in Use", + "description": "Check that Vulkan objects are not in use by a command buffer when they are destroyed.", + "type": "BOOL", + "default": true, + "dependence": { + "mode": "ALL", + "settings": [ + { + "key": "validate_core", + "value": true + } + ] + } + }, + { + "key": "check_query", + "label": "Query", + "description": "Checks for commands that use VkQueryPool objects.", + "type": "BOOL", + "default": true, + "dependence": { + "mode": "ALL", + "settings": [ + { + "key": "validate_core", + "value": true + } + ] + } + }, + { + "key": "check_shaders", + "label": "Shader", + "description": "Shader checks. These checks can be CPU intensive during application start up, especially if Shader Validation Caching is also disabled.", + "type": "BOOL", + "default": true, + "expanded": true, + "dependence": { + "mode": "ALL", + "settings": [ + { + "key": "validate_core", + "value": true + } + ] + }, + "settings": [ + { + "key": "check_shaders_caching", + "label": "Caching", + "description": "Enable caching of shader validation results.", + "type": "BOOL", + "default": true, + "dependence": { + "mode": "ALL", + "settings": [ + { + "key": "validate_core", + "value": true + }, + { + "key": "check_shaders", + "value": true + } + ] + } + } + ] + } + ] + }, + { + "key": "unique_handles", + "label": "Handle Wrapping", + "description": "Handle wrapping checks. Disable this feature if you are exerience crashes when creating new extensions or developing new Vulkan objects/structures.", + "type": "BOOL", + "default": true, + "status": "STABLE", + "platforms": [ + "WINDOWS", + "LINUX", + "MACOS", + "ANDROID" + ] + }, + { + "key": "object_lifetime", + "label": "Object Lifetime", + "description": "Object tracking checks. This may not always be necessary late in a development cycle.", + "type": "BOOL", + "default": true, + "status": "STABLE", + "platforms": [ + "WINDOWS", + "LINUX", + "MACOS", + "ANDROID" + ] + }, + { + "key": "stateless_param", + "label": "Stateless Parameter", + "description": "Stateless parameter checks. This may not always be necessary late in a development cycle.", + "type": "BOOL", + "default": true, + "status": "STABLE", + "platforms": [ + "WINDOWS", + "LINUX", + "MACOS", + "ANDROID" + ] + }, + { + "key": "thread_safety", + "label": "Thread Safety", + "description": "Thread checks. In order to not degrade performance, it might be best to run your program with thread-checking disabled most of the time, enabling it occasionally for a quick sanity check or when debugging difficult application behaviors.", + "type": "BOOL", + "default": true, + "status": "STABLE", + "platforms": [ + "WINDOWS", + "LINUX", + "MACOS", + "ANDROID" + ] + }, + { + "key": "validate_sync", + "label": "Synchronization", + "description": "Enable synchronization validation during command buffers recording. This feature reports resource access conflicts due to missing or incorrect synchronization operations between actions (Draw, Copy, Dispatch, Blit) reading or writing the same regions of memory.", + "url": "${LUNARG_SDK}/synchronization_usage.html", + "type": "BOOL", + "default": false, + "expanded": true, + "status": "STABLE", + "platforms": [ + "WINDOWS", + "LINUX", + "MACOS", + "ANDROID" + ], + "settings": [ + { + "key": "sync_queue_submit", + "label": "QueueSubmit Synchronization Validation", + "description": "Enable synchronization validation between submitted command buffers when Synchronization Validation is enabled. This option will increase the synchronization performance cost.", + "type": "BOOL", + "default": true, + "status": "STABLE", + "dependence": { + "mode": "ALL", + "settings": [ + { + "key": "validate_sync", + "value": true + } + ] + } + } + ] + }, + { + "key": "validate_gpu_based", + "label": "GPU Base", + "description": "Setting an option here will enable specialized areas of validation", + "type": "ENUM", + "default": "GPU_BASED_NONE", + "expanded": true, + "status": "STABLE", + "platforms": [ + "WINDOWS", + "LINUX" + ], + "flags": [ + { + "key": "GPU_BASED_NONE", + "label": "None", + "description": "No GPU-based validation." + }, + { + "key": "GPU_BASED_DEBUG_PRINTF", + "label": "Debug Printf", + "description": "Enables processing of debug printf instructions in shaders and sending debug strings to the debug callback.", + "url": "${LUNARG_SDK}/debug_printf.html", + "status": "STABLE", + "platforms": [ + "WINDOWS", + "LINUX" + ], + "settings": [ + { + "key": "printf_to_stdout", + "label": "Redirect Printf messages to stdout", + "description": "Enable redirection of Debug Printf messages from the debug callback to stdout", + "type": "BOOL", + "default": true, + "platforms": [ + "WINDOWS", + "LINUX" + ], + "dependence": { + "mode": "ALL", + "settings": [ + { + "key": "validate_gpu_based", + "value": "GPU_BASED_DEBUG_PRINTF" + } + ] + } + }, + { + "key": "printf_verbose", + "label": "Printf verbose", + "description": "Set the verbosity of debug printf messages", + "type": "BOOL", + "default": false, + "platforms": [ + "WINDOWS", + "LINUX" + ], + "dependence": { + "mode": "ALL", + "settings": [ + { + "key": "validate_gpu_based", + "value": "GPU_BASED_DEBUG_PRINTF" + } + ] + } + }, + { + "key": "printf_buffer_size", + "label": "Printf buffer size", + "description": "Set the size in bytes of the buffer used by debug printf", + "type": "INT", + "default": 1024, + "range": { + "min": 128, + "max": 1048576 + }, + "unit": "bytes", + "platforms": [ + "WINDOWS", + "LINUX" + ], + "dependence": { + "mode": "ALL", + "settings": [ + { + "key": "validate_gpu_based", + "value": "GPU_BASED_DEBUG_PRINTF" + } + ] + } + } + ] + }, + { + "key": "GPU_BASED_GPU_ASSISTED", + "label": "GPU-Assisted", + "description": "Check for API usage errors at shader execution time.", + "url": "${LUNARG_SDK}/gpu_validation.html", + "platforms": [ + "WINDOWS", + "LINUX" + ], + "settings": [ + { + "key": "gpuav_shader_instrumentation", + "label": "Shader instrumentation", + "description": "Instrument shaders to validate descriptors, descriptor indexing, buffer device addresses and ray queries. Warning: will considerably slow down shader executions.", + "type": "BOOL", + "default": true, + "platforms": [ + "WINDOWS", + "LINUX" + ], + "dependence": { + "mode": "ALL", + "settings": [ + { + "key": "validate_gpu_based", + "value": "GPU_BASED_GPU_ASSISTED" + } + ] + }, + "settings": [ + { + "key": "gpuav_descriptor_checks", + "label": "Descriptors indexing", + "description": "Enable descriptors and buffer out of bounds validation when using descriptor indexing", + "type": "BOOL", + "default": true, + "platforms": [ + "WINDOWS", + "LINUX" + ], + "dependence": { + "mode": "ALL", + "settings": [ + { + "key": "gpuav_shader_instrumentation", + "value": true + } + ] + }, + "settings": [ + { + "key": "gpuav_warn_on_robust_oob", + "label": "Generate warning on out of bounds accesses even if buffer robustness is enabled", + "description": "Warn on out of bounds accesses even if robustness is enabled", + "type": "BOOL", + "default": true, + "platforms": [ + "WINDOWS", + "LINUX" + ], + "dependence": { + "mode": "ALL", + "settings": [ + { + "key": "gpuav_shader_instrumentation", + "value": true + } + ] + } + } + ] + }, + { + "key": "gpuav_buffer_address_oob", + "label": "Out of bounds buffer device addresses", + "type": "BOOL", + "default": true, + "description": "Check for ", + "platforms": [ + "WINDOWS", + "LINUX" + ], + "dependence": { + "mode": "ALL", + "settings": [ + { + "key": "gpuav_shader_instrumentation", + "value": true + } + ] + }, + "settings": [ + { + "key": "gpuav_max_buffer_device_addresses", + "label": "Maximum number of buffer device addresses in use at one time", + "description": "", + "type": "INT", + "default": 10000, + "range": { + "min": 100, + "max": 10000000 + }, + "platforms": [ + "WINDOWS", + "LINUX" + ], + "dependence": { + "mode": "ALL", + "settings": [ + { + "key": "gpuav_shader_instrumentation", + "value": true + } + ] + } + } + ] + }, + { + "key": "gpuav_validate_ray_query", + "label": "RayQuery SPIR-V Instructions", + "description": "Enable shader instrumentation on OpRayQueryInitializeKHR", + "type": "BOOL", + "default": true, + "platforms": [ + "WINDOWS", + "LINUX" + ], + "dependence": { + "mode": "ALL", + "settings": [ + { + "key": "gpuav_shader_instrumentation", + "value": true + } + ] + } + }, + { + "key": "gpuav_cache_instrumented_shaders", + "label": "Cache instrumented shaders rather than instrumenting them on every run", + "description": "Enable instrumented shader caching", + "type": "BOOL", + "default": true, + "platforms": [ + "WINDOWS", + "LINUX" + ], + "dependence": { + "mode": "ALL", + "settings": [ + { + "key": "gpuav_shader_instrumentation", + "value": true + } + ] + } + }, + { + "key": "gpuav_select_instrumented_shaders", + "label": "Enable instrumenting shaders selectively", + "description": "Select which shaders to instrument passing a VkValidationFeaturesEXT struct with GPU-AV enabled in the VkShaderModuleCreateInfo pNext", + "type": "BOOL", + "default": false, + "platforms": [ + "WINDOWS", + "LINUX" + ], + "dependence": { + "mode": "ALL", + "settings": [ + { + "key": "gpuav_shader_instrumentation", + "value": true + } + ] + } + } + ] + }, + { + "key": "gpuav_buffers_validation", + "label": "Buffer content validation", + "description": "Validate buffers containing parameters used in indirect Vulkan commands, or used in copy commands", + "type": "BOOL", + "default": true, + "platforms": [ + "WINDOWS", + "LINUX" + ], + "dependence": { + "mode": "ALL", + "settings": [ + { + "key": "validate_gpu_based", + "value": "GPU_BASED_GPU_ASSISTED" + } + ] + }, + "settings": [ + { + "key": "gpuav_indirect_draws_buffers", + "label": "Indirect draws parameters", + "type": "BOOL", + "default": true, + "description": "Validate buffers containing draw parameters used in indirect draw commands", + "platforms": [ + "WINDOWS", + "LINUX" + ], + "dependence": { + "mode": "ALL", + "settings": [ + { + "key": "gpuav_buffers_validation", + "value": true + } + ] + } + }, + { + "key": "indirect_dispatches", + "label": "Indirect dispatches parameters", + "type": "BOOL", + "default": true, + "description": "Validate buffers containing dispatch parameters used in indirect dispatch commands", + "platforms": [ + "WINDOWS", + "LINUX" + ], + "dependence": { + "mode": "ALL", + "settings": [ + { + "key": "gpuav_buffers_validation", + "value": true + } + ] + } + }, + { + "key": "indirect_trace_rays", + "label": "Indirect trace rays parameters", + "type": "BOOL", + "default": true, + "description": "Validate buffers containing ray tracing parameters used in indirect ray tracing commands", + "platforms": [ + "WINDOWS", + "LINUX" + ], + "dependence": { + "mode": "ALL", + "settings": [ + { + "key": "gpuav_buffers_validation", + "value": true + } + ] + } + }, + { + "key": "gpuav_buffer_copies", + "label": "Buffer copies", + "type": "BOOL", + "default": true, + "description": "Validate copies involving a VkBuffer. Right now only validates copy buffer to image.", + "platforms": [ + "WINDOWS", + "LINUX" + ], + "dependence": { + "mode": "ALL", + "settings": [ + { + "key": "gpuav_buffers_validation", + "value": true + } + ] + } + } + ] + }, + { + "key": "gpuav_advanced_settings", + "label": "Advanced Settings", + "description": "GPU-AV advanced settings", + "type": "GROUP", + "view": "ADVANCED", + "platforms": [ + "WINDOWS", + "LINUX" + ], + "dependence": { + "mode": "ALL", + "settings": [ + { + "key": "validate_gpu_based", + "value": "GPU_BASED_GPU_ASSISTED" + } + ] + }, + "settings": [ + { + "key": "gpuav_reserve_binding_slot", + "label": "Reserve Descriptor Set Binding Slot", + "type": "BOOL", + "default": true, + "description": "Specifies that the validation layers reserve a descriptor set binding slot for their own use. The layer reports a value for VkPhysicalDeviceLimits::maxBoundDescriptorSets that is one less than the value reported by the device. If the device supports the binding of only one descriptor set, the validation layer does not perform GPU-assisted validation.", + "platforms": [ + "WINDOWS", + "LINUX" + ], + "dependence": { + "mode": "ALL", + "settings": [ + { + "key": "validate_gpu_based", + "value": "GPU_BASED_GPU_ASSISTED" + } + ] + } + }, + { + "key": "gpuav_vma_linear_output", + "label": "Linear Memory Allocation Mode", + "description": "Use VMA linear memory allocations for GPU-AV output buffers instead of finding best place for new allocations among free regions to optimize memory usage. Enabling this setting reduces performance cost but disabling this method minimizes memory usage.", + "type": "BOOL", + "default": true, + "platforms": [ + "WINDOWS", + "LINUX" + ], + "dependence": { + "mode": "ALL", + "settings": [ + { + "key": "validate_gpu_based", + "value": "GPU_BASED_GPU_ASSISTED" + } + ] + } + } + ] + }, + { + "key": "gpuav_debug_settings", + "label": "Developer Debug Settings", + "description": "GPU-AV debug settings", + "type": "GROUP", + "view": "ADVANCED", + "platforms": [ + "WINDOWS", + "LINUX" + ], + "dependence": { + "mode": "ALL", + "settings": [ + { + "key": "validate_gpu_based", + "value": "GPU_BASED_GPU_ASSISTED" + } + ] + }, + "settings": [ + { + "key": "gpuav_debug_validate_instrumented_shaders", + "label": "Validate instrumented shaders", + "description": "Run spirv-val after doing shader instrumentation", + "type": "BOOL", + "default": false, + "platforms": [ + "WINDOWS", + "LINUX" + ], + "dependence": { + "mode": "ALL", + "settings": [ + { + "key": "validate_gpu_based", + "value": "GPU_BASED_GPU_ASSISTED" + } + ] + } + }, + { + "key": "gpuav_debug_dump_instrumented_shaders", + "label": "Dump instrumented shaders", + "description": "Will dump the instrumented shaders (before and after) to working directory", + "type": "BOOL", + "default": false, + "platforms": [ + "WINDOWS", + "LINUX" + ], + "dependence": { + "mode": "ALL", + "settings": [ + { + "key": "validate_gpu_based", + "value": "GPU_BASED_GPU_ASSISTED" + } + ] + } + } + ] + } + ] + } + ] + }, + { + "key": "validate_best_practices", + "label": "Best Practices", + "description": "Outputs warnings related to common misuse of the API, but which are not explicitly prohibited by the specification.", + "url": "${LUNARG_SDK}/best_practices.html", + "type": "BOOL", + "default": false, + "expanded": true, + "status": "STABLE", + "platforms": [ + "WINDOWS", + "LINUX", + "MACOS", + "ANDROID" + ], + "settings": [ + { + "key": "validate_best_practices_arm", + "label": "ARM-specific best practices", + "description": "Outputs warnings for spec-conforming but non-ideal code on ARM GPUs.", + "type": "BOOL", + "default": false, + "platforms": [ + "WINDOWS", + "LINUX", + "MACOS", + "ANDROID" + ], + "dependence": { + "mode": "ALL", + "settings": [ + { + "key": "validate_best_practices", + "value": true + } + ] + } + }, + { + "key": "validate_best_practices_amd", + "label": "AMD-specific best practices", + "description": "Outputs warnings for spec-conforming but non-ideal code on AMD GPUs.", + "type": "BOOL", + "default": false, + "platforms": [ + "WINDOWS", + "LINUX", + "MACOS" + ], + "dependence": { + "mode": "ALL", + "settings": [ + { + "key": "validate_best_practices", + "value": true + } + ] + } + }, + { + "key": "validate_best_practices_img", + "label": "IMG-specific best practices", + "description": "Outputs warnings for spec-conforming but non-ideal code on Imagination GPUs.", + "type": "BOOL", + "default": false, + "platforms": [ + "WINDOWS", + "LINUX", + "MACOS" + ], + "dependence": { + "mode": "ALL", + "settings": [ + { + "key": "validate_best_practices", + "value": true + } + ] + } + }, + { + "key": "validate_best_practices_nvidia", + "label": "NVIDIA-specific best practices", + "description": "Outputs warnings for spec-conforming but non-ideal code on NVIDIA GPUs.", + "type": "BOOL", + "default": false, + "platforms": [ + "WINDOWS", + "LINUX", + "ANDROID" + ], + "dependence": { + "mode": "ALL", + "settings": [ + { + "key": "validate_best_practices", + "value": true + } + ] + } + } + ] + } + ] + }, + { + "key": "debug_action", + "label": "Debug Action", + "description": "Specifies what action is to be taken when a layer reports information", + "type": "FLAGS", + "flags": [ + { + "key": "VK_DBG_LAYER_ACTION_LOG_MSG", + "label": "Log Message", + "description": "Log a txt message to stdout or to a log filename.", + "settings": [ + { + "key": "log_filename", + "label": "Log Filename", + "description": "Specifies the output filename", + "type": "SAVE_FILE", + "default": "stdout", + "dependence": { + "mode": "ALL", + "settings": [ + { + "key": "debug_action", + "value": [ + "VK_DBG_LAYER_ACTION_LOG_MSG" + ] + } + ] + } + } + ] + }, + { + "key": "VK_DBG_LAYER_ACTION_CALLBACK", + "label": "Callback", + "description": "Call user defined callback function(s) that have been registered via the VK_EXT_debug_report extension. Since application must register callback, this is a NOOP for the settings file.", + "view": "HIDDEN" + }, + { + "key": "VK_DBG_LAYER_ACTION_DEBUG_OUTPUT", + "label": "Debug Output", + "description": "Log a txt message using the Windows OutputDebugString function.", + "platforms": [ + "WINDOWS" + ] + }, + { + "key": "VK_DBG_LAYER_ACTION_BREAK", + "label": "Break", + "description": "Trigger a breakpoint if a debugger is in use." + } + ], + "default": [ + "VK_DBG_LAYER_ACTION_LOG_MSG" + ] + }, + { + "key": "report_flags", + "label": "Message Severity", + "description": "Comma-delineated list of options specifying the types of messages to be reported", + "type": "FLAGS", + "flags": [ + { + "key": "info", + "label": "Info", + "description": "Report informational messages." + }, + { + "key": "warn", + "label": "Warning", + "description": "Report warnings from using the API in a manner which may lead to undefined behavior or to warn the user of common trouble spots. A warning does NOT necessarily signify illegal application behavior." + }, + { + "key": "perf", + "label": "Performance", + "description": "Report usage of the API that may cause suboptimal performance." + }, + { + "key": "error", + "label": "Error", + "description": "Report errors in API usage." + }, + { + "key": "debug", + "label": "Debug", + "description": "For layer development. Report messages for debugging layer behavior.", + "view": "HIDDEN" + } + ], + "default": [ + "error" + ] + }, + { + "key": "enable_message_limit", + "label": "Limit Duplicated Messages", + "description": "Enable limiting of duplicate messages.", + "type": "BOOL", + "default": true, + "settings": [ + { + "key": "duplicate_message_limit", + "env": "VK_LAYER_DUPLICATE_MESSAGE_LIMIT", + "label": "Max Duplicated Messages", + "description": "Maximum number of times any single validation message should be reported.", + "type": "INT", + "default": 10, + "range": { + "min": 1 + }, + "dependence": { + "mode": "ALL", + "settings": [ + { + "key": "enable_message_limit", + "value": true + } + ] + } + } + ] + }, + { + "key": "message_id_filter", + "label": "Mute Message VUIDs", + "description": "List of VUIDs and VUID identifers which are to be IGNORED by the validation layer", + "type": "LIST", + "env": "VK_LAYER_MESSAGE_ID_FILTER", + "default": [] + }, + { + "key": "message_format", + "label": "Message Format", + "description": "Specifies how error messages are reported", + "type": "GROUP", + "expanded": true, + "settings": [ + { + "key": "message_format_display_application_name", + "label": "Display Application Name", + "description": "Useful when running multiple instances to know which instance the message is from.", + "type": "BOOL", + "default": false, + "platforms": [ + "WINDOWS", + "LINUX", + "MACOS", + "ANDROID" + ] + } + ] + }, + { + "key": "disables", + "label": "Disables", + "description": "Specify areas of validation to be disabled", + "type": "FLAGS", + "env": "VK_LAYER_DISABLES", + "flags": [ + { + "key": "VK_VALIDATION_FEATURE_DISABLE_THREAD_SAFETY_EXT", + "label": "Thread Safety", + "description": "Thread checks. In order to not degrade performance, it might be best to run your program with thread-checking disabled most of the time, enabling it occasionally for a quick sanity check or when debugging difficult application behaviors." + }, + { + "key": "VK_VALIDATION_FEATURE_DISABLE_API_PARAMETERS_EXT", + "label": "Stateless Parameter", + "description": "Stateless parameter checks. This may not always be necessary late in a development cycle." + }, + { + "key": "VK_VALIDATION_FEATURE_DISABLE_OBJECT_LIFETIMES_EXT", + "label": "Object Lifetime", + "description": "Object tracking checks. This may not always be necessary late in a development cycle." + }, + { + "key": "VK_VALIDATION_FEATURE_DISABLE_CORE_CHECKS_EXT", + "label": "Core", + "description": "The main, heavy-duty validation checks. This may be valuable early in the development cycle to reduce validation output while correcting parameter/object usage errors." + }, + { + "key": "VK_VALIDATION_FEATURE_DISABLE_UNIQUE_HANDLES_EXT", + "label": "Handle Wrapping", + "description": "Handle wrapping checks. Disable this feature if you are exerience crashes when creating new extensions or developing new Vulkan objects/structures." + }, + { + "key": "VK_VALIDATION_FEATURE_DISABLE_SHADERS_EXT", + "label": "Shader Validation", + "description": "Shader checks. These checks can be CPU intensive during application start up, especially if Shader Validation Caching is also disabled.", + "view": "ADVANCED" + }, + { + "key": "VALIDATION_CHECK_DISABLE_COMMAND_BUFFER_STATE", + "label": "Command Buffer State", + "description": "Check that all Vulkan objects used by a command buffer have not been destroyed. These checks can be CPU intensive for some applications.", + "view": "ADVANCED" + }, + { + "key": "VALIDATION_CHECK_DISABLE_IMAGE_LAYOUT_VALIDATION", + "label": "Image Layout", + "description": "Check that the layout of each image subresource is correct whenever it is used by a command buffer. These checks are very CPU intensive for some applications.", + "view": "ADVANCED" + }, + { + "key": "VALIDATION_CHECK_DISABLE_QUERY_VALIDATION", + "label": "Query", + "description": "Checks for commands that use VkQueryPool objects.", + "view": "ADVANCED" + }, + { + "key": "VALIDATION_CHECK_DISABLE_OBJECT_IN_USE", + "label": "Object in Use", + "description": "Check that Vulkan objects are not in use by a command buffer when they are destroyed.", + "view": "ADVANCED" + }, + { + "key": "VALIDATION_CHECK_DISABLE_SYNCHRONIZATION_VALIDATION_QUEUE_SUBMIT", + "label": "QueueSubmit Synchronization Validation", + "description": "Check synchronization validation between submitted command buffers when Synchronization Validation is enabled.", + "view": "ADVANCED" + }, + { + "key": "VK_VALIDATION_FEATURE_DISABLE_SHADER_VALIDATION_CACHE_EXT", + "label": "Shader Validation Caching", + "description": "Disable caching of shader validation results.", + "view": "ADVANCED" + } + ], + "default": [ + "VK_VALIDATION_FEATURE_DISABLE_THREAD_SAFETY_EXT" + ] + }, + { + "key": "enables", + "label": "Enables", + "description": "Setting an option here will enable specialized areas of validation", + "type": "FLAGS", + "env": "VK_LAYER_ENABLES", + "flags": [ + { + "key": "VK_VALIDATION_FEATURE_ENABLE_SYNCHRONIZATION_VALIDATION_EXT", + "label": "Synchronization", + "description": "This feature reports resource access conflicts due to missing or incorrect synchronization operations between actions (Draw, Copy, Dispatch, Blit) reading or writing the same regions of memory.", + "url": "${LUNARG_SDK}/synchronization_usage.html", + "status": "STABLE", + "platforms": [ + "WINDOWS", + "LINUX", + "MACOS", + "ANDROID" + ] + }, + { + "key": "VK_VALIDATION_FEATURE_ENABLE_DEBUG_PRINTF_EXT", + "label": "Debug Printf", + "description": "Enables processing of debug printf instructions in shaders and sending debug strings to the debug callback.", + "url": "${LUNARG_SDK}/debug_printf.html", + "status": "STABLE", + "platforms": [ + "WINDOWS", + "LINUX" + ] + }, + { + "key": "VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_EXT", + "label": "GPU-Assisted", + "description": "Check for API usage errors at shader execution time.", + "url": "${LUNARG_SDK}/gpu_validation.html", + "platforms": [ + "WINDOWS", + "LINUX" + ] + }, + { + "key": "VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_RESERVE_BINDING_SLOT_EXT", + "label": "Reserve Descriptor Set Binding Slot", + "description": "Specifies that the validation layers reserve a descriptor set binding slot for their own use. The layer reports a value for VkPhysicalDeviceLimits::maxBoundDescriptorSets that is one less than the value reported by the device. If the device supports the binding of only one descriptor set, the validation layer does not perform GPU-assisted validation.", + "platforms": [ + "WINDOWS", + "LINUX" + ] + }, + { + "key": "VK_VALIDATION_FEATURE_ENABLE_BEST_PRACTICES_EXT", + "label": "Best Practices", + "description": "Activating this feature enables the output of warnings related to common misuse of the API, but which are not explicitly prohibited by the specification.", + "url": "${LUNARG_SDK}/best_practices.html", + "platforms": [ + "WINDOWS", + "LINUX", + "MACOS", + "ANDROID" + ] + }, + { + "key": "VALIDATION_CHECK_ENABLE_VENDOR_SPECIFIC_ARM", + "label": "ARM-specific best practices", + "description": "Activating this feature enables the output of warnings related to ARM-specific misuse of the API, but which are not explicitly prohibited by the specification.", + "platforms": [ + "WINDOWS", + "LINUX", + "MACOS", + "ANDROID" + ] + }, + { + "key": "VALIDATION_CHECK_ENABLE_VENDOR_SPECIFIC_AMD", + "label": "AMD-specific best practices", + "description": "Adds check for spec-conforming but non-ideal code on AMD GPUs.", + "platforms": [ + "WINDOWS", + "LINUX", + "MACOS" + ] + }, + { + "key": "VALIDATION_CHECK_ENABLE_VENDOR_SPECIFIC_IMG", + "label": "IMG-specific best practices", + "description": "Adds check for spec-conforming but non-ideal code on Imagination GPUs.", + "platforms": [ + "WINDOWS", + "LINUX", + "MACOS" + ] + }, + { + "key": "VALIDATION_CHECK_ENABLE_VENDOR_SPECIFIC_NVIDIA", + "label": "NVIDIA-specific best practices", + "description": "Activating this feature enables the output of warnings related to NVIDIA-specific misuse of the API, but which are not explicitly prohibited by the specification.", + "platforms": [ + "WINDOWS", + "LINUX", + "ANDROID" + ] + }, + { + "key": "VALIDATION_CHECK_ENABLE_VENDOR_SPECIFIC_ALL", + "label": "Hardware specific best practices", + "description": "Activating this feature enables all vendor specific best practices.", + "platforms": [ + "WINDOWS", + "LINUX", + "ANDROID" + ] + } + ], + "default": [] + } + ] + } + } +} diff --git a/third_party/ktx-src/tests/loadtests/appfwSDL/VulkanAppSDL/mac/vulkan/icd.d/MoltenVK_icd.json b/third_party/ktx-src/tests/loadtests/appfwSDL/VulkanAppSDL/mac/vulkan/icd.d/MoltenVK_icd.json new file mode 100644 index 0000000000000000000000000000000000000000..066782b7bbe213a866bab6f4480528eeceed0eba --- /dev/null +++ b/third_party/ktx-src/tests/loadtests/appfwSDL/VulkanAppSDL/mac/vulkan/icd.d/MoltenVK_icd.json @@ -0,0 +1,8 @@ +{ + "file_format_version": "1.0.0", + "ICD": { + "library_path": "../../../Frameworks/libMoltenVK.dylib", + "api_version": "1.2.0", + "is_portability_driver": true + } +} diff --git a/third_party/ktx-src/tests/loadtests/appfwSDL/VulkanAppSDL/shaders/textoverlay.frag b/third_party/ktx-src/tests/loadtests/appfwSDL/VulkanAppSDL/shaders/textoverlay.frag new file mode 100644 index 0000000000000000000000000000000000000000..766f7f0753fc6079785d8d493bc6ee319caa3c3f --- /dev/null +++ b/third_party/ktx-src/tests/loadtests/appfwSDL/VulkanAppSDL/shaders/textoverlay.frag @@ -0,0 +1,16 @@ +// Copyright 2017-2020 Mark Callow +// SPDX-License-Identifier: Apache-2.0 + +#version 450 core + +layout (location = 0) in vec2 inUV; + +layout (binding = 0) uniform sampler2D samplerFont; + +layout (location = 0) out vec4 outFragColor; + +void main(void) +{ + float color = texture(samplerFont, inUV).r; + outFragColor = vec4(vec3(color), 1.0); +} diff --git a/third_party/ktx-src/tests/loadtests/appfwSDL/VulkanAppSDL/shaders/textoverlay.vert b/third_party/ktx-src/tests/loadtests/appfwSDL/VulkanAppSDL/shaders/textoverlay.vert new file mode 100644 index 0000000000000000000000000000000000000000..5a9ec9ebbf4b7fd599c287b5cbb9af59e2536b5f --- /dev/null +++ b/third_party/ktx-src/tests/loadtests/appfwSDL/VulkanAppSDL/shaders/textoverlay.vert @@ -0,0 +1,20 @@ +// Copyright 2017-2020 Mark Callow +// SPDX-License-Identifier: Apache-2.0 + +#version 450 core + +layout (location = 0) in vec2 inPos; +layout (location = 1) in vec2 inUV; + +layout (location = 0) out vec2 outUV; + +out gl_PerVertex +{ + vec4 gl_Position; +}; + +void main(void) +{ + gl_Position = vec4(inPos, 0.0, 1.0); + outUV = inUV; +} diff --git a/third_party/ktx-src/tests/loadtests/appfwSDL/VulkanAppSDL/vulkancheckres.h b/third_party/ktx-src/tests/loadtests/appfwSDL/VulkanAppSDL/vulkancheckres.h new file mode 100644 index 0000000000000000000000000000000000000000..1afa176853ad9a6db5116517479991f8b4ef6404 --- /dev/null +++ b/third_party/ktx-src/tests/loadtests/appfwSDL/VulkanAppSDL/vulkancheckres.h @@ -0,0 +1,48 @@ +/* -*- tab-width: 4; -*- */ +/* vi: set sw=2 ts=4 expandtab: */ + +#ifndef VULKAN_CHECK_RES_H_1456211188 +#define VULKAN_CHECK_RES_H_1456211188 + +/* + * Copyright 2017-2020 Mark Callow. + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include +#include +#include + +#include + +/** + * @internal + * @file + * @~English + * + * @brief Check result of a Vulkan command. + * + * Use for commands that will always succeed unless usage is invalid. + */ +#if defined(DEBUG) +#define VK_CHECK_RESULT(f) \ +{ \ + VkResult res = (f); \ + if (res != VK_SUCCESS) \ + { \ + std::stringstream msg; \ + msg << "Fatal : VkResult is \"" << res << "\" in " << __FILE__ \ + << " at line " << __LINE__ << std::endl; \ + SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, \ + "VkSample_02_cube_textured", \ + msg.str().c_str(), \ + NULL); \ + assert(res == VK_SUCCESS); \ + } \ +} +#else +#define VK_CHECK_RESULT(f) (void)f +#endif + +#endif diff --git a/third_party/ktx-src/tests/loadtests/appfwSDL/VulkanAppSDL/vulkandebug.cpp b/third_party/ktx-src/tests/loadtests/appfwSDL/VulkanAppSDL/vulkandebug.cpp new file mode 100644 index 0000000000000000000000000000000000000000..21352d3d04a8a6dac60d2ec4c026c1b393f7a67c --- /dev/null +++ b/third_party/ktx-src/tests/loadtests/appfwSDL/VulkanAppSDL/vulkandebug.cpp @@ -0,0 +1,288 @@ +/* +* Vulkan examples debug wrapper +* +* Appendix for VK_EXT_Debug_Report can be found at https://github.com/KhronosGroup/Vulkan-Docs/blob/1.0-VK_EXT_debug_report/doc/specs/vulkan/appendices/debug_report.txt +* +* Copyright 2016 Sascha Willems - www.saschawillems.de +* SPDX-License-Identifier: MIT +*/ + +#include "vulkandebug.h" +#include +#include "unused.h" + +namespace vkDebug +{ + int validationLayerCount = 1; + const char *validationLayerNames[] = + { + // This is a meta layer that enables all of the standard + // validation layers in the correct order : + // threading, parameter_validation, device_limits, object_tracker, image, core_validation, swapchain, and unique_objects + "VK_LAYER_LUNARG_standard_validation" + }; + + PFN_vkCreateDebugReportCallbackEXT CreateDebugReportCallback = VK_NULL_HANDLE; + PFN_vkDestroyDebugReportCallbackEXT DestroyDebugReportCallback = VK_NULL_HANDLE; + PFN_vkDebugReportMessageEXT dbgBreakCallback = VK_NULL_HANDLE; + + VkDebugReportCallbackEXT msgCallback; + + VkBool32 messageCallback( + VkDebugReportFlagsEXT flags, + VkDebugReportObjectTypeEXT /*objType*/, + uint64_t /*srcObject*/, + size_t /*location*/, + int32_t msgCode, + const char* pLayerPrefix, + const char* pMsg, + void* /*pUserData*/) + { + // Message text passed in by validation layer + std::string text(pMsg); + + // Select prefix depending on flags passed to the callback + // Note that multiple flags may be set for a single validation message + std::string prefix(""); + + // Error that may result in undefined behaviour + if (flags & VK_DEBUG_REPORT_ERROR_BIT_EXT) + { + prefix += "ERROR:"; + }; + // Warnings may hint at unexpected / non-spec API usage + if (flags & VK_DEBUG_REPORT_WARNING_BIT_EXT) + { + prefix += "WARNING:"; + }; + // May indicate sub-optimal usage of the API + if (flags & VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT) + { + prefix += "PERFORMANCE:"; + }; + // Informal messages that may become handy during debugging + if (flags & VK_DEBUG_REPORT_INFORMATION_BIT_EXT) + { + prefix += "INFO:"; + } + // Diagnostic info from the Vulkan loader and layers + // Usually not helpful in terms of API usage, but may help to debug layer and loader problems + if (flags & VK_DEBUG_REPORT_DEBUG_BIT_EXT) + { + prefix += "DEBUG:"; + } + + // Display message to default output (console if activated) + std::cout << prefix << " [" << pLayerPrefix << "] Code " << msgCode << " : " << pMsg << "\n"; + + fflush(stdout); + + // The return value of this callback controls wether the Vulkan call that caused + // the validation message will be aborted or not + // We return VK_FALSE as we DON'T want Vulkan calls that cause a validation message + // (and return a VkResult) to abort + // If you instead want to have calls abort, pass in VK_TRUE and the function will + // return VK_ERROR_VALIDATION_FAILED_EXT + return VK_FALSE; + } + + void setupDebugging(VkInstance instance, VkDebugReportFlagsEXT flags, VkDebugReportCallbackEXT callBack) + { + CreateDebugReportCallback = (PFN_vkCreateDebugReportCallbackEXT)vkGetInstanceProcAddr(instance, "vkCreateDebugReportCallbackEXT"); + DestroyDebugReportCallback = (PFN_vkDestroyDebugReportCallbackEXT)vkGetInstanceProcAddr(instance, "vkDestroyDebugReportCallbackEXT"); + dbgBreakCallback = (PFN_vkDebugReportMessageEXT)vkGetInstanceProcAddr(instance, "vkDebugReportMessageEXT"); + + VkDebugReportCallbackCreateInfoEXT dbgCreateInfo = {}; + dbgCreateInfo.sType = VK_STRUCTURE_TYPE_DEBUG_REPORT_CREATE_INFO_EXT; + dbgCreateInfo.pfnCallback = (PFN_vkDebugReportCallbackEXT)messageCallback; + dbgCreateInfo.flags = flags; + + U_ASSERT_ONLY VkResult err = CreateDebugReportCallback( + instance, + &dbgCreateInfo, + nullptr, + (callBack != VK_NULL_HANDLE) ? &callBack : &msgCallback); + assert(!err); + (void)err; // Supress VC++ unused variable warning for Release config. + } + + void freeDebugCallback(VkInstance instance) + { + if (msgCallback != VK_NULL_HANDLE) + { + DestroyDebugReportCallback(instance, msgCallback, nullptr); + } + } + + namespace DebugMarker + { + bool active = false; + + PFN_vkDebugMarkerSetObjectTagEXT pfnDebugMarkerSetObjectTag = VK_NULL_HANDLE; + PFN_vkDebugMarkerSetObjectNameEXT pfnDebugMarkerSetObjectName = VK_NULL_HANDLE; + PFN_vkCmdDebugMarkerBeginEXT pfnCmdDebugMarkerBegin = VK_NULL_HANDLE; + PFN_vkCmdDebugMarkerEndEXT pfnCmdDebugMarkerEnd = VK_NULL_HANDLE; + PFN_vkCmdDebugMarkerInsertEXT pfnCmdDebugMarkerInsert = VK_NULL_HANDLE; + + void setup(VkDevice device) + { + pfnDebugMarkerSetObjectTag = (PFN_vkDebugMarkerSetObjectTagEXT)vkGetDeviceProcAddr(device, "vkDebugMarkerSetObjectTagEXT"); + pfnDebugMarkerSetObjectName = (PFN_vkDebugMarkerSetObjectNameEXT)vkGetDeviceProcAddr(device, "vkDebugMarkerSetObjectNameEXT"); + pfnCmdDebugMarkerBegin = (PFN_vkCmdDebugMarkerBeginEXT)vkGetDeviceProcAddr(device, "vkCmdDebugMarkerBeginEXT"); + pfnCmdDebugMarkerEnd = (PFN_vkCmdDebugMarkerEndEXT)vkGetDeviceProcAddr(device, "vkCmdDebugMarkerEndEXT"); + pfnCmdDebugMarkerInsert = (PFN_vkCmdDebugMarkerInsertEXT)vkGetDeviceProcAddr(device, "vkCmdDebugMarkerInsertEXT"); + + // Set flag if at least one function pointer is present + active = (pfnDebugMarkerSetObjectName != VK_NULL_HANDLE); + } + + void setObjectName(VkDevice device, uint64_t object, VkDebugReportObjectTypeEXT objectType, const char *name) + { + // Check for valid function pointer (may not be present if not running in a debugging application) + if (pfnDebugMarkerSetObjectName) + { + VkDebugMarkerObjectNameInfoEXT nameInfo = {}; + nameInfo.sType = VK_STRUCTURE_TYPE_DEBUG_MARKER_OBJECT_NAME_INFO_EXT; + nameInfo.objectType = objectType; + nameInfo.object = object; + nameInfo.pObjectName = name; + pfnDebugMarkerSetObjectName(device, &nameInfo); + } + } + + void setObjectTag(VkDevice device, uint64_t object, VkDebugReportObjectTypeEXT objectType, uint64_t name, size_t tagSize, const void* tag) + { + // Check for valid function pointer (may not be present if not running in a debugging application) + if (pfnDebugMarkerSetObjectTag) + { + VkDebugMarkerObjectTagInfoEXT tagInfo = {}; + tagInfo.sType = VK_STRUCTURE_TYPE_DEBUG_MARKER_OBJECT_TAG_INFO_EXT; + tagInfo.objectType = objectType; + tagInfo.object = object; + tagInfo.tagName = name; + tagInfo.tagSize = tagSize; + tagInfo.pTag = tag; + pfnDebugMarkerSetObjectTag(device, &tagInfo); + } + } + + void beginRegion(VkCommandBuffer cmdbuffer, const char* pMarkerName, glm::vec4 color) + { + // Check for valid function pointer (may not be present if not running in a debugging application) + if (pfnCmdDebugMarkerBegin) + { + VkDebugMarkerMarkerInfoEXT markerInfo = {}; + markerInfo.sType = VK_STRUCTURE_TYPE_DEBUG_MARKER_MARKER_INFO_EXT; + memcpy(markerInfo.color, &color[0], sizeof(float) * 4); + markerInfo.pMarkerName = pMarkerName; + pfnCmdDebugMarkerBegin(cmdbuffer, &markerInfo); + } + } + + void insert(VkCommandBuffer cmdbuffer, std::string markerName, glm::vec4 color) + { + // Check for valid function pointer (may not be present if not running in a debugging application) + if (pfnCmdDebugMarkerInsert) + { + VkDebugMarkerMarkerInfoEXT markerInfo = {}; + markerInfo.sType = VK_STRUCTURE_TYPE_DEBUG_MARKER_MARKER_INFO_EXT; + memcpy(markerInfo.color, &color[0], sizeof(float) * 4); + markerInfo.pMarkerName = markerName.c_str(); + pfnCmdDebugMarkerInsert(cmdbuffer, &markerInfo); + } + } + + void endRegion(VkCommandBuffer cmdBuffer) + { + // Check for valid function (may not be present if not runnin in a debugging application) + if (pfnCmdDebugMarkerEnd) + { + pfnCmdDebugMarkerEnd(cmdBuffer); + } + } + + void setCommandBufferName(VkDevice device, VkCommandBuffer cmdBuffer, const char * name) + { + setObjectName(device, (uint64_t)cmdBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, name); + } + + void setQueueName(VkDevice device, VkQueue queue, const char * name) + { + setObjectName(device, (uint64_t)queue, VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT, name); + } + + void setImageName(VkDevice device, VkImage image, const char * name) + { + setObjectName(device, (uint64_t)image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, name); + } + + void setSamplerName(VkDevice device, VkSampler sampler, const char * name) + { + setObjectName(device, (uint64_t)sampler, VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_EXT, name); + } + + void setBufferName(VkDevice device, VkBuffer buffer, const char * name) + { + setObjectName(device, (uint64_t)buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, name); + } + + void setDeviceMemoryName(VkDevice device, VkDeviceMemory memory, const char * name) + { + setObjectName(device, (uint64_t)memory, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, name); + } + + void setShaderModuleName(VkDevice device, VkShaderModule shaderModule, const char * name) + { + setObjectName(device, (uint64_t)shaderModule, VK_DEBUG_REPORT_OBJECT_TYPE_SHADER_MODULE_EXT, name); + } + + void setPipelineName(VkDevice device, VkPipeline pipeline, const char * name) + { + setObjectName(device, (uint64_t)pipeline, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, name); + } + + void setPipelineLayoutName(VkDevice device, VkPipelineLayout pipelineLayout, const char * name) + { + setObjectName(device, (uint64_t)pipelineLayout, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT, name); + } + + void setRenderPassName(VkDevice device, VkRenderPass renderPass, const char * name) + { + setObjectName(device, (uint64_t)renderPass, VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, name); + } + + void setFramebufferName(VkDevice device, VkFramebuffer framebuffer, const char * name) + { + setObjectName(device, (uint64_t)framebuffer, VK_DEBUG_REPORT_OBJECT_TYPE_FRAMEBUFFER_EXT, name); + } + + void setDescriptorSetLayoutName(VkDevice device, VkDescriptorSetLayout descriptorSetLayout, const char * name) + { + setObjectName(device, (uint64_t)descriptorSetLayout, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT_EXT, name); + } + + void setDescriptorSetName(VkDevice device, VkDescriptorSet descriptorSet, const char * name) + { + setObjectName(device, (uint64_t)descriptorSet, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, name); + } + + void setSemaphoreName(VkDevice device, VkSemaphore semaphore, const char * name) + { + setObjectName(device, (uint64_t)semaphore, VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT, name); + } + + void setFenceName(VkDevice device, VkFence fence, const char * name) + { + setObjectName(device, (uint64_t)fence, VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, name); + } + + void setEventName(VkDevice device, VkEvent _event, const char * name) + { + setObjectName(device, (uint64_t)_event, VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT, name); + } + } + +} + +// vi: set sw=2 ts=4 expandtab: + diff --git a/third_party/ktx-src/tests/loadtests/appfwSDL/VulkanAppSDL/vulkandebug.h b/third_party/ktx-src/tests/loadtests/appfwSDL/VulkanAppSDL/vulkandebug.h new file mode 100644 index 0000000000000000000000000000000000000000..995b22ee55e36295e314b88364160b5aaf2e94f1 --- /dev/null +++ b/third_party/ktx-src/tests/loadtests/appfwSDL/VulkanAppSDL/vulkandebug.h @@ -0,0 +1,106 @@ +/* + * Copyright 2017-2020 Mark Callow + * SPDX-License-Identifier: Apache-2.0 + */ + +#pragma once +#include "vulkan/vulkan.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef _WIN32 + #include + #include + #include +#endif + +#define GLM_FORCE_RADIANS +#define GLM_FORCE_DEPTH_ZERO_TO_ONE +#include "disable_glm_warnings.h" +#include +#include "reenable_warnings.h" + +namespace vkDebug +{ + // Default validation layers + extern int validationLayerCount; + extern const char *validationLayerNames[]; + + // Default debug callback + VkBool32 messageCallback( + VkDebugReportFlagsEXT flags, + VkDebugReportObjectTypeEXT objType, + uint64_t srcObject, + size_t location, + int32_t msgCode, + const char* pLayerPrefix, + const char* pMsg, + void* pUserData); + + // Load debug function pointers and set debug callback + // if callBack is NULL, default message callback will be used + void setupDebugging( + VkInstance instance, + VkDebugReportFlagsEXT flags, + VkDebugReportCallbackEXT callBack); + // Clear debug callback + void freeDebugCallback(VkInstance instance); + + // Setup and functions for the VK_EXT_debug_marker_extension + // Extension spec can be found at https://github.com/KhronosGroup/Vulkan-Docs/blob/1.0-VK_EXT_debug_marker/doc/specs/vulkan/appendices/VK_EXT_debug_marker.txt + // Note that the extension will only be present if run from an offline debugging application + // The actual check for extension presence and enabling it on the device is done in the example base class + // See VulkanExampleBase::createInstance and VulkanExampleBase::createDevice (base/vulkanexamplebase.cpp) + namespace DebugMarker + { + // Set to true if function pointer for the debug marker are available + extern bool active; + + // Get function pointers for the debug report extensions from the device + void setup(VkDevice device); + + // Sets the debug name of an object + // All Objects in Vulkan are represented by their 64-bit handles which are passed into this function + // along with the object type + void setObjectName(VkDevice device, uint64_t object, VkDebugReportObjectTypeEXT objectType, const char *name); + + // Set the tag for an object + void setObjectTag(VkDevice device, uint64_t object, VkDebugReportObjectTypeEXT objectType, uint64_t name, size_t tagSize, const void* tag); + + // Start a new debug marker region + void beginRegion(VkCommandBuffer cmdbuffer, const char* pMarkerName, glm::vec4 color); + + // Insert a new debug marker into the command buffer + void insert(VkCommandBuffer cmdbuffer, std::string markerName, glm::vec4 color); + + // End the current debug marker region + void endRegion(VkCommandBuffer cmdBuffer); + + // Object specific naming functions + void setCommandBufferName(VkDevice device, VkCommandBuffer cmdBuffer, const char * name); + void setQueueName(VkDevice device, VkQueue queue, const char * name); + void setImageName(VkDevice device, VkImage image, const char * name); + void setSamplerName(VkDevice device, VkSampler sampler, const char * name); + void setBufferName(VkDevice device, VkBuffer buffer, const char * name); + void setDeviceMemoryName(VkDevice device, VkDeviceMemory memory, const char * name); + void setShaderModuleName(VkDevice device, VkShaderModule shaderModule, const char * name); + void setPipelineName(VkDevice device, VkPipeline pipeline, const char * name); + void setPipelineLayoutName(VkDevice device, VkPipelineLayout pipelineLayout, const char * name); + void setRenderPassName(VkDevice device, VkRenderPass renderPass, const char * name); + void setFramebufferName(VkDevice device, VkFramebuffer framebuffer, const char * name); + void setDescriptorSetLayoutName(VkDevice device, VkDescriptorSetLayout descriptorSetLayout, const char * name); + void setDescriptorSetName(VkDevice device, VkDescriptorSet descriptorSet, const char * name); + void setSemaphoreName(VkDevice device, VkSemaphore semaphore, const char * name); + void setFenceName(VkDevice device, VkFence fence, const char * name); + void setEventName(VkDevice device, VkEvent _event, const char * name); + } + +} + +// vi: set sw=2 ts=4 expandtab: diff --git a/third_party/ktx-src/tests/loadtests/appfwSDL/VulkanAppSDL/vulkantextoverlay.hpp b/third_party/ktx-src/tests/loadtests/appfwSDL/VulkanAppSDL/vulkantextoverlay.hpp new file mode 100644 index 0000000000000000000000000000000000000000..761e562ea469232b77f7183978058ffac7ef51c7 --- /dev/null +++ b/third_party/ktx-src/tests/loadtests/appfwSDL/VulkanAppSDL/vulkantextoverlay.hpp @@ -0,0 +1,839 @@ +/* +* Copyright 2016 Sascha Willems - www.saschawillems.de +* SPDX-License-Identifier: MIT +* +* Text overlay class for displaying debug information +* +*/ + +#pragma once + +#include +#include +#include +#include +#include +#include +#include + +#include +#include "vulkantools.h" +#include "vulkandebug.h" + +#include "stb/stb_font_consolas_24_latin1.inl" + +// Defines for the STB font used +// STB font files can be found at http://nothings.org/stb/font/ +#define STB_FONT_NAME stb_font_consolas_24_latin1 +#define STB_FONT_WIDTH STB_FONT_consolas_24_latin1_BITMAP_WIDTH +#define STB_FONT_HEIGHT STB_FONT_consolas_24_latin1_BITMAP_HEIGHT +#define STB_FIRST_CHAR STB_FONT_consolas_24_latin1_FIRST_CHAR +#define STB_NUM_CHARS STB_FONT_consolas_24_latin1_NUM_CHARS +#define STB_MISSING_GLPYH 0x80 // Actually a control character. + +// Max. number of chars the text overlay buffer can hold +#define MAX_CHAR_COUNT 1024 + + +/** + * @internal + * @brief Given the lead byte of a UTF-8 sequence returns the expected length of the codepoint + * @param[in] leadByte The lead byte of a UTF-8 sequence + * @return The expected length of the codepoint */ +[[nodiscard]] constexpr inline int sequenceLength(uint8_t leadByte) noexcept { + if ((leadByte & 0b1000'0000u) == 0b0000'0000u) + return 1; + if ((leadByte & 0b1110'0000u) == 0b1100'0000u) + return 2; + if ((leadByte & 0b1111'0000u) == 0b1110'0000u) + return 3; + if ((leadByte & 0b1111'1000u) == 0b1111'0000u) + return 4; + + return 0; +} + +/** + * @internal + * @brief Checks if the codepoint was coded as a longer than required sequence + * @param[in] codepoint The unicode codepoint + * @param[in] length The UTF-8 sequence length + * @return True if the sequence length was inappropriate for the given codepoint */ +[[nodiscard]] constexpr inline bool isOverlongSequence(uint32_t codepoint, int length) noexcept { + if (codepoint < 0x80) + return length != 1; + else if (codepoint < 0x800) + return length != 2; + else if (codepoint < 0x10000) + return length != 3; + else + return false; +} + +/** + * @internal + * @brief Checks if the codepoint is valid + * @param[in] codepoint The unicode codepoint + * @return True if the codepoint is a valid unicode codepoint */ +[[nodiscard]] constexpr inline bool isCodepointValid(uint32_t codepoint) noexcept { + return codepoint <= 0x0010FFFFu + && !(0xD800u <= codepoint && codepoint <= 0xDBFFu); +} + +/** + * @internal + * @brief Safely checks and advances a UTF-8 sequence iterator to the start of the next unicode codepoint + * @param[in] it iterator to be advanced + * @param[in] end iterator pointing to the end of the range + * @return True if the advance operation was successful and the advanced codepoint was a valid UTF-8 sequence */ +template +[[nodiscard]] constexpr bool advanceUTF8(Iterator& it, Iterator end, + uint32_t& codepoint) noexcept { + if (it == end) + return false; + + const auto length = sequenceLength(*it); + if (length == 0) + return false; + + if (std::distance(it, end) < length) + return false; + + for (int i = 1; i < length; ++i) { + const auto trailByte = *(it + i); + if ((static_cast(trailByte) & 0b1100'0000u) != 0b1000'0000u) + return false; + } + + codepoint = 0; + switch (length) { + case 1: + codepoint |= *it++; + break; + case 2: + codepoint |= (*it++ & 0b0001'1111u) << 6u; + codepoint |= (*it++ & 0b0011'1111u); + break; + case 3: + codepoint |= (*it++ & 0b0000'1111u) << 12u; + codepoint |= (*it++ & 0b0011'1111u) << 6u; + codepoint |= (*it++ & 0b0011'1111u); + break; + case 4: + codepoint |= (*it++ & 0b0000'0111u) << 18u; + codepoint |= (*it++ & 0b0011'1111u) << 12u; + codepoint |= (*it++ & 0b0011'1111u) << 6u; + codepoint |= (*it++ & 0b0011'1111u); + break; + } + + if (!isCodepointValid(codepoint)) + return false; + + if (isOverlongSequence(codepoint, length)) + return false; + + return true; +} + +// Mostly self-contained text overlay class +// todo : comment +class VulkanTextOverlay +{ +private: + VkPhysicalDevice physicalDevice; + VkDevice device; + VkPhysicalDeviceMemoryProperties deviceMemoryProperties; + VkQueue queue; + VkFormat colorFormat; + VkFormat depthFormat; + + uint32_t *frameBufferWidth; + uint32_t *frameBufferHeight; + + VkSampler sampler; + VkImage image; + VkImageView view; + VkBuffer buffer; + VkDeviceMemory memory; + VkDeviceMemory imageMemory; + VkDescriptorPool descriptorPool; + VkDescriptorSetLayout descriptorSetLayout; + VkDescriptorSet descriptorSet; + VkPipelineLayout pipelineLayout; + VkPipelineCache pipelineCache; + VkPipeline pipeline; + VkRenderPass renderPass; + VkCommandPool commandPool; + std::vector frameBuffers; + std::vector shaderStages; + + // Pointer to mapped vertex buffer + glm::vec4 *mapped = nullptr; + // Used during text updates + glm::vec4 *mappedLocal = nullptr; + + stb_fontchar stbFontData[STB_NUM_CHARS]; + uint32_t numLetters; + + // Try to find appropriate memory type for a memory allocation + uint32_t getMemoryType(uint32_t typeBits, VkFlags properties) + { + for (uint32_t i = 0; i < 32; i++) + { + if ((typeBits & 1) == 1) + { + if ((deviceMemoryProperties.memoryTypes[i].propertyFlags & properties) == properties) + { + return i; + } + } + typeBits >>= 1; + } + + // todo : throw error + return 0; + } + +public: + + enum TextAlign { alignLeft, alignCenter, alignRight }; + + bool visible = true; + bool invalidated = false; + + std::vector cmdBuffers; + + VulkanTextOverlay( + VkPhysicalDevice physicalDevice, + VkDevice device, + VkQueue queue, + std::vector &framebuffers, + VkFormat colorformat, + VkFormat depthformat, + uint32_t *framebufferwidth, + uint32_t *framebufferheight, + std::vector shaderstages) + { + this->physicalDevice = physicalDevice; + this->device = device; + this->queue = queue; + this->colorFormat = colorformat; + this->depthFormat = depthformat; + + this->frameBuffers.resize(framebuffers.size()); + for (uint32_t i = 0; i < framebuffers.size(); i++) + { + this->frameBuffers[i] = &framebuffers[i]; + } + + this->shaderStages = shaderstages; + + this->frameBufferWidth = framebufferwidth; + this->frameBufferHeight = framebufferheight; + + vkGetPhysicalDeviceMemoryProperties(physicalDevice, &deviceMemoryProperties); + cmdBuffers.resize(framebuffers.size()); + prepareResources(); + prepareRenderPass(); + preparePipeline(); + } + + ~VulkanTextOverlay() + { + // Free up all Vulkan resources requested by the text overlay + vkDestroySampler(device, sampler, nullptr); + vkDestroyImage(device, image, nullptr); + vkDestroyImageView(device, view, nullptr); + vkDestroyBuffer(device, buffer, nullptr); + vkFreeMemory(device, memory, nullptr); + vkFreeMemory(device, imageMemory, nullptr); + vkDestroyDescriptorSetLayout(device, descriptorSetLayout, nullptr); + vkDestroyDescriptorPool(device, descriptorPool, nullptr); + vkDestroyPipelineLayout(device, pipelineLayout, nullptr); + vkDestroyPipelineCache(device, pipelineCache, nullptr); + vkDestroyPipeline(device, pipeline, nullptr); + vkDestroyRenderPass(device, renderPass, nullptr); + vkFreeCommandBuffers(device, commandPool, static_cast(cmdBuffers.size()), cmdBuffers.data()); + vkDestroyCommandPool(device, commandPool, nullptr); + } + + // Prepare all vulkan resources required to render the font + // The text overlay uses separate resources for descriptors (pool, sets, layouts), pipelines and command buffers + void prepareResources() + { + static unsigned char font24pixels[STB_FONT_HEIGHT][STB_FONT_WIDTH]; + STB_FONT_NAME(stbFontData, font24pixels, STB_FONT_HEIGHT); + + // Command buffer + + // Pool + VkCommandPoolCreateInfo cmdPoolInfo = {}; + cmdPoolInfo.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO; + cmdPoolInfo.queueFamilyIndex = 0; // todo : pass from example base / swap chain + cmdPoolInfo.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT; + VK_CHECK_RESULT(vkCreateCommandPool(device, &cmdPoolInfo, nullptr, &commandPool)); + + VkCommandBufferAllocateInfo cmdBufAllocateInfo = + vkTools::initializers::commandBufferAllocateInfo( + commandPool, + VK_COMMAND_BUFFER_LEVEL_PRIMARY, + (uint32_t)cmdBuffers.size()); + + VK_CHECK_RESULT(vkAllocateCommandBuffers(device, &cmdBufAllocateInfo, cmdBuffers.data())); + + // Vertex buffer, 4 per character. + VkDeviceSize bufferSize = MAX_CHAR_COUNT * sizeof(glm::vec4) * 4; + + VkBufferCreateInfo bufferInfo = vkTools::initializers::bufferCreateInfo(VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, bufferSize); + VK_CHECK_RESULT(vkCreateBuffer(device, &bufferInfo, nullptr, &buffer)); + + VkMemoryRequirements memReqs; + VkMemoryAllocateInfo allocInfo = vkTools::initializers::memoryAllocateInfo(); + + vkGetBufferMemoryRequirements(device, buffer, &memReqs); + allocInfo.allocationSize = memReqs.size; + allocInfo.memoryTypeIndex = getMemoryType(memReqs.memoryTypeBits, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT); + VK_CHECK_RESULT(vkAllocateMemory(device, &allocInfo, nullptr, &memory)); + VK_CHECK_RESULT(vkBindBufferMemory(device, buffer, memory, 0)); + + // Map persistent + VK_CHECK_RESULT(vkMapMemory(device, memory, 0, VK_WHOLE_SIZE, 0, (void **)&mapped)); + + + // Font texture + VkImageCreateInfo imageInfo = vkTools::initializers::imageCreateInfo(); + imageInfo.imageType = VK_IMAGE_TYPE_2D; + imageInfo.format = VK_FORMAT_R8_UNORM; + imageInfo.extent.width = STB_FONT_WIDTH; + imageInfo.extent.height = STB_FONT_HEIGHT; + imageInfo.extent.depth = 1; + imageInfo.mipLevels = 1; + imageInfo.arrayLayers = 1; + imageInfo.samples = VK_SAMPLE_COUNT_1_BIT; + imageInfo.tiling = VK_IMAGE_TILING_OPTIMAL; + imageInfo.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT; + imageInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE; + imageInfo.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED; + VK_CHECK_RESULT(vkCreateImage(device, &imageInfo, nullptr, &image)); + + vkGetImageMemoryRequirements(device, image, &memReqs); + allocInfo.allocationSize = memReqs.size; + allocInfo.memoryTypeIndex = getMemoryType(memReqs.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); + VK_CHECK_RESULT(vkAllocateMemory(device, &allocInfo, nullptr, &imageMemory)); + VK_CHECK_RESULT(vkBindImageMemory(device, image, imageMemory, 0)); + + // Staging + + struct { + VkDeviceMemory memory; + VkBuffer buffer; + } stagingBuffer; + + VkBufferCreateInfo bufferCreateInfo = vkTools::initializers::bufferCreateInfo(); + bufferCreateInfo.size = allocInfo.allocationSize; + bufferCreateInfo.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT; + bufferCreateInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE; + + VK_CHECK_RESULT(vkCreateBuffer(device, &bufferCreateInfo, nullptr, &stagingBuffer.buffer)); + + // Get memory requirements for the staging buffer (alignment, memory type bits) + vkGetBufferMemoryRequirements(device, stagingBuffer.buffer, &memReqs); + + allocInfo.allocationSize = memReqs.size; + // Get memory type index for a host visible buffer + allocInfo.memoryTypeIndex = getMemoryType(memReqs.memoryTypeBits, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT); + + VK_CHECK_RESULT(vkAllocateMemory(device, &allocInfo, nullptr, &stagingBuffer.memory)); + VK_CHECK_RESULT(vkBindBufferMemory(device, stagingBuffer.buffer, stagingBuffer.memory, 0)); + + uint8_t *data; + VK_CHECK_RESULT(vkMapMemory(device, stagingBuffer.memory, 0, allocInfo.allocationSize, 0, (void **)&data)); + memcpy(data, &font24pixels[0][0], STB_FONT_WIDTH * STB_FONT_HEIGHT); + vkUnmapMemory(device, stagingBuffer.memory); + + // Copy to image + + VkCommandBuffer copyCmd; + cmdBufAllocateInfo.commandBufferCount = 1; + VK_CHECK_RESULT(vkAllocateCommandBuffers(device, &cmdBufAllocateInfo, ©Cmd)); + + VkCommandBufferBeginInfo cmdBufInfo = vkTools::initializers::commandBufferBeginInfo(); + VK_CHECK_RESULT(vkBeginCommandBuffer(copyCmd, &cmdBufInfo)); + + // Prepare for transfer + vkTools::setImageLayout( + copyCmd, + image, + VK_IMAGE_ASPECT_COLOR_BIT, + VK_IMAGE_LAYOUT_PREINITIALIZED, + VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); + + VkBufferImageCopy bufferCopyRegion = {}; + bufferCopyRegion.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; + bufferCopyRegion.imageSubresource.mipLevel = 0; + bufferCopyRegion.imageSubresource.layerCount = 1; + bufferCopyRegion.imageExtent.width = STB_FONT_WIDTH; + bufferCopyRegion.imageExtent.height = STB_FONT_HEIGHT; + bufferCopyRegion.imageExtent.depth = 1; + + vkCmdCopyBufferToImage( + copyCmd, + stagingBuffer.buffer, + image, + VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, + 1, + &bufferCopyRegion + ); + + // Prepare for shader read + vkTools::setImageLayout( + copyCmd, + image, + VK_IMAGE_ASPECT_COLOR_BIT, + VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, + VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); + + VK_CHECK_RESULT(vkEndCommandBuffer(copyCmd)); + + VkSubmitInfo submitInfo = vkTools::initializers::submitInfo(); + submitInfo.commandBufferCount = 1; + submitInfo.pCommandBuffers = ©Cmd; + + VK_CHECK_RESULT(vkQueueSubmit(queue, 1, &submitInfo, VK_NULL_HANDLE)); + VK_CHECK_RESULT(vkQueueWaitIdle(queue)); + + vkFreeCommandBuffers(device, commandPool, 1, ©Cmd); + vkFreeMemory(device, stagingBuffer.memory, nullptr); + vkDestroyBuffer(device, stagingBuffer.buffer, nullptr); + + + VkImageViewCreateInfo imageViewInfo = vkTools::initializers::imageViewCreateInfo(); + imageViewInfo.image = image; + imageViewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D; + imageViewInfo.format = imageInfo.format; + imageViewInfo.components = { + VK_COMPONENT_SWIZZLE_IDENTITY, + VK_COMPONENT_SWIZZLE_IDENTITY, + VK_COMPONENT_SWIZZLE_IDENTITY, + VK_COMPONENT_SWIZZLE_IDENTITY + }; + imageViewInfo.subresourceRange = { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 }; + + VK_CHECK_RESULT(vkCreateImageView(device, &imageViewInfo, nullptr, &view)); + + // Sampler + VkSamplerCreateInfo samplerInfo = vkTools::initializers::samplerCreateInfo(); + samplerInfo.magFilter = VK_FILTER_LINEAR; + samplerInfo.minFilter = VK_FILTER_LINEAR; + samplerInfo.mipmapMode = VK_SAMPLER_MIPMAP_MODE_LINEAR; + samplerInfo.addressModeU = VK_SAMPLER_ADDRESS_MODE_REPEAT; + samplerInfo.addressModeV = VK_SAMPLER_ADDRESS_MODE_REPEAT; + samplerInfo.addressModeW = VK_SAMPLER_ADDRESS_MODE_REPEAT; + samplerInfo.mipLodBias = 0.0f; + samplerInfo.compareOp = VK_COMPARE_OP_NEVER; + samplerInfo.minLod = 0.0f; + samplerInfo.maxLod = 1.0f; + samplerInfo.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE; + samplerInfo.anisotropyEnable = VK_FALSE; + samplerInfo.maxAnisotropy = 1.0; + VK_CHECK_RESULT(vkCreateSampler(device, &samplerInfo, nullptr, &sampler)); + + // Descriptor + // Font uses a separate descriptor pool + std::array poolSizes; + poolSizes[0] = vkTools::initializers::descriptorPoolSize(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1); + + VkDescriptorPoolCreateInfo descriptorPoolInfo = + vkTools::initializers::descriptorPoolCreateInfo( + static_cast(poolSizes.size()), + poolSizes.data(), + 1); + + VK_CHECK_RESULT(vkCreateDescriptorPool(device, &descriptorPoolInfo, nullptr, &descriptorPool)); + + // Descriptor set layout + std::array setLayoutBindings; + setLayoutBindings[0] = vkTools::initializers::descriptorSetLayoutBinding(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_SHADER_STAGE_FRAGMENT_BIT, 0); + + VkDescriptorSetLayoutCreateInfo descriptorSetLayoutInfo = + vkTools::initializers::descriptorSetLayoutCreateInfo( + setLayoutBindings.data(), + static_cast(setLayoutBindings.size())); + + VK_CHECK_RESULT(vkCreateDescriptorSetLayout(device, &descriptorSetLayoutInfo, nullptr, &descriptorSetLayout)); + + // Pipeline layout + VkPipelineLayoutCreateInfo pipelineLayoutInfo = + vkTools::initializers::pipelineLayoutCreateInfo( + &descriptorSetLayout, + 1); + + VK_CHECK_RESULT(vkCreatePipelineLayout(device, &pipelineLayoutInfo, nullptr, &pipelineLayout)); + + // Descriptor set + VkDescriptorSetAllocateInfo descriptorSetAllocInfo = + vkTools::initializers::descriptorSetAllocateInfo( + descriptorPool, + &descriptorSetLayout, + 1); + + VK_CHECK_RESULT(vkAllocateDescriptorSets(device, &descriptorSetAllocInfo, &descriptorSet)); + + VkDescriptorImageInfo texDescriptor = + vkTools::initializers::descriptorImageInfo( + sampler, + view, + VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); + + std::array writeDescriptorSets; + writeDescriptorSets[0] = vkTools::initializers::writeDescriptorSet(descriptorSet, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 0, &texDescriptor); + vkUpdateDescriptorSets(device, static_cast(writeDescriptorSets.size()), writeDescriptorSets.data(), 0, NULL); + + // Pipeline cache + VkPipelineCacheCreateInfo pipelineCacheCreateInfo = {}; + pipelineCacheCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO; + VK_CHECK_RESULT(vkCreatePipelineCache(device, &pipelineCacheCreateInfo, nullptr, &pipelineCache)); + } + + // Prepare a separate pipeline for the font rendering decoupled from the main application + void preparePipeline() + { + VkPipelineInputAssemblyStateCreateInfo inputAssemblyState = + vkTools::initializers::pipelineInputAssemblyStateCreateInfo( + VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP, + 0, + // primmitiveRestartEnable not needed but disabling it results in a MoltenVK + // feature not present warning. + VK_TRUE); + + VkPipelineRasterizationStateCreateInfo rasterizationState = + vkTools::initializers::pipelineRasterizationStateCreateInfo( + VK_POLYGON_MODE_FILL, + VK_CULL_MODE_BACK_BIT, + VK_FRONT_FACE_CLOCKWISE, + 0); + // Because we haven't enabled the depthClamp device feature. + rasterizationState.depthClampEnable = VK_FALSE; + + // Enable blending + VkPipelineColorBlendAttachmentState blendAttachmentState = + vkTools::initializers::pipelineColorBlendAttachmentState(0xf, VK_TRUE); + + blendAttachmentState.srcColorBlendFactor = VK_BLEND_FACTOR_ONE; + blendAttachmentState.dstColorBlendFactor = VK_BLEND_FACTOR_ONE; + blendAttachmentState.colorBlendOp = VK_BLEND_OP_ADD; + blendAttachmentState.srcAlphaBlendFactor = VK_BLEND_FACTOR_ONE; + blendAttachmentState.dstAlphaBlendFactor = VK_BLEND_FACTOR_ONE; + blendAttachmentState.alphaBlendOp = VK_BLEND_OP_ADD; + blendAttachmentState.colorWriteMask = VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT; + + VkPipelineColorBlendStateCreateInfo colorBlendState = + vkTools::initializers::pipelineColorBlendStateCreateInfo( + 1, + &blendAttachmentState); + + VkPipelineDepthStencilStateCreateInfo depthStencilState = + vkTools::initializers::pipelineDepthStencilStateCreateInfo( + VK_FALSE, + VK_FALSE, + VK_COMPARE_OP_LESS_OR_EQUAL); + + VkPipelineViewportStateCreateInfo viewportState = + vkTools::initializers::pipelineViewportStateCreateInfo(1, 1, 0); + + VkPipelineMultisampleStateCreateInfo multisampleState = + vkTools::initializers::pipelineMultisampleStateCreateInfo( + VK_SAMPLE_COUNT_1_BIT, + 0); + + std::vector dynamicStateEnables = { + VK_DYNAMIC_STATE_VIEWPORT, + VK_DYNAMIC_STATE_SCISSOR + }; + + VkPipelineDynamicStateCreateInfo dynamicState = + vkTools::initializers::pipelineDynamicStateCreateInfo( + dynamicStateEnables.data(), + static_cast(dynamicStateEnables.size()), + 0); + + std::array vertexBindings = {}; + vertexBindings[0] = vkTools::initializers::vertexInputBindingDescription(0, sizeof(glm::vec4), VK_VERTEX_INPUT_RATE_VERTEX); + vertexBindings[1] = vkTools::initializers::vertexInputBindingDescription(1, sizeof(glm::vec4), VK_VERTEX_INPUT_RATE_VERTEX); + + std::array vertexAttribs = {}; + // Position + vertexAttribs[0] = vkTools::initializers::vertexInputAttributeDescription(0, 0, VK_FORMAT_R32G32_SFLOAT, 0); + // UV + vertexAttribs[1] = vkTools::initializers::vertexInputAttributeDescription(1, 1, VK_FORMAT_R32G32_SFLOAT, sizeof(glm::vec2)); + + VkPipelineVertexInputStateCreateInfo inputState = vkTools::initializers::pipelineVertexInputStateCreateInfo(); + inputState.vertexBindingDescriptionCount = static_cast(vertexBindings.size()); + inputState.pVertexBindingDescriptions = vertexBindings.data(); + inputState.vertexAttributeDescriptionCount = static_cast(vertexAttribs.size()); + inputState.pVertexAttributeDescriptions = vertexAttribs.data(); + + VkGraphicsPipelineCreateInfo pipelineCreateInfo = + vkTools::initializers::pipelineCreateInfo( + pipelineLayout, + renderPass, + 0); + + pipelineCreateInfo.pVertexInputState = &inputState; + pipelineCreateInfo.pInputAssemblyState = &inputAssemblyState; + pipelineCreateInfo.pRasterizationState = &rasterizationState; + pipelineCreateInfo.pColorBlendState = &colorBlendState; + pipelineCreateInfo.pMultisampleState = &multisampleState; + pipelineCreateInfo.pViewportState = &viewportState; + pipelineCreateInfo.pDepthStencilState = &depthStencilState; + pipelineCreateInfo.pDynamicState = &dynamicState; + pipelineCreateInfo.stageCount = static_cast(shaderStages.size()); + pipelineCreateInfo.pStages = shaderStages.data(); + + VK_CHECK_RESULT(vkCreateGraphicsPipelines(device, pipelineCache, 1, &pipelineCreateInfo, nullptr, &pipeline)); + } + + // Prepare a separate render pass for rendering the text as an overlay + void prepareRenderPass() + { + VkAttachmentDescription attachments[2] = {}; + + // Color attachment + attachments[0].format = colorFormat; + attachments[0].samples = VK_SAMPLE_COUNT_1_BIT; + // Don't clear the framebuffer (like the renderpass from the example does) + attachments[0].loadOp = VK_ATTACHMENT_LOAD_OP_LOAD; + attachments[0].storeOp = VK_ATTACHMENT_STORE_OP_STORE; + attachments[0].stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; + attachments[0].stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE; + attachments[0].initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; + attachments[0].finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; + + // Depth attachment + attachments[1].format = depthFormat; + attachments[1].samples = VK_SAMPLE_COUNT_1_BIT; + attachments[1].loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; + attachments[1].storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE; + attachments[1].stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; + attachments[1].stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE; + attachments[1].initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL; + attachments[1].finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL; + + VkAttachmentReference colorReference = {}; + colorReference.attachment = 0; + colorReference.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; + + VkAttachmentReference depthReference = {}; + depthReference.attachment = 1; + depthReference.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL; + + VkSubpassDescription subpass = {}; + subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS; + subpass.flags = 0; + subpass.inputAttachmentCount = 0; + subpass.pInputAttachments = NULL; + subpass.colorAttachmentCount = 1; + subpass.pColorAttachments = &colorReference; + subpass.pResolveAttachments = NULL; + subpass.pDepthStencilAttachment = &depthReference; + subpass.preserveAttachmentCount = 0; + subpass.pPreserveAttachments = NULL; + + VkRenderPassCreateInfo renderPassInfo = {}; + renderPassInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO; + renderPassInfo.pNext = NULL; + renderPassInfo.attachmentCount = 2; + renderPassInfo.pAttachments = attachments; + renderPassInfo.subpassCount = 1; + renderPassInfo.pSubpasses = &subpass; + renderPassInfo.dependencyCount = 0; + renderPassInfo.pDependencies = NULL; + + VK_CHECK_RESULT(vkCreateRenderPass(device, &renderPassInfo, nullptr, &renderPass)); + } + + // Map buffer + void beginTextUpdate() + { + mappedLocal = mapped; + numLetters = 0; + } + + // Add text to the current buffer + // todo : drop shadow? color attribute? + void addText(std::string text, float x, float y, TextAlign align) + { + if (numLetters == MAX_CHAR_COUNT) + return; + + assert(mapped != nullptr); + + const float charW = 1.5f / *frameBufferWidth; + const float charH = 1.5f / *frameBufferHeight; + + float fbW = (float)*frameBufferWidth; + float fbH = (float)*frameBufferHeight; + x = (x / fbW * 2.0f) - 1.0f; + y = (y / fbH * 2.0f) - 1.0f; + + // Calculate text width + float textWidth = 0; + uint32_t codepoint; + auto it = text.begin(); + while (it != text.end()) + { + if (!advanceUTF8(it, text.end(), codepoint)) + break; + // TODO: Get a UTF8 font. Consider changing to Dear ImGUI + // https://github.com/ocornut/imgui. + // Placeholder to avoid crashing. + if (codepoint > STB_NUM_CHARS + STB_FIRST_CHAR) + codepoint = STB_MISSING_GLPYH; + stb_fontchar *charData = &stbFontData[(uint32_t)codepoint - STB_FIRST_CHAR]; + textWidth += charData->advance * charW; + } + switch (align) + { + case alignRight: + x -= textWidth; + break; + case alignCenter: + x -= textWidth / 2.0f; + break; + case alignLeft: + break; + } + + // Generate a uv mapped quad per char in the new text + it = text.begin(); + while (it != text.end()) + { + if (!advanceUTF8(it, text.end(), codepoint)) + break; + if (codepoint > STB_NUM_CHARS + STB_FIRST_CHAR) + codepoint = STB_MISSING_GLPYH; + + stb_fontchar *charData = &stbFontData[(uint32_t)codepoint - STB_FIRST_CHAR]; + + mappedLocal->x = (x + (float)charData->x0 * charW); + mappedLocal->y = (y + (float)charData->y0 * charH); + mappedLocal->z = charData->s0; + mappedLocal->w = charData->t0; + mappedLocal++; + + mappedLocal->x = (x + (float)charData->x1 * charW); + mappedLocal->y = (y + (float)charData->y0 * charH); + mappedLocal->z = charData->s1; + mappedLocal->w = charData->t0; + mappedLocal++; + + mappedLocal->x = (x + (float)charData->x0 * charW); + mappedLocal->y = (y + (float)charData->y1 * charH); + mappedLocal->z = charData->s0; + mappedLocal->w = charData->t1; + mappedLocal++; + + mappedLocal->x = (x + (float)charData->x1 * charW); + mappedLocal->y = (y + (float)charData->y1 * charH); + mappedLocal->z = charData->s1; + mappedLocal->w = charData->t1; + mappedLocal++; + + x += charData->advance * charW; + + numLetters++; + + if (numLetters == MAX_CHAR_COUNT) + break; // Truncate the text. + } + } + // Unmap buffer and update command buffers + void endTextUpdate() + { + updateCommandBuffers(); + } + + // Needs to be called by the application + void updateCommandBuffers() + { + VkCommandBufferBeginInfo cmdBufInfo = vkTools::initializers::commandBufferBeginInfo(); + + VkRenderPassBeginInfo renderPassBeginInfo = vkTools::initializers::renderPassBeginInfo(); + renderPassBeginInfo.renderPass = renderPass; + renderPassBeginInfo.renderArea.extent.width = *frameBufferWidth; + renderPassBeginInfo.renderArea.extent.height = *frameBufferHeight; + renderPassBeginInfo.clearValueCount = 0; + renderPassBeginInfo.pClearValues = nullptr; + + for (uint32_t i = 0; i < cmdBuffers.size(); ++i) + { + renderPassBeginInfo.framebuffer = *frameBuffers[i]; + + VK_CHECK_RESULT(vkBeginCommandBuffer(cmdBuffers[i], &cmdBufInfo)); + + if (vkDebug::DebugMarker::active) + { + vkDebug::DebugMarker::beginRegion(cmdBuffers[i], "Text overlay", glm::vec4(1.0f, 0.94f, 0.3f, 1.0f)); + } + + vkCmdBeginRenderPass(cmdBuffers[i], &renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE); + + VkViewport viewport = vkTools::initializers::viewport((float)*frameBufferWidth, (float)*frameBufferHeight, 0.0f, 1.0f); + vkCmdSetViewport(cmdBuffers[i], 0, 1, &viewport); + + VkRect2D scissor = vkTools::initializers::rect2D(*frameBufferWidth, *frameBufferHeight, 0, 0); + vkCmdSetScissor(cmdBuffers[i], 0, 1, &scissor); + + vkCmdBindPipeline(cmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline); + vkCmdBindDescriptorSets(cmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout, 0, 1, &descriptorSet, 0, NULL); + + VkDeviceSize offsets = 0; + vkCmdBindVertexBuffers(cmdBuffers[i], 0, 1, &buffer, &offsets); + vkCmdBindVertexBuffers(cmdBuffers[i], 1, 1, &buffer, &offsets); + for (uint32_t j = 0; j < numLetters; j++) + { + vkCmdDraw(cmdBuffers[i], 4, 1, j * 4, 0); + } + + vkCmdEndRenderPass(cmdBuffers[i]); + + if (vkDebug::DebugMarker::active) + { + vkDebug::DebugMarker::endRegion(cmdBuffers[i]); + } + + VK_CHECK_RESULT(vkEndCommandBuffer(cmdBuffers[i])); + } + } + + // Submit the text command buffers to a queue + void submit(VkQueue targetQueue, uint32_t bufferindex, VkSubmitInfo submitInfo) + { + if (!visible) + { + return; + } + + submitInfo.pCommandBuffers = &cmdBuffers[bufferindex]; + submitInfo.commandBufferCount = 1; + + VK_CHECK_RESULT(vkQueueSubmit(targetQueue, 1, &submitInfo, VK_NULL_HANDLE)); + } + + void reallocateCommandBuffers() + { + vkFreeCommandBuffers(device, commandPool, static_cast(cmdBuffers.size()), cmdBuffers.data()); + + VkCommandBufferAllocateInfo cmdBufAllocateInfo = + vkTools::initializers::commandBufferAllocateInfo( + commandPool, + VK_COMMAND_BUFFER_LEVEL_PRIMARY, + static_cast(cmdBuffers.size())); + + VK_CHECK_RESULT(vkAllocateCommandBuffers(device, &cmdBufAllocateInfo, cmdBuffers.data())); + } + +}; + +// vi: set sw=2 ts=4 expandtab: diff --git a/third_party/ktx-src/tests/loadtests/appfwSDL/VulkanAppSDL/vulkantools.cpp b/third_party/ktx-src/tests/loadtests/appfwSDL/VulkanAppSDL/vulkantools.cpp new file mode 100644 index 0000000000000000000000000000000000000000..9941130cad3b86daec7bb3daa7e279b3c9e43c36 --- /dev/null +++ b/third_party/ktx-src/tests/loadtests/appfwSDL/VulkanAppSDL/vulkantools.cpp @@ -0,0 +1,918 @@ +/* +* Copyright 2016 Sascha Willems - www.saschawillems.de +* SPDX-License-Identifier: MIT +* +* Assorted commonly used Vulkan helper functions +* +* asserts on unhandled cases in setImageLayout added by Mark Callow, 2017.3.3. +*/ + +#if defined(_WIN32) + #define _CRT_SECURE_NO_WARNINGS // For fopen +#endif + +#include "vulkantools.h" +#include "unused.h" + +namespace vkTools +{ + + VkBool32 checkGlobalExtensionPresent(const char* extensionName) + { + uint32_t extensionCount = 0; + std::vector extensions; + vkEnumerateInstanceExtensionProperties(NULL, &extensionCount, NULL); + extensions.resize(extensionCount); + vkEnumerateInstanceExtensionProperties(NULL, &extensionCount, extensions.data()); + for (auto& ext : extensions) + { + if (!strcmp(extensionName, ext.extensionName)) + { + return true; + } + } + return false; + } + + VkBool32 checkDeviceExtensionPresent(VkPhysicalDevice physicalDevice, const char* extensionName) + { + uint32_t extensionCount = 0; + std::vector extensions; + vkEnumerateDeviceExtensionProperties(physicalDevice, NULL, &extensionCount, NULL); + extensions.resize(extensionCount); + vkEnumerateDeviceExtensionProperties(physicalDevice, NULL, &extensionCount, extensions.data()); + for (auto& ext : extensions) + { + if (!strcmp(extensionName, ext.extensionName)) + { + return true; + } + } + return false; + } + + std::string errorString(VkResult errorCode) + { + switch (errorCode) + { +#define STR(r) case VK_ ##r: return #r + STR(NOT_READY); + STR(TIMEOUT); + STR(EVENT_SET); + STR(EVENT_RESET); + STR(INCOMPLETE); + STR(ERROR_OUT_OF_HOST_MEMORY); + STR(ERROR_OUT_OF_DEVICE_MEMORY); + STR(ERROR_INITIALIZATION_FAILED); + STR(ERROR_DEVICE_LOST); + STR(ERROR_MEMORY_MAP_FAILED); + STR(ERROR_LAYER_NOT_PRESENT); + STR(ERROR_EXTENSION_NOT_PRESENT); + STR(ERROR_FEATURE_NOT_PRESENT); + STR(ERROR_INCOMPATIBLE_DRIVER); + STR(ERROR_TOO_MANY_OBJECTS); + STR(ERROR_FORMAT_NOT_SUPPORTED); + STR(ERROR_SURFACE_LOST_KHR); + STR(ERROR_NATIVE_WINDOW_IN_USE_KHR); + STR(SUBOPTIMAL_KHR); + STR(ERROR_OUT_OF_DATE_KHR); + STR(ERROR_INCOMPATIBLE_DISPLAY_KHR); + STR(ERROR_VALIDATION_FAILED_EXT); + STR(ERROR_INVALID_SHADER_NV); +#undef STR + default: + return "UNKNOWN_ERROR"; + } + } + + VkBool32 getSupportedDepthFormat(VkPhysicalDevice physicalDevice, VkFormat *depthFormat) + { + // Since all depth formats may be optional, we need to find a suitable depth format to use + // Start with the highest precision packed format + std::vector depthFormats = { + VK_FORMAT_D32_SFLOAT_S8_UINT, + VK_FORMAT_D32_SFLOAT, + VK_FORMAT_D24_UNORM_S8_UINT, + VK_FORMAT_D16_UNORM_S8_UINT, + VK_FORMAT_D16_UNORM + }; + + for (auto& format : depthFormats) + { + VkFormatProperties formatProps; + vkGetPhysicalDeviceFormatProperties(physicalDevice, format, &formatProps); + // Format must support depth stencil attachment for optimal tiling + if (formatProps.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) + { + *depthFormat = format; + return true; + } + } + + return false; + } + + // Create an image memory barrier for changing the layout of + // an image and put it into an active command buffer + // See chapter 11.4 "Image Layout" for details + + void setImageLayout( + VkCommandBuffer cmdbuffer, + VkImage image, + VkImageAspectFlags /*aspectMask*/, + VkImageLayout oldImageLayout, + VkImageLayout newImageLayout, + VkImageSubresourceRange subresourceRange) + { + // Create an image barrier object + VkImageMemoryBarrier imageMemoryBarrier = vkTools::initializers::imageMemoryBarrier(); + imageMemoryBarrier.oldLayout = oldImageLayout; + imageMemoryBarrier.newLayout = newImageLayout; + imageMemoryBarrier.image = image; + imageMemoryBarrier.subresourceRange = subresourceRange; + + // Source layouts (old) + // Source access mask controls actions that have to be finished on the old layout + // before it will be transitioned to the new layout + switch (oldImageLayout) + { + case VK_IMAGE_LAYOUT_UNDEFINED: + // Image layout is undefined (or does not matter) + // Only valid as initial layout + // No flags required, listed only for completeness + imageMemoryBarrier.srcAccessMask = 0; + break; + + case VK_IMAGE_LAYOUT_PREINITIALIZED: + // Image is preinitialized + // Only valid as initial layout for linear images, preserves memory contents + // Make sure host writes have been finished + imageMemoryBarrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT; + break; + + case VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL: + // Image is a color attachment + // Make sure any writes to the color buffer have been finished + imageMemoryBarrier.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; + break; + + case VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL: + // Image is a depth/stencil attachment + // Make sure any writes to the depth/stencil buffer have been finished + imageMemoryBarrier.srcAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT; + break; + + case VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL: + // Image is a transfer source + // Make sure any reads from the image have been finished + imageMemoryBarrier.srcAccessMask = VK_ACCESS_TRANSFER_READ_BIT; + break; + + case VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL: + // Image is a transfer destination + // Make sure any writes to the image have been finished + imageMemoryBarrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; + break; + + case VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL: + // Image is read by a shader + // Make sure any shader reads from the image have been finished + imageMemoryBarrier.srcAccessMask = VK_ACCESS_SHADER_READ_BIT; + break; + + default: + assert(0); // Attempt to use unhandled case. + } + + // Target layouts (new) + // Destination access mask controls the dependency for the new image layout + switch (newImageLayout) + { + case VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL: + // Image will be used as a transfer destination + // Make sure any writes to the image have been finished + imageMemoryBarrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; + break; + + case VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL: + // Image will be used as a transfer source + // Make sure any reads from and writes to the image have been finished + imageMemoryBarrier.srcAccessMask = imageMemoryBarrier.srcAccessMask | VK_ACCESS_TRANSFER_READ_BIT; + imageMemoryBarrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT; + break; + + case VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL: + // Image will be used as a color attachment + // Make sure any writes to the color buffer have been finished + imageMemoryBarrier.srcAccessMask = VK_ACCESS_TRANSFER_READ_BIT; + imageMemoryBarrier.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; + break; + + case VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL: + // Image layout will be used as a depth/stencil attachment + // Make sure any writes to depth/stencil buffer have been finished + imageMemoryBarrier.dstAccessMask = imageMemoryBarrier.dstAccessMask | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT; + break; + + case VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL: + // Image will be read in a shader (sampler, input attachment) + // Make sure any writes to the image have been finished + if (imageMemoryBarrier.srcAccessMask == 0) + { + imageMemoryBarrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT | VK_ACCESS_TRANSFER_WRITE_BIT; + } + imageMemoryBarrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT; + break; + + default: + assert(0); // Attempt to use unhandled case. + } + + // Put barrier on top + VkPipelineStageFlags srcStageFlags = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT; + VkPipelineStageFlags destStageFlags = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT; + + // Put barrier inside setup command buffer + vkCmdPipelineBarrier( + cmdbuffer, + srcStageFlags, + destStageFlags, + 0, + 0, nullptr, + 0, nullptr, + 1, &imageMemoryBarrier); + } + + // Fixed sub resource on first mip level and layer + void setImageLayout( + VkCommandBuffer cmdbuffer, + VkImage image, + VkImageAspectFlags aspectMask, + VkImageLayout oldImageLayout, + VkImageLayout newImageLayout) + { + VkImageSubresourceRange subresourceRange = {}; + subresourceRange.aspectMask = aspectMask; + subresourceRange.baseMipLevel = 0; + subresourceRange.levelCount = 1; + subresourceRange.layerCount = 1; + setImageLayout(cmdbuffer, image, aspectMask, oldImageLayout, newImageLayout, subresourceRange); + } + + void exitFatal(std::string message, std::string caption) + { + (void)SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, caption.c_str(), + message.c_str(), NULL); + std::cerr << message << "\n"; + exit(1); + } + + std::string readTextFile(const char *fileName) + { + std::string fileContent; + std::ifstream fileStream(fileName, std::ios::in); + if (!fileStream.is_open()) { + printf("File %s not found\n", fileName); + return ""; + } + std::string line = ""; + while (!fileStream.eof()) { + getline(fileStream, line); + fileContent.append(line + "\n"); + } + fileStream.close(); + return fileContent; + } + +#if defined(__ANDROID__) + // Android shaders are stored as assets in the apk + // So they need to be loaded via the asset manager + VkShaderModule loadShader(AAssetManager* assetManager, const char *fileName, VkDevice device, VkShaderStageFlagBits stage) + { + // Load shader from compressed asset + AAsset* asset = AAssetManager_open(assetManager, fileName, AASSET_MODE_STREAMING); + assert(asset); + size_t size = AAsset_getLength(asset); + assert(size > 0); + + char *shaderCode = new char[size]; + AAsset_read(asset, shaderCode, size); + AAsset_close(asset); + + VkShaderModule shaderModule; + VkShaderModuleCreateInfo moduleCreateInfo; + moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO; + moduleCreateInfo.pNext = NULL; + moduleCreateInfo.codeSize = size; + moduleCreateInfo.pCode = (uint32_t*)shaderCode; + moduleCreateInfo.flags = 0; + + VK_CHECK_RESULT(vkCreateShaderModule(device, &moduleCreateInfo, NULL, &shaderModule)); + + delete[] shaderCode; + + return shaderModule; + } +#else + VkShaderModule loadShader(const char *fileName, VkDevice device, VkShaderStageFlagBits /*stage*/) + { + size_t size; + + FILE *fp = fopen(fileName, "rb"); + assert(fp); + + fseek(fp, 0L, SEEK_END); + size = ftell(fp); + + fseek(fp, 0L, SEEK_SET); + + //shaderCode = malloc(size); + char *shaderCode = new char[size]; + U_ASSERT_ONLY size_t retval = fread(shaderCode, size, 1, fp); + assert(retval == 1); + (void)retval; // Supress VC++ unused variable warning for Release config. + assert(size > 0); + + fclose(fp); + + VkShaderModule shaderModule; + VkShaderModuleCreateInfo moduleCreateInfo; + moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO; + moduleCreateInfo.pNext = NULL; + moduleCreateInfo.codeSize = size; + moduleCreateInfo.pCode = (uint32_t*)shaderCode; + moduleCreateInfo.flags = 0; + + VK_CHECK_RESULT(vkCreateShaderModule(device, &moduleCreateInfo, NULL, &shaderModule)); + + delete[] shaderCode; + + return shaderModule; + } +#endif + + VkShaderModule loadShaderGLSL(const char *fileName, VkDevice device, VkShaderStageFlagBits stage) + { + std::string shaderSrc = readTextFile(fileName); + const char *shaderCode = shaderSrc.c_str(); + size_t size = strlen(shaderCode); + assert(size > 0); + + VkShaderModule shaderModule; + VkShaderModuleCreateInfo moduleCreateInfo; + moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO; + moduleCreateInfo.pNext = NULL; + moduleCreateInfo.codeSize = 3 * sizeof(uint32_t) + size + 1; + moduleCreateInfo.pCode = (uint32_t*)malloc(moduleCreateInfo.codeSize); + moduleCreateInfo.flags = 0; + + // Magic SPV number + ((uint32_t *)moduleCreateInfo.pCode)[0] = 0x07230203; + ((uint32_t *)moduleCreateInfo.pCode)[1] = 0; + ((uint32_t *)moduleCreateInfo.pCode)[2] = stage; + memcpy(((uint32_t *)moduleCreateInfo.pCode + 3), shaderCode, size + 1); + + VK_CHECK_RESULT(vkCreateShaderModule(device, &moduleCreateInfo, NULL, &shaderModule)); + + return shaderModule; + } + + VkImageMemoryBarrier prePresentBarrier(VkImage presentImage) + { + VkImageMemoryBarrier imageMemoryBarrier = vkTools::initializers::imageMemoryBarrier(); + imageMemoryBarrier.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; + imageMemoryBarrier.dstAccessMask = 0; + imageMemoryBarrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; + imageMemoryBarrier.newLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR; + imageMemoryBarrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; + imageMemoryBarrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; + imageMemoryBarrier.subresourceRange = { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 }; + imageMemoryBarrier.image = presentImage; + return imageMemoryBarrier; + } + + VkImageMemoryBarrier postPresentBarrier(VkImage presentImage) + { + VkImageMemoryBarrier imageMemoryBarrier = vkTools::initializers::imageMemoryBarrier(); + imageMemoryBarrier.srcAccessMask = 0; + imageMemoryBarrier.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; + imageMemoryBarrier.oldLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR; + imageMemoryBarrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; + imageMemoryBarrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; + imageMemoryBarrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; + imageMemoryBarrier.subresourceRange = { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 }; + imageMemoryBarrier.image = presentImage; + return imageMemoryBarrier; + } + + void destroyUniformData(VkDevice device, vkTools::UniformData *uniformData) + { + if (uniformData->mapped != nullptr) + { + vkUnmapMemory(device, uniformData->memory); + } + vkDestroyBuffer(device, uniformData->buffer, nullptr); + vkFreeMemory(device, uniformData->memory, nullptr); + } +} + +VkMemoryAllocateInfo vkTools::initializers::memoryAllocateInfo() +{ + VkMemoryAllocateInfo memAllocInfo = {}; + memAllocInfo.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO; + memAllocInfo.pNext = NULL; + memAllocInfo.allocationSize = 0; + memAllocInfo.memoryTypeIndex = 0; + return memAllocInfo; +} + +VkCommandBufferAllocateInfo vkTools::initializers::commandBufferAllocateInfo(VkCommandPool commandPool, VkCommandBufferLevel level, uint32_t bufferCount) +{ + VkCommandBufferAllocateInfo commandBufferAllocateInfo = {}; + commandBufferAllocateInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO; + commandBufferAllocateInfo.commandPool = commandPool; + commandBufferAllocateInfo.level = level; + commandBufferAllocateInfo.commandBufferCount = bufferCount; + return commandBufferAllocateInfo; +} + +VkCommandPoolCreateInfo vkTools::initializers::commandPoolCreateInfo() +{ + VkCommandPoolCreateInfo cmdPoolCreateInfo = {}; + cmdPoolCreateInfo.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO; + return cmdPoolCreateInfo; +} + +VkCommandBufferBeginInfo vkTools::initializers::commandBufferBeginInfo() +{ + VkCommandBufferBeginInfo cmdBufferBeginInfo = {}; + cmdBufferBeginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; + cmdBufferBeginInfo.pNext = NULL; + return cmdBufferBeginInfo; +} + +VkCommandBufferInheritanceInfo vkTools::initializers::commandBufferInheritanceInfo() +{ + VkCommandBufferInheritanceInfo cmdBufferInheritanceInfo = {}; + cmdBufferInheritanceInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO; + return cmdBufferInheritanceInfo; +} + +VkRenderPassBeginInfo vkTools::initializers::renderPassBeginInfo() +{ + VkRenderPassBeginInfo renderPassBeginInfo = {}; + renderPassBeginInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO; + renderPassBeginInfo.pNext = NULL; + return renderPassBeginInfo; +} + +VkRenderPassCreateInfo vkTools::initializers::renderPassCreateInfo() +{ + VkRenderPassCreateInfo renderPassCreateInfo = {}; + renderPassCreateInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO; + renderPassCreateInfo.pNext = NULL; + return renderPassCreateInfo; +} + +VkImageMemoryBarrier vkTools::initializers::imageMemoryBarrier() +{ + VkImageMemoryBarrier imageMemoryBarrier = {}; + imageMemoryBarrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER; + imageMemoryBarrier.pNext = NULL; + // Some default values + imageMemoryBarrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; + imageMemoryBarrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; + return imageMemoryBarrier; +} + +VkBufferMemoryBarrier vkTools::initializers::bufferMemoryBarrier() +{ + VkBufferMemoryBarrier bufferMemoryBarrier = {}; + bufferMemoryBarrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER; + bufferMemoryBarrier.pNext = NULL; + return bufferMemoryBarrier; +} + +VkMemoryBarrier vkTools::initializers::memoryBarrier() +{ + VkMemoryBarrier memoryBarrier = {}; + memoryBarrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER; + memoryBarrier.pNext = NULL; + return memoryBarrier; +} + +VkImageCreateInfo vkTools::initializers::imageCreateInfo() +{ + VkImageCreateInfo imageCreateInfo = {}; + imageCreateInfo.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO; + imageCreateInfo.pNext = NULL; + return imageCreateInfo; +} + +VkSamplerCreateInfo vkTools::initializers::samplerCreateInfo() +{ + VkSamplerCreateInfo samplerCreateInfo = {}; + samplerCreateInfo.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO; + samplerCreateInfo.pNext = NULL; + return samplerCreateInfo; +} + +VkImageViewCreateInfo vkTools::initializers::imageViewCreateInfo() +{ + VkImageViewCreateInfo imageViewCreateInfo = {}; + imageViewCreateInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO; + imageViewCreateInfo.pNext = NULL; + return imageViewCreateInfo; +} + +VkFramebufferCreateInfo vkTools::initializers::framebufferCreateInfo() +{ + VkFramebufferCreateInfo framebufferCreateInfo = {}; + framebufferCreateInfo.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO; + framebufferCreateInfo.pNext = NULL; + return framebufferCreateInfo; +} + +VkSemaphoreCreateInfo vkTools::initializers::semaphoreCreateInfo() +{ + VkSemaphoreCreateInfo semaphoreCreateInfo = {}; + semaphoreCreateInfo.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO; + semaphoreCreateInfo.pNext = NULL; + semaphoreCreateInfo.flags = 0; + return semaphoreCreateInfo; +} + +VkFenceCreateInfo vkTools::initializers::fenceCreateInfo(VkFenceCreateFlags flags) +{ + VkFenceCreateInfo fenceCreateInfo = {}; + fenceCreateInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO; + fenceCreateInfo.flags = flags; + return fenceCreateInfo; +} + +VkEventCreateInfo vkTools::initializers::eventCreateInfo() +{ + VkEventCreateInfo eventCreateInfo = {}; + eventCreateInfo.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO; + return eventCreateInfo; +} + +VkSubmitInfo vkTools::initializers::submitInfo() +{ + VkSubmitInfo submitInfo = {}; + submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; + submitInfo.pNext = NULL; + return submitInfo; +} + +VkViewport vkTools::initializers::viewport( + float width, + float height, + float minDepth, + float maxDepth) +{ + VkViewport viewport = {}; + viewport.width = width; + viewport.height = height; + viewport.minDepth = minDepth; + viewport.maxDepth = maxDepth; + return viewport; +} + +VkRect2D vkTools::initializers::rect2D( + int32_t width, + int32_t height, + int32_t offsetX, + int32_t offsetY) +{ + VkRect2D rect2D = {}; + rect2D.extent.width = width; + rect2D.extent.height = height; + rect2D.offset.x = offsetX; + rect2D.offset.y = offsetY; + return rect2D; +} + +VkBufferCreateInfo vkTools::initializers::bufferCreateInfo() +{ + VkBufferCreateInfo bufCreateInfo = {}; + bufCreateInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO; + return bufCreateInfo; +} + +VkBufferCreateInfo vkTools::initializers::bufferCreateInfo( + VkBufferUsageFlags usage, + VkDeviceSize size) +{ + VkBufferCreateInfo bufCreateInfo = {}; + bufCreateInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO; + bufCreateInfo.pNext = NULL; + bufCreateInfo.usage = usage; + bufCreateInfo.size = size; + bufCreateInfo.flags = 0; + return bufCreateInfo; +} + +VkDescriptorPoolCreateInfo vkTools::initializers::descriptorPoolCreateInfo( + uint32_t poolSizeCount, + VkDescriptorPoolSize* pPoolSizes, + uint32_t maxSets) +{ + VkDescriptorPoolCreateInfo descriptorPoolInfo = {}; + descriptorPoolInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO; + descriptorPoolInfo.pNext = NULL; + descriptorPoolInfo.poolSizeCount = poolSizeCount; + descriptorPoolInfo.pPoolSizes = pPoolSizes; + descriptorPoolInfo.maxSets = maxSets; + return descriptorPoolInfo; +} + +VkDescriptorPoolSize vkTools::initializers::descriptorPoolSize( + VkDescriptorType type, + uint32_t descriptorCount) +{ + VkDescriptorPoolSize descriptorPoolSize = {}; + descriptorPoolSize.type = type; + descriptorPoolSize.descriptorCount = descriptorCount; + return descriptorPoolSize; +} + +VkDescriptorSetLayoutBinding vkTools::initializers::descriptorSetLayoutBinding( + VkDescriptorType type, + VkShaderStageFlags stageFlags, + uint32_t binding) +{ + VkDescriptorSetLayoutBinding setLayoutBinding = {}; + setLayoutBinding.descriptorType = type; + setLayoutBinding.stageFlags = stageFlags; + setLayoutBinding.binding = binding; + // Default value in all examples + setLayoutBinding.descriptorCount = 1; + return setLayoutBinding; +} + +VkDescriptorSetLayoutCreateInfo vkTools::initializers::descriptorSetLayoutCreateInfo( + const VkDescriptorSetLayoutBinding* pBindings, + uint32_t bindingCount) +{ + VkDescriptorSetLayoutCreateInfo descriptorSetLayoutCreateInfo = {}; + descriptorSetLayoutCreateInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO; + descriptorSetLayoutCreateInfo.pNext = NULL; + descriptorSetLayoutCreateInfo.pBindings = pBindings; + descriptorSetLayoutCreateInfo.bindingCount = bindingCount; + return descriptorSetLayoutCreateInfo; +} + +VkPipelineLayoutCreateInfo vkTools::initializers::pipelineLayoutCreateInfo( + const VkDescriptorSetLayout* pSetLayouts, + uint32_t setLayoutCount) +{ + VkPipelineLayoutCreateInfo pipelineLayoutCreateInfo = {}; + pipelineLayoutCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO; + pipelineLayoutCreateInfo.pNext = NULL; + pipelineLayoutCreateInfo.setLayoutCount = setLayoutCount; + pipelineLayoutCreateInfo.pSetLayouts = pSetLayouts; + return pipelineLayoutCreateInfo; +} + +VkDescriptorSetAllocateInfo vkTools::initializers::descriptorSetAllocateInfo( + VkDescriptorPool descriptorPool, + const VkDescriptorSetLayout* pSetLayouts, + uint32_t descriptorSetCount) +{ + VkDescriptorSetAllocateInfo descriptorSetAllocateInfo = {}; + descriptorSetAllocateInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO; + descriptorSetAllocateInfo.pNext = NULL; + descriptorSetAllocateInfo.descriptorPool = descriptorPool; + descriptorSetAllocateInfo.pSetLayouts = pSetLayouts; + descriptorSetAllocateInfo.descriptorSetCount = descriptorSetCount; + return descriptorSetAllocateInfo; +} + +VkDescriptorImageInfo vkTools::initializers::descriptorImageInfo(VkSampler sampler, VkImageView imageView, VkImageLayout imageLayout) +{ + VkDescriptorImageInfo descriptorImageInfo = {}; + descriptorImageInfo.sampler = sampler; + descriptorImageInfo.imageView = imageView; + descriptorImageInfo.imageLayout = imageLayout; + return descriptorImageInfo; +} + +VkWriteDescriptorSet vkTools::initializers::writeDescriptorSet( + VkDescriptorSet dstSet, + VkDescriptorType type, + uint32_t binding, + VkDescriptorBufferInfo* bufferInfo) +{ + VkWriteDescriptorSet writeDescriptorSet = {}; + writeDescriptorSet.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; + writeDescriptorSet.pNext = NULL; + writeDescriptorSet.dstSet = dstSet; + writeDescriptorSet.descriptorType = type; + writeDescriptorSet.dstBinding = binding; + writeDescriptorSet.pBufferInfo = bufferInfo; + // Default value in all examples + writeDescriptorSet.descriptorCount = 1; + return writeDescriptorSet; +} + +VkWriteDescriptorSet vkTools::initializers::writeDescriptorSet( + VkDescriptorSet dstSet, + VkDescriptorType type, + uint32_t binding, + VkDescriptorImageInfo * imageInfo) +{ + VkWriteDescriptorSet writeDescriptorSet = {}; + writeDescriptorSet.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; + writeDescriptorSet.pNext = NULL; + writeDescriptorSet.dstSet = dstSet; + writeDescriptorSet.descriptorType = type; + writeDescriptorSet.dstBinding = binding; + writeDescriptorSet.pImageInfo = imageInfo; + // Default value in all examples + writeDescriptorSet.descriptorCount = 1; + return writeDescriptorSet; +} + +VkVertexInputBindingDescription vkTools::initializers::vertexInputBindingDescription( + uint32_t binding, + uint32_t stride, + VkVertexInputRate inputRate) +{ + VkVertexInputBindingDescription vInputBindDescription = {}; + vInputBindDescription.binding = binding; + vInputBindDescription.stride = stride; + vInputBindDescription.inputRate = inputRate; + return vInputBindDescription; +} + +VkVertexInputAttributeDescription vkTools::initializers::vertexInputAttributeDescription( + uint32_t binding, + uint32_t location, + VkFormat format, + uint32_t offset) +{ + VkVertexInputAttributeDescription vInputAttribDescription = {}; + vInputAttribDescription.location = location; + vInputAttribDescription.binding = binding; + vInputAttribDescription.format = format; + vInputAttribDescription.offset = offset; + return vInputAttribDescription; +} + +VkPipelineVertexInputStateCreateInfo vkTools::initializers::pipelineVertexInputStateCreateInfo() +{ + VkPipelineVertexInputStateCreateInfo pipelineVertexInputStateCreateInfo = {}; + pipelineVertexInputStateCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO; + pipelineVertexInputStateCreateInfo.pNext = NULL; + return pipelineVertexInputStateCreateInfo; +} + +VkPipelineInputAssemblyStateCreateInfo vkTools::initializers::pipelineInputAssemblyStateCreateInfo( + VkPrimitiveTopology topology, + VkPipelineInputAssemblyStateCreateFlags flags, + VkBool32 primitiveRestartEnable) +{ + VkPipelineInputAssemblyStateCreateInfo pipelineInputAssemblyStateCreateInfo = {}; + pipelineInputAssemblyStateCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO; + pipelineInputAssemblyStateCreateInfo.topology = topology; + pipelineInputAssemblyStateCreateInfo.flags = flags; + pipelineInputAssemblyStateCreateInfo.primitiveRestartEnable = primitiveRestartEnable; + return pipelineInputAssemblyStateCreateInfo; +} + +VkPipelineRasterizationStateCreateInfo vkTools::initializers::pipelineRasterizationStateCreateInfo( + VkPolygonMode polygonMode, + VkCullModeFlags cullMode, + VkFrontFace frontFace, + VkPipelineRasterizationStateCreateFlags flags) +{ + VkPipelineRasterizationStateCreateInfo pipelineRasterizationStateCreateInfo = {}; + pipelineRasterizationStateCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO; + pipelineRasterizationStateCreateInfo.polygonMode = polygonMode; + pipelineRasterizationStateCreateInfo.cullMode = cullMode; + pipelineRasterizationStateCreateInfo.frontFace = frontFace; + pipelineRasterizationStateCreateInfo.flags = flags; + pipelineRasterizationStateCreateInfo.depthClampEnable = VK_TRUE; + pipelineRasterizationStateCreateInfo.lineWidth = 1.0f; + return pipelineRasterizationStateCreateInfo; +} + +VkPipelineColorBlendAttachmentState vkTools::initializers::pipelineColorBlendAttachmentState( + VkColorComponentFlags colorWriteMask, + VkBool32 blendEnable) +{ + VkPipelineColorBlendAttachmentState pipelineColorBlendAttachmentState = {}; + pipelineColorBlendAttachmentState.colorWriteMask = colorWriteMask; + pipelineColorBlendAttachmentState.blendEnable = blendEnable; + return pipelineColorBlendAttachmentState; +} + +VkPipelineColorBlendStateCreateInfo vkTools::initializers::pipelineColorBlendStateCreateInfo( + uint32_t attachmentCount, + const VkPipelineColorBlendAttachmentState * pAttachments) +{ + VkPipelineColorBlendStateCreateInfo pipelineColorBlendStateCreateInfo = {}; + pipelineColorBlendStateCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO; + pipelineColorBlendStateCreateInfo.pNext = NULL; + pipelineColorBlendStateCreateInfo.attachmentCount = attachmentCount; + pipelineColorBlendStateCreateInfo.pAttachments = pAttachments; + return pipelineColorBlendStateCreateInfo; +} + +VkPipelineDepthStencilStateCreateInfo vkTools::initializers::pipelineDepthStencilStateCreateInfo( + VkBool32 depthTestEnable, + VkBool32 depthWriteEnable, + VkCompareOp depthCompareOp) +{ + VkPipelineDepthStencilStateCreateInfo pipelineDepthStencilStateCreateInfo = {}; + pipelineDepthStencilStateCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO; + pipelineDepthStencilStateCreateInfo.depthTestEnable = depthTestEnable; + pipelineDepthStencilStateCreateInfo.depthWriteEnable = depthWriteEnable; + pipelineDepthStencilStateCreateInfo.depthCompareOp = depthCompareOp; + pipelineDepthStencilStateCreateInfo.front = pipelineDepthStencilStateCreateInfo.back; + pipelineDepthStencilStateCreateInfo.back.compareOp = VK_COMPARE_OP_ALWAYS; + return pipelineDepthStencilStateCreateInfo; +} + +VkPipelineViewportStateCreateInfo vkTools::initializers::pipelineViewportStateCreateInfo( + uint32_t viewportCount, + uint32_t scissorCount, + VkPipelineViewportStateCreateFlags flags) +{ + VkPipelineViewportStateCreateInfo pipelineViewportStateCreateInfo = {}; + pipelineViewportStateCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO; + pipelineViewportStateCreateInfo.viewportCount = viewportCount; + pipelineViewportStateCreateInfo.scissorCount = scissorCount; + pipelineViewportStateCreateInfo.flags = flags; + return pipelineViewportStateCreateInfo; +} + +VkPipelineMultisampleStateCreateInfo vkTools::initializers::pipelineMultisampleStateCreateInfo( + VkSampleCountFlagBits rasterizationSamples, + VkPipelineMultisampleStateCreateFlags flags) +{ + VkPipelineMultisampleStateCreateInfo pipelineMultisampleStateCreateInfo = {}; + pipelineMultisampleStateCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO; + pipelineMultisampleStateCreateInfo.rasterizationSamples = rasterizationSamples; + pipelineMultisampleStateCreateInfo.flags = flags; + return pipelineMultisampleStateCreateInfo; +} + +VkPipelineDynamicStateCreateInfo vkTools::initializers::pipelineDynamicStateCreateInfo( + const VkDynamicState * pDynamicStates, + uint32_t dynamicStateCount, + VkPipelineDynamicStateCreateFlags flags) +{ + VkPipelineDynamicStateCreateInfo pipelineDynamicStateCreateInfo = {}; + pipelineDynamicStateCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO; + pipelineDynamicStateCreateInfo.pDynamicStates = pDynamicStates; + pipelineDynamicStateCreateInfo.dynamicStateCount = dynamicStateCount; + pipelineDynamicStateCreateInfo.flags = flags; + return pipelineDynamicStateCreateInfo; +} + +VkPipelineTessellationStateCreateInfo vkTools::initializers::pipelineTessellationStateCreateInfo(uint32_t patchControlPoints) +{ + VkPipelineTessellationStateCreateInfo pipelineTessellationStateCreateInfo = {}; + pipelineTessellationStateCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO; + pipelineTessellationStateCreateInfo.patchControlPoints = patchControlPoints; + return pipelineTessellationStateCreateInfo; +} + +VkGraphicsPipelineCreateInfo vkTools::initializers::pipelineCreateInfo( + VkPipelineLayout layout, + VkRenderPass renderPass, + VkPipelineCreateFlags flags) +{ + VkGraphicsPipelineCreateInfo pipelineCreateInfo = {}; + pipelineCreateInfo.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO; + pipelineCreateInfo.pNext = NULL; + pipelineCreateInfo.layout = layout; + pipelineCreateInfo.renderPass = renderPass; + pipelineCreateInfo.flags = flags; + return pipelineCreateInfo; +} + +VkComputePipelineCreateInfo vkTools::initializers::computePipelineCreateInfo(VkPipelineLayout layout, VkPipelineCreateFlags flags) +{ + VkComputePipelineCreateInfo computePipelineCreateInfo = {}; + computePipelineCreateInfo.sType = VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO; + computePipelineCreateInfo.layout = layout; + computePipelineCreateInfo.flags = flags; + return computePipelineCreateInfo; +} + +VkPushConstantRange vkTools::initializers::pushConstantRange( + VkShaderStageFlags stageFlags, + uint32_t size, + uint32_t offset) +{ + VkPushConstantRange pushConstantRange = {}; + pushConstantRange.stageFlags = stageFlags; + pushConstantRange.offset = offset; + pushConstantRange.size = size; + return pushConstantRange; +} + +// vi: set sw=2 ts=4 expandtab: diff --git a/third_party/ktx-src/tests/loadtests/appfwSDL/VulkanAppSDL/vulkantools.h b/third_party/ktx-src/tests/loadtests/appfwSDL/VulkanAppSDL/vulkantools.h new file mode 100644 index 0000000000000000000000000000000000000000..aa792badc74c793b4320dea545ca767a15685e8d --- /dev/null +++ b/third_party/ktx-src/tests/loadtests/appfwSDL/VulkanAppSDL/vulkantools.h @@ -0,0 +1,312 @@ +/* +* Copyright 2016 Sascha Willems - www.saschawillems.de +* SPDX-License-Identifier: MIT +* +* Assorted commonly used Vulkan helper functions +*/ + +#pragma once + +#include "vulkan/vulkan.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#if defined(_WIN32) +#include +#include +#include +#elif defined(__ANDROID__) +#include "vulkanandroid.h" +#include +#endif + +#include + +// Custom define for better code readability +#define VK_FLAGS_NONE 0 +// Default fence timeout in nanoseconds +#define DEFAULT_FENCE_TIMEOUT 100000000000 + +#if 0 +// Macro to check and display Vulkan return results +#define VK_CHECK_RESULT(f) \ +{ \ + VkResult res = (f); \ + if (res != VK_SUCCESS) \ + { \ + std::cout << "Fatal : VkResult is \"" << vkTools::errorString(res) << "\" in " << __FILE__ << " at line " << __LINE__ << std::endl; \ + assert(res == VK_SUCCESS); \ + } \ +} +#endif +#if defined(DEBUG) +#include +extern const char* appName(); +#define VK_CHECK_RESULT(f) \ +{ \ + VkResult res = (f); \ + if (res != VK_SUCCESS) \ + { \ + std::stringstream msg; \ + msg << "Fatal error. VkResult is \"" \ + << vkTools::errorString(res) << "\" in " << __FILE__ \ + << " at line " << __LINE__ << std::endl; \ + SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, \ + appName(), \ + msg.str().c_str(), \ + NULL); \ + assert(res == VK_SUCCESS); \ + } \ +} +#else +#define VK_CHECK_RESULT(f) (void)f +#endif + + +namespace vkTools +{ + // Check if extension is globally available + VkBool32 checkGlobalExtensionPresent(const char* extensionName); + // Check if extension is present on the given device + VkBool32 checkDeviceExtensionPresent(VkPhysicalDevice physicalDevice, const char* extensionName); + // Return string representation of a vulkan error string + std::string errorString(VkResult errorCode); + + // Selected a suitable supported depth format starting with 32 bit down to 16 bit + // Returns false if none of the depth formats in the list is supported by the device + VkBool32 getSupportedDepthFormat(VkPhysicalDevice physicalDevice, VkFormat *depthFormat); + + // Put an image memory barrier for setting an image layout on the sub resource into the given command buffer + void setImageLayout( + VkCommandBuffer cmdbuffer, + VkImage image, + VkImageAspectFlags aspectMask, + VkImageLayout oldImageLayout, + VkImageLayout newImageLayout, + VkImageSubresourceRange subresourceRange); + // Uses a fixed sub resource layout with first mip level and layer + void setImageLayout( + VkCommandBuffer cmdbuffer, + VkImage image, + VkImageAspectFlags aspectMask, + VkImageLayout oldImageLayout, + VkImageLayout newImageLayout); + + // Display error message and exit on fatal error + void exitFatal(std::string message, std::string caption); + // Load a text file (e.g. GLGL shader) into a std::string + std::string readTextFile(const char *fileName); + // Load a binary file into a buffer (e.g. SPIR-V) + char *readBinaryFile(const char *filename, size_t *psize); + + // Load a SPIR-V shader +#if defined(__ANDROID__) + VkShaderModule loadShader(AAssetManager* assetManager, const char *fileName, VkDevice device, VkShaderStageFlagBits stage); +#else + VkShaderModule loadShader(const char *fileName, VkDevice device, VkShaderStageFlagBits stage); +#endif + + // Load a GLSL shader + // Note : Only for testing purposes, support for directly feeding GLSL shaders into Vulkan + // may be dropped at some point + VkShaderModule loadShaderGLSL(const char *fileName, VkDevice device, VkShaderStageFlagBits stage); + + // Returns a pre-present image memory barrier + // Transforms the image's layout from color attachment to present khr + VkImageMemoryBarrier prePresentBarrier(VkImage presentImage); + + // Returns a post-present image memory barrier + // Transforms the image's layout back from present khr to color attachment + VkImageMemoryBarrier postPresentBarrier(VkImage presentImage); + + // Contains all vulkan objects + // required for a uniform data object + struct UniformData + { + VkBuffer buffer; + VkDeviceMemory memory; + VkDescriptorBufferInfo descriptor; + uint32_t allocSize; + void* mapped = nullptr; + }; + + // Destroy (and free) Vulkan resources used by a uniform data structure + void destroyUniformData(VkDevice device, vkTools::UniformData *uniformData); + + // Contains often used vulkan object initializers + // Save lot of VK_STRUCTURE_TYPE assignments + // Some initializers are parameterized for convenience + namespace initializers + { + VkMemoryAllocateInfo memoryAllocateInfo(); + + VkCommandBufferAllocateInfo commandBufferAllocateInfo( + VkCommandPool commandPool, + VkCommandBufferLevel level, + uint32_t bufferCount); + + VkCommandPoolCreateInfo commandPoolCreateInfo(); + VkCommandBufferBeginInfo commandBufferBeginInfo(); + VkCommandBufferInheritanceInfo commandBufferInheritanceInfo(); + + VkRenderPassBeginInfo renderPassBeginInfo(); + VkRenderPassCreateInfo renderPassCreateInfo(); + + VkImageMemoryBarrier imageMemoryBarrier(); + VkBufferMemoryBarrier bufferMemoryBarrier(); + VkMemoryBarrier memoryBarrier(); + + VkImageCreateInfo imageCreateInfo(); + VkSamplerCreateInfo samplerCreateInfo(); + VkImageViewCreateInfo imageViewCreateInfo(); + + VkFramebufferCreateInfo framebufferCreateInfo(); + + VkSemaphoreCreateInfo semaphoreCreateInfo(); + VkFenceCreateInfo fenceCreateInfo(VkFenceCreateFlags flags); + VkEventCreateInfo eventCreateInfo(); + + VkSubmitInfo submitInfo(); + + VkViewport viewport( + float width, + float height, + float minDepth, + float maxDepth); + + VkRect2D rect2D( + int32_t width, + int32_t height, + int32_t offsetX, + int32_t offsetY); + + VkBufferCreateInfo bufferCreateInfo(); + + VkBufferCreateInfo bufferCreateInfo( + VkBufferUsageFlags usage, + VkDeviceSize size); + + VkDescriptorPoolCreateInfo descriptorPoolCreateInfo( + uint32_t poolSizeCount, + VkDescriptorPoolSize* pPoolSizes, + uint32_t maxSets); + + VkDescriptorPoolSize descriptorPoolSize( + VkDescriptorType type, + uint32_t descriptorCount); + + VkDescriptorSetLayoutBinding descriptorSetLayoutBinding( + VkDescriptorType type, + VkShaderStageFlags stageFlags, + uint32_t binding); + + VkDescriptorSetLayoutCreateInfo descriptorSetLayoutCreateInfo( + const VkDescriptorSetLayoutBinding* pBindings, + uint32_t bindingCount); + + VkPipelineLayoutCreateInfo pipelineLayoutCreateInfo( + const VkDescriptorSetLayout* pSetLayouts, + uint32_t setLayoutCount ); + + VkDescriptorSetAllocateInfo descriptorSetAllocateInfo( + VkDescriptorPool descriptorPool, + const VkDescriptorSetLayout* pSetLayouts, + uint32_t descriptorSetCount); + + VkDescriptorImageInfo descriptorImageInfo( + VkSampler sampler, + VkImageView imageView, + VkImageLayout imageLayout); + + VkWriteDescriptorSet writeDescriptorSet( + VkDescriptorSet dstSet, + VkDescriptorType type, + uint32_t binding, + VkDescriptorBufferInfo* bufferInfo); + + VkWriteDescriptorSet writeDescriptorSet( + VkDescriptorSet dstSet, + VkDescriptorType type, + uint32_t binding, + VkDescriptorImageInfo* imageInfo); + + VkVertexInputBindingDescription vertexInputBindingDescription( + uint32_t binding, + uint32_t stride, + VkVertexInputRate inputRate); + + VkVertexInputAttributeDescription vertexInputAttributeDescription( + uint32_t binding, + uint32_t location, + VkFormat format, + uint32_t offset); + + VkPipelineVertexInputStateCreateInfo pipelineVertexInputStateCreateInfo(); + + VkPipelineInputAssemblyStateCreateInfo pipelineInputAssemblyStateCreateInfo( + VkPrimitiveTopology topology, + VkPipelineInputAssemblyStateCreateFlags flags, + VkBool32 primitiveRestartEnable); + + VkPipelineRasterizationStateCreateInfo pipelineRasterizationStateCreateInfo( + VkPolygonMode polygonMode, + VkCullModeFlags cullMode, + VkFrontFace frontFace, + VkPipelineRasterizationStateCreateFlags flags); + + VkPipelineColorBlendAttachmentState pipelineColorBlendAttachmentState( + VkColorComponentFlags colorWriteMask, + VkBool32 blendEnable); + + VkPipelineColorBlendStateCreateInfo pipelineColorBlendStateCreateInfo( + uint32_t attachmentCount, + const VkPipelineColorBlendAttachmentState* pAttachments); + + VkPipelineDepthStencilStateCreateInfo pipelineDepthStencilStateCreateInfo( + VkBool32 depthTestEnable, + VkBool32 depthWriteEnable, + VkCompareOp depthCompareOp); + + VkPipelineViewportStateCreateInfo pipelineViewportStateCreateInfo( + uint32_t viewportCount, + uint32_t scissorCount, + VkPipelineViewportStateCreateFlags flags); + + VkPipelineMultisampleStateCreateInfo pipelineMultisampleStateCreateInfo( + VkSampleCountFlagBits rasterizationSamples, + VkPipelineMultisampleStateCreateFlags flags); + + VkPipelineDynamicStateCreateInfo pipelineDynamicStateCreateInfo( + const VkDynamicState *pDynamicStates, + uint32_t dynamicStateCount, + VkPipelineDynamicStateCreateFlags flags); + + VkPipelineTessellationStateCreateInfo pipelineTessellationStateCreateInfo( + uint32_t patchControlPoints); + + VkGraphicsPipelineCreateInfo pipelineCreateInfo( + VkPipelineLayout layout, + VkRenderPass renderPass, + VkPipelineCreateFlags flags); + + VkComputePipelineCreateInfo computePipelineCreateInfo( + VkPipelineLayout layout, + VkPipelineCreateFlags flags); + + VkPushConstantRange pushConstantRange( + VkShaderStageFlags stageFlags, + uint32_t size, + uint32_t offset); + } + +} + +// vi: set sw=2 ts=4 expandtab: diff --git a/third_party/ktx-src/tests/loadtests/appfwSDL/main.cpp b/third_party/ktx-src/tests/loadtests/appfwSDL/main.cpp new file mode 100644 index 0000000000000000000000000000000000000000..7d1b498315a4cbf6ee6237ec11f4f1978f5cf62a --- /dev/null +++ b/third_party/ktx-src/tests/loadtests/appfwSDL/main.cpp @@ -0,0 +1,96 @@ +/* -*- tab-width: 4; -*- */ +/* vi: set sw=2 ts=4 expandtab: */ + +/* $Id: f63e0a9e6eed51ed84a8eea1eff0708c8a6af22b $ */ + +/* + * Copyright 2015-2020 Mark Callow. + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @internal + * @file + * @~English + * + * @brief main() function for SDL app framework. + */ + +#include +#include +#include +#include "AppBaseSDL.h" +#include +#include "platform_utils.h" +#if defined(EMSCRIPTEN) +#include +#endif + +#define SDL_GESTURE_IMPLEMENTATION 1 +#include "SDL_gesture.h" + +#if defined(SDL_PLATFORM_IOS) + #define NEED_MAIN_LOOP 0 + //int SDL_iPhoneSetAnimationCallback( + // SDL_Window * window, int interval, + // void (*callback)(void*), void *callbackParam + // ); + #define setAnimationCallback(win, cb, userdata) \ + SDL_SetiOSAnimationCallback(win, 1, cb, userdata) +#elif defined(EMSCRIPTEN) + #define NEED_MAIN_LOOP 0 + //void emscripten_set_main_loop_arg(em_arg_callback_func func, void *arg, + // int fps, int simulate_infinite_loop); + #define setAnimationCallback(win, cb, userdata) \ + emscripten_set_main_loop_arg(cb, userdata, 0, 0) +#else + #define NEED_MAIN_LOOP 1 + #define setAnimationCallback(win, cb, userdata) +#endif + +static void +quit() { + Gesture_Quit(); + SDL_Quit(); +} + +int +main(int argc, char* argv[]) +{ + if (!SDL_Init(SDL_INIT_VIDEO | SDL_INIT_EVENTS)) { + fprintf(stderr, "%s: SDL video initialization failed: %s\n", + theApp->name(), SDL_GetError()); + return 1; + } + Gesture_Init(); + atexit(quit); + + InitUTF8CLI(argc, argv); + AppBaseSDL::Args args(argv, argv+argc); + + if (!theApp->initialize(args)) + return 1; + + // Catches events before they are added to the event queue. + // May need this for some events that need rapid response... + // SDL_SetEventFilter(theApp->onEvent, theApp); + // Triggered when event added to queue. + SDL_AddEventWatch(theApp->onEvent, theApp); + if (!NEED_MAIN_LOOP) { + // TODO: Fix this main to work for multiple windows. One way is to have the + // application call setAnimationCallback and keep a list of the windows in + // this file, calling drawFrame for each window. + setAnimationCallback(theApp->getMainWindow(), theApp->onDrawFrame, theApp); + // iOS version of SDL will not exit when main completes. + // The Emscripten version of the app must be compiled with + // -s NO_EXIT_RUNTIME=1 to prevent Emscripten exiting when main completes. + return 0; + } else { + for (;;) { + SDL_PumpEvents(); + theApp->drawFrame(); + // XXX Let app return a sleeptime from drawFrame()? If so + // sleep(sleeptime); + } + } +} diff --git a/third_party/ktx-src/tests/loadtests/common/LoadTestSample.cpp b/third_party/ktx-src/tests/loadtests/common/LoadTestSample.cpp new file mode 100644 index 0000000000000000000000000000000000000000..59dfd285cd734f0ffb30b863e3759f94baa4ec5f --- /dev/null +++ b/third_party/ktx-src/tests/loadtests/common/LoadTestSample.cpp @@ -0,0 +1,330 @@ +/* -*- tab-width: 4; -*- */ +/* vi: set sw=2 ts=4 expandtab: */ + +/* + * Copyright 2017-2020 Mark Callow. + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @internal + * @class LoadTestSample + * @~English + * + * @brief Definition of a base class for texture loading test samples. + * + * @author Mark Callow, github.com/MarkCallow. + */ + +#if defined(_WIN32) + #define _USE_MATH_DEFINES +#endif +#include "LoadTestSample.h" +#define GLM_ENABLE_EXPERIMENTAL +#include +#include + +#if !defined(LOADTESTSAMPLE_LOG_GESTURE_DETECTION) + // Log detected and completed gestures. + #define LOADTESTSAMPLE_LOG_GESTURE_DETECTION 0 +#endif +#if !defined(LOADTESTSAMPLE_LOG_GESTURE_EVENTS) + // Log events contributing to gesture detection and gestures. + #define LOADTESTSAMPLE_LOG_GESTURE_EVENTS 0 +#endif +#if !defined(LOADTESTSAMPLE_LOG_MOUSE_UP_DOWN_EVENTS) + #define LOADTESTSAMPLE_LOG_MOUSE_UP_DOWN_EVENTS 0 +#endif +#if !defined(LOADTESTSAMPLE_LOG_MOUSE_MOTION_EVENTS) + #define LOADTESTSAMPLE_LOG_MOUSE_MOTION_EVENTS 0 +#endif + +#if LOADTESTSAMPLE_LOG_GESTURE_EVENTS + #include + + const std::string printFingerIds(SDL_Finger* fingers[], uint32_t numFingers) { + std::stringstream msg; + assert(numFingers > 0); + msg << std::hex << std::showbase; + msg << "finger id" << (numFingers > 1 ? "s" : "") << ": "; + for (uint32_t f = 0; f < numFingers; f++) { + if (f > 0) { + if (f == numFingers - 1) + msg << " & "; + else + msg << ", "; + } + msg << fingers[f]->id; + } + return msg.str(); + } + + const std::string printVector(const std::string& name, glm::vec2 v) { + std::stringstream msg; + msg << name << " (" << v.x << ", " << v.y << ")"; + return msg.str(); + } +#endif + +[[maybe_unused]] static const char* +buttonName(Uint8 button) { + switch(button) { + case SDL_BUTTON_LEFT: return "left"; + case SDL_BUTTON_MIDDLE: return "middle"; + case SDL_BUTTON_RIGHT: return "right"; + default: return "other"; + } +} + +int +LoadTestSample::doEvent(SDL_Event* event) +{ + switch (event->type) { + case SDL_EVENT_MOUSE_MOTION: + { + SDL_MouseMotionEvent& motion = event->motion; +#if LOADTESTSAMPLE_LOG_MOUSE_MOTION_EVENTS + SDL_Log("LTS: MOUSE_MOTION - x: %f, y: %f", motion.x, motion.y); +#endif + // On macOS with trackpad, SDL_TOUCH_MOUSEID is never set. + // Prefer mouse events on macOS because press is required. When + // finger motion events are used the object starts to rotate when + // you drag the cursor over the window. Not nice. + if (mouseButtons.left) + { + rotation.x -= yflip * (mousePos.y - (float)motion.y) * 1.25f; + rotation.y -= (mousePos.x - (float)motion.x) * 1.25f; + viewChanged(); + } + if (mouseButtons.right) + { + zoom += (mousePos.y - (float)motion.y) * .005f; + viewChanged(); + } + if (mouseButtons.middle) + { + cameraPos.x -= (mousePos.x - (float)motion.x) * 0.01f; + cameraPos.y += yflip * (mousePos.y - (float)motion.y) * 0.01f; + viewChanged(); + } + mousePos = glm::vec2((float)motion.x, (float)motion.y); + return 0; + } + case SDL_EVENT_MOUSE_BUTTON_DOWN: + mousePos = glm::vec2((float)event->button.x, (float)event->button.y); + if (LOADTESTSAMPLE_LOG_MOUSE_UP_DOWN_EVENTS) { + SDL_Log("LTS: MOUSE_DOWN - button: %s, x: %f, y: %f", buttonName(event->button.button), + event->button.x, event->button.y); + } + switch (event->button.button) { + case SDL_BUTTON_LEFT: + mouseButtons.left = true; + break; + case SDL_BUTTON_MIDDLE: + mouseButtons.middle = true; + break; + case SDL_BUTTON_RIGHT: + mouseButtons.right = true; + break; + default: + return 1; + } + return 0; + case SDL_EVENT_MOUSE_BUTTON_UP: + if (LOADTESTSAMPLE_LOG_MOUSE_UP_DOWN_EVENTS) { + SDL_Log("LTS: MOUSE_UP - button: %s, x: %f, y: %f", buttonName(event->button.button), + event->button.x, event->button.y); + } + switch (event->button.button) { + case SDL_BUTTON_LEFT: + mouseButtons.left = false; + break; + case SDL_BUTTON_MIDDLE: + mouseButtons.middle = false; + break; + case SDL_BUTTON_RIGHT: + mouseButtons.right = false; + break; + default: + return 1; + } + return 0; + case SDL_EVENT_FINGER_DOWN: { + // Prevent multifingers from triggering the left button action and + // interfering with multigestures. + // + // On iOS you get a left button down event no matter how many fingers + // you touch to the screen. We want 1 finger mouse to work so + // behaviour is same as pressing the trackpad on macOS, etc. As iOS + // button_down events come before finger_down we can clear the left + // button down state, if we have multiple fingers. Hope this ordering + // is the same on other touch screen platforms that send a left-button + // event regardless of the number of fingers. + // + // On macOS button_down events come after finger_down so this code has + // no effect. + // + // Another way to handle this is to identify the platform and work + // differently for each platform. + int numFingers; + SDL_Finger** fingers = SDL_GetTouchFingers(event->tfinger.touchID, &numFingers); + int retVal = 0; +#if LOADTESTSAMPLE_LOG_GESTURE_EVENTS + SDL_Log("LTS: Finger: %#" SDL_PRIx64 " down - fingers: %i, %s, x: %f, y: %f", + event->tfinger.fingerID, numFingers, + printFingerIds(fingers, numFingers).c_str(), + event->tfinger.x, event->tfinger.y); +#endif + if (numFingers > 1) { + mouseButtons.left = false; + if (LOADTESTSAMPLE_LOG_GESTURE_EVENTS) { + SDL_Log("LTS: FINGER_DOWN with multiple fingers received." + " Resetting mouseButtons.left."); + } + if (numFingers == 2) { + firstFingerId = fingers[0]->id; + // Calc. difference vector between fingers. + glm::vec2 vDifference; + vDifference.x = fingers[1]->x - fingers[0]->x; + vDifference.y = fingers[1]->y - fingers[0]->y; + distanceStart = glm::length(vDifference); + distanceLast = distanceStart; + // Need normalized vectors for glm::orientedAngle + nvDifferenceStart = glm::normalize(vDifference); + nvDifferenceLast = nvDifferenceStart; + processingGesture = true; +#if LOADTESTSAMPLE_LOG_GESTURE_EVENTS + // Angle of vector to X axis. + xAngleStart = atan2f(vDifference.y, vDifference.x); + SDL_Log("LTS: FINGER_DOWN, start values: %s, Distance = %f, XAngle = %f°", + printVector("Difference", vDifference).c_str(), + distanceStart, xAngleStart * 180.0 / M_PI + ); +#endif + retVal = 1; + } + } + + // It is possible to somehow get out of the window without seeing + // FINGER_UP so as a safeguard stop any previous gesture. + zooming = rotating = false; + SDL_free(fingers); + return retVal; + } + case SDL_EVENT_FINGER_UP: { + int numFingers; + SDL_Finger** fingers = SDL_GetTouchFingers(event->tfinger.touchID, &numFingers); +#if LOADTESTSAMPLE_LOG_GESTURE_EVENTS + SDL_Log("LTS: Finger: %#" SDL_PRIx64 " up - fingers: %i, %s, x: %f, y: %f", + event->tfinger.fingerID, numFingers, + printFingerIds(fingers, numFingers).c_str(), + event->tfinger.x, event->tfinger.y); +#endif + if (processingGesture && numFingers == 2) { + // There may still be one finger down. Even so the action is completed. + if (LOADTESTSAMPLE_LOG_GESTURE_DETECTION) { + SDL_Log("-------------- LTS: %s complete. -----------------", + zooming ? "zooming" : rotating ? "rotating" : "gesture"); + } + zooming = rotating = processingGesture = false; + } + SDL_free(fingers); + break; + } + case SDL_EVENT_FINGER_MOTION: { + int numFingers; + SDL_Finger** fingers = SDL_GetTouchFingers(event->tfinger.touchID, &numFingers); + if (numFingers != 2) + return 1; + if (!processingGesture) { + // Protect against FINGER_MOTION without FINGER_DOWN. This can + // happen when the sample is switched by a swipe and the new sample + // receives the tail end of the swipe motion. + return 1; + } + // With two fingers down, events come in pairs. No point in processing + // both. + if (event->tfinger.fingerID == firstFingerId) { + return 0; + } + + glm::vec2 vDifference; // Difference vector between the fingers. + vDifference.x = fingers[1]->x - fingers[0]->x; + vDifference.y = fingers[1]->y - fingers[0]->y; + float distance = glm::length(vDifference); + // Normalized vectors required by glm::orientedAngle + glm::vec2 nvDifference = glm::normalize(vDifference); + // Angle between start and current difference vectors + float sAngle = glm::orientedAngle(nvDifferenceStart, nvDifference); + // Angle between current and previous difference vectors + float dAngle = glm::orientedAngle(nvDifferenceLast, nvDifference); + // Difference in distance since last motion event. + float dDist = distance - distanceLast; + // Difference in distance since start. + float dDistStart = distance - distanceStart; +#if LOADTESTSAMPLE_LOG_GESTURE_EVENTS + if (!(rotating || zooming)) { + // Angle from X axis to vDifference vector + float xAngle = atan2f(vDifference.y, vDifference.x); + SDL_Log("LTS FINGER_MOTION: Not zooming or rotating. " + " timestamp = %" SDL_PRIu64 ", %s, %s", + event->tfinger.timestamp, + printFingerIds(fingers, numFingers).c_str(), + printVector("Difference", vDifference).c_str()); + SDL_Log("... distanceLast = %f, distance = %f, dDist = %f, dDistStart = %f, xAngle = %f°, sAngle = %f°, dAngle = %f°", + distanceLast, distance, dDist, dDistStart, + xAngle * 180.0 / M_PI, sAngle * 180.0 / M_PI, dAngle * 180.0 / M_PI); + } +#endif + nvDifferenceLast = nvDifference; + distanceLast = distance; + + // This is all heuristics derived from use. + if (zooming) { + zoom += dDist * 10.0f; + if (LOADTESTSAMPLE_LOG_GESTURE_EVENTS) { + SDL_Log("LTS MG: Zooming. zoom = %f", zoom); + } + } else if (!rotating) { + if (fabs(dDistStart) >= 0.1 && fabs(dAngle) < 0.5 * M_PI / 180.0) { + zooming = true; + zoom += dDist * 10.0f; + if (LOADTESTSAMPLE_LOG_GESTURE_DETECTION) { + SDL_Log("---------------- LTS MG: pinch/zoom detected ---------------\n" + " dAngle = %f°, dDistStart = %f, dDist = %f, zoom = %f", + dAngle * 180.0 / M_PI, dDistStart, dDist, zoom); + } + } + } + if (rotating) { + rotation.z += + static_cast(dAngle * 180.0 / M_PI); + if (LOADTESTSAMPLE_LOG_GESTURE_EVENTS) { + SDL_Log("LTS MG: Rotating around Z. rotation.z = %f°", rotation.z); + } + } else if (!zooming) { + if (fabs(sAngle) > 15 * M_PI / 180.0 && fabs(dDistStart) < 0.1) { + rotating = true; + rotation.z += static_cast(dAngle * 180.0 / M_PI); + if (LOADTESTSAMPLE_LOG_GESTURE_DETECTION) { + SDL_Log("---------------- LTS MG: rotation detected ---------------\n" + " sAngle = %f°, dAngle = %f°, dDistStart = %f, rotation.z = %f°", + sAngle * 180 / M_PI, dAngle * 180.0 / M_PI, dDistStart, rotation.z); + } + } + } + viewChanged(); + SDL_free(fingers); + return 0; + } + case SDL_EVENT_KEY_UP: + if (event->key.key == 'q') + quit = true; + keyPressed(event->key.key); + return 0; + default: + break; + } + return 1; +} + diff --git a/third_party/ktx-src/tests/loadtests/common/LoadTestSample.h b/third_party/ktx-src/tests/loadtests/common/LoadTestSample.h new file mode 100644 index 0000000000000000000000000000000000000000..8ea50b88144f7841a3b43b0c520bedb90efe35fe --- /dev/null +++ b/third_party/ktx-src/tests/loadtests/common/LoadTestSample.h @@ -0,0 +1,91 @@ +/* -*- tab-width: 4; -*- */ +/* vi: set sw=2 ts=4 expandtab: */ + +/* + * Copyright 2017-2020 Mark Callow, . + * SPDX-License-Identifier: Apache-2.0 + */ + +#ifndef _LOAD_TEST_SAMPLE_H +#define _LOAD_TEST_SAMPLE_H + +#include +#include +#define GLM_FORCE_RADIANS +#include "disable_glm_warnings.h" +#include +#include "reenable_warnings.h" + +#define ARRAY_LEN(a) (sizeof(a) / sizeof(a[0])) + +class LoadTestSample { + public: + typedef uint64_t ticks_t; + LoadTestSample(uint32_t width, uint32_t height, + const std::string sBasePath, + int32_t yflip = 1) + : w_width(width), w_height(height), yflip(yflip), + sBasePath(sBasePath) + { + } + + virtual ~LoadTestSample() { }; + virtual int doEvent(SDL_Event* event); + virtual void resize(uint32_t width, uint32_t height) = 0; + virtual void run(uint32_t msTicks) = 0; + + //virtual void getOverlayText(TextOverlay *textOverlay) { }; + + typedef LoadTestSample* (*PFN_create)(uint32_t width, uint32_t height, + const char* const szArgs, + const std::string sBasePath); + + protected: + virtual void keyPressed(uint32_t /*keyCode*/) { } + virtual void viewChanged() { } + + const std::string getAssetPath() { return sBasePath; } + + glm::vec3 rotation; + glm::vec3 cameraPos; + glm::vec2 mousePos; + glm::vec2 nvDifferenceStart; // Normalized difference between fingers at start of gesture. + float distanceStart = 0.0; // Distance between fingers at start of gesture. + float xAngleStart = 0.0; // Angle between x-axis and nvDifferenceStart. Unused unless event logging is enabled. + glm::vec2 nvDifferenceLast; // Normalized difference between fingers at last motion event. + float distanceLast = 0.0; // Distance between fingers at last motion event. + Uint64 firstFingerId = 0; + bool processingGesture = false; + + struct { + bool left = false; + bool right = false; + bool middle = false; + } mouseButtons; + bool quit = false; + bool rotating = false; + bool zooming = false; + bool paused = false; + + float zoom = 0; + + uint32_t w_width; + uint32_t w_height; + + // Defines a frame rate independent timer value clamped from -1.0...1.0 + // For use in animations, rotations, etc. + float timer = 0.0f; + // Multiplier for speeding up (or slowing down) the global timer + float timerSpeed = 0.25f; + + // Use to adjust mouse rotation speed + float rotationSpeed = 1.0f; + // Use to adjust mouse zoom speed + float zoomSpeed = 1.0f; + // multiplier to decide if Y increases down or up + int32_t yflip; + + const std::string sBasePath; +}; + +#endif /* _LOAD_TEST_SAMPLE_H */ diff --git a/third_party/ktx-src/tests/loadtests/common/SwipeDetector.cpp b/third_party/ktx-src/tests/loadtests/common/SwipeDetector.cpp new file mode 100644 index 0000000000000000000000000000000000000000..d5ade8045d33152176c0d5851ca881b4c17da807 --- /dev/null +++ b/third_party/ktx-src/tests/loadtests/common/SwipeDetector.cpp @@ -0,0 +1,146 @@ +/* -*- tab-width: 4; -*- */ +/* vi: set sw=2 ts=4 expandtab: */ + +/* + * Copyright 2017-2020 Mark Callow. + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @internal + * @class SwipeDetector + * @~English + * + * @brief Definition of a class for detecting swipes. + * + * @author Mark Callow, github.com/MarkCallow. + */ + +#include +#include "SwipeDetector.h" +#include + +#if !defined(SWIPEDETECTOR_LOG_GESTURE_EVENTS) + #define SWIPEDETECTOR_LOG_GESTURE_EVENTS 0 +#endif +#if !defined(SWIPEDETECTOR_LOG_GESTURE_DETECTION) + #define SWIPEDETECTOR_LOG_GESTURE_DETECTION 0 +#endif + +bool +SwipeDetector::doEvent(SDL_Event* event) +{ + bool result = false; + + switch (event->type) { + case SDL_EVENT_FINGER_UP: { + int numFingers; + SDL_Finger** fingers = SDL_GetTouchFingers(event->tfinger.touchID, &numFingers); + if (SWIPEDETECTOR_LOG_GESTURE_EVENTS) { + SDL_Log("SD: Finger: %" SDL_PRIx64 " UP - fingers: %i, x: %f, y: %f", + event->tfinger.fingerID, numFingers, event->tfinger.x, event->tfinger.y); + } + // SDL_GetTouchFingers appears to return the number of fingers + // down *before* the event was generated, so 1 means the last finger + // just lifted. + if (numFingers == 1 && gestureStart.time != 0) { + gestureStart.time = 0; + gestureSwipe = false; + if (SWIPEDETECTOR_LOG_GESTURE_DETECTION) { + SDL_Log("***************** SD: FINGER_UP, %smultigesture done *****************", + gestureSwipe ? "Swipe complete & " : ""); + } + } else { + result = true; + } + SDL_free(fingers); + break; + } + case GESTURE_MULTIGESTURE: { + Gesture_MultiGestureEvent& mgesture = *(Gesture_MultiGestureEvent *)event; + if (SWIPEDETECTOR_LOG_GESTURE_EVENTS) { + SDL_Log("SD: MG Event: x = %f, y = %f, dAng = %f (%f), dR = %f, numFingers = %i, time = %" SDL_PRIu64, + mgesture.x, + mgesture.y, + mgesture.dTheta * 180.0 / M_PI, + mgesture.dTheta, + mgesture.dDist, + mgesture.numFingers, + mgesture.timestamp); + } + if (SWIPEDETECTOR_LOG_GESTURE_DETECTION) { + SDL_Log("SD: mgestureSwipe = %i, time = %" SDL_PRIu64, + gestureSwipe, + (mgesture.timestamp - gestureStart.time) / 1000000); + } + if (gestureStart.time == 0) { + if (SWIPEDETECTOR_LOG_GESTURE_DETECTION) { + SDL_Log("************ SD: Multigesture detection start **************"); + } + gestureStart.time = mgesture.timestamp; + gestureStart.point.x = mgesture.x; + gestureStart.point.y = mgesture.y; + lastVector.reset(); + gestureSwipe = false; + } else { + if (!gestureSwipe) { + vector sv; // Vector from start point to current position + float velocity; + float theta; // Angle between current vector and previous vector. + float duration; + sv.w = mgesture.x - gestureStart.point.x; + sv.h = mgesture.y - gestureStart.point.y; + float distance = sv.length(); + if (lastVector.has_value()) { + // SDL2 timestamps were in milliseconds, SDL3 are nanoseconds. Given the + // normalized distances reported, using nanoseconds leads to 0 velocitySq. + duration = static_cast( + (mgesture.timestamp - gestureStart.time) / 1000000.0); + + velocity = distance / duration; + assert(!std::isinf(velocity)); + theta = static_cast(lastVector->getAngle(sv)); + if (SWIPEDETECTOR_LOG_GESTURE_DETECTION) { + SDL_Log("SD: Detection: distance = %f, velocity = %f, theta = %f, sv angle = %f, sv angle normalized = %f, lastv angle = %f", + distance, velocity, theta, + sv.getAngle(), + sv.getAngleNormalized(), + lastVector->getAngle()); + } + lastVector = sv; + // Multiple events with the same timestamp is a possibility + // hence the isinf() check. + if (std::abs(theta) < 3.0 && std::abs(mgesture.dDist) > 0.01 && !std::isinf(velocity) && velocity > 0.0007) { + if (SWIPEDETECTOR_LOG_GESTURE_DETECTION) + SDL_Log("----------------- SD: Swipe %s detected -----------------", + toString(sv.getDirection()).c_str()); + gestureSwipe = true; + if (SDL_EventEnabled(SDL_EVENT_USER)) { + SDL_Event user_event; + // SDL will copy this entire struct! Initialize to keep memory + // checkers happy. + SDL_zero(user_event); + user_event.type = SDL_EVENT_USER; + user_event.user.code = swipeGesture; + user_event.user.data1 = SwipeDetector::directionToPointer(sv.getDirection()); + user_event.user.data2 = NULL; + SDL_PushEvent(&user_event); + } + } else { + if (SWIPEDETECTOR_LOG_GESTURE_DETECTION) SDL_Log("SD: No swipe detected."); + result = true; + } + } else { + lastVector = sv; + result = true; + } + } + } + break; + } + default: + result = true; + } + + return result; +} diff --git a/third_party/ktx-src/tests/loadtests/common/SwipeDetector.h b/third_party/ktx-src/tests/loadtests/common/SwipeDetector.h new file mode 100644 index 0000000000000000000000000000000000000000..21e1252b6a1eacd6dc7a5f3a834e2d4bd58572c9 --- /dev/null +++ b/third_party/ktx-src/tests/loadtests/common/SwipeDetector.h @@ -0,0 +1,200 @@ +/* -*- tab-width: 4; -*- */ +/* vi: set sw=2 ts=4 expandtab: */ + +/* + * Copyright 2017-2020 Mark Callow, . + * SPDX-License-Identifier: Apache-2.0 + */ + +#ifndef _SWIPE_DETECTOR_H +#define _SWIPE_DETECTOR_H +#if defined(_WIN32) + #define _USE_MATH_DEFINES +#endif +#include +#include +#include +#include +#include "SDL_gesture.h" + +class SwipeDetector { + public: + enum class Direction { up, down, left, right }; + + SwipeDetector() : gestureSwipe(false) {} + bool doEvent(SDL_Event* event); + +#if defined(_MSC_VER) && !defined(__clang__) + // Not clangcl + #pragma warning(push) + #pragma warning(disable : 4311) + #pragma warning(disable : 4302) + #pragma warning(disable : 4312) +#endif +#if defined(__clang__) + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wvoid-pointer-to-int-cast" +#endif + // These conversions allow storing a Direction in a pointer. + // Ugly. Horrible. But preferable to allocating and freeing memory + // when passing the information in user events. + static inline Direction pointerToDirection(void* p) { + return static_cast(reinterpret_cast(p)); + } + + // Only preserves the low 32-bits of the pointer; perfect for this use. + static inline void* directionToPointer(SwipeDetector::Direction d) { + return reinterpret_cast(static_cast(d)); + } +#if defined(_MSC_VER) && !defined(__clang__) + #pragma warning(pop) +#endif +#if defined(__clang__) + #pragma clang diagnostic pop +#endif + + static const Uint32 swipeGesture = 0x01; + + class vector { + public: + float w; + float h; + + vector() : w(0.0), h(0.0) { } + vector(float _w, float _h) : w(_w), h(_h) { } + /** + * @~English + * @internal + * @brief Find the angle between the vector and the X-axis + * + * Positive angles increase counter-clockwise from the X-axis + * which has +x to the right. + * + * @return the angle between the vector and the x axis in degrees. + */ + double getAngle() { + double rad = atan2(h, w); + return rad * 180/M_PI; + } + + /** + * @~English + * @internal + * @brief Find the angle between this vector and another. + * + * Positive angles increase counter-clockwise. + * + * @return the angle between the 2 vectors in degrees. + */ + double getAngle(const vector& v2) { + // Reputed to be more accurate but in our use so far both approaches give same answer. + //double rad = atan2f(v2.h, v2.w) - SDL_atan2(h, w); + double rad = atan2f(w * v2.h - h * v2.w, w * v2.w + h * v2.h); + return rad * 180/M_PI; + } + + /** + * @~English + * @internal + * @brief Find the angle between the vector and the X-axis + * + * Positive angles increase counter-clockwise from the X-axis + * which has +x to the right. Value is normalized to the range 0 to 360. + * + * @return the angle between the vector and the x axis in degrees. + */ + double getAngleNormalized() { + double rad = atan2(h, w) + M_PI; + return fmod(rad*180/M_PI + 180, 360); + } + + /** + * @~English + * @internal + * @brief Return the length of the vector. + * + * @return the length of the vector. + */ + float length() { return sqrt(w * w + h * h); } + + /** + * @~English + * @internal + * @brief Return the direction of the vector. + * + * @return the direction + */ + Direction getDirection() { + double angle = getAngleNormalized(); + return getDirection(angle); + } + + /** + * @~English + * @internal + * @brief Return a direction given an angle. + * + * Directions are defined as follows: + * + * Up: [45, 135] + * Right: [0,45] and [315, 360] + * Down: [225, 315] + * Left: [135, 225] + * + * @param angle an angle from 0 to 360° + * @return the direction of an angle + */ + static Direction getDirection(double angle){ + if (inRange(angle, 45, 135)) { + return Direction::down; + } else if (inRange(angle, 0, 45) || inRange(angle, 315, 360)) { + return Direction::right; + } else if (inRange(angle, 225, 315)) { + return Direction::up; + } else { + return Direction::left; + } + } + + protected: + /** + * @~English + * @internal + * @brief Check if angle falls within an interval. + * + * @param angle an angle + * @param init the initial bound + * @param end the final bound + * + * @return true if the given angle is in the interval [init, end), false + * otherwise. + */ + static bool inRange(double angle, float init, float end){ + return (angle >= init) && (angle < end); + } + }; + + protected: + struct gestureStart { + Uint64 time; + SDL_FPoint point; + gestureStart() { time = 0; point.x = point.y = 0.0; } + } gestureStart; + std::optional lastVector; + bool gestureSwipe; +}; + +[[nodiscard]] inline std::string toString(SwipeDetector::Direction dir) { + switch (dir) { + case SwipeDetector::Direction::up: return "up"; + case SwipeDetector::Direction::down: return "down"; + case SwipeDetector::Direction::left: return "left"; + case SwipeDetector::Direction::right: return "right"; + // This is to hide a warning from MSVC. According to the solution given + // in https://developercommunity.visualstudio.com/t/Visual-Studio-warning-on-Strongly-typed-/96302 + // it is possible to construct an enum class with any value. Thus warning. + default: return "unknown"; + } +} + +#endif /* _SWIPE_DETECTOR_H */ diff --git a/third_party/ktx-src/tests/loadtests/common/TranscodeTargetStrToFmt.cpp b/third_party/ktx-src/tests/loadtests/common/TranscodeTargetStrToFmt.cpp new file mode 100644 index 0000000000000000000000000000000000000000..52b8eef176efad9b49e68709b35945bfb7322f08 --- /dev/null +++ b/third_party/ktx-src/tests/loadtests/common/TranscodeTargetStrToFmt.cpp @@ -0,0 +1,61 @@ +/* -*- tab-width: 4; -*- */ +/* vi: set sw=2 ts=4 expandtab: */ + +/* + * Copyright 2017-2020 Mark Callow, . + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include +#include "TranscodeTargetStrToFmt.h" + +ktx_transcode_fmt_e +TranscodeTargetStrToFmt(std::string format) +{ + if (!format.compare("ETC1_RGB")) + return KTX_TTF_ETC1_RGB; + else if (!format.compare("ETC2_RGBA")) + return KTX_TTF_ETC2_RGBA; + else if (!format.compare("BC1_RGB")) + return KTX_TTF_BC1_RGB; + else if (!format.compare("BC3_RGBA")) + return KTX_TTF_BC3_RGBA; + else if (!format.compare("BC4_R")) + return KTX_TTF_BC4_R; + else if (!format.compare("BC5_RG")) + return KTX_TTF_BC5_RG; + else if (!format.compare("BC7_M6_RGB")) + return KTX_TTF_BC7_M6_RGB; + else if (!format.compare("BC7_M5_RGBA")) + return KTX_TTF_BC7_M5_RGBA; + else if (!format.compare("PVRTC1_4_RGB")) + return KTX_TTF_PVRTC1_4_RGB; + else if (!format.compare("PVRTC1_4_RGBA")) + return KTX_TTF_PVRTC1_4_RGBA; + else if (!format.compare("ASTC_4x4_RGBA")) + return KTX_TTF_ASTC_4x4_RGBA; + else if (!format.compare("PVRTC2_4_RGB")) + return KTX_TTF_PVRTC2_4_RGB; + else if (!format.compare("PVRTC2_4_RGBA")) + return KTX_TTF_PVRTC2_4_RGBA; + else if (!format.compare("ETC2_EAC_R11")) + return KTX_TTF_ETC2_EAC_R11; + else if (!format.compare("ETC2_EAC_RG11")) + return KTX_TTF_ETC2_EAC_RG11; + else if (!format.compare("RGBA32")) + return KTX_TTF_RGBA32; + else if (!format.compare("RGB565")) + return KTX_TTF_RGB565; + else if (!format.compare("BGR565")) + return KTX_TTF_BGR565; + else if (!format.compare("RGBA4444")) + return KTX_TTF_RGBA4444; + else if (!format.compare("ETC")) + return KTX_TTF_ETC; + else if (!format.compare("BC1_OR_3")) + return KTX_TTF_BC1_OR_3; + assert(false); // Error in args in sample table. + return static_cast(-1); // To keep compilers happy. +} + diff --git a/third_party/ktx-src/tests/loadtests/common/TranscodeTargetStrToFmt.h b/third_party/ktx-src/tests/loadtests/common/TranscodeTargetStrToFmt.h new file mode 100644 index 0000000000000000000000000000000000000000..24cf13ca812cffe6e7b4593f7a6cde407898c3e8 --- /dev/null +++ b/third_party/ktx-src/tests/loadtests/common/TranscodeTargetStrToFmt.h @@ -0,0 +1,16 @@ +/* -*- tab-width: 4; -*- */ +/* vi: set sw=2 ts=4 expandtab: */ + +/* + * Copyright 2017-2020 Mark Callow, . + * SPDX-License-Identifier: Apache-2.0 + */ + +#ifndef _TRANSCODE_TARGET_STR_TO_FMT_ +#define _TRANSCODE_TARGET_STR_TO_FMT_ + +#include + +ktx_transcode_fmt_e TranscodeTargetStrToFmt(std::string format); + +#endif /* _TRANSCODE_TARGET_STR_TO_FMT_ */ diff --git a/third_party/ktx-src/tests/loadtests/common/disable_glm_warnings.h b/third_party/ktx-src/tests/loadtests/common/disable_glm_warnings.h new file mode 100644 index 0000000000000000000000000000000000000000..f25894fa23aca642384f61314b3def8a6a287616 --- /dev/null +++ b/third_party/ktx-src/tests/loadtests/common/disable_glm_warnings.h @@ -0,0 +1,21 @@ +/* -*- tab-width: 4; -*- */ +/* vi: set sw=2 ts=4 expandtab: */ + +/* + * Copyright 2021 Mark Callow. + * SPDX-License-Identifier: Apache-2.0 + */ + +#if !defined DISABLE_GLM_WARNINGS_H + +// Temporarily disable the warnings caused by the GLM code. +#if defined(_MSC_VER) + #pragma warning(push) + #pragma warning(disable: 4201) +#elif defined(__clang__) + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wgnu-anonymous-struct" + #pragma clang diagnostic ignored "-Wnested-anon-types" +#endif + +#endif /* DISABLE_GLM_WARNINGS_H */ diff --git a/third_party/ktx-src/tests/loadtests/common/ltexceptions.h b/third_party/ktx-src/tests/loadtests/common/ltexceptions.h new file mode 100644 index 0000000000000000000000000000000000000000..42f12c2b09a15993ad69fdfe05df60b96b4a9489 --- /dev/null +++ b/third_party/ktx-src/tests/loadtests/common/ltexceptions.h @@ -0,0 +1,66 @@ +/* -*- tab-width: 4; -*- */ +/* vi: set sw=2 ts=4 expandtab: */ + +/* + * Copyright 2018-2020 Mark Callow, . + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @internal + * @file + * @~English + * + * @brief Custom exceptions for the load tests. + */ + +#include +#include + +#define OUT_OF_HOST_MEMORY -1 +#define OUT_OF_DEVICE_MEMORY -2 +#define FRAGMENTED_POOL -12 +#define OUT_OF_POOL_MEMORY -1000069000 + +class bad_vulkan_alloc : public std::bad_alloc { + public: + bad_vulkan_alloc(int which, const char* _message) : std::bad_alloc() { + if (which == FRAGMENTED_POOL) { + message << "Pool fragmented when allocating for " << _message << "."; + } else { + std::string memtype; + switch (which) { + case OUT_OF_HOST_MEMORY: memtype = "host"; break; + case OUT_OF_DEVICE_MEMORY: memtype = "device"; break; + case OUT_OF_POOL_MEMORY: memtype = "pool"; break; + default: break; + } + message << "Out of " << memtype << " memory for " << _message << "."; + } + _what = message.str(); + } + bad_vulkan_alloc(const bad_vulkan_alloc& in) + : std::bad_alloc() + , message{in.message.str()} + , _what{in._what} + {} + virtual const char* what() const throw() { + return _what.c_str(); + } + protected: + std::stringstream message; + std::string _what; +}; + +class unsupported_ttype : public std::runtime_error { + public: + unsupported_ttype() + : std::runtime_error("Implementation does not support needed operations on image format") { } + unsupported_ttype(std::string& message) : std::runtime_error(message) { } +}; + +class unsupported_ctype : public std::runtime_error { + public: + unsupported_ctype() + : std::runtime_error("Unsupported compression format") { } +}; diff --git a/third_party/ktx-src/tests/loadtests/common/models/cube.obj b/third_party/ktx-src/tests/loadtests/common/models/cube.obj new file mode 100644 index 0000000000000000000000000000000000000000..688b701cd8ab5a34b532a5f9077163c658c669ef --- /dev/null +++ b/third_party/ktx-src/tests/loadtests/common/models/cube.obj @@ -0,0 +1,63 @@ +# Copyright 2020 The Khronos Group Inc. +# SPDX-License-Identifier: Apache-2.0 + +# Max2Obj Version 4.0 Mar 10th, 2001 +# +# object default to come ... +# +v -5.000000 -5.000000 -5.000000 +v 5.000000 -5.000000 -5.000000 +v -5.000000 5.000000 -5.000000 +v 5.000000 5.000000 -5.000000 +v -5.000000 -5.000000 5.000000 +v 5.000000 -5.000000 5.000000 +v -5.000000 5.000000 5.000000 +v 5.000000 5.000000 5.000000 +# 8 vertices + +vt 0.000000 0.000000 0.000000 +vt 1.000000 0.000000 0.000000 +vt 0.000000 1.000000 0.000000 +vt 1.000000 1.000000 0.000000 +vt 0.000000 0.000000 0.000000 +vt 1.000000 0.000000 0.000000 +vt 0.000000 1.000000 0.000000 +vt 1.000000 1.000000 0.000000 +vt 0.000000 0.000000 0.000000 +vt 1.000000 0.000000 0.000000 +vt 0.000000 1.000000 0.000000 +vt 1.000000 1.000000 0.000000 +# 12 texture vertices + +vn 0.000000 0.000000 -2.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -2.000000 +vn 0.000000 -0.000000 2.000000 +vn 0.000000 -0.000000 1.000000 +vn 0.000000 -0.000000 1.000000 +vn 0.000000 -0.000000 2.000000 +# 8 vertex normals + +g default +s 2 +f 1/10/1 3/12/3 4/11/4 +f 4/11/4 2/9/2 1/10/1 +s 4 +f 5/9/5 6/10/6 8/12/8 +f 8/12/8 7/11/7 5/9/5 +s 8 +f 1/5/1 2/6/2 6/8/6 +f 6/8/6 5/7/5 1/5/1 +s 16 +f 2/1/2 4/2/4 8/4/8 +f 8/4/8 6/3/6 2/1/2 +s 32 +f 4/5/4 3/6/3 7/8/7 +f 7/8/7 8/7/8 4/5/4 +s 64 +f 3/1/3 1/2/1 5/4/5 +f 5/4/5 7/3/7 3/1/3 +# 12 faces + +g diff --git a/third_party/ktx-src/tests/loadtests/common/models/sphere.obj b/third_party/ktx-src/tests/loadtests/common/models/sphere.obj new file mode 100644 index 0000000000000000000000000000000000000000..17fb468e732ef10df4a44173fd8140c4c8e951ec --- /dev/null +++ b/third_party/ktx-src/tests/loadtests/common/models/sphere.obj @@ -0,0 +1,2503 @@ +# Copyright 2020 The Khronos Group Inc. +# SPDX-License-Identifier: Apache-2.0 + +# Max2Obj Version 4.0 Mar 10th, 2001 +# +# object default to come ... +# +v 0.000000 19.737080 -0.000000 +v -0.000000 19.357838 -3.850513 +v -0.751198 19.357838 -3.776527 +v -1.473528 19.357838 -3.557410 +v -2.139230 19.357838 -3.201585 +v -2.722724 19.357838 -2.722724 +v -3.201585 19.357838 -2.139230 +v -3.557411 19.357838 -1.473527 +v -3.776527 19.357838 -0.751197 +v -3.850513 19.357838 0.000001 +v -3.776526 19.357838 0.751199 +v -3.557410 19.357838 1.473529 +v -3.201584 19.357838 2.139232 +v -2.722722 19.357838 2.722726 +v -2.139228 19.357838 3.201586 +v -1.473525 19.357838 3.557412 +v -0.751195 19.357838 3.776527 +v 0.000004 19.357838 3.850513 +v 0.751202 19.357838 3.776526 +v 1.473532 19.357838 3.557409 +v 2.139235 19.357838 3.201582 +v 2.722728 19.357838 2.722721 +v 3.201588 19.357838 2.139226 +v 3.557413 19.357838 1.473523 +v 3.776528 19.357838 0.751192 +v 3.850513 19.357838 -0.000006 +v 3.776525 19.357838 -0.751204 +v 3.557408 19.357838 -1.473534 +v 3.201581 19.357838 -2.139236 +v 2.722719 19.357838 -2.722729 +v 2.139224 19.357838 -3.201589 +v 1.473520 19.357838 -3.557414 +v 0.751190 19.357838 -3.776528 +v -0.000000 18.234684 -7.553053 +v -1.473528 18.234684 -7.407924 +v -2.890428 18.234684 -6.978112 +v -4.196251 18.234684 -6.280135 +v -5.340816 18.234684 -5.340816 +v -6.280135 18.234684 -4.196251 +v -6.978112 18.234684 -2.890427 +v -7.407924 18.234684 -1.473526 +v -7.553053 18.234684 0.000002 +v -7.407923 18.234684 1.473531 +v -6.978110 18.234684 2.890432 +v -6.280132 18.234684 4.196255 +v -5.340812 18.234684 5.340819 +v -4.196247 18.234684 6.280138 +v -2.890423 18.234684 6.978114 +v -1.473521 18.234684 7.407925 +v 0.000007 18.234684 7.553053 +v 1.473535 18.234684 7.407922 +v 2.890436 18.234684 6.978108 +v 4.196259 18.234684 6.280129 +v 5.340822 18.234684 5.340808 +v 6.280140 18.234684 4.196243 +v 6.978116 18.234684 2.890418 +v 7.407926 18.234684 1.473516 +v 7.553053 18.234684 -0.000012 +v 7.407921 18.234684 -1.473540 +v 6.978106 18.234684 -2.890441 +v 6.280127 18.234684 -4.196263 +v 5.340805 18.234684 -5.340826 +v 4.196239 18.234684 -6.280143 +v 2.890414 18.234684 -6.978117 +v 1.473512 18.234684 -7.407927 +v -0.000000 16.410782 -10.965334 +v -2.139230 16.410782 -10.754638 +v -4.196251 16.410782 -10.130648 +v -6.092012 16.410782 -9.117342 +v -7.753662 16.410782 -7.753662 +v -9.117343 16.410782 -6.092012 +v -10.130649 16.410782 -4.196250 +v -10.754639 16.410782 -2.139228 +v -10.965334 16.410782 0.000004 +v -10.754638 16.410782 2.139235 +v -10.130646 16.410782 4.196257 +v -9.117338 16.410782 6.092018 +v -7.753657 16.410782 7.753667 +v -6.092007 16.410782 9.117347 +v -4.196243 16.410782 10.130651 +v -2.139221 16.410782 10.754640 +v 0.000011 16.410782 10.965334 +v 2.139242 16.410782 10.754636 +v 4.196263 16.410782 10.130643 +v 6.092024 16.410782 9.117334 +v 7.753672 16.410782 7.753652 +v 9.117351 16.410782 6.092000 +v 10.130653 16.410782 4.196237 +v 10.754642 16.410782 2.139214 +v 10.965334 16.410782 -0.000018 +v 10.754635 16.410782 -2.139249 +v 10.130640 16.410782 -4.196270 +v 9.117331 16.410782 -6.092030 +v 7.753647 16.410782 -7.753677 +v 6.091995 16.410782 -9.117354 +v 4.196230 16.410782 -10.130656 +v 2.139207 16.410782 -10.754642 +v -0.000001 13.956223 -13.956223 +v -2.722724 13.956223 -13.688058 +v -5.340815 13.956223 -12.893869 +v -7.753661 13.956223 -11.604176 +v -9.868540 13.956223 -9.868540 +v -11.604177 13.956223 -7.753661 +v -12.893869 13.956223 -5.340813 +v -13.688059 13.956223 -2.722721 +v -13.956223 13.956223 0.000005 +v -13.688057 13.956223 2.722730 +v -12.893867 13.956223 5.340822 +v -11.604171 13.956223 7.753669 +v -9.868534 13.956223 9.868546 +v -7.753654 13.956223 11.604181 +v -5.340805 13.956223 12.893873 +v -2.722712 13.956223 13.688061 +v 0.000013 13.956223 13.956223 +v 2.722738 13.956223 13.688055 +v 5.340830 13.956223 12.893863 +v 7.753676 13.956223 11.604166 +v 9.868553 13.956223 9.868527 +v 11.604186 13.956223 7.753646 +v 12.893877 13.956223 5.340797 +v 13.688063 13.956223 2.722703 +v 13.956223 13.956223 -0.000022 +v 13.688054 13.956223 -2.722747 +v 12.893860 13.956223 -5.340838 +v 11.604161 13.956223 -7.753684 +v 9.868521 13.956223 -9.868559 +v 7.753639 13.956223 -11.604191 +v 5.340788 13.956223 -12.893880 +v 2.722694 13.956223 -13.688065 +v -0.000001 10.965333 -16.410782 +v -3.201585 10.965333 -16.095453 +v -6.280134 10.965333 -15.161586 +v -9.117341 10.965333 -13.645067 +v -11.604176 10.965333 -11.604176 +v -13.645067 10.965333 -9.117341 +v -15.161587 10.965333 -6.280132 +v -16.095455 10.965333 -3.201581 +v -16.410782 10.965333 0.000005 +v -16.095453 10.965333 3.201591 +v -15.161583 10.965333 6.280142 +v -13.645061 10.965333 9.117350 +v -11.604168 10.965333 11.604183 +v -9.117332 10.965333 13.645074 +v -6.280122 10.965333 15.161591 +v -3.201571 10.965333 16.095457 +v 0.000016 10.965333 16.410782 +v 3.201602 10.965333 16.095451 +v 6.280151 10.965333 15.161579 +v 9.117358 10.965333 13.645056 +v 11.604191 10.965333 11.604160 +v 13.645080 10.965333 9.117324 +v 15.161595 10.965333 6.280113 +v 16.095459 10.965333 3.201560 +v 16.410782 10.965333 -0.000026 +v 16.095448 10.965333 -3.201612 +v 15.161575 10.965333 -6.280161 +v 13.645050 10.965333 -9.117368 +v 11.604154 10.965333 -11.604198 +v 9.117315 10.965333 -13.645085 +v 6.280103 10.965333 -15.161599 +v 3.201550 10.965333 -16.095461 +v -0.000001 7.553053 -18.234684 +v -3.557410 7.553053 -17.884310 +v -6.978111 7.553053 -16.846651 +v -10.130647 7.553053 -15.161587 +v -12.893868 7.553053 -12.893868 +v -15.161587 7.553053 -10.130647 +v -16.846653 7.553053 -6.978108 +v -17.884310 7.553053 -3.557406 +v -18.234684 7.553053 0.000006 +v -17.884308 7.553053 3.557418 +v -16.846647 7.553053 6.978120 +v -15.161580 7.553053 10.130656 +v -12.893860 7.553053 12.893877 +v -10.130636 7.553053 15.161592 +v -6.978098 7.553053 16.846657 +v -3.557395 7.553053 17.884314 +v 0.000018 7.553053 18.234684 +v 3.557429 7.553053 17.884306 +v 6.978130 7.553053 16.846643 +v 10.130666 7.553053 15.161573 +v 12.893886 7.553053 12.893852 +v 15.161599 7.553053 10.130627 +v 16.846661 7.553053 6.978087 +v 17.884315 7.553053 3.557383 +v 18.234684 7.553053 -0.000029 +v 17.884304 7.553053 -3.557441 +v 16.846640 7.553053 -6.978141 +v 15.161567 7.553053 -10.130675 +v 12.893844 7.553053 -12.893893 +v 10.130617 7.553053 -15.161606 +v 6.978076 7.553053 -16.846666 +v 3.557372 7.553053 -17.884317 +v -0.000001 3.850514 -19.357838 +v -3.776527 3.850514 -18.985882 +v -7.407923 3.850514 -17.884310 +v -10.754637 3.850514 -16.095453 +v -13.688058 3.850514 -13.688058 +v -16.095453 3.850514 -10.754637 +v -17.884310 3.850514 -7.407920 +v -18.985882 3.850514 -3.776522 +v -19.357838 3.850514 0.000006 +v -18.985880 3.850514 3.776534 +v -17.884306 3.850514 7.407932 +v -16.095448 3.850514 10.754647 +v -13.688049 3.850514 13.688066 +v -10.754626 3.850514 16.095461 +v -7.407909 3.850514 17.884315 +v -3.776510 3.850514 18.985886 +v 0.000019 3.850514 19.357838 +v 3.776546 3.850514 18.985878 +v 7.407944 3.850514 17.884300 +v 10.754658 3.850514 16.095440 +v 13.688075 3.850514 13.688040 +v 16.095469 3.850514 10.754616 +v 17.884319 3.850514 7.407897 +v 18.985888 3.850514 3.776498 +v 19.357838 3.850514 -0.000031 +v 18.985876 3.850514 -3.776559 +v 17.884296 3.850514 -7.407955 +v 16.095434 3.850514 -10.754667 +v 13.688031 3.850514 -13.688085 +v 10.754605 3.850514 -16.095474 +v 7.407886 3.850514 -17.884325 +v 3.776485 3.850514 -18.985889 +v -0.000001 0.000001 -19.737080 +v -3.850513 0.000001 -19.357838 +v -7.553053 0.000001 -18.234684 +v -10.965333 0.000001 -16.410782 +v -13.956223 0.000001 -13.956223 +v -16.410784 0.000001 -10.965333 +v -18.234686 0.000001 -7.553051 +v -19.357838 0.000001 -3.850508 +v -19.737080 0.000001 0.000006 +v -19.357836 0.000001 3.850521 +v -18.234680 0.000001 7.553062 +v -16.410776 0.000001 10.965343 +v -13.956214 0.000001 13.956232 +v -10.965322 0.000001 16.410789 +v -7.553039 0.000001 18.234690 +v -3.850496 0.000001 19.357841 +v 0.000019 0.000001 19.737080 +v 3.850533 0.000001 19.357834 +v 7.553074 0.000001 18.234674 +v 10.965354 0.000001 16.410769 +v 13.956241 0.000001 13.956205 +v 16.410797 0.000001 10.965311 +v 18.234695 0.000001 7.553027 +v 19.357843 0.000001 3.850484 +v 19.737080 0.000001 -0.000032 +v 19.357830 0.000001 -3.850546 +v 18.234671 0.000001 -7.553085 +v 16.410761 0.000001 -10.965364 +v 13.956196 0.000001 -13.956249 +v 10.965301 0.000001 -16.410805 +v 7.553015 0.000001 -18.234699 +v 3.850471 0.000001 -19.357845 +v -0.000001 -3.850511 -19.357838 +v -3.776527 -3.850511 -18.985882 +v -7.407923 -3.850511 -17.884310 +v -10.754637 -3.850511 -16.095455 +v -13.688058 -3.850511 -13.688058 +v -16.095455 -3.850511 -10.754637 +v -17.884312 -3.850511 -7.407921 +v -18.985884 -3.850511 -3.776522 +v -19.357838 -3.850511 0.000006 +v -18.985880 -3.850511 3.776535 +v -17.884306 -3.850511 7.407932 +v -16.095448 -3.850511 10.754647 +v -13.688049 -3.850511 13.688067 +v -10.754626 -3.850511 16.095461 +v -7.407909 -3.850511 17.884315 +v -3.776510 -3.850511 18.985886 +v 0.000019 -3.850511 19.357838 +v 3.776547 -3.850511 18.985878 +v 7.407944 -3.850511 17.884302 +v 10.754658 -3.850511 16.095440 +v 13.688076 -3.850511 13.688041 +v 16.095469 -3.850511 10.754617 +v 17.884321 -3.850511 7.407898 +v 18.985888 -3.850511 3.776498 +v 19.357838 -3.850511 -0.000031 +v 18.985876 -3.850511 -3.776559 +v 17.884296 -3.850511 -7.407955 +v 16.095434 -3.850511 -10.754668 +v 13.688032 -3.850511 -13.688085 +v 10.754606 -3.850511 -16.095476 +v 7.407887 -3.850511 -17.884325 +v 3.776486 -3.850511 -18.985889 +v -0.000001 -7.553051 -18.234686 +v -3.557411 -7.553051 -17.884310 +v -6.978111 -7.553051 -16.846653 +v -10.130647 -7.553051 -15.161588 +v -12.893869 -7.553051 -12.893869 +v -15.161588 -7.553051 -10.130647 +v -16.846653 -7.553051 -6.978109 +v -17.884312 -7.553051 -3.557406 +v -18.234686 -7.553051 0.000006 +v -17.884310 -7.553051 3.557418 +v -16.846649 -7.553051 6.978120 +v -15.161581 -7.553051 10.130657 +v -12.893861 -7.553051 12.893878 +v -10.130637 -7.553051 15.161593 +v -6.978098 -7.553051 16.846659 +v -3.557395 -7.553051 17.884314 +v 0.000018 -7.553051 18.234686 +v 3.557429 -7.553051 17.884308 +v 6.978131 -7.553051 16.846645 +v 10.130667 -7.553051 15.161574 +v 12.893886 -7.553051 12.893853 +v 15.161600 -7.553051 10.130628 +v 16.846663 -7.553051 6.978087 +v 17.884315 -7.553051 3.557383 +v 18.234686 -7.553051 -0.000029 +v 17.884304 -7.553051 -3.557441 +v 16.846640 -7.553051 -6.978142 +v 15.161568 -7.553051 -10.130676 +v 12.893845 -7.553051 -12.893894 +v 10.130618 -7.553051 -15.161607 +v 6.978077 -7.553051 -16.846666 +v 3.557372 -7.553051 -17.884319 +v -0.000001 -10.965333 -16.410782 +v -3.201585 -10.965333 -16.095453 +v -6.280134 -10.965333 -15.161587 +v -9.117341 -10.965333 -13.645068 +v -11.604176 -10.965333 -11.604176 +v -13.645068 -10.965333 -9.117341 +v -15.161588 -10.965333 -6.280132 +v -16.095455 -10.965333 -3.201581 +v -16.410782 -10.965333 0.000005 +v -16.095453 -10.965333 3.201591 +v -15.161583 -10.965333 6.280142 +v -13.645062 -10.965333 9.117351 +v -11.604168 -10.965333 11.604183 +v -9.117332 -10.965333 13.645074 +v -6.280122 -10.965333 15.161592 +v -3.201571 -10.965333 16.095457 +v 0.000016 -10.965333 16.410782 +v 3.201602 -10.965333 16.095451 +v 6.280152 -10.965333 15.161579 +v 9.117359 -10.965333 13.645056 +v 11.604191 -10.965333 11.604161 +v 13.645080 -10.965333 9.117324 +v 15.161595 -10.965333 6.280113 +v 16.095459 -10.965333 3.201560 +v 16.410782 -10.965333 -0.000026 +v 16.095449 -10.965333 -3.201612 +v 15.161575 -10.965333 -6.280161 +v 13.645050 -10.965333 -9.117368 +v 11.604154 -10.965333 -11.604198 +v 9.117315 -10.965333 -13.645085 +v 6.280103 -10.965333 -15.161599 +v 3.201550 -10.965333 -16.095461 +v -0.000001 -13.956223 -13.956223 +v -2.722724 -13.956223 -13.688058 +v -5.340815 -13.956223 -12.893868 +v -7.753661 -13.956223 -11.604176 +v -9.868540 -13.956223 -9.868540 +v -11.604176 -13.956223 -7.753661 +v -12.893869 -13.956223 -5.340813 +v -13.688059 -13.956223 -2.722721 +v -13.956223 -13.956223 0.000005 +v -13.688057 -13.956223 2.722729 +v -12.893866 -13.956223 5.340821 +v -11.604171 -13.956223 7.753668 +v -9.868533 -13.956223 9.868546 +v -7.753654 -13.956223 11.604180 +v -5.340805 -13.956223 12.893873 +v -2.722712 -13.956223 13.688060 +v 0.000013 -13.956223 13.956223 +v 2.722738 -13.956223 13.688055 +v 5.340830 -13.956223 12.893863 +v 7.753676 -13.956223 11.604166 +v 9.868552 -13.956223 9.868527 +v 11.604186 -13.956223 7.753646 +v 12.893876 -13.956223 5.340796 +v 13.688062 -13.956223 2.722703 +v 13.956223 -13.956223 -0.000022 +v 13.688053 -13.956223 -2.722747 +v 12.893859 -13.956223 -5.340838 +v 11.604161 -13.956223 -7.753684 +v 9.868521 -13.956223 -9.868559 +v 7.753639 -13.956223 -11.604191 +v 5.340788 -13.956223 -12.893880 +v 2.722694 -13.956223 -13.688064 +v -0.000000 -16.410784 -10.965333 +v -2.139230 -16.410784 -10.754637 +v -4.196251 -16.410784 -10.130647 +v -6.092011 -16.410784 -9.117341 +v -7.753661 -16.410784 -7.753661 +v -9.117341 -16.410784 -6.092011 +v -10.130647 -16.410784 -4.196249 +v -10.754638 -16.410784 -2.139228 +v -10.965333 -16.410784 0.000004 +v -10.754636 -16.410784 2.139235 +v -10.130644 -16.410784 4.196256 +v -9.117337 -16.410784 6.092018 +v -7.753656 -16.410784 7.753666 +v -6.092006 -16.410784 9.117345 +v -4.196243 -16.410784 10.130650 +v -2.139221 -16.410784 10.754639 +v 0.000011 -16.410784 10.965333 +v 2.139241 -16.410784 10.754635 +v 4.196262 -16.410784 10.130642 +v 6.092023 -16.410784 9.117333 +v 7.753671 -16.410784 7.753651 +v 9.117349 -16.410784 6.092000 +v 10.130652 -16.410784 4.196237 +v 10.754640 -16.410784 2.139214 +v 10.965333 -16.410784 -0.000018 +v 10.754633 -16.410784 -2.139248 +v 10.130639 -16.410784 -4.196269 +v 9.117330 -16.410784 -6.092029 +v 7.753646 -16.410784 -7.753676 +v 6.091994 -16.410784 -9.117353 +v 4.196230 -16.410784 -10.130655 +v 2.139207 -16.410784 -10.754642 +v -0.000000 -18.234686 -7.553051 +v -1.473527 -18.234686 -7.407920 +v -2.890427 -18.234686 -6.978109 +v -4.196249 -18.234686 -6.280132 +v -5.340813 -18.234686 -5.340813 +v -6.280132 -18.234686 -4.196249 +v -6.978109 -18.234686 -2.890426 +v -7.407921 -18.234686 -1.473525 +v -7.553051 -18.234686 0.000002 +v -7.407920 -18.234686 1.473530 +v -6.978107 -18.234686 2.890431 +v -6.280129 -18.234686 4.196253 +v -5.340810 -18.234686 5.340816 +v -4.196245 -18.234686 6.280135 +v -2.890422 -18.234686 6.978111 +v -1.473521 -18.234686 7.407922 +v 0.000007 -18.234686 7.553051 +v 1.473535 -18.234686 7.407919 +v 2.890435 -18.234686 6.978106 +v 4.196258 -18.234686 6.280127 +v 5.340820 -18.234686 5.340806 +v 6.280138 -18.234686 4.196241 +v 6.978113 -18.234686 2.890417 +v 7.407923 -18.234686 1.473516 +v 7.553051 -18.234686 -0.000012 +v 7.407918 -18.234686 -1.473539 +v 6.978104 -18.234686 -2.890440 +v 6.280124 -18.234686 -4.196261 +v 5.340803 -18.234686 -5.340823 +v 4.196238 -18.234686 -6.280140 +v 2.890413 -18.234686 -6.978115 +v 1.473511 -18.234686 -7.407924 +v -0.000000 -19.357838 -3.850508 +v -0.751197 -19.357838 -3.776522 +v -1.473526 -19.357838 -3.557406 +v -2.139228 -19.357838 -3.201581 +v -2.722721 -19.357838 -2.722721 +v -3.201581 -19.357838 -2.139228 +v -3.557406 -19.357838 -1.473525 +v -3.776522 -19.357838 -0.751196 +v -3.850508 -19.357838 0.000001 +v -3.776522 -19.357838 0.751198 +v -3.557405 -19.357838 1.473528 +v -3.201580 -19.357838 2.139230 +v -2.722719 -19.357838 2.722722 +v -2.139225 -19.357838 3.201582 +v -1.473523 -19.357838 3.557407 +v -0.751194 -19.357838 3.776523 +v 0.000004 -19.357838 3.850508 +v 0.751201 -19.357838 3.776521 +v 1.473530 -19.357838 3.557404 +v 2.139232 -19.357838 3.201578 +v 2.722724 -19.357838 2.722717 +v 3.201584 -19.357838 2.139224 +v 3.557408 -19.357838 1.473521 +v 3.776523 -19.357838 0.751191 +v 3.850508 -19.357838 -0.000006 +v 3.776521 -19.357838 -0.751203 +v 3.557403 -19.357838 -1.473532 +v 3.201577 -19.357838 -2.139234 +v 2.722715 -19.357838 -2.722726 +v 2.139221 -19.357838 -3.201585 +v 1.473518 -19.357838 -3.557409 +v 0.751189 -19.357838 -3.776524 +v 0.000000 -19.737080 -0.000000 +# 482 vertices + +vt 0.000000 1.000000 0.000000 +vt 0.031250 1.000000 0.000000 +vt 0.062500 1.000000 0.000000 +vt 0.093750 1.000000 0.000000 +vt 0.125000 1.000000 0.000000 +vt 0.156250 1.000000 0.000000 +vt 0.187500 1.000000 0.000000 +vt 0.218750 1.000000 0.000000 +vt 0.250000 1.000000 0.000000 +vt 0.281250 1.000000 0.000000 +vt 0.312500 1.000000 0.000000 +vt 0.343750 1.000000 0.000000 +vt 0.375000 1.000000 0.000000 +vt 0.406250 1.000000 0.000000 +vt 0.437500 1.000000 0.000000 +vt 0.468750 1.000000 0.000000 +vt 0.500000 1.000000 0.000000 +vt 0.531250 1.000000 0.000000 +vt 0.562500 1.000000 0.000000 +vt 0.593750 1.000000 0.000000 +vt 0.625000 1.000000 0.000000 +vt 0.656250 1.000000 0.000000 +vt 0.687500 1.000000 0.000000 +vt 0.718750 1.000000 0.000000 +vt 0.750000 1.000000 0.000000 +vt 0.781250 1.000000 0.000000 +vt 0.812500 1.000000 0.000000 +vt 0.843750 1.000000 0.000000 +vt 0.875000 1.000000 0.000000 +vt 0.906250 1.000000 0.000000 +vt 0.937500 1.000000 0.000000 +vt 0.968750 1.000000 0.000000 +vt 1.000000 1.000000 0.000000 +vt 0.000000 0.937500 0.000000 +vt 0.031250 0.937500 0.000000 +vt 0.062500 0.937500 0.000000 +vt 0.093750 0.937500 0.000000 +vt 0.125000 0.937500 0.000000 +vt 0.156250 0.937500 0.000000 +vt 0.187500 0.937500 0.000000 +vt 0.218750 0.937500 0.000000 +vt 0.250000 0.937500 0.000000 +vt 0.281250 0.937500 0.000000 +vt 0.312500 0.937500 0.000000 +vt 0.343750 0.937500 0.000000 +vt 0.375000 0.937500 0.000000 +vt 0.406250 0.937500 0.000000 +vt 0.437500 0.937500 0.000000 +vt 0.468750 0.937500 0.000000 +vt 0.500000 0.937500 0.000000 +vt 0.531250 0.937500 0.000000 +vt 0.562500 0.937500 0.000000 +vt 0.593750 0.937500 0.000000 +vt 0.625000 0.937500 0.000000 +vt 0.656250 0.937500 0.000000 +vt 0.687500 0.937500 0.000000 +vt 0.718750 0.937500 0.000000 +vt 0.750000 0.937500 0.000000 +vt 0.781250 0.937500 0.000000 +vt 0.812500 0.937500 0.000000 +vt 0.843750 0.937500 0.000000 +vt 0.875000 0.937500 0.000000 +vt 0.906250 0.937500 0.000000 +vt 0.937500 0.937500 0.000000 +vt 0.968750 0.937500 0.000000 +vt 1.000000 0.937500 0.000000 +vt 0.000000 0.875000 0.000000 +vt 0.031250 0.875000 0.000000 +vt 0.062500 0.875000 0.000000 +vt 0.093750 0.875000 0.000000 +vt 0.125000 0.875000 0.000000 +vt 0.156250 0.875000 0.000000 +vt 0.187500 0.875000 0.000000 +vt 0.218750 0.875000 0.000000 +vt 0.250000 0.875000 0.000000 +vt 0.281250 0.875000 0.000000 +vt 0.312500 0.875000 0.000000 +vt 0.343750 0.875000 0.000000 +vt 0.375000 0.875000 0.000000 +vt 0.406250 0.875000 0.000000 +vt 0.437500 0.875000 0.000000 +vt 0.468750 0.875000 0.000000 +vt 0.500000 0.875000 0.000000 +vt 0.531250 0.875000 0.000000 +vt 0.562500 0.875000 0.000000 +vt 0.593750 0.875000 0.000000 +vt 0.625000 0.875000 0.000000 +vt 0.656250 0.875000 0.000000 +vt 0.687500 0.875000 0.000000 +vt 0.718750 0.875000 0.000000 +vt 0.750000 0.875000 0.000000 +vt 0.781250 0.875000 0.000000 +vt 0.812500 0.875000 0.000000 +vt 0.843750 0.875000 0.000000 +vt 0.875000 0.875000 0.000000 +vt 0.906250 0.875000 0.000000 +vt 0.937500 0.875000 0.000000 +vt 0.968750 0.875000 0.000000 +vt 1.000000 0.875000 0.000000 +vt 0.000000 0.812500 0.000000 +vt 0.031250 0.812500 0.000000 +vt 0.062500 0.812500 0.000000 +vt 0.093750 0.812500 0.000000 +vt 0.125000 0.812500 0.000000 +vt 0.156250 0.812500 0.000000 +vt 0.187500 0.812500 0.000000 +vt 0.218750 0.812500 0.000000 +vt 0.250000 0.812500 0.000000 +vt 0.281250 0.812500 0.000000 +vt 0.312500 0.812500 0.000000 +vt 0.343750 0.812500 0.000000 +vt 0.375000 0.812500 0.000000 +vt 0.406250 0.812500 0.000000 +vt 0.437500 0.812500 0.000000 +vt 0.468750 0.812500 0.000000 +vt 0.500000 0.812500 0.000000 +vt 0.531250 0.812500 0.000000 +vt 0.562500 0.812500 0.000000 +vt 0.593750 0.812500 0.000000 +vt 0.625000 0.812500 0.000000 +vt 0.656250 0.812500 0.000000 +vt 0.687500 0.812500 0.000000 +vt 0.718750 0.812500 0.000000 +vt 0.750000 0.812500 0.000000 +vt 0.781250 0.812500 0.000000 +vt 0.812500 0.812500 0.000000 +vt 0.843750 0.812500 0.000000 +vt 0.875000 0.812500 0.000000 +vt 0.906250 0.812500 0.000000 +vt 0.937500 0.812500 0.000000 +vt 0.968750 0.812500 0.000000 +vt 1.000000 0.812500 0.000000 +vt 0.000000 0.750000 0.000000 +vt 0.031250 0.750000 0.000000 +vt 0.062500 0.750000 0.000000 +vt 0.093750 0.750000 0.000000 +vt 0.125000 0.750000 0.000000 +vt 0.156250 0.750000 0.000000 +vt 0.187500 0.750000 0.000000 +vt 0.218750 0.750000 0.000000 +vt 0.250000 0.750000 0.000000 +vt 0.281250 0.750000 0.000000 +vt 0.312500 0.750000 0.000000 +vt 0.343750 0.750000 0.000000 +vt 0.375000 0.750000 0.000000 +vt 0.406250 0.750000 0.000000 +vt 0.437500 0.750000 0.000000 +vt 0.468750 0.750000 0.000000 +vt 0.500000 0.750000 0.000000 +vt 0.531250 0.750000 0.000000 +vt 0.562500 0.750000 0.000000 +vt 0.593750 0.750000 0.000000 +vt 0.625000 0.750000 0.000000 +vt 0.656250 0.750000 0.000000 +vt 0.687500 0.750000 0.000000 +vt 0.718750 0.750000 0.000000 +vt 0.750000 0.750000 0.000000 +vt 0.781250 0.750000 0.000000 +vt 0.812500 0.750000 0.000000 +vt 0.843750 0.750000 0.000000 +vt 0.875000 0.750000 0.000000 +vt 0.906250 0.750000 0.000000 +vt 0.937500 0.750000 0.000000 +vt 0.968750 0.750000 0.000000 +vt 1.000000 0.750000 0.000000 +vt 0.000000 0.687500 0.000000 +vt 0.031250 0.687500 0.000000 +vt 0.062500 0.687500 0.000000 +vt 0.093750 0.687500 0.000000 +vt 0.125000 0.687500 0.000000 +vt 0.156250 0.687500 0.000000 +vt 0.187500 0.687500 0.000000 +vt 0.218750 0.687500 0.000000 +vt 0.250000 0.687500 0.000000 +vt 0.281250 0.687500 0.000000 +vt 0.312500 0.687500 0.000000 +vt 0.343750 0.687500 0.000000 +vt 0.375000 0.687500 0.000000 +vt 0.406250 0.687500 0.000000 +vt 0.437500 0.687500 0.000000 +vt 0.468750 0.687500 0.000000 +vt 0.500000 0.687500 0.000000 +vt 0.531250 0.687500 0.000000 +vt 0.562500 0.687500 0.000000 +vt 0.593750 0.687500 0.000000 +vt 0.625000 0.687500 0.000000 +vt 0.656250 0.687500 0.000000 +vt 0.687500 0.687500 0.000000 +vt 0.718750 0.687500 0.000000 +vt 0.750000 0.687500 0.000000 +vt 0.781250 0.687500 0.000000 +vt 0.812500 0.687500 0.000000 +vt 0.843750 0.687500 0.000000 +vt 0.875000 0.687500 0.000000 +vt 0.906250 0.687500 0.000000 +vt 0.937500 0.687500 0.000000 +vt 0.968750 0.687500 0.000000 +vt 1.000000 0.687500 0.000000 +vt 0.000000 0.625000 0.000000 +vt 0.031250 0.625000 0.000000 +vt 0.062500 0.625000 0.000000 +vt 0.093750 0.625000 0.000000 +vt 0.125000 0.625000 0.000000 +vt 0.156250 0.625000 0.000000 +vt 0.187500 0.625000 0.000000 +vt 0.218750 0.625000 0.000000 +vt 0.250000 0.625000 0.000000 +vt 0.281250 0.625000 0.000000 +vt 0.312500 0.625000 0.000000 +vt 0.343750 0.625000 0.000000 +vt 0.375000 0.625000 0.000000 +vt 0.406250 0.625000 0.000000 +vt 0.437500 0.625000 0.000000 +vt 0.468750 0.625000 0.000000 +vt 0.500000 0.625000 0.000000 +vt 0.531250 0.625000 0.000000 +vt 0.562500 0.625000 0.000000 +vt 0.593750 0.625000 0.000000 +vt 0.625000 0.625000 0.000000 +vt 0.656250 0.625000 0.000000 +vt 0.687500 0.625000 0.000000 +vt 0.718750 0.625000 0.000000 +vt 0.750000 0.625000 0.000000 +vt 0.781250 0.625000 0.000000 +vt 0.812500 0.625000 0.000000 +vt 0.843750 0.625000 0.000000 +vt 0.875000 0.625000 0.000000 +vt 0.906250 0.625000 0.000000 +vt 0.937500 0.625000 0.000000 +vt 0.968750 0.625000 0.000000 +vt 1.000000 0.625000 0.000000 +vt 0.000000 0.562500 0.000000 +vt 0.031250 0.562500 0.000000 +vt 0.062500 0.562500 0.000000 +vt 0.093750 0.562500 0.000000 +vt 0.125000 0.562500 0.000000 +vt 0.156250 0.562500 0.000000 +vt 0.187500 0.562500 0.000000 +vt 0.218750 0.562500 0.000000 +vt 0.250000 0.562500 0.000000 +vt 0.281250 0.562500 0.000000 +vt 0.312500 0.562500 0.000000 +vt 0.343750 0.562500 0.000000 +vt 0.375000 0.562500 0.000000 +vt 0.406250 0.562500 0.000000 +vt 0.437500 0.562500 0.000000 +vt 0.468750 0.562500 0.000000 +vt 0.500000 0.562500 0.000000 +vt 0.531250 0.562500 0.000000 +vt 0.562500 0.562500 0.000000 +vt 0.593750 0.562500 0.000000 +vt 0.625000 0.562500 0.000000 +vt 0.656250 0.562500 0.000000 +vt 0.687500 0.562500 0.000000 +vt 0.718750 0.562500 0.000000 +vt 0.750000 0.562500 0.000000 +vt 0.781250 0.562500 0.000000 +vt 0.812500 0.562500 0.000000 +vt 0.843750 0.562500 0.000000 +vt 0.875000 0.562500 0.000000 +vt 0.906250 0.562500 0.000000 +vt 0.937500 0.562500 0.000000 +vt 0.968750 0.562500 0.000000 +vt 1.000000 0.562500 0.000000 +vt 0.000000 0.500000 0.000000 +vt 0.031250 0.500000 0.000000 +vt 0.062500 0.500000 0.000000 +vt 0.093750 0.500000 0.000000 +vt 0.125000 0.500000 0.000000 +vt 0.156250 0.500000 0.000000 +vt 0.187500 0.500000 0.000000 +vt 0.218750 0.500000 0.000000 +vt 0.250000 0.500000 0.000000 +vt 0.281250 0.500000 0.000000 +vt 0.312500 0.500000 0.000000 +vt 0.343750 0.500000 0.000000 +vt 0.375000 0.500000 0.000000 +vt 0.406250 0.500000 0.000000 +vt 0.437500 0.500000 0.000000 +vt 0.468750 0.500000 0.000000 +vt 0.500000 0.500000 0.000000 +vt 0.531250 0.500000 0.000000 +vt 0.562500 0.500000 0.000000 +vt 0.593750 0.500000 0.000000 +vt 0.625000 0.500000 0.000000 +vt 0.656250 0.500000 0.000000 +vt 0.687500 0.500000 0.000000 +vt 0.718750 0.500000 0.000000 +vt 0.750000 0.500000 0.000000 +vt 0.781250 0.500000 0.000000 +vt 0.812500 0.500000 0.000000 +vt 0.843750 0.500000 0.000000 +vt 0.875000 0.500000 0.000000 +vt 0.906250 0.500000 0.000000 +vt 0.937500 0.500000 0.000000 +vt 0.968750 0.500000 0.000000 +vt 1.000000 0.500000 0.000000 +vt 0.000000 0.437500 0.000000 +vt 0.031250 0.437500 0.000000 +vt 0.062500 0.437500 0.000000 +vt 0.093750 0.437500 0.000000 +vt 0.125000 0.437500 0.000000 +vt 0.156250 0.437500 0.000000 +vt 0.187500 0.437500 0.000000 +vt 0.218750 0.437500 0.000000 +vt 0.250000 0.437500 0.000000 +vt 0.281250 0.437500 0.000000 +vt 0.312500 0.437500 0.000000 +vt 0.343750 0.437500 0.000000 +vt 0.375000 0.437500 0.000000 +vt 0.406250 0.437500 0.000000 +vt 0.437500 0.437500 0.000000 +vt 0.468750 0.437500 0.000000 +vt 0.500000 0.437500 0.000000 +vt 0.531250 0.437500 0.000000 +vt 0.562500 0.437500 0.000000 +vt 0.593750 0.437500 0.000000 +vt 0.625000 0.437500 0.000000 +vt 0.656250 0.437500 0.000000 +vt 0.687500 0.437500 0.000000 +vt 0.718750 0.437500 0.000000 +vt 0.750000 0.437500 0.000000 +vt 0.781250 0.437500 0.000000 +vt 0.812500 0.437500 0.000000 +vt 0.843750 0.437500 0.000000 +vt 0.875000 0.437500 0.000000 +vt 0.906250 0.437500 0.000000 +vt 0.937500 0.437500 0.000000 +vt 0.968750 0.437500 0.000000 +vt 1.000000 0.437500 0.000000 +vt 0.000000 0.375000 0.000000 +vt 0.031250 0.375000 0.000000 +vt 0.062500 0.375000 0.000000 +vt 0.093750 0.375000 0.000000 +vt 0.125000 0.375000 0.000000 +vt 0.156250 0.375000 0.000000 +vt 0.187500 0.375000 0.000000 +vt 0.218750 0.375000 0.000000 +vt 0.250000 0.375000 0.000000 +vt 0.281250 0.375000 0.000000 +vt 0.312500 0.375000 0.000000 +vt 0.343750 0.375000 0.000000 +vt 0.375000 0.375000 0.000000 +vt 0.406250 0.375000 0.000000 +vt 0.437500 0.375000 0.000000 +vt 0.468750 0.375000 0.000000 +vt 0.500000 0.375000 0.000000 +vt 0.531250 0.375000 0.000000 +vt 0.562500 0.375000 0.000000 +vt 0.593750 0.375000 0.000000 +vt 0.625000 0.375000 0.000000 +vt 0.656250 0.375000 0.000000 +vt 0.687500 0.375000 0.000000 +vt 0.718750 0.375000 0.000000 +vt 0.750000 0.375000 0.000000 +vt 0.781250 0.375000 0.000000 +vt 0.812500 0.375000 0.000000 +vt 0.843750 0.375000 0.000000 +vt 0.875000 0.375000 0.000000 +vt 0.906250 0.375000 0.000000 +vt 0.937500 0.375000 0.000000 +vt 0.968750 0.375000 0.000000 +vt 1.000000 0.375000 0.000000 +vt 0.000000 0.312500 0.000000 +vt 0.031250 0.312500 0.000000 +vt 0.062500 0.312500 0.000000 +vt 0.093750 0.312500 0.000000 +vt 0.125000 0.312500 0.000000 +vt 0.156250 0.312500 0.000000 +vt 0.187500 0.312500 0.000000 +vt 0.218750 0.312500 0.000000 +vt 0.250000 0.312500 0.000000 +vt 0.281250 0.312500 0.000000 +vt 0.312500 0.312500 0.000000 +vt 0.343750 0.312500 0.000000 +vt 0.375000 0.312500 0.000000 +vt 0.406250 0.312500 0.000000 +vt 0.437500 0.312500 0.000000 +vt 0.468750 0.312500 0.000000 +vt 0.500000 0.312500 0.000000 +vt 0.531250 0.312500 0.000000 +vt 0.562500 0.312500 0.000000 +vt 0.593750 0.312500 0.000000 +vt 0.625000 0.312500 0.000000 +vt 0.656250 0.312500 0.000000 +vt 0.687500 0.312500 0.000000 +vt 0.718750 0.312500 0.000000 +vt 0.750000 0.312500 0.000000 +vt 0.781250 0.312500 0.000000 +vt 0.812500 0.312500 0.000000 +vt 0.843750 0.312500 0.000000 +vt 0.875000 0.312500 0.000000 +vt 0.906250 0.312500 0.000000 +vt 0.937500 0.312500 0.000000 +vt 0.968750 0.312500 0.000000 +vt 1.000000 0.312500 0.000000 +vt 0.000000 0.250000 0.000000 +vt 0.031250 0.250000 0.000000 +vt 0.062500 0.250000 0.000000 +vt 0.093750 0.250000 0.000000 +vt 0.125000 0.250000 0.000000 +vt 0.156250 0.250000 0.000000 +vt 0.187500 0.250000 0.000000 +vt 0.218750 0.250000 0.000000 +vt 0.250000 0.250000 0.000000 +vt 0.281250 0.250000 0.000000 +vt 0.312500 0.250000 0.000000 +vt 0.343750 0.250000 0.000000 +vt 0.375000 0.250000 0.000000 +vt 0.406250 0.250000 0.000000 +vt 0.437500 0.250000 0.000000 +vt 0.468750 0.250000 0.000000 +vt 0.500000 0.250000 0.000000 +vt 0.531250 0.250000 0.000000 +vt 0.562500 0.250000 0.000000 +vt 0.593750 0.250000 0.000000 +vt 0.625000 0.250000 0.000000 +vt 0.656250 0.250000 0.000000 +vt 0.687500 0.250000 0.000000 +vt 0.718750 0.250000 0.000000 +vt 0.750000 0.250000 0.000000 +vt 0.781250 0.250000 0.000000 +vt 0.812500 0.250000 0.000000 +vt 0.843750 0.250000 0.000000 +vt 0.875000 0.250000 0.000000 +vt 0.906250 0.250000 0.000000 +vt 0.937500 0.250000 0.000000 +vt 0.968750 0.250000 0.000000 +vt 1.000000 0.250000 0.000000 +vt 0.000000 0.187500 0.000000 +vt 0.031250 0.187500 0.000000 +vt 0.062500 0.187500 0.000000 +vt 0.093750 0.187500 0.000000 +vt 0.125000 0.187500 0.000000 +vt 0.156250 0.187500 0.000000 +vt 0.187500 0.187500 0.000000 +vt 0.218750 0.187500 0.000000 +vt 0.250000 0.187500 0.000000 +vt 0.281250 0.187500 0.000000 +vt 0.312500 0.187500 0.000000 +vt 0.343750 0.187500 0.000000 +vt 0.375000 0.187500 0.000000 +vt 0.406250 0.187500 0.000000 +vt 0.437500 0.187500 0.000000 +vt 0.468750 0.187500 0.000000 +vt 0.500000 0.187500 0.000000 +vt 0.531250 0.187500 0.000000 +vt 0.562500 0.187500 0.000000 +vt 0.593750 0.187500 0.000000 +vt 0.625000 0.187500 0.000000 +vt 0.656250 0.187500 0.000000 +vt 0.687500 0.187500 0.000000 +vt 0.718750 0.187500 0.000000 +vt 0.750000 0.187500 0.000000 +vt 0.781250 0.187500 0.000000 +vt 0.812500 0.187500 0.000000 +vt 0.843750 0.187500 0.000000 +vt 0.875000 0.187500 0.000000 +vt 0.906250 0.187500 0.000000 +vt 0.937500 0.187500 0.000000 +vt 0.968750 0.187500 0.000000 +vt 1.000000 0.187500 0.000000 +vt 0.000000 0.125000 0.000000 +vt 0.031250 0.125000 0.000000 +vt 0.062500 0.125000 0.000000 +vt 0.093750 0.125000 0.000000 +vt 0.125000 0.125000 0.000000 +vt 0.156250 0.125000 0.000000 +vt 0.187500 0.125000 0.000000 +vt 0.218750 0.125000 0.000000 +vt 0.250000 0.125000 0.000000 +vt 0.281250 0.125000 0.000000 +vt 0.312500 0.125000 0.000000 +vt 0.343750 0.125000 0.000000 +vt 0.375000 0.125000 0.000000 +vt 0.406250 0.125000 0.000000 +vt 0.437500 0.125000 0.000000 +vt 0.468750 0.125000 0.000000 +vt 0.500000 0.125000 0.000000 +vt 0.531250 0.125000 0.000000 +vt 0.562500 0.125000 0.000000 +vt 0.593750 0.125000 0.000000 +vt 0.625000 0.125000 0.000000 +vt 0.656250 0.125000 0.000000 +vt 0.687500 0.125000 0.000000 +vt 0.718750 0.125000 0.000000 +vt 0.750000 0.125000 0.000000 +vt 0.781250 0.125000 0.000000 +vt 0.812500 0.125000 0.000000 +vt 0.843750 0.125000 0.000000 +vt 0.875000 0.125000 0.000000 +vt 0.906250 0.125000 0.000000 +vt 0.937500 0.125000 0.000000 +vt 0.968750 0.125000 0.000000 +vt 1.000000 0.125000 0.000000 +vt 0.000000 0.062500 0.000000 +vt 0.031250 0.062500 0.000000 +vt 0.062500 0.062500 0.000000 +vt 0.093750 0.062500 0.000000 +vt 0.125000 0.062500 0.000000 +vt 0.156250 0.062500 0.000000 +vt 0.187500 0.062500 0.000000 +vt 0.218750 0.062500 0.000000 +vt 0.250000 0.062500 0.000000 +vt 0.281250 0.062500 0.000000 +vt 0.312500 0.062500 0.000000 +vt 0.343750 0.062500 0.000000 +vt 0.375000 0.062500 0.000000 +vt 0.406250 0.062500 0.000000 +vt 0.437500 0.062500 0.000000 +vt 0.468750 0.062500 0.000000 +vt 0.500000 0.062500 0.000000 +vt 0.531250 0.062500 0.000000 +vt 0.562500 0.062500 0.000000 +vt 0.593750 0.062500 0.000000 +vt 0.625000 0.062500 0.000000 +vt 0.656250 0.062500 0.000000 +vt 0.687500 0.062500 0.000000 +vt 0.718750 0.062500 0.000000 +vt 0.750000 0.062500 0.000000 +vt 0.781250 0.062500 0.000000 +vt 0.812500 0.062500 0.000000 +vt 0.843750 0.062500 0.000000 +vt 0.875000 0.062500 0.000000 +vt 0.906250 0.062500 0.000000 +vt 0.937500 0.062500 0.000000 +vt 0.968750 0.062500 0.000000 +vt 1.000000 0.062500 0.000000 +vt 0.000000 -0.000000 0.000000 +vt 0.031250 -0.000000 0.000000 +vt 0.062500 -0.000000 0.000000 +vt 0.093750 -0.000000 0.000000 +vt 0.125000 -0.000000 0.000000 +vt 0.156250 -0.000000 0.000000 +vt 0.187500 -0.000000 0.000000 +vt 0.218750 -0.000000 0.000000 +vt 0.250000 -0.000000 0.000000 +vt 0.281250 -0.000000 0.000000 +vt 0.312500 -0.000000 0.000000 +vt 0.343750 -0.000000 0.000000 +vt 0.375000 -0.000000 0.000000 +vt 0.406250 -0.000000 0.000000 +vt 0.437500 -0.000000 0.000000 +vt 0.468750 -0.000000 0.000000 +vt 0.500000 -0.000000 0.000000 +vt 0.531250 -0.000000 0.000000 +vt 0.562500 -0.000000 0.000000 +vt 0.593750 -0.000000 0.000000 +vt 0.625000 -0.000000 0.000000 +vt 0.656250 -0.000000 0.000000 +vt 0.687500 -0.000000 0.000000 +vt 0.718750 -0.000000 0.000000 +vt 0.750000 -0.000000 0.000000 +vt 0.781250 -0.000000 0.000000 +vt 0.812500 -0.000000 0.000000 +vt 0.843750 -0.000000 0.000000 +vt 0.875000 -0.000000 0.000000 +vt 0.906250 -0.000000 0.000000 +vt 0.937500 -0.000000 0.000000 +vt 0.968750 -0.000000 0.000000 +vt 1.000000 -0.000000 0.000000 +# 561 texture vertices + +vn 0.000000 1.000000 -0.000000 +vn -0.005744 0.976740 -0.214348 +vn -0.047451 0.976740 -0.209109 +vn -0.087334 0.976740 -0.195834 +vn -0.123861 0.976740 -0.175033 +vn -0.155629 0.976740 -0.147506 +vn -0.181415 0.976740 -0.114310 +vn -0.200230 0.976740 -0.076721 +vn -0.211350 0.976740 -0.036184 +vn -0.214348 0.976740 0.005744 +vn -0.209109 0.976740 0.047451 +vn -0.195834 0.976740 0.087334 +vn -0.175033 0.976740 0.123861 +vn -0.147506 0.976740 0.155629 +vn -0.114310 0.976740 0.181415 +vn -0.076721 0.976740 0.200230 +vn -0.036184 0.976740 0.211350 +vn 0.005744 0.976740 0.214348 +vn 0.047451 0.976740 0.209109 +vn 0.087334 0.976740 0.195834 +vn 0.123862 0.976740 0.175033 +vn 0.155629 0.976740 0.147505 +vn 0.181415 0.976740 0.114309 +vn 0.200230 0.976740 0.076721 +vn 0.211350 0.976740 0.036184 +vn 0.214348 0.976740 -0.005744 +vn 0.209109 0.976740 -0.047451 +vn 0.195834 0.976740 -0.087334 +vn 0.175033 0.976740 -0.123862 +vn 0.147505 0.976740 -0.155629 +vn 0.114309 0.976740 -0.181415 +vn 0.076721 0.976740 -0.200230 +vn 0.036184 0.976740 -0.211350 +vn -0.002983 0.923888 -0.382651 +vn -0.077577 0.923888 -0.374717 +vn -0.149190 0.923888 -0.352382 +vn -0.215070 0.923888 -0.316506 +vn -0.272685 0.923888 -0.268466 +vn -0.319820 0.923888 -0.210109 +vn -0.354665 0.923888 -0.143678 +vn -0.375881 0.923888 -0.071726 +vn -0.382651 0.923888 0.002983 +vn -0.374717 0.923888 0.077578 +vn -0.352382 0.923888 0.149191 +vn -0.316506 0.923888 0.215070 +vn -0.268466 0.923888 0.272685 +vn -0.210109 0.923888 0.319821 +vn -0.143678 0.923888 0.354666 +vn -0.071725 0.923888 0.375881 +vn 0.002984 0.923888 0.382651 +vn 0.077578 0.923888 0.374717 +vn 0.149191 0.923888 0.352382 +vn 0.215071 0.923888 0.316505 +vn 0.272685 0.923888 0.268466 +vn 0.319821 0.923888 0.210109 +vn 0.354666 0.923888 0.143678 +vn 0.375881 0.923888 0.071725 +vn 0.382651 0.923888 -0.002984 +vn 0.374717 0.923888 -0.077578 +vn 0.352382 0.923888 -0.149191 +vn 0.316505 0.923888 -0.215071 +vn 0.268465 0.923888 -0.272685 +vn 0.210109 0.923888 -0.319821 +vn 0.143678 0.923888 -0.354666 +vn 0.071725 0.923888 -0.375881 +vn -0.002681 0.831490 -0.555533 +vn -0.111008 0.831490 -0.544335 +vn -0.215070 0.831490 -0.512219 +vn -0.310866 0.831490 -0.460419 +vn -0.394716 0.831490 -0.390925 +vn -0.463398 0.831490 -0.306408 +vn -0.514271 0.831490 -0.210116 +vn -0.545381 0.831490 -0.105750 +vn -0.555533 0.831490 0.002681 +vn -0.544335 0.831490 0.111008 +vn -0.512219 0.831490 0.215070 +vn -0.460419 0.831490 0.310867 +vn -0.390925 0.831490 0.394717 +vn -0.306408 0.831490 0.463398 +vn -0.210116 0.831490 0.514271 +vn -0.105749 0.831490 0.545381 +vn 0.002681 0.831490 0.555533 +vn 0.111009 0.831490 0.544335 +vn 0.215070 0.831490 0.512219 +vn 0.310867 0.831490 0.460419 +vn 0.394717 0.831490 0.390925 +vn 0.463398 0.831490 0.306408 +vn 0.514271 0.831490 0.210116 +vn 0.545381 0.831490 0.105749 +vn 0.555533 0.831490 -0.002681 +vn 0.544335 0.831490 -0.111009 +vn 0.512219 0.831490 -0.215071 +vn 0.460419 0.831490 -0.310867 +vn 0.390925 0.831490 -0.394717 +vn 0.306408 0.831490 -0.463398 +vn 0.210115 0.831490 -0.514271 +vn 0.105749 0.831490 -0.545381 +vn -0.002276 0.707138 -0.707072 +vn -0.140175 0.707138 -0.693042 +vn -0.272687 0.707138 -0.652379 +vn -0.394720 0.707138 -0.586645 +vn -0.501585 0.707138 -0.498367 +vn -0.589173 0.707138 -0.390936 +vn -0.654120 0.707138 -0.268482 +vn -0.693930 0.707138 -0.135711 +vn -0.707072 0.707138 0.002276 +vn -0.693042 0.707138 0.140175 +vn -0.652379 0.707138 0.272687 +vn -0.586645 0.707138 0.394721 +vn -0.498366 0.707138 0.501585 +vn -0.390936 0.707138 0.589174 +vn -0.268482 0.707138 0.654121 +vn -0.135711 0.707138 0.693930 +vn 0.002276 0.707138 0.707072 +vn 0.140176 0.707138 0.693042 +vn 0.272688 0.707138 0.652378 +vn 0.394721 0.707138 0.586644 +vn 0.501585 0.707138 0.498366 +vn 0.589174 0.707138 0.390935 +vn 0.654121 0.707138 0.268482 +vn 0.693930 0.707138 0.135710 +vn 0.707072 0.707138 -0.002277 +vn 0.693042 0.707138 -0.140176 +vn 0.652378 0.707138 -0.272688 +vn 0.586644 0.707138 -0.394721 +vn 0.498366 0.707138 -0.501585 +vn 0.390935 0.707138 -0.589174 +vn 0.268481 0.707138 -0.654121 +vn 0.135710 0.707138 -0.693930 +vn -0.001785 0.555605 -0.831445 +vn -0.163957 0.555605 -0.815120 +vn -0.319829 0.555605 -0.767472 +vn -0.463410 0.555605 -0.690329 +vn -0.589182 0.555605 -0.586658 +vn -0.692312 0.555605 -0.460442 +vn -0.768838 0.555605 -0.316531 +vn -0.815817 0.555605 -0.160456 +vn -0.831445 0.555605 0.001785 +vn -0.815120 0.555605 0.163957 +vn -0.767471 0.555605 0.319829 +vn -0.690329 0.555605 0.463410 +vn -0.586658 0.555605 0.589182 +vn -0.460441 0.555605 0.692313 +vn -0.316531 0.555605 0.768838 +vn -0.160456 0.555605 0.815817 +vn 0.001785 0.555605 0.831445 +vn 0.163958 0.555605 0.815120 +vn 0.319830 0.555605 0.767471 +vn 0.463410 0.555605 0.690329 +vn 0.589183 0.555605 0.586657 +vn 0.692313 0.555605 0.460441 +vn 0.768838 0.555605 0.316530 +vn 0.815817 0.555605 0.160455 +vn 0.831445 0.555605 -0.001786 +vn 0.815120 0.555605 -0.163958 +vn 0.767471 0.555605 -0.319830 +vn 0.690329 0.555605 -0.463411 +vn 0.586657 0.555605 -0.589183 +vn 0.460441 0.555605 -0.692313 +vn 0.316530 0.555605 -0.768838 +vn 0.160455 0.555605 -0.815817 +vn -0.001228 0.382713 -0.923866 +vn -0.181441 0.382713 -0.905875 +vn -0.354682 0.382713 -0.853072 +vn -0.514293 0.382713 -0.767485 +vn -0.654140 0.382713 -0.652404 +vn -0.768849 0.382713 -0.512252 +vn -0.854011 0.382713 -0.352414 +vn -0.906354 0.382713 -0.179033 +vn -0.923866 0.382713 0.001228 +vn -0.905875 0.382713 0.181441 +vn -0.853071 0.382713 0.354683 +vn -0.767485 0.382713 0.514294 +vn -0.652404 0.382713 0.654140 +vn -0.512252 0.382713 0.768849 +vn -0.352414 0.382713 0.854011 +vn -0.179033 0.382713 0.906354 +vn 0.001228 0.382713 0.923866 +vn 0.181442 0.382713 0.905875 +vn 0.354683 0.382713 0.853071 +vn 0.514294 0.382713 0.767484 +vn 0.654141 0.382713 0.652403 +vn 0.768849 0.382713 0.512251 +vn 0.854011 0.382713 0.352413 +vn 0.906354 0.382713 0.179032 +vn 0.923866 0.382713 -0.001229 +vn 0.905875 0.382713 -0.181443 +vn 0.853071 0.382713 -0.354684 +vn 0.767484 0.382713 -0.514295 +vn 0.652403 0.382713 -0.654141 +vn 0.512251 0.382713 -0.768850 +vn 0.352413 0.382713 -0.854012 +vn 0.179032 0.382713 -0.906354 +vn -0.000626 0.195108 -0.980782 +vn -0.191954 0.195108 -0.961814 +vn -0.375906 0.195108 -0.905885 +vn -0.545413 0.195108 -0.815143 +vn -0.693959 0.195108 -0.693075 +vn -0.815837 0.195108 -0.544373 +vn -0.906363 0.195108 -0.374751 +vn -0.962058 0.195108 -0.190728 +vn -0.980782 0.195108 0.000625 +vn -0.961814 0.195108 0.191954 +vn -0.905885 0.195108 0.375907 +vn -0.815143 0.195108 0.545413 +vn -0.693075 0.195108 0.693960 +vn -0.544373 0.195108 0.815838 +vn -0.374751 0.195108 0.906364 +vn -0.190727 0.195108 0.962058 +vn 0.000626 0.195108 0.980782 +vn 0.191955 0.195108 0.961814 +vn 0.375907 0.195108 0.905884 +vn 0.545414 0.195108 0.815142 +vn 0.693960 0.195108 0.693075 +vn 0.815838 0.195108 0.544372 +vn 0.906364 0.195108 0.374750 +vn 0.962058 0.195108 0.190727 +vn 0.980782 0.195108 -0.000627 +vn 0.961814 0.195108 -0.191956 +vn 0.905884 0.195108 -0.375908 +vn 0.815142 0.195108 -0.545414 +vn 0.693074 0.195108 -0.693961 +vn 0.544372 0.195108 -0.815839 +vn 0.374750 0.195108 -0.906364 +vn 0.190726 0.195108 -0.962058 +vn -0.000000 -0.000000 -1.000000 +vn -0.195090 -0.000000 -0.980785 +vn -0.382683 0.000000 -0.923880 +vn -0.555570 0.000000 -0.831470 +vn -0.707107 0.000000 -0.707107 +vn -0.831470 0.000000 -0.555570 +vn -0.923880 0.000000 -0.382683 +vn -0.980785 0.000000 -0.195090 +vn -1.000000 0.000000 0.000000 +vn -0.980785 -0.000000 0.195091 +vn -0.923879 0.000000 0.382684 +vn -0.831469 0.000000 0.555571 +vn -0.707106 0.000000 0.707107 +vn -0.555570 0.000000 0.831470 +vn -0.382683 -0.000000 0.923880 +vn -0.195089 0.000000 0.980785 +vn 0.000001 -0.000000 1.000000 +vn 0.195091 0.000000 0.980785 +vn 0.382685 0.000000 0.923879 +vn 0.555571 0.000000 0.831469 +vn 0.707108 0.000000 0.707106 +vn 0.831470 0.000000 0.555569 +vn 0.923880 0.000000 0.382682 +vn 0.980786 0.000000 0.195089 +vn 1.000000 0.000000 -0.000002 +vn 0.980785 -0.000000 -0.195092 +vn 0.923879 0.000000 -0.382685 +vn 0.831469 0.000000 -0.555572 +vn 0.707106 0.000000 -0.707108 +vn 0.555569 0.000000 -0.831471 +vn 0.382681 0.000000 -0.923880 +vn 0.195089 0.000000 -0.980786 +vn 0.000624 -0.195108 -0.980782 +vn -0.190728 -0.195108 -0.962058 +vn -0.374751 -0.195108 -0.906363 +vn -0.544373 -0.195107 -0.815837 +vn -0.693075 -0.195107 -0.693959 +vn -0.815143 -0.195108 -0.545413 +vn -0.905885 -0.195108 -0.375906 +vn -0.961814 -0.195107 -0.191954 +vn -0.980782 -0.195107 -0.000625 +vn -0.962058 -0.195107 0.190728 +vn -0.906363 -0.195107 0.374752 +vn -0.815837 -0.195108 0.544374 +vn -0.693959 -0.195108 0.693076 +vn -0.545412 -0.195107 0.815143 +vn -0.375906 -0.195107 0.905885 +vn -0.191953 -0.195108 0.961814 +vn -0.000624 -0.195107 0.980782 +vn 0.190729 -0.195107 0.962058 +vn 0.374753 -0.195107 0.906363 +vn 0.544374 -0.195107 0.815837 +vn 0.693076 -0.195108 0.693959 +vn 0.815144 -0.195108 0.545412 +vn 0.905885 -0.195108 0.375905 +vn 0.961815 -0.195108 0.191953 +vn 0.980782 -0.195108 0.000623 +vn 0.962058 -0.195107 -0.190730 +vn 0.906363 -0.195108 -0.374753 +vn 0.815836 -0.195107 -0.544375 +vn 0.693958 -0.195107 -0.693077 +vn 0.545411 -0.195108 -0.815144 +vn 0.375904 -0.195107 -0.905886 +vn 0.191953 -0.195107 -0.961815 +vn 0.001227 -0.382713 -0.923866 +vn -0.179034 -0.382713 -0.906354 +vn -0.352414 -0.382713 -0.854011 +vn -0.512252 -0.382713 -0.768849 +vn -0.652404 -0.382713 -0.654140 +vn -0.767485 -0.382713 -0.514293 +vn -0.853072 -0.382713 -0.354682 +vn -0.905875 -0.382713 -0.181441 +vn -0.923866 -0.382713 -0.001227 +vn -0.906354 -0.382713 0.179034 +vn -0.854011 -0.382713 0.352415 +vn -0.768848 -0.382713 0.512253 +vn -0.654140 -0.382713 0.652405 +vn -0.514293 -0.382713 0.767485 +vn -0.354682 -0.382713 0.853072 +vn -0.181440 -0.382713 0.905875 +vn -0.001227 -0.382713 0.923866 +vn 0.179035 -0.382713 0.906354 +vn 0.352415 -0.382713 0.854011 +vn 0.512253 -0.382713 0.768848 +vn 0.652405 -0.382713 0.654139 +vn 0.767486 -0.382713 0.514292 +vn 0.853072 -0.382713 0.354681 +vn 0.905875 -0.382713 0.181440 +vn 0.923866 -0.382713 0.001226 +vn 0.906354 -0.382713 -0.179035 +vn 0.854010 -0.382713 -0.352416 +vn 0.768848 -0.382713 -0.512254 +vn 0.654139 -0.382713 -0.652406 +vn 0.514292 -0.382713 -0.767486 +vn 0.354681 -0.382713 -0.853072 +vn 0.181440 -0.382713 -0.905875 +vn 0.001784 -0.555605 -0.831445 +vn -0.160456 -0.555605 -0.815817 +vn -0.316531 -0.555605 -0.768838 +vn -0.460442 -0.555605 -0.692312 +vn -0.586658 -0.555605 -0.589182 +vn -0.690329 -0.555605 -0.463410 +vn -0.767472 -0.555605 -0.319829 +vn -0.815121 -0.555605 -0.163957 +vn -0.831445 -0.555605 -0.001784 +vn -0.815817 -0.555605 0.160457 +vn -0.768837 -0.555605 0.316532 +vn -0.692312 -0.555605 0.460442 +vn -0.589182 -0.555605 0.586659 +vn -0.463409 -0.555605 0.690330 +vn -0.319828 -0.555605 0.767472 +vn -0.163956 -0.555605 0.815121 +vn -0.001784 -0.555605 0.831445 +vn 0.160457 -0.555605 0.815817 +vn 0.316532 -0.555605 0.768837 +vn 0.460443 -0.555605 0.692312 +vn 0.586659 -0.555605 0.589181 +vn 0.690330 -0.555605 0.463409 +vn 0.767472 -0.555605 0.319828 +vn 0.815121 -0.555605 0.163956 +vn 0.831445 -0.555605 0.001783 +vn 0.815816 -0.555605 -0.160458 +vn 0.768837 -0.555605 -0.316533 +vn 0.692312 -0.555605 -0.460443 +vn 0.589181 -0.555605 -0.586659 +vn 0.463408 -0.555605 -0.690330 +vn 0.319827 -0.555605 -0.767472 +vn 0.163956 -0.555605 -0.815121 +vn 0.002275 -0.707138 -0.707072 +vn -0.135711 -0.707138 -0.693930 +vn -0.268483 -0.707138 -0.654120 +vn -0.390936 -0.707138 -0.589173 +vn -0.498367 -0.707138 -0.501585 +vn -0.586645 -0.707138 -0.394720 +vn -0.652379 -0.707138 -0.272687 +vn -0.693042 -0.707138 -0.140175 +vn -0.707072 -0.707138 -0.002275 +vn -0.693930 -0.707138 0.135711 +vn -0.654120 -0.707138 0.268483 +vn -0.589173 -0.707138 0.390936 +vn -0.501584 -0.707138 0.498367 +vn -0.394720 -0.707138 0.586645 +vn -0.272687 -0.707138 0.652379 +vn -0.140174 -0.707138 0.693042 +vn -0.002275 -0.707138 0.707072 +vn 0.135712 -0.707138 0.693930 +vn 0.268483 -0.707138 0.654120 +vn 0.390937 -0.707138 0.589173 +vn 0.498367 -0.707138 0.501584 +vn 0.586645 -0.707138 0.394719 +vn 0.652379 -0.707138 0.272686 +vn 0.693042 -0.707138 0.140174 +vn 0.707072 -0.707138 0.002274 +vn 0.693930 -0.707138 -0.135712 +vn 0.654120 -0.707138 -0.268484 +vn 0.589173 -0.707138 -0.390937 +vn 0.501584 -0.707138 -0.498367 +vn 0.394719 -0.707138 -0.586646 +vn 0.272686 -0.707138 -0.652379 +vn 0.140174 -0.707138 -0.693042 +vn 0.002680 -0.831490 -0.555533 +vn -0.105750 -0.831490 -0.545381 +vn -0.210117 -0.831490 -0.514271 +vn -0.306408 -0.831490 -0.463398 +vn -0.390925 -0.831490 -0.394716 +vn -0.460419 -0.831490 -0.310866 +vn -0.512219 -0.831490 -0.215070 +vn -0.544335 -0.831490 -0.111008 +vn -0.555533 -0.831490 -0.002680 +vn -0.545381 -0.831490 0.105750 +vn -0.514271 -0.831490 0.210117 +vn -0.463398 -0.831490 0.306409 +vn -0.394716 -0.831490 0.390926 +vn -0.310866 -0.831490 0.460419 +vn -0.215069 -0.831491 0.512219 +vn -0.111008 -0.831490 0.544335 +vn -0.002680 -0.831490 0.555533 +vn 0.105750 -0.831490 0.545381 +vn 0.210117 -0.831490 0.514271 +vn 0.306409 -0.831490 0.463397 +vn 0.390926 -0.831490 0.394716 +vn 0.460420 -0.831490 0.310866 +vn 0.512220 -0.831490 0.215069 +vn 0.544335 -0.831490 0.111007 +vn 0.555533 -0.831490 0.002680 +vn 0.545381 -0.831490 -0.105751 +vn 0.514271 -0.831490 -0.210117 +vn 0.463397 -0.831491 -0.306409 +vn 0.394716 -0.831491 -0.390926 +vn 0.310865 -0.831490 -0.460420 +vn 0.215069 -0.831490 -0.512220 +vn 0.111007 -0.831490 -0.544335 +vn 0.002983 -0.923888 -0.382651 +vn -0.071726 -0.923888 -0.375880 +vn -0.143678 -0.923888 -0.354665 +vn -0.210109 -0.923888 -0.319820 +vn -0.268466 -0.923888 -0.272685 +vn -0.316505 -0.923888 -0.215070 +vn -0.352382 -0.923888 -0.149190 +vn -0.374717 -0.923888 -0.077577 +vn -0.382651 -0.923888 -0.002983 +vn -0.375880 -0.923888 0.071726 +vn -0.354665 -0.923888 0.143678 +vn -0.319820 -0.923888 0.210109 +vn -0.272684 -0.923888 0.268466 +vn -0.215070 -0.923888 0.316506 +vn -0.149190 -0.923888 0.352382 +vn -0.077577 -0.923888 0.374717 +vn -0.002983 -0.923888 0.382651 +vn 0.071726 -0.923888 0.375880 +vn 0.143679 -0.923888 0.354665 +vn 0.210109 -0.923888 0.319820 +vn 0.268466 -0.923888 0.272684 +vn 0.316506 -0.923888 0.215069 +vn 0.352382 -0.923888 0.149190 +vn 0.374717 -0.923888 0.077577 +vn 0.382651 -0.923888 0.002983 +vn 0.375880 -0.923888 -0.071726 +vn 0.354665 -0.923888 -0.143679 +vn 0.319820 -0.923888 -0.210110 +vn 0.272684 -0.923888 -0.268466 +vn 0.215069 -0.923888 -0.316506 +vn 0.149190 -0.923888 -0.352382 +vn 0.077577 -0.923888 -0.374717 +vn 0.005744 -0.976740 -0.214348 +vn -0.036184 -0.976740 -0.211350 +vn -0.076721 -0.976740 -0.200230 +vn -0.114310 -0.976740 -0.181415 +vn -0.147505 -0.976740 -0.155628 +vn -0.175033 -0.976740 -0.123861 +vn -0.195834 -0.976740 -0.087334 +vn -0.209109 -0.976740 -0.047451 +vn -0.214348 -0.976740 -0.005744 +vn -0.211350 -0.976740 0.036184 +vn -0.200230 -0.976740 0.076721 +vn -0.181415 -0.976740 0.114310 +vn -0.155628 -0.976740 0.147506 +vn -0.123861 -0.976740 0.175033 +vn -0.087334 -0.976740 0.195834 +vn -0.047450 -0.976740 0.209109 +vn -0.005744 -0.976740 0.214348 +vn 0.036184 -0.976740 0.211350 +vn 0.076721 -0.976740 0.200230 +vn 0.114310 -0.976740 0.181415 +vn 0.147506 -0.976740 0.155628 +vn 0.175033 -0.976740 0.123861 +vn 0.195834 -0.976740 0.087334 +vn 0.209109 -0.976740 0.047450 +vn 0.214348 -0.976740 0.005743 +vn 0.211350 -0.976740 -0.036184 +vn 0.200230 -0.976740 -0.076721 +vn 0.181415 -0.976740 -0.114310 +vn 0.155628 -0.976740 -0.147506 +vn 0.123861 -0.976740 -0.175033 +vn 0.087334 -0.976740 -0.195834 +vn 0.047450 -0.976740 -0.209109 +vn 0.000000 -1.000000 -0.000000 +# 482 vertex normals + +g default +s 1 +f 1/1/1 2/34/2 3/35/3 +f 1/2/1 3/35/3 4/36/4 +f 1/3/1 4/36/4 5/37/5 +f 1/4/1 5/37/5 6/38/6 +f 1/5/1 6/38/6 7/39/7 +f 1/6/1 7/39/7 8/40/8 +f 1/7/1 8/40/8 9/41/9 +f 1/8/1 9/41/9 10/42/10 +f 1/9/1 10/42/10 11/43/11 +f 1/10/1 11/43/11 12/44/12 +f 1/11/1 12/44/12 13/45/13 +f 1/12/1 13/45/13 14/46/14 +f 1/13/1 14/46/14 15/47/15 +f 1/14/1 15/47/15 16/48/16 +f 1/15/1 16/48/16 17/49/17 +f 1/16/1 17/49/17 18/50/18 +f 1/17/1 18/50/18 19/51/19 +f 1/18/1 19/51/19 20/52/20 +f 1/19/1 20/52/20 21/53/21 +f 1/20/1 21/53/21 22/54/22 +f 1/21/1 22/54/22 23/55/23 +f 1/22/1 23/55/23 24/56/24 +f 1/23/1 24/56/24 25/57/25 +f 1/24/1 25/57/25 26/58/26 +f 1/25/1 26/58/26 27/59/27 +f 1/26/1 27/59/27 28/60/28 +f 1/27/1 28/60/28 29/61/29 +f 1/28/1 29/61/29 30/62/30 +f 1/29/1 30/62/30 31/63/31 +f 1/30/1 31/63/31 32/64/32 +f 1/31/1 32/64/32 33/65/33 +f 1/32/1 33/65/33 2/66/2 +f 2/34/2 34/67/34 35/68/35 +f 2/34/2 35/68/35 3/35/3 +f 3/35/3 35/68/35 36/69/36 +f 3/35/3 36/69/36 4/36/4 +f 4/36/4 36/69/36 37/70/37 +f 4/36/4 37/70/37 5/37/5 +f 5/37/5 37/70/37 38/71/38 +f 5/37/5 38/71/38 6/38/6 +f 6/38/6 38/71/38 39/72/39 +f 6/38/6 39/72/39 7/39/7 +f 7/39/7 39/72/39 40/73/40 +f 7/39/7 40/73/40 8/40/8 +f 8/40/8 40/73/40 41/74/41 +f 8/40/8 41/74/41 9/41/9 +f 9/41/9 41/74/41 42/75/42 +f 9/41/9 42/75/42 10/42/10 +f 10/42/10 42/75/42 43/76/43 +f 10/42/10 43/76/43 11/43/11 +f 11/43/11 43/76/43 44/77/44 +f 11/43/11 44/77/44 12/44/12 +f 12/44/12 44/77/44 45/78/45 +f 12/44/12 45/78/45 13/45/13 +f 13/45/13 45/78/45 46/79/46 +f 13/45/13 46/79/46 14/46/14 +f 14/46/14 46/79/46 47/80/47 +f 14/46/14 47/80/47 15/47/15 +f 15/47/15 47/80/47 48/81/48 +f 15/47/15 48/81/48 16/48/16 +f 16/48/16 48/81/48 49/82/49 +f 16/48/16 49/82/49 17/49/17 +f 17/49/17 49/82/49 50/83/50 +f 17/49/17 50/83/50 18/50/18 +f 18/50/18 50/83/50 51/84/51 +f 18/50/18 51/84/51 19/51/19 +f 19/51/19 51/84/51 52/85/52 +f 19/51/19 52/85/52 20/52/20 +f 20/52/20 52/85/52 53/86/53 +f 20/52/20 53/86/53 21/53/21 +f 21/53/21 53/86/53 54/87/54 +f 21/53/21 54/87/54 22/54/22 +f 22/54/22 54/87/54 55/88/55 +f 22/54/22 55/88/55 23/55/23 +f 23/55/23 55/88/55 56/89/56 +f 23/55/23 56/89/56 24/56/24 +f 24/56/24 56/89/56 57/90/57 +f 24/56/24 57/90/57 25/57/25 +f 25/57/25 57/90/57 58/91/58 +f 25/57/25 58/91/58 26/58/26 +f 26/58/26 58/91/58 59/92/59 +f 26/58/26 59/92/59 27/59/27 +f 27/59/27 59/92/59 60/93/60 +f 27/59/27 60/93/60 28/60/28 +f 28/60/28 60/93/60 61/94/61 +f 28/60/28 61/94/61 29/61/29 +f 29/61/29 61/94/61 62/95/62 +f 29/61/29 62/95/62 30/62/30 +f 30/62/30 62/95/62 63/96/63 +f 30/62/30 63/96/63 31/63/31 +f 31/63/31 63/96/63 64/97/64 +f 31/63/31 64/97/64 32/64/32 +f 32/64/32 64/97/64 65/98/65 +f 32/64/32 65/98/65 33/65/33 +f 33/65/33 65/98/65 34/99/34 +f 33/65/33 34/99/34 2/66/2 +f 34/67/34 66/100/66 67/101/67 +f 34/67/34 67/101/67 35/68/35 +f 35/68/35 67/101/67 68/102/68 +f 35/68/35 68/102/68 36/69/36 +f 36/69/36 68/102/68 69/103/69 +f 36/69/36 69/103/69 37/70/37 +f 37/70/37 69/103/69 70/104/70 +f 37/70/37 70/104/70 38/71/38 +f 38/71/38 70/104/70 71/105/71 +f 38/71/38 71/105/71 39/72/39 +f 39/72/39 71/105/71 72/106/72 +f 39/72/39 72/106/72 40/73/40 +f 40/73/40 72/106/72 73/107/73 +f 40/73/40 73/107/73 41/74/41 +f 41/74/41 73/107/73 74/108/74 +f 41/74/41 74/108/74 42/75/42 +f 42/75/42 74/108/74 75/109/75 +f 42/75/42 75/109/75 43/76/43 +f 43/76/43 75/109/75 76/110/76 +f 43/76/43 76/110/76 44/77/44 +f 44/77/44 76/110/76 77/111/77 +f 44/77/44 77/111/77 45/78/45 +f 45/78/45 77/111/77 78/112/78 +f 45/78/45 78/112/78 46/79/46 +f 46/79/46 78/112/78 79/113/79 +f 46/79/46 79/113/79 47/80/47 +f 47/80/47 79/113/79 80/114/80 +f 47/80/47 80/114/80 48/81/48 +f 48/81/48 80/114/80 81/115/81 +f 48/81/48 81/115/81 49/82/49 +f 49/82/49 81/115/81 82/116/82 +f 49/82/49 82/116/82 50/83/50 +f 50/83/50 82/116/82 83/117/83 +f 50/83/50 83/117/83 51/84/51 +f 51/84/51 83/117/83 84/118/84 +f 51/84/51 84/118/84 52/85/52 +f 52/85/52 84/118/84 85/119/85 +f 52/85/52 85/119/85 53/86/53 +f 53/86/53 85/119/85 86/120/86 +f 53/86/53 86/120/86 54/87/54 +f 54/87/54 86/120/86 87/121/87 +f 54/87/54 87/121/87 55/88/55 +f 55/88/55 87/121/87 88/122/88 +f 55/88/55 88/122/88 56/89/56 +f 56/89/56 88/122/88 89/123/89 +f 56/89/56 89/123/89 57/90/57 +f 57/90/57 89/123/89 90/124/90 +f 57/90/57 90/124/90 58/91/58 +f 58/91/58 90/124/90 91/125/91 +f 58/91/58 91/125/91 59/92/59 +f 59/92/59 91/125/91 92/126/92 +f 59/92/59 92/126/92 60/93/60 +f 60/93/60 92/126/92 93/127/93 +f 60/93/60 93/127/93 61/94/61 +f 61/94/61 93/127/93 94/128/94 +f 61/94/61 94/128/94 62/95/62 +f 62/95/62 94/128/94 95/129/95 +f 62/95/62 95/129/95 63/96/63 +f 63/96/63 95/129/95 96/130/96 +f 63/96/63 96/130/96 64/97/64 +f 64/97/64 96/130/96 97/131/97 +f 64/97/64 97/131/97 65/98/65 +f 65/98/65 97/131/97 66/132/66 +f 65/98/65 66/132/66 34/99/34 +f 66/100/66 98/133/98 99/134/99 +f 66/100/66 99/134/99 67/101/67 +f 67/101/67 99/134/99 100/135/100 +f 67/101/67 100/135/100 68/102/68 +f 68/102/68 100/135/100 101/136/101 +f 68/102/68 101/136/101 69/103/69 +f 69/103/69 101/136/101 102/137/102 +f 69/103/69 102/137/102 70/104/70 +f 70/104/70 102/137/102 103/138/103 +f 70/104/70 103/138/103 71/105/71 +f 71/105/71 103/138/103 104/139/104 +f 71/105/71 104/139/104 72/106/72 +f 72/106/72 104/139/104 105/140/105 +f 72/106/72 105/140/105 73/107/73 +f 73/107/73 105/140/105 106/141/106 +f 73/107/73 106/141/106 74/108/74 +f 74/108/74 106/141/106 107/142/107 +f 74/108/74 107/142/107 75/109/75 +f 75/109/75 107/142/107 108/143/108 +f 75/109/75 108/143/108 76/110/76 +f 76/110/76 108/143/108 109/144/109 +f 76/110/76 109/144/109 77/111/77 +f 77/111/77 109/144/109 110/145/110 +f 77/111/77 110/145/110 78/112/78 +f 78/112/78 110/145/110 111/146/111 +f 78/112/78 111/146/111 79/113/79 +f 79/113/79 111/146/111 112/147/112 +f 79/113/79 112/147/112 80/114/80 +f 80/114/80 112/147/112 113/148/113 +f 80/114/80 113/148/113 81/115/81 +f 81/115/81 113/148/113 114/149/114 +f 81/115/81 114/149/114 82/116/82 +f 82/116/82 114/149/114 115/150/115 +f 82/116/82 115/150/115 83/117/83 +f 83/117/83 115/150/115 116/151/116 +f 83/117/83 116/151/116 84/118/84 +f 84/118/84 116/151/116 117/152/117 +f 84/118/84 117/152/117 85/119/85 +f 85/119/85 117/152/117 118/153/118 +f 85/119/85 118/153/118 86/120/86 +f 86/120/86 118/153/118 119/154/119 +f 86/120/86 119/154/119 87/121/87 +f 87/121/87 119/154/119 120/155/120 +f 87/121/87 120/155/120 88/122/88 +f 88/122/88 120/155/120 121/156/121 +f 88/122/88 121/156/121 89/123/89 +f 89/123/89 121/156/121 122/157/122 +f 89/123/89 122/157/122 90/124/90 +f 90/124/90 122/157/122 123/158/123 +f 90/124/90 123/158/123 91/125/91 +f 91/125/91 123/158/123 124/159/124 +f 91/125/91 124/159/124 92/126/92 +f 92/126/92 124/159/124 125/160/125 +f 92/126/92 125/160/125 93/127/93 +f 93/127/93 125/160/125 126/161/126 +f 93/127/93 126/161/126 94/128/94 +f 94/128/94 126/161/126 127/162/127 +f 94/128/94 127/162/127 95/129/95 +f 95/129/95 127/162/127 128/163/128 +f 95/129/95 128/163/128 96/130/96 +f 96/130/96 128/163/128 129/164/129 +f 96/130/96 129/164/129 97/131/97 +f 97/131/97 129/164/129 98/165/98 +f 97/131/97 98/165/98 66/132/66 +f 98/133/98 130/166/130 131/167/131 +f 98/133/98 131/167/131 99/134/99 +f 99/134/99 131/167/131 132/168/132 +f 99/134/99 132/168/132 100/135/100 +f 100/135/100 132/168/132 133/169/133 +f 100/135/100 133/169/133 101/136/101 +f 101/136/101 133/169/133 134/170/134 +f 101/136/101 134/170/134 102/137/102 +f 102/137/102 134/170/134 135/171/135 +f 102/137/102 135/171/135 103/138/103 +f 103/138/103 135/171/135 136/172/136 +f 103/138/103 136/172/136 104/139/104 +f 104/139/104 136/172/136 137/173/137 +f 104/139/104 137/173/137 105/140/105 +f 105/140/105 137/173/137 138/174/138 +f 105/140/105 138/174/138 106/141/106 +f 106/141/106 138/174/138 139/175/139 +f 106/141/106 139/175/139 107/142/107 +f 107/142/107 139/175/139 140/176/140 +f 107/142/107 140/176/140 108/143/108 +f 108/143/108 140/176/140 141/177/141 +f 108/143/108 141/177/141 109/144/109 +f 109/144/109 141/177/141 142/178/142 +f 109/144/109 142/178/142 110/145/110 +f 110/145/110 142/178/142 143/179/143 +f 110/145/110 143/179/143 111/146/111 +f 111/146/111 143/179/143 144/180/144 +f 111/146/111 144/180/144 112/147/112 +f 112/147/112 144/180/144 145/181/145 +f 112/147/112 145/181/145 113/148/113 +f 113/148/113 145/181/145 146/182/146 +f 113/148/113 146/182/146 114/149/114 +f 114/149/114 146/182/146 147/183/147 +f 114/149/114 147/183/147 115/150/115 +f 115/150/115 147/183/147 148/184/148 +f 115/150/115 148/184/148 116/151/116 +f 116/151/116 148/184/148 149/185/149 +f 116/151/116 149/185/149 117/152/117 +f 117/152/117 149/185/149 150/186/150 +f 117/152/117 150/186/150 118/153/118 +f 118/153/118 150/186/150 151/187/151 +f 118/153/118 151/187/151 119/154/119 +f 119/154/119 151/187/151 152/188/152 +f 119/154/119 152/188/152 120/155/120 +f 120/155/120 152/188/152 153/189/153 +f 120/155/120 153/189/153 121/156/121 +f 121/156/121 153/189/153 154/190/154 +f 121/156/121 154/190/154 122/157/122 +f 122/157/122 154/190/154 155/191/155 +f 122/157/122 155/191/155 123/158/123 +f 123/158/123 155/191/155 156/192/156 +f 123/158/123 156/192/156 124/159/124 +f 124/159/124 156/192/156 157/193/157 +f 124/159/124 157/193/157 125/160/125 +f 125/160/125 157/193/157 158/194/158 +f 125/160/125 158/194/158 126/161/126 +f 126/161/126 158/194/158 159/195/159 +f 126/161/126 159/195/159 127/162/127 +f 127/162/127 159/195/159 160/196/160 +f 127/162/127 160/196/160 128/163/128 +f 128/163/128 160/196/160 161/197/161 +f 128/163/128 161/197/161 129/164/129 +f 129/164/129 161/197/161 130/198/130 +f 129/164/129 130/198/130 98/165/98 +f 130/166/130 162/199/162 163/200/163 +f 130/166/130 163/200/163 131/167/131 +f 131/167/131 163/200/163 164/201/164 +f 131/167/131 164/201/164 132/168/132 +f 132/168/132 164/201/164 165/202/165 +f 132/168/132 165/202/165 133/169/133 +f 133/169/133 165/202/165 166/203/166 +f 133/169/133 166/203/166 134/170/134 +f 134/170/134 166/203/166 167/204/167 +f 134/170/134 167/204/167 135/171/135 +f 135/171/135 167/204/167 168/205/168 +f 135/171/135 168/205/168 136/172/136 +f 136/172/136 168/205/168 169/206/169 +f 136/172/136 169/206/169 137/173/137 +f 137/173/137 169/206/169 170/207/170 +f 137/173/137 170/207/170 138/174/138 +f 138/174/138 170/207/170 171/208/171 +f 138/174/138 171/208/171 139/175/139 +f 139/175/139 171/208/171 172/209/172 +f 139/175/139 172/209/172 140/176/140 +f 140/176/140 172/209/172 173/210/173 +f 140/176/140 173/210/173 141/177/141 +f 141/177/141 173/210/173 174/211/174 +f 141/177/141 174/211/174 142/178/142 +f 142/178/142 174/211/174 175/212/175 +f 142/178/142 175/212/175 143/179/143 +f 143/179/143 175/212/175 176/213/176 +f 143/179/143 176/213/176 144/180/144 +f 144/180/144 176/213/176 177/214/177 +f 144/180/144 177/214/177 145/181/145 +f 145/181/145 177/214/177 178/215/178 +f 145/181/145 178/215/178 146/182/146 +f 146/182/146 178/215/178 179/216/179 +f 146/182/146 179/216/179 147/183/147 +f 147/183/147 179/216/179 180/217/180 +f 147/183/147 180/217/180 148/184/148 +f 148/184/148 180/217/180 181/218/181 +f 148/184/148 181/218/181 149/185/149 +f 149/185/149 181/218/181 182/219/182 +f 149/185/149 182/219/182 150/186/150 +f 150/186/150 182/219/182 183/220/183 +f 150/186/150 183/220/183 151/187/151 +f 151/187/151 183/220/183 184/221/184 +f 151/187/151 184/221/184 152/188/152 +f 152/188/152 184/221/184 185/222/185 +f 152/188/152 185/222/185 153/189/153 +f 153/189/153 185/222/185 186/223/186 +f 153/189/153 186/223/186 154/190/154 +f 154/190/154 186/223/186 187/224/187 +f 154/190/154 187/224/187 155/191/155 +f 155/191/155 187/224/187 188/225/188 +f 155/191/155 188/225/188 156/192/156 +f 156/192/156 188/225/188 189/226/189 +f 156/192/156 189/226/189 157/193/157 +f 157/193/157 189/226/189 190/227/190 +f 157/193/157 190/227/190 158/194/158 +f 158/194/158 190/227/190 191/228/191 +f 158/194/158 191/228/191 159/195/159 +f 159/195/159 191/228/191 192/229/192 +f 159/195/159 192/229/192 160/196/160 +f 160/196/160 192/229/192 193/230/193 +f 160/196/160 193/230/193 161/197/161 +f 161/197/161 193/230/193 162/231/162 +f 161/197/161 162/231/162 130/198/130 +f 162/199/162 194/232/194 195/233/195 +f 162/199/162 195/233/195 163/200/163 +f 163/200/163 195/233/195 196/234/196 +f 163/200/163 196/234/196 164/201/164 +f 164/201/164 196/234/196 197/235/197 +f 164/201/164 197/235/197 165/202/165 +f 165/202/165 197/235/197 198/236/198 +f 165/202/165 198/236/198 166/203/166 +f 166/203/166 198/236/198 199/237/199 +f 166/203/166 199/237/199 167/204/167 +f 167/204/167 199/237/199 200/238/200 +f 167/204/167 200/238/200 168/205/168 +f 168/205/168 200/238/200 201/239/201 +f 168/205/168 201/239/201 169/206/169 +f 169/206/169 201/239/201 202/240/202 +f 169/206/169 202/240/202 170/207/170 +f 170/207/170 202/240/202 203/241/203 +f 170/207/170 203/241/203 171/208/171 +f 171/208/171 203/241/203 204/242/204 +f 171/208/171 204/242/204 172/209/172 +f 172/209/172 204/242/204 205/243/205 +f 172/209/172 205/243/205 173/210/173 +f 173/210/173 205/243/205 206/244/206 +f 173/210/173 206/244/206 174/211/174 +f 174/211/174 206/244/206 207/245/207 +f 174/211/174 207/245/207 175/212/175 +f 175/212/175 207/245/207 208/246/208 +f 175/212/175 208/246/208 176/213/176 +f 176/213/176 208/246/208 209/247/209 +f 176/213/176 209/247/209 177/214/177 +f 177/214/177 209/247/209 210/248/210 +f 177/214/177 210/248/210 178/215/178 +f 178/215/178 210/248/210 211/249/211 +f 178/215/178 211/249/211 179/216/179 +f 179/216/179 211/249/211 212/250/212 +f 179/216/179 212/250/212 180/217/180 +f 180/217/180 212/250/212 213/251/213 +f 180/217/180 213/251/213 181/218/181 +f 181/218/181 213/251/213 214/252/214 +f 181/218/181 214/252/214 182/219/182 +f 182/219/182 214/252/214 215/253/215 +f 182/219/182 215/253/215 183/220/183 +f 183/220/183 215/253/215 216/254/216 +f 183/220/183 216/254/216 184/221/184 +f 184/221/184 216/254/216 217/255/217 +f 184/221/184 217/255/217 185/222/185 +f 185/222/185 217/255/217 218/256/218 +f 185/222/185 218/256/218 186/223/186 +f 186/223/186 218/256/218 219/257/219 +f 186/223/186 219/257/219 187/224/187 +f 187/224/187 219/257/219 220/258/220 +f 187/224/187 220/258/220 188/225/188 +f 188/225/188 220/258/220 221/259/221 +f 188/225/188 221/259/221 189/226/189 +f 189/226/189 221/259/221 222/260/222 +f 189/226/189 222/260/222 190/227/190 +f 190/227/190 222/260/222 223/261/223 +f 190/227/190 223/261/223 191/228/191 +f 191/228/191 223/261/223 224/262/224 +f 191/228/191 224/262/224 192/229/192 +f 192/229/192 224/262/224 225/263/225 +f 192/229/192 225/263/225 193/230/193 +f 193/230/193 225/263/225 194/264/194 +f 193/230/193 194/264/194 162/231/162 +f 194/232/194 226/265/226 227/266/227 +f 194/232/194 227/266/227 195/233/195 +f 195/233/195 227/266/227 228/267/228 +f 195/233/195 228/267/228 196/234/196 +f 196/234/196 228/267/228 229/268/229 +f 196/234/196 229/268/229 197/235/197 +f 197/235/197 229/268/229 230/269/230 +f 197/235/197 230/269/230 198/236/198 +f 198/236/198 230/269/230 231/270/231 +f 198/236/198 231/270/231 199/237/199 +f 199/237/199 231/270/231 232/271/232 +f 199/237/199 232/271/232 200/238/200 +f 200/238/200 232/271/232 233/272/233 +f 200/238/200 233/272/233 201/239/201 +f 201/239/201 233/272/233 234/273/234 +f 201/239/201 234/273/234 202/240/202 +f 202/240/202 234/273/234 235/274/235 +f 202/240/202 235/274/235 203/241/203 +f 203/241/203 235/274/235 236/275/236 +f 203/241/203 236/275/236 204/242/204 +f 204/242/204 236/275/236 237/276/237 +f 204/242/204 237/276/237 205/243/205 +f 205/243/205 237/276/237 238/277/238 +f 205/243/205 238/277/238 206/244/206 +f 206/244/206 238/277/238 239/278/239 +f 206/244/206 239/278/239 207/245/207 +f 207/245/207 239/278/239 240/279/240 +f 207/245/207 240/279/240 208/246/208 +f 208/246/208 240/279/240 241/280/241 +f 208/246/208 241/280/241 209/247/209 +f 209/247/209 241/280/241 242/281/242 +f 209/247/209 242/281/242 210/248/210 +f 210/248/210 242/281/242 243/282/243 +f 210/248/210 243/282/243 211/249/211 +f 211/249/211 243/282/243 244/283/244 +f 211/249/211 244/283/244 212/250/212 +f 212/250/212 244/283/244 245/284/245 +f 212/250/212 245/284/245 213/251/213 +f 213/251/213 245/284/245 246/285/246 +f 213/251/213 246/285/246 214/252/214 +f 214/252/214 246/285/246 247/286/247 +f 214/252/214 247/286/247 215/253/215 +f 215/253/215 247/286/247 248/287/248 +f 215/253/215 248/287/248 216/254/216 +f 216/254/216 248/287/248 249/288/249 +f 216/254/216 249/288/249 217/255/217 +f 217/255/217 249/288/249 250/289/250 +f 217/255/217 250/289/250 218/256/218 +f 218/256/218 250/289/250 251/290/251 +f 218/256/218 251/290/251 219/257/219 +f 219/257/219 251/290/251 252/291/252 +f 219/257/219 252/291/252 220/258/220 +f 220/258/220 252/291/252 253/292/253 +f 220/258/220 253/292/253 221/259/221 +f 221/259/221 253/292/253 254/293/254 +f 221/259/221 254/293/254 222/260/222 +f 222/260/222 254/293/254 255/294/255 +f 222/260/222 255/294/255 223/261/223 +f 223/261/223 255/294/255 256/295/256 +f 223/261/223 256/295/256 224/262/224 +f 224/262/224 256/295/256 257/296/257 +f 224/262/224 257/296/257 225/263/225 +f 225/263/225 257/296/257 226/297/226 +f 225/263/225 226/297/226 194/264/194 +f 226/265/226 258/298/258 259/299/259 +f 226/265/226 259/299/259 227/266/227 +f 227/266/227 259/299/259 260/300/260 +f 227/266/227 260/300/260 228/267/228 +f 228/267/228 260/300/260 261/301/261 +f 228/267/228 261/301/261 229/268/229 +f 229/268/229 261/301/261 262/302/262 +f 229/268/229 262/302/262 230/269/230 +f 230/269/230 262/302/262 263/303/263 +f 230/269/230 263/303/263 231/270/231 +f 231/270/231 263/303/263 264/304/264 +f 231/270/231 264/304/264 232/271/232 +f 232/271/232 264/304/264 265/305/265 +f 232/271/232 265/305/265 233/272/233 +f 233/272/233 265/305/265 266/306/266 +f 233/272/233 266/306/266 234/273/234 +f 234/273/234 266/306/266 267/307/267 +f 234/273/234 267/307/267 235/274/235 +f 235/274/235 267/307/267 268/308/268 +f 235/274/235 268/308/268 236/275/236 +f 236/275/236 268/308/268 269/309/269 +f 236/275/236 269/309/269 237/276/237 +f 237/276/237 269/309/269 270/310/270 +f 237/276/237 270/310/270 238/277/238 +f 238/277/238 270/310/270 271/311/271 +f 238/277/238 271/311/271 239/278/239 +f 239/278/239 271/311/271 272/312/272 +f 239/278/239 272/312/272 240/279/240 +f 240/279/240 272/312/272 273/313/273 +f 240/279/240 273/313/273 241/280/241 +f 241/280/241 273/313/273 274/314/274 +f 241/280/241 274/314/274 242/281/242 +f 242/281/242 274/314/274 275/315/275 +f 242/281/242 275/315/275 243/282/243 +f 243/282/243 275/315/275 276/316/276 +f 243/282/243 276/316/276 244/283/244 +f 244/283/244 276/316/276 277/317/277 +f 244/283/244 277/317/277 245/284/245 +f 245/284/245 277/317/277 278/318/278 +f 245/284/245 278/318/278 246/285/246 +f 246/285/246 278/318/278 279/319/279 +f 246/285/246 279/319/279 247/286/247 +f 247/286/247 279/319/279 280/320/280 +f 247/286/247 280/320/280 248/287/248 +f 248/287/248 280/320/280 281/321/281 +f 248/287/248 281/321/281 249/288/249 +f 249/288/249 281/321/281 282/322/282 +f 249/288/249 282/322/282 250/289/250 +f 250/289/250 282/322/282 283/323/283 +f 250/289/250 283/323/283 251/290/251 +f 251/290/251 283/323/283 284/324/284 +f 251/290/251 284/324/284 252/291/252 +f 252/291/252 284/324/284 285/325/285 +f 252/291/252 285/325/285 253/292/253 +f 253/292/253 285/325/285 286/326/286 +f 253/292/253 286/326/286 254/293/254 +f 254/293/254 286/326/286 287/327/287 +f 254/293/254 287/327/287 255/294/255 +f 255/294/255 287/327/287 288/328/288 +f 255/294/255 288/328/288 256/295/256 +f 256/295/256 288/328/288 289/329/289 +f 256/295/256 289/329/289 257/296/257 +f 257/296/257 289/329/289 258/330/258 +f 257/296/257 258/330/258 226/297/226 +f 258/298/258 290/331/290 291/332/291 +f 258/298/258 291/332/291 259/299/259 +f 259/299/259 291/332/291 292/333/292 +f 259/299/259 292/333/292 260/300/260 +f 260/300/260 292/333/292 293/334/293 +f 260/300/260 293/334/293 261/301/261 +f 261/301/261 293/334/293 294/335/294 +f 261/301/261 294/335/294 262/302/262 +f 262/302/262 294/335/294 295/336/295 +f 262/302/262 295/336/295 263/303/263 +f 263/303/263 295/336/295 296/337/296 +f 263/303/263 296/337/296 264/304/264 +f 264/304/264 296/337/296 297/338/297 +f 264/304/264 297/338/297 265/305/265 +f 265/305/265 297/338/297 298/339/298 +f 265/305/265 298/339/298 266/306/266 +f 266/306/266 298/339/298 299/340/299 +f 266/306/266 299/340/299 267/307/267 +f 267/307/267 299/340/299 300/341/300 +f 267/307/267 300/341/300 268/308/268 +f 268/308/268 300/341/300 301/342/301 +f 268/308/268 301/342/301 269/309/269 +f 269/309/269 301/342/301 302/343/302 +f 269/309/269 302/343/302 270/310/270 +f 270/310/270 302/343/302 303/344/303 +f 270/310/270 303/344/303 271/311/271 +f 271/311/271 303/344/303 304/345/304 +f 271/311/271 304/345/304 272/312/272 +f 272/312/272 304/345/304 305/346/305 +f 272/312/272 305/346/305 273/313/273 +f 273/313/273 305/346/305 306/347/306 +f 273/313/273 306/347/306 274/314/274 +f 274/314/274 306/347/306 307/348/307 +f 274/314/274 307/348/307 275/315/275 +f 275/315/275 307/348/307 308/349/308 +f 275/315/275 308/349/308 276/316/276 +f 276/316/276 308/349/308 309/350/309 +f 276/316/276 309/350/309 277/317/277 +f 277/317/277 309/350/309 310/351/310 +f 277/317/277 310/351/310 278/318/278 +f 278/318/278 310/351/310 311/352/311 +f 278/318/278 311/352/311 279/319/279 +f 279/319/279 311/352/311 312/353/312 +f 279/319/279 312/353/312 280/320/280 +f 280/320/280 312/353/312 313/354/313 +f 280/320/280 313/354/313 281/321/281 +f 281/321/281 313/354/313 314/355/314 +f 281/321/281 314/355/314 282/322/282 +f 282/322/282 314/355/314 315/356/315 +f 282/322/282 315/356/315 283/323/283 +f 283/323/283 315/356/315 316/357/316 +f 283/323/283 316/357/316 284/324/284 +f 284/324/284 316/357/316 317/358/317 +f 284/324/284 317/358/317 285/325/285 +f 285/325/285 317/358/317 318/359/318 +f 285/325/285 318/359/318 286/326/286 +f 286/326/286 318/359/318 319/360/319 +f 286/326/286 319/360/319 287/327/287 +f 287/327/287 319/360/319 320/361/320 +f 287/327/287 320/361/320 288/328/288 +f 288/328/288 320/361/320 321/362/321 +f 288/328/288 321/362/321 289/329/289 +f 289/329/289 321/362/321 290/363/290 +f 289/329/289 290/363/290 258/330/258 +f 290/331/290 322/364/322 323/365/323 +f 290/331/290 323/365/323 291/332/291 +f 291/332/291 323/365/323 324/366/324 +f 291/332/291 324/366/324 292/333/292 +f 292/333/292 324/366/324 325/367/325 +f 292/333/292 325/367/325 293/334/293 +f 293/334/293 325/367/325 326/368/326 +f 293/334/293 326/368/326 294/335/294 +f 294/335/294 326/368/326 327/369/327 +f 294/335/294 327/369/327 295/336/295 +f 295/336/295 327/369/327 328/370/328 +f 295/336/295 328/370/328 296/337/296 +f 296/337/296 328/370/328 329/371/329 +f 296/337/296 329/371/329 297/338/297 +f 297/338/297 329/371/329 330/372/330 +f 297/338/297 330/372/330 298/339/298 +f 298/339/298 330/372/330 331/373/331 +f 298/339/298 331/373/331 299/340/299 +f 299/340/299 331/373/331 332/374/332 +f 299/340/299 332/374/332 300/341/300 +f 300/341/300 332/374/332 333/375/333 +f 300/341/300 333/375/333 301/342/301 +f 301/342/301 333/375/333 334/376/334 +f 301/342/301 334/376/334 302/343/302 +f 302/343/302 334/376/334 335/377/335 +f 302/343/302 335/377/335 303/344/303 +f 303/344/303 335/377/335 336/378/336 +f 303/344/303 336/378/336 304/345/304 +f 304/345/304 336/378/336 337/379/337 +f 304/345/304 337/379/337 305/346/305 +f 305/346/305 337/379/337 338/380/338 +f 305/346/305 338/380/338 306/347/306 +f 306/347/306 338/380/338 339/381/339 +f 306/347/306 339/381/339 307/348/307 +f 307/348/307 339/381/339 340/382/340 +f 307/348/307 340/382/340 308/349/308 +f 308/349/308 340/382/340 341/383/341 +f 308/349/308 341/383/341 309/350/309 +f 309/350/309 341/383/341 342/384/342 +f 309/350/309 342/384/342 310/351/310 +f 310/351/310 342/384/342 343/385/343 +f 310/351/310 343/385/343 311/352/311 +f 311/352/311 343/385/343 344/386/344 +f 311/352/311 344/386/344 312/353/312 +f 312/353/312 344/386/344 345/387/345 +f 312/353/312 345/387/345 313/354/313 +f 313/354/313 345/387/345 346/388/346 +f 313/354/313 346/388/346 314/355/314 +f 314/355/314 346/388/346 347/389/347 +f 314/355/314 347/389/347 315/356/315 +f 315/356/315 347/389/347 348/390/348 +f 315/356/315 348/390/348 316/357/316 +f 316/357/316 348/390/348 349/391/349 +f 316/357/316 349/391/349 317/358/317 +f 317/358/317 349/391/349 350/392/350 +f 317/358/317 350/392/350 318/359/318 +f 318/359/318 350/392/350 351/393/351 +f 318/359/318 351/393/351 319/360/319 +f 319/360/319 351/393/351 352/394/352 +f 319/360/319 352/394/352 320/361/320 +f 320/361/320 352/394/352 353/395/353 +f 320/361/320 353/395/353 321/362/321 +f 321/362/321 353/395/353 322/396/322 +f 321/362/321 322/396/322 290/363/290 +f 322/364/322 354/397/354 355/398/355 +f 322/364/322 355/398/355 323/365/323 +f 323/365/323 355/398/355 356/399/356 +f 323/365/323 356/399/356 324/366/324 +f 324/366/324 356/399/356 357/400/357 +f 324/366/324 357/400/357 325/367/325 +f 325/367/325 357/400/357 358/401/358 +f 325/367/325 358/401/358 326/368/326 +f 326/368/326 358/401/358 359/402/359 +f 326/368/326 359/402/359 327/369/327 +f 327/369/327 359/402/359 360/403/360 +f 327/369/327 360/403/360 328/370/328 +f 328/370/328 360/403/360 361/404/361 +f 328/370/328 361/404/361 329/371/329 +f 329/371/329 361/404/361 362/405/362 +f 329/371/329 362/405/362 330/372/330 +f 330/372/330 362/405/362 363/406/363 +f 330/372/330 363/406/363 331/373/331 +f 331/373/331 363/406/363 364/407/364 +f 331/373/331 364/407/364 332/374/332 +f 332/374/332 364/407/364 365/408/365 +f 332/374/332 365/408/365 333/375/333 +f 333/375/333 365/408/365 366/409/366 +f 333/375/333 366/409/366 334/376/334 +f 334/376/334 366/409/366 367/410/367 +f 334/376/334 367/410/367 335/377/335 +f 335/377/335 367/410/367 368/411/368 +f 335/377/335 368/411/368 336/378/336 +f 336/378/336 368/411/368 369/412/369 +f 336/378/336 369/412/369 337/379/337 +f 337/379/337 369/412/369 370/413/370 +f 337/379/337 370/413/370 338/380/338 +f 338/380/338 370/413/370 371/414/371 +f 338/380/338 371/414/371 339/381/339 +f 339/381/339 371/414/371 372/415/372 +f 339/381/339 372/415/372 340/382/340 +f 340/382/340 372/415/372 373/416/373 +f 340/382/340 373/416/373 341/383/341 +f 341/383/341 373/416/373 374/417/374 +f 341/383/341 374/417/374 342/384/342 +f 342/384/342 374/417/374 375/418/375 +f 342/384/342 375/418/375 343/385/343 +f 343/385/343 375/418/375 376/419/376 +f 343/385/343 376/419/376 344/386/344 +f 344/386/344 376/419/376 377/420/377 +f 344/386/344 377/420/377 345/387/345 +f 345/387/345 377/420/377 378/421/378 +f 345/387/345 378/421/378 346/388/346 +f 346/388/346 378/421/378 379/422/379 +f 346/388/346 379/422/379 347/389/347 +f 347/389/347 379/422/379 380/423/380 +f 347/389/347 380/423/380 348/390/348 +f 348/390/348 380/423/380 381/424/381 +f 348/390/348 381/424/381 349/391/349 +f 349/391/349 381/424/381 382/425/382 +f 349/391/349 382/425/382 350/392/350 +f 350/392/350 382/425/382 383/426/383 +f 350/392/350 383/426/383 351/393/351 +f 351/393/351 383/426/383 384/427/384 +f 351/393/351 384/427/384 352/394/352 +f 352/394/352 384/427/384 385/428/385 +f 352/394/352 385/428/385 353/395/353 +f 353/395/353 385/428/385 354/429/354 +f 353/395/353 354/429/354 322/396/322 +f 354/397/354 386/430/386 387/431/387 +f 354/397/354 387/431/387 355/398/355 +f 355/398/355 387/431/387 388/432/388 +f 355/398/355 388/432/388 356/399/356 +f 356/399/356 388/432/388 389/433/389 +f 356/399/356 389/433/389 357/400/357 +f 357/400/357 389/433/389 390/434/390 +f 357/400/357 390/434/390 358/401/358 +f 358/401/358 390/434/390 391/435/391 +f 358/401/358 391/435/391 359/402/359 +f 359/402/359 391/435/391 392/436/392 +f 359/402/359 392/436/392 360/403/360 +f 360/403/360 392/436/392 393/437/393 +f 360/403/360 393/437/393 361/404/361 +f 361/404/361 393/437/393 394/438/394 +f 361/404/361 394/438/394 362/405/362 +f 362/405/362 394/438/394 395/439/395 +f 362/405/362 395/439/395 363/406/363 +f 363/406/363 395/439/395 396/440/396 +f 363/406/363 396/440/396 364/407/364 +f 364/407/364 396/440/396 397/441/397 +f 364/407/364 397/441/397 365/408/365 +f 365/408/365 397/441/397 398/442/398 +f 365/408/365 398/442/398 366/409/366 +f 366/409/366 398/442/398 399/443/399 +f 366/409/366 399/443/399 367/410/367 +f 367/410/367 399/443/399 400/444/400 +f 367/410/367 400/444/400 368/411/368 +f 368/411/368 400/444/400 401/445/401 +f 368/411/368 401/445/401 369/412/369 +f 369/412/369 401/445/401 402/446/402 +f 369/412/369 402/446/402 370/413/370 +f 370/413/370 402/446/402 403/447/403 +f 370/413/370 403/447/403 371/414/371 +f 371/414/371 403/447/403 404/448/404 +f 371/414/371 404/448/404 372/415/372 +f 372/415/372 404/448/404 405/449/405 +f 372/415/372 405/449/405 373/416/373 +f 373/416/373 405/449/405 406/450/406 +f 373/416/373 406/450/406 374/417/374 +f 374/417/374 406/450/406 407/451/407 +f 374/417/374 407/451/407 375/418/375 +f 375/418/375 407/451/407 408/452/408 +f 375/418/375 408/452/408 376/419/376 +f 376/419/376 408/452/408 409/453/409 +f 376/419/376 409/453/409 377/420/377 +f 377/420/377 409/453/409 410/454/410 +f 377/420/377 410/454/410 378/421/378 +f 378/421/378 410/454/410 411/455/411 +f 378/421/378 411/455/411 379/422/379 +f 379/422/379 411/455/411 412/456/412 +f 379/422/379 412/456/412 380/423/380 +f 380/423/380 412/456/412 413/457/413 +f 380/423/380 413/457/413 381/424/381 +f 381/424/381 413/457/413 414/458/414 +f 381/424/381 414/458/414 382/425/382 +f 382/425/382 414/458/414 415/459/415 +f 382/425/382 415/459/415 383/426/383 +f 383/426/383 415/459/415 416/460/416 +f 383/426/383 416/460/416 384/427/384 +f 384/427/384 416/460/416 417/461/417 +f 384/427/384 417/461/417 385/428/385 +f 385/428/385 417/461/417 386/462/386 +f 385/428/385 386/462/386 354/429/354 +f 386/430/386 418/463/418 419/464/419 +f 386/430/386 419/464/419 387/431/387 +f 387/431/387 419/464/419 420/465/420 +f 387/431/387 420/465/420 388/432/388 +f 388/432/388 420/465/420 421/466/421 +f 388/432/388 421/466/421 389/433/389 +f 389/433/389 421/466/421 422/467/422 +f 389/433/389 422/467/422 390/434/390 +f 390/434/390 422/467/422 423/468/423 +f 390/434/390 423/468/423 391/435/391 +f 391/435/391 423/468/423 424/469/424 +f 391/435/391 424/469/424 392/436/392 +f 392/436/392 424/469/424 425/470/425 +f 392/436/392 425/470/425 393/437/393 +f 393/437/393 425/470/425 426/471/426 +f 393/437/393 426/471/426 394/438/394 +f 394/438/394 426/471/426 427/472/427 +f 394/438/394 427/472/427 395/439/395 +f 395/439/395 427/472/427 428/473/428 +f 395/439/395 428/473/428 396/440/396 +f 396/440/396 428/473/428 429/474/429 +f 396/440/396 429/474/429 397/441/397 +f 397/441/397 429/474/429 430/475/430 +f 397/441/397 430/475/430 398/442/398 +f 398/442/398 430/475/430 431/476/431 +f 398/442/398 431/476/431 399/443/399 +f 399/443/399 431/476/431 432/477/432 +f 399/443/399 432/477/432 400/444/400 +f 400/444/400 432/477/432 433/478/433 +f 400/444/400 433/478/433 401/445/401 +f 401/445/401 433/478/433 434/479/434 +f 401/445/401 434/479/434 402/446/402 +f 402/446/402 434/479/434 435/480/435 +f 402/446/402 435/480/435 403/447/403 +f 403/447/403 435/480/435 436/481/436 +f 403/447/403 436/481/436 404/448/404 +f 404/448/404 436/481/436 437/482/437 +f 404/448/404 437/482/437 405/449/405 +f 405/449/405 437/482/437 438/483/438 +f 405/449/405 438/483/438 406/450/406 +f 406/450/406 438/483/438 439/484/439 +f 406/450/406 439/484/439 407/451/407 +f 407/451/407 439/484/439 440/485/440 +f 407/451/407 440/485/440 408/452/408 +f 408/452/408 440/485/440 441/486/441 +f 408/452/408 441/486/441 409/453/409 +f 409/453/409 441/486/441 442/487/442 +f 409/453/409 442/487/442 410/454/410 +f 410/454/410 442/487/442 443/488/443 +f 410/454/410 443/488/443 411/455/411 +f 411/455/411 443/488/443 444/489/444 +f 411/455/411 444/489/444 412/456/412 +f 412/456/412 444/489/444 445/490/445 +f 412/456/412 445/490/445 413/457/413 +f 413/457/413 445/490/445 446/491/446 +f 413/457/413 446/491/446 414/458/414 +f 414/458/414 446/491/446 447/492/447 +f 414/458/414 447/492/447 415/459/415 +f 415/459/415 447/492/447 448/493/448 +f 415/459/415 448/493/448 416/460/416 +f 416/460/416 448/493/448 449/494/449 +f 416/460/416 449/494/449 417/461/417 +f 417/461/417 449/494/449 418/495/418 +f 417/461/417 418/495/418 386/462/386 +f 418/463/418 450/496/450 451/497/451 +f 418/463/418 451/497/451 419/464/419 +f 419/464/419 451/497/451 452/498/452 +f 419/464/419 452/498/452 420/465/420 +f 420/465/420 452/498/452 453/499/453 +f 420/465/420 453/499/453 421/466/421 +f 421/466/421 453/499/453 454/500/454 +f 421/466/421 454/500/454 422/467/422 +f 422/467/422 454/500/454 455/501/455 +f 422/467/422 455/501/455 423/468/423 +f 423/468/423 455/501/455 456/502/456 +f 423/468/423 456/502/456 424/469/424 +f 424/469/424 456/502/456 457/503/457 +f 424/469/424 457/503/457 425/470/425 +f 425/470/425 457/503/457 458/504/458 +f 425/470/425 458/504/458 426/471/426 +f 426/471/426 458/504/458 459/505/459 +f 426/471/426 459/505/459 427/472/427 +f 427/472/427 459/505/459 460/506/460 +f 427/472/427 460/506/460 428/473/428 +f 428/473/428 460/506/460 461/507/461 +f 428/473/428 461/507/461 429/474/429 +f 429/474/429 461/507/461 462/508/462 +f 429/474/429 462/508/462 430/475/430 +f 430/475/430 462/508/462 463/509/463 +f 430/475/430 463/509/463 431/476/431 +f 431/476/431 463/509/463 464/510/464 +f 431/476/431 464/510/464 432/477/432 +f 432/477/432 464/510/464 465/511/465 +f 432/477/432 465/511/465 433/478/433 +f 433/478/433 465/511/465 466/512/466 +f 433/478/433 466/512/466 434/479/434 +f 434/479/434 466/512/466 467/513/467 +f 434/479/434 467/513/467 435/480/435 +f 435/480/435 467/513/467 468/514/468 +f 435/480/435 468/514/468 436/481/436 +f 436/481/436 468/514/468 469/515/469 +f 436/481/436 469/515/469 437/482/437 +f 437/482/437 469/515/469 470/516/470 +f 437/482/437 470/516/470 438/483/438 +f 438/483/438 470/516/470 471/517/471 +f 438/483/438 471/517/471 439/484/439 +f 439/484/439 471/517/471 472/518/472 +f 439/484/439 472/518/472 440/485/440 +f 440/485/440 472/518/472 473/519/473 +f 440/485/440 473/519/473 441/486/441 +f 441/486/441 473/519/473 474/520/474 +f 441/486/441 474/520/474 442/487/442 +f 442/487/442 474/520/474 475/521/475 +f 442/487/442 475/521/475 443/488/443 +f 443/488/443 475/521/475 476/522/476 +f 443/488/443 476/522/476 444/489/444 +f 444/489/444 476/522/476 477/523/477 +f 444/489/444 477/523/477 445/490/445 +f 445/490/445 477/523/477 478/524/478 +f 445/490/445 478/524/478 446/491/446 +f 446/491/446 478/524/478 479/525/479 +f 446/491/446 479/525/479 447/492/447 +f 447/492/447 479/525/479 480/526/480 +f 447/492/447 480/526/480 448/493/448 +f 448/493/448 480/526/480 481/527/481 +f 448/493/448 481/527/481 449/494/449 +f 449/494/449 481/527/481 450/528/450 +f 449/494/449 450/528/450 418/495/418 +f 482/529/482 451/497/451 450/496/450 +f 482/530/482 452/498/452 451/497/451 +f 482/531/482 453/499/453 452/498/452 +f 482/532/482 454/500/454 453/499/453 +f 482/533/482 455/501/455 454/500/454 +f 482/534/482 456/502/456 455/501/455 +f 482/535/482 457/503/457 456/502/456 +f 482/536/482 458/504/458 457/503/457 +f 482/537/482 459/505/459 458/504/458 +f 482/538/482 460/506/460 459/505/459 +f 482/539/482 461/507/461 460/506/460 +f 482/540/482 462/508/462 461/507/461 +f 482/541/482 463/509/463 462/508/462 +f 482/542/482 464/510/464 463/509/463 +f 482/543/482 465/511/465 464/510/464 +f 482/544/482 466/512/466 465/511/465 +f 482/545/482 467/513/467 466/512/466 +f 482/546/482 468/514/468 467/513/467 +f 482/547/482 469/515/469 468/514/468 +f 482/548/482 470/516/470 469/515/469 +f 482/549/482 471/517/471 470/516/470 +f 482/550/482 472/518/472 471/517/471 +f 482/551/482 473/519/473 472/518/472 +f 482/552/482 474/520/474 473/519/473 +f 482/553/482 475/521/475 474/520/474 +f 482/554/482 476/522/476 475/521/475 +f 482/555/482 477/523/477 476/522/476 +f 482/556/482 478/524/478 477/523/477 +f 482/557/482 479/525/479 478/524/478 +f 482/558/482 480/526/480 479/525/479 +f 482/559/482 481/527/481 480/526/480 +f 482/560/482 450/528/450 481/527/481 +# 960 faces + +g diff --git a/third_party/ktx-src/tests/loadtests/common/models/teapot.dae b/third_party/ktx-src/tests/loadtests/common/models/teapot.dae new file mode 100644 index 0000000000000000000000000000000000000000..ded9ee640943fa6b69deef2b21d3f8642c267de7 --- /dev/null +++ b/third_party/ktx-src/tests/loadtests/common/models/teapot.dae @@ -0,0 +1,65 @@ + + + + + + Blender User + Blender 2.77.0 commit date:2016-03-18, commit time:12:34, hash:22a2853 + + 2016-06-04T10:38:04 + 2016-06-04T10:38:04 + + Z_UP + + + + + + + 0.1661389 -1.486528 0.6782799 0.1639019 -1.470384 0.7083578 -0.0398333 -1.483709 0.7083578 -0.0398333 -1.5 0.6782799 0.1615458 -1.453379 0.7329674 -0.0398333 -1.466551 0.7329674 0.1591659 -1.436203 0.7521081 -0.0398333 -1.449219 0.7521081 0.1568574 -1.419542 0.7657797 -0.0398333 -1.432407 0.7657797 0.1547158 -1.404086 0.773983 -0.0398333 -1.416811 0.773983 0.1528365 -1.390523 0.7767172 -0.0398333 -1.403125 0.7767172 0.1513147 -1.37954 0.773983 -0.0398333 -1.392043 0.773983 0.150246 -1.371827 0.7657797 -0.0398333 -1.384259 0.7657797 0.1497255 -1.36807 0.7521079 -0.0398333 -1.380469 0.7521079 0.1498486 -1.368959 0.7329671 -0.0398333 -1.381366 0.7329671 0.1507108 -1.375181 0.7083578 -0.0398333 -1.387645 0.7083578 0.1524074 -1.387426 0.6782799 -0.0398333 -1.4 0.6782799 0.3629445 -1.447222 0.6782799 0.3585702 -1.431505 0.7083578 0.3539628 -1.41495 0.7329674 0.3493087 -1.398228 0.7521081 0.3447946 -1.382008 0.7657797 0.3406068 -1.366961 0.773983 0.3369317 -1.353756 0.7767172 0.333956 -1.343064 0.773983 0.3318659 -1.335554 0.7657797 0.3308481 -1.331897 0.7521079 0.3310889 -1.332762 0.7329671 0.3327749 -1.33882 0.7083578 0.3360926 -1.350741 0.6782799 0.5489167 -1.38375 0.6782799 0.5425227 -1.368722 0.7083578 0.5357879 -1.352893 0.7329674 0.528985 -1.336904 0.7521081 0.5223866 -1.321396 0.7657797 0.5162652 -1.307008 0.773983 0.5108933 -1.294383 0.7767172 0.5065435 -1.28416 0.773983 0.5034885 -1.276979 0.7657797 0.5020006 -1.273482 0.7521079 0.5023528 -1.27431 0.7329671 0.5048173 -1.280102 0.7083578 0.5096667 -1.2915 0.6782799 0.7223889 -1.297778 0.6782799 0.714111 -1.283683 0.7083578 0.7053918 -1.268838 0.7329674 0.6965845 -1.253843 0.7521081 0.6880419 -1.239298 0.7657797 0.6801168 -1.225804 0.773983 0.6731621 -1.213963 0.7767172 0.6675307 -1.204375 0.773983 0.6635755 -1.197641 0.7657797 0.6616494 -1.194361 0.7521079 0.6621052 -1.195137 0.7329671 0.6652958 -1.20057 0.7083578 0.6715741 -1.211259 0.6782799 0.8816945 -1.190972 0.6782799 0.8716863 -1.178038 0.7083578 0.861145 -1.164414 0.7329674 0.8504969 -1.150653 0.7521081 0.8401688 -1.137305 0.7657797 0.8305874 -1.124922 0.773983 0.8221791 -1.114055 0.7767172 0.8153708 -1.105256 0.773983 0.8105889 -1.099076 0.7657797 0.8082602 -1.096067 0.7521079 0.8088113 -1.096779 0.7329671 0.8126688 -1.101764 0.7083578 0.8202593 -1.111574 0.6782799 1.025167 -1.065 0.6782799 1.0136 -1.053434 0.7083578 1.001418 -1.041251 0.7329674 0.989112 -1.028945 0.7521081 0.977176 -1.017009 0.7657797 0.9661028 -1.005936 0.773983 0.9563854 -0.9962188 0.7767172 0.9485172 -0.9883505 0.773983 0.9429908 -0.9828242 0.7657797 0.9402995 -0.9801328 0.7521079 0.9409363 -0.9807697 0.7329671 0.9453943 -0.9852278 0.7083578 0.9541667 -0.9940001 0.6782799 1.151139 -0.9215278 0.6782799 1.138204 -0.9115197 0.7083578 1.124581 -0.9009783 0.7329674 1.11082 -0.8903303 0.7521081 1.097472 -0.8800022 0.7657797 1.085089 -0.8704208 0.773983 1.074222 -0.8620126 0.7767172 1.065423 -0.8552041 0.773983 1.059243 -0.8504223 0.7657797 1.056233 -0.8480936 0.7521079 1.056946 -0.8486446 0.7329671 1.061931 -0.8525021 0.7083578 1.071741 -0.8600926 0.6782799 1.257945 -0.7622224 0.6782799 1.24385 -0.7539443 0.7083578 1.229005 -0.7452253 0.7329674 1.214009 -0.736418 0.7521081 1.199464 -0.7278753 0.7657797 1.185971 -0.7199501 0.773983 1.17413 -0.7129955 0.7767172 1.164542 -0.7073641 0.773983 1.157807 -0.7034088 0.7657797 1.154528 -0.7014827 0.7521079 1.155304 -0.7019385 0.7329671 1.160736 -0.7051292 0.7083578 1.171426 -0.7114075 0.6782799 1.343917 -0.5887501 0.6782799 1.328889 -0.582356 0.7083578 1.31306 -0.5756213 0.7329674 1.297071 -0.5688184 0.7521081 1.281562 -0.56222 0.7657797 1.267175 -0.5560985 0.773983 1.254549 -0.5507267 0.7767172 1.244326 -0.5463768 0.773983 1.237146 -0.5433219 0.7657797 1.233649 -0.541834 0.7521079 1.234477 -0.5421862 0.7329671 1.240269 -0.5446506 0.7083578 1.251667 -0.5495001 0.6782799 1.407389 -0.4027778 0.6782799 1.391671 -0.3984035 0.7083578 1.375117 -0.3937961 0.7329674 1.358394 -0.3891421 0.7521081 1.342175 -0.3846279 0.7657797 1.327127 -0.3804401 0.773983 1.313922 -0.376765 0.7767172 1.30323 -0.3737893 0.773983 1.295721 -0.3716993 0.7657797 1.292063 -0.3706815 0.7521079 1.292929 -0.3709223 0.7329671 1.298987 -0.3726083 0.7083578 1.310907 -0.3759259 0.6782799 1.446694 -0.2059722 0.6782799 1.43055 -0.2037353 0.7083578 1.413546 -0.2013791 0.7329674 1.396369 -0.1989992 0.7521081 1.379709 -0.1966907 0.7657797 1.364253 -0.1945492 0.773983 1.35069 -0.1926698 0.7767172 1.339707 -0.1911481 0.773983 1.331993 -0.1900793 0.7657797 1.328237 -0.1895588 0.7521079 1.329126 -0.189682 0.7329671 1.335348 -0.1905442 0.7083578 1.347592 -0.1922407 0.6782799 1.460167 0 0.6782799 1.443876 0 0.7083578 1.426718 0 0.7329674 1.409385 0 0.7521081 1.392574 0 0.7657797 1.376978 0 0.773983 1.363292 0 0.7767172 1.35221 0 0.773983 1.344426 0 0.7657797 1.340635 0 0.7521079 1.341532 0 0.7329671 1.347811 0 0.7083578 1.360167 0 0.6782799 -1.526361 -0.2059722 0.6782799 -1.510217 -0.2037353 0.7083578 -1.523543 0 0.7083578 -1.539833 0 0.6782799 -1.493212 -0.2013792 0.7329674 -1.506384 0 0.7329674 -1.476036 -0.1989992 0.7521081 -1.489052 0 0.7521081 -1.459376 -0.1966907 0.7657797 -1.472241 0 0.7657797 -1.44392 -0.1945492 0.773983 -1.456645 0 0.773983 -1.430356 -0.1926698 0.7767172 -1.442958 0 0.7767172 -1.419373 -0.1911481 0.773983 -1.431876 0 0.773983 -1.41166 -0.1900793 0.7657797 -1.424093 0 0.7657797 -1.407903 -0.1895588 0.7521079 -1.420302 0 0.7521079 -1.408792 -0.189682 0.7329671 -1.421199 0 0.7329671 -1.415015 -0.1905442 0.7083578 -1.427478 0 0.7083578 -1.427259 -0.1922407 0.6782799 -1.439833 0 0.6782799 -1.487056 -0.4027778 0.6782799 -1.471338 -0.3984035 0.7083578 -1.454783 -0.3937961 0.7329674 -1.438061 -0.3891421 0.7521081 -1.421841 -0.3846279 0.7657797 -1.406794 -0.3804401 0.773983 -1.393589 -0.376765 0.7767172 -1.382897 -0.3737893 0.773983 -1.375387 -0.3716993 0.7657797 -1.37173 -0.3706815 0.7521079 -1.372595 -0.3709223 0.7329671 -1.378654 -0.3726083 0.7083578 -1.390574 -0.3759259 0.6782799 -1.423583 -0.5887501 0.6782799 -1.408555 -0.582356 0.7083578 -1.392727 -0.5756213 0.7329674 -1.376738 -0.5688184 0.7521081 -1.361229 -0.56222 0.7657797 -1.346842 -0.5560985 0.773983 -1.334216 -0.5507267 0.7767172 -1.323993 -0.5463768 0.773983 -1.316812 -0.5433219 0.7657797 -1.313316 -0.541834 0.7521079 -1.314143 -0.5421862 0.7329671 -1.319935 -0.5446506 0.7083578 -1.331333 -0.5495001 0.6782799 -1.337611 -0.7622223 0.6782799 -1.323517 -0.7539443 0.7083578 -1.308671 -0.7452252 0.7329674 -1.293676 -0.7364179 0.7521081 -1.279131 -0.7278752 0.7657797 -1.265637 -0.7199501 0.773983 -1.253796 -0.7129955 0.7767172 -1.244208 -0.707364 0.773983 -1.237474 -0.7034088 0.7657797 -1.234194 -0.7014827 0.7521079 -1.23497 -0.7019385 0.7329671 -1.240403 -0.7051292 0.7083578 -1.251093 -0.7114075 0.6782799 -1.230805 -0.9215279 0.6782799 -1.217871 -0.9115197 0.7083578 -1.204247 -0.9009784 0.7329674 -1.190486 -0.8903303 0.7521081 -1.177138 -0.8800022 0.7657797 -1.164755 -0.8704208 0.773983 -1.153889 -0.8620125 0.7767172 -1.145089 -0.8552042 0.773983 -1.138909 -0.8504223 0.7657797 -1.1359 -0.8480936 0.7521079 -1.136612 -0.8486446 0.7329671 -1.141597 -0.8525021 0.7083578 -1.151407 -0.8600926 0.6782799 -1.104833 -1.065 0.6782799 -1.093267 -1.053434 0.7083578 -1.081084 -1.041251 0.7329674 -1.068779 -1.028945 0.7521081 -1.056843 -1.017009 0.7657797 -1.045769 -1.005936 0.773983 -1.036052 -0.9962188 0.7767172 -1.028184 -0.9883505 0.773983 -1.022657 -0.9828242 0.7657797 -1.019966 -0.9801328 0.7521079 -1.020603 -0.9807696 0.7329671 -1.025061 -0.9852277 0.7083578 -1.033833 -0.994 0.6782799 -0.9613611 -1.190972 0.6782799 -0.951353 -1.178038 0.7083578 -0.9408116 -1.164414 0.7329674 -0.9301635 -1.150653 0.7521081 -0.9198355 -1.137305 0.7657797 -0.910254 -1.124922 0.773983 -0.9018458 -1.114055 0.7767172 -0.8950374 -1.105256 0.773983 -0.8902555 -1.099076 0.7657797 -0.8879268 -1.096067 0.7521079 -0.8884779 -1.096779 0.7329671 -0.8923354 -1.101764 0.7083578 -0.8999258 -1.111574 0.6782799 -0.8020556 -1.297778 0.6782799 -0.7937776 -1.283684 0.7083578 -0.7850585 -1.268838 0.7329674 -0.7762512 -1.253843 0.7521081 -0.7677085 -1.239298 0.7657797 -0.7597834 -1.225804 0.773983 -0.7528287 -1.213963 0.7767172 -0.7471973 -1.204375 0.773983 -0.7432421 -1.197641 0.7657797 -0.741316 -1.194361 0.7521079 -0.7417718 -1.195137 0.7329671 -0.7449624 -1.20057 0.7083578 -0.7512407 -1.211259 0.6782799 -0.6285833 -1.38375 0.6782799 -0.6221893 -1.368722 0.7083578 -0.6154546 -1.352893 0.7329674 -0.6086516 -1.336904 0.7521081 -0.6020532 -1.321396 0.7657797 -0.5959318 -1.307008 0.773983 -0.5905599 -1.294383 0.7767172 -0.5862101 -1.28416 0.773983 -0.5831551 -1.276979 0.7657797 -0.5816673 -1.273482 0.7521079 -0.5820194 -1.27431 0.7329671 -0.5844839 -1.280102 0.7083578 -0.5893333 -1.2915 0.6782799 -0.442611 -1.447222 0.6782799 -0.4382368 -1.431505 0.7083578 -0.4336294 -1.41495 0.7329674 -0.4289754 -1.398228 0.7521081 -0.4244612 -1.382008 0.7657797 -0.4202734 -1.36696 0.773983 -0.4165983 -1.353756 0.7767172 -0.4136226 -1.343063 0.773983 -0.4115325 -1.335554 0.7657797 -0.4105147 -1.331897 0.7521079 -0.4107555 -1.332762 0.7329671 -0.4124416 -1.33882 0.7083578 -0.4157592 -1.350741 0.6782799 -0.2458055 -1.486528 0.6782799 -0.2435685 -1.470384 0.7083578 -0.2412124 -1.453379 0.7329674 -0.2388325 -1.436203 0.7521081 -0.2365241 -1.419542 0.7657797 -0.2343825 -1.404086 0.773983 -0.2325031 -1.390523 0.7767172 -0.2309814 -1.37954 0.773983 -0.2299126 -1.371827 0.7657797 -0.2293921 -1.36807 0.7521079 -0.2295153 -1.368959 0.7329671 -0.2303774 -1.375181 0.7083578 -0.232074 -1.387426 0.6782799 -0.2458055 1.486528 0.6782799 -0.2435685 1.470384 0.7083578 -0.0398333 1.483709 0.7083578 -0.0398333 1.5 0.6782799 -0.2412124 1.453379 0.7329674 -0.0398333 1.466551 0.7329674 -0.2388325 1.436203 0.7521081 -0.0398333 1.449219 0.7521081 -0.2365241 1.419542 0.7657797 -0.0398333 1.432407 0.7657797 -0.2343825 1.404086 0.773983 -0.0398333 1.416811 0.773983 -0.2325031 1.390523 0.7767172 -0.0398333 1.403125 0.7767172 -0.2309814 1.37954 0.773983 -0.0398333 1.392043 0.773983 -0.2299126 1.371827 0.7657797 -0.0398333 1.384259 0.7657797 -0.2293921 1.36807 0.7521079 -0.0398333 1.380469 0.7521079 -0.2295153 1.368959 0.7329671 -0.0398333 1.381366 0.7329671 -0.2303774 1.375181 0.7083578 -0.0398333 1.387645 0.7083578 -0.232074 1.387426 0.6782799 -0.0398333 1.4 0.6782799 -0.4426111 1.447222 0.6782799 -0.4382368 1.431505 0.7083578 -0.4336294 1.41495 0.7329674 -0.4289754 1.398228 0.7521081 -0.4244613 1.382008 0.7657797 -0.4202734 1.366961 0.773983 -0.4165983 1.353756 0.7767172 -0.4136226 1.343064 0.773983 -0.4115325 1.335554 0.7657797 -0.4105147 1.331897 0.7521079 -0.4107555 1.332762 0.7329671 -0.4124416 1.33882 0.7083578 -0.4157592 1.350741 0.6782799 -0.6285833 1.38375 0.6782799 -0.6221893 1.368722 0.7083578 -0.6154546 1.352893 0.7329674 -0.6086516 1.336904 0.7521081 -0.6020532 1.321396 0.7657797 -0.5959318 1.307008 0.773983 -0.5905599 1.294383 0.7767172 -0.5862101 1.28416 0.773983 -0.5831551 1.276979 0.7657797 -0.5816673 1.273482 0.7521079 -0.5820194 1.27431 0.7329671 -0.5844839 1.280102 0.7083578 -0.5893333 1.2915 0.6782799 -0.8020555 1.297778 0.6782799 -0.7937776 1.283683 0.7083578 -0.7850584 1.268838 0.7329674 -0.7762511 1.253843 0.7521081 -0.7677085 1.239298 0.7657797 -0.7597834 1.225804 0.773983 -0.7528287 1.213963 0.7767172 -0.7471973 1.204375 0.773983 -0.7432421 1.197641 0.7657797 -0.741316 1.194361 0.7521079 -0.7417718 1.195137 0.7329671 -0.7449624 1.20057 0.7083578 -0.7512407 1.211259 0.6782799 -0.9613611 1.190972 0.6782799 -0.951353 1.178038 0.7083578 -0.9408116 1.164414 0.7329674 -0.9301635 1.150653 0.7521081 -0.9198355 1.137305 0.7657797 -0.910254 1.124922 0.773983 -0.9018458 1.114055 0.7767172 -0.8950374 1.105256 0.773983 -0.8902555 1.099076 0.7657797 -0.8879268 1.096067 0.7521079 -0.8884779 1.096779 0.7329671 -0.8923354 1.101764 0.7083578 -0.8999259 1.111574 0.6782799 -1.104833 1.065 0.6782799 -1.093267 1.053434 0.7083578 -1.081084 1.041251 0.7329674 -1.068779 1.028945 0.7521081 -1.056843 1.017009 0.7657797 -1.045769 1.005936 0.773983 -1.036052 0.9962187 0.7767172 -1.028184 0.9883503 0.773983 -1.022657 0.982824 0.7657797 -1.019966 0.9801327 0.7521079 -1.020603 0.9807696 0.7329671 -1.025061 0.9852277 0.7083578 -1.033833 0.994 0.6782799 -1.230805 0.9215277 0.6782799 -1.217871 0.9115196 0.7083578 -1.204247 0.9009782 0.7329674 -1.190486 0.8903301 0.7521081 -1.177138 0.8800021 0.7657797 -1.164755 0.8704206 0.773983 -1.153889 0.8620125 0.7767172 -1.145089 0.855204 0.773983 -1.138909 0.8504222 0.7657797 -1.1359 0.8480935 0.7521079 -1.136612 0.8486445 0.7329671 -1.141597 0.852502 0.7083578 -1.151407 0.8600925 0.6782799 -1.337611 0.7622222 0.6782799 -1.323517 0.7539442 0.7083578 -1.308671 0.7452251 0.7329674 -1.293676 0.7364178 0.7521081 -1.279131 0.7278752 0.7657797 -1.265637 0.71995 0.773983 -1.253796 0.7129954 0.7767172 -1.244208 0.707364 0.773983 -1.237474 0.7034087 0.7657797 -1.234194 0.7014826 0.7521079 -1.23497 0.7019384 0.7329671 -1.240403 0.705129 0.7083578 -1.251093 0.7114074 0.6782799 -1.423583 0.58875 0.6782799 -1.408555 0.5823559 0.7083578 -1.392727 0.5756212 0.7329674 -1.376738 0.5688183 0.7521081 -1.361229 0.5622199 0.7657797 -1.346842 0.5560984 0.773983 -1.334216 0.5507265 0.7767172 -1.323993 0.5463767 0.773983 -1.316812 0.5433217 0.7657797 -1.313316 0.5418339 0.7521079 -1.314143 0.542186 0.7329671 -1.319935 0.5446505 0.7083578 -1.331333 0.5494999 0.6782799 -1.487055 0.4027777 0.6782799 -1.471338 0.3984034 0.7083578 -1.454783 0.393796 0.7329674 -1.438061 0.389142 0.7521081 -1.421841 0.3846279 0.7657797 -1.406794 0.3804401 0.773983 -1.393589 0.376765 0.7767172 -1.382897 0.3737893 0.773983 -1.375387 0.3716992 0.7657797 -1.37173 0.3706814 0.7521079 -1.372595 0.3709222 0.7329671 -1.378654 0.3726082 0.7083578 -1.390574 0.3759258 0.6782799 -1.526361 0.2059721 0.6782799 -1.510217 0.2037352 0.7083578 -1.493212 0.2013791 0.7329674 -1.476036 0.1989991 0.7521081 -1.459376 0.1966907 0.7657797 -1.44392 0.1945491 0.773983 -1.430356 0.1926698 0.7767172 -1.419373 0.1911481 0.773983 -1.41166 0.1900793 0.7657797 -1.407903 0.1895588 0.7521079 -1.408792 0.1896819 0.7329671 -1.415015 0.1905441 0.7083578 -1.427259 0.1922407 0.6782799 1.446694 0.2059721 0.6782799 1.43055 0.2037352 0.7083578 1.413546 0.2013791 0.7329674 1.396369 0.1989991 0.7521081 1.379709 0.1966907 0.7657797 1.364253 0.1945491 0.773983 1.35069 0.1926698 0.7767172 1.339707 0.1911481 0.773983 1.331993 0.1900793 0.7657797 1.328237 0.1895588 0.7521079 1.329126 0.1896819 0.7329671 1.335348 0.1905441 0.7083578 1.347592 0.1922407 0.6782799 1.407389 0.4027777 0.6782799 1.391672 0.3984035 0.7083578 1.375117 0.393796 0.7329674 1.358394 0.389142 0.7521081 1.342175 0.3846279 0.7657797 1.327127 0.3804401 0.773983 1.313922 0.376765 0.7767172 1.30323 0.3737893 0.773983 1.295721 0.3716992 0.7657797 1.292063 0.3706814 0.7521079 1.292929 0.3709222 0.7329671 1.298987 0.3726082 0.7083578 1.310907 0.3759258 0.6782799 1.343917 0.58875 0.6782799 1.328889 0.5823559 0.7083578 1.31306 0.5756212 0.7329674 1.297071 0.5688183 0.7521081 1.281562 0.5622199 0.7657797 1.267175 0.5560984 0.773983 1.254549 0.5507265 0.7767172 1.244326 0.5463767 0.773983 1.237146 0.5433217 0.7657797 1.233649 0.5418339 0.7521079 1.234477 0.542186 0.7329671 1.240269 0.5446505 0.7083578 1.251667 0.5494999 0.6782799 1.257944 0.7622222 0.6782799 1.24385 0.7539442 0.7083578 1.229005 0.7452251 0.7329674 1.214009 0.7364178 0.7521081 1.199464 0.7278751 0.7657797 1.185971 0.71995 0.773983 1.17413 0.7129954 0.7767172 1.164542 0.7073639 0.773983 1.157807 0.7034087 0.7657797 1.154528 0.7014826 0.7521079 1.155304 0.7019384 0.7329671 1.160736 0.705129 0.7083578 1.171426 0.7114074 0.6782799 1.151139 0.9215278 0.6782799 1.138205 0.9115196 0.7083578 1.124581 0.9009783 0.7329674 1.11082 0.8903301 0.7521081 1.097472 0.8800021 0.7657797 1.085089 0.8704206 0.773983 1.074222 0.8620124 0.7767172 1.065423 0.8552041 0.773983 1.059243 0.8504222 0.7657797 1.056233 0.8480935 0.7521079 1.056946 0.8486445 0.7329671 1.061931 0.852502 0.7083578 1.071741 0.8600925 0.6782799 1.025167 1.065 0.6782799 1.0136 1.053434 0.7083578 1.001418 1.041251 0.7329674 0.989112 1.028945 0.7521081 0.977176 1.017009 0.7657797 0.9661028 1.005936 0.773983 0.9563854 0.9962187 0.7767172 0.9485171 0.9883504 0.773983 0.9429908 0.982824 0.7657797 0.9402995 0.9801327 0.7521079 0.9409363 0.9807695 0.7329671 0.9453944 0.9852276 0.7083578 0.9541667 0.9939999 0.6782799 0.8816944 1.190972 0.6782799 0.8716863 1.178038 0.7083578 0.861145 1.164414 0.7329674 0.8504969 1.150653 0.7521081 0.8401688 1.137305 0.7657797 0.8305874 1.124922 0.773983 0.8221792 1.114055 0.7767172 0.8153707 1.105256 0.773983 0.8105889 1.099076 0.7657797 0.8082602 1.096067 0.7521079 0.8088113 1.096779 0.7329671 0.8126688 1.101764 0.7083578 0.8202592 1.111574 0.6782799 0.722389 1.297778 0.6782799 0.714111 1.283684 0.7083578 0.7053919 1.268838 0.7329674 0.6965846 1.253843 0.7521081 0.6880419 1.239298 0.7657797 0.6801168 1.225804 0.773983 0.6731621 1.213963 0.7767172 0.6675307 1.204375 0.773983 0.6635755 1.197641 0.7657797 0.6616494 1.194361 0.7521079 0.6621052 1.195137 0.7329671 0.6652958 1.20057 0.7083578 0.6715741 1.211259 0.6782799 0.5489167 1.38375 0.6782799 0.5425227 1.368722 0.7083578 0.5357879 1.352893 0.7329674 0.528985 1.336904 0.7521081 0.5223866 1.321396 0.7657797 0.5162652 1.307008 0.773983 0.5108933 1.294383 0.7767172 0.5065435 1.28416 0.773983 0.5034885 1.276979 0.7657797 0.5020006 1.273482 0.7521079 0.5023528 1.27431 0.7329671 0.5048173 1.280102 0.7083578 0.5096667 1.2915 0.6782799 0.3629444 1.447222 0.6782799 0.3585702 1.431505 0.7083578 0.3539628 1.41495 0.7329674 0.3493087 1.398228 0.7521081 0.3447946 1.382008 0.7657797 0.3406068 1.36696 0.773983 0.3369317 1.353756 0.7767172 0.333956 1.343063 0.773983 0.3318659 1.335554 0.7657797 0.3308481 1.331897 0.7521079 0.3310889 1.332762 0.7329671 0.3327749 1.33882 0.7083578 0.3360926 1.350741 0.6782799 0.1661389 1.486528 0.6782799 0.1639019 1.470384 0.7083578 0.1615458 1.453379 0.7329674 0.1591659 1.436203 0.7521081 0.1568574 1.419542 0.7657797 0.1547158 1.404086 0.773983 0.1528365 1.390523 0.7767172 0.1513147 1.37954 0.773983 0.150246 1.371827 0.7657797 0.1497254 1.36807 0.7521079 0.1498486 1.368959 0.7329671 0.1507108 1.375181 0.7083578 0.1524074 1.387426 0.6782799 0.2347963 -1.982037 -0.8217203 0.234101 -1.977019 -0.7077011 -0.0398333 -1.994936 -0.7077011 -0.0398333 -2 -0.8217203 0.2320945 -1.962538 -0.5908175 -0.0398333 -1.980324 -0.5908175 0.228896 -1.939454 -0.4713295 -0.0398333 -1.957031 -0.4713297 0.2246248 -1.908628 -0.3494979 -0.0398333 -1.925926 -0.349498 0.2194001 -1.87092 -0.225583 -0.0398333 -1.887876 -0.225583 0.2133408 -1.82719 -0.09984529 -0.0398333 -1.84375 -0.09984529 0.2065665 -1.778299 0.02745521 -0.0398333 -1.794415 0.02745509 0.1991962 -1.725106 0.1560575 -0.0398333 -1.740741 0.1560575 0.191349 -1.668473 0.2857018 -0.0398333 -1.683594 0.2857018 0.1831443 -1.609258 0.416127 -0.0398333 -1.623842 0.416127 0.1747012 -1.548323 0.5470731 -0.0398333 -1.562355 0.5470731 0.4972037 -1.92963 -0.8217203 0.495844 -1.924744 -0.7077011 0.4919204 -1.910646 -0.5908175 0.4856658 -1.888173 -0.4713297 0.4773135 -1.858162 -0.349498 0.4670964 -1.821451 -0.225583 0.4552477 -1.778877 -0.09984529 0.4420005 -1.731279 0.02745509 0.4275878 -1.679492 0.1560575 0.4122428 -1.624356 0.2857018 0.3961985 -1.566707 0.416127 0.379688 -1.507384 0.5470731 0.7451667 -1.845 -0.8217203 0.7431792 -1.840329 -0.7077011 0.7374438 -1.826849 -0.5908175 0.7283014 -1.805361 -0.4713297 0.7160926 -1.776667 -0.349498 0.7011581 -1.741566 -0.225583 0.6838386 -1.700859 -0.09984529 0.6644747 -1.655348 0.02745509 0.6434074 -1.605833 0.1560575 0.6209772 -1.553115 0.2857018 0.5975249 -1.497995 0.416127 0.5733912 -1.441273 0.5470731 0.976463 -1.73037 -0.8217203 0.9738898 -1.725989 -0.7077011 0.9664646 -1.713347 -0.5908175 0.9546285 -1.693194 -0.4713297 0.9388224 -1.666283 -0.349498 0.9194875 -1.633363 -0.225583 0.8970648 -1.595185 -0.09984529 0.8719956 -1.552502 0.02745509 0.8447209 -1.506063 0.1560575 0.8156818 -1.45662 0.2857018 0.7853193 -1.404924 0.416127 0.7540746 -1.351727 0.5470731 1.18887 -1.587963 -0.8217203 1.18576 -1.583943 -0.7077011 1.176782 -1.572341 -0.5908175 1.162472 -1.553847 -0.4713297 1.143363 -1.52915 -0.349498 1.119987 -1.498939 -0.225583 1.092878 -1.463903 -0.09984529 1.062569 -1.424733 0.02745497 1.029594 -1.382116 0.1560575 0.9944857 -1.336742 0.2857018 0.9577775 -1.289301 0.416127 0.9200026 -1.240481 0.5470731 1.380167 -1.42 -0.8217203 1.376572 -1.416405 -0.7077011 1.366197 -1.40603 -0.5908175 1.349659 -1.389492 -0.4713295 1.327574 -1.367407 -0.3494979 1.300559 -1.340392 -0.225583 1.269229 -1.309063 -0.09984529 1.234202 -1.274035 0.02745521 1.196093 -1.235926 0.1560575 1.155518 -1.195352 0.2857018 1.113095 -1.152928 0.416127 1.069439 -1.109272 0.5470731 1.54813 -1.228704 -0.8217203 1.544109 -1.225593 -0.7077011 1.532507 -1.216616 -0.5908175 1.514013 -1.202306 -0.4713297 1.489316 -1.183196 -0.349498 1.459105 -1.15982 -0.225583 1.42407 -1.132711 -0.09984529 1.384899 -1.102403 0.02745509 1.342283 -1.069427 0.1560575 1.296909 -1.034319 0.2857018 1.249468 -0.9976108 0.416127 1.200648 -0.959836 0.5470731 1.690537 -1.016296 -0.8217203 1.686156 -1.013723 -0.7077012 1.673514 -1.006298 -0.5908175 1.653361 -0.9944618 -0.4713297 1.626449 -0.9786558 -0.349498 1.593529 -0.9593209 -0.225583 1.555352 -0.9368982 -0.0998454 1.512668 -0.911829 0.02745497 1.46623 -0.8845543 0.1560574 1.416787 -0.8555152 0.2857018 1.365091 -0.8251527 0.416127 1.311893 -0.793908 0.5470731 1.805167 -0.785 -0.8217203 1.800495 -0.7830125 -0.7077011 1.787016 -0.7772772 -0.5908175 1.765528 -0.7681348 -0.4713297 1.736833 -0.755926 -0.349498 1.701732 -0.7409914 -0.225583 1.661026 -0.7236719 -0.09984529 1.615515 -0.7043081 0.02745509 1.566 -0.6832408 0.1560575 1.513282 -0.6608105 0.2857018 1.458161 -0.6373583 0.416127 1.401439 -0.6132246 0.5470731 1.889796 -0.5370371 -0.8217203 1.884911 -0.5356774 -0.7077012 1.870813 -0.5317538 -0.5908175 1.848339 -0.5254992 -0.4713297 1.818328 -0.5171469 -0.349498 1.781617 -0.5069298 -0.225583 1.739044 -0.4950811 -0.09984529 1.691445 -0.4818338 0.02745509 1.639659 -0.4674211 0.1560575 1.584523 -0.4520761 0.2857018 1.526874 -0.4360318 0.416127 1.46755 -0.4195213 0.5470731 1.942204 -0.2746297 -0.8217203 1.937185 -0.2739343 -0.7077012 1.922704 -0.2719278 -0.5908175 1.899621 -0.2687294 -0.4713296 1.868795 -0.2644582 -0.3494979 1.831087 -0.2592334 -0.225583 1.787357 -0.2531742 -0.09984529 1.738466 -0.2463998 0.02745521 1.685273 -0.2390295 0.1560575 1.628639 -0.2311823 0.2857018 1.569425 -0.2229776 0.416127 1.50849 -0.2145345 0.5470731 1.960167 0 -0.8217203 1.955103 0 -0.7077011 1.940491 0 -0.5908175 1.917198 0 -0.4713297 1.886093 0 -0.349498 1.848043 0 -0.225583 1.803917 0 -0.09984529 1.754582 0 0.02745509 1.700907 0 0.1560575 1.64376 0 0.2857018 1.584009 0 0.416127 1.522522 0 0.5470731 -2.02187 -0.2746297 -0.8217203 -2.016852 -0.2739344 -0.7077011 -2.03477 0 -0.7077011 -2.039833 0 -0.8217203 -2.002371 -0.2719279 -0.5908175 -2.020157 0 -0.5908175 -1.979287 -0.2687294 -0.4713295 -1.996865 0 -0.4713297 -1.948462 -0.2644582 -0.3494979 -1.965759 0 -0.349498 -1.910753 -0.2592334 -0.225583 -1.927709 0 -0.225583 -1.867024 -0.2531742 -0.09984529 -1.883583 0 -0.09984529 -1.818132 -0.2463998 0.02745521 -1.834249 0 0.02745509 -1.76494 -0.2390295 0.1560575 -1.780574 0 0.1560575 -1.708306 -0.2311823 0.2857018 -1.723427 0 0.2857018 -1.649091 -0.2229776 0.416127 -1.663676 0 0.416127 -1.588156 -0.2145345 0.5470731 -1.602189 0 0.5470731 -1.969463 -0.5370371 -0.8217203 -1.964577 -0.5356774 -0.7077011 -1.950479 -0.5317537 -0.5908175 -1.928006 -0.5254992 -0.4713297 -1.897995 -0.5171468 -0.349498 -1.861284 -0.5069298 -0.225583 -1.81871 -0.495081 -0.09984529 -1.771112 -0.4818338 0.02745509 -1.719326 -0.4674211 0.1560575 -1.664189 -0.4520761 0.2857018 -1.606541 -0.4360318 0.416127 -1.547217 -0.4195213 0.5470731 -1.884833 -0.785 -0.8217203 -1.880162 -0.7830125 -0.7077011 -1.866682 -0.7772772 -0.5908175 -1.845195 -0.7681348 -0.4713297 -1.8165 -0.755926 -0.349498 -1.781399 -0.7409914 -0.225583 -1.740693 -0.7236719 -0.09984529 -1.695181 -0.7043081 0.02745509 -1.645667 -0.6832408 0.1560575 -1.592948 -0.6608105 0.2857018 -1.537828 -0.6373583 0.416127 -1.481106 -0.6132246 0.5470731 -1.770204 -1.016296 -0.8217203 -1.765823 -1.013723 -0.7077011 -1.75318 -1.006298 -0.5908175 -1.733028 -0.9944618 -0.4713297 -1.706116 -0.9786558 -0.349498 -1.673196 -0.9593209 -0.225583 -1.635018 -0.9368982 -0.09984529 -1.592335 -0.911829 0.02745509 -1.545896 -0.8845542 0.1560575 -1.496454 -0.8555151 0.2857018 -1.444758 -0.8251526 0.416127 -1.39156 -0.793908 0.5470731 -1.627796 -1.228704 -0.8217203 -1.623776 -1.225593 -0.7077011 -1.612174 -1.216616 -0.5908175 -1.59368 -1.202306 -0.4713297 -1.568983 -1.183196 -0.349498 -1.538772 -1.15982 -0.225583 -1.503737 -1.132711 -0.09984529 -1.464566 -1.102403 0.02745497 -1.421949 -1.069427 0.1560575 -1.376575 -1.034319 0.2857018 -1.329134 -0.9976108 0.416127 -1.280314 -0.959836 0.5470731 -1.459833 -1.42 -0.8217203 -1.456238 -1.416405 -0.7077011 -1.445863 -1.40603 -0.5908175 -1.429326 -1.389492 -0.4713295 -1.407241 -1.367407 -0.3494979 -1.380225 -1.340392 -0.225583 -1.348896 -1.309063 -0.09984529 -1.313868 -1.274035 0.02745521 -1.275759 -1.235926 0.1560575 -1.235185 -1.195352 0.2857018 -1.192762 -1.152928 0.416127 -1.149106 -1.109272 0.5470731 -1.268537 -1.587963 -0.8217203 -1.265426 -1.583943 -0.7077011 -1.256449 -1.572341 -0.5908175 -1.242139 -1.553847 -0.4713297 -1.223029 -1.52915 -0.349498 -1.199654 -1.498939 -0.225583 -1.172545 -1.463903 -0.09984529 -1.142236 -1.424733 0.02745509 -1.109261 -1.382116 0.1560575 -1.074152 -1.336742 0.2857018 -1.037444 -1.289301 0.416127 -0.9996692 -1.240481 0.5470731 -1.05613 -1.73037 -0.8217203 -1.053556 -1.725989 -0.7077012 -1.046131 -1.713347 -0.5908175 -1.034295 -1.693194 -0.4713297 -1.018489 -1.666283 -0.349498 -0.9991541 -1.633363 -0.225583 -0.9767314 -1.595185 -0.0998454 -0.9516623 -1.552502 0.02745497 -0.9243876 -1.506063 0.1560574 -0.8953484 -1.45662 0.2857018 -0.864986 -1.404925 0.416127 -0.8337413 -1.351727 0.5470731 -0.8248333 -1.845 -0.8217203 -0.8228458 -1.840329 -0.7077011 -0.8171104 -1.826849 -0.5908175 -0.807968 -1.805361 -0.4713297 -0.7957592 -1.776667 -0.349498 -0.7808247 -1.741566 -0.225583 -0.7635052 -1.700859 -0.09984529 -0.7441413 -1.655348 0.02745509 -0.723074 -1.605833 0.1560575 -0.7006438 -1.553115 0.2857018 -0.6771915 -1.497995 0.416127 -0.6530578 -1.441273 0.5470731 -0.5768704 -1.92963 -0.8217203 -0.5755107 -1.924744 -0.7077012 -0.571587 -1.910646 -0.5908175 -0.5653325 -1.888173 -0.4713297 -0.5569801 -1.858162 -0.349498 -0.5467631 -1.821451 -0.225583 -0.5349143 -1.778877 -0.09984529 -0.5216671 -1.731279 0.02745509 -0.5072544 -1.679492 0.1560575 -0.4919094 -1.624356 0.2857018 -0.4758651 -1.566707 0.416127 -0.4593546 -1.507383 0.5470731 -0.3144629 -1.982037 -0.8217203 -0.3137676 -1.977019 -0.7077012 -0.3117612 -1.962538 -0.5908175 -0.3085627 -1.939454 -0.4713296 -0.3042915 -1.908628 -0.3494979 -0.2990667 -1.87092 -0.225583 -0.2930075 -1.82719 -0.09984529 -0.2862331 -1.778299 0.02745521 -0.2788628 -1.725106 0.1560575 -0.2710157 -1.668473 0.2857018 -0.2628109 -1.609258 0.416127 -0.2543678 -1.548323 0.5470731 -0.314463 1.982037 -0.8217203 -0.3137676 1.977019 -0.7077011 -0.0398333 1.994936 -0.7077011 -0.0398333 2 -0.8217203 -0.3117612 1.962538 -0.5908175 -0.0398333 1.980324 -0.5908175 -0.3085627 1.939454 -0.4713295 -0.0398333 1.957031 -0.4713297 -0.3042915 1.908628 -0.3494979 -0.0398333 1.925926 -0.349498 -0.2990667 1.87092 -0.225583 -0.0398333 1.887876 -0.225583 -0.2930075 1.82719 -0.09984529 -0.0398333 1.84375 -0.09984529 -0.2862331 1.778299 0.02745521 -0.0398333 1.794415 0.02745509 -0.2788628 1.725106 0.1560575 -0.0398333 1.740741 0.1560575 -0.2710157 1.668473 0.2857018 -0.0398333 1.683594 0.2857018 -0.262811 1.609258 0.416127 -0.0398333 1.623842 0.416127 -0.2543678 1.548323 0.5470731 -0.0398333 1.562355 0.5470731 -0.5768703 1.92963 -0.8217203 -0.5755106 1.924744 -0.7077011 -0.571587 1.910646 -0.5908175 -0.5653324 1.888173 -0.4713297 -0.5569801 1.858162 -0.349498 -0.546763 1.821451 -0.225583 -0.5349143 1.778877 -0.09984529 -0.5216671 1.731279 0.02745509 -0.5072544 1.679492 0.1560575 -0.4919094 1.624356 0.2857018 -0.4758651 1.566707 0.416127 -0.4593546 1.507384 0.5470731 -0.8248333 1.845 -0.8217203 -0.8228458 1.840329 -0.7077011 -0.8171104 1.826849 -0.5908175 -0.807968 1.805361 -0.4713297 -0.7957592 1.776667 -0.349498 -0.7808247 1.741566 -0.225583 -0.7635052 1.700859 -0.09984529 -0.7441413 1.655348 0.02745509 -0.723074 1.605833 0.1560575 -0.7006438 1.553115 0.2857018 -0.6771915 1.497995 0.416127 -0.6530578 1.441273 0.5470731 -1.05613 1.73037 -0.8217203 -1.053556 1.725989 -0.7077011 -1.046131 1.713347 -0.5908175 -1.034295 1.693194 -0.4713297 -1.018489 1.666283 -0.349498 -0.9991541 1.633363 -0.225583 -0.9767314 1.595185 -0.09984529 -0.9516623 1.552502 0.02745509 -0.9243875 1.506063 0.1560575 -0.8953484 1.45662 0.2857018 -0.8649859 1.404924 0.416127 -0.8337413 1.351727 0.5470731 -1.268537 1.587963 -0.8217203 -1.265426 1.583943 -0.7077011 -1.256449 1.572341 -0.5908175 -1.242139 1.553847 -0.4713297 -1.223029 1.52915 -0.349498 -1.199654 1.498939 -0.225583 -1.172545 1.463903 -0.09984529 -1.142236 1.424733 0.02745497 -1.109261 1.382116 0.1560575 -1.074152 1.336742 0.2857018 -1.037444 1.289301 0.416127 -0.9996692 1.240481 0.5470731 -1.459833 1.42 -0.8217203 -1.456238 1.416405 -0.7077011 -1.445863 1.40603 -0.5908175 -1.429326 1.389492 -0.4713295 -1.407241 1.367407 -0.3494979 -1.380225 1.340392 -0.225583 -1.348896 1.309063 -0.09984529 -1.313868 1.274035 0.02745521 -1.275759 1.235926 0.1560575 -1.235185 1.195352 0.2857018 -1.192762 1.152928 0.416127 -1.149106 1.109272 0.5470731 -1.627796 1.228704 -0.8217203 -1.623776 1.225593 -0.7077011 -1.612174 1.216616 -0.5908175 -1.59368 1.202306 -0.4713297 -1.568983 1.183196 -0.349498 -1.538772 1.15982 -0.225583 -1.503737 1.132711 -0.09984529 -1.464566 1.102403 0.02745509 -1.421949 1.069427 0.1560575 -1.376575 1.034319 0.2857018 -1.329134 0.9976106 0.416127 -1.280314 0.9598358 0.5470731 -1.770204 1.016296 -0.8217203 -1.765823 1.013723 -0.7077012 -1.75318 1.006298 -0.5908175 -1.733028 0.9944617 -0.4713297 -1.706116 0.9786556 -0.349498 -1.673196 0.9593207 -0.225583 -1.635018 0.9368981 -0.0998454 -1.592335 0.9118289 0.02745497 -1.545896 0.8845542 0.1560574 -1.496454 0.8555151 0.2857018 -1.444758 0.8251526 0.416127 -1.39156 0.7939079 0.5470731 -1.884833 0.7849999 -0.8217203 -1.880162 0.7830124 -0.7077011 -1.866682 0.7772771 -0.5908175 -1.845195 0.7681347 -0.4713297 -1.8165 0.7559258 -0.349498 -1.781399 0.7409913 -0.225583 -1.740693 0.7236718 -0.09984529 -1.695181 0.704308 0.02745509 -1.645667 0.6832407 0.1560575 -1.592948 0.6608104 0.2857018 -1.537828 0.6373581 0.416127 -1.481106 0.6132245 0.5470731 -1.969463 0.537037 -0.8217203 -1.964577 0.5356773 -0.7077012 -1.950479 0.5317537 -0.5908175 -1.928006 0.5254991 -0.4713297 -1.897995 0.5171468 -0.349498 -1.861284 0.5069297 -0.225583 -1.81871 0.495081 -0.09984529 -1.771112 0.4818338 0.02745509 -1.719326 0.4674211 0.1560575 -1.664189 0.4520761 0.2857018 -1.606541 0.4360318 0.416127 -1.547217 0.4195213 0.5470731 -2.02187 0.2746296 -0.8217203 -2.016852 0.2739343 -0.7077012 -2.002371 0.2719278 -0.5908175 -1.979287 0.2687293 -0.4713296 -1.948462 0.2644581 -0.3494979 -1.910753 0.2592333 -0.225583 -1.867024 0.2531741 -0.09984529 -1.818132 0.2463998 0.02745521 -1.76494 0.2390294 0.1560575 -1.708306 0.2311823 0.2857018 -1.649091 0.2229776 0.416127 -1.588156 0.2145345 0.5470731 1.942204 0.2746296 -0.8217203 1.937186 0.2739343 -0.7077011 1.922705 0.2719278 -0.5908175 1.899621 0.2687293 -0.4713295 1.868795 0.2644581 -0.3494979 1.831087 0.2592334 -0.225583 1.787357 0.2531741 -0.09984529 1.738466 0.2463998 0.02745521 1.685273 0.2390294 0.1560575 1.628639 0.2311823 0.2857018 1.569425 0.2229776 0.416127 1.50849 0.2145345 0.5470731 1.889796 0.537037 -0.8217203 1.884911 0.5356773 -0.7077011 1.870813 0.5317536 -0.5908175 1.848339 0.5254991 -0.4713297 1.818328 0.5171467 -0.349498 1.781617 0.5069296 -0.225583 1.739044 0.495081 -0.09984529 1.691445 0.4818338 0.02745509 1.639659 0.4674211 0.1560575 1.584523 0.452076 0.2857018 1.526874 0.4360318 0.416127 1.46755 0.4195213 0.5470731 1.805167 0.7849999 -0.8217203 1.800495 0.7830124 -0.7077011 1.787016 0.7772771 -0.5908175 1.765528 0.7681347 -0.4713297 1.736833 0.7559258 -0.349498 1.701732 0.7409913 -0.225583 1.661026 0.7236718 -0.09984529 1.615515 0.704308 0.02745509 1.566 0.6832407 0.1560575 1.513282 0.6608104 0.2857018 1.458161 0.6373581 0.416127 1.401439 0.6132245 0.5470731 1.690537 1.016296 -0.8217203 1.686156 1.013723 -0.7077011 1.673514 1.006298 -0.5908175 1.653361 0.9944617 -0.4713297 1.626449 0.9786556 -0.349498 1.593529 0.9593207 -0.225583 1.555352 0.9368981 -0.09984529 1.512668 0.9118289 0.02745509 1.46623 0.8845541 0.1560575 1.416787 0.855515 0.2857018 1.365091 0.8251525 0.416127 1.311893 0.7939079 0.5470731 1.54813 1.228704 -0.8217203 1.544109 1.225593 -0.7077011 1.532507 1.216616 -0.5908175 1.514013 1.202306 -0.4713297 1.489316 1.183196 -0.349498 1.459105 1.15982 -0.225583 1.42407 1.132711 -0.09984529 1.384899 1.102403 0.02745497 1.342283 1.069427 0.1560575 1.296909 1.034319 0.2857018 1.249468 0.9976107 0.416127 1.200648 0.9598358 0.5470731 1.380167 1.42 -0.8217203 1.376572 1.416405 -0.7077011 1.366197 1.40603 -0.5908175 1.349659 1.389492 -0.4713295 1.327574 1.367407 -0.3494979 1.300559 1.340392 -0.225583 1.269229 1.309063 -0.09984529 1.234202 1.274035 0.02745521 1.196093 1.235926 0.1560575 1.155518 1.195352 0.2857018 1.113095 1.152928 0.416127 1.069439 1.109272 0.5470731 1.18887 1.587963 -0.8217203 1.18576 1.583943 -0.7077011 1.176782 1.572341 -0.5908175 1.162472 1.553847 -0.4713297 1.143363 1.52915 -0.349498 1.119987 1.498939 -0.225583 1.092878 1.463903 -0.09984529 1.062569 1.424733 0.02745509 1.029594 1.382116 0.1560575 0.9944856 1.336742 0.2857018 0.9577774 1.289301 0.416127 0.9200026 1.240481 0.5470731 0.976463 1.73037 -0.8217203 0.9738898 1.725989 -0.7077012 0.9664646 1.713347 -0.5908175 0.9546285 1.693194 -0.4713297 0.9388224 1.666283 -0.349498 0.9194875 1.633363 -0.225583 0.8970648 1.595185 -0.0998454 0.8719956 1.552502 0.02745497 0.844721 1.506063 0.1560574 0.8156818 1.45662 0.2857018 0.7853193 1.404925 0.416127 0.7540746 1.351727 0.5470731 0.7451667 1.845 -0.8217203 0.7431792 1.840329 -0.7077011 0.7374438 1.826849 -0.5908175 0.7283014 1.805361 -0.4713297 0.7160926 1.776667 -0.349498 0.7011581 1.741566 -0.225583 0.6838386 1.700859 -0.09984529 0.6644747 1.655348 0.02745509 0.6434074 1.605833 0.1560575 0.6209772 1.553115 0.2857018 0.5975249 1.497995 0.416127 0.5733912 1.441273 0.5470731 0.4972038 1.92963 -0.8217203 0.4958441 1.924744 -0.7077012 0.4919204 1.910646 -0.5908175 0.4856659 1.888173 -0.4713297 0.4773135 1.858162 -0.349498 0.4670965 1.821451 -0.225583 0.4552477 1.778877 -0.09984529 0.4420005 1.731279 0.02745509 0.4275878 1.679492 0.1560575 0.4122428 1.624356 0.2857018 0.3961985 1.566707 0.416127 0.379688 1.507383 0.5470731 0.2347963 1.982037 -0.8217203 0.2341009 1.977019 -0.7077012 0.2320945 1.962538 -0.5908175 0.228896 1.939454 -0.4713296 0.2246248 1.908628 -0.3494979 0.2194 1.87092 -0.225583 0.2133408 1.82719 -0.09984529 0.2065665 1.778299 0.02745521 0.1991962 1.725106 0.1560575 0.191349 1.668473 0.2857018 0.1831443 1.609258 0.416127 0.1747012 1.548323 0.5470731 0.1661389 -1.486528 -1.57172 0.1674898 -1.496277 -1.549802 -0.0398333 -1.509838 -1.549802 -0.0398333 -1.5 -1.57172 0.1712246 -1.523232 -1.521373 -0.0398333 -1.537037 -1.521373 0.1768666 -1.563951 -1.486173 -0.0398333 -1.578125 -1.486173 0.183939 -1.614993 -1.443942 -0.0398333 -1.62963 -1.443942 0.1919649 -1.672917 -1.39442 -0.0398333 -1.688079 -1.39442 0.2004676 -1.734282 -1.337345 -0.0398333 -1.75 -1.337345 0.2089703 -1.795648 -1.272458 -0.0398333 -1.811921 -1.272458 0.2169962 -1.853572 -1.199498 -0.0398333 -1.87037 -1.199498 0.2240686 -1.904614 -1.118205 -0.0398333 -1.921875 -1.118205 0.2297106 -1.945333 -1.028317 -0.0398333 -1.962963 -1.028317 0.2334454 -1.972287 -0.9295762 -0.0398333 -1.990162 -0.9295762 0.3629445 -1.447222 -1.57172 0.3655862 -1.456714 -1.549802 0.3728896 -1.482956 -1.521373 0.3839225 -1.522598 -1.486173 0.3977524 -1.572291 -1.443942 0.4134471 -1.628683 -1.39442 0.4300741 -1.688426 -1.337345 0.4467011 -1.748169 -1.272458 0.4623958 -1.804561 -1.199498 0.4762257 -1.854253 -1.118205 0.4872586 -1.893896 -1.028317 0.494562 -1.920138 -0.9295762 0.5489167 -1.38375 -1.57172 0.5527781 -1.392825 -1.549802 0.5634537 -1.417917 -1.521373 0.5795808 -1.45582 -1.486173 0.5997964 -1.503333 -1.443942 0.6227376 -1.557253 -1.39442 0.6470417 -1.614375 -1.337345 0.6713458 -1.671497 -1.272458 0.6942871 -1.725417 -1.199498 0.7145026 -1.77293 -1.118205 0.7306297 -1.810833 -1.028317 0.7413052 -1.835924 -0.9295762 0.7223889 -1.297778 -1.57172 0.7273881 -1.306289 -1.549802 0.7412092 -1.329822 -1.521373 0.762088 -1.36537 -1.486173 0.78826 -1.409931 -1.443942 0.8179607 -1.460501 -1.39442 0.8494259 -1.514074 -1.337345 0.8808911 -1.567647 -1.272458 0.9105919 -1.618217 -1.199498 0.9367639 -1.662778 -1.118205 0.9576426 -1.698326 -1.028317 0.9714638 -1.721859 -0.9295762 0.8816945 -1.190972 -1.57172 0.8877385 -1.198783 -1.549802 0.9044483 -1.220379 -1.521373 0.9296907 -1.253002 -1.486173 0.9613327 -1.293896 -1.443942 0.997241 -1.340303 -1.39442 1.035282 -1.389468 -1.337345 1.073324 -1.438632 -1.272458 1.109232 -1.485039 -1.199498 1.140874 -1.525933 -1.118205 1.166117 -1.558556 -1.028317 1.182826 -1.580152 -0.9295762 1.025167 -1.065 -1.57172 1.032152 -1.071985 -1.549802 1.051463 -1.091296 -1.521373 1.080636 -1.120469 -1.486173 1.117204 -1.157037 -1.443942 1.158703 -1.198536 -1.39442 1.202667 -1.2425 -1.337345 1.246631 -1.286464 -1.272458 1.28813 -1.327963 -1.199498 1.324698 -1.364531 -1.118205 1.35387 -1.393704 -1.028317 1.373182 -1.413015 -0.9295762 1.151139 -0.9215278 -1.57172 1.15895 -0.9275717 -1.549802 1.180546 -0.9442816 -1.521373 1.213169 -0.969524 -1.486173 1.254062 -1.001166 -1.443942 1.30047 -1.037074 -1.39442 1.349634 -1.075116 -1.337345 1.398799 -1.113157 -1.272458 1.445206 -1.149065 -1.199498 1.4861 -1.180707 -1.118205 1.518723 -1.20595 -1.028317 1.540319 -1.22266 -0.9295762 1.257945 -0.7622224 -1.57172 1.266456 -0.7672215 -1.549802 1.289988 -0.7810426 -1.521373 1.325537 -0.8019214 -1.486173 1.370098 -0.8280935 -1.443942 1.420667 -0.8577941 -1.39442 1.474241 -0.8892593 -1.337345 1.527814 -0.9207246 -1.272458 1.578384 -0.9504253 -1.199498 1.622944 -0.9765973 -1.118205 1.658493 -0.997476 -1.028317 1.682025 -1.011297 -0.9295762 1.343917 -0.5887501 -1.57172 1.352992 -0.5926114 -1.549802 1.378083 -0.6032871 -1.521373 1.415987 -0.6194142 -1.486173 1.4635 -0.6396297 -1.443942 1.517419 -0.662571 -1.39442 1.574542 -0.6868751 -1.337345 1.631664 -0.7111791 -1.272458 1.685583 -0.7341204 -1.199498 1.733096 -0.754336 -1.118205 1.771 -0.7704631 -1.028317 1.796091 -0.7811386 -0.9295762 1.407389 -0.4027778 -1.57172 1.416881 -0.4054195 -1.549802 1.443123 -0.4127229 -1.521373 1.482765 -0.4237558 -1.486173 1.532457 -0.4375857 -1.443942 1.58885 -0.4532805 -1.39442 1.648592 -0.4699074 -1.337345 1.708335 -0.4865344 -1.272458 1.764728 -0.5022292 -1.199498 1.81442 -0.5160591 -1.118205 1.854062 -0.527092 -1.028317 1.880305 -0.5343955 -0.9295762 1.446694 -0.2059722 -1.57172 1.456444 -0.2073231 -1.549802 1.483399 -0.2110579 -1.521373 1.524118 -0.2166999 -1.486173 1.57516 -0.2237723 -1.443942 1.633084 -0.2317982 -1.39442 1.694449 -0.2403009 -1.337345 1.755814 -0.2488036 -1.272458 1.813738 -0.2568296 -1.199498 1.86478 -0.263902 -1.118205 1.905499 -0.269544 -1.028317 1.932454 -0.2732788 -0.9295762 1.460167 0 -1.57172 1.470005 0 -1.549802 1.497204 0 -1.521373 1.538292 0 -1.486173 1.589796 0 -1.443942 1.648245 0 -1.39442 1.710167 0 -1.337345 1.772088 0 -1.272458 1.830537 0 -1.199498 1.882042 0 -1.118205 1.92313 0 -1.028317 1.950329 0 -0.9295762 -1.526361 -0.2059722 -1.57172 -1.536111 -0.2073231 -1.549802 -1.549671 0 -1.549802 -1.539833 0 -1.57172 -1.563066 -0.211058 -1.521373 -1.57687 0 -1.521373 -1.603784 -0.2167 -1.486173 -1.617958 0 -1.486173 -1.654826 -0.2237723 -1.443942 -1.669463 0 -1.443942 -1.712751 -0.2317982 -1.39442 -1.727912 0 -1.39442 -1.774116 -0.240301 -1.337345 -1.789833 0 -1.337345 -1.835481 -0.2488037 -1.272458 -1.851755 0 -1.272458 -1.893405 -0.2568296 -1.199498 -1.910204 0 -1.199498 -1.944447 -0.263902 -1.118205 -1.961708 0 -1.118205 -1.985166 -0.269544 -1.028317 -2.002796 0 -1.028317 -2.012121 -0.2732788 -0.9295762 -2.029995 0 -0.9295762 -1.487056 -0.4027778 -1.57172 -1.496547 -0.4054195 -1.549802 -1.522789 -0.412723 -1.521373 -1.562432 -0.4237558 -1.486173 -1.612124 -0.4375857 -1.443942 -1.668517 -0.4532804 -1.39442 -1.728259 -0.4699074 -1.337345 -1.788002 -0.4865344 -1.272458 -1.844394 -0.5022292 -1.199498 -1.894087 -0.5160591 -1.118205 -1.933729 -0.5270919 -1.028317 -1.959971 -0.5343954 -0.9295762 -1.423583 -0.5887501 -1.57172 -1.432659 -0.5926114 -1.549802 -1.45775 -0.6032871 -1.521373 -1.495654 -0.6194142 -1.486173 -1.543167 -0.6396297 -1.443942 -1.597086 -0.662571 -1.39442 -1.654208 -0.6868751 -1.337345 -1.711331 -0.7111791 -1.272458 -1.76525 -0.7341204 -1.199498 -1.812763 -0.754336 -1.118205 -1.850667 -0.7704631 -1.028317 -1.875758 -0.7811386 -0.9295762 -1.337611 -0.7622223 -1.57172 -1.346123 -0.7672215 -1.549802 -1.369655 -0.7810426 -1.521373 -1.405204 -0.8019213 -1.486173 -1.449765 -0.8280934 -1.443942 -1.500334 -0.8577941 -1.39442 -1.553907 -0.8892593 -1.337345 -1.607481 -0.9207245 -1.272458 -1.65805 -0.9504252 -1.199498 -1.702611 -0.9765973 -1.118205 -1.73816 -0.997476 -1.028317 -1.761692 -1.011297 -0.9295762 -1.230805 -0.9215279 -1.57172 -1.238617 -0.9275718 -1.549802 -1.260212 -0.9442816 -1.521373 -1.292835 -0.9695241 -1.486173 -1.333729 -1.001166 -1.443942 -1.380136 -1.037074 -1.39442 -1.429301 -1.075116 -1.337345 -1.478465 -1.113157 -1.272458 -1.524873 -1.149065 -1.199498 -1.565766 -1.180707 -1.118205 -1.59839 -1.20595 -1.028317 -1.619985 -1.22266 -0.9295762 -1.104833 -1.065 -1.57172 -1.111818 -1.071985 -1.549802 -1.13113 -1.091296 -1.521373 -1.160302 -1.120469 -1.486173 -1.19687 -1.157037 -1.443942 -1.238369 -1.198536 -1.39442 -1.282333 -1.2425 -1.337345 -1.326297 -1.286464 -1.272458 -1.367796 -1.327963 -1.199498 -1.404365 -1.364531 -1.118205 -1.433537 -1.393704 -1.028317 -1.452848 -1.413015 -0.9295762 -0.9613611 -1.190972 -1.57172 -0.967405 -1.198783 -1.549802 -0.9841148 -1.220379 -1.521373 -1.009357 -1.253002 -1.486173 -1.040999 -1.293896 -1.443942 -1.076908 -1.340303 -1.39442 -1.114949 -1.389468 -1.337345 -1.15299 -1.438632 -1.272458 -1.188899 -1.485039 -1.199498 -1.220541 -1.525933 -1.118205 -1.245783 -1.558556 -1.028317 -1.262493 -1.580152 -0.9295762 -0.8020556 -1.297778 -1.57172 -0.8070547 -1.30629 -1.549802 -0.8208759 -1.329822 -1.521373 -0.8417547 -1.36537 -1.486173 -0.8679267 -1.409931 -1.443942 -0.8976274 -1.460501 -1.39442 -0.9290926 -1.514074 -1.337345 -0.9605578 -1.567648 -1.272458 -0.9902585 -1.618217 -1.199498 -1.01643 -1.662778 -1.118205 -1.037309 -1.698326 -1.028317 -1.05113 -1.721859 -0.9295762 -0.6285833 -1.38375 -1.57172 -0.6324447 -1.392825 -1.549802 -0.6431204 -1.417917 -1.521373 -0.6592474 -1.45582 -1.486173 -0.679463 -1.503333 -1.443942 -0.7024042 -1.557253 -1.39442 -0.7267083 -1.614375 -1.337345 -0.7510124 -1.671497 -1.272458 -0.7739537 -1.725417 -1.199498 -0.7941693 -1.77293 -1.118205 -0.8102963 -1.810833 -1.028317 -0.8209719 -1.835924 -0.9295762 -0.442611 -1.447222 -1.57172 -0.4452527 -1.456714 -1.549802 -0.4525562 -1.482956 -1.521373 -0.4635891 -1.522598 -1.486173 -0.477419 -1.572291 -1.443942 -0.4931137 -1.628683 -1.39442 -0.5097407 -1.688426 -1.337345 -0.5263677 -1.748168 -1.272458 -0.5420624 -1.804561 -1.199498 -0.5558924 -1.854253 -1.118205 -0.5669253 -1.893896 -1.028317 -0.5742287 -1.920138 -0.9295762 -0.2458055 -1.486528 -1.57172 -0.2471564 -1.496277 -1.549802 -0.2508912 -1.523232 -1.521373 -0.2565332 -1.563951 -1.486173 -0.2636056 -1.614993 -1.443942 -0.2716315 -1.672917 -1.39442 -0.2801342 -1.734282 -1.337345 -0.2886369 -1.795647 -1.272458 -0.2966628 -1.853572 -1.199498 -0.3037352 -1.904614 -1.118205 -0.3093772 -1.945333 -1.028317 -0.313112 -1.972287 -0.9295762 -0.2458055 1.486528 -1.57172 -0.2471564 1.496277 -1.549802 -0.0398333 1.509838 -1.549802 -0.0398333 1.5 -1.57172 -0.2508913 1.523232 -1.521373 -0.0398333 1.537037 -1.521373 -0.2565333 1.563951 -1.486173 -0.0398333 1.578125 -1.486173 -0.2636056 1.614993 -1.443942 -0.0398333 1.62963 -1.443942 -0.2716315 1.672917 -1.39442 -0.0398333 1.688079 -1.39442 -0.2801342 1.734282 -1.337345 -0.0398333 1.75 -1.337345 -0.2886369 1.795648 -1.272458 -0.0398333 1.811921 -1.272458 -0.2966629 1.853572 -1.199498 -0.0398333 1.87037 -1.199498 -0.3037352 1.904614 -1.118205 -0.0398333 1.921875 -1.118205 -0.3093772 1.945333 -1.028317 -0.0398333 1.962963 -1.028317 -0.313112 1.972287 -0.9295762 -0.0398333 1.990162 -0.9295762 -0.4426111 1.447222 -1.57172 -0.4452528 1.456714 -1.549802 -0.4525562 1.482956 -1.521373 -0.4635891 1.522598 -1.486173 -0.477419 1.572291 -1.443942 -0.4931137 1.628683 -1.39442 -0.5097407 1.688426 -1.337345 -0.5263677 1.748169 -1.272458 -0.5420624 1.804561 -1.199498 -0.5558924 1.854253 -1.118205 -0.5669252 1.893896 -1.028317 -0.5742287 1.920138 -0.9295762 -0.6285833 1.38375 -1.57172 -0.6324447 1.392825 -1.549802 -0.6431204 1.417917 -1.521373 -0.6592474 1.45582 -1.486173 -0.679463 1.503333 -1.443942 -0.7024042 1.557253 -1.39442 -0.7267083 1.614375 -1.337345 -0.7510124 1.671497 -1.272458 -0.7739537 1.725417 -1.199498 -0.7941693 1.77293 -1.118205 -0.8102963 1.810833 -1.028317 -0.8209719 1.835924 -0.9295762 -0.8020555 1.297778 -1.57172 -0.8070547 1.306289 -1.549802 -0.8208758 1.329822 -1.521373 -0.8417546 1.36537 -1.486173 -0.8679266 1.409931 -1.443942 -0.8976274 1.460501 -1.39442 -0.9290925 1.514074 -1.337345 -0.9605577 1.567647 -1.272458 -0.9902585 1.618217 -1.199498 -1.01643 1.662778 -1.118205 -1.037309 1.698326 -1.028317 -1.05113 1.721859 -0.9295762 -0.9613611 1.190972 -1.57172 -0.9674051 1.198783 -1.549802 -0.9841149 1.220379 -1.521373 -1.009357 1.253002 -1.486173 -1.040999 1.293896 -1.443942 -1.076908 1.340303 -1.39442 -1.114949 1.389468 -1.337345 -1.152991 1.438632 -1.272458 -1.188899 1.485039 -1.199498 -1.220541 1.525933 -1.118205 -1.245783 1.558556 -1.028317 -1.262493 1.580152 -0.9295762 -1.104833 1.065 -1.57172 -1.111818 1.071985 -1.549802 -1.13113 1.091296 -1.521373 -1.160302 1.120469 -1.486173 -1.19687 1.157037 -1.443942 -1.238369 1.198536 -1.39442 -1.282333 1.2425 -1.337345 -1.326297 1.286464 -1.272458 -1.367796 1.327963 -1.199498 -1.404365 1.364531 -1.118205 -1.433537 1.393704 -1.028317 -1.452848 1.413015 -0.9295762 -1.230805 0.9215277 -1.57172 -1.238616 0.9275716 -1.549802 -1.260212 0.9442815 -1.521373 -1.292835 0.9695239 -1.486173 -1.333729 1.001166 -1.443942 -1.380136 1.037074 -1.39442 -1.429301 1.075116 -1.337345 -1.478465 1.113157 -1.272458 -1.524873 1.149065 -1.199498 -1.565766 1.180707 -1.118205 -1.59839 1.20595 -1.028317 -1.619985 1.22266 -0.9295762 -1.337611 0.7622222 -1.57172 -1.346123 0.7672213 -1.549802 -1.369655 0.7810425 -1.521373 -1.405204 0.8019213 -1.486173 -1.449765 0.8280934 -1.443942 -1.500334 0.857794 -1.39442 -1.553907 0.8892592 -1.337345 -1.607481 0.9207245 -1.272458 -1.65805 0.9504252 -1.199498 -1.702611 0.9765971 -1.118205 -1.73816 0.9974759 -1.028317 -1.761692 1.011297 -0.9295762 -1.423583 0.58875 -1.57172 -1.432659 0.5926113 -1.549802 -1.45775 0.603287 -1.521373 -1.495654 0.619414 -1.486173 -1.543167 0.6396296 -1.443942 -1.597086 0.6625708 -1.39442 -1.654208 0.6868749 -1.337345 -1.711331 0.711179 -1.272458 -1.76525 0.7341203 -1.199498 -1.812763 0.7543359 -1.118205 -1.850667 0.7704629 -1.028317 -1.875758 0.7811385 -0.9295762 -1.487055 0.4027777 -1.57172 -1.496547 0.4054194 -1.549802 -1.522789 0.4127228 -1.521373 -1.562432 0.4237558 -1.486173 -1.612124 0.4375857 -1.443942 -1.668516 0.4532804 -1.39442 -1.728259 0.4699074 -1.337345 -1.788002 0.4865344 -1.272458 -1.844394 0.502229 -1.199498 -1.894087 0.516059 -1.118205 -1.933729 0.5270919 -1.028317 -1.959971 0.5343953 -0.9295762 -1.526361 0.2059721 -1.57172 -1.536111 0.207323 -1.549802 -1.563066 0.2110579 -1.521373 -1.603784 0.2166998 -1.486173 -1.654826 0.2237722 -1.443942 -1.712751 0.2317981 -1.39442 -1.774116 0.2403008 -1.337345 -1.835481 0.2488036 -1.272458 -1.893405 0.2568295 -1.199498 -1.944447 0.2639019 -1.118205 -1.985166 0.2695439 -1.028317 -2.01212 0.2732787 -0.9295762 1.446694 0.2059721 -1.57172 1.456444 0.2073231 -1.549802 1.483399 0.2110579 -1.521373 1.524118 0.2166999 -1.486173 1.57516 0.2237722 -1.443942 1.633084 0.2317982 -1.39442 1.694449 0.2403009 -1.337345 1.755814 0.2488036 -1.272458 1.813738 0.2568295 -1.199498 1.86478 0.2639019 -1.118205 1.905499 0.2695439 -1.028317 1.932454 0.2732787 -0.9295762 1.407389 0.4027777 -1.57172 1.416881 0.4054194 -1.549802 1.443123 0.4127229 -1.521373 1.482765 0.4237557 -1.486173 1.532458 0.4375857 -1.443942 1.58885 0.4532803 -1.39442 1.648592 0.4699074 -1.337345 1.708335 0.4865344 -1.272458 1.764728 0.502229 -1.199498 1.81442 0.516059 -1.118205 1.854062 0.5270918 -1.028317 1.880305 0.5343953 -0.9295762 1.343917 0.58875 -1.57172 1.352992 0.5926113 -1.549802 1.378083 0.603287 -1.521373 1.415987 0.619414 -1.486173 1.4635 0.6396296 -1.443942 1.517419 0.6625708 -1.39442 1.574542 0.6868749 -1.337345 1.631664 0.711179 -1.272458 1.685583 0.7341203 -1.199498 1.733096 0.7543359 -1.118205 1.771 0.7704629 -1.028317 1.796091 0.7811385 -0.9295762 1.257944 0.7622222 -1.57172 1.266456 0.7672213 -1.549802 1.289988 0.7810425 -1.521373 1.325537 0.8019212 -1.486173 1.370098 0.8280932 -1.443942 1.420667 0.857794 -1.39442 1.474241 0.8892592 -1.337345 1.527814 0.9207243 -1.272458 1.578384 0.9504251 -1.199498 1.622944 0.9765971 -1.118205 1.658493 0.9974759 -1.028317 1.682025 1.011297 -0.9295762 1.151139 0.9215278 -1.57172 1.15895 0.9275717 -1.549802 1.180546 0.9442815 -1.521373 1.213169 0.969524 -1.486173 1.254062 1.001166 -1.443942 1.30047 1.037074 -1.39442 1.349634 1.075116 -1.337345 1.398799 1.113157 -1.272458 1.445206 1.149065 -1.199498 1.4861 1.180707 -1.118205 1.518723 1.20595 -1.028317 1.540319 1.22266 -0.9295762 1.025167 1.065 -1.57172 1.032152 1.071985 -1.549802 1.051463 1.091296 -1.521373 1.080636 1.120469 -1.486173 1.117204 1.157037 -1.443942 1.158703 1.198536 -1.39442 1.202667 1.2425 -1.337345 1.246631 1.286464 -1.272458 1.28813 1.327963 -1.199498 1.324698 1.364531 -1.118205 1.35387 1.393704 -1.028317 1.373182 1.413015 -0.9295762 0.8816944 1.190972 -1.57172 0.8877384 1.198783 -1.549802 0.9044482 1.220379 -1.521373 0.9296907 1.253002 -1.486173 0.9613327 1.293896 -1.443942 0.997241 1.340303 -1.39442 1.035282 1.389468 -1.337345 1.073324 1.438632 -1.272458 1.109232 1.485039 -1.199498 1.140874 1.525933 -1.118205 1.166117 1.558556 -1.028317 1.182826 1.580152 -0.9295762 0.722389 1.297778 -1.57172 0.7273881 1.30629 -1.549802 0.7412093 1.329822 -1.521373 0.7620881 1.36537 -1.486173 0.7882601 1.409931 -1.443942 0.8179607 1.460501 -1.39442 0.849426 1.514074 -1.337345 0.8808912 1.567648 -1.272458 0.9105919 1.618217 -1.199498 0.9367639 1.662778 -1.118205 0.9576426 1.698326 -1.028317 0.9714638 1.721859 -0.9295762 0.5489167 1.38375 -1.57172 0.5527781 1.392825 -1.549802 0.5634537 1.417917 -1.521373 0.5795808 1.45582 -1.486173 0.5997964 1.503333 -1.443942 0.6227376 1.557253 -1.39442 0.6470417 1.614375 -1.337345 0.6713458 1.671497 -1.272458 0.6942871 1.725417 -1.199498 0.7145026 1.77293 -1.118205 0.7306297 1.810833 -1.028317 0.7413052 1.835924 -0.9295762 0.3629444 1.447222 -1.57172 0.3655861 1.456714 -1.549802 0.3728896 1.482956 -1.521373 0.3839225 1.522598 -1.486173 0.3977524 1.572291 -1.443942 0.4134471 1.628683 -1.39442 0.4300741 1.688426 -1.337345 0.4467011 1.748168 -1.272458 0.4623958 1.804561 -1.199498 0.4762257 1.854253 -1.118205 0.4872587 1.893896 -1.028317 0.4945621 1.920138 -0.9295762 0.1661389 1.486528 -1.57172 0.1674898 1.496277 -1.549802 0.1712246 1.523232 -1.521373 0.1768666 1.563951 -1.486173 0.1839389 1.614993 -1.443942 0.1919649 1.672917 -1.39442 0.2004676 1.734282 -1.337345 0.2089703 1.795647 -1.272458 0.2169962 1.853572 -1.199498 0.2240686 1.904614 -1.118205 0.2297106 1.945333 -1.028317 0.2334454 1.972287 -0.9295762 -3.033931 -0.06875002 0.07827973 -3.023556 -0.06875002 0.180648 -3.029417 0 0.1816651 -3.039833 0 0.07827973 -2.992437 -0.06875002 0.2659979 -2.998167 0 0.267863 -2.94058 -0.06875002 0.3358765 -2.946083 0 0.3384361 -2.867993 -0.06875002 0.3918309 -2.873167 0 0.3949463 -2.774681 -0.06875002 0.4354084 -2.779417 0 0.438957 -2.660652 -0.06875002 0.4681559 -2.664833 0 0.4720297 -2.525913 -0.06875002 0.4916208 -2.529417 0 0.4957278 -2.37047 -0.06875002 0.50735 -2.373167 0 0.5116131 -2.194331 -0.06875002 0.5168905 -2.196083 0 0.5212486 -1.997501 -0.06875002 0.5217898 -1.998167 0 0.5261967 -1.779989 -0.06875002 0.5235946 -1.779417 0 0.5280192 -1.541801 -0.06875002 0.5238526 -1.539833 0 0.5282798 -3.017611 -0.125 0.07827973 -3.007353 -0.125 0.177836 -2.976596 -0.125 0.2608414 -2.925366 -0.125 0.3288007 -2.853688 -0.125 0.3832181 -2.761588 -0.125 0.4255984 -2.649093 -0.125 0.4574463 -2.516227 -0.125 0.4802666 -2.363016 -0.125 0.4955638 -2.189486 -0.125 0.5048423 -1.995663 -0.125 0.5096071 -1.781573 -0.125 0.5113623 -1.547241 -0.125 0.5116131 -2.992958 -0.16875 0.07827973 -2.982876 -0.16875 0.1735881 -2.952666 -0.16875 0.2530519 -2.902382 -0.16875 0.3181114 -2.832079 -0.16875 0.3702068 -2.74181 -0.16875 0.410779 -2.63163 -0.16875 0.441268 -2.501594 -0.16875 0.4631145 -2.351755 -0.16875 0.4777589 -2.182167 -0.16875 0.4866417 -1.992886 -0.16875 0.4912031 -1.783965 -0.16875 0.4928835 -1.555458 -0.16875 0.4931235 -2.962055 -0.2 0.07827973 -2.952194 -0.2 0.1682634 -2.922669 -0.2 0.2432875 -2.873572 -0.2 0.3047123 -2.804991 -0.2 0.3538971 -2.717017 -0.2 0.3922026 -2.609741 -0.2 0.4209883 -2.483251 -0.2 0.4416142 -2.337638 -0.2000001 0.4554405 -2.172993 -0.2 0.4638269 -1.989405 -0.2 0.4681335 -1.786963 -0.2 0.4697201 -1.565759 -0.2 0.4699466 -2.926986 -0.21875 0.07827973 -2.917375 -0.21875 0.1622204 -2.888628 -0.21875 0.2322063 -2.840877 -0.21875 0.289506 -2.774251 -0.21875 0.3353882 -2.688882 -0.21875 0.3711212 -2.5849 -0.21875 0.3979738 -2.462435 -0.21875 0.4172146 -2.321619 -0.21875 0.4301121 -2.162582 -0.21875 0.4379356 -1.985454 -0.21875 0.441953 -1.790366 -0.21875 0.4434328 -1.577449 -0.21875 0.4436443 -2.889833 -0.225 0.07827973 -2.880487 -0.225 0.1558188 -2.852565 -0.225 0.2204673 -2.806239 -0.225 0.273397 -2.741685 -0.225 0.3157797 -2.659075 -0.225 0.3487876 -2.558583 -0.225 0.3735924 -2.440383 -0.225 0.3913658 -2.304648 -0.225 0.4032798 -2.151552 -0.225 0.4105065 -1.981268 -0.225 0.4142175 -1.793971 -0.225 0.4155846 -1.589833 -0.225 0.4157798 -2.85268 -0.21875 0.07827973 -2.8436 -0.21875 0.149417 -2.816501 -0.21875 0.208728 -2.771602 -0.21875 0.2572879 -2.709119 -0.21875 0.2961714 -2.629268 -0.21875 0.3264542 -2.532267 -0.21875 0.349211 -2.418331 -0.21875 0.3655169 -2.287677 -0.21875 0.3764472 -2.140522 -0.21875 0.3830774 -1.977083 -0.21875 0.386482 -1.797576 -0.21875 0.3877361 -1.602217 -0.21875 0.3879154 -2.817611 -0.2 0.07827973 -2.80878 -0.2 0.1433742 -2.78246 -0.2 0.1976469 -2.738907 -0.2 0.2420817 -2.67838 -0.2 0.2776625 -2.601133 -0.2 0.3053727 -2.507426 -0.2 0.3261964 -2.397515 -0.2 0.3411172 -2.271658 -0.2000001 0.3511191 -2.130111 -0.2 0.3571861 -1.973132 -0.2 0.3603015 -1.800979 -0.2 0.361449 -1.613907 -0.2 0.361613 -2.786708 -0.16875 0.07827973 -2.778098 -0.16875 0.1380494 -2.752464 -0.16875 0.1878826 -2.710097 -0.16875 0.2286826 -2.651292 -0.16875 0.2613528 -2.57634 -0.16875 0.2867963 -2.485537 -0.16875 0.3059166 -2.379173 -0.16875 0.3196168 -2.257542 -0.16875 0.3288007 -2.120937 -0.16875 0.3343713 -1.969651 -0.16875 0.3372319 -1.803977 -0.16875 0.3382857 -1.624208 -0.16875 0.3384361 -2.762055 -0.125 0.07827961 -2.753621 -0.125 0.1338014 -2.728533 -0.125 0.1800928 -2.687114 -0.125 0.2179932 -2.629682 -0.125 0.2483415 -2.556562 -0.125 0.2719767 -2.468074 -0.125 0.2897382 -2.364539 -0.125 0.3024647 -2.24628 -0.125 0.3109961 -2.113618 -0.125 0.3161705 -1.966874 -0.125 0.3188279 -1.806369 -0.125 0.3198068 -1.632426 -0.125 0.3199465 -2.745736 -0.06875002 0.07827961 -2.737419 -0.06875002 0.1309894 -2.712693 -0.06875002 0.1749362 -2.671899 -0.06875002 0.2109172 -2.615378 -0.06875002 0.2397284 -2.54347 -0.06875002 0.2621667 -2.456515 -0.06875002 0.2790284 -2.354853 -0.06875002 0.2911105 -2.238826 -0.06875002 0.2992096 -2.108773 -0.06875002 0.304122 -1.965035 -0.06875002 0.3066447 -1.807953 -0.06875002 0.307574 -1.637866 -0.06875002 0.3077068 -2.739833 0 0.07827973 -2.731558 0 0.1299724 -2.706963 0 0.1730713 -2.666396 0 0.2083579 -2.610204 0 0.2366131 -2.538734 0 0.2586184 -2.452333 0 0.275155 -2.35135 0 0.2870038 -2.236129 0 0.2949464 -2.107021 0 0.2997642 -1.96437 0 0.3022382 -1.808525 0 0.3031497 -1.639833 0 0.3032799 -2.745736 0.06874996 0.07827973 -2.737419 0.06874996 0.1309895 -2.712693 0.06874996 0.1749365 -2.671899 0.06874996 0.2109173 -2.615378 0.06874996 0.2397286 -2.54347 0.06874996 0.2621667 -2.456515 0.06874996 0.2790287 -2.354853 0.06874996 0.2911108 -2.238826 0.06874996 0.2992098 -2.108773 0.06874996 0.3041222 -1.965035 0.06874996 0.3066449 -1.807953 0.06874996 0.3075743 -1.637866 0.06874996 0.3077071 -2.762056 0.125 0.07827973 -2.753622 0.125 0.1338015 -2.728533 0.125 0.180093 -2.687114 0.125 0.2179933 -2.629683 0.125 0.2483415 -2.556562 0.125 0.2719768 -2.468074 0.125 0.2897382 -2.364539 0.125 0.3024647 -2.24628 0.125 0.3109961 -2.113618 0.125 0.3161705 -1.966874 0.125 0.3188279 -1.806369 0.125 0.3198068 -1.632426 0.125 0.3199465 -2.786708 0.1687499 0.07827973 -2.778098 0.1687499 0.1380494 -2.752464 0.1687499 0.1878826 -2.710097 0.1687499 0.2286826 -2.651292 0.1687499 0.2613528 -2.57634 0.1687499 0.2867963 -2.485537 0.1687499 0.3059166 -2.379173 0.1687499 0.3196168 -2.257542 0.1687499 0.3288007 -2.120937 0.1687499 0.3343713 -1.969651 0.1687499 0.3372319 -1.803977 0.1687499 0.3382857 -1.624208 0.1687499 0.3384361 -2.817611 0.1999999 0.07827973 -2.80878 0.1999999 0.1433743 -2.78246 0.1999999 0.197647 -2.738907 0.1999999 0.2420819 -2.67838 0.1999999 0.2776626 -2.601133 0.1999999 0.305373 -2.507426 0.1999999 0.3261964 -2.397515 0.1999999 0.3411174 -2.271658 0.2 0.3511195 -2.130111 0.1999999 0.3571863 -1.973132 0.1999999 0.3603017 -1.800979 0.1999999 0.3614493 -1.613907 0.1999999 0.3616133 -2.852681 0.21875 0.07827973 -2.8436 0.21875 0.149417 -2.816501 0.21875 0.208728 -2.771602 0.21875 0.2572879 -2.709119 0.21875 0.2961714 -2.629268 0.21875 0.3264542 -2.532267 0.21875 0.349211 -2.418331 0.21875 0.3655169 -2.287677 0.21875 0.3764472 -2.140522 0.21875 0.3830774 -1.977083 0.21875 0.386482 -1.797576 0.21875 0.3877361 -1.602218 0.21875 0.3879154 -2.889833 0.225 0.07827973 -2.880487 0.225 0.1558188 -2.852565 0.225 0.2204673 -2.80624 0.225 0.273397 -2.741685 0.2249999 0.3157797 -2.659075 0.225 0.3487876 -2.558583 0.225 0.3735924 -2.440383 0.225 0.3913658 -2.304648 0.225 0.4032798 -2.151552 0.225 0.4105065 -1.981269 0.225 0.4142175 -1.793971 0.2249999 0.4155846 -1.589833 0.225 0.4157798 -2.926986 0.21875 0.07827973 -2.917375 0.21875 0.1622205 -2.888628 0.21875 0.2322065 -2.840877 0.21875 0.2895064 -2.774251 0.21875 0.3353882 -2.688882 0.21875 0.3711214 -2.5849 0.21875 0.3979738 -2.462435 0.21875 0.4172146 -2.321619 0.21875 0.4301124 -2.162582 0.21875 0.4379358 -1.985454 0.21875 0.441953 -1.790366 0.21875 0.4434331 -1.577449 0.21875 0.4436445 -2.962055 0.1999999 0.07827973 -2.952194 0.1999999 0.1682634 -2.922669 0.1999999 0.2432875 -2.873572 0.1999999 0.3047123 -2.804991 0.1999999 0.3538971 -2.717017 0.1999999 0.3922026 -2.609741 0.1999999 0.4209883 -2.483251 0.1999999 0.4416142 -2.337638 0.2 0.4554405 -2.172993 0.1999999 0.4638269 -1.989405 0.1999999 0.4681335 -1.786963 0.1999999 0.4697201 -1.565759 0.1999999 0.4699466 -2.992958 0.1687499 0.07827973 -2.982876 0.1687499 0.1735881 -2.952666 0.1687499 0.2530519 -2.902382 0.1687499 0.3181114 -2.832079 0.1687499 0.3702068 -2.74181 0.1687499 0.410779 -2.63163 0.1687499 0.441268 -2.501594 0.1687499 0.4631145 -2.351755 0.1687499 0.4777589 -2.182167 0.1687499 0.4866417 -1.992886 0.1687499 0.4912031 -1.783965 0.1687499 0.4928835 -1.555458 0.1687499 0.4931235 -3.017611 0.125 0.07827961 -3.007353 0.125 0.1778359 -2.976596 0.125 0.2608415 -2.925366 0.125 0.3288007 -2.853688 0.125 0.3832183 -2.761588 0.125 0.4255986 -2.649093 0.125 0.4574466 -2.516227 0.125 0.4802668 -2.363016 0.125 0.495564 -2.189486 0.125 0.5048425 -1.995663 0.125 0.5096073 -1.781573 0.125 0.5113626 -1.547241 0.125 0.5116134 -3.033931 0.06874996 0.07827961 -3.023556 0.06874996 0.1806478 -2.992437 0.06874996 0.2659978 -2.94058 0.06874996 0.3358765 -2.867993 0.06874996 0.3918309 -2.774681 0.06874996 0.4354084 -2.660652 0.06874996 0.4681559 -2.525913 0.06874996 0.4916208 -2.370471 0.06874996 0.50735 -2.194331 0.06874996 0.5168905 -1.997502 0.06874996 0.5217898 -1.779989 0.06874996 0.5235946 -1.541801 0.06874996 0.5238526 -1.941801 -0.06875002 -1.115817 -2.119808 -0.06875002 -1.030398 -2.119029 0 -1.035804 -1.939833 0 -1.12172 -2.281408 -0.06875002 -0.9418894 -2.281731 0 -0.9468938 -2.426777 -0.06875002 -0.8504495 -2.428115 0 -0.8551186 -2.556093 -0.06875002 -0.7562366 -2.558352 0 -0.7606092 -2.669532 -0.06875002 -0.6594094 -2.672617 0 -0.6634954 -2.767271 -0.06875002 -0.5601262 -2.771083 0 -0.5639076 -2.849488 -0.06875002 -0.4585453 -2.853924 0 -0.4619763 -2.916359 -0.06875002 -0.3548254 -2.921315 0 -0.3578312 -2.968062 -0.06875002 -0.2491244 -2.973427 0 -0.251603 -3.004774 -0.06875002 -0.1416009 -3.010435 0 -0.1434216 -3.026671 -0.06875002 -0.03241348 -3.032513 0 -0.03341722 -1.947241 -0.125 -1.099498 -2.121963 -0.125 -1.015452 -2.280514 -0.125 -0.9280539 -2.42308 -0.125 -0.8375406 -2.549847 -0.125 -0.7441483 -2.661002 -0.125 -0.6481131 -2.756731 -0.125 -0.5496718 -2.837222 -0.125 -0.44906 -2.902659 -0.125 -0.3465146 -2.95323 -0.125 -0.2422714 -2.989122 -0.125 -0.1365672 -3.01052 -0.125 -0.02963793 -1.955458 -0.16875 -1.074845 -2.125218 -0.16875 -0.992873 -2.279164 -0.16875 -0.9071531 -2.417495 -0.16875 -0.8180398 -2.540412 -0.16875 -0.7258869 -2.648117 -0.16875 -0.6310485 -2.74081 -0.16875 -0.5338783 -2.818692 -0.16875 -0.4347309 -2.881963 -0.16875 -0.3339598 -2.930824 -0.16875 -0.2319191 -2.965477 -0.16875 -0.1289631 -2.986121 -0.16875 -0.02544546 -1.965759 -0.2 -1.043942 -2.129299 -0.2 -0.9645701 -2.27747 -0.2 -0.8809538 -2.410493 -0.2 -0.7935952 -2.528585 -0.2 -0.7029959 -2.631965 -0.2 -0.6096574 -2.720852 -0.2 -0.5140812 -2.795464 -0.2 -0.416769 -2.85602 -0.2000001 -0.3182223 -2.902738 -0.2 -0.2189424 -2.935838 -0.2 -0.1194312 -2.955538 -0.2 -0.02019 -1.977449 -0.21875 -1.008873 -2.133929 -0.21875 -0.9324509 -2.275549 -0.21875 -0.8512219 -2.402548 -0.21875 -0.7658548 -2.515163 -0.21875 -0.6770187 -2.613635 -0.21875 -0.5853824 -2.698203 -0.21875 -0.4916151 -2.769104 -0.21875 -0.3963856 -2.826579 -0.21875 -0.3003628 -2.870866 -0.21875 -0.204216 -2.902203 -0.21875 -0.1086139 -2.92083 -0.21875 -0.01422572 -1.989833 -0.225 -0.9717202 -2.138835 -0.225 -0.8984238 -2.273514 -0.225 -0.8197237 -2.39413 -0.225 -0.7364663 -2.500944 -0.225 -0.649498 -2.594217 -0.225 -0.5596651 -2.674208 -0.225 -0.467814 -2.741178 -0.225 -0.3747909 -2.795389 -0.225 -0.2814424 -2.837099 -0.225 -0.1886147 -2.866569 -0.225 -0.09715425 -2.88406 -0.225 -0.00790739 -2.002218 -0.21875 -0.9345675 -2.143741 -0.21875 -0.8643966 -2.271478 -0.21875 -0.7882255 -2.385713 -0.21875 -0.7070779 -2.486725 -0.21875 -0.6219773 -2.574799 -0.21875 -0.5339478 -2.650214 -0.21875 -0.4440129 -2.713253 -0.21875 -0.3531965 -2.764199 -0.21875 -0.262522 -2.803332 -0.21875 -0.1730134 -2.830936 -0.21875 -0.08569455 -2.847291 -0.21875 -0.00158894 -2.013907 -0.2 -0.8994981 -2.148371 -0.2 -0.8322775 -2.269557 -0.2 -0.7584937 -2.377767 -0.2 -0.6793374 -2.473304 -0.2 -0.5960001 -2.556469 -0.2 -0.5096728 -2.627565 -0.2 -0.4215466 -2.686894 -0.2 -0.3328128 -2.734758 -0.2000001 -0.2446625 -2.77146 -0.2 -0.158287 -2.797301 -0.2 -0.0748775 -2.812584 -0.2 0.004375219 -2.024208 -0.16875 -0.8685953 -2.152452 -0.16875 -0.8039746 -2.267864 -0.16875 -0.7322943 -2.370766 -0.16875 -0.6548929 -2.461477 -0.16875 -0.573109 -2.540317 -0.16875 -0.4882817 -2.607607 -0.16875 -0.4017495 -2.663666 -0.16875 -0.3148511 -2.708815 -0.16875 -0.2289249 -2.743373 -0.16875 -0.1453102 -2.767662 -0.16875 -0.06534552 -2.782 -0.16875 0.009630918 -2.032426 -0.125 -0.8439425 -2.155707 -0.125 -0.7813959 -2.266514 -0.125 -0.7113936 -2.36518 -0.125 -0.6353921 -2.452042 -0.125 -0.5548478 -2.527432 -0.125 -0.4712169 -2.591685 -0.125 -0.3859563 -2.645136 -0.125 -0.3005219 -2.688118 -0.125 -0.2163704 -2.720968 -0.125 -0.1349581 -2.744017 -0.125 -0.0577414 -2.757601 -0.125 0.01382327 -2.037866 -0.06875002 -0.8276231 -2.157862 -0.06875002 -0.7664495 -2.265619 -0.06875002 -0.6975581 -2.361483 -0.06875002 -0.6224831 -2.445796 -0.06875002 -0.5427594 -2.518902 -0.06875002 -0.4599208 -2.581146 -0.06875002 -0.3755016 -2.63287 -0.06875002 -0.2910365 -2.674419 -0.06875002 -0.2080595 -2.706136 -0.06875002 -0.1281052 -2.728365 -0.06875002 -0.05270767 -2.741451 -0.06875002 0.01659858 -2.158641 0 -0.7610432 -2.265296 0 -0.6925535 -2.360146 0 -0.6178141 -2.443537 0 -0.5383868 -2.515817 0 -0.4558348 -2.577333 0 -0.3717202 -2.628433 0 -0.2876057 -2.669463 0 -0.2050535 -2.700771 0 -0.1256264 -2.722704 0 -0.05088686 -2.735609 0 0.01760268 -2.037866 0.06874996 -0.827623 -2.157862 0.06874996 -0.7664493 -2.265619 0.06874996 -0.6975579 -2.361483 0.06874996 -0.6224833 -2.445796 0.06874996 -0.5427593 -2.518902 0.06874996 -0.4599208 -2.581146 0.06874996 -0.3755018 -2.63287 0.06874996 -0.2910365 -2.674419 0.06874996 -0.2080596 -2.706136 0.06874996 -0.1281051 -2.728365 0.06874996 -0.05270767 -2.741451 0.06874996 0.01659882 -2.032426 0.125 -0.8439425 -2.155707 0.125 -0.7813959 -2.266514 0.125 -0.7113936 -2.36518 0.125 -0.6353921 -2.452042 0.125 -0.5548478 -2.527432 0.125 -0.4712169 -2.591685 0.125 -0.3859562 -2.645136 0.125 -0.3005219 -2.688119 0.125 -0.2163704 -2.720968 0.125 -0.134958 -2.744017 0.125 -0.05774128 -2.757602 0.125 0.01382339 -2.024208 0.1687499 -0.8685953 -2.152452 0.1687499 -0.8039746 -2.267864 0.1687499 -0.7322943 -2.370766 0.1687499 -0.6548929 -2.461477 0.1687499 -0.573109 -2.540317 0.1687499 -0.4882817 -2.607607 0.1687499 -0.4017495 -2.663666 0.1687499 -0.3148511 -2.708815 0.1687499 -0.2289249 -2.743373 0.1687499 -0.1453102 -2.767662 0.1687499 -0.06534552 -2.782 0.1687499 0.009630918 -2.013907 0.1999999 -0.899498 -2.148371 0.1999999 -0.8322775 -2.269557 0.1999999 -0.7584936 -2.377767 0.1999999 -0.6793373 -2.473304 0.1999999 -0.596 -2.556469 0.1999999 -0.5096727 -2.627565 0.1999999 -0.4215465 -2.686894 0.1999999 -0.3328128 -2.734758 0.2 -0.2446625 -2.77146 0.1999999 -0.158287 -2.797301 0.1999999 -0.07487738 -2.812584 0.1999999 0.004375219 -2.002218 0.21875 -0.9345675 -2.143741 0.21875 -0.8643967 -2.271478 0.21875 -0.7882255 -2.385713 0.21875 -0.707078 -2.486726 0.21875 -0.6219775 -2.574799 0.21875 -0.533948 -2.650214 0.21875 -0.4440131 -2.713253 0.21875 -0.3531965 -2.764199 0.21875 -0.2625221 -2.803333 0.21875 -0.1730134 -2.830936 0.21875 -0.08569455 -2.847291 0.21875 -0.00158894 -1.989833 0.225 -0.9717202 -2.138835 0.225 -0.8984238 -2.273514 0.225 -0.8197237 -2.39413 0.225 -0.7364663 -2.500945 0.2249999 -0.649498 -2.594217 0.225 -0.5596651 -2.674208 0.225 -0.467814 -2.741179 0.225 -0.3747909 -2.795389 0.225 -0.2814425 -2.837099 0.225 -0.1886148 -2.866569 0.225 -0.09715425 -2.884061 0.2249999 -0.00790739 -1.977449 0.21875 -1.008873 -2.133929 0.21875 -0.9324509 -2.275549 0.21875 -0.8512219 -2.402548 0.21875 -0.7658547 -2.515163 0.21875 -0.6770185 -2.613635 0.21875 -0.5853824 -2.698203 0.21875 -0.4916149 -2.769104 0.21875 -0.3963856 -2.826579 0.21875 -0.300363 -2.870866 0.21875 -0.204216 -2.902203 0.21875 -0.108614 -2.92083 0.21875 -0.01422572 -1.965759 0.1999999 -1.043942 -2.129299 0.1999999 -0.9645701 -2.27747 0.1999999 -0.8809538 -2.410493 0.1999999 -0.7935953 -2.528585 0.1999999 -0.7029959 -2.631965 0.1999999 -0.6096575 -2.720852 0.1999999 -0.5140815 -2.795464 0.1999999 -0.416769 -2.85602 0.2 -0.3182224 -2.902738 0.1999999 -0.2189424 -2.935838 0.1999999 -0.1194312 -2.955538 0.1999999 -0.02019 -1.955458 0.1687499 -1.074845 -2.125218 0.1687499 -0.992873 -2.279164 0.1687499 -0.9071531 -2.417495 0.1687499 -0.8180398 -2.540412 0.1687499 -0.7258869 -2.648117 0.1687499 -0.6310485 -2.74081 0.1687499 -0.5338783 -2.818692 0.1687499 -0.4347309 -2.881963 0.1687499 -0.3339598 -2.930824 0.1687499 -0.2319191 -2.965477 0.1687499 -0.1289631 -2.986121 0.1687499 -0.02544546 -1.947241 0.125 -1.099498 -2.121963 0.125 -1.015452 -2.280514 0.125 -0.9280538 -2.42308 0.125 -0.8375405 -2.549847 0.125 -0.7441483 -2.661002 0.125 -0.6481131 -2.756731 0.125 -0.5496718 -2.837222 0.125 -0.44906 -2.902659 0.125 -0.3465146 -2.95323 0.125 -0.2422714 -2.989122 0.125 -0.1365673 -3.01052 0.125 -0.02963805 -1.941801 0.06874996 -1.115817 -2.119808 0.06874996 -1.030398 -2.281408 0.06874996 -0.9418894 -2.426777 0.06874996 -0.8504495 -2.556093 0.06874996 -0.7562366 -2.669532 0.06874996 -0.6594094 -2.767271 0.06874996 -0.5601262 -2.849488 0.06874996 -0.4585453 -2.916359 0.06874996 -0.3548254 -2.968062 0.06874996 -0.2491244 -3.004774 0.06874996 -0.1416009 -3.026671 0.06874996 -0.0324136 3.248361 -0.05729168 0.6782799 3.056664 -0.05914038 0.5689287 3.066359 0 0.5683839 3.260167 0 0.6782799 2.918172 -0.06425154 0.4317706 2.92637 0 0.4303632 2.82016 -0.07197266 0.2730038 2.827354 0 0.2704674 2.749904 -0.08165127 0.09882712 2.756463 0 0.09494638 2.69468 -0.09263479 -0.08456063 2.70085 0 -0.08994936 2.641764 -0.1042708 -0.2709606 2.647666 0 -0.2779703 2.578431 -0.1159069 -0.4541741 2.584067 0 -0.462866 2.491957 -0.1268904 -0.6280024 2.497204 0 -0.6383869 2.369618 -0.136569 -0.7862465 2.374229 0 -0.7982828 2.198689 -0.1442902 -0.922708 2.202296 0 -0.9363035 1.966447 -0.1494013 -1.031188 1.968558 0 -1.046199 1.660167 -0.15125 -1.105488 1.660167 0 -1.12172 3.215722 -0.1041667 0.6782799 3.029862 -0.107528 0.5704351 2.895506 -0.116821 0.4356616 2.800271 -0.1308594 0.280016 2.731772 -0.1484568 0.1095554 2.677624 -0.1684269 -0.06966257 2.625444 -0.1895833 -0.2515814 2.562848 -0.2107398 -0.4301436 2.477451 -0.2307099 -0.5992923 2.356868 -0.2483073 -0.7529702 2.188716 -0.2623457 -0.8851204 1.96061 -0.2716388 -0.9896858 1.660167 -0.275 -1.060609 3.166417 -0.140625 0.6782799 2.989373 -0.1451628 0.5727108 2.861266 -0.1577084 0.4415393 2.770225 -0.1766602 0.2906089 2.70438 -0.2004167 0.1257624 2.651859 -0.2273763 -0.04715681 2.600791 -0.2559375 -0.222306 2.539308 -0.2844988 -0.393842 2.455537 -0.3114584 -0.5559216 2.337608 -0.3352149 -0.7027016 2.17365 -0.3541667 -0.8283391 1.951794 -0.3667123 -0.9269909 1.660167 -0.37125 -0.992814 3.104611 -0.1666667 0.6782799 2.93862 -0.1720448 0.5755632 2.818346 -0.1869136 0.4489074 2.732563 -0.209375 0.3038874 2.670043 -0.2375309 0.1460781 2.619561 -0.269483 -0.01894557 2.569889 -0.3033334 -0.1856091 2.5098 -0.3371837 -0.3483373 2.428068 -0.3691359 -0.5015556 2.313465 -0.3972917 -0.639689 2.154765 -0.4197531 -0.7571625 1.940742 -0.4346219 -0.8484017 1.660167 -0.4400001 -0.9078313 3.034472 -0.1822916 0.6782799 2.881023 -0.188174 0.5788002 2.769638 -0.2044367 0.457269 2.689821 -0.2290039 0.3189564 2.631077 -0.2597994 0.1691331 2.582909 -0.2947471 0.01306939 2.534819 -0.3317709 -0.1439642 2.476314 -0.3687946 -0.2966971 2.396895 -0.4037423 -0.4398594 2.286067 -0.4345378 -0.5681802 2.133334 -0.459105 -0.6763892 1.928199 -0.4753677 -0.7592161 1.660167 -0.4812501 -0.8113904 2.960167 -0.1875 0.6782799 2.820005 -0.1935504 0.5822294 2.718037 -0.2102778 0.4661269 2.644541 -0.2355469 0.3349204 2.589796 -0.2672222 0.1935575 2.544079 -0.3031684 0.04698634 2.497667 -0.34125 -0.09984517 2.440838 -0.3793316 -0.2419893 2.36387 -0.4152778 -0.374498 2.257042 -0.4469531 -0.4924234 2.11063 -0.4722223 -0.5908175 1.914912 -0.4889497 -0.6647323 1.660167 -0.495 -0.7092202 2.885861 -0.1822916 0.6782799 2.758986 -0.188174 0.5856588 2.666436 -0.2044367 0.4749851 2.599262 -0.2290039 0.3508844 2.548516 -0.2597994 0.217982 2.505249 -0.2947471 0.08090329 2.460514 -0.3317709 -0.05572628 2.405362 -0.3687946 -0.1872814 2.330846 -0.4037423 -0.3091368 2.228016 -0.4345378 -0.4166666 2.087925 -0.459105 -0.5052458 1.901625 -0.4753677 -0.5702487 1.660167 -0.4812501 -0.6070502 2.815722 -0.1666667 0.6782799 2.70139 -0.1720448 0.5888958 2.617728 -0.1869136 0.4833467 2.556521 -0.209375 0.3659535 2.509549 -0.2375309 0.2410368 2.468596 -0.269483 0.1129183 2.425444 -0.3033334 -0.01408123 2.371876 -0.3371837 -0.135641 2.299673 -0.3691359 -0.2474403 2.200618 -0.3972917 -0.3451576 2.066494 -0.4197531 -0.4244722 1.889083 -0.4346219 -0.481063 1.660167 -0.4400001 -0.510609 2.753917 -0.140625 0.6782799 2.650636 -0.1451628 0.5917482 2.574808 -0.1577084 0.4907146 2.518858 -0.1766602 0.3792319 2.475213 -0.2004167 0.2613525 2.436299 -0.2273763 0.1411297 2.394541 -0.2559375 0.02261567 2.342368 -0.2844988 -0.09013652 2.272204 -0.3114584 -0.1930744 2.176475 -0.3352149 -0.282145 2.047609 -0.3541667 -0.3532957 1.87803 -0.3667123 -0.4024738 1.660167 -0.37125 -0.4256265 2.704611 -0.1041667 0.6782799 2.610147 -0.107528 0.5940237 2.540568 -0.116821 0.4965925 2.488813 -0.1308594 0.3898249 2.447821 -0.1484568 0.2775595 2.410533 -0.1684269 0.1636353 2.369889 -0.1895833 0.05189085 2.318828 -0.2107398 -0.05383503 2.25029 -0.2307099 -0.1497037 2.157215 -0.2483073 -0.2318764 2.032543 -0.2623457 -0.2965145 1.869214 -0.2716388 -0.339779 1.660167 -0.275 -0.3578314 2.671972 -0.05729168 0.6782799 2.583345 -0.05914038 0.59553 2.517902 -0.06425154 0.5004835 2.468923 -0.07197266 0.3968372 2.429688 -0.08165127 0.2882881 2.393477 -0.09263479 0.1785335 2.353569 -0.1042708 0.07127022 2.303245 -0.1159069 -0.02980446 2.235784 -0.1268904 -0.1209937 2.144466 -0.136569 -0.1986001 2.02257 -0.1442902 -0.258927 1.863377 -0.1494013 -0.2982769 1.660167 -0.15125 -0.312953 2.660167 0 0.6782799 2.573651 0 0.5960748 2.509704 0 0.5018909 2.461729 0 0.3993735 2.42313 0 0.2921686 2.387308 0 0.183922 2.347667 0 0.07827973 2.297609 0 -0.02111268 2.230537 0 -0.110609 2.139854 0 -0.1865639 2.018963 0 -0.2453312 1.861266 0 -0.2832655 1.660167 0 -0.2967203 2.671972 0.05729162 0.6782799 2.583345 0.05914032 0.59553 2.517902 0.06425148 0.5004835 2.468923 0.0719726 0.3968372 2.429688 0.08165121 0.2882881 2.393477 0.09263473 0.1785333 2.353569 0.1042708 0.07126998 2.303245 0.1159068 -0.02980458 2.235784 0.1268904 -0.1209938 2.144466 0.136569 -0.1986001 2.02257 0.1442901 -0.258927 1.863377 0.1494013 -0.2982769 1.660167 0.15125 -0.312953 2.704611 0.1041666 0.6782799 2.610147 0.1075279 0.5940237 2.540568 0.1168209 0.4965925 2.488812 0.1308593 0.3898249 2.447821 0.1484567 0.2775595 2.410533 0.1684268 0.1636352 2.369889 0.1895833 0.05189085 2.318828 0.2107397 -0.05383515 2.25029 0.2307098 -0.1497038 2.157215 0.2483072 -0.2318766 2.032543 0.2623457 -0.2965146 1.869214 0.2716387 -0.3397791 1.660167 0.275 -0.3578315 2.753917 0.140625 0.6782799 2.650636 0.1451627 0.5917482 2.574808 0.1577083 0.4907146 2.518858 0.1766601 0.3792319 2.475213 0.2004166 0.2613525 2.436299 0.2273762 0.1411297 2.394541 0.2559375 0.02261567 2.342368 0.2844987 -0.09013652 2.272204 0.3114584 -0.1930744 2.176475 0.3352149 -0.282145 2.047609 0.3541666 -0.3532957 1.87803 0.3667122 -0.4024738 1.660167 0.37125 -0.4256265 2.815722 0.1666666 0.6782799 2.70139 0.1720447 0.5888958 2.617728 0.1869135 0.4833467 2.556521 0.2093749 0.3659535 2.509549 0.2375308 0.2410368 2.468596 0.269483 0.1129183 2.425444 0.3033334 -0.01408147 2.371876 0.3371837 -0.1356412 2.299673 0.3691358 -0.2474403 2.200618 0.3972917 -0.3451578 2.066494 0.4197531 -0.4244722 1.889083 0.4346219 -0.4810631 1.660167 0.44 -0.5106092 2.885861 0.1822916 0.6782799 2.758986 0.1881739 0.5856588 2.666436 0.2044367 0.4749851 2.599262 0.2290039 0.3508844 2.548516 0.2597993 0.217982 2.505249 0.294747 0.08090341 2.460514 0.3317708 -0.05572628 2.405362 0.3687946 -0.1872813 2.330846 0.4037423 -0.3091366 2.228016 0.4345377 -0.4166665 2.087925 0.4591049 -0.5052457 1.901625 0.4753677 -0.5702486 1.660167 0.48125 -0.6070502 2.960167 0.1875 0.6782799 2.820005 0.1935503 0.5822294 2.718037 0.2102777 0.4661269 2.644541 0.2355468 0.3349204 2.589796 0.2672222 0.1935575 2.544079 0.3031684 0.04698634 2.497667 0.34125 -0.09984517 2.440838 0.3793315 -0.2419892 2.36387 0.4152777 -0.374498 2.257042 0.4469531 -0.4924234 2.11063 0.4722222 -0.5908175 1.914912 0.4889496 -0.6647325 1.660167 0.495 -0.7092203 3.034472 0.1822916 0.6782799 2.881023 0.1881739 0.5788002 2.769638 0.2044367 0.4572687 2.689821 0.2290039 0.3189564 2.631077 0.2597993 0.1691329 2.582909 0.294747 0.01306939 2.534819 0.3317708 -0.1439642 2.476314 0.3687946 -0.2966971 2.396895 0.4037423 -0.4398594 2.286067 0.4345377 -0.5681802 2.133334 0.4591049 -0.6763893 1.928199 0.4753677 -0.7592161 1.660167 0.48125 -0.8113904 3.104611 0.1666666 0.6782799 2.93862 0.1720447 0.5755632 2.818346 0.1869135 0.4489074 2.732563 0.2093749 0.3038874 2.670043 0.2375308 0.1460781 2.619561 0.269483 -0.01894557 2.569889 0.3033334 -0.1856091 2.5098 0.3371837 -0.3483373 2.428068 0.3691358 -0.5015556 2.313465 0.3972917 -0.639689 2.154765 0.4197531 -0.7571625 1.940742 0.4346219 -0.8484017 1.660167 0.44 -0.9078313 3.166417 0.140625 0.6782799 2.989373 0.1451627 0.5727108 2.861266 0.1577083 0.4415393 2.770225 0.1766601 0.2906089 2.70438 0.2004166 0.1257624 2.651859 0.2273762 -0.04715681 2.600791 0.2559375 -0.2223062 2.539308 0.2844987 -0.393842 2.455537 0.3114584 -0.5559216 2.337608 0.3352149 -0.7027017 2.17365 0.3541666 -0.8283391 1.951794 0.3667122 -0.9269909 1.660167 0.37125 -0.992814 3.215722 0.1041666 0.6782799 3.029862 0.1075279 0.5704351 2.895506 0.1168209 0.4356616 2.800271 0.1308593 0.280016 2.731772 0.1484567 0.1095554 2.677624 0.1684268 -0.06966269 2.625445 0.1895833 -0.2515814 2.562848 0.2107397 -0.4301436 2.477451 0.2307098 -0.5992923 2.356868 0.2483072 -0.7529702 2.188716 0.2623457 -0.8851204 1.96061 0.2716387 -0.9896858 1.660167 0.275 -1.060609 3.248361 0.05729162 0.6782799 3.056664 0.05914032 0.5689287 2.918172 0.06425148 0.4317706 2.82016 0.0719726 0.2730037 2.749904 0.08165121 0.09882688 2.69468 0.09263473 -0.08456075 2.641764 0.1042708 -0.2709608 2.578431 0.1159068 -0.4541742 2.491957 0.1268904 -0.6280024 2.369617 0.136569 -0.7862466 2.198689 0.1442901 -0.922708 1.966447 0.1494013 -1.031188 1.660167 0.15125 -1.105488 3.152296 -0.03437501 0.6782799 3.210334 -0.03482592 0.7035408 3.218949 0 0.7037029 3.160167 0 0.6782799 3.260647 -0.03607255 0.7235708 3.270004 0 0.7238526 3.302825 -0.03795576 0.7385612 3.312901 0 0.7389245 3.336455 -0.04031634 0.7487033 3.347204 0 0.7491131 3.361125 -0.04299527 0.7541885 3.372479 0 0.7546146 3.376425 -0.04583334 0.7552085 3.388292 0 0.7556236 3.381941 -0.04867142 0.7519548 3.394209 0 0.7523358 3.377262 -0.05135029 0.7446184 3.389796 0 0.7449465 3.361976 -0.05371093 0.7333915 3.37462 0 0.7336509 3.335672 -0.05559414 0.7184651 3.348245 0 0.7186444 3.297938 -0.05684077 0.7000306 3.310239 0 0.7001221 3.130537 -0.0625 0.6782799 3.186516 -0.06331986 0.7030931 3.234776 -0.06558644 0.7227917 3.274967 -0.06901043 0.7375572 3.306737 -0.0733025 0.74757 3.329737 -0.07817322 0.753011 3.343616 -0.08333337 0.754061 3.348023 -0.08849346 0.7509012 3.342608 -0.09336423 0.743712 3.327021 -0.09765625 0.7326741 3.300912 -0.1010802 0.7179692 3.263929 -0.1033468 0.6997774 3.097667 -0.08437502 0.6782799 3.150537 -0.08548182 0.7024162 3.195696 -0.08854168 0.7216148 3.232884 -0.09316408 0.7360406 3.261845 -0.09895837 0.745858 3.282321 -0.1055338 0.7512322 3.294054 -0.1125 0.7523277 3.296786 -0.1194661 0.7493095 3.29026 -0.1260417 0.7423422 3.274217 -0.1318359 0.731591 3.248401 -0.1364583 0.7172201 3.212553 -0.1395182 0.699395 3.056463 -0.1 0.6782799 3.105436 -0.1013118 0.7015677 3.146707 -0.1049383 0.7201395 3.180132 -0.1104167 0.7341395 3.205571 -0.1172839 0.743712 3.222883 -0.1250771 0.7490022 3.231926 -0.1333333 0.7501547 3.232558 -0.1415895 0.7473145 3.224639 -0.1493827 0.7406256 3.208025 -0.15625 0.7302327 3.182577 -0.1617284 0.7162814 3.148153 -0.1653549 0.6989153 3.009704 -0.109375 0.6782799 3.054255 -0.1108097 0.7006052 3.091112 -0.1147763 0.7184651 3.120267 -0.1207683 0.7319818 3.14171 -0.1282793 0.7412765 3.155431 -0.1368032 0.7464719 3.161422 -0.1458333 0.747689 3.159671 -0.1548635 0.7450504 3.15017 -0.1633874 0.7386773 3.132909 -0.1708984 0.7286918 3.107879 -0.1768904 0.7152159 3.07507 -0.180857 0.6983712 2.960167 -0.1125 0.6782799 3.000032 -0.1139757 0.6995852 3.032215 -0.1180556 0.7166915 3.056846 -0.1242188 0.7296958 3.074056 -0.1319444 0.7386963 3.083973 -0.1407118 0.7437909 3.086729 -0.15 0.7450767 3.082454 -0.1592882 0.7426515 3.071278 -0.1680555 0.736613 3.053331 -0.1757813 0.7270591 3.028743 -0.1819444 0.714087 2.997645 -0.1860243 0.6977947 2.91063 -0.109375 0.6782799 2.94581 -0.1108097 0.6985653 2.973318 -0.1147763 0.7149174 2.993426 -0.1207683 0.7274098 3.006401 -0.1282793 0.7361164 3.012515 -0.1368032 0.7411099 3.012037 -0.1458333 0.7424643 3.005237 -0.1548635 0.740253 2.992386 -0.1633874 0.7345491 2.973752 -0.1708984 0.7254262 2.949607 -0.1768904 0.7129583 2.92022 -0.180857 0.6972182 2.86387 -0.1 0.6782799 2.894628 -0.1013118 0.6976025 2.917724 -0.1049383 0.713243 2.933561 -0.1104167 0.7252524 2.94254 -0.1172839 0.733681 2.945063 -0.1250771 0.7385795 2.941533 -0.1333333 0.7399984 2.93235 -0.1415895 0.7379887 2.917917 -0.1493827 0.7326007 2.898636 -0.15625 0.7238853 2.874908 -0.1617284 0.7118929 2.847137 -0.1653549 0.6966739 2.822667 -0.08437502 0.6782799 2.849527 -0.08548182 0.696754 2.868735 -0.08854168 0.7117677 2.880809 -0.09316408 0.7233512 2.886266 -0.09895837 0.731535 2.885626 -0.1055338 0.7363496 2.879405 -0.1125 0.7378256 2.868123 -0.1194661 0.7359936 2.852297 -0.1260417 0.7308838 2.832445 -0.1318359 0.722527 2.809085 -0.1364583 0.710954 2.782737 -0.1395182 0.6961947 2.789796 -0.0625 0.6782799 2.813548 -0.06331986 0.6960774 2.829654 -0.06558644 0.7105908 2.838726 -0.06901043 0.7218347 2.841374 -0.0733025 0.7298229 2.838209 -0.07817322 0.7345708 2.829843 -0.08333337 0.7360923 2.816885 -0.08849346 0.734402 2.799947 -0.09336423 0.7295141 2.77964 -0.09765625 0.7214439 2.756575 -0.1010802 0.7102048 2.731361 -0.1033468 0.695812 2.768037 -0.03437501 0.6782799 2.78973 -0.03482592 0.6956291 2.803783 -0.03607255 0.7098117 2.810868 -0.03795576 0.7208305 2.811656 -0.04031634 0.7286897 2.806821 -0.04299527 0.733393 2.797034 -0.04583334 0.7349446 2.782967 -0.04867142 0.7333484 2.765294 -0.05135029 0.7286077 2.744685 -0.05371093 0.7207265 2.721814 -0.05559414 0.7097092 2.697352 -0.05684077 0.6955586 2.760167 0 0.6782799 2.781116 0 0.6954672 2.794426 0 0.7095299 2.800792 0 0.7204673 2.800908 0 0.7282798 2.795468 0 0.7329671 2.785166 0 0.7345297 2.770699 0 0.7329674 2.752759 0 0.7282798 2.732042 0 0.7204671 2.709241 0 0.7095296 2.685051 0 0.695467 2.768037 0.03437495 0.6782799 2.78973 0.03482586 0.6956291 2.803783 0.03607249 0.7098117 2.810868 0.0379557 0.7208305 2.811656 0.04031628 0.7286897 2.806821 0.04299521 0.733393 2.797034 0.04583328 0.7349446 2.782967 0.04867136 0.7333484 2.765294 0.05135023 0.7286077 2.744685 0.05371087 0.7207265 2.721814 0.05559408 0.7097092 2.697352 0.05684071 0.6955586 2.789796 0.06249994 0.6782799 2.813548 0.0633198 0.6960774 2.829654 0.06558638 0.7105908 2.838726 0.06901037 0.7218347 2.841374 0.07330238 0.7298229 2.838209 0.07817316 0.7345708 2.829843 0.08333325 0.7360923 2.816885 0.0884934 0.7344022 2.799947 0.09336411 0.7295144 2.77964 0.09765619 0.7214439 2.756574 0.1010802 0.7102048 2.731361 0.1033468 0.695812 2.822667 0.08437496 0.6782799 2.849527 0.0854817 0.696754 2.868735 0.08854162 0.7117677 2.880809 0.09316402 0.7233512 2.886266 0.09895825 0.731535 2.885626 0.1055338 0.7363496 2.879405 0.1125 0.7378256 2.868123 0.1194661 0.7359936 2.852297 0.1260416 0.7308838 2.832445 0.1318359 0.722527 2.809085 0.1364583 0.710954 2.782737 0.1395182 0.6961947 2.863871 0.09999996 0.6782799 2.894628 0.1013117 0.6976025 2.917724 0.1049382 0.713243 2.933561 0.1104166 0.7252524 2.94254 0.1172839 0.733681 2.945063 0.1250771 0.7385795 2.941533 0.1333333 0.7399984 2.93235 0.1415895 0.7379887 2.917917 0.1493827 0.7326007 2.898636 0.15625 0.7238853 2.874908 0.1617283 0.7118929 2.847137 0.1653549 0.6966739 2.91063 0.109375 0.6782799 2.94581 0.1108096 0.6985653 2.973318 0.1147761 0.7149174 2.993426 0.1207681 0.7274098 3.006401 0.1282793 0.7361164 3.012515 0.1368031 0.7411099 3.012037 0.1458333 0.7424643 3.005237 0.1548635 0.740253 2.992386 0.1633873 0.7345491 2.973752 0.1708984 0.7254262 2.949607 0.1768904 0.7129583 2.92022 0.1808569 0.6972182 2.960167 0.1125 0.6782799 3.000032 0.1139757 0.6995852 3.032215 0.1180555 0.7166915 3.056846 0.1242187 0.7296958 3.074055 0.1319444 0.7386963 3.083973 0.1407117 0.7437909 3.086729 0.1499999 0.7450767 3.082454 0.1592881 0.7426515 3.071278 0.1680555 0.736613 3.053331 0.1757812 0.7270591 3.028743 0.1819444 0.714087 2.997645 0.1860243 0.6977947 3.009704 0.109375 0.6782799 3.054254 0.1108096 0.7006049 3.091112 0.1147761 0.7184649 3.120267 0.1207681 0.7319815 3.14171 0.1282793 0.7412765 3.155432 0.1368031 0.7464717 3.161422 0.1458333 0.7476888 3.159671 0.1548635 0.7450502 3.15017 0.1633873 0.738677 3.132909 0.1708984 0.7286918 3.107879 0.1768904 0.7152157 3.07507 0.1808569 0.6983712 3.056463 0.09999996 0.6782799 3.105436 0.1013117 0.7015677 3.146707 0.1049382 0.7201395 3.180132 0.1104166 0.7341395 3.205571 0.1172839 0.743712 3.222883 0.1250771 0.7490022 3.231926 0.1333333 0.7501547 3.232558 0.1415895 0.7473145 3.224639 0.1493827 0.7406256 3.208025 0.15625 0.7302327 3.182577 0.1617283 0.7162814 3.148153 0.1653549 0.6989153 3.097667 0.08437496 0.6782799 3.150537 0.0854817 0.7024162 3.195696 0.08854162 0.7216148 3.232884 0.09316402 0.7360406 3.261845 0.09895825 0.745858 3.282321 0.1055338 0.7512322 3.294054 0.1125 0.7523277 3.296786 0.1194661 0.7493095 3.29026 0.1260416 0.7423422 3.274217 0.1318359 0.731591 3.248401 0.1364583 0.7172201 3.212553 0.1395182 0.699395 3.130537 0.06249994 0.6782799 3.186516 0.0633198 0.7030931 3.234776 0.06558638 0.7227917 3.274967 0.06901037 0.7375572 3.306737 0.07330238 0.74757 3.329737 0.07817316 0.753011 3.343616 0.08333325 0.7540612 3.348023 0.0884934 0.7509012 3.342608 0.09336411 0.7437122 3.327021 0.09765619 0.7326741 3.300911 0.1010802 0.7179692 3.263928 0.1033468 0.6997774 3.152297 0.03437495 0.6782799 3.210334 0.03482586 0.7035408 3.260647 0.03607249 0.7235708 3.302825 0.0379557 0.7385612 3.336455 0.04031628 0.748703 3.361125 0.04299521 0.7541883 3.376425 0.04583328 0.7552083 3.381941 0.04867136 0.7519546 3.377262 0.05135023 0.7446184 3.361976 0.05371087 0.7333913 3.335672 0.05559408 0.7184649 3.297938 0.05684071 0.7000306 -0.01237028 -0.1982037 0.9782801 -0.0165739 -0.1678086 1.018644 -0.0398333 -0.1693287 1.018644 -0.0398333 -0.2 0.9782798 -0.01628255 -0.1697605 1.063696 -0.0398333 -0.1712963 1.063696 -0.01274031 -0.1951121 1.111874 -0.0398333 -0.196875 1.111874 -0.00719124 -0.2349166 1.161613 -0.0398333 -0.2370371 1.161613 -8.79254e-4 -0.2802267 1.211353 -0.0398333 -0.2827547 1.211353 0.004951536 -0.3220954 1.25953 -0.0398333 -0.3250001 1.25953 0.009057164 -0.3515755 1.304582 -0.0398333 -0.3547454 1.304582 0.01019358 -0.3597201 1.344946 -0.0398333 -0.362963 1.344946 0.007116794 -0.3375818 1.379061 -0.0398333 -0.3406251 1.379061 -0.001417219 -0.2762138 1.405363 -0.0398333 -0.2787037 1.405363 -0.01665258 -0.1666689 1.422291 -0.0398333 -0.1681713 1.422291 -0.0398333 0 1.42828 0.01387035 -0.192963 0.9782798 0.005647838 -0.1633735 1.018644 0.006211102 -0.1652789 1.063696 0.01312893 -0.1899675 1.111874 0.02396982 -0.2287277 1.161613 0.0363025 -0.2728481 1.211353 0.04769563 -0.3136169 1.25953 0.05571776 -0.3423227 1.304582 0.05793762 -0.3502538 1.344946 0.05192375 -0.3286986 1.379061 0.03524488 -0.2689457 1.405363 0.005469679 -0.1622833 1.422291 0.03866666 -0.1845 0.9782798 0.02664428 -0.1562111 1.018644 0.02745908 -0.1580404 1.063696 0.03755873 -0.1816567 1.111874 0.05339121 -0.2187291 1.161613 0.07140421 -0.2609266 1.211353 0.08804559 -0.299918 1.25953 0.09976309 -0.3273723 1.304582 0.1030046 -0.3349584 1.344946 0.09421795 -0.3143453 1.379061 0.06985086 -0.2572019 1.405363 0.02635115 -0.1551971 1.422291 0.0617963 -0.1730371 0.9782798 0.04622769 -0.1465092 1.018644 0.04727232 -0.1482339 1.063696 0.06033331 -0.1703959 1.111874 0.08081412 -0.2051797 1.161613 0.1041179 -0.2447702 1.211353 0.1256482 -0.2813519 1.25953 0.1408079 -0.3071095 1.304582 0.1450007 -0.3142278 1.344946 0.1336296 -0.2948912 1.379061 0.1020981 -0.2412846 1.405363 0.04580932 -0.1455927 1.422291 0.08303701 -0.1587963 0.9782798 0.06421029 -0.1344555 1.018644 0.06546193 -0.1360483 1.063696 0.08123683 -0.1564006 1.111873 0.1059799 -0.1883381 1.161613 0.134136 -0.2246865 1.211353 0.16015 -0.2582719 1.25953 0.178467 -0.2819197 1.304582 0.1835317 -0.2884559 1.344946 0.1697891 -0.2707063 1.379061 0.1316841 -0.2214965 1.405363 0.06366175 -0.1336525 1.422291 0.1021667 -0.142 0.9782801 0.0804044 -0.1202377 1.018644 0.08183914 -0.1216725 1.063696 0.1000534 -0.1398867 1.111874 0.1286296 -0.1684629 1.161613 0.1611503 -0.2009837 1.211353 0.1911979 -0.2310312 1.25953 0.2123549 -0.2521883 1.304582 0.2182037 -0.258037 1.344946 0.2023268 -0.2421602 1.379061 0.1583067 -0.19814 1.405363 0.07972586 -0.1195592 1.422291 0.118963 -0.1228704 0.9782798 0.09462213 -0.1040437 1.018644 0.09621495 -0.1052953 1.063696 0.1165672 -0.1210702 1.111873 0.1485047 -0.1458132 1.161613 0.1848532 -0.1739693 1.211353 0.2184385 -0.1999834 1.25953 0.2420864 -0.2183003 1.304582 0.2486225 -0.2233651 1.344946 0.2308729 -0.2096225 1.379061 0.1816632 -0.1715175 1.405363 0.0938192 -0.1034951 1.422291 0.1332037 -0.1016296 0.9782796 0.1066758 -0.08606106 1.018644 0.1084005 -0.08710563 1.063696 0.1305625 -0.1001667 1.111873 0.1653464 -0.1206475 1.161613 0.2049368 -0.1439513 1.211353 0.2415185 -0.1654815 1.25953 0.2672762 -0.1806413 1.304582 0.2743944 -0.184834 1.344946 0.2550579 -0.1734629 1.379061 0.2014513 -0.1419314 1.405363 0.1057593 -0.08564269 1.422291 0.1446667 -0.07850003 0.9782798 0.1163778 -0.06647765 1.018644 0.118207 -0.06729239 1.063696 0.1418234 -0.0773921 1.111874 0.1788958 -0.09322458 1.161613 0.2210932 -0.1112375 1.211353 0.2600846 -0.1278789 1.25953 0.2875389 -0.1395965 1.304582 0.295125 -0.142838 1.344946 0.2745119 -0.1340513 1.379061 0.2173685 -0.1096842 1.405363 0.1153638 -0.06618452 1.422291 0.1531296 -0.05370372 0.9782798 0.1235402 -0.04548114 1.018645 0.1254455 -0.04604446 1.063696 0.1501341 -0.05296224 1.111874 0.1888943 -0.06380319 1.161613 0.2330147 -0.07613587 1.211353 0.2737836 -0.08752894 1.25953 0.3024893 -0.09555107 1.304582 0.3104205 -0.09777092 1.344947 0.2888653 -0.09175711 1.379061 0.2291123 -0.07507824 1.405363 0.12245 -0.04530298 1.422291 0.1583704 -0.02746295 0.9782801 0.1279753 -0.0232594 1.018644 0.1299271 -0.02355068 1.063696 0.1552788 -0.02709293 1.111874 0.1950833 -0.03264206 1.161613 0.2403934 -0.03895407 1.211353 0.282262 -0.0447849 1.25953 0.3117422 -0.04889053 1.304582 0.3198867 -0.05002695 1.344947 0.2977485 -0.0469501 1.379061 0.2363805 -0.03841602 1.405364 0.1268355 -0.02318066 1.422291 -0.0398333 0 1.42828 0.1601667 0 0.9782798 0.1294954 0 1.018644 0.1314629 0 1.063696 0.1570417 0 1.111874 0.1972037 0 1.161613 0.2429213 0 1.211353 0.2851667 0 1.25953 0.314912 0 1.304582 0.3231297 0 1.344946 0.3007917 0 1.379061 0.2388703 0 1.405363 0.128338 0 1.422291 -0.238037 -0.02746295 0.9782801 -0.2076419 -0.0232594 1.018644 -0.209162 0 1.018644 -0.2398333 0 0.9782798 -0.2095937 -0.02355068 1.063696 -0.2111296 0 1.063696 -0.2349454 -0.02709293 1.111874 -0.2367083 0 1.111874 -0.2747499 -0.03264206 1.161613 -0.2768703 0 1.161613 -0.32006 -0.03895407 1.211353 -0.3225879 0 1.211353 -0.3619287 -0.0447849 1.25953 -0.3648333 0 1.25953 -0.3914088 -0.04889053 1.304582 -0.3945786 0 1.304582 -0.3995533 -0.05002695 1.344946 -0.4027963 0 1.344946 -0.3774151 -0.0469501 1.379061 -0.3804583 0 1.379061 -0.3160471 -0.03841602 1.405363 -0.318537 0 1.405363 -0.2065021 -0.02318066 1.422291 -0.2080046 0 1.422291 -0.2327963 -0.05370372 0.9782798 -0.2032068 -0.04548114 1.018644 -0.2051121 -0.04604446 1.063696 -0.2298007 -0.05296224 1.111874 -0.268561 -0.06380319 1.161613 -0.3126813 -0.07613587 1.211353 -0.3534502 -0.08752894 1.25953 -0.382156 -0.09555107 1.304582 -0.3900871 -0.09777092 1.344946 -0.368532 -0.09175711 1.379061 -0.308779 -0.07507824 1.405363 -0.2021166 -0.04530298 1.422291 -0.2243333 -0.07850003 0.9782798 -0.1960444 -0.06647765 1.018644 -0.1978737 -0.06729239 1.063696 -0.22149 -0.0773921 1.111874 -0.2585625 -0.09322458 1.161613 -0.3007599 -0.1112375 1.211353 -0.3397513 -0.1278789 1.25953 -0.3672055 -0.1395965 1.304582 -0.3747916 -0.142838 1.344946 -0.3541785 -0.1340513 1.379061 -0.2970351 -0.1096842 1.405363 -0.1950304 -0.06618452 1.422291 -0.2128703 -0.1016296 0.9782798 -0.1863424 -0.08606106 1.018644 -0.1880671 -0.08710563 1.063696 -0.2102291 -0.1001667 1.111874 -0.245013 -0.1206475 1.161613 -0.2846035 -0.1439513 1.211353 -0.3211852 -0.1654815 1.25953 -0.3469428 -0.1806413 1.304582 -0.354061 -0.184834 1.344946 -0.3347245 -0.1734629 1.379061 -0.2811179 -0.1419314 1.405363 -0.1854259 -0.08564269 1.422291 -0.1986296 -0.1228704 0.9782798 -0.1742888 -0.1040437 1.018644 -0.1758816 -0.1052953 1.063696 -0.1962338 -0.1210702 1.111873 -0.2281713 -0.1458132 1.161613 -0.2645198 -0.1739693 1.211353 -0.2981051 -0.1999834 1.25953 -0.321753 -0.2183003 1.304582 -0.3282892 -0.2233651 1.344946 -0.3105396 -0.2096225 1.379061 -0.2613298 -0.1715175 1.405363 -0.1734858 -0.1034951 1.422291 -0.1818333 -0.142 0.9782801 -0.160071 -0.1202377 1.018644 -0.1615057 -0.1216725 1.063696 -0.17972 -0.1398867 1.111874 -0.2082962 -0.1684629 1.161613 -0.240817 -0.2009837 1.211353 -0.2708646 -0.2310312 1.25953 -0.2920215 -0.2521883 1.304582 -0.2978703 -0.258037 1.344946 -0.2819935 -0.2421602 1.379061 -0.2379733 -0.19814 1.405363 -0.1593924 -0.1195592 1.422291 -0.1627036 -0.1587963 0.9782798 -0.1438769 -0.1344555 1.018644 -0.1451286 -0.1360483 1.063696 -0.1609034 -0.1564005 1.111873 -0.1856465 -0.1883381 1.161613 -0.2138026 -0.2246865 1.211353 -0.2398166 -0.2582719 1.25953 -0.2581336 -0.2819197 1.304582 -0.2631983 -0.2884559 1.344946 -0.2494558 -0.2707063 1.379061 -0.2113507 -0.2214965 1.405363 -0.1433283 -0.1336525 1.422291 -0.1414629 -0.1730371 0.9782796 -0.1258943 -0.1465092 1.018644 -0.1269389 -0.1482339 1.063696 -0.1399999 -0.1703959 1.111873 -0.1604807 -0.2051797 1.161613 -0.1837846 -0.2447702 1.211353 -0.2053148 -0.2813519 1.25953 -0.2204746 -0.3071095 1.304582 -0.2246673 -0.3142278 1.344946 -0.2132962 -0.2948912 1.379061 -0.1817647 -0.2412846 1.405363 -0.125476 -0.1455927 1.422291 -0.1183333 -0.1845 0.9782798 -0.1063109 -0.1562111 1.018644 -0.1071256 -0.1580404 1.063696 -0.1172254 -0.1816567 1.111874 -0.1330578 -0.2187291 1.161613 -0.1510708 -0.2609266 1.211353 -0.1677122 -0.299918 1.25953 -0.1794297 -0.3273723 1.304582 -0.1826713 -0.3349584 1.344946 -0.1738845 -0.3143453 1.379061 -0.1495174 -0.2572019 1.405363 -0.1060178 -0.1551971 1.422291 -0.09353697 -0.192963 0.9782798 -0.08531445 -0.1633735 1.018645 -0.08587771 -0.1652789 1.063696 -0.09279555 -0.1899675 1.111874 -0.1036365 -0.2287277 1.161613 -0.1159691 -0.2728481 1.211353 -0.1273622 -0.3136169 1.25953 -0.1353843 -0.3423227 1.304582 -0.1376042 -0.3502538 1.344947 -0.1315904 -0.3286986 1.379061 -0.1149115 -0.2689457 1.405363 -0.08513629 -0.1622833 1.422291 -0.06729626 -0.1982037 0.9782801 -0.06309264 -0.1678086 1.018644 -0.06338399 -0.1697605 1.063696 -0.06692624 -0.1951121 1.111874 -0.07247537 -0.2349166 1.161613 -0.07878732 -0.2802267 1.211353 -0.08461815 -0.3220954 1.25953 -0.08872377 -0.3515755 1.304582 -0.0898602 -0.3597201 1.344947 -0.0867834 -0.3375818 1.379061 -0.07824933 -0.2762138 1.405364 -0.06301397 -0.1666689 1.422291 -0.06729626 0.1982036 0.9782801 -0.06309264 0.1678085 1.018644 -0.0398333 0.1693286 1.018644 -0.0398333 0.1999999 0.9782798 -0.06338399 0.1697604 1.063696 -0.0398333 0.1712962 1.063696 -0.06692624 0.1951121 1.111874 -0.0398333 0.1968749 1.111874 -0.07247531 0.2349165 1.161613 -0.0398333 0.237037 1.161613 -0.07878732 0.2802267 1.211353 -0.0398333 0.2827546 1.211353 -0.08461815 0.3220953 1.25953 -0.0398333 0.325 1.25953 -0.08872377 0.3515754 1.304582 -0.0398333 0.3547453 1.304582 -0.0898602 0.35972 1.344946 -0.0398333 0.3629629 1.344946 -0.0867834 0.3375818 1.379061 -0.0398333 0.340625 1.379061 -0.07824933 0.2762138 1.405363 -0.0398333 0.2787036 1.405363 -0.06301397 0.1666688 1.422291 -0.0398333 0.1681712 1.422291 -0.09353697 0.1929629 0.9782798 -0.08531445 0.1633734 1.018644 -0.08587771 0.1652788 1.063696 -0.09279555 0.1899674 1.111874 -0.1036365 0.2287276 1.161613 -0.1159691 0.272848 1.211353 -0.1273622 0.3136168 1.25953 -0.1353843 0.3423226 1.304582 -0.1376042 0.3502537 1.344946 -0.1315904 0.3286986 1.379061 -0.1149115 0.2689456 1.405363 -0.08513629 0.1622833 1.422291 -0.1183333 0.1844999 0.9782798 -0.1063109 0.156211 1.018644 -0.1071256 0.1580403 1.063696 -0.1172254 0.1816567 1.111874 -0.1330578 0.2187291 1.161613 -0.1510708 0.2609266 1.211353 -0.1677122 0.2999179 1.25953 -0.1794297 0.3273722 1.304582 -0.1826713 0.3349583 1.344946 -0.1738845 0.3143452 1.379061 -0.1495174 0.2572018 1.405363 -0.1060178 0.155197 1.422291 -0.1414629 0.173037 0.9782798 -0.1258943 0.1465091 1.018644 -0.1269389 0.1482338 1.063696 -0.1399999 0.1703958 1.111874 -0.1604807 0.2051796 1.161613 -0.1837846 0.2447701 1.211353 -0.2053148 0.2813518 1.25953 -0.2204746 0.3071095 1.304582 -0.2246673 0.3142277 1.344946 -0.2132962 0.2948912 1.379061 -0.1817647 0.2412846 1.405363 -0.125476 0.1455926 1.422291 -0.1627036 0.1587963 0.9782798 -0.1438769 0.1344554 1.018644 -0.1451286 0.1360482 1.063696 -0.1609034 0.1564005 1.111873 -0.1856465 0.188338 1.161613 -0.2138026 0.2246865 1.211353 -0.2398166 0.2582718 1.25953 -0.2581336 0.2819197 1.304582 -0.2631983 0.2884559 1.344946 -0.2494558 0.2707062 1.379061 -0.2113507 0.2214965 1.405363 -0.1433283 0.1336525 1.422291 -0.1818333 0.142 0.9782801 -0.160071 0.1202377 1.018644 -0.1615057 0.1216724 1.063696 -0.17972 0.1398867 1.111874 -0.2082962 0.1684629 1.161613 -0.240817 0.2009836 1.211353 -0.2708646 0.2310312 1.25953 -0.2920215 0.2521882 1.304582 -0.2978703 0.258037 1.344946 -0.2819935 0.2421601 1.379061 -0.2379733 0.19814 1.405363 -0.1593924 0.1195591 1.422291 -0.1986296 0.1228703 0.9782798 -0.1742887 0.1040436 1.018644 -0.1758816 0.1052952 1.063696 -0.1962338 0.1210701 1.111873 -0.2281713 0.1458131 1.161613 -0.2645198 0.1739692 1.211353 -0.2981051 0.1999833 1.25953 -0.321753 0.2183002 1.304582 -0.3282892 0.223365 1.344946 -0.3105396 0.2096225 1.379061 -0.2613298 0.1715174 1.405363 -0.1734858 0.103495 1.422291 -0.2128703 0.1016296 0.9782796 -0.1863424 0.086061 1.018644 -0.1880671 0.08710557 1.063696 -0.2102291 0.1001666 1.111873 -0.245013 0.1206474 1.161613 -0.2846035 0.1439512 1.211353 -0.3211852 0.1654814 1.25953 -0.3469428 0.1806412 1.304582 -0.354061 0.184834 1.344946 -0.3347245 0.1734629 1.379061 -0.2811179 0.1419314 1.405363 -0.1854259 0.08564263 1.422291 -0.2243333 0.07849997 0.9782798 -0.1960444 0.06647759 1.018644 -0.1978737 0.06729233 1.063696 -0.22149 0.07739204 1.111874 -0.2585625 0.09322446 1.161613 -0.3007599 0.1112375 1.211353 -0.3397513 0.1278789 1.25953 -0.3672055 0.1395964 1.304582 -0.3747916 0.1428379 1.344946 -0.3541785 0.1340512 1.379061 -0.2970351 0.1096841 1.405363 -0.1950304 0.0661844 1.422291 -0.2327963 0.05370366 0.9782798 -0.2032068 0.04548108 1.018645 -0.2051121 0.0460444 1.063696 -0.2298007 0.05296218 1.111874 -0.268561 0.06380307 1.161613 -0.3126813 0.07613581 1.211353 -0.3534502 0.08752888 1.25953 -0.382156 0.09555101 1.304582 -0.3900871 0.09777086 1.344947 -0.368532 0.09175705 1.379061 -0.308779 0.07507818 1.405363 -0.2021166 0.04530292 1.422291 -0.238037 0.02746289 0.9782801 -0.2076419 0.02325928 1.018644 -0.2095937 0.02355062 1.063696 -0.2349454 0.02709287 1.111874 -0.2747499 0.032642 1.161613 -0.32006 0.03895401 1.211353 -0.3619287 0.04478478 1.25953 -0.3914088 0.04889041 1.304582 -0.3995533 0.05002683 1.344947 -0.3774151 0.04695004 1.379061 -0.3160471 0.03841596 1.405364 -0.2065021 0.0231806 1.422291 0.1583704 0.02746289 0.9782801 0.1279753 0.02325928 1.018644 0.1299271 0.02355062 1.063696 0.1552788 0.02709287 1.111874 0.1950833 0.032642 1.161613 0.2403934 0.03895401 1.211353 0.282262 0.04478478 1.25953 0.3117422 0.04889041 1.304582 0.3198867 0.05002683 1.344946 0.2977485 0.04695004 1.379061 0.2363805 0.03841596 1.405363 0.1268355 0.0231806 1.422291 0.1531296 0.05370366 0.9782798 0.1235402 0.04548108 1.018644 0.1254455 0.0460444 1.063696 0.1501341 0.05296218 1.111874 0.1888943 0.06380307 1.161613 0.2330147 0.07613581 1.211353 0.2737836 0.08752888 1.25953 0.3024893 0.09555101 1.304582 0.3104205 0.09777086 1.344946 0.2888653 0.09175705 1.379061 0.2291123 0.07507818 1.405363 0.12245 0.04530292 1.422291 0.1446667 0.07849997 0.9782798 0.1163778 0.06647759 1.018644 0.118207 0.06729233 1.063696 0.1418234 0.07739204 1.111874 0.1788958 0.09322446 1.161613 0.2210932 0.1112375 1.211353 0.2600846 0.1278789 1.25953 0.2875389 0.1395964 1.304582 0.295125 0.1428379 1.344946 0.2745119 0.1340512 1.379061 0.2173685 0.1096841 1.405363 0.1153638 0.0661844 1.422291 0.1332037 0.1016296 0.9782798 0.1066758 0.086061 1.018644 0.1084005 0.08710557 1.063696 0.1305625 0.1001666 1.111874 0.1653464 0.1206474 1.161613 0.2049368 0.1439512 1.211353 0.2415185 0.1654814 1.25953 0.2672762 0.1806412 1.304582 0.2743944 0.184834 1.344946 0.2550579 0.1734629 1.379061 0.2014513 0.1419314 1.405363 0.1057593 0.08564263 1.422291 0.118963 0.1228703 0.9782798 0.09462213 0.1040436 1.018644 0.09621495 0.1052952 1.063696 0.1165672 0.1210701 1.111873 0.1485047 0.1458131 1.161613 0.1848532 0.1739692 1.211353 0.2184385 0.1999833 1.25953 0.2420864 0.2183002 1.304582 0.2486225 0.223365 1.344946 0.2308729 0.2096225 1.379061 0.1816632 0.1715174 1.405363 0.0938192 0.103495 1.422291 0.1021667 0.142 0.9782801 0.0804044 0.1202377 1.018644 0.08183914 0.1216724 1.063696 0.1000534 0.1398867 1.111874 0.1286296 0.1684629 1.161613 0.1611503 0.2009836 1.211353 0.1911979 0.2310312 1.25953 0.2123549 0.2521882 1.304582 0.2182037 0.258037 1.344946 0.2023268 0.2421601 1.379061 0.1583067 0.19814 1.405363 0.07972586 0.1195591 1.422291 0.08303701 0.1587962 0.9782798 0.06421029 0.1344554 1.018644 0.06546193 0.1360482 1.063696 0.08123683 0.1564005 1.111873 0.1059799 0.188338 1.161613 0.134136 0.2246865 1.211353 0.16015 0.2582718 1.25953 0.178467 0.2819197 1.304582 0.1835317 0.2884559 1.344946 0.1697891 0.2707062 1.379061 0.1316841 0.2214965 1.405363 0.06366175 0.1336525 1.422291 0.0617963 0.173037 0.9782796 0.04622769 0.1465091 1.018644 0.04727232 0.1482338 1.063696 0.06033331 0.1703958 1.111873 0.08081412 0.2051796 1.161613 0.1041179 0.2447701 1.211353 0.1256482 0.2813518 1.25953 0.1408079 0.3071095 1.304582 0.1450007 0.3142277 1.344946 0.1336296 0.2948912 1.379061 0.1020981 0.2412846 1.405363 0.04580932 0.1455926 1.422291 0.03866666 0.1844999 0.9782798 0.02664428 0.156211 1.018644 0.02745908 0.1580403 1.063696 0.03755873 0.1816567 1.111874 0.05339121 0.2187291 1.161613 0.07140421 0.2609266 1.211353 0.08804559 0.2999179 1.25953 0.09976309 0.3273722 1.304582 0.1030046 0.3349583 1.344946 0.09421795 0.3143452 1.379061 0.06985086 0.2572018 1.405363 0.02635115 0.155197 1.422291 0.01387035 0.1929629 0.9782798 0.005647838 0.1633734 1.018645 0.006211102 0.1652788 1.063696 0.01312893 0.1899674 1.111874 0.02396982 0.2287276 1.161613 0.0363025 0.272848 1.211353 0.04769563 0.3136168 1.25953 0.05571776 0.3423226 1.304582 0.05793762 0.3502537 1.344947 0.05192375 0.3286986 1.379061 0.03524488 0.2689456 1.405363 0.005469679 0.1622833 1.422291 -0.01237028 0.1982036 0.9782801 -0.0165739 0.1678085 1.018644 -0.01628255 0.1697604 1.063696 -0.01274031 0.1951121 1.111874 -0.00719124 0.2349165 1.161613 -8.79254e-4 0.2802267 1.211353 0.004951536 0.3220953 1.25953 0.009057164 0.3515754 1.304582 0.01019358 0.35972 1.344947 0.007116794 0.3375818 1.379061 -0.001417219 0.2762138 1.405364 -0.01665258 0.1666688 1.422291 0.1386759 -1.288324 0.6782799 0.1362284 -1.27066 0.7128284 -0.0398333 -1.282176 0.7128284 -0.0398333 -1.3 0.6782799 0.1293945 -1.221338 0.7421687 -0.0398333 -1.232407 0.7421687 0.1189369 -1.145865 0.7673423 -0.0398333 -1.15625 0.7673423 0.1056187 -1.049746 0.7893908 -0.0398333 -1.059259 0.7893908 0.09020251 -0.9384853 0.8093562 -0.0398333 -0.9469908 0.8093562 0.07345139 -0.8175903 0.8282797 -0.0398333 -0.8250001 0.8282797 0.05612814 -0.692566 0.8472035 -0.0398333 -0.6988426 0.8472033 0.03899556 -0.5689181 0.8671687 -0.0398333 -0.5740742 0.8671687 0.02281653 -0.4521523 0.8892171 -0.0398333 -0.45625 0.8892171 0.008354008 -0.3477741 0.9143908 -0.0398333 -0.3509259 0.9143906 -0.003629207 -0.2612894 0.9437311 -0.0398333 -0.2636574 0.9437311 0.3092408 -1.254259 0.6782799 0.3044546 -1.237062 0.7128284 0.2910909 -1.189045 0.7421687 0.2706412 -1.115567 0.7673423 0.2445974 -1.021989 0.7893908 0.2144512 -0.9136707 0.8093562 0.1816944 -0.7959723 0.8282797 0.1478188 -0.6742538 0.8472033 0.1143162 -0.5538753 0.8671687 0.08267825 -0.4401968 0.8892171 0.0543968 -0.3385785 0.9143906 0.03096359 -0.2543806 0.9437311 0.4704167 -1.19925 0.6782799 0.4634207 -1.182807 0.7128284 0.4438866 -1.136896 0.7421687 0.4139948 -1.066641 0.7673423 0.3759259 -0.9771667 0.7893908 0.3318606 -0.873599 0.8093562 0.2839792 -0.7610626 0.8282797 0.2344623 -0.6446824 0.8472033 0.1854907 -0.5295834 0.8671687 0.1392448 -0.4208906 0.8892171 0.09790509 -0.3237292 0.9143906 0.06365221 -0.243224 0.9437311 0.6207593 -1.124741 0.6782799 0.611702 -1.10932 0.7128284 0.5864122 -1.066261 0.7421687 0.5477129 -1.00037 0.7673423 0.4984273 -0.9164555 0.7893908 0.4413783 -0.8193224 0.8093562 0.3793889 -0.7137778 0.8282797 0.3152822 -0.6046283 0.8472033 0.2518814 -0.4966804 0.8671687 0.1920093 -0.3947408 0.8892171 0.138489 -0.3036159 0.9143906 0.09414368 -0.2281125 0.9437311 0.7588241 -1.032176 0.6782799 0.7478739 -1.018024 0.7128284 0.7172985 -0.9785087 0.7421684 0.6705111 -0.9180412 0.7673421 0.6109246 -0.8410323 0.7893908 0.5419522 -0.7518932 0.809356 0.467007 -0.6550348 0.8282795 0.3895019 -0.5548681 0.8472033 0.3128502 -0.4558042 0.8671684 0.2404647 -0.362254 0.8892171 0.1757587 -0.2786287 0.9143906 0.1221451 -0.2093391 0.9437311 0.8831667 -0.923 0.6782799 0.8705116 -0.910345 0.7128284 0.8351759 -0.8750093 0.7421684 0.7811042 -0.8209376 0.7673421 0.7122408 -0.7520741 0.7893908 0.6325301 -0.6723635 0.809356 0.5459167 -0.5857501 0.8282795 0.4563449 -0.4961782 0.8472033 0.3677593 -0.4075926 0.8671687 0.2841042 -0.3239375 0.8892171 0.2093241 -0.2491574 0.9143906 0.1473634 -0.1871967 0.9437311 0.9923426 -0.7986575 0.6782799 0.9781906 -0.7877073 0.7128284 0.9386753 -0.7571319 0.7421687 0.8782078 -0.7103444 0.7673423 0.801199 -0.650758 0.7893908 0.7120598 -0.5817856 0.8093562 0.6152014 -0.5068404 0.8282797 0.5150347 -0.4293353 0.8472033 0.4159709 -0.3526835 0.8671687 0.3224207 -0.2802981 0.8892171 0.2387953 -0.215592 0.9143906 0.1695057 -0.1619784 0.9437311 1.084907 -0.6605926 0.6782799 1.069486 -0.6515353 0.7128284 1.026427 -0.6262456 0.7421687 0.9605371 -0.5875463 0.7673423 0.8766221 -0.5382606 0.7893908 0.779489 -0.4812116 0.8093562 0.6739445 -0.4192222 0.8282797 0.564795 -0.3551156 0.8472033 0.456847 -0.2917147 0.8671687 0.3549074 -0.2318426 0.8892171 0.2637826 -0.1783224 0.9143906 0.1882792 -0.133977 0.9437311 1.159417 -0.51025 0.6782799 1.142974 -0.5032541 0.7128284 1.097062 -0.4837199 0.7421687 1.026807 -0.4538281 0.7673423 0.9373334 -0.4157593 0.7893908 0.8337656 -0.3716939 0.8093562 0.7212292 -0.3238125 0.8282797 0.604849 -0.2742957 0.8472033 0.48975 -0.225324 0.8671687 0.3810573 -0.1790781 0.8892171 0.2838959 -0.1377384 0.9143906 0.2033906 -0.1034855 0.9437311 1.214426 -0.3490741 0.6782799 1.197229 -0.344288 0.7128284 1.149212 -0.3309242 0.7421687 1.075734 -0.3104746 0.7673423 0.9821557 -0.2844308 0.7893908 0.8738374 -0.2542846 0.8093562 0.7561389 -0.2215278 0.8282797 0.6344204 -0.1876522 0.8472033 0.5140419 -0.1541495 0.8671687 0.4003635 -0.1225116 0.8892171 0.2987452 -0.09423011 0.9143906 0.2145472 -0.0707969 0.9437311 1.248491 -0.1785092 0.6782799 1.230827 -0.1760618 0.7128284 1.181505 -0.1692278 0.7421689 1.106032 -0.1587703 0.7673426 1.009912 -0.145452 0.7893911 0.898652 -0.1300359 0.8093562 0.7777569 -0.1132847 0.8282797 0.6527326 -0.09596145 0.8472037 0.5290848 -0.07882887 0.8671689 0.4123189 -0.0626499 0.8892174 0.3079408 -0.04818731 0.9143908 0.2214561 -0.03620409 0.9437313 1.260167 0 0.6782799 1.242343 0 0.7128284 1.192574 0 0.7421687 1.116417 0 0.7673423 1.019426 0 0.7893908 0.9071574 0 0.8093562 0.7851668 0 0.8282797 0.6590092 0 0.8472033 0.5342408 0 0.8671687 0.4164167 0 0.8892171 0.3110926 0 0.9143906 0.223824 0 0.9437311 -1.328157 -0.1785092 0.6782799 -1.310493 -0.1760618 0.7128284 -1.322009 0 0.7128284 -1.339833 0 0.6782799 -1.261172 -0.1692278 0.7421687 -1.272241 0 0.7421687 -1.185698 -0.1587703 0.7673423 -1.196083 0 0.7673423 -1.089579 -0.145452 0.7893908 -1.099092 0 0.7893908 -0.9783186 -0.1300359 0.8093562 -0.986824 0 0.8093562 -0.8574236 -0.1132847 0.8282797 -0.8648334 0 0.8282797 -0.7323992 -0.09596145 0.8472035 -0.7386758 0 0.8472033 -0.6087514 -0.07882887 0.8671687 -0.6139074 0 0.8671687 -0.4919855 -0.0626499 0.8892171 -0.4960833 0 0.8892171 -0.3876074 -0.04818731 0.9143908 -0.3907592 0 0.9143906 -0.3011227 -0.03620409 0.9437311 -0.3034907 0 0.9437311 -1.294093 -0.3490741 0.6782799 -1.276896 -0.344288 0.7128284 -1.228878 -0.3309242 0.7421687 -1.1554 -0.3104746 0.7673423 -1.061822 -0.2844308 0.7893908 -0.953504 -0.2542846 0.8093562 -0.8358055 -0.2215278 0.8282797 -0.714087 -0.1876522 0.8472033 -0.5937085 -0.1541495 0.8671687 -0.4800301 -0.1225116 0.8892171 -0.3784118 -0.09423011 0.9143906 -0.2942138 -0.0707969 0.9437311 -1.239083 -0.51025 0.6782799 -1.22264 -0.5032541 0.7128284 -1.176729 -0.4837199 0.7421687 -1.106474 -0.4538281 0.7673423 -1.017 -0.4157593 0.7893908 -0.9134323 -0.3716939 0.8093562 -0.8008958 -0.3238125 0.8282797 -0.6845156 -0.2742957 0.8472033 -0.5694167 -0.225324 0.8671687 -0.4607239 -0.1790781 0.8892171 -0.3635625 -0.1377384 0.9143906 -0.2830573 -0.1034855 0.9437311 -1.164574 -0.6605926 0.6782799 -1.149153 -0.6515353 0.7128284 -1.106094 -0.6262456 0.7421687 -1.040204 -0.5875463 0.7673423 -0.9562887 -0.5382606 0.7893908 -0.8591556 -0.4812116 0.8093562 -0.7536111 -0.4192222 0.8282797 -0.6444616 -0.3551156 0.8472033 -0.5365136 -0.2917147 0.8671687 -0.434574 -0.2318426 0.8892171 -0.3434492 -0.1783224 0.9143906 -0.2679458 -0.133977 0.9437311 -1.072009 -0.7986575 0.6782799 -1.057857 -0.7877073 0.7128284 -1.018342 -0.7571319 0.7421684 -0.9578744 -0.7103444 0.7673421 -0.8808656 -0.650758 0.7893908 -0.7917264 -0.5817856 0.809356 -0.694868 -0.5068404 0.8282795 -0.5947014 -0.4293353 0.8472033 -0.4956375 -0.3526835 0.8671684 -0.4020873 -0.2802981 0.8892171 -0.318462 -0.215592 0.9143906 -0.2491724 -0.1619784 0.9437311 -0.9628333 -0.923 0.6782799 -0.9501782 -0.910345 0.7128284 -0.9148426 -0.8750093 0.7421684 -0.8607708 -0.8209376 0.7673421 -0.7919074 -0.7520741 0.7893908 -0.7121967 -0.6723635 0.809356 -0.6255833 -0.5857501 0.8282795 -0.5360115 -0.4961782 0.8472033 -0.4474259 -0.4075926 0.8671687 -0.3637709 -0.3239375 0.8892171 -0.2889907 -0.2491574 0.9143906 -0.22703 -0.1871967 0.9437311 -0.8384907 -1.032176 0.6782799 -0.8275405 -1.018024 0.7128284 -0.7969651 -0.9785087 0.7421687 -0.7501777 -0.9180412 0.7673423 -0.6905912 -0.8410323 0.7893908 -0.6216188 -0.7518932 0.8093562 -0.5466736 -0.6550347 0.8282797 -0.4691686 -0.5548681 0.8472033 -0.3925168 -0.4558042 0.8671687 -0.3201314 -0.362254 0.8892171 -0.2554253 -0.2786287 0.9143906 -0.2018117 -0.2093391 0.9437311 -0.7004259 -1.124741 0.6782799 -0.6913686 -1.10932 0.7128284 -0.6660788 -1.066261 0.7421687 -0.6273795 -1.00037 0.7673423 -0.5780939 -0.9164555 0.7893908 -0.5210449 -0.8193224 0.8093562 -0.4590555 -0.7137778 0.8282797 -0.3949488 -0.6046283 0.8472033 -0.331548 -0.4966804 0.8671687 -0.2716759 -0.3947408 0.8892171 -0.2181556 -0.3036159 0.9143906 -0.1738103 -0.2281125 0.9437311 -0.5500833 -1.19925 0.6782799 -0.5430873 -1.182807 0.7128284 -0.5235532 -1.136896 0.7421687 -0.4936614 -1.066641 0.7673423 -0.4555925 -0.9771667 0.7893908 -0.4115272 -0.873599 0.8093562 -0.3636458 -0.7610626 0.8282797 -0.314129 -0.6446824 0.8472033 -0.2651574 -0.5295834 0.8671687 -0.2189114 -0.4208906 0.8892171 -0.1775717 -0.3237292 0.9143906 -0.1433188 -0.243224 0.9437311 -0.3889074 -1.254259 0.6782799 -0.3841212 -1.237062 0.7128284 -0.3707575 -1.189045 0.7421687 -0.3503078 -1.115567 0.7673423 -0.3242641 -1.021989 0.7893908 -0.2941178 -0.9136707 0.8093562 -0.2613611 -0.7959723 0.8282797 -0.2274854 -0.6742538 0.8472033 -0.1939828 -0.5538753 0.8671687 -0.1623448 -0.4401968 0.8892171 -0.1340634 -0.3385785 0.9143906 -0.1106302 -0.2543806 0.9437311 -0.2183426 -1.288324 0.6782799 -0.215895 -1.27066 0.7128284 -0.2090611 -1.221338 0.7421689 -0.1986035 -1.145865 0.7673426 -0.1852853 -1.049746 0.7893911 -0.1698691 -0.9384853 0.8093562 -0.153118 -0.8175903 0.8282797 -0.1357947 -0.692566 0.8472037 -0.1186621 -0.5689181 0.8671689 -0.1024832 -0.4521523 0.8892174 -0.08802062 -0.3477741 0.9143908 -0.07603734 -0.2612894 0.9437313 -0.2183426 1.288324 0.6782799 -0.215895 1.27066 0.7128284 -0.0398333 1.282176 0.7128284 -0.0398333 1.3 0.6782799 -0.2090611 1.221338 0.7421687 -0.0398333 1.232407 0.7421687 -0.1986035 1.145865 0.7673423 -0.0398333 1.15625 0.7673423 -0.1852853 1.049746 0.7893908 -0.0398333 1.059259 0.7893908 -0.1698691 0.9384852 0.8093562 -0.0398333 0.9469907 0.8093562 -0.153118 0.8175902 0.8282797 -0.0398333 0.825 0.8282797 -0.1357947 0.6925659 0.8472035 -0.0398333 0.6988425 0.8472033 -0.1186621 0.568918 0.8671687 -0.0398333 0.574074 0.8671687 -0.1024832 0.4521522 0.8892171 -0.0398333 0.45625 0.8892171 -0.08802062 0.347774 0.9143908 -0.0398333 0.3509259 0.9143906 -0.07603734 0.2612894 0.9437311 -0.0398333 0.2636573 0.9437311 -0.3889074 1.254259 0.6782799 -0.3841212 1.237062 0.7128284 -0.3707575 1.189045 0.7421687 -0.3503078 1.115567 0.7673423 -0.3242641 1.021989 0.7893908 -0.2941178 0.9136706 0.8093562 -0.2613611 0.7959722 0.8282797 -0.2274854 0.6742537 0.8472033 -0.1939828 0.5538752 0.8671687 -0.1623448 0.4401967 0.8892171 -0.1340634 0.3385785 0.9143906 -0.1106302 0.2543805 0.9437311 -0.5500833 1.19925 0.6782799 -0.5430873 1.182807 0.7128284 -0.5235532 1.136896 0.7421687 -0.4936614 1.066641 0.7673423 -0.4555925 0.9771666 0.7893908 -0.4115272 0.8735989 0.8093562 -0.3636458 0.7610625 0.8282797 -0.314129 0.6446822 0.8472033 -0.2651574 0.5295833 0.8671687 -0.2189114 0.4208906 0.8892171 -0.1775717 0.3237291 0.9143906 -0.1433188 0.2432239 0.9437311 -0.7004259 1.124741 0.6782799 -0.6913686 1.10932 0.7128284 -0.6660788 1.066261 0.7421687 -0.6273795 1.00037 0.7673423 -0.5780939 0.9164553 0.7893908 -0.5210449 0.8193222 0.8093562 -0.4590555 0.7137777 0.8282797 -0.3949488 0.6046282 0.8472033 -0.331548 0.4966803 0.8671687 -0.2716759 0.3947407 0.8892171 -0.2181556 0.3036159 0.9143906 -0.1738103 0.2281124 0.9437311 -0.8384907 1.032176 0.6782799 -0.8275405 1.018024 0.7128284 -0.7969651 0.9785085 0.7421684 -0.7501777 0.9180411 0.7673421 -0.6905912 0.8410322 0.7893908 -0.6216188 0.7518931 0.809356 -0.5466736 0.6550347 0.8282795 -0.4691686 0.554868 0.8472033 -0.3925168 0.4558042 0.8671684 -0.3201314 0.362254 0.8892171 -0.2554253 0.2786287 0.9143906 -0.2018117 0.209339 0.9437311 -0.9628333 0.9229999 0.6782799 -0.9501782 0.9103448 0.7128284 -0.9148426 0.8750092 0.7421684 -0.8607708 0.8209375 0.7673421 -0.7919074 0.752074 0.7893908 -0.7121967 0.6723634 0.809356 -0.6255833 0.5857499 0.8282795 -0.5360115 0.4961782 0.8472033 -0.4474259 0.4075925 0.8671687 -0.3637709 0.3239375 0.8892171 -0.2889907 0.2491573 0.9143906 -0.22703 0.1871967 0.9437311 -1.072009 0.7986574 0.6782799 -1.057857 0.7877072 0.7128284 -1.018342 0.7571318 0.7421687 -0.9578744 0.7103443 0.7673423 -0.8808656 0.6507579 0.7893908 -0.7917264 0.5817855 0.8093562 -0.694868 0.5068402 0.8282797 -0.5947014 0.4293352 0.8472033 -0.4956375 0.3526834 0.8671687 -0.4020873 0.280298 0.8892171 -0.318462 0.2155919 0.9143906 -0.2491723 0.1619784 0.9437311 -1.164574 0.6605925 0.6782799 -1.149153 0.6515352 0.7128284 -1.106094 0.6262454 0.7421687 -1.040204 0.5875462 0.7673423 -0.9562887 0.5382605 0.7893908 -0.8591556 0.4812116 0.8093562 -0.7536111 0.4192222 0.8282797 -0.6444616 0.3551155 0.8472033 -0.5365136 0.2917146 0.8671687 -0.434574 0.2318425 0.8892171 -0.3434492 0.1783223 0.9143906 -0.2679458 0.1339769 0.9437311 -1.239083 0.5102499 0.6782799 -1.22264 0.5032539 0.7128284 -1.176729 0.4837198 0.7421687 -1.106474 0.453828 0.7673423 -1.017 0.4157592 0.7893908 -0.9134323 0.3716938 0.8093562 -0.8008958 0.3238124 0.8282797 -0.6845156 0.2742956 0.8472033 -0.5694167 0.225324 0.8671687 -0.4607239 0.1790781 0.8892171 -0.3635625 0.1377384 0.9143906 -0.2830573 0.1034855 0.9437311 -1.294093 0.349074 0.6782799 -1.276896 0.3442879 0.7128284 -1.228878 0.3309242 0.7421687 -1.1554 0.3104745 0.7673423 -1.061822 0.2844307 0.7893908 -0.953504 0.2542845 0.8093562 -0.8358055 0.2215277 0.8282797 -0.714087 0.1876521 0.8472033 -0.5937085 0.1541495 0.8671687 -0.4800301 0.1225115 0.8892171 -0.3784118 0.09423005 0.9143906 -0.2942138 0.07079684 0.9437311 -1.328157 0.1785092 0.6782799 -1.310493 0.1760617 0.7128284 -1.261172 0.1692277 0.7421689 -1.185698 0.1587702 0.7673426 -1.089579 0.1454519 0.7893911 -0.9783186 0.1300358 0.8093562 -0.8574236 0.1132847 0.8282797 -0.7323992 0.09596139 0.8472037 -0.6087514 0.07882881 0.8671689 -0.4919855 0.06264984 0.8892174 -0.3876074 0.04818725 0.9143908 -0.3011227 0.03620404 0.9437313 1.248491 0.1785092 0.6782799 1.230827 0.1760617 0.7128284 1.181505 0.1692277 0.7421687 1.106032 0.1587702 0.7673423 1.009912 0.1454519 0.7893908 0.898652 0.1300358 0.8093562 0.7777569 0.1132847 0.8282797 0.6527326 0.09596139 0.8472035 0.5290848 0.07882881 0.8671687 0.4123189 0.06264984 0.8892171 0.3079408 0.04818725 0.9143908 0.2214561 0.03620398 0.9437311 1.214426 0.349074 0.6782799 1.197229 0.3442879 0.7128284 1.149212 0.3309242 0.7421687 1.075734 0.3104745 0.7673423 0.9821557 0.2844307 0.7893908 0.8738374 0.2542845 0.8093562 0.7561389 0.2215277 0.8282797 0.6344204 0.1876521 0.8472033 0.5140419 0.1541495 0.8671687 0.4003635 0.1225115 0.8892171 0.2987452 0.09423005 0.9143906 0.2145472 0.07079684 0.9437311 1.159417 0.5102499 0.6782799 1.142974 0.5032539 0.7128284 1.097062 0.4837198 0.7421687 1.026807 0.453828 0.7673423 0.9373334 0.4157592 0.7893908 0.8337656 0.3716938 0.8093562 0.7212292 0.3238124 0.8282797 0.604849 0.2742956 0.8472033 0.48975 0.225324 0.8671687 0.3810573 0.1790781 0.8892171 0.2838959 0.1377384 0.9143906 0.2033906 0.1034855 0.9437311 1.084907 0.6605925 0.6782799 1.069486 0.6515352 0.7128284 1.026427 0.6262454 0.7421687 0.9605371 0.5875462 0.7673423 0.8766221 0.5382605 0.7893908 0.779489 0.4812116 0.8093562 0.6739445 0.4192222 0.8282797 0.564795 0.3551155 0.8472033 0.456847 0.2917146 0.8671687 0.3549074 0.2318425 0.8892171 0.2637826 0.1783223 0.9143906 0.1882792 0.1339769 0.9437311 0.9923426 0.7986574 0.6782799 0.9781906 0.7877072 0.7128284 0.9386753 0.7571318 0.7421684 0.8782078 0.7103443 0.7673421 0.801199 0.6507579 0.7893908 0.7120598 0.5817855 0.809356 0.6152014 0.5068402 0.8282795 0.5150347 0.4293352 0.8472033 0.4159709 0.3526834 0.8671684 0.3224207 0.280298 0.8892171 0.2387953 0.2155919 0.9143906 0.1695058 0.1619784 0.9437311 0.8831667 0.9229999 0.6782799 0.8705116 0.9103448 0.7128284 0.8351759 0.8750092 0.7421684 0.7811042 0.8209375 0.7673421 0.7122408 0.752074 0.7893908 0.6325301 0.6723634 0.809356 0.5459167 0.5857499 0.8282795 0.4563449 0.4961782 0.8472033 0.3677593 0.4075925 0.8671687 0.2841042 0.3239375 0.8892171 0.2093241 0.2491573 0.9143906 0.1473634 0.1871967 0.9437311 0.7588241 1.032176 0.6782799 0.7478739 1.018024 0.7128284 0.7172985 0.9785085 0.7421687 0.6705111 0.9180411 0.7673423 0.6109246 0.8410322 0.7893908 0.5419522 0.7518931 0.8093562 0.467007 0.6550346 0.8282797 0.3895019 0.554868 0.8472033 0.3128502 0.4558041 0.8671687 0.2404647 0.362254 0.8892171 0.1757587 0.2786287 0.9143906 0.1221451 0.209339 0.9437311 0.6207593 1.124741 0.6782799 0.611702 1.10932 0.7128284 0.5864122 1.066261 0.7421687 0.5477129 1.00037 0.7673423 0.4984273 0.9164553 0.7893908 0.4413783 0.8193222 0.8093562 0.3793889 0.7137777 0.8282797 0.3152822 0.6046282 0.8472033 0.2518814 0.4966803 0.8671687 0.1920093 0.3947407 0.8892171 0.138489 0.3036159 0.9143906 0.09414368 0.2281124 0.9437311 0.4704167 1.19925 0.6782799 0.4634207 1.182807 0.7128284 0.4438866 1.136896 0.7421687 0.4139948 1.066641 0.7673423 0.3759259 0.9771666 0.7893908 0.3318606 0.8735989 0.8093562 0.2839792 0.7610625 0.8282797 0.2344623 0.6446822 0.8472033 0.1854907 0.5295833 0.8671687 0.1392448 0.4208906 0.8892171 0.09790509 0.3237291 0.9143906 0.06365221 0.2432239 0.9437311 0.3092408 1.254259 0.6782799 0.3044546 1.237062 0.7128284 0.2910909 1.189045 0.7421687 0.2706412 1.115567 0.7673423 0.2445974 1.021989 0.7893908 0.2144512 0.9136706 0.8093562 0.1816944 0.7959722 0.8282797 0.1478188 0.6742537 0.8472033 0.1143162 0.5538752 0.8671687 0.08267825 0.4401967 0.8892171 0.0543968 0.3385785 0.9143906 0.03096359 0.2543805 0.9437311 0.1386759 1.288324 0.6782799 0.1362284 1.27066 0.7128284 0.1293945 1.221338 0.7421689 0.1189369 1.145865 0.7673426 0.1056187 1.049746 0.7893911 0.09020251 0.9384852 0.8093562 0.07345139 0.8175902 0.8282797 0.05612814 0.6925659 0.8472037 0.03899556 0.568918 0.8671689 0.02281653 0.4521522 0.8892174 0.008354008 0.347774 0.9143908 -0.003629207 0.2612894 0.9437313 0.1661389 1.486528 -1.57172 0.165823 1.484248 -1.590427 -0.0398333 1.4977 -1.590427 0.1644701 1.474484 -1.608873 -0.0398333 1.487847 -1.608873 0.1614723 1.452849 -1.626798 -0.0398333 1.466016 -1.626798 0.1562217 1.414954 -1.643942 -0.0398333 1.427778 -1.643942 0.1481103 1.356413 -1.660045 -0.0398333 1.368707 -1.660045 0.1365303 1.272839 -1.674845 -0.0398333 1.284375 -1.674845 0.1208739 1.159844 -1.688083 -0.0398333 1.170356 -1.688083 0.1005329 1.013041 -1.699498 -0.0398333 1.022222 -1.699498 0.07489961 0.8280423 -1.70883 -0.0398333 0.8355468 -1.70883 0.04336607 0.6004608 -1.715817 -0.0398333 0.6059027 -1.715817 0.005324423 0.3259091 -1.720201 -0.0398333 0.3288628 -1.720201 -0.0398333 0 -1.72172 0.3629445 1.447222 -1.57172 0.3623268 1.445003 -1.590427 0.3596812 1.435497 -1.608873 0.353819 1.414434 -1.626798 0.3435515 1.377541 -1.643942 0.3276898 1.320548 -1.660045 0.3050451 1.239184 -1.674845 0.2744289 1.129177 -1.688083 0.2346523 0.9862551 -1.699498 0.1845265 0.8061479 -1.70883 0.1228628 0.5845839 -1.715817 0.04847246 0.3172917 -1.720201 0.5480138 1.381628 -1.590427 0.5441467 1.372539 -1.608873 0.5355778 1.352399 -1.626798 0.5205695 1.317125 -1.643942 0.497384 1.262632 -1.660045 0.4642839 1.184836 -1.674845 0.4195314 1.079653 -1.688083 0.3613889 0.9429999 -1.699498 0.2881188 0.770792 -1.70883 0.1979835 0.5589452 -1.715817 0.08924531 0.3033759 -1.720201 0.7223889 1.297778 -1.57172 0.72122 1.295788 -1.590427 0.7162135 1.287263 -1.608873 0.7051199 1.268375 -1.626798 0.6856893 1.235292 -1.643942 0.6556724 1.184185 -1.660045 0.6128194 1.111222 -1.674845 0.5548809 1.012575 -1.688083 0.479607 0.8844115 -1.699498 0.3847483 0.7229028 -1.70883 0.268055 0.524218 -1.715817 0.1272777 0.2845272 -1.720201 0.8816945 1.190972 -1.57172 0.8802812 1.189146 -1.590427 0.8742284 1.181323 -1.608873 0.8608161 1.163989 -1.626798 0.8373246 1.133629 -1.643942 0.8010342 1.086728 -1.660045 0.7492249 1.01977 -1.674845 0.6791771 0.9292408 -1.688083 0.5881708 0.8116254 -1.699498 0.4734864 0.6634087 -1.70883 0.3324041 0.4810755 -1.715817 0.1622042 0.261111 -1.720201 1.023533 1.063367 -1.590427 1.016538 1.056372 -1.608873 1.001038 1.040871 -1.626798 0.9738889 1.013722 -1.643942 0.9319484 0.9717816 -1.660045 0.872073 0.9119063 -1.674845 0.7911194 0.8309527 -1.688083 0.6859444 0.7257777 -1.699498 0.553405 0.5932382 -1.70883 0.3903576 0.4301909 -1.715817 0.1936593 0.2334926 -1.720201 1.151139 0.9215277 -1.57172 1.149312 0.9201145 -1.590427 1.14149 0.9140616 -1.608873 1.124156 0.9006493 -1.626798 1.093796 0.8771579 -1.643942 1.046894 0.8408674 -1.660045 0.9799366 0.789058 -1.674845 0.8894075 0.7190102 -1.688083 0.7717921 0.628004 -1.699498 0.6235753 0.5133197 -1.70883 0.4412422 0.3722374 -1.715817 0.2212776 0.2020374 -1.720201 1.257945 0.7622222 -1.57172 1.255954 0.7610533 -1.590427 1.24743 0.7560468 -1.608873 1.228542 0.7449531 -1.626798 1.195459 0.7255226 -1.643942 1.144351 0.6955057 -1.660045 1.071389 0.6526528 -1.674845 0.9727414 0.5947142 -1.688083 0.8445782 0.5194402 -1.699498 0.6830695 0.4245815 -1.70883 0.4843848 0.3078883 -1.715817 0.2446939 0.167111 -1.720201 1.341794 0.5878471 -1.590427 1.332706 0.58398 -1.608873 1.312566 0.575411 -1.626798 1.277292 0.5604028 -1.643942 1.222798 0.5372173 -1.660045 1.145003 0.5041171 -1.674845 1.03982 0.4593647 -1.688083 0.9031667 0.4012222 -1.699498 0.7309587 0.3279521 -1.70883 0.519112 0.2378168 -1.715817 0.2635427 0.1290786 -1.720201 1.407389 0.4027777 -1.57172 1.405169 0.4021601 -1.590427 1.395664 0.3995144 -1.608873 1.3746 0.3936523 -1.626798 1.337708 0.3833847 -1.643942 1.280715 0.367523 -1.660045 1.199351 0.3448784 -1.674845 1.089343 0.3142622 -1.688083 0.9464219 0.2744855 -1.699498 0.7663147 0.2243598 -1.70883 0.5447506 0.1626961 -1.715817 0.2774584 0.08830571 -1.720201 1.446694 0.2059721 -1.57172 1.444415 0.2056563 -1.590427 1.434651 0.2043034 -1.608873 1.413015 0.2013056 -1.626798 1.375121 0.196055 -1.643942 1.31658 0.1879436 -1.660045 1.233006 0.1763637 -1.674845 1.120011 0.1607071 -1.688083 0.9732078 0.1403662 -1.699498 0.7882091 0.1147329 -1.70883 0.5606275 0.08319938 -1.715817 0.2860758 0.04515767 -1.720201 1.457866 0 -1.590427 1.448014 0 -1.608873 1.426182 0 -1.626798 1.387944 0 -1.643942 1.328873 0 -1.660045 1.244542 0 -1.674845 1.130522 0 -1.688083 0.982389 0 -1.699498 0.7957136 0 -1.70883 0.5660694 0 -1.715817 0.2890295 0 -1.720201 -1.526361 0.2059721 -1.57172 -1.524081 0.2056563 -1.590427 -1.537533 0 -1.590427 -1.514317 0.2043034 -1.608873 -1.52768 0 -1.608873 -1.492682 0.2013056 -1.626798 -1.505849 0 -1.626798 -1.454787 0.196055 -1.643942 -1.467611 0 -1.643942 -1.396247 0.1879436 -1.660045 -1.40854 0 -1.660045 -1.312673 0.1763637 -1.674845 -1.324208 0 -1.674845 -1.199678 0.1607071 -1.688083 -1.210189 0 -1.688083 -1.052874 0.1403662 -1.699498 -1.062056 0 -1.699498 -0.8678757 0.1147329 -1.70883 -0.8753802 0 -1.70883 -0.6402941 0.08319938 -1.715817 -0.645736 0 -1.715817 -0.3657425 0.04515767 -1.720201 -0.3686962 0 -1.720201 -1.487056 0.4027777 -1.57172 -1.484836 0.4021601 -1.590427 -1.47533 0.3995145 -1.608873 -1.454267 0.3936523 -1.626798 -1.417374 0.3833847 -1.643942 -1.360382 0.367523 -1.660045 -1.279017 0.3448784 -1.674845 -1.16901 0.3142622 -1.688083 -1.026088 0.2744856 -1.699498 -0.8459813 0.2243598 -1.70883 -0.6244173 0.1626961 -1.715817 -0.3571251 0.08830571 -1.720201 -1.421461 0.5878471 -1.590427 -1.412372 0.58398 -1.608873 -1.392233 0.575411 -1.626798 -1.356958 0.5604028 -1.643942 -1.302465 0.5372173 -1.660045 -1.224669 0.5041171 -1.674845 -1.119487 0.4593647 -1.688083 -0.9828333 0.4012222 -1.699498 -0.8106253 0.3279521 -1.70883 -0.5987786 0.2378168 -1.715817 -0.3432093 0.1290786 -1.720201 -1.337611 0.7622222 -1.57172 -1.335621 0.7610533 -1.590427 -1.327097 0.7560467 -1.608873 -1.308208 0.7449531 -1.626798 -1.275125 0.7255226 -1.643942 -1.224018 0.6955056 -1.660045 -1.151056 0.6526527 -1.674845 -1.052408 0.5947141 -1.688083 -0.9242448 0.5194402 -1.699498 -0.7627362 0.4245815 -1.70883 -0.5640514 0.3078883 -1.715817 -0.3243606 0.167111 -1.720201 -1.230805 0.9215278 -1.57172 -1.228979 0.9201145 -1.590427 -1.221156 0.9140617 -1.608873 -1.203823 0.9006494 -1.626798 -1.173462 0.8771579 -1.643942 -1.126561 0.8408674 -1.660045 -1.059603 0.7890581 -1.674845 -0.9690742 0.7190103 -1.688083 -0.8514588 0.628004 -1.699498 -0.7032421 0.5133197 -1.70883 -0.5209088 0.3722374 -1.715817 -0.3009443 0.2020375 -1.720201 -1.1032 1.063367 -1.590427 -1.096205 1.056372 -1.608873 -1.080704 1.040871 -1.626798 -1.053555 1.013722 -1.643942 -1.011615 0.9717816 -1.660045 -0.9517396 0.9119063 -1.674845 -0.870786 0.8309527 -1.688083 -0.7656111 0.7257777 -1.699498 -0.6330716 0.5932382 -1.70883 -0.4700242 0.4301909 -1.715817 -0.2733259 0.2334926 -1.720201 -0.9613611 1.190972 -1.57172 -0.9599478 1.189146 -1.590427 -0.953895 1.181323 -1.608873 -0.9404827 1.163989 -1.626798 -0.9169912 1.133629 -1.643942 -0.8807007 1.086728 -1.660045 -0.8288914 1.01977 -1.674845 -0.7588436 0.9292407 -1.688083 -0.6678374 0.8116254 -1.699498 -0.553153 0.6634086 -1.70883 -0.4120708 0.4810755 -1.715817 -0.2418708 0.2611109 -1.720201 -0.8020556 1.297778 -1.57172 -0.8008866 1.295788 -1.590427 -0.7958802 1.287263 -1.608873 -0.7847865 1.268375 -1.626798 -0.765356 1.235292 -1.643942 -0.7353391 1.184185 -1.660045 -0.6924861 1.111222 -1.674845 -0.6345475 1.012575 -1.688083 -0.5592736 0.8844115 -1.699498 -0.4644149 0.7229028 -1.70883 -0.3477216 0.524218 -1.715817 -0.2069444 0.2845272 -1.720201 -0.6276804 1.381628 -1.590427 -0.6238133 1.372539 -1.608873 -0.6152444 1.352399 -1.626798 -0.6002361 1.317125 -1.643942 -0.5770506 1.262632 -1.660045 -0.5439505 1.184836 -1.674845 -0.499198 1.079653 -1.688083 -0.4410555 0.9429999 -1.699498 -0.3677855 0.770792 -1.70883 -0.2776501 0.5589452 -1.715817 -0.1689119 0.3033759 -1.720201 -0.442611 1.447222 -1.57172 -0.4419934 1.445003 -1.590427 -0.4393478 1.435497 -1.608873 -0.4334856 1.414433 -1.626798 -0.4232181 1.377541 -1.643942 -0.4073563 1.320548 -1.660045 -0.3847118 1.239184 -1.674845 -0.3540955 1.129177 -1.688083 -0.3143189 0.9862551 -1.699498 -0.2641931 0.8061479 -1.70883 -0.2025294 0.5845839 -1.715817 -0.128139 0.3172917 -1.720201 -0.2458055 1.486528 -1.57172 -0.2454896 1.484248 -1.590427 -0.2441367 1.474484 -1.608873 -0.2411389 1.452849 -1.626798 -0.2358883 1.414954 -1.643942 -0.227777 1.356413 -1.660045 -0.216197 1.272839 -1.674845 -0.2005405 1.159844 -1.688083 -0.1801995 1.013041 -1.699498 -0.1545662 0.8280423 -1.70883 -0.1230327 0.6004608 -1.715817 -0.08499103 0.3259091 -1.720201 -0.2458055 -1.486528 -1.57172 -0.2454896 -1.484248 -1.590427 -0.0398333 -1.4977 -1.590427 -0.2441368 -1.474484 -1.608873 -0.0398333 -1.487847 -1.608873 -0.2411389 -1.452849 -1.626798 -0.0398333 -1.466016 -1.626798 -0.2358883 -1.414954 -1.643942 -0.0398333 -1.427778 -1.643942 -0.227777 -1.356413 -1.660045 -0.0398333 -1.368707 -1.660045 -0.216197 -1.272839 -1.674845 -0.0398333 -1.284375 -1.674845 -0.2005405 -1.159844 -1.688083 -0.0398333 -1.170356 -1.688083 -0.1801995 -1.013041 -1.699498 -0.0398333 -1.022222 -1.699498 -0.1545662 -0.8280425 -1.70883 -0.0398333 -0.8355469 -1.70883 -0.1230327 -0.6004609 -1.715817 -0.0398333 -0.6059028 -1.715817 -0.08499103 -0.3259092 -1.720201 -0.0398333 -0.3288629 -1.720201 -0.4426111 -1.447222 -1.57172 -0.4419934 -1.445003 -1.590427 -0.4393478 -1.435497 -1.608873 -0.4334856 -1.414434 -1.626798 -0.4232181 -1.377541 -1.643942 -0.4073564 -1.320548 -1.660045 -0.3847118 -1.239184 -1.674845 -0.3540955 -1.129177 -1.688083 -0.3143189 -0.9862552 -1.699498 -0.2641931 -0.8061481 -1.70883 -0.2025294 -0.584584 -1.715817 -0.128139 -0.3172917 -1.720201 -0.6276804 -1.381628 -1.590427 -0.6238133 -1.372539 -1.608873 -0.6152444 -1.352399 -1.626798 -0.6002361 -1.317125 -1.643942 -0.5770506 -1.262632 -1.660045 -0.5439505 -1.184836 -1.674845 -0.499198 -1.079653 -1.688083 -0.4410555 -0.943 -1.699498 -0.3677855 -0.7707921 -1.70883 -0.2776501 -0.5589454 -1.715817 -0.1689119 -0.303376 -1.720201 -0.8020555 -1.297778 -1.57172 -0.8008866 -1.295788 -1.590427 -0.7958801 -1.287263 -1.608873 -0.7847865 -1.268375 -1.626798 -0.765356 -1.235292 -1.643942 -0.735339 -1.184185 -1.660045 -0.6924861 -1.111222 -1.674845 -0.6345475 -1.012575 -1.688083 -0.5592736 -0.8844116 -1.699498 -0.4644149 -0.7229029 -1.70883 -0.3477216 -0.5242182 -1.715817 -0.2069444 -0.2845273 -1.720201 -0.9613611 -1.190972 -1.57172 -0.9599478 -1.189146 -1.590427 -0.953895 -1.181323 -1.608873 -0.9404827 -1.163989 -1.626798 -0.9169912 -1.133629 -1.643942 -0.8807008 -1.086728 -1.660045 -0.8288915 -1.01977 -1.674845 -0.7588437 -0.929241 -1.688083 -0.6678374 -0.8116255 -1.699498 -0.553153 -0.6634088 -1.70883 -0.4120708 -0.4810756 -1.715817 -0.2418708 -0.261111 -1.720201 -1.1032 -1.063367 -1.590427 -1.096205 -1.056372 -1.608873 -1.080704 -1.040871 -1.626798 -1.053555 -1.013722 -1.643942 -1.011615 -0.9717817 -1.660045 -0.9517396 -0.9119064 -1.674845 -0.870786 -0.8309528 -1.688083 -0.7656111 -0.7257778 -1.699498 -0.6330716 -0.5932384 -1.70883 -0.4700242 -0.430191 -1.715817 -0.2733259 -0.2334926 -1.720201 -1.230805 -0.9215278 -1.57172 -1.228979 -0.9201146 -1.590427 -1.221156 -0.9140617 -1.608873 -1.203822 -0.9006494 -1.626798 -1.173462 -0.877158 -1.643942 -1.126561 -0.8408675 -1.660045 -1.059603 -0.7890582 -1.674845 -0.9690741 -0.7190103 -1.688083 -0.8514587 -0.6280041 -1.699498 -0.703242 -0.5133198 -1.70883 -0.5209088 -0.3722375 -1.715817 -0.3009443 -0.2020375 -1.720201 -1.337611 -0.7622224 -1.57172 -1.335621 -0.7610534 -1.590427 -1.327097 -0.756047 -1.608873 -1.308208 -0.7449532 -1.626798 -1.275125 -0.7255227 -1.643942 -1.224018 -0.6955058 -1.660045 -1.151056 -0.6526529 -1.674845 -1.052408 -0.5947143 -1.688083 -0.9242448 -0.5194404 -1.699498 -0.7627362 -0.4245816 -1.70883 -0.5640514 -0.3078884 -1.715817 -0.3243606 -0.167111 -1.720201 -1.421461 -0.5878472 -1.590427 -1.412372 -0.5839801 -1.608873 -1.392233 -0.5754112 -1.626798 -1.356958 -0.5604029 -1.643942 -1.302465 -0.5372174 -1.660045 -1.224669 -0.5041173 -1.674845 -1.119487 -0.4593647 -1.688083 -0.9828333 -0.4012222 -1.699498 -0.8106253 -0.3279522 -1.70883 -0.5987786 -0.2378168 -1.715817 -0.3432093 -0.1290786 -1.720201 -1.487055 -0.4027778 -1.57172 -1.484836 -0.4021601 -1.590427 -1.47533 -0.3995145 -1.608873 -1.454267 -0.3936524 -1.626798 -1.417374 -0.3833848 -1.643942 -1.360382 -0.3675231 -1.660045 -1.279017 -0.3448784 -1.674845 -1.16901 -0.3142622 -1.688083 -1.026088 -0.2744856 -1.699498 -0.8459813 -0.2243598 -1.70883 -0.6244173 -0.1626961 -1.715817 -0.3571251 -0.08830577 -1.720201 -1.526361 -0.2059722 -1.57172 -1.524081 -0.2056564 -1.590427 -1.514317 -0.2043035 -1.608873 -1.492682 -0.2013056 -1.626798 -1.454787 -0.1960551 -1.643942 -1.396247 -0.1879436 -1.660045 -1.312673 -0.1763637 -1.674845 -1.199678 -0.1607072 -1.688083 -1.052874 -0.1403663 -1.699498 -0.8678757 -0.114733 -1.70883 -0.6402941 -0.08319944 -1.715817 -0.3657425 -0.04515773 -1.720201 1.446694 -0.2059722 -1.57172 1.444415 -0.2056564 -1.590427 1.434651 -0.2043035 -1.608873 1.413015 -0.2013056 -1.626798 1.375121 -0.1960551 -1.643942 1.31658 -0.1879437 -1.660045 1.233006 -0.1763637 -1.674845 1.120011 -0.1607072 -1.688083 0.9732078 -0.1403663 -1.699498 0.7882091 -0.114733 -1.70883 0.5606275 -0.08319944 -1.715817 0.2860758 -0.04515773 -1.720201 1.407389 -0.4027778 -1.57172 1.405169 -0.4021601 -1.590427 1.395664 -0.3995146 -1.608873 1.3746 -0.3936524 -1.626798 1.337708 -0.3833848 -1.643942 1.280715 -0.3675231 -1.660045 1.199351 -0.3448784 -1.674845 1.089343 -0.3142622 -1.688083 0.9464218 -0.2744857 -1.699498 0.7663147 -0.2243598 -1.70883 0.5447506 -0.1626961 -1.715817 0.2774584 -0.08830577 -1.720201 1.341794 -0.5878472 -1.590427 1.332706 -0.5839801 -1.608873 1.312566 -0.5754112 -1.626798 1.277292 -0.5604029 -1.643942 1.222798 -0.5372174 -1.660045 1.145003 -0.5041173 -1.674845 1.03982 -0.4593647 -1.688083 0.9031667 -0.4012222 -1.699498 0.7309587 -0.3279522 -1.70883 0.519112 -0.2378168 -1.715817 0.2635427 -0.1290786 -1.720201 1.257944 -0.7622223 -1.57172 1.255954 -0.7610534 -1.590427 1.24743 -0.7560468 -1.608873 1.228542 -0.7449532 -1.626798 1.195459 -0.7255227 -1.643942 1.144351 -0.6955057 -1.660045 1.071389 -0.6526528 -1.674845 0.9727414 -0.5947142 -1.688083 0.8445782 -0.5194404 -1.699498 0.6830695 -0.4245816 -1.70883 0.4843848 -0.3078884 -1.715817 0.2446939 -0.167111 -1.720201 1.151139 -0.9215279 -1.57172 1.149312 -0.9201146 -1.590427 1.14149 -0.9140618 -1.608873 1.124156 -0.9006495 -1.626798 1.093796 -0.877158 -1.643942 1.046894 -0.8408675 -1.660045 0.9799366 -0.7890582 -1.674845 0.8894076 -0.7190104 -1.688083 0.7717922 -0.6280041 -1.699498 0.6235755 -0.5133198 -1.70883 0.4412422 -0.3722375 -1.715817 0.2212777 -0.2020375 -1.720201 1.023533 -1.063367 -1.590427 1.016538 -1.056372 -1.608873 1.001038 -1.040871 -1.626798 0.9738889 -1.013722 -1.643942 0.9319484 -0.9717817 -1.660045 0.872073 -0.9119064 -1.674845 0.7911194 -0.8309528 -1.688083 0.6859444 -0.7257778 -1.699498 0.553405 -0.5932384 -1.70883 0.3903576 -0.430191 -1.715817 0.1936593 -0.2334926 -1.720201 0.8816944 -1.190972 -1.57172 0.8802812 -1.189146 -1.590427 0.8742284 -1.181323 -1.608873 0.8608161 -1.163989 -1.626798 0.8373246 -1.133629 -1.643942 0.8010341 -1.086728 -1.660045 0.7492248 -1.01977 -1.674845 0.6791769 -0.9292408 -1.688083 0.5881708 -0.8116255 -1.699498 0.4734864 -0.6634087 -1.70883 0.3324041 -0.4810755 -1.715817 0.1622042 -0.261111 -1.720201 0.722389 -1.297778 -1.57172 0.72122 -1.295788 -1.590427 0.7162136 -1.287263 -1.608873 0.7051199 -1.268375 -1.626798 0.6856893 -1.235292 -1.643942 0.6556724 -1.184185 -1.660045 0.6128195 -1.111222 -1.674845 0.5548809 -1.012575 -1.688083 0.479607 -0.8844116 -1.699498 0.3847483 -0.7229029 -1.70883 0.268055 -0.5242182 -1.715817 0.1272777 -0.2845273 -1.720201 0.5480138 -1.381628 -1.590427 0.5441467 -1.372539 -1.608873 0.5355778 -1.352399 -1.626798 0.5205695 -1.317125 -1.643942 0.497384 -1.262632 -1.660045 0.4642839 -1.184836 -1.674845 0.4195314 -1.079653 -1.688083 0.3613889 -0.943 -1.699498 0.2881188 -0.7707921 -1.70883 0.1979835 -0.5589454 -1.715817 0.08924531 -0.303376 -1.720201 0.3629444 -1.447222 -1.57172 0.3623268 -1.445003 -1.590427 0.3596812 -1.435497 -1.608873 0.353819 -1.414433 -1.626798 0.3435515 -1.377541 -1.643942 0.3276897 -1.320548 -1.660045 0.3050451 -1.239184 -1.674845 0.2744289 -1.129177 -1.688083 0.2346522 -0.9862552 -1.699498 0.1845265 -0.8061481 -1.70883 0.1228628 -0.584584 -1.715817 0.04847246 -0.3172917 -1.720201 0.1661389 -1.486528 -1.57172 0.165823 -1.484248 -1.590427 0.1644701 -1.474484 -1.608873 0.1614723 -1.452849 -1.626798 0.1562217 -1.414954 -1.643942 0.1481103 -1.356413 -1.660045 0.1365303 -1.272839 -1.674845 0.1208739 -1.159844 -1.688083 0.1005329 -1.013041 -1.699498 0.07489961 -0.8280425 -1.70883 0.04336607 -0.6004609 -1.715817 0.005324423 -0.3259092 -1.720201 + + + + + + + + + + 0.1114252 -0.8443715 0.5240432 0 -0.8917934 0.452443 0.116643 -0.8840392 0.4526249 0.1024546 -0.7765125 0.6217166 0 -0.8517999 0.5238676 0.09021556 -0.6836668 0.7241967 0 -0.7833697 0.6215562 0.07239204 -0.5488917 0.8327528 0 -0.6897467 0.7240509 0.04434382 -0.3363786 0.9406822 0 -0.5537984 0.8326508 -0.001770079 0.01309245 0.9999127 0 -0.3394067 0.9406397 -0.06460899 0.4894354 0.8696429 0 0.01327556 0.9999119 -0.1135018 0.8603431 0.4969176 0 0.4939156 0.8695099 -0.1299511 0.9851322 0.112372 0 0.8679181 0.4967074 0 0.9889301 -0.1483822 0 0.9936733 0.1123105 -0.1293399 0.9804262 -0.1484449 0 0.9490154 -0.3152296 -0.1241223 0.9408208 -0.3153567 0 0.925002 -0.3799622 0.221356 -0.8221883 0.524412 0.231767 -0.8608707 0.4529742 0.2035357 -0.7560334 0.6220825 0.1791804 -0.6655403 0.7245346 0.1438066 -0.5342698 0.832992 0.0880779 -0.3273776 0.9407796 -0.003479123 0.01272624 0.999913 -0.1283012 0.4763992 0.8698177 -0.2255075 0.837787 0.4972519 -0.2582858 0.9595 0.112464 -0.2570599 0.9549029 -0.148596 -0.2466598 0.9162609 -0.3156342 -0.1210998 0.9169772 -0.3801155 0.3271652 -0.7858374 0.5248072 0.3425838 -0.8228726 0.4533399 0.300796 -0.7225086 0.6224976 0.2647531 -0.6359569 0.7248895 0.2124758 -0.510406 0.8332706 0.1301324 -0.3126963 0.9408968 -0.005127131 0.01217693 0.9999127 -0.1895549 0.4551943 0.8699812 -0.3333597 0.8008202 0.4975523 -0.381855 0.9173431 0.1125544 -0.3800569 0.9129239 -0.148751 -0.3646467 0.8759089 -0.3159376 -0.2405499 0.8929827 -0.380418 0.4268109 -0.7362449 0.5251437 0.4469462 -0.7709937 0.4536604 0.3923883 -0.6768599 0.62281 0.3453207 -0.5956972 0.7251886 0.2770882 -0.4780297 0.8334925 0.1696864 -0.2928006 0.9409965 -0.006683528 0.01144444 0.9999123 -0.2472065 0.4263855 0.8701061 -0.4349359 0.7503262 0.4978369 -0.4982846 0.8596608 0.1126763 -0.4959087 0.8555181 -0.1488733 -0.4757861 0.8207692 -0.3161734 -0.3554937 0.853606 -0.380764 0.5187014 -0.674501 0.5253545 0.5432077 -0.7063622 0.453848 0.4768334 -0.6200605 0.6230208 0.4196117 -0.5456569 0.7253859 0.3366887 -0.4378296 0.8336341 0.206187 -0.2681409 0.9410566 -0.008117914 0.0104984 0.999912 -0.3003712 0.3905557 0.8701974 -0.5286319 0.6874259 0.49799 -0.6057094 0.7876633 0.1127064 -0.6028164 0.7838566 -0.148934 -0.5783084 0.7519932 -0.3163316 -0.4637703 0.7998175 -0.3810631 0.601634 -0.601634 0.5254265 0.6300659 -0.6300659 0.4539099 0.5530375 -0.5530681 0.6231095 0.48669 -0.48669 0.7254418 0.3904905 -0.3904905 0.8336873 0.2391173 -0.2391173 0.9410876 -0.009399712 0.009399712 0.9999117 -0.3483726 0.3483726 0.8702145 -0.6131674 0.6131674 0.4980478 -0.702599 0.702599 0.1127356 -0.6992175 0.6992175 -0.1489625 -0.6707881 0.6707881 -0.3163651 -0.5636098 0.7328117 -0.3812232 0.7063469 -0.5432193 0.4538578 0.674501 -0.5187014 0.5253545 0.6200605 -0.4768334 0.6230208 0.5456569 -0.4196117 0.7253859 0.4378296 -0.3366887 0.8336341 0.2681409 -0.206187 0.9410566 -0.0104984 0.008117914 0.999912 -0.3905557 0.3003712 0.8701974 -0.6874259 0.5286319 0.49799 -0.7838566 0.6028164 -0.148934 -0.7876633 0.6057094 0.1127064 -0.7519932 0.5783084 -0.3163316 -0.7328117 0.5636098 -0.3812232 0.7709937 -0.4469462 0.4536604 0.7362449 -0.4268109 0.5251437 0.6768599 -0.3923883 0.62281 0.5956972 -0.3453207 0.7251886 0.4780297 -0.2770882 0.8334925 0.2928006 -0.1696864 0.9409965 -0.01144444 0.006683528 0.9999123 -0.4263855 0.2472065 0.8701061 -0.7503262 0.4349359 0.4978369 -0.8555181 0.4959087 -0.1488733 -0.8596637 0.4982863 0.1126462 -0.8207692 0.4757861 -0.3161734 -0.7998175 0.4637703 -0.3810631 0.8228726 -0.3425838 0.4533399 0.7858374 -0.3271652 0.5248072 0.7225086 -0.300796 0.6224976 0.6359569 -0.2647531 0.7248895 0.510406 -0.2124758 0.8332706 0.3126963 -0.1301324 0.9408968 -0.01217693 0.005127131 0.9999127 -0.4551969 0.1895255 0.8699861 -0.8008202 0.3333597 0.4975523 -0.9129239 0.3800569 -0.148751 -0.9173431 0.381855 0.1125544 -0.8759089 0.3646467 -0.3159376 -0.853596 0.3554895 -0.3807901 0.8608707 -0.231767 0.4529742 0.8221883 -0.221356 0.524412 0.7560334 -0.2035357 0.6220825 0.6655403 -0.1791804 0.7245346 0.5342479 -0.143809 0.8330056 0.3273776 -0.0880779 0.9407796 -0.01272624 0.003479123 0.999913 -0.4763992 0.1283012 0.8698177 -0.837787 0.2255075 0.4972519 -0.9549029 0.2570599 -0.148596 -0.9595 0.2582858 0.112464 -0.9162609 0.2466598 -0.3156342 -0.8929827 0.2405499 -0.380418 0.884036 -0.1166731 0.4526233 0.8443715 -0.1114252 0.5240432 0.7765125 -0.1024546 0.6217166 0.6836668 -0.09021556 0.7241967 0.5488917 -0.07239204 0.8327528 0.3364154 -0.04434466 0.9406691 -0.01306194 0.001770079 0.9999132 -0.4894354 0.06460899 0.8696429 -0.8603431 0.1135018 0.4969176 -0.9804262 0.1293399 -0.1484449 -0.9851322 0.1299511 0.112372 -0.9408208 0.1241223 -0.3153567 -0.9169772 0.1210998 -0.3801155 0.8917934 0 0.452443 0.8517999 0 0.5238676 0.7833697 0 0.6215562 0.6897314 0 0.7240654 0.5537984 0 0.8326508 0.3394067 0 0.9406397 -0.01327556 0 0.9999119 -0.4938925 0 0.8695231 -0.8679049 0 0.4967305 -0.9889301 0 -0.1483822 -0.9936733 0 0.1123105 -0.9490154 0 -0.3152296 -0.925002 0 -0.3799622 -0.8443715 -0.1114252 0.5240432 -0.8917934 0 0.452443 -0.8840514 -0.1166446 0.4526006 -0.7765125 -0.1024546 0.6217166 -0.8517999 0 0.5238676 -0.6836668 -0.09021556 0.7241967 -0.7833697 0 0.6215562 -0.5488905 -0.07242238 0.832751 -0.6897314 0 0.7240654 -0.3364154 -0.04434466 0.9406691 -0.5537984 0 0.8326508 0.01306194 0.001770079 0.9999132 -0.3394067 0 0.9406397 0.4894354 0.06460899 0.8696429 0.01327556 0 0.9999119 0.8603431 0.1135018 0.4969176 0.4938925 0 0.8695231 0.9851322 0.1299511 0.112372 0.8679049 0 0.4967305 0.9889301 0 -0.1483822 0.9936733 0 0.1123105 0.9804262 0.1293399 -0.1484449 0.9490154 0 -0.3152296 0.9408208 0.1241223 -0.3153567 0.925002 0 -0.3799622 -0.8221883 -0.221356 0.524412 -0.8608787 -0.2317609 0.4529623 -0.7560334 -0.2035357 0.6220825 -0.6655403 -0.1791804 0.7245346 -0.5342698 -0.1438066 0.832992 -0.3273776 -0.0880779 0.9407796 0.01272624 0.003479123 0.999913 0.4763992 0.1283012 0.8698177 0.837787 0.2255075 0.4972519 0.9595 0.2582858 0.112464 0.9549029 0.2570599 -0.148596 0.9162609 0.2466598 -0.3156342 0.9169772 0.1210998 -0.3801155 -0.7858374 -0.3271652 0.5248072 -0.8228726 -0.3425838 0.4533399 -0.7225086 -0.300796 0.6224976 -0.6359569 -0.2647531 0.7248895 -0.510406 -0.2124758 0.8332706 -0.3126963 -0.1301324 0.9408968 0.01217693 0.005127131 0.9999127 0.4551969 0.1895255 0.8699861 0.8008081 0.3333547 0.4975753 0.9173431 0.381855 0.1125544 0.9129239 0.3800569 -0.148751 0.8759089 0.3646467 -0.3159376 0.8929827 0.2405499 -0.380418 -0.7362449 -0.4268109 0.5251437 -0.7709937 -0.4469462 0.4536604 -0.6768679 -0.3923624 0.6228173 -0.5956972 -0.3453207 0.7251886 -0.4780297 -0.2770882 0.8334925 -0.2928006 -0.1696864 0.9409965 0.01144444 0.006683528 0.9999123 0.4263855 0.2472065 0.8701061 0.7503395 0.4349259 0.4978255 0.8596637 0.4982863 0.1126462 0.8555181 0.4959087 -0.1488733 0.8207692 0.4757861 -0.3161734 0.853596 0.3554895 -0.3807901 -0.674501 -0.5187014 0.5253545 -0.7063622 -0.5432077 0.453848 -0.6200605 -0.4768334 0.6230208 -0.5456569 -0.4196117 0.7253859 -0.4378296 -0.3366887 0.8336341 -0.2681409 -0.206187 0.9410566 0.0104984 0.008117914 0.999912 0.3905557 0.3003712 0.8701974 0.6874259 0.5286319 0.49799 0.7876633 0.6057094 0.1127064 0.7838566 0.6028164 -0.148934 0.7519932 0.5783084 -0.3163316 0.7998175 0.4637703 -0.3810631 -0.601634 -0.601634 0.5254265 -0.6300659 -0.6300659 0.4539099 -0.5530587 -0.5530587 0.6230989 -0.48669 -0.48669 0.7254418 -0.3904905 -0.3904905 0.8336873 -0.2391461 -0.2391155 0.9410808 0.009399712 0.009399712 0.9999117 0.3483726 0.3483726 0.8702145 0.6131674 0.6131674 0.4980478 0.702599 0.702599 0.1127356 0.6992175 0.6992175 -0.1489625 0.6707881 0.6707881 -0.3163651 0.7328117 0.5636098 -0.3812232 -0.5432077 -0.7063622 0.453848 -0.5187014 -0.674501 0.5253545 -0.4768334 -0.6200605 0.6230208 -0.4196117 -0.5456569 0.7253859 -0.3366887 -0.4378296 0.8336341 -0.206187 -0.2681409 0.9410566 0.008117914 0.0104984 0.999912 0.3003676 0.3905816 0.8701871 0.5286319 0.6874259 0.49799 0.6028164 0.7838566 -0.148934 0.6057094 0.7876633 0.1127064 0.5783084 0.7519932 -0.3163316 0.5636098 0.7328117 -0.3812232 -0.4469462 -0.7709937 0.4536604 -0.4268109 -0.7362449 0.5251437 -0.3923883 -0.6768599 0.62281 -0.3453207 -0.5956972 0.7251886 -0.2770882 -0.4780297 0.8334925 -0.1696864 -0.2928006 0.9409965 0.006683528 0.01144444 0.9999123 0.2472065 0.4263855 0.8701061 0.4349359 0.7503262 0.4978369 0.4959087 0.8555181 -0.1488733 0.4982863 0.8596637 0.1126462 0.4757861 0.8207692 -0.3161734 0.4637703 0.7998175 -0.3810631 -0.3425838 -0.8228726 0.4533399 -0.3271652 -0.7858374 0.5248072 -0.300796 -0.7225086 0.6224976 -0.2647531 -0.6359569 0.7248895 -0.2124758 -0.510406 0.8332706 -0.1301324 -0.3126963 0.9408968 0.005127131 0.01217693 0.9999127 0.1895549 0.4551943 0.8699812 0.3333597 0.8008202 0.4975523 0.3800569 0.9129239 -0.148751 0.3818536 0.9173399 0.1125845 0.3646467 0.8759089 -0.3159376 0.3554937 0.853606 -0.380764 -0.2317609 -0.8608787 0.4529623 -0.221356 -0.8221883 0.524412 -0.2035357 -0.7560334 0.6220825 -0.1791804 -0.6655403 0.7245346 -0.1438066 -0.5342698 0.832992 -0.0880779 -0.3273776 0.9407796 0.003479123 0.01272624 0.999913 0.1283012 0.4763992 0.8698177 0.2255075 0.837787 0.4972519 0.2570599 0.9549029 -0.148596 0.2582858 0.9595 0.112464 0.2466598 0.9162609 -0.3156342 0.2405499 0.8929827 -0.380418 -0.1166731 -0.884036 0.4526233 -0.1114252 -0.8443715 0.5240432 -0.1024546 -0.7765125 0.6217166 -0.09021556 -0.6836668 0.7241967 -0.07239204 -0.5488917 0.8327528 -0.04434382 -0.3363786 0.9406822 0.001770079 0.01306194 0.9999132 0.06460899 0.4894354 0.8696429 0.1135018 0.8603431 0.4969176 0.1293399 0.9804262 -0.1484449 0.1299511 0.9851322 0.112372 0.1241223 0.9408208 -0.3153567 0.1210998 0.9169772 -0.3801155 -0.1114252 0.8443715 0.5240432 0 0.8917934 0.452443 -0.116643 0.8840392 0.4526249 -0.1024546 0.7765125 0.6217166 0 0.8517999 0.5238676 -0.09021556 0.6836668 0.7241967 0 0.7833697 0.6215562 -0.07239204 0.5488917 0.8327528 0 0.6897467 0.7240509 -0.04434382 0.3363786 0.9406822 0 0.5537984 0.8326508 0.001770079 -0.01309245 0.9999127 0 0.3394067 0.9406397 0.06460899 -0.4894354 0.8696429 0 -0.01327556 0.9999119 0.1135018 -0.8603431 0.4969176 0 -0.4939156 0.8695099 0.1299511 -0.9851322 0.112372 0 -0.8679181 0.4967074 0 -0.9889301 -0.1483822 0 -0.9936733 0.1123105 0.1293399 -0.9804262 -0.1484449 0 -0.9490154 -0.3152296 0.1241223 -0.9408208 -0.3153567 0 -0.925002 -0.3799622 -0.221356 0.8221883 0.524412 -0.231767 0.8608707 0.4529742 -0.2035357 0.7560334 0.6220825 -0.1791804 0.6655403 0.7245346 -0.1438066 0.5342698 0.832992 -0.0880779 0.3273776 0.9407796 0.003479123 -0.01272624 0.999913 0.1283012 -0.4763992 0.8698177 0.2255075 -0.837787 0.4972519 0.2582858 -0.9595 0.112464 0.2570599 -0.9549029 -0.148596 0.2466598 -0.9162609 -0.3156342 0.1210998 -0.9169772 -0.3801155 -0.3271652 0.7858374 0.5248072 -0.3425838 0.8228726 0.4533399 -0.300796 0.7225086 0.6224976 -0.2647531 0.6359569 0.7248895 -0.2124758 0.510406 0.8332706 -0.1301324 0.3126963 0.9408968 0.005127131 -0.01217693 0.9999127 0.1895549 -0.4551943 0.8699812 0.3333597 -0.8008202 0.4975523 0.381855 -0.9173431 0.1125544 0.3800569 -0.9129239 -0.148751 0.3646467 -0.8759089 -0.3159376 0.2405499 -0.8929827 -0.380418 -0.4268109 0.7362449 0.5251437 -0.4469462 0.7709937 0.4536604 -0.3923883 0.6768599 0.62281 -0.3453207 0.5956972 0.7251886 -0.2770882 0.4780297 0.8334925 -0.1696864 0.2928006 0.9409965 0.006683528 -0.01144444 0.9999123 0.2472065 -0.4263855 0.8701061 0.4349359 -0.7503262 0.4978369 0.4982846 -0.8596608 0.1126763 0.4959087 -0.8555181 -0.1488733 0.4757861 -0.8207692 -0.3161734 0.3554937 -0.853606 -0.380764 -0.5187014 0.674501 0.5253545 -0.5432077 0.7063622 0.453848 -0.4768334 0.6200605 0.6230208 -0.4196117 0.5456569 0.7253859 -0.3366887 0.4378296 0.8336341 -0.206187 0.2681409 0.9410566 0.008117914 -0.0104984 0.999912 0.3003712 -0.3905557 0.8701974 0.5286319 -0.6874259 0.49799 0.6057094 -0.7876633 0.1127064 0.6028164 -0.7838566 -0.148934 0.5783084 -0.7519932 -0.3163316 0.4637703 -0.7998175 -0.3810631 -0.601634 0.601634 0.5254265 -0.6300659 0.6300659 0.4539099 -0.5530375 0.5530681 0.6231095 -0.48669 0.48669 0.7254418 -0.3904905 0.3904905 0.8336873 -0.2391173 0.2391173 0.9410876 0.009399712 -0.009399712 0.9999117 0.3483726 -0.3483726 0.8702145 0.6131674 -0.6131674 0.4980478 0.702599 -0.702599 0.1127356 0.6992175 -0.6992175 -0.1489625 0.6707881 -0.6707881 -0.3163651 0.5636098 -0.7328117 -0.3812232 -0.7063622 0.5432077 0.453848 -0.674501 0.5187014 0.5253545 -0.6200605 0.4768334 0.6230208 -0.5456569 0.4196117 0.7253859 -0.4378296 0.3366887 0.8336341 -0.2681409 0.206187 0.9410566 0.0104984 -0.008117914 0.999912 0.3905557 -0.3003712 0.8701974 0.6874259 -0.5286319 0.49799 0.7838566 -0.6028164 -0.148934 0.7876633 -0.6057094 0.1127064 0.7519932 -0.5783084 -0.3163316 0.7328117 -0.5636098 -0.3812232 -0.7709937 0.4469462 0.4536604 -0.7362449 0.4268109 0.5251437 -0.6768599 0.3923883 0.62281 -0.5956972 0.3453207 0.7251886 -0.4780176 0.2770811 0.8335019 -0.2928006 0.1696864 0.9409965 0.01144444 -0.006683528 0.9999123 0.4263855 -0.2472065 0.8701061 0.7503262 -0.4349359 0.4978369 0.8555181 -0.4959087 -0.1488733 0.8596637 -0.4982863 0.1126462 0.8207692 -0.4757861 -0.3161734 0.7998175 -0.4637703 -0.3810631 -0.8228726 0.3425838 0.4533399 -0.7858374 0.3271652 0.5248072 -0.7225086 0.300796 0.6224976 -0.6359569 0.2647531 0.7248895 -0.510406 0.2124758 0.8332706 -0.3126963 0.1301324 0.9408968 0.01217693 -0.005127131 0.9999127 0.4551969 -0.1895255 0.8699861 0.8008081 -0.3333547 0.4975753 0.9129239 -0.3800569 -0.148751 0.9173399 -0.3818536 0.1125845 0.8759089 -0.3646467 -0.3159376 0.853596 -0.3554895 -0.3807901 -0.8608707 0.231767 0.4529742 -0.8221883 0.221356 0.524412 -0.7560334 0.2035357 0.6220825 -0.6655403 0.1791804 0.7245346 -0.5342479 0.143809 0.8330056 -0.3273776 0.0880779 0.9407796 0.01272624 -0.003479123 0.999913 0.4763992 -0.1283012 0.8698177 0.837787 -0.2255075 0.4972519 0.9549029 -0.2570599 -0.148596 0.9595 -0.2582858 0.112464 0.9162609 -0.2466598 -0.3156342 0.8929827 -0.2405499 -0.380418 -0.884036 0.1166731 0.4526233 -0.8443715 0.1114252 0.5240432 -0.7765125 0.1024546 0.6217166 -0.6836668 0.09021556 0.7241967 -0.5488917 0.07239204 0.8327528 -0.3364154 0.04434466 0.9406691 0.01306194 -0.001770079 0.9999132 0.4894354 -0.06460899 0.8696429 0.8603431 -0.1135018 0.4969176 0.9804262 -0.1293399 -0.1484449 0.9851322 -0.1299511 0.112372 0.9408208 -0.1241223 -0.3153567 0.9169772 -0.1210998 -0.3801155 0.8443715 0.1114252 0.5240432 0.884036 0.1166731 0.4526233 0.7765125 0.1024546 0.6217166 0.6836668 0.09021556 0.7241967 0.5488917 0.07239204 0.8327528 0.3364154 0.04434466 0.9406691 -0.01306194 -0.001770079 0.9999132 -0.4894354 -0.06460899 0.8696429 -0.8603431 -0.1135018 0.4969176 -0.9851322 -0.1299511 0.112372 -0.9804262 -0.1293399 -0.1484449 -0.9408208 -0.1241223 -0.3153567 0.8221883 0.221356 0.524412 0.8608787 0.2317609 0.4529623 0.7560334 0.2035357 0.6220825 0.6655403 0.1791804 0.7245346 0.5342698 0.1438066 0.832992 0.3273776 0.0880779 0.9407796 -0.01272624 -0.003479123 0.999913 -0.4763992 -0.1283012 0.8698177 -0.837787 -0.2255075 0.4972519 -0.9595 -0.2582858 0.112464 -0.9549029 -0.2570599 -0.148596 -0.9162609 -0.2466598 -0.3156342 -0.9169772 -0.1210998 -0.3801155 0.7858374 0.3271652 0.5248072 0.8228726 0.3425838 0.4533399 0.7225086 0.300796 0.6224976 0.6359569 0.2647531 0.7248895 0.510406 0.2124758 0.8332706 0.3126963 0.1301324 0.9408968 -0.01217693 -0.005127131 0.9999127 -0.4551969 -0.1895255 0.8699861 -0.8008202 -0.3333597 0.4975523 -0.9173431 -0.381855 0.1125544 -0.9129239 -0.3800569 -0.148751 -0.8759089 -0.3646467 -0.3159376 -0.8929827 -0.2405499 -0.380418 0.7362449 0.4268109 0.5251437 0.7709937 0.4469462 0.4536604 0.6768679 0.3923624 0.6228173 0.5956972 0.3453207 0.7251886 0.4780297 0.2770882 0.8334925 0.2928006 0.1696864 0.9409965 -0.01144444 -0.006683528 0.9999123 -0.4263855 -0.2472065 0.8701061 -0.7503395 -0.4349259 0.4978255 -0.8596637 -0.4982863 0.1126462 -0.8555181 -0.4959087 -0.1488733 -0.8207692 -0.4757861 -0.3161734 -0.853596 -0.3554895 -0.3807901 0.674501 0.5187014 0.5253545 0.7063622 0.5432077 0.453848 0.6200605 0.4768334 0.6230208 0.5456569 0.4196117 0.7253859 0.4378296 0.3366887 0.8336341 0.2681409 0.206187 0.9410566 -0.0104984 -0.008117914 0.999912 -0.3905557 -0.3003712 0.8701974 -0.6874259 -0.5286319 0.49799 -0.7876633 -0.6057094 0.1127064 -0.7838566 -0.6028164 -0.148934 -0.7519932 -0.5783084 -0.3163316 -0.7998175 -0.4637703 -0.3810631 0.601634 0.601634 0.5254265 0.6300659 0.6300659 0.4539099 0.5530468 0.5530468 0.62312 0.48669 0.48669 0.7254418 0.3904905 0.3904905 0.8336873 0.2391173 0.2391173 0.9410876 -0.009399712 -0.009399712 0.9999117 -0.3483726 -0.3483726 0.8702145 -0.6131674 -0.6131674 0.4980478 -0.702599 -0.702599 0.1127356 -0.6992175 -0.6992175 -0.1489625 -0.6707881 -0.6707881 -0.3163651 -0.7328117 -0.5636098 -0.3812232 0.5432077 0.7063622 0.453848 0.5187014 0.674501 0.5253545 0.4768334 0.6200605 0.6230208 0.4196117 0.5456569 0.7253859 0.3366887 0.4378296 0.8336341 0.206187 0.2681409 0.9410566 -0.008117914 -0.0104984 0.999912 -0.3003712 -0.3905557 0.8701974 -0.5286319 -0.6874259 0.49799 -0.6028164 -0.7838566 -0.148934 -0.6057094 -0.7876633 0.1127064 -0.5783084 -0.7519932 -0.3163316 -0.5636098 -0.7328117 -0.3812232 0.4469462 0.7709937 0.4536604 0.4268109 0.7362449 0.5251437 0.3923883 0.6768599 0.62281 0.3453207 0.5956972 0.7251886 0.2770882 0.4780297 0.8334925 0.1696864 0.2928006 0.9409965 -0.006683528 -0.01144444 0.9999123 -0.2472065 -0.4263855 0.8701061 -0.4349359 -0.7503262 0.4978369 -0.4959087 -0.8555181 -0.1488733 -0.4982863 -0.8596637 0.1126462 -0.4757861 -0.8207692 -0.3161734 -0.4637703 -0.7998175 -0.3810631 0.3425838 0.8228726 0.4533399 0.3271652 0.7858374 0.5248072 0.300796 0.7225086 0.6224976 0.2647531 0.6359569 0.7248895 0.2124758 0.510406 0.8332706 0.1301324 0.3126963 0.9408968 -0.005127131 -0.01217693 0.9999127 -0.1895549 -0.4551943 0.8699812 -0.3333597 -0.8008202 0.4975523 -0.3800569 -0.9129239 -0.148751 -0.3818536 -0.9173399 0.1125845 -0.3646467 -0.8759089 -0.3159376 -0.3554937 -0.853606 -0.380764 0.2317609 0.8608787 0.4529623 0.221356 0.8221883 0.524412 0.2035357 0.7560334 0.6220825 0.1791804 0.6655403 0.7245346 0.1438066 0.5342698 0.832992 0.0880779 0.3273776 0.9407796 -0.003479123 -0.01272624 0.999913 -0.1283012 -0.4763992 0.8698177 -0.2255075 -0.837787 0.4972519 -0.2570599 -0.9549029 -0.148596 -0.2582858 -0.9595 0.112464 -0.2466598 -0.9162609 -0.3156342 -0.2405499 -0.8929827 -0.380418 0.1166731 0.884036 0.4526233 0.1114252 0.8443715 0.5240432 0.1024546 0.7765125 0.6217166 0.09021556 0.6836668 0.7241967 0.07239204 0.5488917 0.8327528 0.04434382 0.3363786 0.9406822 -0.001770079 -0.01306194 0.9999132 -0.06460899 -0.4894354 0.8696429 -0.1135018 -0.8603431 0.4969176 -0.1293399 -0.9804262 -0.1484449 -0.1299511 -0.9851322 0.112372 -0.1241223 -0.9408208 -0.3153567 -0.1210998 -0.9169772 -0.3801155 0.1303791 -0.9878848 0.08417266 0 -0.9997311 -0.02319419 0.1308045 -0.9911361 -0.02322494 0.129216 -0.9790079 0.1576288 0 -0.9964564 0.08411127 0.1276616 -0.9672739 0.2192801 0 -0.9875078 0.1575703 0.125952 -0.9544828 0.2703681 0 -0.9756833 0.2191854 0.1242749 -0.9418283 0.3122743 0 -0.9627828 0.2702763 0.122747 -0.9300937 0.3462063 0 -0.9500328 0.3121505 0.1213748 -0.919757 0.3732497 0 -0.9382144 0.3460547 0.1202157 -0.9110939 0.3942794 0 -0.9277911 0.3731002 0.119331 -0.9042604 0.4099676 0 -0.9190567 0.3941256 0.1186878 -0.8993298 0.4208551 0 -0.9121681 0.4098165 0.1182928 -0.8963521 0.4272703 0 -0.9071996 0.4207006 0 -0.9042133 0.4270812 0.2590769 -0.9621768 0.0842328 0.2599307 -0.965348 -0.02322494 0.256729 -0.9535167 0.1577851 0.2536447 -0.9420653 0.2194938 0.2502876 -0.929583 0.2706134 0.2469643 -0.9172353 0.3125509 0.2438806 -0.9057859 0.3465175 0.2411632 -0.89571 0.3735558 0.2388737 -0.8872541 0.3946132 0.2370722 -0.8805975 0.4102985 0.2357923 -0.8757825 0.4211972 0.2349991 -0.8728846 0.4276069 0.3829811 -0.9198995 0.08432358 0.3842664 -0.9229293 -0.02325558 0.3795326 -0.9115985 0.1579351 0.3749617 -0.9006285 0.2197093 0.3699876 -0.8886662 0.2708908 0.3650681 -0.876841 0.3128501 0.3604917 -0.8658882 0.3468192 0.3564701 -0.8562303 0.3738969 0.3531087 -0.8481322 0.3949506 0.3504508 -0.8417473 0.410665 0.3485305 -0.8371446 0.4215632 0.3473716 -0.8343693 0.4279732 0.4997519 -0.8620454 0.08441609 0.5013948 -0.8649053 -0.02328586 0.4952337 -0.8542606 0.1580585 0.4892485 -0.8439697 0.2198886 0.4827494 -0.8327412 0.2711002 0.476315 -0.8216411 0.3130977 0.4703361 -0.8113611 0.3470983 0.4650894 -0.8023015 0.3741713 0.4606897 -0.7946935 0.3952562 0.4572089 -0.7887091 0.4109722 0.4547012 -0.784397 0.4218629 0.4532103 -0.7817801 0.4282761 0.6074475 -0.7898586 0.08444565 0.609457 -0.7924772 -0.02328568 0.6019328 -0.7827293 0.1581512 0.5946747 -0.7732755 0.2200159 0.58676 -0.7629773 0.2712537 0.5789304 -0.7528018 0.3132554 0.5716903 -0.7433623 0.3472503 0.5652822 -0.7350622 0.3743522 0.5599293 -0.7280881 0.3954327 0.555694 -0.7226036 0.4111549 0.5526695 -0.7186321 0.422048 0.5508131 -0.7162585 0.428461 0.7045791 -0.7045791 0.08447867 0.7069146 -0.7069146 -0.02331656 0.6982048 -0.6982048 0.1581779 0.6897751 -0.6897751 0.2200468 0.6805888 -0.6805888 0.2712894 0.6715055 -0.6715055 0.3133062 0.6630902 -0.6630902 0.3473083 0.6556743 -0.6556743 0.3744094 0.6494532 -0.6494532 0.3955011 0.6445566 -0.6445566 0.41121 0.6410238 -0.6410238 0.4221101 0.6388929 -0.6388929 0.4285228 0.7924772 -0.609457 -0.02328568 0.7898586 -0.6074475 0.08444565 0.7827293 -0.6019328 0.1581512 0.7732807 -0.5946787 0.2199869 0.7629773 -0.58676 0.2712537 0.7528018 -0.5789304 0.3132554 0.7433623 -0.5716903 0.3472503 0.7350622 -0.5652822 0.3743522 0.7280881 -0.5599293 0.3954327 0.7226036 -0.555694 0.4111549 0.7186321 -0.5526695 0.422048 0.7162585 -0.5508131 0.428461 0.8649053 -0.5013948 -0.02328586 0.8620454 -0.4997519 0.08441609 0.8542606 -0.4952337 0.1580585 0.8439697 -0.4892485 0.2198886 0.8327412 -0.4827494 0.2711002 0.8216411 -0.476315 0.3130977 0.8113611 -0.4703361 0.3470983 0.8023015 -0.4650894 0.3741713 0.7946935 -0.4606897 0.3952562 0.7887091 -0.4572089 0.4109722 0.784397 -0.4547012 0.4218629 0.7817801 -0.4532103 0.4282761 0.9229293 -0.3842664 -0.02325558 0.9198995 -0.3829811 0.08432358 0.9115985 -0.3795326 0.1579351 0.9006285 -0.3749617 0.2197093 0.8886662 -0.3699876 0.2708908 0.876841 -0.3650681 0.3128501 0.8658882 -0.3604917 0.3468192 0.8562303 -0.3564701 0.3738969 0.8481322 -0.3531087 0.3949506 0.8417473 -0.3504508 0.410665 0.8371446 -0.3485305 0.4215632 0.8343693 -0.3473716 0.4279732 0.9653473 -0.2599306 -0.02325546 0.9621768 -0.2590769 0.0842328 0.9535167 -0.256729 0.1577851 0.9420653 -0.2536447 0.2194938 0.929583 -0.2502876 0.2706134 0.9172353 -0.2469643 0.3125509 0.9057859 -0.2438806 0.3465175 0.89571 -0.2411632 0.3735558 0.8872541 -0.2388737 0.3946132 0.8805975 -0.2370722 0.4102985 0.8757825 -0.2357923 0.4211972 0.8728846 -0.2349991 0.4276069 0.9911361 -0.1308045 -0.02322494 0.9878848 -0.1303791 0.08417266 0.9790079 -0.129216 0.1576288 0.9672739 -0.1276616 0.2192801 0.9544828 -0.125952 0.2703681 0.9418283 -0.1242749 0.3122743 0.9300937 -0.122747 0.3462063 0.919757 -0.1213748 0.3732497 0.9110939 -0.1202157 0.3942794 0.9042604 -0.119331 0.4099676 0.8993298 -0.1186878 0.4208551 0.8963521 -0.1182928 0.4272703 0.9997311 0 -0.02319419 0.9964564 0 0.08411127 0.9875125 0 0.1575405 0.9756833 0 0.2191854 0.9627828 0 0.2702763 0.9500328 0 0.3121505 0.9382144 0 0.3460547 0.9277911 0 0.3731002 0.9190567 0 0.3941256 0.9121681 0 0.4098165 0.9072113 0 0.4206755 0.9042133 0 0.4270812 -0.9878848 -0.1303791 0.08417266 -0.8646124 0 0.5024396 -0.9911361 -0.1308045 -0.02322494 -0.9790079 -0.129216 0.1576288 -0.9964564 0 0.08411127 -0.9672739 -0.1276616 0.2192801 -0.9875125 0 0.1575405 -0.9544828 -0.125952 0.2703681 -0.9756833 0 0.2191854 -0.9418283 -0.1242749 0.3122743 -0.9627828 0 0.2702763 -0.9300937 -0.122747 0.3462063 -0.9500328 0 0.3121505 -0.919757 -0.1213748 0.3732497 -0.9382144 0 0.3460547 -0.9110939 -0.1202157 0.3942794 -0.9277911 0 0.3731002 -0.9042604 -0.119331 0.4099676 -0.9190567 0 0.3941256 -0.8993298 -0.1186878 0.4208551 -0.9121681 0 0.4098165 -0.8963521 -0.1182928 0.4272703 -0.9072113 0 0.4206755 -0.9042133 0 0.4270812 -0.9621768 -0.2590769 0.0842328 -0.9653473 -0.2599306 -0.02325546 -0.9535167 -0.256729 0.1577851 -0.9420653 -0.2536447 0.2194938 -0.929583 -0.2502876 0.2706134 -0.9172353 -0.2469643 0.3125509 -0.9057859 -0.2438806 0.3465175 -0.89571 -0.2411632 0.3735558 -0.8872541 -0.2388737 0.3946132 -0.8805975 -0.2370722 0.4102985 -0.8757825 -0.2357923 0.4211972 -0.8728846 -0.2349991 0.4276069 -0.9198995 -0.3829811 0.08432358 -0.9229293 -0.3842664 -0.02325558 -0.9115985 -0.3795326 0.1579351 -0.9006285 -0.3749617 0.2197093 -0.8886662 -0.3699876 0.2708908 -0.876841 -0.3650681 0.3128501 -0.8658882 -0.3604917 0.3468192 -0.8562303 -0.3564701 0.3738969 -0.8481322 -0.3531087 0.3949506 -0.8417473 -0.3504508 0.410665 -0.8371446 -0.3485305 0.4215632 -0.8343693 -0.3473716 0.4279732 -0.8620454 -0.4997519 0.08441609 -0.8649053 -0.5013948 -0.02328586 -0.8542606 -0.4952337 0.1580585 -0.8439697 -0.4892485 0.2198886 -0.8327412 -0.4827494 0.2711002 -0.8216411 -0.476315 0.3130977 -0.8113611 -0.4703361 0.3470983 -0.8023015 -0.4650894 0.3741713 -0.7946935 -0.4606897 0.3952562 -0.7887091 -0.4572089 0.4109722 -0.784397 -0.4547012 0.4218629 -0.7817801 -0.4532103 0.4282761 -0.7898586 -0.6074475 0.08444565 -0.7924772 -0.609457 -0.02328568 -0.7827293 -0.6019328 0.1581512 -0.7732807 -0.5946787 0.2199869 -0.7629773 -0.58676 0.2712537 -0.7528018 -0.5789304 0.3132554 -0.7433623 -0.5716903 0.3472503 -0.7350622 -0.5652822 0.3743522 -0.7280881 -0.5599293 0.3954327 -0.7226036 -0.555694 0.4111549 -0.7186321 -0.5526695 0.422048 -0.7162585 -0.5508131 0.428461 -0.7045791 -0.7045791 0.08447867 -0.7069146 -0.7069146 -0.02331656 -0.6982048 -0.6982048 0.1581779 -0.6897751 -0.6897751 0.2200468 -0.6805888 -0.6805888 0.2712894 -0.6715055 -0.6715055 0.3133062 -0.6630902 -0.6630902 0.3473083 -0.6556743 -0.6556743 0.3744094 -0.6494532 -0.6494532 0.3955011 -0.6445566 -0.6445566 0.41121 -0.6410238 -0.6410238 0.4221101 -0.6388929 -0.6388929 0.4285228 -0.609457 -0.7924772 -0.02328568 -0.6074475 -0.7898586 0.08444565 -0.6019328 -0.7827293 0.1581512 -0.5946747 -0.7732755 0.2200159 -0.58676 -0.7629773 0.2712537 -0.5789304 -0.7528018 0.3132554 -0.5716903 -0.7433623 0.3472503 -0.5652822 -0.7350622 0.3743522 -0.5599293 -0.7280881 0.3954327 -0.555694 -0.7226036 0.4111549 -0.5526695 -0.7186321 0.422048 -0.5508131 -0.7162585 0.428461 -0.5013948 -0.8649053 -0.02328586 -0.4997519 -0.8620454 0.08441609 -0.4952337 -0.8542606 0.1580585 -0.4892485 -0.8439697 0.2198886 -0.4827494 -0.8327412 0.2711002 -0.476315 -0.8216411 0.3130977 -0.4703361 -0.8113611 0.3470983 -0.4650894 -0.8023015 0.3741713 -0.4606897 -0.7946935 0.3952562 -0.4572089 -0.7887091 0.4109722 -0.4547012 -0.784397 0.4218629 -0.4532103 -0.7817801 0.4282761 -0.3842664 -0.9229293 -0.02325558 -0.3829811 -0.9198995 0.08432358 -0.3795326 -0.9115985 0.1579351 -0.3749617 -0.9006285 0.2197093 -0.3699876 -0.8886662 0.2708908 -0.3650681 -0.876841 0.3128501 -0.3604917 -0.8658882 0.3468192 -0.3564701 -0.8562303 0.3738969 -0.3531087 -0.8481322 0.3949506 -0.3504508 -0.8417473 0.410665 -0.3485305 -0.8371446 0.4215632 -0.3473716 -0.8343693 0.4279732 -0.2599306 -0.9653473 -0.02325546 -0.2590769 -0.9621768 0.0842328 -0.256729 -0.9535167 0.1577851 -0.2536447 -0.9420653 0.2194938 -0.2502876 -0.929583 0.2706134 -0.2469643 -0.9172353 0.3125509 -0.2438806 -0.9057859 0.3465175 -0.2411632 -0.89571 0.3735558 -0.2388737 -0.8872541 0.3946132 -0.2370722 -0.8805975 0.4102985 -0.2357923 -0.8757825 0.4211972 -0.2349991 -0.8728846 0.4276069 -0.1308045 -0.9911361 -0.02322494 -0.1303791 -0.9878848 0.08417266 -0.129216 -0.9790079 0.1576288 -0.1276616 -0.9672739 0.2192801 -0.125952 -0.9544828 0.2703681 -0.1242749 -0.9418283 0.3122743 -0.122747 -0.9300937 0.3462063 -0.1213748 -0.919757 0.3732497 -0.1202157 -0.9110939 0.3942794 -0.119331 -0.9042604 0.4099676 -0.1186878 -0.8993298 0.4208551 -0.1182928 -0.8963521 0.4272703 -0.1303791 0.9878848 0.08417266 0 0.9997311 -0.02319419 -0.1308045 0.9911361 -0.02322494 -0.129216 0.9790079 0.1576288 0 0.9964564 0.08411127 -0.1276616 0.9672739 0.2192801 0 0.9875078 0.1575703 -0.125952 0.9544828 0.2703681 0 0.9756833 0.2191854 -0.1242749 0.9418283 0.3122743 0 0.9627828 0.2702763 -0.122747 0.9300937 0.3462063 0 0.9500328 0.3121505 -0.1213748 0.919757 0.3732497 0 0.9382144 0.3460547 -0.1202157 0.9110939 0.3942794 0 0.9277911 0.3731002 -0.119331 0.9042604 0.4099676 0 0.9190567 0.3941256 -0.1186878 0.8993298 0.4208551 0 0.9121681 0.4098165 -0.1182928 0.8963521 0.4272703 0 0.9071996 0.4207006 0 0.9042133 0.4270812 -0.2590769 0.9621768 0.0842328 -0.2599307 0.965348 -0.02322494 -0.256729 0.9535167 0.1577851 -0.2536447 0.9420653 0.2194938 -0.2502876 0.929583 0.2706134 -0.2469643 0.9172353 0.3125509 -0.2438806 0.9057859 0.3465175 -0.2411632 0.89571 0.3735558 -0.2388737 0.8872541 0.3946132 -0.2370722 0.8805975 0.4102985 -0.2357923 0.8757825 0.4211972 -0.2349991 0.8728846 0.4276069 -0.3829811 0.9198995 0.08432358 -0.3842664 0.9229293 -0.02325558 -0.3795326 0.9115985 0.1579351 -0.3749617 0.9006285 0.2197093 -0.3699876 0.8886662 0.2708908 -0.3650681 0.876841 0.3128501 -0.3604917 0.8658882 0.3468192 -0.3564701 0.8562303 0.3738969 -0.3531087 0.8481322 0.3949506 -0.3504508 0.8417473 0.410665 -0.3485305 0.8371446 0.4215632 -0.3473716 0.8343693 0.4279732 -0.4997519 0.8620454 0.08441609 -0.5013948 0.8649053 -0.02328586 -0.4952337 0.8542606 0.1580585 -0.4892485 0.8439697 0.2198886 -0.4827494 0.8327412 0.2711002 -0.476315 0.8216411 0.3130977 -0.4703361 0.8113611 0.3470983 -0.4650894 0.8023015 0.3741713 -0.4606897 0.7946935 0.3952562 -0.4572089 0.7887091 0.4109722 -0.4547012 0.784397 0.4218629 -0.4532103 0.7817801 0.4282761 -0.6074475 0.7898586 0.08444565 -0.609457 0.7924772 -0.02328568 -0.6019328 0.7827293 0.1581512 -0.5946747 0.7732755 0.2200159 -0.58676 0.7629773 0.2712537 -0.5789304 0.7528018 0.3132554 -0.5716903 0.7433623 0.3472503 -0.5652822 0.7350622 0.3743522 -0.5599293 0.7280881 0.3954327 -0.555694 0.7226036 0.4111549 -0.5526695 0.7186321 0.422048 -0.5508131 0.7162585 0.428461 -0.7045791 0.7045791 0.08447867 -0.7069146 0.7069146 -0.02331656 -0.6982048 0.6982048 0.1581779 -0.6897751 0.6897751 0.2200468 -0.6805888 0.6805888 0.2712894 -0.6715055 0.6715055 0.3133062 -0.6630902 0.6630902 0.3473083 -0.6556743 0.6556743 0.3744094 -0.6494532 0.6494532 0.3955011 -0.6445566 0.6445566 0.41121 -0.6410238 0.6410238 0.4221101 -0.6388929 0.6388929 0.4285228 -0.7924772 0.609457 -0.02328568 -0.7898586 0.6074475 0.08444565 -0.7827293 0.6019328 0.1581512 -0.7732807 0.5946787 0.2199869 -0.7629773 0.58676 0.2712537 -0.7528018 0.5789304 0.3132554 -0.7433623 0.5716903 0.3472503 -0.7350622 0.5652822 0.3743522 -0.7280881 0.5599293 0.3954327 -0.7226036 0.555694 0.4111549 -0.7186321 0.5526695 0.422048 -0.7162585 0.5508131 0.428461 -0.8649053 0.5013948 -0.02328586 -0.8620454 0.4997519 0.08441609 -0.8542606 0.4952337 0.1580585 -0.8439697 0.4892485 0.2198886 -0.8327412 0.4827494 0.2711002 -0.8216411 0.476315 0.3130977 -0.8113611 0.4703361 0.3470983 -0.8023015 0.4650894 0.3741713 -0.7946935 0.4606897 0.3952562 -0.7887091 0.4572089 0.4109722 -0.784397 0.4547012 0.4218629 -0.7817801 0.4532103 0.4282761 -0.9229293 0.3842664 -0.02325558 -0.9198995 0.3829811 0.08432358 -0.9115985 0.3795326 0.1579351 -0.9006285 0.3749617 0.2197093 -0.8886662 0.3699876 0.2708908 -0.876841 0.3650681 0.3128501 -0.8658882 0.3604917 0.3468192 -0.8562303 0.3564701 0.3738969 -0.8481322 0.3531087 0.3949506 -0.8417473 0.3504508 0.410665 -0.8371446 0.3485305 0.4215632 -0.8343693 0.3473716 0.4279732 -0.9653473 0.2599306 -0.02325546 -0.9621768 0.2590769 0.0842328 -0.9535167 0.256729 0.1577851 -0.9420653 0.2536447 0.2194938 -0.929583 0.2502876 0.2706134 -0.9172353 0.2469643 0.3125509 -0.9057859 0.2438806 0.3465175 -0.89571 0.2411632 0.3735558 -0.8872541 0.2388737 0.3946132 -0.8805975 0.2370722 0.4102985 -0.8757825 0.2357923 0.4211972 -0.8728846 0.2349991 0.4276069 -0.9911361 0.1308045 -0.02322494 -0.9878848 0.1303791 0.08417266 -0.9790079 0.129216 0.1576288 -0.9672739 0.1276616 0.2192801 -0.9544828 0.125952 0.2703681 -0.9418283 0.1242749 0.3122743 -0.9300937 0.122747 0.3462063 -0.919757 0.1213748 0.3732497 -0.9110939 0.1202157 0.3942794 -0.9042604 0.119331 0.4099676 -0.8993298 0.1186878 0.4208551 -0.8963521 0.1182928 0.4272703 0.9878848 0.1303791 0.08417266 0.9911361 0.1308045 -0.02322494 0.9790079 0.129216 0.1576288 0.9672739 0.1276616 0.2192801 0.9544828 0.125952 0.2703681 0.9418283 0.1242749 0.3122743 0.9300937 0.122747 0.3462063 0.919757 0.1213748 0.3732497 0.9110939 0.1202157 0.3942794 0.9042604 0.119331 0.4099676 0.8993298 0.1186878 0.4208551 0.8963521 0.1182928 0.4272703 0.9621768 0.2590769 0.0842328 0.9653473 0.2599306 -0.02325546 0.9535167 0.256729 0.1577851 0.9420653 0.2536447 0.2194938 0.929583 0.2502876 0.2706134 0.9172353 0.2469643 0.3125509 0.9057859 0.2438806 0.3465175 0.89571 0.2411632 0.3735558 0.8872541 0.2388737 0.3946132 0.8805975 0.2370722 0.4102985 0.8757825 0.2357923 0.4211972 0.8728846 0.2349991 0.4276069 0.9198995 0.3829811 0.08432358 0.9229293 0.3842664 -0.02325558 0.9115985 0.3795326 0.1579351 0.9006285 0.3749617 0.2197093 0.8886662 0.3699876 0.2708908 0.876841 0.3650681 0.3128501 0.8658882 0.3604917 0.3468192 0.8562303 0.3564701 0.3738969 0.8481322 0.3531087 0.3949506 0.8417473 0.3504508 0.410665 0.8371446 0.3485305 0.4215632 0.8343693 0.3473716 0.4279732 0.8620454 0.4997519 0.08441609 0.8649053 0.5013948 -0.02328586 0.8542606 0.4952337 0.1580585 0.8439697 0.4892485 0.2198886 0.8327412 0.4827494 0.2711002 0.8216411 0.476315 0.3130977 0.8113611 0.4703361 0.3470983 0.8023015 0.4650894 0.3741713 0.7946935 0.4606897 0.3952562 0.7887091 0.4572089 0.4109722 0.784397 0.4547012 0.4218629 0.7817801 0.4532103 0.4282761 0.7898586 0.6074475 0.08444565 0.7924772 0.609457 -0.02328568 0.7827293 0.6019328 0.1581512 0.7732807 0.5946787 0.2199869 0.7629773 0.58676 0.2712537 0.7528018 0.5789304 0.3132554 0.7433623 0.5716903 0.3472503 0.7350622 0.5652822 0.3743522 0.7280881 0.5599293 0.3954327 0.7226036 0.555694 0.4111549 0.7186321 0.5526695 0.422048 0.7162585 0.5508131 0.428461 0.7045791 0.7045791 0.08447867 0.7069146 0.7069146 -0.02331656 0.6982048 0.6982048 0.1581779 0.6897751 0.6897751 0.2200468 0.6805888 0.6805888 0.2712894 0.6715055 0.6715055 0.3133062 0.6630902 0.6630902 0.3473083 0.6556743 0.6556743 0.3744094 0.6494532 0.6494532 0.3955011 0.6445566 0.6445566 0.41121 0.6410238 0.6410238 0.4221101 0.6388929 0.6388929 0.4285228 0.609457 0.7924772 -0.02328568 0.6074475 0.7898586 0.08444565 0.6019328 0.7827293 0.1581512 0.5946747 0.7732755 0.2200159 0.58676 0.7629773 0.2712537 0.5789304 0.7528018 0.3132554 0.5716903 0.7433623 0.3472503 0.5652822 0.7350622 0.3743522 0.5599293 0.7280881 0.3954327 0.555694 0.7226036 0.4111549 0.5526695 0.7186321 0.422048 0.5508131 0.7162585 0.428461 0.5013948 0.8649053 -0.02328586 0.4997519 0.8620454 0.08441609 0.4952337 0.8542606 0.1580585 0.4892485 0.8439697 0.2198886 0.4827494 0.8327412 0.2711002 0.476315 0.8216411 0.3130977 0.4703361 0.8113611 0.3470983 0.4650894 0.8023015 0.3741713 0.4606897 0.7946935 0.3952562 0.4572089 0.7887091 0.4109722 0.4547012 0.784397 0.4218629 0.4532103 0.7817801 0.4282761 0.3842664 0.9229293 -0.02325558 0.3829811 0.9198995 0.08432358 0.3795326 0.9115985 0.1579351 0.3749617 0.9006285 0.2197093 0.3699876 0.8886662 0.2708908 0.3650681 0.876841 0.3128501 0.3604917 0.8658882 0.3468192 0.3564701 0.8562303 0.3738969 0.3531087 0.8481322 0.3949506 0.3504508 0.8417473 0.410665 0.3485305 0.8371446 0.4215632 0.3473716 0.8343693 0.4279732 0.2599306 0.9653473 -0.02325546 0.2590769 0.9621768 0.0842328 0.256729 0.9535167 0.1577851 0.2536447 0.9420653 0.2194938 0.2502876 0.929583 0.2706134 0.2469643 0.9172353 0.3125509 0.2438806 0.9057859 0.3465175 0.2411632 0.89571 0.3735558 0.2388737 0.8872541 0.3946132 0.2370722 0.8805975 0.4102985 0.2357923 0.8757825 0.4211972 0.2349991 0.8728846 0.4276069 0.1308045 0.9911361 -0.02322494 0.1303791 0.9878848 0.08417266 0.129216 0.9790079 0.1576288 0.1276616 0.9672739 0.2192801 0.125952 0.9544828 0.2703681 0.1242749 0.9418283 0.3122743 0.122747 0.9300937 0.3462063 0.1213748 0.919757 0.3732497 0.1202157 0.9110939 0.3942794 0.119331 0.9042604 0.4099676 0.1186878 0.8993298 0.4208551 0.1182928 0.8963521 0.4272703 0.1192407 -0.9044224 -0.4096361 0 -0.8272777 -0.5617932 0 -0.9627488 -0.2703973 0.1081908 -0.8200225 -0.5620125 0 -0.6863475 -0.7272738 0.08975791 -0.68025 -0.7274637 0 -0.6421007 -0.7666203 0.08395981 -0.6363978 -0.7667781 0 -0.6404726 -0.7679811 0.08374387 -0.6347934 -0.7681306 0 -0.6627162 -0.7488707 0.08667504 -0.6568686 -0.7490067 0 -0.7016381 -0.7125335 0.09177219 -0.6954483 -0.7126919 0 -0.753425 -0.657534 0.09854727 -0.746811 -0.6576943 0 -0.814609 -0.5800107 0.1065442 -0.8074901 -0.5801794 0 -0.8797852 -0.4753715 0.1150859 -0.8721325 -0.4755421 0 -0.940177 -0.3406867 0.123022 -0.9320501 -0.3408056 0 -0.9839835 -0.1782596 0.1287599 -0.9755112 -0.1783228 0.2369835 -0.8807611 -0.4099984 0.2149434 -0.7984616 -0.5623687 0.1782945 -0.6622106 -0.7277969 0.1667901 -0.6194888 -0.767082 0.1663595 -0.6179198 -0.7684398 0.1721268 -0.6394329 -0.7493317 0.1822607 -0.6770078 -0.713051 0.1957488 -0.7270846 -0.6580506 0.2116776 -0.7862226 -0.5805571 0.2286513 -0.8492634 -0.475889 0.2443989 -0.9077064 -0.3410842 0.2558442 -0.9500998 -0.1784775 0.3699226 -0.8886567 -0.2710101 0.3176719 -0.7631573 -0.5627393 0.2634375 -0.632775 -0.728146 0.2464122 -0.5919203 -0.7674058 0.2457724 -0.5903972 -0.7687829 0.2543496 -0.6109701 -0.7496812 0.2693316 -0.6469146 -0.7134158 0.2892642 -0.6948078 -0.6584591 0.3128221 -0.7514141 -0.5809641 0.3379686 -0.8117472 -0.4762812 0.3612534 -0.8677161 -0.341416 0.3781975 -0.908321 -0.1786611 0.4572059 -0.788887 -0.4106338 0.414453 -0.7150077 -0.5630213 0.3435897 -0.5927212 -0.728442 0.3213701 -0.5544169 -0.767687 0.3205692 -0.5530002 -0.7690426 0.3317421 -0.5722627 -0.7499751 0.351273 -0.6059841 -0.713716 0.3773067 -0.6508793 -0.6587837 0.4080752 -0.703961 -0.5813035 0.4409101 -0.7605677 -0.4765871 0.4713472 -0.813077 -0.3416687 0.4934675 -0.851185 -0.1788129 0.5557516 -0.7227517 -0.4108167 0.5037199 -0.6550343 -0.5632019 0.4175344 -0.5429381 -0.7286174 0.3905252 -0.5078109 -0.767866 0.3895223 -0.5065346 -0.7692173 0.4031296 -0.5241997 -0.7501342 0.4268726 -0.5550839 -0.7139061 0.4585285 -0.5962335 -0.658982 0.4959349 -0.6448985 -0.5815104 0.5358591 -0.6967877 -0.4768041 0.5729006 -0.7449356 -0.3418421 0.5997987 -0.7798939 -0.178905 0.6805718 -0.6805718 -0.2713742 0.5842646 -0.5842646 -0.5632672 0.4842736 -0.4842736 -0.7286688 0.4529336 -0.4529336 -0.7679209 0.4517816 -0.4517816 -0.7692769 0.4675364 -0.4675364 -0.750213 0.4950922 -0.4950922 -0.7139801 0.5318027 -0.5318027 -0.659069 0.5752266 -0.5752266 -0.5815746 0.6215295 -0.6215295 -0.4768671 0.6644995 -0.6644995 -0.3418786 0.6956946 -0.6956946 -0.1789364 0.6550343 -0.5037199 -0.5632019 0.7227517 -0.5557516 -0.4108167 0.5429381 -0.4175344 -0.7286174 0.5078109 -0.3905252 -0.767866 0.5065346 -0.3895223 -0.7692173 0.5241997 -0.4031296 -0.7501342 0.5550839 -0.4268726 -0.7139061 0.5962335 -0.4585285 -0.658982 0.6448985 -0.4959349 -0.5815104 0.6967877 -0.5358591 -0.4768041 0.7449356 -0.5729006 -0.3418421 0.7798939 -0.5997987 -0.178905 0.7150077 -0.414453 -0.5630213 0.788887 -0.4572059 -0.4106338 0.5927212 -0.3435897 -0.728442 0.5544169 -0.3213701 -0.767687 0.5530002 -0.3205692 -0.7690426 0.5722627 -0.3317421 -0.7499751 0.6059841 -0.351273 -0.713716 0.6508793 -0.3773067 -0.6587837 0.703961 -0.4080752 -0.5813035 0.7605677 -0.4409101 -0.4765871 0.813077 -0.4713472 -0.3416687 0.851185 -0.4934675 -0.1788129 0.7631573 -0.3176719 -0.5627393 0.8886567 -0.3699226 -0.2710101 0.632775 -0.2634375 -0.728146 0.5919203 -0.2464122 -0.7674058 0.5903972 -0.2457724 -0.7687829 0.6109701 -0.2543496 -0.7496812 0.6469199 -0.2693033 -0.7134217 0.6948078 -0.2892642 -0.6584591 0.7514141 -0.3128221 -0.5809641 0.8117472 -0.3379686 -0.4762812 0.8677161 -0.3612534 -0.341416 0.908321 -0.3781975 -0.1786611 0.7984616 -0.2149434 -0.5623687 0.8807721 -0.2369865 -0.409973 0.6622106 -0.1782945 -0.7277969 0.6194888 -0.1667901 -0.767082 0.6179198 -0.1663595 -0.7684398 0.6394149 -0.1721302 -0.7493463 0.6770078 -0.1822607 -0.713051 0.7270846 -0.1957488 -0.6580506 0.7862226 -0.2116776 -0.5805571 0.8492634 -0.2286513 -0.475889 0.9077064 -0.2443989 -0.3410842 0.9500998 -0.2558442 -0.1784775 0.8200225 -0.1081908 -0.5620125 0.904428 -0.1192374 -0.4096248 0.68025 -0.08975791 -0.7274637 0.6364159 -0.08395814 -0.7667632 0.6347934 -0.08374387 -0.7681306 0.6568686 -0.08667504 -0.7490067 0.6954483 -0.09177219 -0.7126919 0.746811 -0.09854727 -0.6576943 0.8074901 -0.1065442 -0.5801794 0.8721325 -0.1150859 -0.4755421 0.9320501 -0.123022 -0.3408056 0.9755112 -0.1287599 -0.1783228 0.8272777 0 -0.5617932 0.9627488 0 -0.2703973 0.6863323 0 -0.7272883 0.6421007 0 -0.7666203 0.6404726 0 -0.7679811 0.6627162 0 -0.7488707 0.7016381 0 -0.7125335 0.753425 0 -0.657534 0.814609 0 -0.5800107 0.8797852 0 -0.4753715 0.940177 0 -0.3406867 0.9839835 0 -0.1782596 -0.904428 -0.1192374 -0.4096248 -0.8272777 0 -0.5617932 -0.9627488 0 -0.2703973 -0.8200225 -0.1081908 -0.5620125 -0.6863323 0 -0.7272883 -0.68025 -0.08975791 -0.7274637 -0.6421007 0 -0.7666203 -0.6364159 -0.08395814 -0.7667632 -0.6404726 0 -0.7679811 -0.6347934 -0.08374387 -0.7681306 -0.6627162 0 -0.7488707 -0.6568686 -0.08667504 -0.7490067 -0.7016381 0 -0.7125335 -0.6954483 -0.09177219 -0.7126919 -0.753425 0 -0.657534 -0.746811 -0.09854727 -0.6576943 -0.814609 0 -0.5800107 -0.8074901 -0.1065442 -0.5801794 -0.8797852 0 -0.4753715 -0.8721325 -0.1150859 -0.4755421 -0.940177 0 -0.3406867 -0.9320501 -0.123022 -0.3408056 -0.9839835 0 -0.1782596 -0.9755112 -0.1287599 -0.1783228 -0.8807721 -0.2369865 -0.409973 -0.7984616 -0.2149434 -0.5623687 -0.6622106 -0.1782945 -0.7277969 -0.6194742 -0.1667862 -0.7670946 -0.6179198 -0.1663595 -0.7684398 -0.6394329 -0.1721268 -0.7493317 -0.6770078 -0.1822607 -0.713051 -0.7270846 -0.1957488 -0.6580506 -0.7862226 -0.2116776 -0.5805571 -0.8492634 -0.2286513 -0.475889 -0.9077064 -0.2443989 -0.3410842 -0.9500998 -0.2558442 -0.1784775 -0.8886567 -0.3699226 -0.2710101 -0.7631573 -0.3176719 -0.5627393 -0.632775 -0.2634375 -0.728146 -0.5919203 -0.2464122 -0.7674058 -0.5903972 -0.2457724 -0.7687829 -0.6109701 -0.2543496 -0.7496812 -0.6469199 -0.2693033 -0.7134217 -0.6948236 -0.289258 -0.6584451 -0.7514141 -0.3128221 -0.5809641 -0.8117472 -0.3379686 -0.4762812 -0.8677161 -0.3612534 -0.341416 -0.908321 -0.3781975 -0.1786611 -0.788887 -0.4572059 -0.4106338 -0.7150077 -0.414453 -0.5630213 -0.5927212 -0.3435897 -0.728442 -0.5544169 -0.3213701 -0.767687 -0.5530002 -0.3205692 -0.7690426 -0.5722627 -0.3317421 -0.7499751 -0.6059841 -0.351273 -0.713716 -0.6508793 -0.3773067 -0.6587837 -0.703961 -0.4080752 -0.5813035 -0.7605677 -0.4409101 -0.4765871 -0.813077 -0.4713472 -0.3416687 -0.851185 -0.4934675 -0.1788129 -0.7227517 -0.5557516 -0.4108167 -0.6550343 -0.5037199 -0.5632019 -0.5429381 -0.4175344 -0.7286174 -0.5078109 -0.3905252 -0.767866 -0.5065346 -0.3895223 -0.7692173 -0.5241997 -0.4031296 -0.7501342 -0.5550839 -0.4268726 -0.7139061 -0.5962335 -0.4585285 -0.658982 -0.6448985 -0.4959349 -0.5815104 -0.6967877 -0.5358591 -0.4768041 -0.7449356 -0.5729006 -0.3418421 -0.7798939 -0.5997987 -0.178905 -0.6805718 -0.6805718 -0.2713742 -0.5842646 -0.5842646 -0.5632672 -0.4842736 -0.4842736 -0.7286688 -0.4529336 -0.4529336 -0.7679209 -0.4517816 -0.4517816 -0.7692769 -0.4675364 -0.4675364 -0.750213 -0.4950922 -0.4950922 -0.7139801 -0.5318027 -0.5318027 -0.659069 -0.5752266 -0.5752266 -0.5815746 -0.6215295 -0.6215295 -0.4768671 -0.6644926 -0.6644926 -0.3419056 -0.6956946 -0.6956946 -0.1789364 -0.5037199 -0.6550343 -0.5632019 -0.5557516 -0.7227517 -0.4108167 -0.4175344 -0.5429381 -0.7286174 -0.3905252 -0.5078109 -0.767866 -0.3895223 -0.5065346 -0.7692173 -0.4031296 -0.5241997 -0.7501342 -0.4268726 -0.5550839 -0.7139061 -0.4585285 -0.5962335 -0.658982 -0.4959349 -0.6448985 -0.5815104 -0.5358591 -0.6967877 -0.4768041 -0.5729006 -0.7449356 -0.3418421 -0.5997987 -0.7798939 -0.178905 -0.414453 -0.7150077 -0.5630213 -0.4572059 -0.788887 -0.4106338 -0.3435897 -0.5927212 -0.728442 -0.3213701 -0.5544169 -0.767687 -0.3205692 -0.5530002 -0.7690426 -0.3317421 -0.5722627 -0.7499751 -0.351273 -0.6059841 -0.713716 -0.3773067 -0.6508793 -0.6587837 -0.4080752 -0.703961 -0.5813035 -0.4409101 -0.7605677 -0.4765871 -0.4713472 -0.813077 -0.3416687 -0.4934675 -0.851185 -0.1788129 -0.3176719 -0.7631573 -0.5627393 -0.3699226 -0.8886567 -0.2710101 -0.2634375 -0.632775 -0.728146 -0.2464122 -0.5919203 -0.7674058 -0.2457724 -0.5903972 -0.7687829 -0.2543496 -0.6109701 -0.7496812 -0.2693316 -0.6469146 -0.7134158 -0.2892642 -0.6948078 -0.6584591 -0.3128221 -0.7514141 -0.5809641 -0.3379686 -0.8117472 -0.4762812 -0.3612534 -0.8677161 -0.341416 -0.3781975 -0.908321 -0.1786611 -0.2149471 -0.7984753 -0.5623478 -0.2369801 -0.880779 -0.409962 -0.1782945 -0.6622106 -0.7277969 -0.1667862 -0.6194742 -0.7670946 -0.1663595 -0.6179198 -0.7684398 -0.1721302 -0.6394149 -0.7493463 -0.1822607 -0.6770078 -0.713051 -0.1957488 -0.7270846 -0.6580506 -0.2116776 -0.7862226 -0.5805571 -0.2286513 -0.8492634 -0.475889 -0.2443989 -0.9077064 -0.3410842 -0.2558442 -0.9500998 -0.1784775 -0.1081908 -0.8200225 -0.5620125 -0.1192392 -0.9044111 -0.4096615 -0.08975791 -0.68025 -0.7274637 -0.08395814 -0.6364159 -0.7667632 -0.08374387 -0.6347934 -0.7681306 -0.08667504 -0.6568686 -0.7490067 -0.09177219 -0.6954483 -0.7126919 -0.09854727 -0.746811 -0.6576943 -0.1065442 -0.8074901 -0.5801794 -0.1150859 -0.8721325 -0.4755421 -0.123022 -0.9320501 -0.3408056 -0.1287599 -0.9755112 -0.1783228 -0.1192407 0.9044224 -0.4096361 0 0.8272777 -0.5617932 0 0.9627488 -0.2703973 -0.1081908 0.8200225 -0.5620125 0 0.6863475 -0.7272738 -0.08975791 0.68025 -0.7274637 0 0.6421007 -0.7666203 -0.08395981 0.6363978 -0.7667781 0 0.6404726 -0.7679811 -0.08374387 0.6347934 -0.7681306 0 0.6627162 -0.7488707 -0.08667504 0.6568686 -0.7490067 0 0.7016381 -0.7125335 -0.09177219 0.6954483 -0.7126919 0 0.753425 -0.657534 -0.09854727 0.746811 -0.6576943 0 0.814609 -0.5800107 -0.1065442 0.8074901 -0.5801794 0 0.8797852 -0.4753715 -0.1150859 0.8721325 -0.4755421 0 0.940177 -0.3406867 -0.123022 0.9320501 -0.3408056 0 0.9839835 -0.1782596 -0.1287599 0.9755112 -0.1783228 -0.2369835 0.8807611 -0.4099984 -0.2149434 0.7984616 -0.5623687 -0.1782945 0.6622106 -0.7277969 -0.1667901 0.6194888 -0.767082 -0.1663595 0.6179198 -0.7684398 -0.1721268 0.6394329 -0.7493317 -0.1822607 0.6770078 -0.713051 -0.1957488 0.7270846 -0.6580506 -0.2116776 0.7862226 -0.5805571 -0.2286513 0.8492634 -0.475889 -0.2443989 0.9077064 -0.3410842 -0.2558442 0.9500998 -0.1784775 -0.3699226 0.8886567 -0.2710101 -0.3176719 0.7631573 -0.5627393 -0.2634375 0.632775 -0.728146 -0.2464122 0.5919203 -0.7674058 -0.2457724 0.5903972 -0.7687829 -0.2543496 0.6109701 -0.7496812 -0.2693316 0.6469146 -0.7134158 -0.2892642 0.6948078 -0.6584591 -0.3128221 0.7514141 -0.5809641 -0.3379686 0.8117472 -0.4762812 -0.3612534 0.8677161 -0.341416 -0.3781975 0.908321 -0.1786611 -0.4572059 0.788887 -0.4106338 -0.414453 0.7150077 -0.5630213 -0.3435897 0.5927212 -0.728442 -0.3213701 0.5544169 -0.767687 -0.3205692 0.5530002 -0.7690426 -0.3317421 0.5722627 -0.7499751 -0.351273 0.6059841 -0.713716 -0.3773067 0.6508793 -0.6587837 -0.4080752 0.703961 -0.5813035 -0.4409101 0.7605677 -0.4765871 -0.4713472 0.813077 -0.3416687 -0.4934675 0.851185 -0.1788129 -0.5557516 0.7227517 -0.4108167 -0.5037199 0.6550343 -0.5632019 -0.4175344 0.5429381 -0.7286174 -0.3905252 0.5078109 -0.767866 -0.3895223 0.5065346 -0.7692173 -0.4031296 0.5241997 -0.7501342 -0.4268726 0.5550839 -0.7139061 -0.4585285 0.5962335 -0.658982 -0.4959349 0.6448985 -0.5815104 -0.5358591 0.6967877 -0.4768041 -0.5729006 0.7449356 -0.3418421 -0.5997987 0.7798939 -0.178905 -0.6805718 0.6805718 -0.2713742 -0.5842646 0.5842646 -0.5632672 -0.4842736 0.4842736 -0.7286688 -0.4529336 0.4529336 -0.7679209 -0.4517816 0.4517816 -0.7692769 -0.4675364 0.4675364 -0.750213 -0.4950922 0.4950922 -0.7139801 -0.5318027 0.5318027 -0.659069 -0.5752266 0.5752266 -0.5815746 -0.6215295 0.6215295 -0.4768671 -0.6644995 0.6644995 -0.3418786 -0.6956946 0.6956946 -0.1789364 -0.6550343 0.5037199 -0.5632019 -0.7227517 0.5557516 -0.4108167 -0.5429381 0.4175344 -0.7286174 -0.5078109 0.3905252 -0.767866 -0.5065346 0.3895223 -0.7692173 -0.5241997 0.4031296 -0.7501342 -0.5550839 0.4268726 -0.7139061 -0.5962335 0.4585285 -0.658982 -0.6448985 0.4959349 -0.5815104 -0.6967877 0.5358591 -0.4768041 -0.7449356 0.5729006 -0.3418421 -0.7798939 0.5997987 -0.178905 -0.7150077 0.414453 -0.5630213 -0.788887 0.4572059 -0.4106338 -0.5927212 0.3435897 -0.728442 -0.5544169 0.3213701 -0.767687 -0.5530002 0.3205692 -0.7690426 -0.5722627 0.3317421 -0.7499751 -0.6059841 0.351273 -0.713716 -0.6508793 0.3773067 -0.6587837 -0.703961 0.4080752 -0.5813035 -0.7605677 0.4409101 -0.4765871 -0.813077 0.4713472 -0.3416687 -0.851185 0.4934675 -0.1788129 -0.7631573 0.3176719 -0.5627393 -0.8886567 0.3699226 -0.2710101 -0.632775 0.2634375 -0.728146 -0.5919203 0.2464122 -0.7674058 -0.5903972 0.2457724 -0.7687829 -0.6109701 0.2543496 -0.7496812 -0.6469146 0.2693316 -0.7134158 -0.6948078 0.2892642 -0.6584591 -0.7514141 0.3128221 -0.5809641 -0.8117472 0.3379686 -0.4762812 -0.8677161 0.3612534 -0.341416 -0.908321 0.3781975 -0.1786611 -0.7984616 0.2149434 -0.5623687 -0.8807721 0.2369865 -0.409973 -0.6622106 0.1782945 -0.7277969 -0.6194888 0.1667901 -0.767082 -0.6179198 0.1663595 -0.7684398 -0.6394149 0.1721302 -0.7493463 -0.6770078 0.1822607 -0.713051 -0.7270846 0.1957488 -0.6580506 -0.7862226 0.2116776 -0.5805571 -0.8492634 0.2286513 -0.475889 -0.9077064 0.2443989 -0.3410842 -0.9500998 0.2558442 -0.1784775 -0.8200225 0.1081908 -0.5620125 -0.904428 0.1192374 -0.4096248 -0.68025 0.08975791 -0.7274637 -0.6364159 0.08395814 -0.7667632 -0.6347934 0.08374387 -0.7681306 -0.6568686 0.08667504 -0.7490067 -0.6954483 0.09177219 -0.7126919 -0.746811 0.09854727 -0.6576943 -0.8074901 0.1065442 -0.5801794 -0.8721325 0.1150859 -0.4755421 -0.9320501 0.123022 -0.3408056 -0.9755112 0.1287599 -0.1783228 0.904428 0.1192374 -0.4096248 0.8200225 0.1081908 -0.5620125 0.68025 0.08975791 -0.7274637 0.6364159 0.08395814 -0.7667632 0.6347934 0.08374387 -0.7681306 0.6568686 0.08667504 -0.7490067 0.6954483 0.09177219 -0.7126919 0.746811 0.09854727 -0.6576943 0.8074901 0.1065442 -0.5801794 0.8721325 0.1150859 -0.4755421 0.9320501 0.123022 -0.3408056 0.9755112 0.1287599 -0.1783228 0.8807721 0.2369865 -0.409973 0.7984616 0.2149434 -0.5623687 0.6622106 0.1782945 -0.7277969 0.6194742 0.1667862 -0.7670946 0.6179198 0.1663595 -0.7684398 0.6394329 0.1721268 -0.7493317 0.6770078 0.1822607 -0.713051 0.7270846 0.1957488 -0.6580506 0.7862226 0.2116776 -0.5805571 0.8492634 0.2286513 -0.475889 0.9077064 0.2443989 -0.3410842 0.9500998 0.2558442 -0.1784775 0.8886567 0.3699226 -0.2710101 0.76315 0.3176994 -0.5627338 0.632775 0.2634375 -0.728146 0.5919203 0.2464122 -0.7674058 0.5903972 0.2457724 -0.7687829 0.6109701 0.2543496 -0.7496812 0.6469146 0.2693316 -0.7134158 0.6948078 0.2892642 -0.6584591 0.7514141 0.3128221 -0.5809641 0.8117472 0.3379686 -0.4762812 0.8677161 0.3612534 -0.341416 0.908321 0.3781975 -0.1786611 0.788887 0.4572059 -0.4106338 0.7150077 0.414453 -0.5630213 0.5927212 0.3435897 -0.728442 0.5544169 0.3213701 -0.767687 0.5530002 0.3205692 -0.7690426 0.5722627 0.3317421 -0.7499751 0.6059841 0.351273 -0.713716 0.6508793 0.3773067 -0.6587837 0.703961 0.4080752 -0.5813035 0.7605677 0.4409101 -0.4765871 0.813077 0.4713472 -0.3416687 0.851185 0.4934675 -0.1788129 0.7227517 0.5557516 -0.4108167 0.6550343 0.5037199 -0.5632019 0.5429381 0.4175344 -0.7286174 0.5078109 0.3905252 -0.767866 0.5065346 0.3895223 -0.7692173 0.5241997 0.4031296 -0.7501342 0.5550839 0.4268726 -0.7139061 0.5962335 0.4585285 -0.658982 0.6448985 0.4959349 -0.5815104 0.6967877 0.5358591 -0.4768041 0.7449356 0.5729006 -0.3418421 0.7798939 0.5997987 -0.178905 0.6805718 0.6805718 -0.2713742 0.5842646 0.5842646 -0.5632672 0.4842736 0.4842736 -0.7286688 0.4529336 0.4529336 -0.7679209 0.4517816 0.4517816 -0.7692769 0.4675364 0.4675364 -0.750213 0.4950922 0.4950922 -0.7139801 0.5318027 0.5318027 -0.659069 0.5752266 0.5752266 -0.5815746 0.6215295 0.6215295 -0.4768671 0.6644926 0.6644926 -0.3419056 0.6956946 0.6956946 -0.1789364 0.5037199 0.6550343 -0.5632019 0.5557516 0.7227517 -0.4108167 0.4175344 0.5429381 -0.7286174 0.3905252 0.5078109 -0.767866 0.3895223 0.5065346 -0.7692173 0.4031296 0.5241997 -0.7501342 0.4268726 0.5550839 -0.7139061 0.4585285 0.5962335 -0.658982 0.4959349 0.6448985 -0.5815104 0.5358591 0.6967877 -0.4768041 0.5729006 0.7449356 -0.3418421 0.5997987 0.7798939 -0.178905 0.414453 0.7150077 -0.5630213 0.4572059 0.788887 -0.4106338 0.3435897 0.5927212 -0.728442 0.3213701 0.5544169 -0.767687 0.3205692 0.5530002 -0.7690426 0.3317421 0.5722627 -0.7499751 0.351273 0.6059841 -0.713716 0.3773067 0.6508793 -0.6587837 0.4080752 0.703961 -0.5813035 0.4409101 0.7605677 -0.4765871 0.4713472 0.813077 -0.3416687 0.4934675 0.851185 -0.1788129 0.3176719 0.7631573 -0.5627393 0.3699226 0.8886567 -0.2710101 0.2634375 0.632775 -0.728146 0.2464122 0.5919203 -0.7674058 0.2457724 0.5903972 -0.7687829 0.2543496 0.6109701 -0.7496812 0.2693316 0.6469146 -0.7134158 0.2892642 0.6948078 -0.6584591 0.3128221 0.7514141 -0.5809641 0.3379686 0.8117472 -0.4762812 0.3612534 0.8677161 -0.341416 0.3781975 0.908321 -0.1786611 0.2149471 0.7984753 -0.5623478 0.2369801 0.880779 -0.409962 0.1782945 0.6622106 -0.7277969 0.1667862 0.6194742 -0.7670946 0.1663595 0.6179198 -0.7684398 0.1721302 0.6394149 -0.7493463 0.1822607 0.6770078 -0.713051 0.1957488 0.7270846 -0.6580506 0.2116776 0.7862226 -0.5805571 0.2286513 0.8492634 -0.475889 0.2443989 0.9077064 -0.3410842 0.2558442 0.9500998 -0.1784775 0.1081908 0.8200225 -0.5620125 0.1192392 0.9044111 -0.4096615 0.08975791 0.68025 -0.7274637 0.08395814 0.6364159 -0.7667632 0.08374387 0.6347934 -0.7681306 0.08667504 0.6568686 -0.7490067 0.09177219 0.6954483 -0.7126919 0.09854727 0.746811 -0.6576943 0.1065442 0.8074901 -0.5801794 0.1150859 0.8721325 -0.4755421 0.123022 0.9320501 -0.3408056 0.1287599 0.9755112 -0.1783228 -0.983128 -0.1821048 0.01724302 -0.9750332 0 0.222059 -0.9998493 0 0.01736503 -0.9584072 -0.1826845 0.2192764 -0.8818863 0 0.4714624 -0.8662278 -0.1818336 0.465388 -0.7166097 0 0.6974744 -0.7037101 -0.1756986 0.68842 -0.5236445 0 0.851937 -0.5145553 -0.1652315 0.8413866 -0.353781 0 0.9353283 -0.3480098 -0.1547015 0.9246386 -0.2262657 0 0.9740657 -0.2227914 -0.1468592 0.9637408 -0.1374893 0 0.9905033 -0.1354741 -0.1420357 0.9805472 -0.07806873 0 0.996948 -0.07696837 -0.1395319 0.9872218 -0.03976571 0 0.9992091 -0.03921687 -0.1385561 0.9895778 -0.01666331 0 0.9998612 -0.01641905 -0.1384022 0.99024 -0.004669368 0 0.9999892 -0.001068115 -0.135779 0.9907386 -0.004577815 -0.1386165 0.9903357 -0.9226257 -0.3853353 0.01669394 -0.8984809 -0.3863712 0.2084451 -0.8103071 -0.3847517 0.4420051 -0.658017 -0.373032 0.6541106 -0.4823529 -0.3531355 0.8016428 -0.3275632 -0.3329956 0.8842039 -0.210462 -0.3178294 0.9244947 -0.1283328 -0.308426 0.9425519 -0.07303261 -0.3035753 0.9500044 -0.03723353 -0.3016528 0.9526906 -0.01559525 -0.301438 0.9533584 -0.001007139 -0.2943902 0.9556849 -0.004333674 -0.3018324 0.9533512 -0.8004876 -0.5991526 0.01535111 -0.7784092 -0.5999055 0.1849126 -0.6998019 -0.59738 0.3916816 -0.5684448 -0.5827887 0.5807134 -0.4190023 -0.558507 0.7158961 -0.2867639 -0.5338521 0.7954676 -0.1855856 -0.5150985 0.8367984 -0.1137442 -0.5033801 0.8565458 -0.06494545 -0.497315 0.8651359 -0.03317451 -0.4950242 0.8682457 -0.01391661 -0.4948349 0.8688756 -9.15588e-4 -0.4810807 0.8766759 -0.003875851 -0.4954448 0.8686308 -0.6028741 -0.7977383 0.0125128 -0.5858719 -0.7975207 0.1439273 -0.5247762 -0.7947788 0.3048554 -0.4264816 -0.7826154 0.4534609 -0.3164834 -0.763131 0.5634443 -0.2187315 -0.7433881 0.6320844 -0.1428296 -0.7282786 0.6702312 -0.08810937 -0.7188835 0.6895239 -0.05050969 -0.7141249 0.6981937 -0.02587997 -0.7124631 0.7012321 -0.01089543 -0.7125067 0.7015807 -7.32461e-4 -0.691199 0.7226642 -0.003051877 -0.7131658 0.7009888 -0.3308303 -0.94366 0.007568776 -0.3228274 -0.942816 0.08294993 -0.2880085 -0.9412694 0.1762477 -0.2330111 -0.9363781 0.2624922 -0.1727094 -0.9291029 0.3270156 -0.119574 -0.9220445 0.3681524 -0.07825118 -0.9168578 0.3914698 -0.0483731 -0.9138096 0.4032518 -0.02777278 -0.9124431 0.4082601 -0.01428294 -0.9121549 0.4095969 -0.006073236 -0.9123975 0.4092604 -4.57783e-4 -0.8916388 0.4527472 -0.001770079 -0.9127866 0.408433 -0.009705007 -0.9999529 3.05189e-4 -0.01388615 -0.9998944 0.004303157 -0.01211607 -0.999869 0.01074272 -0.006805717 -0.9998691 0.01467967 -0.001953184 -0.9998988 0.01409983 5.4935e-4 -0.9999383 0.01110905 0.001281797 -0.9999687 0.007812917 0.001190185 -0.9999862 0.005127191 7.93501e-4 -0.9999948 0.003143429 3.66233e-4 -0.9999983 0.001800596 3.05194e-5 -0.9999995 9.76622e-4 -3.05194e-5 -0.9982889 0.05847507 -6.10389e-5 -1 4.27272e-4 0.3137055 -0.9494789 -0.008881032 0.2966766 -0.9513124 -0.08359193 0.2614856 -0.9496858 -0.172401 0.2127184 -0.9433469 -0.2546518 0.1597045 -0.9342395 -0.3188903 0.1117613 -0.9257091 -0.3613476 0.07370322 -0.9195355 -0.386034 0.04574894 -0.915803 -0.3990138 0.02633816 -0.9139006 -0.4050828 0.01348942 -0.9131637 -0.4073697 0.005615592 -0.9130253 -0.4078644 3.35713e-4 -0.9314808 -0.3637905 0.001525938 -0.9130829 -0.4077713 0.5910953 -0.8063776 -0.0190134 0.5624448 -0.8094395 -0.168712 0.4881565 -0.8020173 -0.3441969 0.3831063 -0.7815027 -0.4924257 0.2759577 -0.7566098 -0.5927809 0.1868076 -0.7364574 -0.6501798 0.1205208 -0.7235825 -0.6796347 0.07391667 -0.7166743 -0.69348 0.04232966 -0.7136841 -0.6991876 0.02172958 -0.7128661 -0.7009636 0.00915569 -0.713079 -0.7010239 5.7987e-4 -0.7340845 -0.6790579 0.002563536 -0.7134996 -0.7006512 0.7940207 -0.6072121 -0.02871865 0.7551322 -0.6099532 -0.2402762 0.6426177 -0.5969912 -0.4802542 0.486934 -0.5680845 -0.6634571 0.3390048 -0.537836 -0.7718861 0.2242262 -0.5161141 -0.8266493 0.1428293 -0.5034734 -0.8521234 0.08710062 -0.4973036 -0.8631933 0.04980772 -0.4949644 -0.8674847 0.0255751 -0.4946252 -0.86873 0.01083427 -0.4951136 -0.8687607 7.32462e-4 -0.5096718 -0.8603686 0.003082454 -0.4956961 -0.8684906 0.9196994 -0.3908913 -0.0368368 0.8720958 -0.3925423 -0.2921636 0.7278202 -0.3793528 -0.5712875 0.5358774 -0.3540471 -0.7664765 0.3644319 -0.3303723 -0.870657 0.2378059 -0.3147449 -0.9189037 0.1504896 -0.3062285 -0.9399878 0.09158933 -0.3023273 -0.9487938 0.05237108 -0.3010424 -0.9521717 0.02694827 -0.3010395 -0.9532309 0.01144468 -0.3015294 -0.9533883 7.62975e-4 -0.3094627 -0.9509113 0.003265559 -0.30199 -0.9533056 0.981864 -0.1847938 -0.04236066 0.9281082 -0.1856765 -0.3227061 0.7636755 -0.178017 -0.6205722 0.5523444 -0.1643483 -0.8172549 0.3709036 -0.1522618 -0.9161043 0.2404605 -0.1445998 -0.9598279 0.1518 -0.1405386 -0.9783689 0.09235101 -0.1387401 -0.9860134 0.05285888 -0.1381595 -0.9889985 0.02722269 -0.1382193 -0.9900276 0.01156651 -0.1384631 -0.9903001 7.62981e-4 -0.1416093 -0.9899224 0.003296017 -0.138677 -0.9903323 0.9990136 0 -0.04440534 0.9430692 0 -0.3325966 0.772102 0 -0.6354987 0.5552072 0 -0.8317121 0.3713855 0 -0.9284789 0.2403376 0 -0.9706894 0.1516512 0 -0.9884341 0.09225815 0 -0.9957351 0.05282789 0 -0.9986037 0.02722316 0 -0.9996294 0.01156675 0 -0.9999331 7.62986e-4 0 -0.9999998 0.003296077 0 -0.9999946 0.9281082 0.1856765 -0.3227061 0.981864 0.1847938 -0.04236066 0.7636755 0.178017 -0.6205722 0.5523444 0.1643483 -0.8172549 0.3709036 0.1522618 -0.9161043 0.2404605 0.1445998 -0.9598279 0.1518 0.1405386 -0.9783689 0.09235101 0.1387401 -0.9860134 0.05285888 0.1381595 -0.9889985 0.02722269 0.1382193 -0.9900276 0.01156651 0.1384631 -0.9903001 0.003296017 0.138677 -0.9903323 0.8720958 0.3925423 -0.2921636 0.9196994 0.3908913 -0.0368368 0.7278074 0.3793461 -0.571308 0.5358774 0.3540471 -0.7664765 0.3644319 0.3303723 -0.870657 0.2378059 0.3147449 -0.9189037 0.1504896 0.3062285 -0.9399878 0.09158933 0.3023273 -0.9487938 0.05237108 0.3010424 -0.9521717 0.02694827 0.3010395 -0.9532309 0.01144468 0.3015294 -0.9533883 0.003265559 0.30199 -0.9533056 7.62981e-4 0.1416093 -0.9899224 0.7551322 0.6099532 -0.2402762 0.7940207 0.6072121 -0.02871865 0.6426177 0.5969912 -0.4802542 0.486934 0.5680845 -0.6634571 0.3390048 0.537836 -0.7718861 0.2242262 0.5161141 -0.8266493 0.1428293 0.5034734 -0.8521234 0.08710062 0.4973036 -0.8631933 0.04980772 0.4949644 -0.8674847 0.0255751 0.4946252 -0.86873 0.01083427 0.4951136 -0.8687607 0.003082454 0.4956961 -0.8684906 7.62975e-4 0.3094627 -0.9509113 0.5624448 0.8094395 -0.168712 0.5910953 0.8063776 -0.0190134 0.4881565 0.8020173 -0.3441969 0.3831063 0.7815027 -0.4924257 0.2759577 0.7566098 -0.5927809 0.1868076 0.7364574 -0.6501798 0.1205208 0.7235825 -0.6796347 0.07391667 0.7166743 -0.69348 0.04232966 0.7136841 -0.6991876 0.02172958 0.7128661 -0.7009636 0.00915569 0.713079 -0.7010239 0.002563536 0.7134996 -0.7006512 7.32462e-4 0.5096718 -0.8603686 0.2966766 0.9513124 -0.08359193 0.3137055 0.9494789 -0.008881032 0.2614856 0.9496858 -0.172401 0.2127184 0.9433469 -0.2546518 0.1597045 0.9342395 -0.3188903 0.1117613 0.9257091 -0.3613476 0.07370322 0.9195355 -0.386034 0.04574894 0.915803 -0.3990138 0.02633816 0.9139006 -0.4050828 0.01348942 0.9131637 -0.4073697 0.005615532 0.9130139 -0.4078898 0.001525938 0.9130829 -0.4077713 5.7987e-4 0.7340845 -0.6790579 -0.01388615 0.9998944 0.004303157 -0.009705007 0.9999529 3.05189e-4 -0.01211607 0.999869 0.01074272 -0.006805717 0.9998691 0.01467967 -0.001953184 0.9998988 0.01409983 5.4935e-4 0.9999383 0.01110905 0.001281797 0.9999687 0.007812917 0.001190185 0.9999862 0.005127191 7.93501e-4 0.9999948 0.003143429 3.66233e-4 0.9999983 0.001800596 3.05194e-5 0.9999995 9.76622e-4 -6.10389e-5 1 4.27272e-4 3.35713e-4 0.9314808 -0.3637905 -0.3228274 0.942816 0.08294993 -0.3308303 0.94366 0.007568776 -0.2880085 0.9412694 0.1762477 -0.2330111 0.9363781 0.2624922 -0.1727094 0.9291029 0.3270156 -0.119574 0.9220445 0.3681524 -0.07825118 0.9168578 0.3914698 -0.0483731 0.9138096 0.4032518 -0.02777278 0.9124431 0.4082601 -0.01428276 0.9121435 0.4096223 -0.006073236 0.9123975 0.4092604 -0.001770079 0.9127866 0.408433 -3.05194e-5 0.9982889 0.05847507 -0.5858719 0.7975207 0.1439273 -0.6028741 0.7977383 0.0125128 -0.5247762 0.7947788 0.3048554 -0.4264816 0.7826154 0.4534609 -0.3164834 0.763131 0.5634443 -0.2187315 0.7433881 0.6320844 -0.1428296 0.7282786 0.6702312 -0.08810937 0.7188835 0.6895239 -0.05050969 0.7141249 0.6981937 -0.02587997 0.7124631 0.7012321 -0.01089543 0.7125067 0.7015807 -0.003051877 0.7131658 0.7009888 -4.57783e-4 0.8916388 0.4527472 -0.7784234 0.5998859 0.184916 -0.8004876 0.5991526 0.01535111 -0.6998019 0.59738 0.3916816 -0.5684448 0.5827887 0.5807134 -0.4189952 0.558528 0.7158839 -0.2867639 0.5338521 0.7954676 -0.1855856 0.5150985 0.8367984 -0.1137442 0.5033801 0.8565458 -0.06494444 0.4973379 0.8651226 -0.03317451 0.4950242 0.8682457 -0.01391661 0.4948349 0.8688756 -0.003875851 0.4954448 0.8686308 -7.32461e-4 0.691199 0.7226642 -0.8984809 0.3863712 0.2084451 -0.9226148 0.3853613 0.01669377 -0.8103071 0.3847517 0.4420051 -0.658017 0.373032 0.6541106 -0.4823529 0.3531355 0.8016428 -0.3275632 0.3329956 0.8842039 -0.210462 0.3178294 0.9244947 -0.1283328 0.308426 0.9425519 -0.07303261 0.3035753 0.9500044 -0.03723353 0.3016528 0.9526906 -0.01559525 0.301438 0.9533584 -0.004333674 0.3018324 0.9533512 -9.15588e-4 0.4810807 0.8766759 -0.9584072 0.1826845 0.2192764 -0.983128 0.1821048 0.01724302 -0.8662278 0.1818336 0.465388 -0.7037101 0.1756986 0.68842 -0.5145553 0.1652315 0.8413866 -0.3480098 0.1547015 0.9246386 -0.2227914 0.1468592 0.9637408 -0.1354741 0.1420357 0.9805472 -0.07696837 0.1395319 0.9872218 -0.03921687 0.1385561 0.9895778 -0.01641905 0.1384022 0.99024 -0.004577815 0.1386165 0.9903357 -0.001007139 0.2943902 0.9556849 -0.001068115 0.135779 0.9907386 -0.4286086 -0.1335511 -0.8935652 -0.4555321 0 -0.8902195 -0.4323322 0 -0.9017144 -0.4514446 -0.1395962 -0.8813119 -0.5053694 0 -0.8629032 -0.5012847 -0.140024 -0.8538777 -0.5596626 0 -0.8287205 -0.5550928 -0.143931 -0.8192411 -0.6181976 0 -0.7860229 -0.612672 -0.1502763 -0.775919 -0.6804043 0 -0.732837 -0.6733708 -0.1579662 -0.7222316 -0.7448748 0 -0.6672043 -0.7359108 -0.1659026 -0.6564387 -0.8093389 0 -0.5873422 -0.7981988 -0.1730743 -0.5769957 -0.8704264 0 -0.4922986 -0.8571294 -0.1785979 -0.4831482 -0.9239217 0 -0.3825818 -0.9088485 -0.1819528 -0.3753501 -0.9654054 0 -0.2607538 -0.9491941 -0.1831125 -0.2559303 -0.9913234 0 -0.131446 -0.9746387 -0.1827505 -0.1291583 -0.4147003 -0.2879829 -0.8631858 -0.4356604 -0.3036042 -0.8473633 -0.4848222 -0.3045169 -0.8198885 -0.5363981 -0.3124513 -0.783997 -0.5900653 -0.325186 -0.7389703 -0.6452685 -0.3403202 -0.6839669 -0.7010571 -0.3556711 -0.6180754 -0.7559646 -0.3691622 -0.5405895 -0.8078372 -0.3793508 -0.4511009 -0.8537837 -0.3854005 -0.3500284 -0.8904084 -0.3873849 -0.2389682 -0.9142732 -0.3866212 -0.1209488 -0.3835948 -0.4679191 -0.7961826 -0.3989122 -0.4969388 -0.7706626 -0.4453132 -0.4979597 -0.7441319 -0.4913049 -0.5086705 -0.7070176 -0.5365656 -0.5255785 -0.6602005 -0.5808944 -0.545157 -0.6044549 -0.6241483 -0.5643306 -0.5403425 -0.6659616 -0.5806906 -0.4682881 -0.7056295 -0.5926787 -0.3883541 -0.7416687 -0.5996341 -0.3006105 -0.7717063 -0.6018369 -0.2055767 -0.7924643 -0.6008946 -0.1045286 -0.3228948 -0.6708765 -0.6675804 -0.3250934 -0.7129653 -0.6212849 -0.364121 -0.713715 -0.5983535 -0.3994092 -0.7235876 -0.5629328 -0.430992 -0.7387781 -0.5181244 -0.4594995 -0.7556594 -0.4667326 -0.4859017 -0.7714425 -0.4108236 -0.511045 -0.7843754 -0.3515513 -0.5354921 -0.7935025 -0.2891401 -0.5589275 -0.7986248 -0.2231559 -0.5799274 -0.800185 -0.1529321 -0.5956488 -0.7994273 -0.07822144 -0.2142463 -0.871604 -0.440914 -0.1939811 -0.911095 -0.3636994 -0.2174817 -0.9114946 -0.3491122 -0.236433 -0.9158232 -0.3246033 -0.2513266 -0.9222023 -0.293901 -0.2633832 -0.9289522 -0.2601481 -0.2739407 -0.934957 -0.2254151 -0.2841059 -0.9396646 -0.1905636 -0.2946323 -0.9428599 -0.1555868 -0.305615 -0.9445864 -0.1198167 -0.3163897 -0.9450491 -0.08234006 -0.325185 -0.9446998 -0.04239153 -0.04733538 -0.9941353 -0.09723442 -0.005066096 -0.9999777 -0.004364132 -0.003784358 -0.9999863 -0.003631711 -0.002838253 -0.9999902 -0.00338757 -0.002411007 -0.9999914 -0.00338757 -0.002441525 -0.9999913 -0.00338757 -0.002838253 -0.9999906 -0.003296017 -0.003418087 -0.9999895 -0.003051877 -0.004181087 -0.9999879 -0.00262463 -0.005035579 -0.9999853 -0.002044737 -0.005859613 -0.999982 -0.001342773 -0.006622552 -0.999978 -6.10375e-4 0.1434102 -0.9461289 0.2902996 0.192669 -0.91369 0.35784 0.2216952 -0.91315 0.342065 0.2436031 -0.9173113 0.3149566 0.2589887 -0.9239179 0.2816038 0.2696376 -0.9309898 0.2460767 0.2775133 -0.9372829 0.2109199 0.2843148 -0.9422429 0.1770406 0.2912741 -0.9456949 0.1442942 0.2988427 -0.9477392 0.1117303 0.3067771 -0.948592 0.07785397 0.3137096 -0.9486366 0.04092657 0.2933818 -0.7525748 0.5895408 0.3398311 -0.710517 0.6161822 0.3913174 -0.7093582 0.5862437 0.4333038 -0.7199349 0.5421638 0.4661172 -0.7369735 0.4894947 0.4913833 -0.7557678 0.4328482 0.5113773 -0.7730478 0.3753539 0.5284404 -0.7869992 0.3184071 0.5443146 -0.7969546 0.2618874 0.5600543 -0.8028329 0.2044468 0.5753881 -0.805171 0.1436257 0.5882274 -0.805097 0.07620644 0.3824704 -0.5222802 0.762194 0.4265007 -0.4900104 0.7602546 0.4928355 -0.4884101 0.7201173 0.5505901 -0.5001425 0.6683622 0.5993972 -0.5197726 0.6087361 0.6399669 -0.5422735 0.5444098 0.6737715 -0.5637804 0.4776858 0.7026175 -0.5817912 0.4096924 0.7281427 -0.5949846 0.3402964 0.7514442 -0.6029072 0.2680197 0.7724119 -0.6060515 0.1899518 0.7890104 -0.6058958 0.1017507 0.4282141 -0.3156595 0.8467537 0.4719547 -0.2967113 0.8301935 0.5472304 -0.2952682 0.7831703 0.6149671 -0.3040348 0.7275839 0.6745336 -0.3191079 0.6657136 0.7261075 -0.3368379 0.5994232 0.770393 -0.3542654 0.5300858 0.8084707 -0.3692762 0.4582687 0.8415164 -0.3804571 0.3835396 0.8702971 -0.3872938 0.3042805 0.8948023 -0.3899787 0.2173601 0.9133803 -0.3897919 0.1174686 0.4487558 -0.1438069 0.8820079 0.4930372 -0.1359018 0.8593283 0.5730286 -0.1352306 0.8083012 0.6458573 -0.1396885 0.7505702 0.7108865 -0.1473778 0.6876919 0.7680854 -0.1565347 0.6209202 0.817829 -0.1655983 0.5511198 0.8608263 -0.1734715 0.47842 0.8978351 -0.1793594 0.4021474 0.9294058 -0.1829635 0.3205142 0.9555359 -0.1843074 0.2301782 0.9749041 -0.1840916 0.1251896 0.4989006 0 0.8666594 0.5804181 0 0.8143188 0.6547586 0 0.7558382 0.7213501 0 0.6925706 0.7800644 0 0.6256995 0.8312842 0 0.5558477 0.8755902 0 0.4830548 0.9136177 0 0.4065745 0.9458633 0 0.3245654 0.9723486 0 0.2335345 0.9918574 0 0.1273545 0.4930372 0.1359018 0.8593283 0.4487558 0.1438069 0.8820079 0.5730286 0.1352306 0.8083012 0.6458573 0.1396885 0.7505702 0.7108865 0.1473778 0.6876919 0.7680854 0.1565347 0.6209202 0.817829 0.1655983 0.5511198 0.8608263 0.1734715 0.47842 0.8978461 0.1793617 0.4021217 0.9294058 0.1829635 0.3205142 0.9555359 0.1843074 0.2301782 0.9749041 0.1840916 0.1251896 0.4719547 0.2967113 0.8301935 0.4282141 0.3156595 0.8467537 0.5472304 0.2952682 0.7831703 0.6149671 0.3040348 0.7275839 0.6745336 0.3191079 0.6657136 0.7261075 0.3368379 0.5994232 0.770393 0.3542654 0.5300858 0.8084707 0.3692762 0.4582687 0.8415164 0.3804571 0.3835396 0.8702971 0.3872938 0.3042805 0.8948023 0.3899787 0.2173601 0.9133803 0.3897919 0.1174686 0.4265007 0.4900104 0.7602546 0.3824704 0.5222802 0.762194 0.4928355 0.4884101 0.7201173 0.5505901 0.5001425 0.6683622 0.5993972 0.5197726 0.6087361 0.6399669 0.5422735 0.5444098 0.6737715 0.5637804 0.4776858 0.7026175 0.5817912 0.4096924 0.7281352 0.5949785 0.3403233 0.7514442 0.6029072 0.2680197 0.7724119 0.6060515 0.1899518 0.789025 0.6058764 0.1017525 0.3398311 0.710517 0.6161822 0.2933818 0.7525748 0.5895408 0.3913174 0.7093582 0.5862437 0.4333038 0.7199349 0.5421638 0.4661172 0.7369735 0.4894947 0.4913833 0.7557678 0.4328482 0.5113773 0.7730478 0.3753539 0.5284404 0.7869992 0.3184071 0.5443146 0.7969546 0.2618874 0.5600543 0.8028329 0.2044468 0.5753881 0.805171 0.1436257 0.5882274 0.805097 0.07620644 0.192669 0.91369 0.35784 0.1434102 0.9461289 0.2902996 0.2216952 0.91315 0.342065 0.2436031 0.9173113 0.3149566 0.2589887 0.9239179 0.2816038 0.2696376 0.9309898 0.2460767 0.2775133 0.9372829 0.2109199 0.2843148 0.9422429 0.1770406 0.2912741 0.9456949 0.1442942 0.2988427 0.9477392 0.1117303 0.3067771 0.948592 0.07785397 0.3137096 0.9486366 0.04092657 -0.005066096 0.9999777 -0.004364132 -0.04733538 0.9941353 -0.09723442 -0.003784358 0.9999863 -0.003631711 -0.002838253 0.9999902 -0.00338757 -0.002411007 0.9999914 -0.00338757 -0.002441525 0.9999913 -0.00338757 -0.002838253 0.9999906 -0.003296017 -0.003418087 0.9999895 -0.003051877 -0.004181087 0.9999879 -0.00262463 -0.005035579 0.9999853 -0.002044737 -0.005859613 0.999982 -0.001342773 -0.006622552 0.999978 -6.10375e-4 -0.1939811 0.911095 -0.3636994 -0.2142463 0.871604 -0.440914 -0.2174817 0.9114946 -0.3491122 -0.236433 0.9158232 -0.3246033 -0.2513266 0.9222023 -0.293901 -0.2633832 0.9289522 -0.2601481 -0.2739426 0.9349634 -0.2253862 -0.2841059 0.9396646 -0.1905636 -0.2946323 0.9428599 -0.1555868 -0.305615 0.9445864 -0.1198167 -0.3163897 0.9450491 -0.08234006 -0.325185 0.9446998 -0.04239153 -0.3250934 0.7129653 -0.6212849 -0.3228882 0.6708628 -0.6675974 -0.364121 0.713715 -0.5983535 -0.3994092 0.7235876 -0.5629328 -0.430992 0.7387781 -0.5181244 -0.4594995 0.7556594 -0.4667326 -0.4859017 0.7714425 -0.4108236 -0.511045 0.7843754 -0.3515513 -0.5354921 0.7935025 -0.2891401 -0.5589275 0.7986248 -0.2231559 -0.5799274 0.800185 -0.1529321 -0.5956488 0.7994273 -0.07822144 -0.3989122 0.4969388 -0.7706626 -0.3835948 0.4679191 -0.7961826 -0.4453132 0.4979597 -0.7441319 -0.4913049 0.5086705 -0.7070176 -0.5365656 0.5255785 -0.6602005 -0.5808944 0.545157 -0.6044549 -0.6241483 0.5643306 -0.5403425 -0.6659616 0.5806906 -0.4682881 -0.7056295 0.5926787 -0.3883541 -0.7416822 0.5996145 -0.300616 -0.7717063 0.6018369 -0.2055767 -0.7924643 0.6008946 -0.1045286 -0.4356604 0.3036042 -0.8473633 -0.4147003 0.2879829 -0.8631858 -0.4848222 0.3045169 -0.8198885 -0.5363981 0.3124513 -0.783997 -0.5900653 0.325186 -0.7389703 -0.6452685 0.3403202 -0.6839669 -0.7010571 0.3556711 -0.6180754 -0.7559561 0.3691886 -0.5405834 -0.8078372 0.3793508 -0.4511009 -0.8537837 0.3854005 -0.3500284 -0.8903979 0.3874108 -0.2389653 -0.9142732 0.3866212 -0.1209488 -0.4514446 0.1395962 -0.8813119 -0.4286086 0.1335511 -0.8935652 -0.5012847 0.140024 -0.8538777 -0.5550928 0.143931 -0.8192411 -0.612672 0.1502763 -0.775919 -0.6733708 0.1579662 -0.7222316 -0.7359108 0.1659026 -0.6564387 -0.7981988 0.1730743 -0.5769957 -0.8571294 0.1785979 -0.4831482 -0.9088485 0.1819528 -0.3753501 -0.9491912 0.1831178 -0.2559376 -0.9746387 0.1827505 -0.1291583 0.4373367 -0.194833 -0.8779389 0.5957041 0 -0.803204 0.4423729 0 -0.8968312 0.5851498 -0.2223953 -0.7798334 0.7800375 0 -0.6257329 0.7630832 -0.2407085 -0.5998029 0.892644 0 -0.4507625 0.8750339 -0.2240992 -0.4290632 0.9448311 0 -0.3275581 0.9490637 -0.1693525 -0.2657024 0.930893 -0.1940403 -0.309494 0.9449178 -0.1568047 -0.2873024 0.9604048 0 -0.2786086 0.9136819 -0.15638 -0.3751412 0.9543599 0 -0.298659 0.8386588 -0.1662363 -0.5186684 0.922333 0 -0.3863959 0.7038657 -0.1816506 -0.6867139 0.8472379 0 -0.5312137 0.5193213 -0.1968513 -0.8315978 0.712473 0 -0.7016996 0.3244156 -0.2097256 -0.9223718 0.52747 0 -0.8495737 0.2319795 -0.2154989 -0.9485493 0.3315859 0 -0.9434251 0.4153612 -0.4178332 -0.8080165 0.545291 -0.4654827 -0.6971253 0.7011167 -0.4933117 -0.5148583 0.8110304 -0.460298 -0.361048 0.9061678 -0.3582616 -0.2247413 0.8781514 -0.4045892 -0.2552602 0.9089415 -0.3332348 -0.2505594 0.8807205 -0.332292 -0.3375108 0.8063129 -0.3518539 -0.475456 0.6722831 -0.3819817 -0.6341337 0.4906565 -0.41091 -0.7683809 0.3006128 -0.4344084 -0.849071 0.2121994 -0.4439005 -0.8705883 0.3612278 -0.6542448 -0.6644383 0.460085 -0.7030832 -0.5422137 0.5819387 -0.7238526 -0.3706548 0.687902 -0.6820423 -0.2482123 0.816816 -0.5560904 -0.1535421 0.7712514 -0.614291 -0.1667876 0.8323866 -0.5225535 -0.1845814 0.8101819 -0.5214438 -0.2677717 0.7381349 -0.5481536 -0.3932996 0.6079827 -0.5881449 -0.5333316 0.4353293 -0.624916 -0.6480497 0.2580432 -0.6527226 -0.7122969 0.1771009 -0.6624118 -0.7279052 0.2657027 -0.8564379 -0.4426242 0.3277806 -0.8855265 -0.3292456 0.4137529 -0.890254 -0.1904112 0.5092703 -0.8540433 -0.1060839 0.6669046 -0.7432025 -0.05374419 0.6032178 -0.7958873 -0.0518831 0.6989108 -0.7098365 -0.08749735 0.6867155 -0.7087504 -0.1615388 0.6219481 -0.7362726 -0.2666146 0.5036548 -0.7762199 -0.3792289 0.3511536 -0.810925 -0.4680726 0.198525 -0.8344457 -0.5140896 0.1300116 -0.8408335 -0.5254485 0.1380072 -0.9743518 -0.177743 0.1676088 -0.9807803 -0.09988778 0.2204695 -0.975358 -0.008362174 0.2964364 -0.954041 0.04394811 0.4475632 -0.8917694 0.06659275 0.3791369 -0.9226489 0.07052928 0.493039 -0.8691892 0.03772181 0.4957816 -0.8682358 -0.01916593 0.4491787 -0.8882251 -0.09640949 0.3579614 -0.9168927 -0.1765544 0.2420474 -0.9405087 -0.2384461 0.1282708 -0.9543556 -0.2697257 0.07751905 -0.9566283 -0.2808083 -7.01933e-4 -0.9970498 0.0767548 0.001739561 -0.9941851 0.1076708 0.02185153 -0.9881742 0.1517709 0.1064184 -0.9760158 0.1899173 0.05832141 -0.9817904 0.1807935 0.1627901 -0.9679509 0.1912341 0.2102162 -0.9612939 0.1781101 0.2327677 -0.9611932 0.1480777 0.2211433 -0.9696003 0.1047424 0.177896 -0.9823195 0.05832207 0.1169803 -0.9929136 0.02093619 0.05520969 -0.9984746 -6.71428e-4 0.02670425 -0.9995325 -0.01489329 -0.1363296 -0.9470439 0.2907267 -0.1604381 -0.9468197 0.2789126 -0.1753023 -0.9434096 0.2815091 -0.1803078 -0.9403593 0.288468 -0.1842156 -0.9411597 0.2833428 -0.1592482 -0.9416646 0.2964924 -0.1229302 -0.943889 0.306532 -0.07959467 -0.9465911 0.312458 -0.04220855 -0.9499526 0.3095296 -0.01968461 -0.9541097 0.2988097 -0.01184147 -0.9584577 0.2849889 -0.01312309 -0.9623845 0.2713745 -0.01669389 -0.9670255 0.2541318 -0.2668582 -0.8460478 0.4615084 -0.3198702 -0.8516649 0.4151508 -0.3708992 -0.8473031 0.3801465 -0.4548588 -0.8190756 0.349598 -0.4220253 -0.8351695 0.3526847 -0.4647763 -0.8087883 0.3603397 -0.4416475 -0.8069658 0.3921144 -0.3830784 -0.8134923 0.4375859 -0.2991532 -0.8234497 0.4821183 -0.2094849 -0.8324156 0.5130305 -0.1309274 -0.8400414 0.526487 -0.07065212 -0.8485279 0.5244129 -0.04889148 -0.859722 0.5084171 -0.3937925 -0.6999636 0.5958008 -0.4772969 -0.7079034 0.5206348 -0.5601152 -0.6969319 0.4478358 -0.6816555 -0.6312677 0.3699282 -0.6360934 -0.6672846 0.3874487 -0.7009339 -0.6048901 0.3778885 -0.6819587 -0.5953138 0.4248927 -0.6165789 -0.6037608 0.5052755 -0.504822 -0.6225966 0.5979368 -0.3652834 -0.6409932 0.6750525 -0.2274583 -0.65503 0.7205544 -0.1128 -0.6686515 0.7349704 -0.06766164 -0.6844906 0.725875 -0.5116783 -0.5038655 0.6959203 -0.6221944 -0.508663 0.5950934 -0.7284023 -0.4878498 0.4810745 -0.836934 -0.4122868 0.359946 -0.7998884 -0.4491876 0.3980062 -0.8487123 -0.3829261 0.3647671 -0.8268864 -0.3716625 0.4220496 -0.7603846 -0.3789868 0.527432 -0.6387787 -0.3981303 0.6583724 -0.4716412 -0.4182024 0.7763127 -0.2934439 -0.4333753 0.8521013 -0.1381308 -0.4469872 0.8838113 -0.07379484 -0.4616605 0.883982 -0.6005219 -0.2601437 0.7561076 -0.7270936 -0.2602692 0.6352913 -0.8922971 -0.2231887 0.392419 -0.8355948 -0.2487953 0.4897778 -0.9196782 -0.1969431 0.3397139 -0.9217026 -0.1789325 0.3441621 -0.896507 -0.1719767 0.4082884 -0.830801 -0.1757921 0.5280784 -0.7075212 -0.186715 0.68158 -0.5284635 -0.1986774 0.8253809 -0.3284824 -0.2077164 0.9213867 -0.1492989 -0.2155556 0.9650107 -0.07177978 -0.2236709 0.972018 -0.6331514 0 0.7740281 -0.7637752 0 0.6454825 -0.922956 0 0.3849058 -0.8703519 0 0.4924303 -0.9441938 0 0.3293905 -0.9424222 0 0.3344256 -0.9159633 0 0.4012623 -0.8506351 0 0.5257567 -0.7272442 0 0.6863788 -0.5449787 0 0.8384499 -0.3384255 0 0.9409933 -0.1517407 0 0.9884204 -0.06930798 0 0.9975954 -0.7270936 0.2602692 0.6352913 -0.6005219 0.2601437 0.7561076 -0.8355948 0.2487953 0.4897778 -0.8922971 0.2231887 0.392419 -0.9196782 0.1969431 0.3397139 -0.9217026 0.1789325 0.3441621 -0.896507 0.1719767 0.4082884 -0.830801 0.1757921 0.5280784 -0.7075212 0.186715 0.68158 -0.5284635 0.1986774 0.8253809 -0.3284824 0.2077164 0.9213867 -0.1492989 0.2155556 0.9650107 -0.6221944 0.508663 0.5950934 -0.5116862 0.5038427 0.695931 -0.7284023 0.4878498 0.4810745 -0.7998884 0.4491876 0.3980062 -0.836934 0.4122868 0.359946 -0.8487123 0.3829261 0.3647671 -0.8268864 0.3716625 0.4220496 -0.7603846 0.3789868 0.527432 -0.6387787 0.3981303 0.6583724 -0.4716412 0.4182024 0.7763127 -0.2934439 0.4333753 0.8521013 -0.1381308 0.4469872 0.8838113 -0.07177978 0.2236709 0.972018 -0.4772969 0.7079034 0.5206348 -0.3937925 0.6999636 0.5958008 -0.5601152 0.6969319 0.4478358 -0.6360934 0.6672846 0.3874487 -0.6816555 0.6312677 0.3699282 -0.7009339 0.6048901 0.3778885 -0.6819587 0.5953138 0.4248927 -0.6165789 0.6037608 0.5052755 -0.504822 0.6225966 0.5979368 -0.3652834 0.6409932 0.6750525 -0.2274583 0.65503 0.7205544 -0.1128 0.6686515 0.7349704 -0.07379484 0.4616605 0.883982 -0.3198702 0.8516649 0.4151508 -0.2668582 0.8460478 0.4615084 -0.3708992 0.8473031 0.3801465 -0.4220253 0.8351695 0.3526847 -0.4548588 0.8190756 0.349598 -0.4647763 0.8087883 0.3603397 -0.4416475 0.8069658 0.3921144 -0.3830784 0.8134923 0.4375859 -0.2991532 0.8234497 0.4821183 -0.2094849 0.8324156 0.5130305 -0.1309274 0.8400414 0.526487 -0.07065212 0.8485279 0.5244129 -0.06766164 0.6844906 0.725875 -0.1604381 0.9468197 0.2789126 -0.1363296 0.9470439 0.2907267 -0.1753023 0.9434096 0.2815091 -0.1842156 0.9411597 0.2833428 -0.1803078 0.9403593 0.288468 -0.1592482 0.9416646 0.2964924 -0.1229302 0.943889 0.306532 -0.07959467 0.9465911 0.312458 -0.04220855 0.9499526 0.3095296 -0.01968461 0.9541097 0.2988097 -0.01184147 0.9584577 0.2849889 -0.01312309 0.9623845 0.2713745 -0.04889148 0.859722 0.5084171 0.001739561 0.9941851 0.1076708 -7.01933e-4 0.9970498 0.0767548 0.02185153 0.9881742 0.1517709 0.05832141 0.9817904 0.1807935 0.1064184 0.9760158 0.1899173 0.1627901 0.9679509 0.1912341 0.2102162 0.9612939 0.1781101 0.2327677 0.9611932 0.1480777 0.2211433 0.9696003 0.1047424 0.177896 0.9823195 0.05832207 0.1169803 0.9929136 0.02093619 0.05520969 0.9984746 -6.71428e-4 -0.01669389 0.9670255 0.2541318 0.1676088 0.9807803 -0.09988778 0.1380072 0.9743518 -0.177743 0.2204695 0.975358 -0.008362174 0.2964364 0.954041 0.04394811 0.3791369 0.9226489 0.07052928 0.4475632 0.8917694 0.06659275 0.493039 0.8691892 0.03772181 0.4957816 0.8682358 -0.01916593 0.4491787 0.8882251 -0.09640949 0.3579614 0.9168927 -0.1765544 0.2420474 0.9405087 -0.2384461 0.1282708 0.9543556 -0.2697257 0.02670425 0.9995325 -0.01489329 0.3277806 0.8855265 -0.3292456 0.2657027 0.8564379 -0.4426242 0.4137529 0.890254 -0.1904112 0.5092703 0.8540433 -0.1060839 0.6032178 0.7958873 -0.0518831 0.6669046 0.7432025 -0.05374419 0.6989108 0.7098365 -0.08749735 0.6867155 0.7087504 -0.1615388 0.6219481 0.7362726 -0.2666146 0.5036548 0.7762199 -0.3792289 0.3511536 0.810925 -0.4680726 0.198525 0.8344457 -0.5140896 0.07751905 0.9566283 -0.2808083 0.4601091 0.7030733 -0.5422061 0.3612278 0.6542448 -0.6644383 0.5819387 0.7238526 -0.3706548 0.687902 0.6820423 -0.2482123 0.7712514 0.614291 -0.1667876 0.816816 0.5560904 -0.1535421 0.8323866 0.5225535 -0.1845814 0.8101948 0.5214216 -0.267776 0.7381349 0.5481536 -0.3932996 0.6079827 0.5881449 -0.5333316 0.4353293 0.624916 -0.6480497 0.2580432 0.6527226 -0.7122969 0.1300116 0.8408335 -0.5254485 0.545291 0.4654827 -0.6971253 0.4153612 0.4178332 -0.8080165 0.7011167 0.4933117 -0.5148583 0.8110304 0.460298 -0.361048 0.8781514 0.4045892 -0.2552602 0.9061678 0.3582616 -0.2247413 0.9089415 0.3332348 -0.2505594 0.8807205 0.332292 -0.3375108 0.8063129 0.3518539 -0.475456 0.6722831 0.3819817 -0.6341337 0.4906565 0.41091 -0.7683809 0.3006128 0.4344084 -0.849071 0.1771009 0.6624118 -0.7279052 0.5851498 0.2223953 -0.7798334 0.4373367 0.194833 -0.8779389 0.7630832 0.2407085 -0.5998029 0.8750339 0.2240992 -0.4290632 0.930893 0.1940403 -0.309494 0.9490637 0.1693525 -0.2657024 0.9449178 0.1568047 -0.2873024 0.9136819 0.15638 -0.3751412 0.8386588 0.1662363 -0.5186684 0.7038657 0.1816506 -0.6867139 0.5193213 0.1968513 -0.8315978 0.3244156 0.2097256 -0.9223718 0.2121994 0.4439005 -0.8705883 0.2319795 0.2154989 -0.9485493 -0.3730072 0.1892809 0.9083163 -0.398004 0 0.9173838 -0.3897894 0.2188826 0.8945136 -0.3391538 0.1725219 0.9247761 -0.3802663 0 0.9248771 -0.2970453 0.1478054 0.9433546 -0.3466981 0 0.9379769 -0.236643 0.1108749 0.9652497 -0.3044014 0 0.9525439 -0.1254643 0.04495471 0.9910792 -0.2429305 0 0.9700437 0.2096974 -0.12638 0.9695644 -0.1265022 0 0.9919664 0.866021 -0.3994085 0.3008001 0.2605109 0 0.965471 0.7563624 0 -0.6541529 0.9712225 0 0.2381743 0.736698 -0.3939087 -0.5496471 0.5541649 0 -0.832407 0.5511513 -0.2820305 -0.7852969 0.4709446 0 -0.8821628 0.4680804 -0.2291722 -0.8534524 0.4221736 0 -0.9065151 0.4190318 -0.1973997 -0.8862538 -0.3469423 0.3963529 0.8500209 -0.3572843 0.4591258 0.8133582 -0.3139544 0.3588181 0.8790234 -0.2739693 0.3052818 0.912 -0.2180327 0.2274328 0.9490712 -0.1214364 0.09760081 0.987789 0.1119758 -0.1783861 0.9775683 0.5989975 -0.6381534 0.4836965 0.6288778 -0.7323988 -0.2609693 0.5176343 -0.5931691 -0.6166077 0.4463175 -0.4920968 -0.7474232 0.4006608 -0.4257478 -0.8113014 -0.2958794 0.604943 0.739256 -0.2918571 0.6895861 0.66279 -0.2676864 0.545017 0.7945443 -0.233868 0.4606556 0.8562139 -0.1867765 0.3400432 0.9216753 -0.1101449 0.1532691 0.9820269 0.04349029 -0.1670637 0.9849866 0.324173 -0.6515812 0.6858235 0.4391689 -0.892865 0.09961414 0.4202188 -0.8510888 -0.3147444 0.3832942 -0.7538924 -0.5336027 0.3516388 -0.669066 -0.6547526 -0.2184239 0.7874494 0.5763805 -0.1956574 0.8686627 0.4551301 -0.2003276 0.7121337 0.6728555 -0.1778371 0.6015394 0.7787967 -0.1450867 0.440784 0.8858101 -0.09235191 0.2055792 0.9742733 0.001831114 -0.1357789 0.9907375 0.1453946 -0.5709577 0.8080023 0.2420473 -0.8788291 0.4111844 0.2713145 -0.9618695 0.03457808 0.2708003 -0.9342962 -0.2318573 0.2608217 -0.8738105 -0.4103989 -0.1189014 0.9188003 0.3763889 -0.08066266 0.9716143 0.2223945 -0.1141729 0.8449282 0.5225523 -0.107519 0.7206496 0.6849116 -0.09457826 0.5273982 0.8443377 -0.06927859 0.252516 0.9651094 -0.02117997 -0.1003456 0.9947273 0.04318457 -0.4858039 0.8730004 0.09235113 -0.7831539 0.6149319 0.1202447 -0.9371156 0.3276517 0.1327869 -0.9880437 0.07834154 0.1364509 -0.9833258 -0.1202148 -0.004455804 0.9867513 0.1621797 0.04117047 0.9991407 -0.004791498 -0.01165807 0.9348775 0.3547792 -0.02243155 0.8153805 0.5784907 -0.03408944 0.6010372 0.7984938 -0.04040688 0.2943539 0.954842 -0.03271627 -0.0657683 0.9972985 -0.01968479 -0.4126188 0.9106911 -0.01010179 -0.6778004 0.7351765 -0.003235042 -0.8477641 0.5303638 7.62968e-4 -0.9434249 0.3315858 0.002166807 -0.9882584 0.1527768 0.1195724 0.991676 -0.04776179 0.1647409 0.9635422 -0.2108244 0.1071528 0.978353 0.1770417 0.08179146 0.8842942 0.4597109 0.04123103 0.6628095 0.7476521 -0.00387597 0.3307096 0.9437248 -0.03671431 -0.03350979 0.9987639 -0.06354093 -0.3491092 0.9349253 -0.08493548 -0.5809063 0.8095271 -0.1008349 -0.7410637 0.66382 -0.1135615 -0.8489802 0.5160779 -0.1248218 -0.9190123 0.3739467 0.2521165 0.9359835 -0.2457075 0.2901766 0.8727883 -0.392477 0.2460784 0.9692067 -0.009155809 0.2150709 0.9211701 0.3243307 0.1415185 0.7100343 0.6897999 0.04825133 0.3586653 0.9322184 -0.03293007 -0.006042778 0.9994395 -0.09845554 -0.2903615 0.9518387 -0.146678 -0.4886218 0.8600781 -0.1835439 -0.6284257 0.7559053 -0.2141502 -0.7298259 0.6492257 -0.2414646 -0.804109 0.5432344 0.3927485 0.8131777 -0.4295238 0.4163122 0.7245256 -0.5493149 0.409565 0.8889577 -0.2049657 0.3930577 0.9046523 0.1646515 0.2848348 0.7287657 0.6227118 0.1221674 0.3669297 0.9221919 -0.02392721 0.01275706 0.9996324 -0.1296163 -0.230819 0.9643248 -0.2030458 -0.3911065 0.8976681 -0.2591679 -0.5037172 0.8240758 -0.3065636 -0.5877353 0.7487231 -0.3496556 -0.6524646 0.6723325 0.5311273 0.6077308 -0.5903958 0.5308572 0.5142545 -0.6735971 0.5887721 0.7017533 -0.4011109 0.6253433 0.7800158 -0.02282851 0.4959105 0.6745103 0.5469084 0.2229723 0.3265541 0.918502 -0.01199376 0.01846373 0.9997577 -0.1587015 -0.1642255 0.9735727 -0.254957 -0.2775717 0.9262564 -0.3276581 -0.3561023 0.875118 -0.3891749 -0.4150548 0.8223578 -0.445395 -0.4612649 0.7673709 0.6361988 0.3204799 -0.7018146 0.6084937 0.2593529 -0.7499811 0.7369501 0.3855506 -0.5552076 0.8602662 0.4671525 -0.2042323 0.7593527 0.4462239 0.4735692 0.3281152 0.2001774 0.9231845 -0.003296017 0.01141411 0.9999294 -0.1825951 -0.08569735 0.9794462 -0.2950295 -0.1432268 0.9446925 -0.3788643 -0.1825348 0.9072723 -0.4494873 -0.2119255 0.8677839 -0.5140067 -0.2349989 0.8249682 0.6745588 0 -0.7382212 0.634276 0 -0.7731068 0.7922472 0 -0.6102003 0.9594792 0 -0.2817797 0.9000971 0 0.4356893 0.3784047 0 0.9256403 5.4935e-4 0 0.9999999 -0.1916595 0 0.9814616 -0.310041 0 0.9507233 -0.3977282 0 0.9175034 -0.4713421 0 0.8819505 -0.5384249 0 0.8426735 0.6084937 -0.2593529 -0.7499811 0.6361988 -0.3204799 -0.7018146 0.7369377 -0.3855441 -0.5552287 0.8602715 -0.4671554 -0.2042031 0.7593417 -0.4462174 0.4735929 -0.003296017 -0.01141411 0.9999294 0.3281152 -0.2001774 0.9231845 -0.1825951 0.08569735 0.9794462 -0.2950295 0.1432268 0.9446925 -0.3788643 0.1825348 0.9072723 -0.4494873 0.2119255 0.8677839 -0.5140067 0.2349989 0.8249682 0.5308572 -0.5142545 -0.6735971 0.5311273 -0.6077308 -0.5903958 0.5887846 -0.7017378 -0.4011195 0.6253433 -0.7800158 -0.02282851 0.4959105 -0.6745103 0.5469084 -0.01196324 -0.01849424 0.9997574 0.2229723 -0.3265541 0.918502 -0.1587015 0.1642255 0.9735727 -0.254957 0.2775717 0.9262564 -0.3276581 0.3561023 0.875118 -0.3891749 0.4150548 0.8223578 -0.445395 0.4612649 0.7673709 0.4163122 -0.7245256 -0.5493149 0.3927485 -0.8131777 -0.4295238 0.409565 -0.8889577 -0.2049657 0.3930577 -0.9046523 0.1646515 0.2848348 -0.7287657 0.6227118 -0.02392721 -0.01275706 0.9996324 0.1221674 -0.3669297 0.9221919 -0.1296163 0.230819 0.9643248 -0.2030458 0.3911065 0.8976681 -0.2591679 0.5037172 0.8240758 -0.3065636 0.5877353 0.7487231 -0.3496556 0.6524646 0.6723325 0.2901766 -0.8727883 -0.392477 0.2521165 -0.9359835 -0.2457075 0.2460784 -0.9692067 -0.009155809 0.2150709 -0.9211701 0.3243307 0.1415185 -0.7100343 0.6897999 -0.03293007 0.006042778 0.9994395 0.04825133 -0.3586653 0.9322184 -0.09845554 0.2903615 0.9518387 -0.146678 0.4886218 0.8600781 -0.1835439 0.6284257 0.7559053 -0.2141502 0.7298259 0.6492257 -0.2414646 0.804109 0.5432344 0.1647399 -0.963536 -0.2108536 0.1195724 -0.991676 -0.04776179 0.1071528 -0.978353 0.1770417 0.08179146 -0.8842942 0.4597109 0.04123103 -0.6628095 0.7476521 -0.03671431 0.03350979 0.9987639 -0.00387597 -0.3307096 0.9437248 -0.06354093 0.3491092 0.9349253 -0.08493548 0.5809063 0.8095271 -0.1008349 0.7410637 0.66382 -0.1135615 0.8489802 0.5160779 -0.1248218 0.9190123 0.3739467 0.04117047 -0.9991407 -0.004791498 -0.004455804 -0.9867513 0.1621797 -0.01165819 -0.9348876 0.3547525 -0.02243155 -0.8153805 0.5784907 -0.03408944 -0.6010372 0.7984938 -0.04040688 -0.2943539 0.954842 -0.01968479 0.4126188 0.9106911 -0.03271627 0.0657683 0.9972985 -0.01010179 0.6778004 0.7351765 -0.003235042 0.8477641 0.5303638 7.62968e-4 0.9434249 0.3315858 0.002166807 0.9882584 0.1527768 -0.08066266 -0.9716143 0.2223945 -0.1189014 -0.9188003 0.3763889 -0.1141729 -0.8449282 0.5225523 -0.107519 -0.7206496 0.6849116 -0.09457826 -0.5273982 0.8443377 -0.06924825 -0.2525166 0.9651114 0.04318392 0.4858272 0.8729875 -0.02117997 0.1003456 0.9947273 0.09235113 0.7831539 0.6149319 0.1202447 0.9371156 0.3276517 0.1327869 0.9880437 0.07834154 0.1364509 0.9833258 -0.1202148 -0.1956574 -0.8686627 0.4551301 -0.2184239 -0.7874494 0.5763805 -0.2003276 -0.7121337 0.6728555 -0.1778371 -0.6015394 0.7787967 -0.1450886 -0.4407593 0.8858219 -0.09235191 -0.2055792 0.9742733 0.1453946 0.5709577 0.8080023 0.001831114 0.1357789 0.9907375 0.2420473 0.8788291 0.4111844 0.2713145 0.9618695 0.03457808 0.2708003 0.9342962 -0.2318573 0.2608184 0.8737996 -0.4104242 -0.2918571 -0.6895861 0.66279 -0.2958794 -0.604943 0.739256 -0.2676799 -0.5450038 0.7945556 -0.233868 -0.4606556 0.8562139 -0.1867765 -0.3400432 0.9216753 -0.1101449 -0.1532691 0.9820269 0.324173 0.6515812 0.6858235 0.04349029 0.1670637 0.9849866 0.4391443 0.8928769 0.09961545 0.4202188 0.8510888 -0.3147444 0.3832942 0.7538924 -0.5336027 0.3516388 0.669066 -0.6547526 -0.3572843 -0.4591258 0.8133582 -0.3469423 -0.3963529 0.8500209 -0.3139544 -0.3588181 0.8790234 -0.2739693 -0.3052818 0.912 -0.2180327 -0.2274328 0.9490712 -0.1214364 -0.09760081 0.987789 0.5989975 0.6381534 0.4836965 0.1120054 0.1784151 0.9775597 0.6288828 0.7324046 -0.2609409 0.5176343 0.5931691 -0.6166077 0.4463175 0.4920968 -0.7474232 0.4006608 0.4257478 -0.8113014 -0.3897894 -0.2188826 0.8945136 -0.3730072 -0.1892809 0.9083163 -0.3391538 -0.1725219 0.9247761 -0.2970453 -0.1478054 0.9433546 -0.236643 -0.1108749 0.9652497 -0.1254643 -0.04495471 0.9910792 0.2096974 0.12638 0.9695644 0.736698 0.3939087 -0.5496471 0.866021 0.3994085 0.3008001 0.5511726 0.2820258 -0.7852836 0.4680804 0.2291722 -0.8534524 0.4190318 0.1973997 -0.8862538 0.1245188 -0.9449393 0.3026296 0 -0.6460941 0.7632578 0.08447599 -0.6403453 0.7634276 0 -0.9642238 -0.2650898 0 -0.9531385 0.3025347 0.1257992 -0.9559151 -0.2653319 0 -0.8332363 -0.5529171 0.1084973 -0.8259534 -0.5531993 0 -0.7569555 -0.6534666 0.09842389 -0.7503105 -0.6537178 0 -0.7443267 -0.6678157 0.09671652 -0.7378107 -0.6680429 0 -0.7960717 -0.6052025 0.1033993 -0.7891678 -0.6054112 0 -0.9252043 -0.3794693 0.1201862 -0.9172971 -0.3796333 0 -0.9826511 0.185464 0.08414202 -0.6428002 0.7613987 0.1277208 -0.9743101 0.1854928 0.0360434 -0.2755905 0.9605992 0 -0.6483728 0.761323 0.0124213 -0.09515893 0.9953846 0 -0.2780247 0.960574 3.05194e-5 -2.44156e-4 1 0 -0.096013 0.9953801 0.2475135 -0.920378 0.3027234 0.1678264 -0.62339 0.7636879 0.250077 -0.9310289 -0.2657946 0.215739 -0.8042375 -0.5537678 0.1957468 -0.7305257 -0.6542289 0.1923615 -0.7183575 -0.6685503 0.2056981 -0.7684686 -0.6059244 0.2391805 -0.8935165 -0.3800275 0.1674292 -0.6259214 0.761702 0.2541379 -0.9491946 0.1855905 0.07168954 -0.2682331 0.9606829 0.02472001 -0.09262388 0.9953944 0.3660513 -0.8799697 0.3027538 0.2479994 -0.5957053 0.7639579 0.3699179 -0.8900796 -0.2663066 0.3191106 -0.7686304 -0.5544149 0.2895976 -0.6980984 -0.6548221 0.2846236 -0.6865026 -0.6691067 0.3044593 -0.7344747 -0.6065077 0.3541135 -0.8542915 -0.3805125 0.2478483 -0.5981808 0.7620702 0.3763074 -0.9076852 0.1857426 0.1060855 -0.2562106 0.9607821 0.03662276 -0.08844405 0.9954078 0.4778034 -0.8246503 0.3027471 0.3234724 -0.5580426 0.7641689 0.4829407 -0.8340372 -0.2667405 0.416648 -0.7200394 -0.5549305 0.3781582 -0.6538954 -0.6552993 0.3717254 -0.6430117 -0.6695941 0.3976904 -0.6880463 -0.6069884 0.4626981 -0.8005126 -0.3809072 0.3237817 -0.5603082 0.762378 0.4917574 -0.8506643 0.1858625 0.1385578 -0.2398515 0.960871 0.04782372 -0.08279889 0.9954182 0.580913 -0.7555776 0.3027254 0.3931166 -0.5111951 0.76429 0.5872531 -0.7640821 -0.2670441 0.506687 -0.6594989 -0.5552743 0.4599619 -0.5988264 -0.6556235 0.4522321 -0.5888357 -0.6698945 0.483877 -0.6301235 -0.6072953 0.563073 -0.7332463 -0.3811806 0.3939451 -0.5130931 0.7625896 0.5984558 -0.7792835 0.1859244 0.1685577 -0.2195553 0.9609286 0.05816853 -0.07577776 0.9954267 0.6739349 -0.6739349 0.3026939 0.4559608 -0.4559608 0.7643295 0.6814094 -0.6814094 -0.2671374 0.5880206 -0.5880206 -0.5553951 0.5338648 -0.5338648 -0.6557263 0.5249336 -0.5249336 -0.6699923 0.5617086 -0.5617086 -0.6074265 0.6536925 -0.6536925 -0.3812773 0.4573537 -0.4573537 0.7626632 0.6947737 -0.6947737 0.1859546 0.1956863 -0.1956863 0.9609442 0.06753784 -0.06753784 0.9954282 0.5111951 -0.3931166 0.76429 0.7640821 -0.5872531 -0.2670441 0.7555907 -0.5808996 0.3027185 0.6594887 -0.5067097 -0.5552657 0.5988264 -0.4599619 -0.6556235 0.5888357 -0.4522321 -0.6698945 0.6301051 -0.4838863 -0.607307 0.7332463 -0.563073 -0.3811806 0.7792835 -0.5984558 0.1859244 0.5130931 -0.3939451 0.7625896 0.2195553 -0.1685577 0.9609286 0.07577776 -0.05816853 0.9954267 0.5580426 -0.3234724 0.7641689 0.8340372 -0.4829407 -0.2667405 0.8246503 -0.4778034 0.3027471 0.7200394 -0.416648 -0.5549305 0.6538954 -0.3781582 -0.6552993 0.6430117 -0.3717254 -0.6695941 0.6880463 -0.3976904 -0.6069884 0.8005126 -0.4626981 -0.3809072 0.8506643 -0.4917574 0.1858625 0.5603082 -0.3237817 0.762378 0.2398515 -0.1385578 0.960871 0.08279889 -0.04782372 0.9954182 0.5957053 -0.2479994 0.7639579 0.8900796 -0.3699179 -0.2663066 0.8799697 -0.3660513 0.3027538 0.7686304 -0.3191106 -0.5544149 0.6980984 -0.2895976 -0.6548221 0.6865026 -0.2846236 -0.6691067 0.7344815 -0.3044317 -0.6065134 0.8542915 -0.3541135 -0.3805125 0.9076852 -0.3763074 0.1857426 0.5981808 -0.2478483 0.7620702 0.2562106 -0.1060855 0.9607821 0.08844405 -0.03662276 0.9954078 0.62339 -0.1678264 0.7636879 0.9310289 -0.250077 -0.2657946 0.920378 -0.2475135 0.3027234 0.8042375 -0.215739 -0.5537678 0.7305257 -0.1957468 -0.6542289 0.7183617 -0.1923322 -0.6685543 0.7684686 -0.2056981 -0.6059244 0.8935165 -0.2391805 -0.3800275 0.9491946 -0.2541379 0.1855905 0.6259214 -0.1674292 0.761702 0.2682331 -0.07168954 0.9606829 0.09262382 -0.02475053 0.9953935 0.6403453 -0.08447599 0.7634276 0.9559151 -0.1257992 -0.2653319 0.9449393 -0.1245188 0.3026296 0.8259534 -0.1084973 -0.5531993 0.7503105 -0.09842389 -0.6537178 0.7378107 -0.09671652 -0.6680429 0.7891678 -0.1033993 -0.6054112 0.9172971 -0.1201862 -0.3796333 0.9743101 -0.1277208 0.1854928 0.6428002 -0.08414202 0.7613987 0.2755905 -0.0360434 0.9605992 0.09515881 -0.01251286 0.9953835 0.6460941 0 0.7632578 0.9642238 0 -0.2650898 0.9531385 0 0.3025347 0.8332363 0 -0.5529171 0.7569555 0 -0.6534666 0.7443267 0 -0.6678157 0.7960717 0 -0.6052025 0.9252043 0 -0.3794693 0.9826511 0 0.185464 0.6483728 0 0.761323 0.2780247 0 0.960574 0.096013 0 0.9953801 3.96752e-4 -0.002441525 0.999997 -0.9449393 -0.1245188 0.3026296 -0.6460941 0 0.7632578 -0.6403453 -0.08447599 0.7634276 -0.9642238 0 -0.2650898 -0.9531385 0 0.3025347 -0.9559151 -0.1257992 -0.2653319 -0.8332363 0 -0.5529171 -0.8259534 -0.1084973 -0.5531993 -0.7569555 0 -0.6534666 -0.7503105 -0.09842389 -0.6537178 -0.7443267 0 -0.6678157 -0.7378107 -0.09671652 -0.6680429 -0.7960717 0 -0.6052025 -0.7891678 -0.1033993 -0.6054112 -0.9252043 0 -0.3794693 -0.9172971 -0.1201862 -0.3796333 -0.9826511 0 0.185464 -0.6428002 -0.08414202 0.7613987 -0.9743101 -0.1277208 0.1854928 -0.2755905 -0.0360434 0.9605992 -0.6483728 0 0.761323 -0.09515893 -0.0124213 0.9953846 -0.2780247 0 0.960574 -0.096013 0 0.9953801 -0.920378 -0.2475135 0.3027234 -0.62339 -0.1678264 0.7636879 -0.9310289 -0.250077 -0.2657946 -0.8042375 -0.215739 -0.5537678 -0.7305257 -0.1957468 -0.6542289 -0.7183575 -0.1923615 -0.6685503 -0.7684686 -0.2056981 -0.6059244 -0.8935165 -0.2391805 -0.3800275 -0.6259214 -0.1674292 0.761702 -0.9491946 -0.2541379 0.1855905 -0.2682331 -0.07168954 0.9606829 -0.09262382 -0.02475053 0.9953935 -0.8799697 -0.3660513 0.3027538 -0.5957053 -0.2479994 0.7639579 -0.8900796 -0.3699179 -0.2663066 -0.7686304 -0.3191106 -0.5544149 -0.6980984 -0.2895976 -0.6548221 -0.6865026 -0.2846236 -0.6691067 -0.7344747 -0.3044593 -0.6065077 -0.8542915 -0.3541135 -0.3805125 -0.5981808 -0.2478483 0.7620702 -0.9076852 -0.3763074 0.1857426 -0.2562106 -0.1060855 0.9607821 -0.08844405 -0.03662276 0.9954078 -0.8246503 -0.4778034 0.3027471 -0.5580426 -0.3234724 0.7641689 -0.8340372 -0.4829407 -0.2667405 -0.7200394 -0.416648 -0.5549305 -0.6538954 -0.3781582 -0.6552993 -0.6430249 -0.371733 -0.6695773 -0.6880463 -0.3976904 -0.6069884 -0.8005126 -0.4626981 -0.3809072 -0.5603082 -0.3237817 0.762378 -0.8506643 -0.4917574 0.1858625 -0.2398515 -0.1385578 0.960871 -0.08279889 -0.04782372 0.9954182 -0.7555776 -0.580913 0.3027254 -0.5111951 -0.3931166 0.76429 -0.7640821 -0.5872531 -0.2670441 -0.6594989 -0.506687 -0.5552743 -0.5988264 -0.4599619 -0.6556235 -0.5888357 -0.4522321 -0.6698945 -0.6301051 -0.4838863 -0.607307 -0.7332463 -0.563073 -0.3811806 -0.5130931 -0.3939451 0.7625896 -0.7792835 -0.5984558 0.1859244 -0.2195553 -0.1685577 0.9609286 -0.07577776 -0.05816853 0.9954267 -0.6739349 -0.6739349 0.3026939 -0.4559608 -0.4559608 0.7643295 -0.6814094 -0.6814094 -0.2671374 -0.5880206 -0.5880206 -0.5553951 -0.5338648 -0.5338648 -0.6557263 -0.5249336 -0.5249336 -0.6699923 -0.5617086 -0.5617086 -0.6074265 -0.6536925 -0.6536925 -0.3812773 -0.4573537 -0.4573537 0.7626632 -0.6947737 -0.6947737 0.1859546 -0.1956863 -0.1956863 0.9609442 -0.06753784 -0.06753784 0.9954282 -0.3931166 -0.5111951 0.76429 -0.5872531 -0.7640821 -0.2670441 -0.580913 -0.7555776 0.3027254 -0.5067097 -0.6594887 -0.5552657 -0.4599619 -0.5988264 -0.6556235 -0.4522321 -0.5888357 -0.6698945 -0.4838863 -0.6301051 -0.607307 -0.563073 -0.7332463 -0.3811806 -0.5984558 -0.7792835 0.1859244 -0.3939451 -0.5130931 0.7625896 -0.1685577 -0.2195553 0.9609286 -0.05816853 -0.07577776 0.9954267 -0.3234724 -0.5580426 0.7641689 -0.4829407 -0.8340372 -0.2667405 -0.4778034 -0.8246503 0.3027471 -0.416648 -0.7200394 -0.5549305 -0.3781582 -0.6538954 -0.6552993 -0.3717254 -0.6430117 -0.6695941 -0.3976904 -0.6880463 -0.6069884 -0.4626981 -0.8005126 -0.3809072 -0.4917574 -0.8506643 0.1858625 -0.3237817 -0.5603082 0.762378 -0.1385578 -0.2398515 0.960871 -0.04782372 -0.08279889 0.9954182 -0.2479994 -0.5957053 0.7639579 -0.3699179 -0.8900796 -0.2663066 -0.3660513 -0.8799697 0.3027538 -0.3191106 -0.7686304 -0.5544149 -0.2895976 -0.6980984 -0.6548221 -0.2846236 -0.6865026 -0.6691067 -0.3044317 -0.7344815 -0.6065134 -0.3541135 -0.8542915 -0.3805125 -0.3763074 -0.9076852 0.1857426 -0.2478483 -0.5981808 0.7620702 -0.1060855 -0.2562106 0.9607821 -0.03662276 -0.08844405 0.9954078 -0.1678264 -0.62339 0.7636879 -0.250077 -0.9310289 -0.2657946 -0.2475135 -0.920378 0.3027234 -0.215739 -0.8042375 -0.5537678 -0.1957468 -0.7305257 -0.6542289 -0.1923615 -0.7183575 -0.6685503 -0.2056981 -0.7684686 -0.6059244 -0.2391805 -0.8935165 -0.3800275 -0.2541365 -0.9491891 0.18562 -0.1674292 -0.6259214 0.761702 -0.07168954 -0.2682331 0.9606829 -0.02475053 -0.09262382 0.9953935 -0.08447599 -0.6403453 0.7634276 -0.1257992 -0.9559151 -0.2653319 -0.1245188 -0.9449393 0.3026296 -0.1084973 -0.8259534 -0.5531993 -0.09842389 -0.7503105 -0.6537178 -0.09671652 -0.7378107 -0.6680429 -0.1033993 -0.7891678 -0.6054112 -0.1201862 -0.9172971 -0.3796333 -0.1277208 -0.9743101 0.1854928 -0.08414202 -0.6428002 0.7613987 -0.0360434 -0.2755905 0.9605992 -0.01251286 -0.09515881 0.9953835 -0.1245188 0.9449393 0.3026296 0 0.6460941 0.7632578 -0.08447599 0.6403453 0.7634276 0 0.9642238 -0.2650898 0 0.9531385 0.3025347 -0.1257992 0.9559151 -0.2653319 0 0.8332363 -0.5529171 -0.1084973 0.8259534 -0.5531993 0 0.7569555 -0.6534666 -0.09842389 0.7503105 -0.6537178 0 0.7443267 -0.6678157 -0.09671652 0.7378107 -0.6680429 0 0.7960717 -0.6052025 -0.1033993 0.7891678 -0.6054112 0 0.9252043 -0.3794693 -0.1201862 0.9172971 -0.3796333 0 0.9826511 0.185464 -0.08414202 0.6428002 0.7613987 -0.1277208 0.9743101 0.1854928 -0.0360434 0.2755905 0.9605992 0 0.6483728 0.761323 -0.0124213 0.09515893 0.9953846 0 0.2780247 0.960574 0 0.096013 0.9953801 -0.2475135 0.920378 0.3027234 -0.1678264 0.62339 0.7636879 -0.250077 0.9310289 -0.2657946 -0.215739 0.8042375 -0.5537678 -0.1957468 0.7305257 -0.6542289 -0.1923615 0.7183575 -0.6685503 -0.2056981 0.7684686 -0.6059244 -0.2391805 0.8935165 -0.3800275 -0.1674292 0.6259214 0.761702 -0.2541379 0.9491946 0.1855905 -0.07168954 0.2682331 0.9606829 -0.02472001 0.09262388 0.9953944 -0.3660513 0.8799697 0.3027538 -0.2479994 0.5957053 0.7639579 -0.3699179 0.8900796 -0.2663066 -0.3191106 0.7686304 -0.5544149 -0.2895976 0.6980984 -0.6548221 -0.2846236 0.6865026 -0.6691067 -0.3044593 0.7344747 -0.6065077 -0.3541135 0.8542915 -0.3805125 -0.2478483 0.5981808 0.7620702 -0.3763074 0.9076852 0.1857426 -0.1060855 0.2562106 0.9607821 -0.03662276 0.08844405 0.9954078 -0.4778034 0.8246503 0.3027471 -0.3234724 0.5580426 0.7641689 -0.4829407 0.8340372 -0.2667405 -0.416648 0.7200394 -0.5549305 -0.3781582 0.6538954 -0.6552993 -0.3717254 0.6430117 -0.6695941 -0.3976904 0.6880463 -0.6069884 -0.4626981 0.8005126 -0.3809072 -0.3237817 0.5603082 0.762378 -0.4917574 0.8506643 0.1858625 -0.1385578 0.2398515 0.960871 -0.04782372 0.08279889 0.9954182 -0.580913 0.7555776 0.3027254 -0.3931166 0.5111951 0.76429 -0.5872531 0.7640821 -0.2670441 -0.506687 0.6594989 -0.5552743 -0.4599619 0.5988264 -0.6556235 -0.4522321 0.5888357 -0.6698945 -0.483877 0.6301235 -0.6072953 -0.563073 0.7332463 -0.3811806 -0.3939451 0.5130931 0.7625896 -0.5984558 0.7792835 0.1859244 -0.1685577 0.2195553 0.9609286 -0.05816853 0.07577776 0.9954267 -0.6739349 0.6739349 0.3026939 -0.4559608 0.4559608 0.7643295 -0.6814094 0.6814094 -0.2671374 -0.5880206 0.5880206 -0.5553951 -0.5338648 0.5338648 -0.6557263 -0.5249336 0.5249336 -0.6699923 -0.5617086 0.5617086 -0.6074265 -0.6536925 0.6536925 -0.3812773 -0.4573537 0.4573537 0.7626632 -0.6947737 0.6947737 0.1859546 -0.1956569 0.1956874 0.96095 -0.06753784 0.06753784 0.9954282 -0.5111951 0.3931166 0.76429 -0.7640821 0.5872531 -0.2670441 -0.7555907 0.5808996 0.3027185 -0.6594887 0.5067097 -0.5552657 -0.5988264 0.4599619 -0.6556235 -0.5888357 0.4522321 -0.6698945 -0.6301051 0.4838863 -0.607307 -0.7332463 0.563073 -0.3811806 -0.7792835 0.5984558 0.1859244 -0.5130931 0.3939451 0.7625896 -0.2195553 0.1685577 0.9609286 -0.07577776 0.05816853 0.9954267 -0.5580426 0.3234724 0.7641689 -0.8340372 0.4829407 -0.2667405 -0.8246503 0.4778034 0.3027471 -0.7200394 0.416648 -0.5549305 -0.6538954 0.3781582 -0.6552993 -0.6430117 0.3717254 -0.6695941 -0.6880463 0.3976904 -0.6069884 -0.8005126 0.4626981 -0.3809072 -0.8506643 0.4917574 0.1858625 -0.5603082 0.3237817 0.762378 -0.2398515 0.1385578 0.960871 -0.08279889 0.04782372 0.9954182 -0.5957053 0.2479994 0.7639579 -0.8900796 0.3699179 -0.2663066 -0.8799697 0.3660513 0.3027538 -0.7686304 0.3191106 -0.5544149 -0.6980984 0.2895976 -0.6548221 -0.6865026 0.2846236 -0.6691067 -0.7344815 0.3044317 -0.6065134 -0.8542915 0.3541135 -0.3805125 -0.9076852 0.3763074 0.1857426 -0.5981808 0.2478483 0.7620702 -0.2562106 0.1060855 0.9607821 -0.08844405 0.03662276 0.9954078 -0.62339 0.1678264 0.7636879 -0.9310289 0.250077 -0.2657946 -0.920378 0.2475135 0.3027234 -0.8042375 0.215739 -0.5537678 -0.7305257 0.1957468 -0.6542289 -0.7183617 0.1923322 -0.6685543 -0.7684686 0.2056981 -0.6059244 -0.8935165 0.2391805 -0.3800275 -0.9491891 0.2541365 0.18562 -0.6259214 0.1674292 0.761702 -0.2682331 0.07168954 0.9606829 -0.09262382 0.02475053 0.9953935 -0.6403453 0.08447599 0.7634276 -0.9559151 0.1257992 -0.2653319 -0.9449393 0.1245188 0.3026296 -0.8259534 0.1084973 -0.5531993 -0.7503105 0.09842389 -0.6537178 -0.7378107 0.09671652 -0.6680429 -0.7891678 0.1033993 -0.6054112 -0.9172971 0.1201862 -0.3796333 -0.9743101 0.1277208 0.1854928 -0.6428002 0.08414202 0.7613987 -0.2755905 0.0360434 0.9605992 -0.09515881 0.01251286 0.9953835 0.9449393 0.1245188 0.3026296 0.6403453 0.08447599 0.7634276 0.9559151 0.1257992 -0.2653319 0.8259534 0.1084973 -0.5531993 0.7503105 0.09842389 -0.6537178 0.7378107 0.09671652 -0.6680429 0.7891678 0.1033993 -0.6054112 0.9172971 0.1201862 -0.3796333 0.6428002 0.08414202 0.7613987 0.9743101 0.1277208 0.1854928 0.2755905 0.0360434 0.9605992 0.09515893 0.0124213 0.9953846 0.920378 0.2475135 0.3027234 0.62339 0.1678264 0.7636879 0.9310289 0.250077 -0.2657946 0.8042375 0.215739 -0.5537678 0.7305257 0.1957468 -0.6542289 0.7183575 0.1923615 -0.6685503 0.7684686 0.2056981 -0.6059244 0.8935165 0.2391805 -0.3800275 0.6259214 0.1674292 0.761702 0.9491946 0.2541379 0.1855905 0.2682331 0.07168954 0.9606829 0.09262382 0.02475053 0.9953935 0.8799697 0.3660513 0.3027538 0.5957053 0.2479994 0.7639579 0.8900796 0.3699179 -0.2663066 0.7686304 0.3191106 -0.5544149 0.6980984 0.2895976 -0.6548221 0.6865026 0.2846236 -0.6691067 0.7344747 0.3044593 -0.6065077 0.8542915 0.3541135 -0.3805125 0.5981808 0.2478483 0.7620702 0.9076852 0.3763074 0.1857426 0.2562106 0.1060855 0.9607821 0.08844405 0.03662276 0.9954078 0.8246503 0.4778034 0.3027471 0.5580426 0.3234724 0.7641689 0.8340372 0.4829407 -0.2667405 0.7200394 0.416648 -0.5549305 0.6538954 0.3781582 -0.6552993 0.6430249 0.371733 -0.6695773 0.6880463 0.3976904 -0.6069884 0.8005126 0.4626981 -0.3809072 0.5603082 0.3237817 0.762378 0.8506643 0.4917574 0.1858625 0.2398515 0.1385578 0.960871 0.08279889 0.04782372 0.9954182 0.7555776 0.580913 0.3027254 0.5111951 0.3931166 0.76429 0.7640821 0.5872531 -0.2670441 0.6594989 0.506687 -0.5552743 0.5988264 0.4599619 -0.6556235 0.5888357 0.4522321 -0.6698945 0.6301051 0.4838863 -0.607307 0.7332463 0.563073 -0.3811806 0.5130931 0.3939451 0.7625896 0.7792835 0.5984558 0.1859244 0.2195553 0.1685577 0.9609286 0.07577776 0.05816853 0.9954267 0.6739349 0.6739349 0.3026939 0.4559608 0.4559608 0.7643295 0.6814094 0.6814094 -0.2671374 0.5880206 0.5880206 -0.5553951 0.5338648 0.5338648 -0.6557263 0.5249336 0.5249336 -0.6699923 0.5617086 0.5617086 -0.6074265 0.6536925 0.6536925 -0.3812773 0.4573537 0.4573537 0.7626632 0.6947737 0.6947737 0.1859546 0.1956863 0.1956863 0.9609442 0.06753784 0.06753784 0.9954282 0.3931166 0.5111951 0.76429 0.5872531 0.7640821 -0.2670441 0.580913 0.7555776 0.3027254 0.5067097 0.6594887 -0.5552657 0.4599619 0.5988264 -0.6556235 0.4522321 0.5888357 -0.6698945 0.4838863 0.6301051 -0.607307 0.563073 0.7332463 -0.3811806 0.5984558 0.7792835 0.1859244 0.3939451 0.5130931 0.7625896 0.1685577 0.2195553 0.9609286 0.05816853 0.07577776 0.9954267 0.3234724 0.5580426 0.7641689 0.4829407 0.8340372 -0.2667405 0.4778078 0.8246579 0.3027194 0.416648 0.7200394 -0.5549305 0.3781582 0.6538954 -0.6552993 0.3717254 0.6430117 -0.6695941 0.3976904 0.6880463 -0.6069884 0.4626981 0.8005126 -0.3809072 0.4917574 0.8506643 0.1858625 0.3237817 0.5603082 0.762378 0.1385578 0.2398515 0.960871 0.04782372 0.08279889 0.9954182 0.2479994 0.5957053 0.7639579 0.3699179 0.8900796 -0.2663066 0.3660513 0.8799697 0.3027538 0.3191106 0.7686304 -0.5544149 0.2895976 0.6980984 -0.6548221 0.2846236 0.6865026 -0.6691067 0.3044317 0.7344815 -0.6065134 0.3541135 0.8542915 -0.3805125 0.3763074 0.9076852 0.1857426 0.2478483 0.5981808 0.7620702 0.1060855 0.2562106 0.9607821 0.03662276 0.08844405 0.9954078 0.1678264 0.62339 0.7636879 0.250077 0.9310289 -0.2657946 0.2475135 0.920378 0.3027234 0.215739 0.8042375 -0.5537678 0.1957468 0.7305257 -0.6542289 0.1923615 0.7183575 -0.6685503 0.2056981 0.7684686 -0.6059244 0.2391805 0.8935165 -0.3800275 0.2541365 0.9491891 0.18562 0.1674292 0.6259214 0.761702 0.07168954 0.2682331 0.9606829 0.02475053 0.09262382 0.9953935 0.08447599 0.6403453 0.7634276 0.1257992 0.9559151 -0.2653319 0.1245188 0.9449393 0.3026296 0.1084973 0.8259534 -0.5531993 0.09842389 0.7503105 -0.6537178 0.09671652 0.7378107 -0.6680429 0.1033993 0.7891678 -0.6054112 0.1201862 0.9172971 -0.3796333 0.1277208 0.9743101 0.1854928 0.08414202 0.6428002 0.7613987 0.0360434 0.2755905 0.9605992 0.01251286 0.09515881 0.9953835 0.09576815 -0.7257385 0.6812725 0 -0.8886973 0.4584944 0.1163698 -0.8809681 0.458643 0.05447638 -0.4131356 0.9090387 0 -0.7321019 0.6811953 0.03528046 -0.2674725 0.9629195 0 -0.4168565 0.9089724 0.02606332 -0.1975811 0.9799401 0 -0.2699129 0.9628848 0.02151566 -0.1631532 0.9863661 0 -0.1993782 0.9799227 0.01971501 -0.1495412 0.988559 0 -0.1646217 0.9863569 0.01999002 -0.1515887 0.9882416 0 -0.1509173 0.9885465 0.0222792 -0.1688948 0.9853823 0 -0.1529607 0.9882324 0.0271005 -0.2053903 0.9783049 0 -0.1704486 0.9853666 0.035829 -0.2716171 0.9617382 0 -0.2072546 0.9782871 0.05182135 -0.3927196 0.9181972 0 -0.2741245 0.9616942 0 -0.3962975 0.9181222 0.1902261 -0.7065804 0.6815851 0.2311236 -0.8578401 0.4590122 0.1082195 -0.4020847 0.9091845 0.07004028 -0.2602937 0.9629858 0.05173033 -0.1922721 0.9799773 0.04272603 -0.1587579 0.9863926 0.03915619 -0.1455159 0.9885808 0.03970515 -0.1474981 0.9882651 0.04425305 -0.1643468 0.9854094 0.05380511 -0.1998389 0.9783504 0.07117015 -0.2643245 0.9618042 0.102909 -0.3821855 0.9183377 0.2811143 -0.6752422 0.6819259 0.3415071 -0.8199529 0.4594019 0.1598601 -0.3840854 0.9093531 0.1034599 -0.2486091 0.9630627 0.07641911 -0.1836317 0.9800202 0.06311434 -0.151621 0.9864217 0.05783361 -0.1389839 0.9886044 0.05862659 -0.1408747 0.9882901 0.065342 -0.1569612 0.9854409 0.07947224 -0.1908981 0.9783875 0.105109 -0.2524571 0.9618824 0.1519876 -0.3650756 0.9184877 0.366688 -0.6325408 0.682226 0.4454604 -0.7682636 0.4597131 0.2084746 -0.3596653 0.9094939 0.1349256 -0.2327704 0.9631268 0.0996443 -0.1719436 0.9800543 0.08227998 -0.1419757 0.9864447 0.07541185 -0.130132 0.9886247 0.07645106 -0.1319049 0.9883099 0.08520936 -0.1469801 0.9854624 0.1036135 -0.1787524 0.9784231 0.1370624 -0.2364029 0.9619395 0.1981915 -0.3419064 0.9185969 0.445611 -0.5794378 0.6824095 0.5413532 -0.703869 0.4598969 0.2533059 -0.3293892 0.9095818 0.1639201 -0.2131785 0.9631642 0.1210678 -0.157446 0.9800783 0.09997957 -0.13001 0.9864591 0.09164869 -0.1191769 0.9886342 0.09289926 -0.1207934 0.9883212 0.1035194 -0.1345875 0.9854795 0.1258921 -0.163675 0.9784486 0.1665146 -0.2165057 0.9619762 0.2408295 -0.3131302 0.9186679 0.5168237 -0.5168237 0.6824856 0.6278704 -0.6278704 0.459954 0.2937737 -0.2937737 0.9096121 0.1901035 -0.1901035 0.963183 0.1404175 -0.1404175 0.9800846 0.1159417 -0.1159417 0.986466 0.1062682 -0.1062682 0.9886426 0.1077319 -0.1077319 0.9883258 0.120031 -0.120031 0.9854874 0.1459747 -0.1460052 0.9784549 0.1930943 -0.1930943 0.9619923 0.2792833 -0.2792833 0.9186958 0.703869 -0.5413532 0.4598969 0.5794378 -0.445611 0.6824095 0.3293892 -0.2533059 0.9095818 0.2131785 -0.1639201 0.9631642 0.157446 -0.1210678 0.9800783 0.13001 -0.09997957 0.9864591 0.1191769 -0.09164869 0.9886342 0.1207934 -0.09289926 0.9883212 0.1345875 -0.1035194 0.9854795 0.163675 -0.1258921 0.9784486 0.2165057 -0.1665146 0.9619762 0.3131302 -0.2408295 0.9186679 0.7682636 -0.4454604 0.4597131 0.6325408 -0.366688 0.682226 0.3596653 -0.2084746 0.9094939 0.2327704 -0.1349256 0.9631268 0.1719436 -0.0996443 0.9800543 0.1419757 -0.08227998 0.9864447 0.130132 -0.07541185 0.9886247 0.1319049 -0.07645106 0.9883099 0.1469801 -0.08520936 0.9854624 0.1787524 -0.1036135 0.9784231 0.2364029 -0.1370624 0.9619395 0.3419064 -0.1981915 0.9185969 0.8199529 -0.3415071 0.4594019 0.6752422 -0.2811143 0.6819259 0.3840854 -0.1598601 0.9093531 0.2486091 -0.1034599 0.9630627 0.1836317 -0.07641911 0.9800202 0.151621 -0.06311434 0.9864217 0.1389839 -0.05783361 0.9886044 0.1408747 -0.05862659 0.9882901 0.1569612 -0.065342 0.9854409 0.1908981 -0.07947224 0.9783875 0.2524571 -0.105109 0.9618824 0.3650756 -0.1519876 0.9184877 0.8578401 -0.2311236 0.4590122 0.7065804 -0.1902261 0.6815851 0.4020847 -0.1082195 0.9091845 0.2602937 -0.07004028 0.9629858 0.1922721 -0.05173033 0.9799773 0.1587579 -0.04272603 0.9863926 0.1455159 -0.03915619 0.9885808 0.1474981 -0.03970515 0.9882651 0.1643468 -0.04425305 0.9854094 0.1998389 -0.05380511 0.9783504 0.2643245 -0.07117015 0.9618042 0.3821855 -0.102909 0.9183377 0.8809681 -0.1163698 0.458643 0.7257385 -0.09576815 0.6812725 0.4131356 -0.05447638 0.9090387 0.2674725 -0.03528046 0.9629195 0.1975811 -0.02606332 0.9799401 0.1631532 -0.02151566 0.9863661 0.1495412 -0.01971501 0.988559 0.1515887 -0.01999002 0.9882416 0.1688948 -0.0222792 0.9853823 0.2053903 -0.0271005 0.9783049 0.2716171 -0.035829 0.9617382 0.3927196 -0.05182135 0.9181972 0.8886973 0 0.4584944 0.7321159 0 0.6811801 0.4168565 0 0.9089724 0.2699129 0 0.9628848 0.1993782 0 0.9799227 0.1646217 0 0.9863569 0.1509173 0 0.9885465 0.1529607 0 0.9882324 0.1704486 0 0.9853666 0.2072546 0 0.9782871 0.2741245 0 0.9616942 0.3962975 0 0.9181222 -0.7257385 -0.09576815 0.6812725 -0.8886973 0 0.4584944 -0.8809681 -0.1163698 0.458643 -0.4131356 -0.05447638 0.9090387 -0.7321159 0 0.6811801 -0.2674725 -0.03528046 0.9629195 -0.4168565 0 0.9089724 -0.1975811 -0.02606332 0.9799401 -0.2699129 0 0.9628848 -0.1631532 -0.02151566 0.9863661 -0.1993782 0 0.9799227 -0.1495412 -0.01971501 0.988559 -0.1646217 0 0.9863569 -0.1515887 -0.01999002 0.9882416 -0.1509173 0 0.9885465 -0.1688948 -0.0222792 0.9853823 -0.1529607 0 0.9882324 -0.2053903 -0.0271005 0.9783049 -0.1704486 0 0.9853666 -0.2716171 -0.035829 0.9617382 -0.2072546 0 0.9782871 -0.3927196 -0.05182135 0.9181972 -0.2741245 0 0.9616942 -0.3962975 0 0.9181222 -0.7065804 -0.1902261 0.6815851 -0.8578401 -0.2311236 0.4590122 -0.4020847 -0.1082195 0.9091845 -0.2602937 -0.07004028 0.9629858 -0.1922721 -0.05173033 0.9799773 -0.1587579 -0.04272603 0.9863926 -0.1455159 -0.03915619 0.9885808 -0.1474981 -0.03970515 0.9882651 -0.1643468 -0.04425305 0.9854094 -0.1998389 -0.05380511 0.9783504 -0.2643245 -0.07117015 0.9618042 -0.3821855 -0.102909 0.9183377 -0.6752422 -0.2811143 0.6819259 -0.8199529 -0.3415071 0.4594019 -0.3840854 -0.1598601 0.9093531 -0.2486091 -0.1034599 0.9630627 -0.1836317 -0.07641911 0.9800202 -0.151621 -0.06311434 0.9864217 -0.1389839 -0.05783361 0.9886044 -0.1408747 -0.05862659 0.9882901 -0.1569612 -0.065342 0.9854409 -0.1908981 -0.07947224 0.9783875 -0.2524571 -0.105109 0.9618824 -0.3650756 -0.1519876 0.9184877 -0.6325408 -0.366688 0.682226 -0.7682636 -0.4454604 0.4597131 -0.3596653 -0.2084746 0.9094939 -0.2327704 -0.1349256 0.9631268 -0.1719436 -0.0996443 0.9800543 -0.1419757 -0.08227998 0.9864447 -0.130132 -0.07541185 0.9886247 -0.1319049 -0.07645106 0.9883099 -0.1469801 -0.08520936 0.9854624 -0.1787524 -0.1036135 0.9784231 -0.2364029 -0.1370624 0.9619395 -0.3419064 -0.1981915 0.9185969 -0.5794378 -0.445611 0.6824095 -0.703869 -0.5413532 0.4598969 -0.3293892 -0.2533059 0.9095818 -0.2131785 -0.1639201 0.9631642 -0.157446 -0.1210678 0.9800783 -0.13001 -0.09997957 0.9864591 -0.1191769 -0.09164869 0.9886342 -0.1207934 -0.09289926 0.9883212 -0.1345875 -0.1035194 0.9854795 -0.163675 -0.1258921 0.9784486 -0.2165057 -0.1665146 0.9619762 -0.3131302 -0.2408295 0.9186679 -0.5168237 -0.5168237 0.6824856 -0.6278704 -0.6278704 0.459954 -0.2937737 -0.2937737 0.9096121 -0.1901035 -0.1901035 0.963183 -0.1404175 -0.1404175 0.9800846 -0.1159417 -0.1159417 0.986466 -0.1062682 -0.1062682 0.9886426 -0.1077319 -0.1077319 0.9883258 -0.120031 -0.120031 0.9854874 -0.1460052 -0.1459747 0.9784549 -0.1930943 -0.1930943 0.9619923 -0.2792833 -0.2792833 0.9186958 -0.5413532 -0.703869 0.4598969 -0.445611 -0.5794378 0.6824095 -0.2533059 -0.3293892 0.9095818 -0.1639201 -0.2131785 0.9631642 -0.1210678 -0.157446 0.9800783 -0.09997957 -0.13001 0.9864591 -0.09164869 -0.1191769 0.9886342 -0.09289926 -0.1207934 0.9883212 -0.1035194 -0.1345875 0.9854795 -0.1258921 -0.163675 0.9784486 -0.1665146 -0.2165057 0.9619762 -0.2408295 -0.3131302 0.9186679 -0.4454604 -0.7682636 0.4597131 -0.366688 -0.6325408 0.682226 -0.2084746 -0.3596653 0.9094939 -0.1349256 -0.2327704 0.9631268 -0.0996443 -0.1719436 0.9800543 -0.08227998 -0.1419757 0.9864447 -0.07541185 -0.130132 0.9886247 -0.07645106 -0.1319049 0.9883099 -0.08520936 -0.1469801 0.9854624 -0.1036135 -0.1787524 0.9784231 -0.1370624 -0.2364029 0.9619395 -0.1981915 -0.3419064 0.9185969 -0.3415071 -0.8199529 0.4594019 -0.2811143 -0.6752422 0.6819259 -0.1598601 -0.3840854 0.9093531 -0.1034599 -0.2486091 0.9630627 -0.07641911 -0.1836317 0.9800202 -0.06311434 -0.151621 0.9864217 -0.05783361 -0.1389839 0.9886044 -0.05862659 -0.1408747 0.9882901 -0.065342 -0.1569612 0.9854409 -0.07947224 -0.1908981 0.9783875 -0.105109 -0.2524571 0.9618824 -0.1519876 -0.3650756 0.9184877 -0.2311236 -0.8578401 0.4590122 -0.1902261 -0.7065804 0.6815851 -0.1082195 -0.4020847 0.9091845 -0.07004028 -0.2602937 0.9629858 -0.05173033 -0.1922721 0.9799773 -0.04272603 -0.1587579 0.9863926 -0.03915619 -0.1455159 0.9885808 -0.03970515 -0.1474981 0.9882651 -0.04425305 -0.1643468 0.9854094 -0.05380511 -0.1998389 0.9783504 -0.07117015 -0.2643245 0.9618042 -0.102909 -0.3821855 0.9183377 -0.1163698 -0.8809681 0.458643 -0.09576815 -0.7257385 0.6812725 -0.05447638 -0.4131356 0.9090387 -0.03528046 -0.2674725 0.9629195 -0.02606332 -0.1975811 0.9799401 -0.02151566 -0.1631532 0.9863661 -0.01971501 -0.1495412 0.988559 -0.01999002 -0.1515887 0.9882416 -0.0222792 -0.1688948 0.9853823 -0.0271005 -0.2053903 0.9783049 -0.035829 -0.2716171 0.9617382 -0.05182135 -0.3927196 0.9181972 -0.09576815 0.7257385 0.6812725 0 0.8886973 0.4584944 -0.1163698 0.8809681 0.458643 -0.05447638 0.4131356 0.9090387 0 0.7321019 0.6811953 -0.03528046 0.2674725 0.9629195 0 0.4168565 0.9089724 -0.02606332 0.1975811 0.9799401 0 0.2699129 0.9628848 -0.02151566 0.1631532 0.9863661 0 0.1993782 0.9799227 -0.01971501 0.1495412 0.988559 0 0.1646217 0.9863569 -0.01999002 0.1515887 0.9882416 0 0.1509173 0.9885465 -0.0222792 0.1688948 0.9853823 0 0.1529607 0.9882324 -0.0271005 0.2053903 0.9783049 0 0.1704486 0.9853666 -0.035829 0.2716171 0.9617382 0 0.2072546 0.9782871 -0.05182135 0.3927196 0.9181972 0 0.2741245 0.9616942 0 0.3962975 0.9181222 -0.1902261 0.7065804 0.6815851 -0.2311236 0.8578401 0.4590122 -0.1082195 0.4020847 0.9091845 -0.07004028 0.2602937 0.9629858 -0.05173033 0.1922721 0.9799773 -0.04272603 0.1587579 0.9863926 -0.03915619 0.1455159 0.9885808 -0.03970515 0.1474981 0.9882651 -0.04425305 0.1643468 0.9854094 -0.05380511 0.1998389 0.9783504 -0.07117015 0.2643245 0.9618042 -0.102909 0.3821855 0.9183377 -0.2811143 0.6752422 0.6819259 -0.3415071 0.8199529 0.4594019 -0.1598601 0.3840854 0.9093531 -0.1034599 0.2486091 0.9630627 -0.07641911 0.1836317 0.9800202 -0.06311434 0.151621 0.9864217 -0.05783361 0.1389839 0.9886044 -0.05862659 0.1408747 0.9882901 -0.065342 0.1569612 0.9854409 -0.07947224 0.1908981 0.9783875 -0.105109 0.2524571 0.9618824 -0.1519876 0.3650756 0.9184877 -0.366688 0.6325408 0.682226 -0.4454604 0.7682636 0.4597131 -0.2084746 0.3596653 0.9094939 -0.1349256 0.2327704 0.9631268 -0.0996443 0.1719436 0.9800543 -0.08227998 0.1419757 0.9864447 -0.07541185 0.130132 0.9886247 -0.07645106 0.1319049 0.9883099 -0.08520936 0.1469801 0.9854624 -0.1036135 0.1787524 0.9784231 -0.1370624 0.2364029 0.9619395 -0.1981915 0.3419064 0.9185969 -0.445611 0.5794378 0.6824095 -0.5413532 0.703869 0.4598969 -0.2533059 0.3293892 0.9095818 -0.1639201 0.2131785 0.9631642 -0.1210678 0.157446 0.9800783 -0.09997957 0.13001 0.9864591 -0.09164869 0.1191769 0.9886342 -0.09289926 0.1207934 0.9883212 -0.1035194 0.1345875 0.9854795 -0.1258921 0.163675 0.9784486 -0.1665146 0.2165057 0.9619762 -0.2408295 0.3131302 0.9186679 -0.5168237 0.5168237 0.6824856 -0.6278704 0.6278704 0.459954 -0.2937737 0.2937737 0.9096121 -0.1901035 0.1901035 0.963183 -0.1404175 0.1404175 0.9800846 -0.1159417 0.1159417 0.986466 -0.1062682 0.1062682 0.9886426 -0.1077319 0.1077319 0.9883258 -0.120031 0.120031 0.9854874 -0.1459747 0.1460052 0.9784549 -0.1930943 0.1930943 0.9619923 -0.2792833 0.2792833 0.9186958 -0.703869 0.5413532 0.4598969 -0.5794378 0.445611 0.6824095 -0.3293892 0.2533059 0.9095818 -0.2131785 0.1639201 0.9631642 -0.157446 0.1210678 0.9800783 -0.13001 0.09997957 0.9864591 -0.1191769 0.09164869 0.9886342 -0.1207934 0.09289926 0.9883212 -0.1345875 0.1035194 0.9854795 -0.163675 0.1258921 0.9784486 -0.2165057 0.1665146 0.9619762 -0.3131302 0.2408295 0.9186679 -0.7682636 0.4454604 0.4597131 -0.6325408 0.366688 0.682226 -0.3596653 0.2084746 0.9094939 -0.2327704 0.1349256 0.9631268 -0.1719436 0.0996443 0.9800543 -0.1419757 0.08227998 0.9864447 -0.130132 0.07541185 0.9886247 -0.1319049 0.07645106 0.9883099 -0.1469801 0.08520936 0.9854624 -0.1787524 0.1036135 0.9784231 -0.2364029 0.1370624 0.9619395 -0.3419064 0.1981915 0.9185969 -0.8199529 0.3415071 0.4594019 -0.6752422 0.2811143 0.6819259 -0.3840854 0.1598601 0.9093531 -0.2486091 0.1034599 0.9630627 -0.1836317 0.07641911 0.9800202 -0.151621 0.06311434 0.9864217 -0.1389839 0.05783361 0.9886044 -0.1408747 0.05862659 0.9882901 -0.1569612 0.065342 0.9854409 -0.1908981 0.07947224 0.9783875 -0.2524571 0.105109 0.9618824 -0.3650756 0.1519876 0.9184877 -0.8578401 0.2311236 0.4590122 -0.7065804 0.1902261 0.6815851 -0.4020847 0.1082195 0.9091845 -0.2602937 0.07004028 0.9629858 -0.1922721 0.05173033 0.9799773 -0.1587579 0.04272603 0.9863926 -0.1455159 0.03915619 0.9885808 -0.1474981 0.03970515 0.9882651 -0.1643468 0.04425305 0.9854094 -0.1998389 0.05380511 0.9783504 -0.2643245 0.07117015 0.9618042 -0.3821855 0.102909 0.9183377 -0.8809681 0.1163698 0.458643 -0.7257385 0.09576815 0.6812725 -0.4131356 0.05447638 0.9090387 -0.2674725 0.03528046 0.9629195 -0.1975811 0.02606332 0.9799401 -0.1631532 0.02151566 0.9863661 -0.1495412 0.01971501 0.988559 -0.1515887 0.01999002 0.9882416 -0.1688948 0.0222792 0.9853823 -0.2053903 0.0271005 0.9783049 -0.2716171 0.035829 0.9617382 -0.3927196 0.05182135 0.9181972 0.7257385 0.09576815 0.6812725 0.8809681 0.1163698 0.458643 0.4131356 0.05447638 0.9090387 0.2674725 0.03528046 0.9629195 0.1975811 0.02606332 0.9799401 0.1631532 0.02151566 0.9863661 0.1495412 0.01971501 0.988559 0.1515887 0.01999002 0.9882416 0.1688948 0.0222792 0.9853823 0.2053903 0.0271005 0.9783049 0.2716171 0.035829 0.9617382 0.3927196 0.05182135 0.9181972 0.7065804 0.1902261 0.6815851 0.8578401 0.2311236 0.4590122 0.4020847 0.1082195 0.9091845 0.2602937 0.07004028 0.9629858 0.1922721 0.05173033 0.9799773 0.1587579 0.04272603 0.9863926 0.1455159 0.03915619 0.9885808 0.1474981 0.03970515 0.9882651 0.1643468 0.04425305 0.9854094 0.1998389 0.05380511 0.9783504 0.2643245 0.07117015 0.9618042 0.3821855 0.102909 0.9183377 0.6752422 0.2811143 0.6819259 0.8199529 0.3415071 0.4594019 0.3840854 0.1598601 0.9093531 0.2486091 0.1034599 0.9630627 0.1836317 0.07641911 0.9800202 0.151621 0.06311434 0.9864217 0.1389839 0.05783361 0.9886044 0.1408747 0.05862659 0.9882901 0.1569612 0.065342 0.9854409 0.1908981 0.07947224 0.9783875 0.2524571 0.105109 0.9618824 0.3650756 0.1519876 0.9184877 0.6325408 0.366688 0.682226 0.7682636 0.4454604 0.4597131 0.3596653 0.2084746 0.9094939 0.2327704 0.1349256 0.9631268 0.1719436 0.0996443 0.9800543 0.1419757 0.08227998 0.9864447 0.130132 0.07541185 0.9886247 0.1319049 0.07645106 0.9883099 0.1469801 0.08520936 0.9854624 0.1787524 0.1036135 0.9784231 0.2364029 0.1370624 0.9619395 0.3419064 0.1981915 0.9185969 0.5794378 0.445611 0.6824095 0.703869 0.5413532 0.4598969 0.3293892 0.2533059 0.9095818 0.2131785 0.1639201 0.9631642 0.157446 0.1210678 0.9800783 0.13001 0.09997957 0.9864591 0.1191769 0.09164869 0.9886342 0.1207934 0.09289926 0.9883212 0.1345875 0.1035194 0.9854795 0.163675 0.1258921 0.9784486 0.2165057 0.1665146 0.9619762 0.3131302 0.2408295 0.9186679 0.5168237 0.5168237 0.6824856 0.6278704 0.6278704 0.459954 0.2937737 0.2937737 0.9096121 0.1901035 0.1901035 0.963183 0.1404175 0.1404175 0.9800846 0.1159417 0.1159417 0.986466 0.1062682 0.1062682 0.9886426 0.1077319 0.1077319 0.9883258 0.120031 0.120031 0.9854874 0.1460052 0.1459747 0.9784549 0.1930943 0.1930943 0.9619923 0.2792833 0.2792833 0.9186958 0.5413532 0.703869 0.4598969 0.445611 0.5794378 0.6824095 0.2533059 0.3293892 0.9095818 0.1639201 0.2131785 0.9631642 0.1210678 0.157446 0.9800783 0.09997957 0.13001 0.9864591 0.09164869 0.1191769 0.9886342 0.09289926 0.1207934 0.9883212 0.1035194 0.1345875 0.9854795 0.1258921 0.163675 0.9784486 0.1665146 0.2165057 0.9619762 0.2408295 0.3131302 0.9186679 0.4454604 0.7682636 0.4597131 0.366688 0.6325408 0.682226 0.2084746 0.3596653 0.9094939 0.1349256 0.2327704 0.9631268 0.0996443 0.1719436 0.9800543 0.08227998 0.1419757 0.9864447 0.07541185 0.130132 0.9886247 0.07645106 0.1319049 0.9883099 0.08520936 0.1469801 0.9854624 0.1036135 0.1787524 0.9784231 0.1370624 0.2364029 0.9619395 0.1981915 0.3419064 0.9185969 0.3415071 0.8199529 0.4594019 0.2811143 0.6752422 0.6819259 0.1598601 0.3840854 0.9093531 0.1034599 0.2486091 0.9630627 0.07641911 0.1836317 0.9800202 0.06311434 0.151621 0.9864217 0.05783361 0.1389839 0.9886044 0.05862659 0.1408747 0.9882901 0.065342 0.1569612 0.9854409 0.07947224 0.1908981 0.9783875 0.105109 0.2524571 0.9618824 0.1519876 0.3650756 0.9184877 0.2311236 0.8578401 0.4590122 0.1902261 0.7065804 0.6815851 0.1082195 0.4020847 0.9091845 0.07004028 0.2602937 0.9629858 0.05173033 0.1922721 0.9799773 0.04272603 0.1587579 0.9863926 0.03915619 0.1455159 0.9885808 0.03970515 0.1474981 0.9882651 0.04425305 0.1643468 0.9854094 0.05380511 0.1998389 0.9783504 0.07117015 0.2643245 0.9618042 0.102909 0.3821855 0.9183377 0.1163698 0.8809681 0.458643 0.09576815 0.7257385 0.6812725 0.05447638 0.4131356 0.9090387 0.03528046 0.2674725 0.9629195 0.02606332 0.1975811 0.9799401 0.02151566 0.1631532 0.9863661 0.01971501 0.1495412 0.988559 0.01999002 0.1515887 0.9882416 0.0222792 0.1688948 0.9853823 0.0271005 0.2053903 0.9783049 0.035829 0.2716171 0.9617382 0.05182135 0.3927196 0.9181972 0.1248548 0.9458572 -0.2996089 0.1298872 0.9839816 -0.122105 0.1015686 0.7696393 -0.6303486 0 0.9540914 -0.2995155 0.06934034 0.5257599 -0.8478021 0 0.7764127 -0.6302249 0.04443514 0.3368953 -0.9404931 0 0.5304598 -0.8477101 0.02874934 0.2180007 -0.9755252 0 0.3399242 -0.9404528 0.01898276 0.1440188 -0.9893929 0 0.2199798 -0.9755044 0.01263499 0.09601414 -0.9952998 0 0.1453297 -0.9893833 0.008331775 0.06335842 -0.9979562 0 0.09686839 -0.9952973 0.00527966 0.04019296 -0.9991781 0 0.06393814 -0.9979539 0.003051817 0.02319407 -0.9997264 0 0.04055911 -0.9991772 0.001342773 0.01034581 -0.9999457 0 0.02340769 -0.9997261 0 0 -1 0 0.01043736 -0.9999455 0.2480623 0.9211693 -0.2998538 0.2580701 0.9583632 -0.1222293 0.2017614 0.7493341 -0.6307066 0.1377317 0.5117406 -0.8480281 0.08823126 0.3278383 -0.9406048 0.05707061 0.2121379 -0.9755719 0.03772097 0.1401414 -0.9894129 0.02511698 0.09341806 -0.9953101 0.01657164 0.06164771 -0.9979605 0.01052886 0.03912478 -0.9991789 0.006073176 0.02258372 -0.9997265 0.002685606 0.01007115 -0.9999458 0.3666629 0.8806136 -0.3001301 0.2981432 0.7161359 -0.6310785 0.2035015 0.4888859 -0.8482792 0.1303462 0.3131545 -0.9407148 0.0843231 0.2026135 -0.9756216 0.05569761 0.1338574 -0.9894342 0.03714168 0.08923768 -0.9953176 0.02450656 0.05887073 -0.9979648 0.01553398 0.03735482 -0.9991814 0.008972406 0.02154606 -0.9997276 0.003997921 0.009613394 -0.9999459 0.4783893 0.8251796 -0.3003705 0.4977666 0.8586246 -0.1224426 0.3889063 0.6708733 -0.631412 0.2653945 0.4578482 -0.8484933 0.1699611 0.293228 -0.9408138 0.1099601 0.1897065 -0.9756641 0.07263511 0.1253108 -0.9894551 0.04840373 0.08353155 -0.9953289 0.03195327 0.05511713 -0.9979686 0.02026438 0.03497439 -0.9991828 0.01168859 0.02017277 -0.9997282 0.005218684 0.009002983 -0.9999459 0.5814476 0.7560466 -0.3005204 0.6050374 0.7867165 -0.1225029 0.4726178 0.6145619 -0.631622 0.3224698 0.4193389 -0.8486272 0.2064928 0.2685384 -0.9408761 0.1335819 0.1737144 -0.9756942 0.08823144 0.1147528 -0.9894681 0.05880939 0.07647973 -0.9953354 0.03882008 0.05047833 -0.9979705 0.02462863 0.03201413 -0.999184 0.01419115 0.01846373 -0.9997289 0.006317377 0.008240044 -0.9999461 0.6744138 0.6744138 -0.3005533 0.5481619 0.5481619 -0.6316938 0.3740081 0.3740081 -0.8486672 0.2394828 0.2394828 -0.9409017 0.1549456 0.1549456 -0.9756966 0.1023319 0.1023319 -0.9894728 0.06820923 0.06820923 -0.9953367 0.04501551 0.04501551 -0.9979715 0.02856552 0.02856552 -0.9991838 0.01648002 0.01648002 -0.9997285 0.007354974 0.007354974 -0.999946 0.7867165 0.6050374 -0.1225029 0.7560466 0.5814476 -0.3005204 0.6145619 0.4726178 -0.631622 0.4193389 0.3224698 -0.8486272 0.2685384 0.2064928 -0.9408761 0.1737144 0.1335819 -0.9756942 0.1147528 0.08823144 -0.9894681 0.07647973 0.05880939 -0.9953354 0.05047833 0.03882008 -0.9979705 0.03201413 0.02462863 -0.999184 0.01846373 0.01419115 -0.9997289 0.008240044 0.006317377 -0.9999461 0.8586246 0.4977666 -0.1224426 0.8251796 0.4783893 -0.3003705 0.6708733 0.3889063 -0.631412 0.4578482 0.2653945 -0.8484933 0.293228 0.1699611 -0.9408138 0.1897065 0.1099601 -0.9756641 0.1253108 0.07263511 -0.9894551 0.08353155 0.04840373 -0.9953289 0.05511713 0.03195327 -0.9979686 0.03497439 0.02026438 -0.9991828 0.02017277 0.01168859 -0.9997282 0.009002983 0.005218684 -0.9999459 0.8806136 0.3666629 -0.3001301 0.7161359 0.2981432 -0.6310785 0.4888859 0.2035015 -0.8482792 0.3131545 0.1303462 -0.9407148 0.2026135 0.0843231 -0.9756216 0.1338574 0.05569761 -0.9894342 0.08923768 0.03714168 -0.9953176 0.05887073 0.02450656 -0.9979648 0.03735482 0.01553398 -0.9991814 0.02154606 0.008972406 -0.9997276 0.009613394 0.003997921 -0.9999459 0.9583667 0.2580711 -0.1221992 0.9211693 0.2480623 -0.2998538 0.7493341 0.2017614 -0.6307066 0.5117406 0.1377317 -0.8480281 0.3278383 0.08823126 -0.9406048 0.2121379 0.05707061 -0.9755719 0.1401414 0.03772097 -0.9894129 0.093418 0.02514743 -0.9953094 0.06164771 0.01657164 -0.9979605 0.03912478 0.01052886 -0.9991789 0.02258372 0.006073176 -0.9997265 0.01007115 0.002685606 -0.9999458 0.9839816 0.1298872 -0.122105 0.9458572 0.1248548 -0.2996089 0.7696244 0.1015667 -0.6303669 0.5257599 0.06934034 -0.8478021 0.3368953 0.04443514 -0.9404931 0.2180007 0.02874934 -0.9755252 0.1440188 0.01898276 -0.9893929 0.09601414 0.01263499 -0.9952998 0.06335842 0.008331775 -0.9979562 0.04019296 0.00527966 -0.9991781 0.02319407 0.003051817 -0.9997264 0.01034581 0.001342773 -0.9999457 0.9540914 0 -0.2995155 0.7764127 0 -0.6302249 0.5304461 0 -0.8477187 0.3399242 0 -0.9404528 0.2199798 0 -0.9755044 0.1453297 0 -0.9893833 0.09686839 0 -0.9952973 0.06393814 0 -0.9979539 0.04055911 0 -0.9991772 0.02340769 0 -0.9997261 0.01043736 0 -0.9999455 -0.9458572 0.1248548 -0.2996089 -0.9839816 0.1298872 -0.122105 -0.7696244 0.1015667 -0.6303669 -0.9540914 0 -0.2995155 -0.5257599 0.06934034 -0.8478021 -0.7764127 0 -0.6302249 -0.3368953 0.04443514 -0.9404931 -0.5304461 0 -0.8477187 -0.2180007 0.02874934 -0.9755252 -0.3399242 0 -0.9404528 -0.1440188 0.01898276 -0.9893929 -0.2199798 0 -0.9755044 -0.09601414 0.01263499 -0.9952998 -0.1453297 0 -0.9893833 -0.06335842 0.008331775 -0.9979562 -0.09686839 0 -0.9952973 -0.04019296 0.00527966 -0.9991781 -0.06393814 0 -0.9979539 -0.02319407 0.003051817 -0.9997264 -0.04055911 0 -0.9991772 -0.01034581 0.001342773 -0.9999457 -0.02340769 0 -0.9997261 -0.01043736 0 -0.9999455 -0.9211693 0.2480623 -0.2998538 -0.9583667 0.2580711 -0.1221992 -0.7493341 0.2017614 -0.6307066 -0.5117406 0.1377317 -0.8480281 -0.3278383 0.08823126 -0.9406048 -0.2121379 0.05707061 -0.9755719 -0.1401414 0.03772097 -0.9894129 -0.093418 0.02514743 -0.9953094 -0.06164771 0.01657164 -0.9979605 -0.03912478 0.01052886 -0.9991789 -0.02258372 0.006073176 -0.9997265 -0.01007115 0.002685606 -0.9999458 -0.8806136 0.3666629 -0.3001301 -0.7161359 0.2981432 -0.6310785 -0.4888859 0.2035015 -0.8482792 -0.3131545 0.1303462 -0.9407148 -0.2026135 0.0843231 -0.9756216 -0.1338574 0.05569761 -0.9894342 -0.08923768 0.03714168 -0.9953176 -0.05887073 0.02450656 -0.9979648 -0.03735482 0.01553398 -0.9991814 -0.02154606 0.008972406 -0.9997276 -0.009613394 0.003997921 -0.9999459 -0.8251796 0.4783893 -0.3003705 -0.8586246 0.4977666 -0.1224426 -0.6708733 0.3889063 -0.631412 -0.4578482 0.2653945 -0.8484933 -0.293228 0.1699611 -0.9408138 -0.1897065 0.1099601 -0.9756641 -0.1253108 0.07263511 -0.9894551 -0.08353155 0.04840373 -0.9953289 -0.05511713 0.03195327 -0.9979686 -0.03497439 0.02026438 -0.9991828 -0.02017277 0.01168859 -0.9997282 -0.009002983 0.005218684 -0.9999459 -0.7560466 0.5814476 -0.3005204 -0.7867165 0.6050374 -0.1225029 -0.6145619 0.4726178 -0.631622 -0.4193389 0.3224698 -0.8486272 -0.2685384 0.2064928 -0.9408761 -0.1737144 0.1335819 -0.9756942 -0.1147528 0.08823144 -0.9894681 -0.07647973 0.05880939 -0.9953354 -0.05047833 0.03882008 -0.9979705 -0.03201413 0.02462863 -0.999184 -0.01846373 0.01419115 -0.9997289 -0.008240044 0.006317377 -0.9999461 -0.6744138 0.6744138 -0.3005533 -0.5481619 0.5481619 -0.6316938 -0.3740081 0.3740081 -0.8486672 -0.2394828 0.2394828 -0.9409017 -0.1549456 0.1549456 -0.9756966 -0.1023319 0.1023319 -0.9894728 -0.06820923 0.06820923 -0.9953367 -0.04501551 0.04501551 -0.9979715 -0.02856552 0.02856552 -0.9991838 -0.01648002 0.01648002 -0.9997285 -0.007354974 0.007354974 -0.999946 -0.6050374 0.7867165 -0.1225029 -0.5814529 0.7560535 -0.3004926 -0.4726178 0.6145619 -0.631622 -0.3224698 0.4193389 -0.8486272 -0.2064928 0.2685384 -0.9408761 -0.1335819 0.1737144 -0.9756942 -0.08823144 0.1147528 -0.9894681 -0.05880939 0.07647973 -0.9953354 -0.03882008 0.05047833 -0.9979705 -0.02462863 0.03201413 -0.999184 -0.01419115 0.01846373 -0.9997289 -0.006317377 0.008240044 -0.9999461 -0.4977666 0.8586246 -0.1224426 -0.4783893 0.8251796 -0.3003705 -0.3889063 0.6708733 -0.631412 -0.2653945 0.4578482 -0.8484933 -0.1699611 0.293228 -0.9408138 -0.1099601 0.1897065 -0.9756641 -0.07263511 0.1253108 -0.9894551 -0.04840373 0.08353155 -0.9953289 -0.03195327 0.05511713 -0.9979686 -0.02026438 0.03497439 -0.9991828 -0.01168859 0.02017277 -0.9997282 -0.005218684 0.009002983 -0.9999459 -0.3666595 0.8806055 -0.3001579 -0.2981432 0.7161359 -0.6310785 -0.2035015 0.4888859 -0.8482792 -0.1303462 0.3131545 -0.9407148 -0.0843231 0.2026135 -0.9756216 -0.05569761 0.1338574 -0.9894342 -0.03714168 0.08923768 -0.9953176 -0.02450656 0.05887073 -0.9979648 -0.01553398 0.03735482 -0.9991814 -0.008972406 0.02154606 -0.9997276 -0.003997921 0.009613394 -0.9999459 -0.2580711 0.9583667 -0.1221992 -0.2480623 0.9211693 -0.2998538 -0.2017614 0.7493341 -0.6307066 -0.1377317 0.5117406 -0.8480281 -0.08823126 0.3278383 -0.9406048 -0.05707061 0.2121379 -0.9755719 -0.03772097 0.1401414 -0.9894129 -0.02511698 0.09341806 -0.9953101 -0.01657164 0.06164771 -0.9979605 -0.01052886 0.03912478 -0.9991789 -0.006073176 0.02258372 -0.9997265 -0.002685606 0.01007115 -0.9999458 -0.1298872 0.9839816 -0.122105 -0.1248548 0.9458572 -0.2996089 -0.1015667 0.7696244 -0.6303669 -0.06934034 0.5257599 -0.8478021 -0.04443514 0.3368953 -0.9404931 -0.02874934 0.2180007 -0.9755252 -0.01898276 0.1440188 -0.9893929 -0.01263499 0.09601414 -0.9952998 -0.008331775 0.06335842 -0.9979562 -0.00527966 0.04019296 -0.9991781 -0.003051817 0.02319407 -0.9997264 -0.001342773 0.01034581 -0.9999457 -0.1248548 -0.9458572 -0.2996089 -0.1298872 -0.9839816 -0.122105 -0.1015686 -0.7696393 -0.6303486 0 -0.9540914 -0.2995155 -0.06934034 -0.5257599 -0.8478021 0 -0.7764127 -0.6302249 -0.04443514 -0.3368953 -0.9404931 0 -0.5304598 -0.8477101 -0.02874934 -0.2180007 -0.9755252 0 -0.3399242 -0.9404528 -0.01898276 -0.1440188 -0.9893929 0 -0.2199798 -0.9755044 -0.01263499 -0.09601414 -0.9952998 0 -0.1453297 -0.9893833 -0.008331775 -0.06335842 -0.9979562 0 -0.09686839 -0.9952973 -0.00527966 -0.04019296 -0.9991781 0 -0.06393814 -0.9979539 -0.003051817 -0.02319407 -0.9997264 0 -0.04055911 -0.9991772 -0.001342773 -0.01034581 -0.9999457 0 -0.02340769 -0.9997261 0 -0.01043736 -0.9999455 -0.2480623 -0.9211693 -0.2998538 -0.2580701 -0.9583632 -0.1222293 -0.2017614 -0.7493341 -0.6307066 -0.1377317 -0.5117406 -0.8480281 -0.08823126 -0.3278383 -0.9406048 -0.05707061 -0.2121379 -0.9755719 -0.03772097 -0.1401414 -0.9894129 -0.02511698 -0.09341806 -0.9953101 -0.01657164 -0.06164771 -0.9979605 -0.01052886 -0.03912478 -0.9991789 -0.006073176 -0.02258372 -0.9997265 -0.002685606 -0.01007115 -0.9999458 -0.3666629 -0.8806136 -0.3001301 -0.2981432 -0.7161359 -0.6310785 -0.2035015 -0.4888859 -0.8482792 -0.1303462 -0.3131545 -0.9407148 -0.0843231 -0.2026135 -0.9756216 -0.05569761 -0.1338574 -0.9894342 -0.03714168 -0.08923768 -0.9953176 -0.02450656 -0.05887073 -0.9979648 -0.01553398 -0.03735482 -0.9991814 -0.008972406 -0.02154606 -0.9997276 -0.003997921 -0.009613394 -0.9999459 -0.4783893 -0.8251796 -0.3003705 -0.4977666 -0.8586246 -0.1224426 -0.3889063 -0.6708733 -0.631412 -0.2653945 -0.4578482 -0.8484933 -0.1699611 -0.293228 -0.9408138 -0.1099601 -0.1897065 -0.9756641 -0.07263511 -0.1253108 -0.9894551 -0.04840373 -0.08353155 -0.9953289 -0.03195327 -0.05511713 -0.9979686 -0.02026438 -0.03497439 -0.9991828 -0.01168859 -0.02017277 -0.9997282 -0.005218684 -0.009002983 -0.9999459 -0.5814476 -0.7560466 -0.3005204 -0.6050374 -0.7867165 -0.1225029 -0.4726178 -0.6145619 -0.631622 -0.3224698 -0.4193389 -0.8486272 -0.2064928 -0.2685384 -0.9408761 -0.1335819 -0.1737144 -0.9756942 -0.08823144 -0.1147528 -0.9894681 -0.05880928 -0.07651007 -0.995333 -0.03882008 -0.05047833 -0.9979705 -0.02462863 -0.03201413 -0.999184 -0.01422166 -0.01846373 -0.9997285 -0.006317377 -0.008240044 -0.9999461 -0.6744138 -0.6744138 -0.3005533 -0.5481619 -0.5481619 -0.6316938 -0.3740081 -0.3740081 -0.8486672 -0.2394828 -0.2394828 -0.9409017 -0.1549456 -0.1549456 -0.9756966 -0.1023319 -0.1023319 -0.9894728 -0.06820923 -0.06820923 -0.9953367 -0.04501551 -0.04501551 -0.9979715 -0.02856552 -0.02856552 -0.9991838 -0.01648002 -0.01648002 -0.9997285 -0.007354974 -0.007354974 -0.999946 -0.7867165 -0.6050374 -0.1225029 -0.7560466 -0.5814476 -0.3005204 -0.6145619 -0.4726178 -0.631622 -0.4193389 -0.3224698 -0.8486272 -0.2685384 -0.2064928 -0.9408761 -0.1737144 -0.1335819 -0.9756942 -0.1147528 -0.08823144 -0.9894681 -0.07647973 -0.05880939 -0.9953354 -0.05047833 -0.03882008 -0.9979705 -0.03201413 -0.02462863 -0.999184 -0.01846373 -0.01419115 -0.9997289 -0.008240044 -0.006317377 -0.9999461 -0.8586246 -0.4977666 -0.1224426 -0.8251796 -0.4783893 -0.3003705 -0.6708733 -0.3889063 -0.631412 -0.4578482 -0.2653945 -0.8484933 -0.293228 -0.1699611 -0.9408138 -0.1897065 -0.1099601 -0.9756641 -0.1253108 -0.07263511 -0.9894551 -0.08353155 -0.04840373 -0.9953289 -0.05511713 -0.03195327 -0.9979686 -0.03497439 -0.02026438 -0.9991828 -0.02017277 -0.01168859 -0.9997282 -0.009002983 -0.005218684 -0.9999459 -0.8806136 -0.3666629 -0.3001301 -0.7161359 -0.2981432 -0.6310785 -0.4888859 -0.2035015 -0.8482792 -0.3131545 -0.1303462 -0.9407148 -0.2026135 -0.0843231 -0.9756216 -0.1338574 -0.05569761 -0.9894342 -0.08923768 -0.03714168 -0.9953176 -0.05887073 -0.02450656 -0.9979648 -0.03735482 -0.01553398 -0.9991814 -0.02154606 -0.008972406 -0.9997276 -0.009613394 -0.003997921 -0.9999459 -0.9583667 -0.2580711 -0.1221992 -0.9211693 -0.2480623 -0.2998538 -0.7493341 -0.2017614 -0.6307066 -0.5117406 -0.1377317 -0.8480281 -0.3278383 -0.08823126 -0.9406048 -0.2121379 -0.05707061 -0.9755719 -0.1401414 -0.03772097 -0.9894129 -0.093418 -0.02514743 -0.9953094 -0.06164771 -0.01657164 -0.9979605 -0.03912478 -0.01052886 -0.9991789 -0.02258372 -0.006073176 -0.9997265 -0.01007115 -0.002685606 -0.9999458 -0.9839816 -0.1298872 -0.122105 -0.9458572 -0.1248548 -0.2996089 -0.7696244 -0.1015667 -0.6303669 -0.5257599 -0.06934034 -0.8478021 -0.3368953 -0.04443514 -0.9404931 -0.2180007 -0.02874934 -0.9755252 -0.1440188 -0.01898276 -0.9893929 -0.09601414 -0.01263499 -0.9952998 -0.06335842 -0.008331775 -0.9979562 -0.04019296 -0.00527966 -0.9991781 -0.02319407 -0.003051817 -0.9997264 -0.01034581 -0.001342773 -0.9999457 0.9458572 -0.1248548 -0.2996089 0.9839816 -0.1298872 -0.122105 0.7696244 -0.1015667 -0.6303669 0.5257599 -0.06934034 -0.8478021 0.3368953 -0.04443514 -0.9404931 0.2180007 -0.02874934 -0.9755252 0.1440188 -0.01898276 -0.9893929 0.09601414 -0.01263499 -0.9952998 0.06335842 -0.008331775 -0.9979562 0.04019296 -0.00527966 -0.9991781 0.02319407 -0.003051817 -0.9997264 0.01034581 -0.001342773 -0.9999457 0.9211693 -0.2480623 -0.2998538 0.9583632 -0.2580701 -0.1222293 0.7493341 -0.2017614 -0.6307066 0.5117406 -0.1377317 -0.8480281 0.3278383 -0.08823126 -0.9406048 0.2121379 -0.05707061 -0.9755719 0.1401414 -0.03772097 -0.9894129 0.093418 -0.02514743 -0.9953094 0.06164771 -0.01657164 -0.9979605 0.03912478 -0.01052886 -0.9991789 0.02258372 -0.006073176 -0.9997265 0.01007115 -0.002685606 -0.9999458 0.8806136 -0.3666629 -0.3001301 0.7161359 -0.2981432 -0.6310785 0.4888859 -0.2035015 -0.8482792 0.3131545 -0.1303462 -0.9407148 0.2026135 -0.0843231 -0.9756216 0.1338574 -0.05569761 -0.9894342 0.08923768 -0.03714168 -0.9953176 0.05887073 -0.02450656 -0.9979648 0.03735482 -0.01553398 -0.9991814 0.02154606 -0.008972406 -0.9997276 0.009613394 -0.003997921 -0.9999459 0.8251796 -0.4783893 -0.3003705 0.8586246 -0.4977666 -0.1224426 0.6708733 -0.3889063 -0.631412 0.4578482 -0.2653945 -0.8484933 0.293228 -0.1699611 -0.9408138 0.1897065 -0.1099601 -0.9756641 0.1253108 -0.07263511 -0.9894551 0.08353155 -0.04840373 -0.9953289 0.05511713 -0.03195327 -0.9979686 0.03497439 -0.02026438 -0.9991828 0.02017277 -0.01168859 -0.9997282 0.009002983 -0.005218684 -0.9999459 0.7560466 -0.5814476 -0.3005204 0.7867165 -0.6050374 -0.1225029 0.6145619 -0.4726178 -0.631622 0.4193389 -0.3224698 -0.8486272 0.2685384 -0.2064928 -0.9408761 0.1737144 -0.1335819 -0.9756942 0.1147528 -0.08823144 -0.9894681 0.07647973 -0.05880939 -0.9953354 0.05047833 -0.03882008 -0.9979705 0.03201413 -0.02462863 -0.999184 0.01846373 -0.01419115 -0.9997289 0.008240044 -0.006317377 -0.9999461 0.6744138 -0.6744138 -0.3005533 0.5481619 -0.5481619 -0.6316938 0.3740081 -0.3740081 -0.8486672 0.2394828 -0.2394828 -0.9409017 0.1549456 -0.1549456 -0.9756966 0.1023319 -0.1023319 -0.9894728 0.06820923 -0.06820923 -0.9953367 0.04501551 -0.04501551 -0.9979715 0.02856552 -0.02856552 -0.9991838 0.01648002 -0.01648002 -0.9997285 0.007354974 -0.007354974 -0.999946 0.6050374 -0.7867165 -0.1225029 0.5814529 -0.7560535 -0.3004926 0.4726178 -0.6145619 -0.631622 0.3224698 -0.4193389 -0.8486272 0.2064928 -0.2685384 -0.9408761 0.1335819 -0.1737144 -0.9756942 0.08823144 -0.1147528 -0.9894681 0.05880928 -0.07651007 -0.995333 0.03882008 -0.05047833 -0.9979705 0.02462863 -0.03201413 -0.999184 0.01422166 -0.01846373 -0.9997285 0.006317377 -0.008240044 -0.9999461 0.4977666 -0.8586246 -0.1224426 0.4783893 -0.8251796 -0.3003705 0.3889063 -0.6708733 -0.631412 0.2653945 -0.4578482 -0.8484933 0.1699611 -0.293228 -0.9408138 0.1099601 -0.1897065 -0.9756641 0.07263511 -0.1253108 -0.9894551 0.04840373 -0.08353155 -0.9953289 0.03195327 -0.05511713 -0.9979686 0.02026438 -0.03497439 -0.9991828 0.01168859 -0.02017277 -0.9997282 0.005218684 -0.009002983 -0.9999459 0.3666595 -0.8806055 -0.3001579 0.2981432 -0.7161359 -0.6310785 0.2035015 -0.4888859 -0.8482792 0.1303462 -0.3131545 -0.9407148 0.0843231 -0.2026135 -0.9756216 0.05569761 -0.1338574 -0.9894342 0.03714168 -0.08923768 -0.9953176 0.02450656 -0.05887073 -0.9979648 0.01553398 -0.03735482 -0.9991814 0.008972406 -0.02154606 -0.9997276 0.003997921 -0.009613394 -0.9999459 0.2580711 -0.9583667 -0.1221992 0.2480623 -0.9211693 -0.2998538 0.2017614 -0.7493341 -0.6307066 0.1377317 -0.5117406 -0.8480281 0.08823126 -0.3278383 -0.9406048 0.05707061 -0.2121379 -0.9755719 0.03772097 -0.1401414 -0.9894129 0.02511698 -0.09341806 -0.9953101 0.01657164 -0.06164771 -0.9979605 0.01052886 -0.03912478 -0.9991789 0.006073176 -0.02258372 -0.9997265 0.002685606 -0.01007115 -0.9999458 0.1298872 -0.9839816 -0.122105 0.1248548 -0.9458572 -0.2996089 0.1015667 -0.7696244 -0.6303669 0.06934034 -0.5257599 -0.8478021 0.04443514 -0.3368953 -0.9404931 0.02874934 -0.2180007 -0.9755252 0.01898276 -0.1440188 -0.9893929 0.01263499 -0.09601414 -0.9952998 0.008331775 -0.06335842 -0.9979562 0.00527966 -0.04019296 -0.9991781 0.003051817 -0.02319407 -0.9997264 0.001342773 -0.01034581 -0.9999457 -0.001068174 0 0.9999995 0.2378364 0 -0.9713053 + + + + + + + + + + + + + + + 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 +

1 0 3 1 0 2 4 3 2 4 1 0 6 5 5 6 4 3 8 7 7 8 6 5 10 9 9 10 8 7 12 11 11 12 10 9 14 13 13 14 12 11 16 15 15 16 14 13 18 17 17 18 16 15 18 17 21 19 19 20 20 21 23 22 21 19 22 23 25 24 23 22 27 25 0 2 26 26 28 27 1 0 27 25 29 28 4 3 28 27 30 29 6 5 29 28 31 30 8 7 30 29 32 31 10 9 31 30 33 32 12 11 32 31 34 33 14 13 33 32 35 34 16 15 34 33 35 34 20 21 18 17 36 35 22 23 20 21 37 36 24 37 22 23 40 38 26 26 39 39 41 40 27 25 40 38 42 41 28 27 41 40 43 42 29 28 42 41 44 43 30 29 43 42 45 44 31 30 44 43 46 45 32 31 45 44 47 46 33 32 46 45 48 47 34 33 47 46 48 47 36 35 35 34 49 48 37 36 36 35 50 49 38 50 37 36 53 51 39 39 52 52 54 53 40 38 53 51 55 54 41 40 54 53 56 55 42 41 55 54 57 56 43 42 56 55 58 57 44 43 57 56 59 58 45 44 58 57 60 59 46 45 59 58 61 60 47 46 60 59 61 60 49 48 48 47 62 61 50 49 49 48 63 62 51 63 50 49 66 64 52 52 65 65 67 66 53 51 66 64 68 67 54 53 67 66 69 68 55 54 68 67 70 69 56 55 69 68 71 70 57 56 70 69 72 71 58 57 71 70 73 72 59 58 72 71 74 73 60 59 73 72 74 73 62 61 61 60 75 74 63 62 62 61 76 75 64 76 63 62 79 77 65 65 78 78 80 79 66 64 79 77 81 80 67 66 80 79 82 81 68 67 81 80 83 82 69 68 82 81 84 83 70 69 83 82 85 84 71 70 84 83 86 85 72 71 85 84 87 86 73 72 86 85 87 86 75 74 74 73 88 87 76 75 75 74 89 88 77 89 76 75 91 90 79 77 78 78 92 91 80 79 79 77 93 92 81 80 80 79 94 93 82 81 81 80 95 94 83 82 82 81 96 95 84 83 83 82 97 96 85 84 84 83 98 97 86 85 85 84 99 98 87 86 86 85 101 99 87 86 100 100 102 101 88 87 101 99 103 102 89 88 102 101 104 103 92 91 91 90 105 104 93 92 92 91 106 105 94 93 93 92 107 106 95 94 94 93 108 107 96 95 95 94 109 108 97 96 96 95 110 109 98 97 97 96 111 110 99 98 98 97 112 111 100 100 99 98 114 112 100 100 113 113 115 114 101 99 114 112 116 115 102 101 115 114 117 116 105 104 104 103 118 117 106 105 105 104 119 118 107 106 106 105 120 119 108 107 107 106 121 120 109 108 108 107 122 121 110 109 109 108 123 122 111 110 110 109 124 123 112 111 111 110 125 124 113 113 112 111 127 125 113 113 126 126 128 127 114 112 127 125 129 128 115 114 128 127 130 129 118 117 117 116 131 130 119 118 118 117 132 131 120 119 119 118 133 132 121 120 120 119 134 133 122 121 121 120 135 134 123 122 122 121 136 135 124 123 123 122 137 136 125 124 124 123 138 137 126 126 125 124 140 138 126 126 139 139 141 140 127 125 140 138 142 141 128 127 141 140 143 142 131 130 130 129 144 143 132 131 131 130 145 144 133 132 132 131 146 145 134 133 133 132 147 146 135 134 134 133 148 147 136 135 135 134 149 148 137 136 136 135 150 149 138 137 137 136 151 150 139 139 138 137 153 151 139 139 152 152 154 153 140 138 153 151 155 154 141 140 154 153 156 155 144 143 143 142 157 156 145 144 144 143 158 157 146 145 145 144 159 158 147 146 146 145 160 159 148 147 147 146 161 160 149 148 148 147 162 161 150 149 149 148 163 162 151 150 150 149 164 163 152 152 151 150 166 164 152 152 165 165 167 166 153 151 166 164 168 167 154 153 167 166 170 168 172 169 169 170 173 171 171 172 170 168 175 173 174 174 173 171 177 175 176 176 175 173 179 177 178 178 177 175 181 179 180 180 179 177 183 181 182 182 181 179 185 183 184 184 183 181 187 185 186 186 185 183 187 185 190 187 188 188 189 189 192 190 190 187 191 191 194 192 192 190 196 193 169 170 195 194 197 195 170 168 196 193 198 196 173 171 197 195 199 197 175 173 198 196 200 198 177 175 199 197 201 199 179 177 200 198 202 200 181 179 201 199 203 201 183 181 202 200 204 202 185 183 203 201 204 202 189 189 187 185 205 203 191 191 189 189 206 204 193 205 191 191 209 206 195 194 208 207 210 208 196 193 209 206 211 209 197 195 210 208 212 210 198 196 211 209 213 211 199 197 212 210 214 212 200 198 213 211 215 213 201 199 214 212 216 214 202 200 215 213 217 215 203 201 216 214 217 215 205 203 204 202 218 216 206 204 205 203 219 217 207 218 206 204 222 219 208 207 221 220 223 221 209 206 222 219 224 222 210 208 223 221 225 223 211 209 224 222 226 224 212 210 225 223 227 225 213 211 226 224 228 226 214 212 227 225 229 227 215 213 228 226 230 228 216 214 229 227 230 228 218 216 217 215 231 229 219 217 218 216 232 230 220 231 219 217 235 232 221 220 234 233 236 234 222 219 235 232 237 235 223 221 236 234 238 236 224 222 237 235 239 237 225 223 238 236 240 238 226 224 239 237 241 239 227 225 240 238 242 240 228 226 241 239 243 241 229 227 242 240 243 241 231 229 230 228 244 242 232 230 231 229 245 243 233 244 232 230 248 245 234 233 247 246 249 247 235 232 248 245 250 248 236 234 249 247 251 249 237 235 250 248 252 250 238 236 251 249 253 251 239 237 252 250 254 252 240 238 253 251 255 253 241 239 254 252 256 254 242 240 255 253 256 254 244 242 243 241 257 255 245 243 244 242 258 256 246 257 245 243 260 258 248 245 247 246 261 259 249 247 248 245 262 260 250 248 249 247 263 261 251 249 250 248 264 262 252 250 251 249 265 263 253 251 252 250 266 264 254 252 253 251 267 265 255 253 254 252 268 266 256 254 255 253 270 267 256 254 269 268 271 269 257 255 270 267 272 270 258 256 271 269 273 271 261 259 260 258 274 272 262 260 261 259 275 273 263 261 262 260 276 274 264 262 263 261 277 275 265 263 264 262 278 276 266 264 265 263 279 277 267 265 266 264 280 278 268 266 267 265 281 279 269 268 268 266 283 280 269 268 282 281 284 282 270 267 283 280 285 283 271 269 284 282 286 284 274 272 273 271 287 285 275 273 274 272 288 286 276 274 275 273 289 287 277 275 276 274 290 288 278 276 277 275 291 289 279 277 278 276 292 290 280 278 279 277 293 291 281 279 280 278 294 292 282 281 281 279 296 293 282 281 295 294 297 295 283 280 296 293 298 296 284 282 297 295 299 297 287 285 286 284 300 298 288 286 287 285 301 299 289 287 288 286 302 300 290 288 289 287 303 301 291 289 290 288 304 302 292 290 291 289 305 303 293 291 292 290 306 304 294 292 293 291 307 305 295 294 294 292 309 306 295 294 308 307 310 308 296 293 309 306 311 309 297 295 310 308 312 310 300 298 299 297 313 311 301 299 300 298 314 312 302 300 301 299 315 313 303 301 302 300 316 314 304 302 303 301 317 315 305 303 304 302 318 316 306 304 305 303 319 317 307 305 306 304 320 318 308 307 307 305 322 319 308 307 321 320 323 321 309 306 322 319 324 322 310 308 323 321 3 1 313 311 312 310 2 4 314 312 313 311 5 6 315 313 314 312 7 8 316 314 315 313 9 10 317 315 316 314 11 12 318 316 317 315 13 14 319 317 318 316 15 16 320 318 319 317 17 18 321 320 320 318 21 19 321 320 19 20 23 22 322 319 21 19 25 24 323 321 23 22 326 323 328 324 325 325 329 326 327 327 326 323 331 328 330 329 329 326 333 330 332 331 331 328 335 332 334 333 333 330 337 334 336 335 335 332 339 336 338 337 337 334 341 338 340 339 339 336 343 340 342 341 341 338 343 340 346 342 344 343 345 344 348 345 346 342 347 346 350 347 348 345 352 348 325 325 351 349 353 350 326 323 352 348 354 351 329 326 353 350 355 352 331 328 354 351 356 353 333 330 355 352 357 354 335 332 356 353 358 355 337 334 357 354 359 356 339 336 358 355 360 357 341 338 359 356 360 357 345 344 343 340 361 358 347 346 345 344 362 359 349 360 347 346 365 361 351 349 364 362 366 363 352 348 365 361 367 364 353 350 366 363 368 365 354 351 367 364 369 366 355 352 368 365 370 367 356 353 369 366 371 368 357 354 370 367 372 369 358 355 371 368 373 370 359 356 372 369 373 370 361 358 360 357 374 371 362 359 361 358 375 372 363 373 362 359 378 374 364 362 377 375 379 376 365 361 378 374 380 377 366 363 379 376 381 378 367 364 380 377 382 379 368 365 381 378 383 380 369 366 382 379 384 381 370 367 383 380 385 382 371 368 384 381 386 383 372 369 385 382 386 383 374 371 373 370 387 384 375 372 374 371 388 385 376 386 375 372 391 387 377 375 390 388 392 389 378 374 391 387 393 390 379 376 392 389 394 391 380 377 393 390 395 392 381 378 394 391 396 393 382 379 395 392 397 394 383 380 396 393 398 395 384 381 397 394 399 396 385 382 398 395 399 396 387 384 386 383 400 397 388 385 387 384 401 398 389 399 388 385 404 400 390 388 403 401 405 402 391 387 404 400 406 403 392 389 405 402 407 404 393 390 406 403 408 405 394 391 407 404 409 406 395 392 408 405 410 407 396 393 409 406 411 408 397 394 410 407 412 409 398 395 411 408 412 409 400 397 399 396 413 410 401 398 400 397 414 411 402 412 401 398 416 413 404 400 403 401 417 414 405 402 404 400 418 415 406 403 405 402 419 416 407 404 406 403 420 417 408 405 407 404 421 418 409 406 408 405 422 419 410 407 409 406 423 420 411 408 410 407 424 421 412 409 411 408 426 422 412 409 425 423 427 424 413 410 426 422 428 425 414 411 427 424 429 426 417 414 416 413 430 427 418 415 417 414 431 428 419 416 418 415 432 429 420 417 419 416 433 430 421 418 420 417 434 431 422 419 421 418 435 432 423 420 422 419 436 433 424 421 423 420 437 434 425 423 424 421 439 435 425 423 438 436 440 437 426 422 439 435 441 438 427 424 440 437 442 439 430 427 429 426 443 440 431 428 430 427 444 441 432 429 431 428 445 442 433 430 432 429 446 443 434 431 433 430 447 444 435 432 434 431 448 445 436 433 435 432 449 446 437 434 436 433 450 447 438 436 437 434 452 448 438 436 451 449 453 450 439 435 452 448 454 451 440 437 453 450 455 452 443 440 442 439 456 453 444 441 443 440 457 454 445 442 444 441 458 455 446 443 445 442 459 456 447 444 446 443 460 457 448 445 447 444 461 458 449 446 448 445 462 459 450 447 449 446 463 460 451 449 450 447 465 461 451 449 464 462 466 463 452 448 465 461 467 464 453 450 466 463 468 465 456 453 455 452 469 466 457 454 456 453 470 467 458 455 457 454 471 468 459 456 458 455 472 469 460 457 459 456 473 470 461 458 460 457 474 471 462 459 461 458 475 472 463 460 462 459 476 473 464 462 463 460 478 474 464 462 477 475 479 476 465 461 478 474 480 477 466 463 479 476 172 169 469 466 468 465 171 172 470 467 469 466 174 174 471 468 470 467 176 176 472 469 471 468 178 178 473 470 472 469 180 180 474 471 473 470 182 182 475 472 474 471 184 184 476 473 475 472 186 186 477 475 476 473 190 187 477 475 188 188 192 190 478 474 190 187 194 192 479 476 192 190 482 478 156 155 481 479 483 480 157 156 482 478 484 481 158 157 483 480 485 482 159 158 484 481 486 483 160 159 485 482 487 484 161 160 486 483 488 485 162 161 487 484 489 486 163 162 488 485 490 487 164 163 489 486 490 487 166 164 165 165 491 488 167 166 166 164 492 489 168 167 167 166 495 490 481 479 494 491 496 492 482 478 495 490 497 493 483 480 496 492 498 494 484 481 497 493 499 495 485 482 498 494 500 496 486 483 499 495 501 497 487 484 500 496 502 498 488 485 501 497 503 499 489 486 502 498 503 499 491 488 490 487 504 500 492 489 491 488 505 501 493 502 492 489 508 503 494 491 507 504 509 505 495 490 508 503 510 506 496 492 509 505 511 507 497 493 510 506 512 508 498 494 511 507 513 509 499 495 512 508 514 510 500 496 513 509 515 511 501 497 514 510 516 512 502 498 515 511 516 512 504 500 503 499 517 513 505 501 504 500 518 514 506 515 505 501 521 516 507 504 520 517 522 518 508 503 521 516 523 519 509 505 522 518 524 520 510 506 523 519 525 521 511 507 524 520 526 522 512 508 525 521 527 523 513 509 526 522 528 524 514 510 527 523 529 525 515 511 528 524 529 525 517 513 516 512 530 526 518 514 517 513 531 527 519 528 518 514 534 529 520 517 533 530 535 531 521 516 534 529 536 532 522 518 535 531 537 533 523 519 536 532 538 534 524 520 537 533 539 535 525 521 538 534 540 536 526 522 539 535 541 537 527 523 540 536 542 538 528 524 541 537 542 538 530 526 529 525 543 539 531 527 530 526 544 540 532 541 531 527 547 542 533 530 546 543 548 544 534 529 547 542 549 545 535 531 548 544 550 546 536 532 549 545 551 547 537 533 550 546 552 548 538 534 551 547 553 549 539 535 552 548 554 550 540 536 553 549 555 551 541 537 554 550 555 551 543 539 542 538 556 552 544 540 543 539 557 553 545 554 544 540 559 555 547 542 546 543 560 556 548 544 547 542 561 557 549 545 548 544 562 558 550 546 549 545 563 559 551 547 550 546 564 560 552 548 551 547 565 561 553 549 552 548 566 562 554 550 553 549 567 563 555 551 554 550 569 564 555 551 568 565 570 566 556 552 569 564 571 567 557 553 570 566 572 568 560 556 559 555 573 569 561 557 560 556 574 570 562 558 561 557 575 571 563 559 562 558 576 572 564 560 563 559 577 573 565 561 564 560 578 574 566 562 565 561 579 575 567 563 566 562 580 576 568 565 567 563 582 577 568 565 581 578 583 579 569 564 582 577 584 580 570 566 583 579 585 581 573 569 572 568 586 582 574 570 573 569 587 583 575 571 574 570 588 584 576 572 575 571 589 585 577 573 576 572 590 586 578 574 577 573 591 587 579 575 578 574 592 588 580 576 579 575 593 589 581 578 580 576 595 590 581 578 594 591 596 592 582 577 595 590 597 593 583 579 596 592 598 594 586 582 585 581 599 595 587 583 586 582 600 596 588 584 587 583 601 597 589 585 588 584 602 598 590 586 589 585 603 599 591 587 590 586 604 600 592 588 591 587 605 601 593 589 592 588 606 602 594 591 593 589 608 603 594 591 607 604 609 605 595 590 608 603 610 606 596 592 609 605 611 607 599 595 598 594 612 608 600 596 599 595 613 609 601 597 600 596 614 610 602 598 601 597 615 611 603 599 602 598 616 612 604 600 603 599 617 613 605 601 604 600 618 614 606 602 605 601 619 615 607 604 606 602 621 616 607 604 620 617 622 618 608 603 621 616 623 619 609 605 622 618 328 324 612 608 611 607 327 327 613 609 612 608 330 329 614 610 613 609 332 331 615 611 614 610 334 333 616 612 615 611 336 335 617 613 616 612 338 337 618 614 617 613 340 339 619 615 618 614 342 341 620 617 619 615 346 342 620 617 344 343 348 345 621 616 346 342 350 347 622 618 348 345 625 620 627 621 624 622 628 623 626 624 625 620 630 625 629 626 628 623 632 627 631 628 630 625 634 629 633 630 632 627 636 631 635 632 634 629 638 633 637 634 636 631 640 635 639 636 638 633 642 637 641 638 640 635 644 639 643 640 642 637 646 641 645 642 644 639 0 2 647 643 646 641 649 644 624 622 648 645 650 646 625 620 649 644 651 647 628 623 650 646 652 648 630 625 651 647 653 649 632 627 652 648 654 650 634 629 653 649 655 651 636 631 654 650 656 652 638 633 655 651 657 653 640 635 656 652 658 654 642 637 657 653 659 655 644 639 658 654 26 26 646 641 659 655 661 656 648 645 660 657 662 658 649 644 661 656 663 659 650 646 662 658 664 660 651 647 663 659 665 661 652 648 664 660 666 662 653 649 665 661 667 663 654 650 666 662 668 664 655 651 667 663 669 665 656 652 668 664 670 666 657 653 669 665 671 667 658 654 670 666 39 39 659 655 671 667 673 668 660 657 672 669 674 670 661 656 673 668 675 671 662 658 674 670 676 672 663 659 675 671 677 673 664 660 676 672 678 674 665 661 677 673 679 675 666 662 678 674 680 676 667 663 679 675 681 677 668 664 680 676 682 678 669 665 681 677 683 679 670 666 682 678 52 52 671 667 683 679 685 680 672 669 684 681 686 682 673 668 685 680 687 683 674 670 686 682 688 684 675 671 687 683 689 685 676 672 688 684 690 686 677 673 689 685 691 687 678 674 690 686 692 688 679 675 691 687 693 689 680 676 692 688 694 690 681 677 693 689 695 691 682 678 694 690 65 65 683 679 695 691 697 692 684 681 696 693 698 694 685 680 697 692 699 695 686 682 698 694 700 696 687 683 699 695 701 697 688 684 700 696 702 698 689 685 701 697 703 699 690 686 702 698 704 700 691 687 703 699 705 701 692 688 704 700 706 702 693 689 705 701 707 703 694 690 706 702 78 78 695 691 707 703 708 704 697 692 696 693 709 705 698 694 697 692 710 706 699 695 698 694 711 707 700 696 699 695 712 708 701 697 700 696 713 709 702 698 701 697 714 710 703 699 702 698 715 711 704 700 703 699 716 712 705 701 704 700 717 713 706 702 705 701 718 714 707 703 706 702 719 715 78 78 707 703 720 716 709 705 708 704 721 717 710 706 709 705 722 718 711 707 710 706 723 719 712 708 711 707 724 720 713 709 712 708 725 721 714 710 713 709 726 722 715 711 714 710 727 723 716 712 715 711 728 724 717 713 716 712 729 725 718 714 717 713 730 726 719 715 718 714 731 727 91 90 719 715 732 728 721 717 720 716 733 729 722 718 721 717 734 730 723 719 722 718 735 731 724 720 723 719 736 732 725 721 724 720 737 733 726 722 725 721 738 734 727 723 726 722 739 735 728 724 727 723 740 736 729 725 728 724 741 737 730 726 729 725 742 738 731 727 730 726 743 739 104 103 731 727 744 740 733 729 732 728 745 741 734 730 733 729 746 742 735 731 734 730 747 743 736 732 735 731 748 744 737 733 736 732 749 745 738 734 737 733 750 746 739 735 738 734 751 747 740 736 739 735 752 748 741 737 740 736 753 749 742 738 741 737 754 750 743 739 742 738 755 751 117 116 743 739 756 752 745 741 744 740 757 753 746 742 745 741 758 754 747 743 746 742 759 755 748 744 747 743 760 756 749 745 748 744 761 757 750 746 749 745 762 758 751 747 750 746 763 759 752 748 751 747 764 760 753 749 752 748 765 761 754 750 753 749 766 762 755 751 754 750 767 763 130 129 755 751 768 764 757 753 756 752 769 765 758 754 757 753 770 766 759 755 758 754 771 767 760 756 759 755 772 768 761 757 760 756 773 769 762 758 761 757 774 770 763 759 762 758 775 771 764 760 763 759 776 772 765 761 764 760 777 773 766 762 765 761 778 774 767 763 766 762 779 775 143 142 767 763 781 776 783 777 780 778 784 779 782 780 781 776 786 781 785 782 784 779 788 783 787 784 786 781 790 785 789 786 788 783 792 787 791 788 790 785 794 789 793 790 792 787 796 791 795 792 794 789 798 793 797 794 796 791 800 795 799 796 798 793 802 797 801 798 800 795 169 170 803 799 802 797 805 800 780 778 804 801 806 802 781 776 805 800 807 803 784 779 806 802 808 804 786 781 807 803 809 805 788 783 808 804 810 806 790 785 809 805 811 807 792 787 810 806 812 808 794 789 811 807 813 809 796 791 812 808 814 810 798 793 813 809 815 811 800 795 814 810 195 194 802 797 815 811 817 812 804 801 816 813 818 814 805 800 817 812 819 815 806 802 818 814 820 816 807 803 819 815 821 817 808 804 820 816 822 818 809 805 821 817 823 819 810 806 822 818 824 820 811 807 823 819 825 821 812 808 824 820 826 822 813 809 825 821 827 823 814 810 826 822 208 207 815 811 827 823 829 824 816 813 828 825 830 826 817 812 829 824 831 827 818 814 830 826 832 828 819 815 831 827 833 829 820 816 832 828 834 830 821 817 833 829 835 831 822 818 834 830 836 832 823 819 835 831 837 833 824 820 836 832 838 834 825 821 837 833 839 835 826 822 838 834 221 220 827 823 839 835 841 836 828 825 840 837 842 838 829 824 841 836 843 839 830 826 842 838 844 840 831 827 843 839 845 841 832 828 844 840 846 842 833 829 845 841 847 843 834 830 846 842 848 844 835 831 847 843 849 845 836 832 848 844 850 846 837 833 849 845 851 847 838 834 850 846 234 233 839 835 851 847 853 848 840 837 852 849 854 850 841 836 853 848 855 851 842 838 854 850 856 852 843 839 855 851 857 853 844 840 856 852 858 854 845 841 857 853 859 855 846 842 858 854 860 856 847 843 859 855 861 857 848 844 860 856 862 858 849 845 861 857 863 859 850 846 862 858 247 246 851 847 863 859 864 860 853 848 852 849 865 861 854 850 853 848 866 862 855 851 854 850 867 863 856 852 855 851 868 864 857 853 856 852 869 865 858 854 857 853 870 866 859 855 858 854 871 867 860 856 859 855 872 868 861 857 860 856 873 869 862 858 861 857 874 870 863 859 862 858 875 871 247 246 863 859 876 872 865 861 864 860 877 873 866 862 865 861 878 874 867 863 866 862 879 875 868 864 867 863 880 876 869 865 868 864 881 877 870 866 869 865 882 878 871 867 870 866 883 879 872 868 871 867 884 880 873 869 872 868 885 881 874 870 873 869 886 882 875 871 874 870 887 883 260 258 875 871 888 884 877 873 876 872 889 885 878 874 877 873 890 886 879 875 878 874 891 887 880 876 879 875 892 888 881 877 880 876 893 889 882 878 881 877 894 890 883 879 882 878 895 891 884 880 883 879 896 892 885 881 884 880 897 893 886 882 885 881 898 894 887 883 886 882 899 895 273 271 887 883 900 896 889 885 888 884 901 897 890 886 889 885 902 898 891 887 890 886 903 899 892 888 891 887 904 900 893 889 892 888 905 901 894 890 893 889 906 902 895 891 894 890 907 903 896 892 895 891 908 904 897 893 896 892 909 905 898 894 897 893 910 906 899 895 898 894 911 907 286 284 899 895 912 908 901 897 900 896 913 909 902 898 901 897 914 910 903 899 902 898 915 911 904 900 903 899 916 912 905 901 904 900 917 913 906 902 905 901 918 914 907 903 906 902 919 915 908 904 907 903 920 916 909 905 908 904 921 917 910 906 909 905 922 918 911 907 910 906 923 919 299 297 911 907 627 621 913 909 912 908 626 624 914 910 913 909 629 626 915 911 914 910 631 628 916 912 915 911 633 630 917 913 916 912 635 632 918 914 917 913 637 634 919 915 918 914 639 636 920 916 919 915 641 638 921 917 920 916 643 640 922 918 921 917 645 642 923 919 922 918 647 643 312 310 923 919 925 920 927 921 924 922 928 923 926 924 925 920 930 925 929 926 928 923 932 927 931 928 930 925 934 929 933 930 932 927 936 931 935 932 934 929 938 933 937 934 936 931 940 935 939 936 938 933 942 937 941 938 940 935 944 939 943 940 942 937 946 941 945 942 944 939 325 325 947 943 946 941 949 944 924 922 948 945 950 946 925 920 949 944 951 947 928 923 950 946 952 948 930 925 951 947 953 949 932 927 952 948 954 950 934 929 953 949 955 951 936 931 954 950 956 952 938 933 955 951 957 953 940 935 956 952 958 954 942 937 957 953 959 955 944 939 958 954 351 349 946 941 959 955 961 956 948 945 960 957 962 958 949 944 961 956 963 959 950 946 962 958 964 960 951 947 963 959 965 961 952 948 964 960 966 962 953 949 965 961 967 963 954 950 966 962 968 964 955 951 967 963 969 965 956 952 968 964 970 966 957 953 969 965 971 967 958 954 970 966 364 362 959 955 971 967 973 968 960 957 972 969 974 970 961 956 973 968 975 971 962 958 974 970 976 972 963 959 975 971 977 973 964 960 976 972 978 974 965 961 977 973 979 975 966 962 978 974 980 976 967 963 979 975 981 977 968 964 980 976 982 978 969 965 981 977 983 979 970 966 982 978 377 375 971 967 983 979 985 980 972 969 984 981 986 982 973 968 985 980 987 983 974 970 986 982 988 984 975 971 987 983 989 985 976 972 988 984 990 986 977 973 989 985 991 987 978 974 990 986 992 988 979 975 991 987 993 989 980 976 992 988 994 990 981 977 993 989 995 991 982 978 994 990 390 388 983 979 995 991 997 992 984 981 996 993 998 994 985 980 997 992 999 995 986 982 998 994 1000 996 987 983 999 995 1001 997 988 984 1000 996 1002 998 989 985 1001 997 1003 999 990 986 1002 998 1004 1000 991 987 1003 999 1005 1001 992 988 1004 1000 1006 1002 993 989 1005 1001 1007 1003 994 990 1006 1002 403 401 995 991 1007 1003 1008 1004 997 992 996 993 1009 1005 998 994 997 992 1010 1006 999 995 998 994 1011 1007 1000 996 999 995 1012 1008 1001 997 1000 996 1013 1009 1002 998 1001 997 1014 1010 1003 999 1002 998 1015 1011 1004 1000 1003 999 1016 1012 1005 1001 1004 1000 1017 1013 1006 1002 1005 1001 1018 1014 1007 1003 1006 1002 1019 1015 403 401 1007 1003 1020 1016 1009 1005 1008 1004 1021 1017 1010 1006 1009 1005 1022 1018 1011 1007 1010 1006 1023 1019 1012 1008 1011 1007 1024 1020 1013 1009 1012 1008 1025 1021 1014 1010 1013 1009 1026 1022 1015 1011 1014 1010 1027 1023 1016 1012 1015 1011 1028 1024 1017 1013 1016 1012 1029 1025 1018 1014 1017 1013 1030 1026 1019 1015 1018 1014 1031 1027 416 413 1019 1015 1032 1028 1021 1017 1020 1016 1033 1029 1022 1018 1021 1017 1034 1030 1023 1019 1022 1018 1035 1031 1024 1020 1023 1019 1036 1032 1025 1021 1024 1020 1037 1033 1026 1022 1025 1021 1038 1034 1027 1023 1026 1022 1039 1035 1028 1024 1027 1023 1040 1036 1029 1025 1028 1024 1041 1037 1030 1026 1029 1025 1042 1038 1031 1027 1030 1026 1043 1039 429 426 1031 1027 1044 1040 1033 1029 1032 1028 1045 1041 1034 1030 1033 1029 1046 1042 1035 1031 1034 1030 1047 1043 1036 1032 1035 1031 1048 1044 1037 1033 1036 1032 1049 1045 1038 1034 1037 1033 1050 1046 1039 1035 1038 1034 1051 1047 1040 1036 1039 1035 1052 1048 1041 1037 1040 1036 1053 1049 1042 1038 1041 1037 1054 1050 1043 1039 1042 1038 1055 1051 442 439 1043 1039 1056 1052 1045 1041 1044 1040 1057 1053 1046 1042 1045 1041 1058 1054 1047 1043 1046 1042 1059 1055 1048 1044 1047 1043 1060 1056 1049 1045 1048 1044 1061 1057 1050 1046 1049 1045 1062 1058 1051 1047 1050 1046 1063 1059 1052 1048 1051 1047 1064 1060 1053 1049 1052 1048 1065 1061 1054 1050 1053 1049 1066 1062 1055 1051 1054 1050 1067 1063 455 452 1055 1051 783 777 1057 1053 1056 1052 782 780 1058 1054 1057 1053 785 782 1059 1055 1058 1054 787 784 1060 1056 1059 1055 789 786 1061 1057 1060 1056 791 788 1062 1058 1061 1057 793 790 1063 1059 1062 1058 795 792 1064 1060 1063 1059 797 794 1065 1061 1064 1060 799 796 1066 1062 1065 1061 801 798 1067 1063 1066 1062 803 799 468 465 1067 1063 1069 1064 768 764 1068 1065 1070 1066 769 765 1069 1064 1071 1067 770 766 1070 1066 1072 1068 771 767 1071 1067 1073 1069 772 768 1072 1068 1074 1070 773 769 1073 1069 1075 1071 774 770 1074 1070 1076 1072 775 771 1075 1071 1077 1073 776 772 1076 1072 1078 1074 777 773 1077 1073 1079 1075 778 774 1078 1074 481 479 779 775 1079 1075 1081 1076 1068 1065 1080 1077 1082 1078 1069 1064 1081 1076 1083 1079 1070 1066 1082 1078 1084 1080 1071 1067 1083 1079 1085 1081 1072 1068 1084 1080 1086 1082 1073 1069 1085 1081 1087 1083 1074 1070 1086 1082 1088 1084 1075 1071 1087 1083 1089 1085 1076 1072 1088 1084 1090 1086 1077 1073 1089 1085 1091 1087 1078 1074 1090 1086 494 491 1079 1075 1091 1087 1093 1088 1080 1077 1092 1089 1094 1090 1081 1076 1093 1088 1095 1091 1082 1078 1094 1090 1096 1092 1083 1079 1095 1091 1097 1093 1084 1080 1096 1092 1098 1094 1085 1081 1097 1093 1099 1095 1086 1082 1098 1094 1100 1096 1087 1083 1099 1095 1101 1097 1088 1084 1100 1096 1102 1098 1089 1085 1101 1097 1103 1099 1090 1086 1102 1098 507 504 1091 1087 1103 1099 1105 1100 1092 1089 1104 1101 1106 1102 1093 1088 1105 1100 1107 1103 1094 1090 1106 1102 1108 1104 1095 1091 1107 1103 1109 1105 1096 1092 1108 1104 1110 1106 1097 1093 1109 1105 1111 1107 1098 1094 1110 1106 1112 1108 1099 1095 1111 1107 1113 1109 1100 1096 1112 1108 1114 1110 1101 1097 1113 1109 1115 1111 1102 1098 1114 1110 520 517 1103 1099 1115 1111 1117 1112 1104 1101 1116 1113 1118 1114 1105 1100 1117 1112 1119 1115 1106 1102 1118 1114 1120 1116 1107 1103 1119 1115 1121 1117 1108 1104 1120 1116 1122 1118 1109 1105 1121 1117 1123 1119 1110 1106 1122 1118 1124 1120 1111 1107 1123 1119 1125 1121 1112 1108 1124 1120 1126 1122 1113 1109 1125 1121 1127 1123 1114 1110 1126 1122 533 530 1115 1111 1127 1123 1129 1124 1116 1113 1128 1125 1130 1126 1117 1112 1129 1124 1131 1127 1118 1114 1130 1126 1132 1128 1119 1115 1131 1127 1133 1129 1120 1116 1132 1128 1134 1130 1121 1117 1133 1129 1135 1131 1122 1118 1134 1130 1136 1132 1123 1119 1135 1131 1137 1133 1124 1120 1136 1132 1138 1134 1125 1121 1137 1133 1139 1135 1126 1122 1138 1134 546 543 1127 1123 1139 1135 1140 1136 1129 1124 1128 1125 1141 1137 1130 1126 1129 1124 1142 1138 1131 1127 1130 1126 1143 1139 1132 1128 1131 1127 1144 1140 1133 1129 1132 1128 1145 1141 1134 1130 1133 1129 1146 1142 1135 1131 1134 1130 1147 1143 1136 1132 1135 1131 1148 1144 1137 1133 1136 1132 1149 1145 1138 1134 1137 1133 1150 1146 1139 1135 1138 1134 1151 1147 546 543 1139 1135 1152 1148 1141 1137 1140 1136 1153 1149 1142 1138 1141 1137 1154 1150 1143 1139 1142 1138 1155 1151 1144 1140 1143 1139 1156 1152 1145 1141 1144 1140 1157 1153 1146 1142 1145 1141 1158 1154 1147 1143 1146 1142 1159 1155 1148 1144 1147 1143 1160 1156 1149 1145 1148 1144 1161 1157 1150 1146 1149 1145 1162 1158 1151 1147 1150 1146 1163 1159 559 555 1151 1147 1164 1160 1153 1149 1152 1148 1165 1161 1154 1150 1153 1149 1166 1162 1155 1151 1154 1150 1167 1163 1156 1152 1155 1151 1168 1164 1157 1153 1156 1152 1169 1165 1158 1154 1157 1153 1170 1166 1159 1155 1158 1154 1171 1167 1160 1156 1159 1155 1172 1168 1161 1157 1160 1156 1173 1169 1162 1158 1161 1157 1174 1170 1163 1159 1162 1158 1175 1171 572 568 1163 1159 1176 1172 1165 1161 1164 1160 1177 1173 1166 1162 1165 1161 1178 1174 1167 1163 1166 1162 1179 1175 1168 1164 1167 1163 1180 1176 1169 1165 1168 1164 1181 1177 1170 1166 1169 1165 1182 1178 1171 1167 1170 1166 1183 1179 1172 1168 1171 1167 1184 1180 1173 1169 1172 1168 1185 1181 1174 1170 1173 1169 1186 1182 1175 1171 1174 1170 1187 1183 585 581 1175 1171 1188 1184 1177 1173 1176 1172 1189 1185 1178 1174 1177 1173 1190 1186 1179 1175 1178 1174 1191 1187 1180 1176 1179 1175 1192 1188 1181 1177 1180 1176 1193 1189 1182 1178 1181 1177 1194 1190 1183 1179 1182 1178 1195 1191 1184 1180 1183 1179 1196 1192 1185 1181 1184 1180 1197 1193 1186 1182 1185 1181 1198 1194 1187 1183 1186 1182 1199 1195 598 594 1187 1183 927 921 1189 1185 1188 1184 926 924 1190 1186 1189 1185 929 926 1191 1187 1190 1186 931 928 1192 1188 1191 1187 933 930 1193 1189 1192 1188 935 932 1194 1190 1193 1189 937 934 1195 1191 1194 1190 939 936 1196 1192 1195 1191 941 938 1197 1193 1196 1192 943 940 1198 1194 1197 1193 945 942 1199 1195 1198 1194 947 943 611 607 1199 1195 1200 1196 1202 1197 1203 1198 1201 1199 1205 1200 1202 1197 1204 1201 1207 1202 1205 1200 1206 1203 1209 1204 1207 1202 1208 1205 1211 1206 1209 1204 1210 1207 1213 1208 1211 1206 1212 1209 1215 1210 1213 1208 1214 1211 1217 1212 1215 1210 1216 1213 1219 1214 1217 1212 1218 1215 1221 1216 1219 1214 1220 1217 1223 1218 1221 1216 1222 1219 627 621 1223 1218 1224 1220 1201 1199 1200 1196 1225 1221 1204 1201 1201 1199 1226 1222 1206 1203 1204 1201 1227 1223 1208 1205 1206 1203 1228 1224 1210 1207 1208 1205 1229 1225 1212 1209 1210 1207 1230 1226 1214 1211 1212 1209 1231 1227 1216 1213 1214 1211 1232 1228 1218 1215 1216 1213 1233 1229 1220 1217 1218 1215 1234 1230 1222 1219 1220 1217 1235 1231 624 622 1222 1219 1236 1232 1225 1221 1224 1220 1237 1233 1226 1222 1225 1221 1238 1234 1227 1223 1226 1222 1239 1235 1228 1224 1227 1223 1240 1236 1229 1225 1228 1224 1241 1237 1230 1226 1229 1225 1242 1238 1231 1227 1230 1226 1243 1239 1232 1228 1231 1227 1244 1240 1233 1229 1232 1228 1245 1241 1234 1230 1233 1229 1246 1242 1235 1231 1234 1230 1247 1243 648 645 1235 1231 1248 1244 1237 1233 1236 1232 1249 1245 1238 1234 1237 1233 1250 1246 1239 1235 1238 1234 1251 1247 1240 1236 1239 1235 1252 1248 1241 1237 1240 1236 1253 1249 1242 1238 1241 1237 1254 1250 1243 1239 1242 1238 1255 1251 1244 1240 1243 1239 1256 1252 1245 1241 1244 1240 1257 1253 1246 1242 1245 1241 1258 1254 1247 1243 1246 1242 1259 1255 660 657 1247 1243 1260 1256 1249 1245 1248 1244 1261 1257 1250 1246 1249 1245 1262 1258 1251 1247 1250 1246 1263 1259 1252 1248 1251 1247 1264 1260 1253 1249 1252 1248 1265 1261 1254 1250 1253 1249 1266 1262 1255 1251 1254 1250 1267 1263 1256 1252 1255 1251 1268 1264 1257 1253 1256 1252 1269 1265 1258 1254 1257 1253 1270 1266 1259 1255 1258 1254 1271 1267 672 669 1259 1255 1272 1268 1261 1257 1260 1256 1273 1269 1262 1258 1261 1257 1274 1270 1263 1259 1262 1258 1275 1271 1264 1260 1263 1259 1276 1272 1265 1261 1264 1260 1277 1273 1266 1262 1265 1261 1278 1274 1267 1263 1266 1262 1279 1275 1268 1264 1267 1263 1280 1276 1269 1265 1268 1264 1281 1277 1270 1266 1269 1265 1282 1278 1271 1267 1270 1266 1283 1279 684 681 1271 1267 1285 1280 1272 1268 1284 1281 1286 1282 1273 1269 1285 1280 1287 1283 1274 1270 1286 1282 1288 1284 1275 1271 1287 1283 1289 1285 1276 1272 1288 1284 1290 1286 1277 1273 1289 1285 1291 1287 1278 1274 1290 1286 1292 1288 1279 1275 1291 1287 1293 1289 1280 1276 1292 1288 1294 1290 1281 1277 1293 1289 1295 1291 1282 1278 1294 1290 708 704 1283 1279 1295 1291 1297 1292 1284 1281 1296 1293 1298 1294 1285 1280 1297 1292 1299 1295 1286 1282 1298 1294 1300 1296 1287 1283 1299 1295 1301 1297 1288 1284 1300 1296 1302 1298 1289 1285 1301 1297 1303 1299 1290 1286 1302 1298 1304 1300 1291 1287 1303 1299 1305 1301 1292 1288 1304 1300 1306 1302 1293 1289 1305 1301 1307 1303 1294 1290 1306 1302 720 716 1295 1291 1307 1303 1309 1304 1296 1293 1308 1305 1310 1306 1297 1292 1309 1304 1311 1307 1298 1294 1310 1306 1312 1308 1299 1295 1311 1307 1313 1309 1300 1296 1312 1308 1314 1310 1301 1297 1313 1309 1315 1311 1302 1298 1314 1310 1316 1312 1303 1299 1315 1311 1317 1313 1304 1300 1316 1312 1318 1314 1305 1301 1317 1313 1319 1315 1306 1302 1318 1314 732 728 1307 1303 1319 1315 1321 1316 1308 1305 1320 1317 1322 1318 1309 1304 1321 1316 1323 1319 1310 1306 1322 1318 1324 1320 1311 1307 1323 1319 1325 1321 1312 1308 1324 1320 1326 1322 1313 1309 1325 1321 1327 1323 1314 1310 1326 1322 1328 1324 1315 1311 1327 1323 1329 1325 1316 1312 1328 1324 1330 1326 1317 1313 1329 1325 1331 1327 1318 1314 1330 1326 744 740 1319 1315 1331 1327 1333 1328 1320 1317 1332 1329 1334 1330 1321 1316 1333 1328 1335 1331 1322 1318 1334 1330 1336 1332 1323 1319 1335 1331 1337 1333 1324 1320 1336 1332 1338 1334 1325 1321 1337 1333 1339 1335 1326 1322 1338 1334 1340 1336 1327 1323 1339 1335 1341 1337 1328 1324 1340 1336 1342 1338 1329 1325 1341 1337 1343 1339 1330 1326 1342 1338 756 752 1331 1327 1343 1339 1345 1340 1332 1329 1344 1341 1346 1342 1333 1328 1345 1340 1347 1343 1334 1330 1346 1342 1348 1344 1335 1331 1347 1343 1349 1345 1336 1332 1348 1344 1350 1346 1337 1333 1349 1345 1351 1347 1338 1334 1350 1346 1352 1348 1339 1335 1351 1347 1353 1349 1340 1336 1352 1348 1354 1350 1341 1337 1353 1349 1355 1351 1342 1338 1354 1350 768 764 1343 1339 1355 1351 1356 1352 1358 1353 1359 1354 1357 1355 1361 1356 1358 1353 1360 1357 1363 1358 1361 1356 1362 1359 1365 1360 1363 1358 1364 1361 1367 1362 1365 1360 1366 1363 1369 1364 1367 1362 1368 1365 1371 1366 1369 1364 1370 1367 1373 1368 1371 1366 1372 1369 1375 1370 1373 1368 1374 1371 1377 1372 1375 1370 1376 1373 1379 1374 1377 1372 1378 1375 783 777 1379 1374 1380 1376 1357 1355 1356 1352 1381 1377 1360 1357 1357 1355 1382 1378 1362 1359 1360 1357 1383 1379 1364 1361 1362 1359 1384 1380 1366 1363 1364 1361 1385 1381 1368 1365 1366 1363 1386 1382 1370 1367 1368 1365 1387 1383 1372 1369 1370 1367 1388 1384 1374 1371 1372 1369 1389 1385 1376 1373 1374 1371 1390 1386 1378 1375 1376 1373 1391 1387 780 778 1378 1375 1392 1388 1381 1377 1380 1376 1393 1389 1382 1378 1381 1377 1394 1390 1383 1379 1382 1378 1395 1391 1384 1380 1383 1379 1396 1392 1385 1381 1384 1380 1397 1393 1386 1382 1385 1381 1398 1394 1387 1383 1386 1382 1399 1395 1388 1384 1387 1383 1400 1396 1389 1385 1388 1384 1401 1397 1390 1386 1389 1385 1402 1398 1391 1387 1390 1386 1403 1399 804 801 1391 1387 1404 1400 1393 1389 1392 1388 1405 1401 1394 1390 1393 1389 1406 1402 1395 1391 1394 1390 1407 1403 1396 1392 1395 1391 1408 1404 1397 1393 1396 1392 1409 1405 1398 1394 1397 1393 1410 1406 1399 1395 1398 1394 1411 1407 1400 1396 1399 1395 1412 1408 1401 1397 1400 1396 1413 1409 1402 1398 1401 1397 1414 1410 1403 1399 1402 1398 1415 1411 816 813 1403 1399 1416 1412 1405 1401 1404 1400 1417 1413 1406 1402 1405 1401 1418 1414 1407 1403 1406 1402 1419 1415 1408 1404 1407 1403 1420 1416 1409 1405 1408 1404 1421 1417 1410 1406 1409 1405 1422 1418 1411 1407 1410 1406 1423 1419 1412 1408 1411 1407 1424 1420 1413 1409 1412 1408 1425 1421 1414 1410 1413 1409 1426 1422 1415 1411 1414 1410 1427 1423 828 825 1415 1411 1428 1424 1417 1413 1416 1412 1429 1425 1418 1414 1417 1413 1430 1426 1419 1415 1418 1414 1431 1427 1420 1416 1419 1415 1432 1428 1421 1417 1420 1416 1433 1429 1422 1418 1421 1417 1434 1430 1423 1419 1422 1418 1435 1431 1424 1420 1423 1419 1436 1432 1425 1421 1424 1420 1437 1433 1426 1422 1425 1421 1438 1434 1427 1423 1426 1422 1439 1435 840 837 1427 1423 1441 1436 1428 1424 1440 1437 1442 1438 1429 1425 1441 1436 1443 1439 1430 1426 1442 1438 1444 1440 1431 1427 1443 1439 1445 1441 1432 1428 1444 1440 1446 1442 1433 1429 1445 1441 1447 1443 1434 1430 1446 1442 1448 1444 1435 1431 1447 1443 1449 1445 1436 1432 1448 1444 1450 1446 1437 1433 1449 1445 1451 1447 1438 1434 1450 1446 864 860 1439 1435 1451 1447 1453 1448 1440 1437 1452 1449 1454 1450 1441 1436 1453 1448 1455 1451 1442 1438 1454 1450 1456 1452 1443 1439 1455 1451 1457 1453 1444 1440 1456 1452 1458 1454 1445 1441 1457 1453 1459 1455 1446 1442 1458 1454 1460 1456 1447 1443 1459 1455 1461 1457 1448 1444 1460 1456 1462 1458 1449 1445 1461 1457 1463 1459 1450 1446 1462 1458 876 872 1451 1447 1463 1459 1465 1460 1452 1449 1464 1461 1466 1462 1453 1448 1465 1460 1467 1463 1454 1450 1466 1462 1468 1464 1455 1451 1467 1463 1469 1465 1456 1452 1468 1464 1470 1466 1457 1453 1469 1465 1471 1467 1458 1454 1470 1466 1472 1468 1459 1455 1471 1467 1473 1469 1460 1456 1472 1468 1474 1470 1461 1457 1473 1469 1475 1471 1462 1458 1474 1470 888 884 1463 1459 1475 1471 1477 1472 1464 1461 1476 1473 1478 1474 1465 1460 1477 1472 1479 1475 1466 1462 1478 1474 1480 1476 1467 1463 1479 1475 1481 1477 1468 1464 1480 1476 1482 1478 1469 1465 1481 1477 1483 1479 1470 1466 1482 1478 1484 1480 1471 1467 1483 1479 1485 1481 1472 1468 1484 1480 1486 1482 1473 1469 1485 1481 1487 1483 1474 1470 1486 1482 900 896 1475 1471 1487 1483 1489 1484 1476 1473 1488 1485 1490 1486 1477 1472 1489 1484 1491 1487 1478 1474 1490 1486 1492 1488 1479 1475 1491 1487 1493 1489 1480 1476 1492 1488 1494 1490 1481 1477 1493 1489 1495 1491 1482 1478 1494 1490 1496 1492 1483 1479 1495 1491 1497 1493 1484 1480 1496 1492 1498 1494 1485 1481 1497 1493 1499 1495 1486 1482 1498 1494 912 908 1487 1483 1499 1495 1202 1197 1488 1485 1203 1198 1205 1200 1489 1484 1202 1197 1207 1202 1490 1486 1205 1200 1209 1204 1491 1487 1207 1202 1211 1206 1492 1488 1209 1204 1213 1208 1493 1489 1211 1206 1215 1210 1494 1490 1213 1208 1217 1212 1495 1491 1215 1210 1219 1214 1496 1492 1217 1212 1221 1216 1497 1493 1219 1214 1223 1218 1498 1494 1221 1216 627 621 1499 1495 1223 1218 1500 1496 1502 1497 1503 1498 1501 1499 1505 1500 1502 1497 1504 1501 1507 1502 1505 1500 1506 1503 1509 1504 1507 1502 1508 1505 1511 1506 1509 1504 1510 1507 1513 1508 1511 1506 1512 1509 1515 1510 1513 1508 1514 1511 1517 1512 1515 1510 1516 1513 1519 1514 1517 1512 1518 1515 1521 1516 1519 1514 1520 1517 1523 1518 1521 1516 1522 1519 927 921 1523 1518 1524 1520 1501 1499 1500 1496 1525 1521 1504 1501 1501 1499 1526 1522 1506 1503 1504 1501 1527 1523 1508 1505 1506 1503 1528 1524 1510 1507 1508 1505 1529 1525 1512 1509 1510 1507 1530 1526 1514 1511 1512 1509 1531 1527 1516 1513 1514 1511 1532 1528 1518 1515 1516 1513 1533 1529 1520 1517 1518 1515 1534 1530 1522 1519 1520 1517 1535 1531 924 922 1522 1519 1536 1532 1525 1521 1524 1520 1537 1533 1526 1522 1525 1521 1538 1534 1527 1523 1526 1522 1539 1535 1528 1524 1527 1523 1540 1536 1529 1525 1528 1524 1541 1537 1530 1526 1529 1525 1542 1538 1531 1527 1530 1526 1543 1539 1532 1528 1531 1527 1544 1540 1533 1529 1532 1528 1545 1541 1534 1530 1533 1529 1546 1542 1535 1531 1534 1530 1547 1543 948 945 1535 1531 1548 1544 1537 1533 1536 1532 1549 1545 1538 1534 1537 1533 1550 1546 1539 1535 1538 1534 1551 1547 1540 1536 1539 1535 1552 1548 1541 1537 1540 1536 1553 1549 1542 1538 1541 1537 1554 1550 1543 1539 1542 1538 1555 1551 1544 1540 1543 1539 1556 1552 1545 1541 1544 1540 1557 1553 1546 1542 1545 1541 1558 1554 1547 1543 1546 1542 1559 1555 960 957 1547 1543 1560 1556 1549 1545 1548 1544 1561 1557 1550 1546 1549 1545 1562 1558 1551 1547 1550 1546 1563 1559 1552 1548 1551 1547 1564 1560 1553 1549 1552 1548 1565 1561 1554 1550 1553 1549 1566 1562 1555 1551 1554 1550 1567 1563 1556 1552 1555 1551 1568 1564 1557 1553 1556 1552 1569 1565 1558 1554 1557 1553 1570 1566 1559 1555 1558 1554 1571 1567 972 969 1559 1555 1572 1568 1561 1557 1560 1556 1573 1569 1562 1558 1561 1557 1574 1570 1563 1559 1562 1558 1575 1571 1564 1560 1563 1559 1576 1572 1565 1561 1564 1560 1577 1573 1566 1562 1565 1561 1578 1574 1567 1563 1566 1562 1579 1575 1568 1564 1567 1563 1580 1576 1569 1565 1568 1564 1581 1577 1570 1566 1569 1565 1582 1578 1571 1567 1570 1566 1583 1579 984 981 1571 1567 1585 1580 1572 1568 1584 1581 1586 1582 1573 1569 1585 1580 1587 1583 1574 1570 1586 1582 1588 1584 1575 1571 1587 1583 1589 1585 1576 1572 1588 1584 1590 1586 1577 1573 1589 1585 1591 1587 1578 1574 1590 1586 1592 1588 1579 1575 1591 1587 1593 1589 1580 1576 1592 1588 1594 1590 1581 1577 1593 1589 1595 1591 1582 1578 1594 1590 1008 1004 1583 1579 1595 1591 1597 1592 1584 1581 1596 1593 1598 1594 1585 1580 1597 1592 1599 1595 1586 1582 1598 1594 1600 1596 1587 1583 1599 1595 1601 1597 1588 1584 1600 1596 1602 1598 1589 1585 1601 1597 1603 1599 1590 1586 1602 1598 1604 1600 1591 1587 1603 1599 1605 1601 1592 1588 1604 1600 1606 1602 1593 1589 1605 1601 1607 1603 1594 1590 1606 1602 1020 1016 1595 1591 1607 1603 1609 1604 1596 1593 1608 1605 1610 1606 1597 1592 1609 1604 1611 1607 1598 1594 1610 1606 1612 1608 1599 1595 1611 1607 1613 1609 1600 1596 1612 1608 1614 1610 1601 1597 1613 1609 1615 1611 1602 1598 1614 1610 1616 1612 1603 1599 1615 1611 1617 1613 1604 1600 1616 1612 1618 1614 1605 1601 1617 1613 1619 1615 1606 1602 1618 1614 1032 1028 1607 1603 1619 1615 1621 1616 1608 1605 1620 1617 1622 1618 1609 1604 1621 1616 1623 1619 1610 1606 1622 1618 1624 1620 1611 1607 1623 1619 1625 1621 1612 1608 1624 1620 1626 1622 1613 1609 1625 1621 1627 1623 1614 1610 1626 1622 1628 1624 1615 1611 1627 1623 1629 1625 1616 1612 1628 1624 1630 1626 1617 1613 1629 1625 1631 1627 1618 1614 1630 1626 1044 1040 1619 1615 1631 1627 1633 1628 1620 1617 1632 1629 1634 1630 1621 1616 1633 1628 1635 1631 1622 1618 1634 1630 1636 1632 1623 1619 1635 1631 1637 1633 1624 1620 1636 1632 1638 1634 1625 1621 1637 1633 1639 1635 1626 1622 1638 1634 1640 1636 1627 1623 1639 1635 1641 1637 1628 1624 1640 1636 1642 1638 1629 1625 1641 1637 1643 1639 1630 1626 1642 1638 1056 1052 1631 1627 1643 1639 1358 1353 1632 1629 1359 1354 1361 1356 1633 1628 1358 1353 1363 1358 1634 1630 1361 1356 1365 1360 1635 1631 1363 1358 1367 1362 1636 1632 1365 1360 1369 1364 1637 1633 1367 1362 1371 1366 1638 1634 1369 1364 1373 1368 1639 1635 1371 1366 1375 1370 1640 1636 1373 1368 1377 1372 1641 1637 1375 1370 1379 1374 1642 1638 1377 1372 783 777 1643 1639 1379 1374 1644 1640 1345 1340 1344 1341 1645 1641 1346 1342 1345 1340 1646 1642 1347 1343 1346 1342 1647 1643 1348 1344 1347 1343 1648 1644 1349 1345 1348 1344 1649 1645 1350 1346 1349 1345 1650 1646 1351 1347 1350 1346 1651 1647 1352 1348 1351 1347 1652 1648 1353 1349 1352 1348 1653 1649 1354 1350 1353 1349 1654 1650 1355 1351 1354 1350 1655 1651 768 764 1355 1351 1656 1652 1645 1641 1644 1640 1657 1653 1646 1642 1645 1641 1658 1654 1647 1643 1646 1642 1659 1655 1648 1644 1647 1643 1660 1656 1649 1645 1648 1644 1661 1657 1650 1646 1649 1645 1662 1658 1651 1647 1650 1646 1663 1659 1652 1648 1651 1647 1664 1660 1653 1649 1652 1648 1665 1661 1654 1650 1653 1649 1666 1662 1655 1651 1654 1650 1667 1663 1068 1065 1655 1651 1668 1664 1657 1653 1656 1652 1669 1665 1658 1654 1657 1653 1670 1666 1659 1655 1658 1654 1671 1667 1660 1656 1659 1655 1672 1668 1661 1657 1660 1656 1673 1669 1662 1658 1661 1657 1674 1670 1663 1659 1662 1658 1675 1671 1664 1660 1663 1659 1676 1672 1665 1661 1664 1660 1677 1673 1666 1662 1665 1661 1678 1674 1667 1663 1666 1662 1679 1675 1080 1077 1667 1663 1680 1676 1669 1665 1668 1664 1681 1677 1670 1666 1669 1665 1682 1678 1671 1667 1670 1666 1683 1679 1672 1668 1671 1667 1684 1680 1673 1669 1672 1668 1685 1681 1674 1670 1673 1669 1686 1682 1675 1671 1674 1670 1687 1683 1676 1672 1675 1671 1688 1684 1677 1673 1676 1672 1689 1685 1678 1674 1677 1673 1690 1686 1679 1675 1678 1674 1691 1687 1092 1089 1679 1675 1692 1688 1681 1677 1680 1676 1693 1689 1682 1678 1681 1677 1694 1690 1683 1679 1682 1678 1695 1691 1684 1680 1683 1679 1696 1692 1685 1681 1684 1680 1697 1693 1686 1682 1685 1681 1698 1694 1687 1683 1686 1682 1699 1695 1688 1684 1687 1683 1700 1696 1689 1685 1688 1684 1701 1697 1690 1686 1689 1685 1702 1698 1691 1687 1690 1686 1703 1699 1104 1101 1691 1687 1704 1700 1693 1689 1692 1688 1705 1701 1694 1690 1693 1689 1706 1702 1695 1691 1694 1690 1707 1703 1696 1692 1695 1691 1708 1704 1697 1693 1696 1692 1709 1705 1698 1694 1697 1693 1710 1706 1699 1695 1698 1694 1711 1707 1700 1696 1699 1695 1712 1708 1701 1697 1700 1696 1713 1709 1702 1698 1701 1697 1714 1710 1703 1699 1702 1698 1715 1711 1116 1113 1703 1699 1717 1712 1704 1700 1716 1713 1718 1714 1705 1701 1717 1712 1719 1715 1706 1702 1718 1714 1720 1716 1707 1703 1719 1715 1721 1717 1708 1704 1720 1716 1722 1718 1709 1705 1721 1717 1723 1719 1710 1706 1722 1718 1724 1720 1711 1707 1723 1719 1725 1721 1712 1708 1724 1720 1726 1722 1713 1709 1725 1721 1727 1723 1714 1710 1726 1722 1140 1136 1715 1711 1727 1723 1729 1724 1716 1713 1728 1725 1730 1726 1717 1712 1729 1724 1731 1727 1718 1714 1730 1726 1732 1728 1719 1715 1731 1727 1733 1729 1720 1716 1732 1728 1734 1730 1721 1717 1733 1729 1735 1731 1722 1718 1734 1730 1736 1732 1723 1719 1735 1731 1737 1733 1724 1720 1736 1732 1738 1734 1725 1721 1737 1733 1739 1735 1726 1722 1738 1734 1152 1148 1727 1723 1739 1735 1741 1736 1728 1725 1740 1737 1742 1738 1729 1724 1741 1736 1743 1739 1730 1726 1742 1738 1744 1740 1731 1727 1743 1739 1745 1741 1732 1728 1744 1740 1746 1742 1733 1729 1745 1741 1747 1743 1734 1730 1746 1742 1748 1744 1735 1731 1747 1743 1749 1745 1736 1732 1748 1744 1750 1746 1737 1733 1749 1745 1751 1747 1738 1734 1750 1746 1164 1160 1739 1735 1751 1747 1753 1748 1740 1737 1752 1749 1754 1750 1741 1736 1753 1748 1755 1751 1742 1738 1754 1750 1756 1752 1743 1739 1755 1751 1757 1753 1744 1740 1756 1752 1758 1754 1745 1741 1757 1753 1759 1755 1746 1742 1758 1754 1760 1756 1747 1743 1759 1755 1761 1757 1748 1744 1760 1756 1762 1758 1749 1745 1761 1757 1763 1759 1750 1746 1762 1758 1176 1172 1751 1747 1763 1759 1765 1760 1752 1749 1764 1761 1766 1762 1753 1748 1765 1760 1767 1763 1754 1750 1766 1762 1768 1764 1755 1751 1767 1763 1769 1765 1756 1752 1768 1764 1770 1766 1757 1753 1769 1765 1771 1767 1758 1754 1770 1766 1772 1768 1759 1755 1771 1767 1773 1769 1760 1756 1772 1768 1774 1770 1761 1757 1773 1769 1775 1771 1762 1758 1774 1770 1188 1184 1763 1759 1775 1771 1502 1497 1764 1761 1503 1498 1505 1500 1765 1760 1502 1497 1507 1502 1766 1762 1505 1500 1509 1504 1767 1763 1507 1502 1511 1506 1768 1764 1509 1504 1513 1508 1769 1765 1511 1506 1515 1510 1770 1766 1513 1508 1517 1512 1771 1767 1515 1510 1519 1514 1772 1768 1517 1512 1521 1516 1773 1769 1519 1514 1523 1518 1774 1770 1521 1516 927 921 1775 1771 1523 1518 1776 1772 1778 1773 1779 1774 1777 1775 1781 1776 1778 1773 1780 1777 1783 1778 1781 1776 1782 1779 1785 1780 1783 1778 1784 1781 1787 1782 1785 1780 1786 1783 1789 1784 1787 1782 1788 1785 1791 1786 1789 1784 1790 1787 1793 1788 1791 1786 1792 1789 1795 1790 1793 1788 1794 1791 1797 1792 1795 1790 1796 1793 1799 1794 1797 1792 1800 1795 1799 1794 1798 1796 1802 1797 1777 1775 1776 1772 1803 1798 1780 1777 1777 1775 1804 1799 1782 1779 1780 1777 1805 1800 1784 1781 1782 1779 1806 1801 1786 1783 1784 1781 1807 1802 1788 1785 1786 1783 1808 1803 1790 1787 1788 1785 1809 1804 1792 1789 1790 1787 1810 1805 1794 1791 1792 1789 1811 1806 1796 1793 1794 1791 1812 1807 1798 1796 1796 1793 1814 1808 1798 1796 1813 1809 1815 1810 1803 1798 1802 1797 1816 1811 1804 1799 1803 1798 1817 1812 1805 1800 1804 1799 1818 1813 1806 1801 1805 1800 1819 1814 1807 1802 1806 1801 1820 1815 1808 1803 1807 1802 1821 1816 1809 1804 1808 1803 1822 1817 1810 1805 1809 1804 1823 1818 1811 1806 1810 1805 1824 1819 1812 1807 1811 1806 1825 1820 1813 1809 1812 1807 1827 1821 1813 1809 1826 1822 1828 1823 1816 1811 1815 1810 1829 1824 1817 1812 1816 1811 1830 1825 1818 1813 1817 1812 1831 1826 1819 1814 1818 1813 1832 1827 1820 1815 1819 1814 1833 1828 1821 1816 1820 1815 1834 1829 1822 1817 1821 1816 1835 1830 1823 1818 1822 1817 1836 1831 1824 1819 1823 1818 1837 1832 1825 1820 1824 1819 1838 1833 1826 1822 1825 1820 1840 1834 1826 1822 1839 1835 1841 1836 1829 1824 1828 1823 1842 1837 1830 1825 1829 1824 1843 1838 1831 1826 1830 1825 1844 1839 1832 1827 1831 1826 1845 1840 1833 1828 1832 1827 1846 1841 1834 1829 1833 1828 1847 1842 1835 1830 1834 1829 1848 1843 1836 1831 1835 1830 1849 1844 1837 1832 1836 1831 1850 1845 1838 1833 1837 1832 1851 1846 1839 1835 1838 1833 1853 1847 1839 1835 1852 1848 1854 1849 1842 1837 1841 1836 1855 1850 1843 1838 1842 1837 1856 1851 1844 1839 1843 1838 1857 1852 1845 1840 1844 1839 1858 1853 1846 1841 1845 1840 1859 1854 1847 1842 1846 1841 1860 1855 1848 1843 1847 1842 1861 1856 1849 1844 1848 1843 1862 1857 1850 1845 1849 1844 1863 1858 1851 1846 1850 1845 1864 1859 1852 1848 1851 1846 1866 1860 1852 1848 1865 1861 1867 1862 1855 1850 1854 1849 1868 1863 1856 1851 1855 1850 1869 1864 1857 1852 1856 1851 1870 1865 1858 1853 1857 1852 1871 1866 1859 1854 1858 1853 1872 1867 1860 1855 1859 1854 1873 1868 1861 1856 1860 1855 1874 1869 1862 1857 1861 1856 1875 1870 1863 1858 1862 1857 1876 1871 1864 1859 1863 1858 1877 1872 1865 1861 1864 1859 1879 1873 1865 1861 1878 1874 1880 1875 1868 1863 1867 1862 1881 1876 1869 1864 1868 1863 1882 1877 1870 1865 1869 1864 1883 1878 1871 1866 1870 1865 1884 1879 1872 1867 1871 1866 1885 1880 1873 1868 1872 1867 1886 1881 1874 1869 1873 1868 1887 1882 1875 1870 1874 1869 1888 1883 1876 1871 1875 1870 1889 1884 1877 1872 1876 1871 1890 1885 1878 1874 1877 1872 1892 1886 1878 1874 1891 1887 1893 1888 1881 1876 1880 1875 1894 1889 1882 1877 1881 1876 1895 1890 1883 1878 1882 1877 1896 1891 1884 1879 1883 1878 1897 1892 1885 1880 1884 1879 1898 1893 1886 1881 1885 1880 1899 1894 1887 1882 1886 1881 1900 1895 1888 1883 1887 1882 1901 1896 1889 1884 1888 1883 1902 1897 1890 1885 1889 1884 1903 1898 1891 1887 1890 1885 1905 1899 1891 1887 1904 1900 1906 1901 1894 1889 1893 1888 1907 1902 1895 1890 1894 1889 1908 1903 1896 1891 1895 1890 1909 1904 1897 1892 1896 1891 1910 1905 1898 1893 1897 1892 1911 1906 1899 1894 1898 1893 1912 1907 1900 1895 1899 1894 1913 1908 1901 1896 1900 1895 1914 1909 1902 1897 1901 1896 1915 1910 1903 1898 1902 1897 1916 1911 1904 1900 1903 1898 1918 1912 1904 1900 1917 1913 1919 1914 1907 1902 1906 1901 1920 1915 1908 1903 1907 1902 1921 1916 1909 1904 1908 1903 1922 1917 1910 1905 1909 1904 1923 1918 1911 1906 1910 1905 1924 1919 1912 1907 1911 1906 1925 1920 1913 1908 1912 1907 1926 1921 1914 1909 1913 1908 1927 1922 1915 1910 1914 1909 1928 1923 1916 1911 1915 1910 1929 1924 1917 1913 1916 1911 1931 1925 1917 1913 1930 1926 1932 1927 1920 1915 1919 1914 1933 1928 1921 1916 1920 1915 1934 1929 1922 1917 1921 1916 1935 1930 1923 1918 1922 1917 1936 1931 1924 1919 1923 1918 1937 1932 1925 1920 1924 1919 1938 1933 1926 1921 1925 1920 1939 1934 1927 1922 1926 1921 1940 1935 1928 1923 1927 1922 1941 1936 1929 1924 1928 1923 1942 1937 1930 1926 1929 1924 1944 1938 1930 1926 1943 1939 1946 1940 1932 1927 1945 1941 1947 1942 1933 1928 1946 1940 1948 1943 1934 1929 1947 1942 1949 1944 1935 1930 1948 1943 1950 1945 1936 1931 1949 1944 1951 1946 1937 1932 1950 1945 1952 1947 1938 1933 1951 1946 1953 1948 1939 1934 1952 1947 1954 1949 1940 1935 1953 1948 1955 1950 1941 1936 1954 1949 1956 1951 1942 1937 1955 1950 1956 1951 1944 1938 1943 1939 1959 1952 1945 1941 1958 1953 1960 1954 1946 1940 1959 1952 1961 1955 1947 1942 1960 1954 1962 1956 1948 1943 1961 1955 1963 1957 1949 1944 1962 1956 1964 1958 1950 1945 1963 1957 1965 1959 1951 1946 1964 1958 1966 1960 1952 1947 1965 1959 1967 1961 1953 1948 1966 1960 1968 1962 1954 1949 1967 1961 1969 1963 1955 1950 1968 1962 1969 1963 1957 1964 1956 1951 1972 1965 1958 1953 1971 1966 1973 1967 1959 1952 1972 1965 1974 1968 1960 1954 1973 1967 1975 1969 1961 1955 1974 1968 1976 1970 1962 1956 1975 1969 1977 1971 1963 1957 1976 1970 1978 1972 1964 1958 1977 1971 1979 1973 1965 1959 1978 1972 1980 1974 1966 1960 1979 1973 1981 1975 1967 1961 1980 1974 1982 1976 1968 1962 1981 1975 1982 1976 1970 1977 1969 1963 1985 1978 1971 1966 1984 1979 1986 1980 1972 1965 1985 1978 1987 1981 1973 1967 1986 1980 1988 1982 1974 1968 1987 1981 1989 1983 1975 1969 1988 1982 1990 1984 1976 1970 1989 1983 1991 1985 1977 1971 1990 1984 1992 1986 1978 1972 1991 1985 1993 1987 1979 1973 1992 1986 1994 1988 1980 1974 1993 1987 1995 1989 1981 1975 1994 1988 1995 1989 1983 1990 1982 1976 1998 1991 1984 1979 1997 1992 1999 1993 1985 1978 1998 1991 2000 1994 1986 1980 1999 1993 2001 1995 1987 1981 2000 1994 2002 1996 1988 1982 2001 1995 2003 1997 1989 1983 2002 1996 2004 1998 1990 1984 2003 1997 2005 1999 1991 1985 2004 1998 2006 2000 1992 1986 2005 1999 2007 2001 1993 1987 2006 2000 2008 2002 1994 1988 2007 2001 2008 2002 1996 2003 1995 1989 2011 2004 1997 1992 2010 2005 2012 2006 1998 1991 2011 2004 2013 2007 1999 1993 2012 2006 2014 2008 2000 1994 2013 2007 2015 2009 2001 1995 2014 2008 2016 2010 2002 1996 2015 2009 2017 2011 2003 1997 2016 2010 2018 2012 2004 1998 2017 2011 2019 2013 2005 1999 2018 2012 2020 2014 2006 2000 2019 2013 2021 2015 2007 2001 2020 2014 2021 2015 2009 2016 2008 2002 2024 2017 2010 2005 2023 2018 2025 2019 2011 2004 2024 2017 2026 2020 2012 2006 2025 2019 2027 2021 2013 2007 2026 2020 2028 2022 2014 2008 2027 2021 2029 2023 2015 2009 2028 2022 2030 2024 2016 2010 2029 2023 2031 2025 2017 2011 2030 2024 2032 2026 2018 2012 2031 2025 2033 2027 2019 2013 2032 2026 2034 2028 2020 2014 2033 2027 2034 2028 2022 2029 2021 2015 2037 2030 2023 2018 2036 2031 2038 2032 2024 2017 2037 2030 2039 2033 2025 2019 2038 2032 2040 2034 2026 2020 2039 2033 2041 2035 2027 2021 2040 2034 2042 2036 2028 2022 2041 2035 2043 2037 2029 2023 2042 2036 2044 2038 2030 2024 2043 2037 2045 2039 2031 2025 2044 2038 2046 2040 2032 2026 2045 2039 2047 2041 2033 2027 2046 2040 2047 2041 2035 2042 2034 2028 2050 2043 2036 2031 2049 2044 2051 2045 2037 2030 2050 2043 2052 2046 2038 2032 2051 2045 2053 2047 2039 2033 2052 2046 2054 2048 2040 2034 2053 2047 2055 2049 2041 2035 2054 2048 2056 2050 2042 2036 2055 2049 2057 2051 2043 2037 2056 2050 2058 2052 2044 2038 2057 2051 2059 2053 2045 2039 2058 2052 2060 2054 2046 2040 2059 2053 2060 2054 2048 2055 2047 2041 2063 2056 2049 2044 2062 2057 2064 2058 2050 2043 2063 2056 2065 2059 2051 2045 2064 2058 2066 2060 2052 2046 2065 2059 2067 2061 2053 2047 2066 2060 2068 2062 2054 2048 2067 2061 2069 2063 2055 2049 2068 2062 2070 2064 2056 2050 2069 2063 2071 2065 2057 2051 2070 2064 2072 2066 2058 2052 2071 2065 2073 2067 2059 2053 2072 2066 2073 2067 2061 2068 2060 2054 2076 2069 2062 2057 2075 2070 2077 2071 2063 2056 2076 2069 2078 2072 2064 2058 2077 2071 2079 2073 2065 2059 2078 2072 2080 2074 2066 2060 2079 2073 2081 2075 2067 2061 2080 2074 2082 2076 2068 2062 2081 2075 2083 2077 2069 2063 2082 2076 2084 2078 2070 2064 2083 2077 2085 2079 2071 2065 2084 2078 2086 2080 2072 2066 2085 2079 2086 2080 2074 2081 2073 2067 1778 1773 2075 2070 1779 1774 1781 1776 2076 2069 1778 1773 1783 1778 2077 2071 1781 1776 1785 1780 2078 2072 1783 1778 1787 1782 2079 2073 1785 1780 1789 1784 2080 2074 1787 1782 1791 1786 2081 2075 1789 1784 1793 1788 2082 2076 1791 1786 1795 1790 2083 2077 1793 1788 1797 1792 2084 2078 1795 1790 1799 1794 2085 2079 1797 1792 1799 1794 2087 2082 2086 2080 2088 2083 2090 2084 2091 2085 2089 2086 2093 2087 2090 2084 2092 2088 2095 2089 2093 2087 2094 2090 2097 2091 2095 2089 2096 2092 2099 2093 2097 2091 2098 2094 2101 2095 2099 2093 2100 2096 2103 2097 2101 2095 2102 2098 2105 2099 2103 2097 2104 2100 2107 2101 2105 2099 2106 2102 2109 2103 2107 2101 2108 2104 2111 2105 2109 2103 2110 2106 1779 1774 2111 2105 2112 2107 2089 2086 2088 2083 2113 2108 2092 2088 2089 2086 2114 2109 2094 2090 2092 2088 2115 2110 2096 2092 2094 2090 2116 2111 2098 2094 2096 2092 2117 2112 2100 2096 2098 2094 2118 2113 2102 2098 2100 2096 2119 2114 2104 2100 2102 2098 2120 2115 2106 2102 2104 2100 2121 2116 2108 2104 2106 2102 2122 2117 2110 2106 2108 2104 2123 2118 1776 1772 2110 2106 2124 2119 2113 2108 2112 2107 2125 2120 2114 2109 2113 2108 2126 2121 2115 2110 2114 2109 2127 2122 2116 2111 2115 2110 2128 2123 2117 2112 2116 2111 2129 2124 2118 2113 2117 2112 2130 2125 2119 2114 2118 2113 2131 2126 2120 2115 2119 2114 2132 2127 2121 2116 2120 2115 2133 2128 2122 2117 2121 2116 2134 2129 2123 2118 2122 2117 2135 2130 1802 1797 2123 2118 2136 2131 2125 2120 2124 2119 2137 2132 2126 2121 2125 2120 2138 2133 2127 2122 2126 2121 2139 2134 2128 2123 2127 2122 2140 2135 2129 2124 2128 2123 2141 2136 2130 2125 2129 2124 2142 2137 2131 2126 2130 2125 2143 2138 2132 2127 2131 2126 2144 2139 2133 2128 2132 2127 2145 2140 2134 2129 2133 2128 2146 2141 2135 2130 2134 2129 2147 2142 1815 1810 2135 2130 2148 2143 2137 2132 2136 2131 2149 2144 2138 2133 2137 2132 2150 2145 2139 2134 2138 2133 2151 2146 2140 2135 2139 2134 2152 2147 2141 2136 2140 2135 2153 2148 2142 2137 2141 2136 2154 2149 2143 2138 2142 2137 2155 2150 2144 2139 2143 2138 2156 2151 2145 2140 2144 2139 2157 2152 2146 2141 2145 2140 2158 2153 2147 2142 2146 2141 2159 2154 1828 1823 2147 2142 2160 2155 2149 2144 2148 2143 2161 2156 2150 2145 2149 2144 2162 2157 2151 2146 2150 2145 2163 2158 2152 2147 2151 2146 2164 2159 2153 2148 2152 2147 2165 2160 2154 2149 2153 2148 2166 2161 2155 2150 2154 2149 2167 2162 2156 2151 2155 2150 2168 2163 2157 2152 2156 2151 2169 2164 2158 2153 2157 2152 2170 2165 2159 2154 2158 2153 2171 2166 1841 1836 2159 2154 2172 2167 2161 2156 2160 2155 2173 2168 2162 2157 2161 2156 2174 2169 2163 2158 2162 2157 2175 2170 2164 2159 2163 2158 2176 2171 2165 2160 2164 2159 2177 2172 2166 2161 2165 2160 2178 2173 2167 2162 2166 2161 2179 2174 2168 2163 2167 2162 2180 2175 2169 2164 2168 2163 2181 2176 2170 2165 2169 2164 2182 2177 2171 2166 2170 2165 2183 2178 1854 1849 2171 2166 2184 2179 2173 2168 2172 2167 2185 2180 2174 2169 2173 2168 2186 2181 2175 2170 2174 2169 2187 2182 2176 2171 2175 2170 2188 2183 2177 2172 2176 2171 2189 2184 2178 2173 2177 2172 2190 2185 2179 2174 2178 2173 2191 2186 2180 2175 2179 2174 2192 2187 2181 2176 2180 2175 2193 2188 2182 2177 2181 2176 2194 2189 2183 2178 2182 2177 2195 2190 1867 1862 2183 2178 2196 2191 2185 2180 2184 2179 2197 2192 2186 2181 2185 2180 2198 2193 2187 2182 2186 2181 2199 2194 2188 2183 2187 2182 2200 2195 2189 2184 2188 2183 2201 2196 2190 2185 2189 2184 2202 2197 2191 2186 2190 2185 2203 2198 2192 2187 2191 2186 2204 2199 2193 2188 2192 2187 2205 2200 2194 2189 2193 2188 2206 2201 2195 2190 2194 2189 2207 2202 1880 1875 2195 2190 2208 2203 2197 2192 2196 2191 2209 2204 2198 2193 2197 2192 2210 2205 2199 2194 2198 2193 2211 2206 2200 2195 2199 2194 2212 2207 2201 2196 2200 2195 2213 2208 2202 2197 2201 2196 2214 2209 2203 2198 2202 2197 2215 2210 2204 2199 2203 2198 2216 2211 2205 2200 2204 2199 2217 2212 2206 2201 2205 2200 2218 2213 2207 2202 2206 2201 2219 2214 1893 1888 2207 2202 2220 2215 2209 2204 2208 2203 2221 2216 2210 2205 2209 2204 2222 2217 2211 2206 2210 2205 2223 2218 2212 2207 2211 2206 2224 2219 2213 2208 2212 2207 2225 2220 2214 2209 2213 2208 2226 2221 2215 2210 2214 2209 2227 2222 2216 2211 2215 2210 2228 2223 2217 2212 2216 2211 2229 2224 2218 2213 2217 2212 2230 2225 2219 2214 2218 2213 2231 2226 1906 1901 2219 2214 783 777 2221 2216 2220 2215 2232 2227 2222 2217 2221 2216 2233 2228 2223 2218 2222 2217 2234 2229 2224 2219 2223 2218 2235 2230 2225 2220 2224 2219 2236 2231 2226 2221 2225 2220 2237 2232 2227 2222 2226 2221 2238 2233 2228 2223 2227 2222 2239 2234 2229 2224 2228 2223 2240 2235 2230 2225 2229 2224 2241 2236 2231 2226 2230 2225 2242 2237 1919 1914 2231 2226 2244 2238 783 777 2243 2239 2245 2240 2232 2227 2244 2238 2246 2241 2233 2228 2245 2240 2247 2242 2234 2229 2246 2241 2248 2243 2235 2230 2247 2242 2249 2244 2236 2231 2248 2243 2250 2245 2237 2232 2249 2244 2251 2246 2238 2233 2250 2245 2252 2247 2239 2234 2251 2246 2253 2248 2240 2235 2252 2247 2254 2249 2241 2236 2253 2248 1945 1941 2242 2237 2254 2249 2256 2250 2243 2239 2255 2251 2257 2252 2244 2238 2256 2250 2258 2253 2245 2240 2257 2252 2259 2254 2246 2241 2258 2253 2260 2255 2247 2242 2259 2254 2261 2256 2248 2243 2260 2255 2262 2257 2249 2244 2261 2256 2263 2258 2250 2245 2262 2257 2264 2259 2251 2246 2263 2258 2265 2260 2252 2247 2264 2259 2266 2261 2253 2248 2265 2260 1958 1953 2254 2249 2266 2261 2268 2262 2255 2251 2267 2263 2269 2264 2256 2250 2268 2262 2270 2265 2257 2252 2269 2264 2271 2266 2258 2253 2270 2265 2272 2267 2259 2254 2271 2266 2273 2268 2260 2255 2272 2267 2274 2269 2261 2256 2273 2268 2275 2270 2262 2257 2274 2269 2276 2271 2263 2258 2275 2270 2277 2272 2264 2259 2276 2271 2278 2273 2265 2260 2277 2272 1971 1966 2266 2261 2278 2273 2280 2274 2267 2263 2279 2275 2281 2276 2268 2262 2280 2274 2282 2277 2269 2264 2281 2276 2283 2278 2270 2265 2282 2277 2284 2279 2271 2266 2283 2278 2285 2280 2272 2267 2284 2279 2286 2281 2273 2268 2285 2280 2287 2282 2274 2269 2286 2281 2288 2283 2275 2270 2287 2282 2289 2284 2276 2271 2288 2283 2290 2285 2277 2272 2289 2284 1984 1979 2278 2273 2290 2285 2292 2286 2279 2275 2291 2287 2293 2288 2280 2274 2292 2286 2294 2289 2281 2276 2293 2288 2295 2290 2282 2277 2294 2289 2296 2291 2283 2278 2295 2290 2297 2292 2284 2279 2296 2291 2298 2293 2285 2280 2297 2292 2299 2294 2286 2281 2298 2293 2300 2295 2287 2282 2299 2294 2301 2296 2288 2283 2300 2295 2302 2297 2289 2284 2301 2296 1997 1992 2290 2285 2302 2297 2304 2298 2291 2287 2303 2299 2305 2300 2292 2286 2304 2298 2306 2301 2293 2288 2305 2300 2307 2302 2294 2289 2306 2301 2308 2303 2295 2290 2307 2302 2309 2304 2296 2291 2308 2303 2310 2305 2297 2292 2309 2304 2311 2306 2298 2293 2310 2305 2312 2307 2299 2294 2311 2306 2313 2308 2300 2295 2312 2307 2314 2309 2301 2296 2313 2308 2010 2005 2302 2297 2314 2309 2316 2310 2303 2299 2315 2311 2317 2312 2304 2298 2316 2310 2318 2313 2305 2300 2317 2312 2319 2314 2306 2301 2318 2313 2320 2315 2307 2302 2319 2314 2321 2316 2308 2303 2320 2315 2322 2317 2309 2304 2321 2316 2323 2318 2310 2305 2322 2317 2324 2319 2311 2306 2323 2318 2325 2320 2312 2307 2324 2319 2326 2321 2313 2308 2325 2320 2023 2018 2314 2309 2326 2321 2328 2322 2315 2311 2327 2323 2329 2324 2316 2310 2328 2322 2330 2325 2317 2312 2329 2324 2331 2326 2318 2313 2330 2325 2332 2327 2319 2314 2331 2326 2333 2328 2320 2315 2332 2327 2334 2329 2321 2316 2333 2328 2335 2330 2322 2317 2334 2329 2336 2331 2323 2318 2335 2330 2337 2332 2324 2319 2336 2331 2338 2333 2325 2320 2337 2332 2036 2031 2326 2321 2338 2333 2340 2334 2327 2323 2339 2335 2341 2336 2328 2322 2340 2334 2342 2337 2329 2324 2341 2336 2343 2338 2330 2325 2342 2337 2344 2339 2331 2326 2343 2338 2345 2340 2332 2327 2344 2339 2346 2341 2333 2328 2345 2340 2347 2342 2334 2329 2346 2341 2348 2343 2335 2330 2347 2342 2349 2344 2336 2331 2348 2343 2350 2345 2337 2332 2349 2344 2049 2044 2338 2333 2350 2345 2352 2346 2339 2335 2351 2347 2353 2348 2340 2334 2352 2346 2354 2349 2341 2336 2353 2348 2355 2350 2342 2337 2354 2349 2356 2351 2343 2338 2355 2350 2357 2352 2344 2339 2356 2351 2358 2353 2345 2340 2357 2352 2359 2354 2346 2341 2358 2353 2360 2355 2347 2342 2359 2354 2361 2356 2348 2343 2360 2355 2362 2357 2349 2344 2361 2356 2062 2057 2350 2345 2362 2357 2364 2358 2351 2347 2363 2359 2365 2360 2352 2346 2364 2358 2366 2361 2353 2348 2365 2360 2367 2362 2354 2349 2366 2361 2368 2363 2355 2350 2367 2362 2369 2364 2356 2351 2368 2363 2370 2365 2357 2352 2369 2364 2371 2366 2358 2353 2370 2365 2372 2367 2359 2354 2371 2366 2373 2368 2360 2355 2372 2367 2374 2369 2361 2356 2373 2368 2075 2070 2362 2357 2374 2369 2090 2084 2363 2359 2091 2085 2093 2087 2364 2358 2090 2084 2095 2089 2365 2360 2093 2087 2097 2091 2366 2361 2095 2089 2099 2093 2367 2362 2097 2091 2101 2095 2368 2363 2099 2093 2103 2097 2369 2364 2101 2095 2105 2099 2370 2365 2103 2097 2107 2101 2371 2366 2105 2099 2109 2103 2372 2367 2107 2101 2111 2105 2373 2368 2109 2103 1779 1774 2374 2369 2111 2105 2375 2370 2377 2371 2378 2372 2376 2373 2380 2374 2377 2371 2379 2375 2382 2376 2380 2374 2381 2377 2384 2378 2382 2376 2385 2379 2384 2378 2383 2380 2387 2381 2386 2382 2385 2379 2389 2383 2388 2384 2387 2381 2391 2385 2390 2386 2389 2383 2393 2387 2392 2388 2391 2385 2395 2389 2394 2390 2393 2387 2397 2391 2396 2392 2395 2389 2399 2393 2398 2394 2397 2391 2401 2395 2376 2373 2375 2370 2402 2396 2379 2375 2376 2373 2403 2397 2381 2377 2379 2375 2404 2398 2383 2380 2381 2377 2406 2399 2383 2380 2405 2400 2407 2401 2385 2379 2406 2399 2408 2402 2387 2381 2407 2401 2409 2403 2389 2383 2408 2402 2410 2404 2391 2385 2409 2403 2411 2405 2393 2387 2410 2404 2412 2406 2395 2389 2411 2405 2413 2407 2397 2391 2412 2406 2414 2408 2402 2396 2401 2395 2415 2409 2403 2397 2402 2396 2416 2410 2404 2398 2403 2397 2417 2411 2405 2400 2404 2398 2419 2412 2405 2400 2418 2413 2420 2414 2406 2399 2419 2412 2421 2415 2407 2401 2420 2414 2422 2416 2408 2402 2421 2415 2423 2417 2409 2403 2422 2416 2424 2418 2410 2404 2423 2417 2425 2419 2411 2405 2424 2418 2426 2420 2412 2406 2425 2419 2427 2421 2415 2409 2414 2408 2428 2422 2416 2410 2415 2409 2429 2423 2417 2411 2416 2410 2430 2424 2418 2413 2417 2411 2432 2425 2418 2413 2431 2426 2433 2427 2419 2412 2432 2425 2434 2428 2420 2414 2433 2427 2435 2429 2421 2415 2434 2428 2436 2430 2422 2416 2435 2429 2437 2431 2423 2417 2436 2430 2438 2432 2424 2418 2437 2431 2439 2433 2425 2419 2438 2432 2440 2434 2428 2422 2427 2421 2441 2435 2429 2423 2428 2422 2442 2436 2430 2424 2429 2423 2443 2437 2431 2426 2430 2424 2445 2438 2431 2426 2444 2439 2446 2440 2432 2425 2445 2438 2447 2441 2433 2427 2446 2440 2448 2442 2434 2428 2447 2441 2449 2443 2435 2429 2448 2442 2450 2444 2436 2430 2449 2443 2451 2445 2437 2431 2450 2444 2452 2446 2438 2432 2451 2445 2453 2447 2441 2435 2440 2434 2454 2448 2442 2436 2441 2435 2455 2449 2443 2437 2442 2436 2457 2450 2443 2437 2456 2451 2458 2452 2444 2439 2457 2450 2459 2453 2445 2438 2458 2452 2460 2454 2446 2440 2459 2453 2461 2455 2447 2441 2460 2454 2462 2456 2448 2442 2461 2455 2463 2457 2449 2443 2462 2456 2464 2458 2450 2444 2463 2457 2465 2459 2451 2445 2464 2458 2466 2460 2454 2448 2453 2447 2467 2461 2455 2449 2454 2448 2468 2462 2456 2451 2455 2449 2470 2463 2456 2451 2469 2464 2471 2465 2457 2450 2470 2463 2472 2466 2458 2452 2471 2465 2473 2467 2459 2453 2472 2466 2474 2468 2460 2454 2473 2467 2475 2469 2461 2455 2474 2468 2476 2470 2462 2456 2475 2469 2477 2471 2463 2457 2476 2470 2478 2472 2464 2458 2477 2471 2479 2473 2467 2461 2466 2460 2480 2474 2468 2462 2467 2461 2481 2475 2469 2464 2468 2462 2483 2476 2469 2464 2482 2477 2484 2478 2470 2463 2483 2476 2485 2479 2471 2465 2484 2478 2486 2480 2472 2466 2485 2479 2487 2481 2473 2467 2486 2480 2488 2482 2474 2468 2487 2481 2489 2483 2475 2469 2488 2482 2490 2484 2476 2470 2489 2483 2491 2485 2477 2471 2490 2484 2492 2486 2480 2474 2479 2473 2493 2487 2481 2475 2480 2474 2494 2488 2482 2477 2481 2475 2496 2489 2482 2477 2495 2490 2497 2491 2483 2476 2496 2489 2498 2492 2484 2478 2497 2491 2499 2493 2485 2479 2498 2492 2500 2494 2486 2480 2499 2493 2501 2495 2487 2481 2500 2494 2502 2496 2488 2482 2501 2495 2503 2497 2489 2483 2502 2496 2504 2498 2490 2484 2503 2497 2505 2499 2493 2487 2492 2486 2506 2500 2494 2488 2493 2487 2507 2501 2495 2490 2494 2488 2509 2502 2495 2490 2508 2503 2510 2504 2496 2489 2509 2502 2511 2505 2497 2491 2510 2504 2512 2506 2498 2492 2511 2505 2513 2507 2499 2493 2512 2506 2514 2508 2500 2494 2513 2507 2515 2509 2501 2495 2514 2508 2516 2510 2502 2496 2515 2509 2517 2511 2503 2497 2516 2510 2518 2512 2506 2500 2505 2499 2519 2513 2507 2501 2506 2500 2521 2514 2507 2501 2520 2515 2522 2516 2508 2503 2521 2514 2523 2517 2509 2502 2522 2516 2524 2518 2510 2504 2523 2517 2525 2519 2511 2505 2524 2518 2526 2520 2512 2506 2525 2519 2527 2521 2513 2507 2526 2520 2528 2522 2514 2508 2527 2521 2529 2523 2515 2509 2528 2522 2530 2524 2516 2510 2529 2523 2531 2525 2519 2513 2518 2512 2532 2526 2520 2515 2519 2513 2534 2527 2520 2515 2533 2528 2535 2529 2521 2514 2534 2527 2536 2530 2522 2516 2535 2529 2537 2531 2523 2517 2536 2530 2538 2532 2524 2518 2537 2531 2539 2533 2525 2519 2538 2532 2540 2534 2526 2520 2539 2533 2541 2535 2527 2521 2540 2534 2542 2536 2528 2522 2541 2535 2543 2537 2529 2523 2542 2536 2545 2538 2531 2525 2544 2539 2546 2540 2532 2526 2545 2538 2546 2540 2534 2527 2533 2528 2547 2541 2535 2529 2534 2527 2548 2542 2536 2530 2535 2529 2549 2543 2537 2531 2536 2530 2550 2544 2538 2532 2537 2531 2551 2545 2539 2533 2538 2532 2552 2546 2540 2534 2539 2533 2553 2547 2541 2535 2540 2534 2554 2548 2542 2536 2541 2535 2555 2549 2543 2537 2542 2536 2558 2550 2544 2539 2557 2551 2559 2552 2545 2538 2558 2550 2559 2552 2547 2541 2546 2540 2560 2553 2548 2542 2547 2541 2561 2554 2549 2543 2548 2542 2562 2555 2550 2544 2549 2543 2563 2556 2551 2545 2550 2544 2564 2557 2552 2546 2551 2545 2565 2558 2553 2547 2552 2546 2566 2559 2554 2548 2553 2547 2567 2560 2555 2549 2554 2548 2568 2561 2556 2562 2555 2549 2571 2563 2557 2551 2570 2564 2572 2565 2558 2550 2571 2563 2573 2566 2559 2552 2572 2565 2573 2566 2561 2554 2560 2553 2574 2567 2562 2555 2561 2554 2575 2568 2563 2556 2562 2555 2576 2569 2564 2557 2563 2556 2577 2570 2565 2558 2564 2557 2578 2571 2566 2559 2565 2558 2579 2572 2567 2560 2566 2559 2580 2573 2568 2561 2567 2560 2581 2574 2569 2575 2568 2561 2584 2576 2570 2564 2583 2577 2585 2578 2571 2563 2584 2576 2586 2579 2572 2565 2585 2578 2586 2579 2574 2567 2573 2566 2587 2580 2575 2568 2574 2567 2588 2581 2576 2569 2575 2568 2589 2582 2577 2570 2576 2569 2590 2583 2578 2571 2577 2570 2591 2584 2579 2572 2578 2571 2592 2585 2580 2573 2579 2572 2593 2586 2581 2574 2580 2573 2594 2587 2582 2588 2581 2574 2597 2589 2583 2577 2596 2590 2598 2591 2584 2576 2597 2589 2599 2592 2585 2578 2598 2591 2599 2592 2587 2580 2586 2579 2600 2593 2588 2581 2587 2580 2601 2594 2589 2582 2588 2581 2602 2595 2590 2583 2589 2582 2603 2596 2591 2584 2590 2583 2604 2597 2592 2585 2591 2584 2605 2598 2593 2586 2592 2585 2606 2599 2594 2587 2593 2586 2607 2600 2595 2601 2594 2587 2610 2602 2596 2590 2609 2603 2611 2604 2597 2589 2610 2602 2612 2605 2598 2591 2611 2604 2612 2605 2600 2593 2599 2592 2613 2606 2601 2594 2600 2593 2614 2607 2602 2595 2601 2594 2615 2608 2603 2596 2602 2595 2616 2609 2604 2597 2603 2596 2617 2610 2605 2598 2604 2597 2618 2611 2606 2599 2605 2598 2619 2612 2607 2600 2606 2599 2620 2613 2608 2614 2607 2600 2623 2615 2609 2603 2622 2616 2624 2617 2610 2602 2623 2615 2625 2618 2611 2604 2624 2617 2625 2618 2613 2606 2612 2605 2626 2619 2614 2607 2613 2606 2627 2620 2615 2608 2614 2607 2628 2621 2616 2609 2615 2608 2629 2622 2617 2610 2616 2609 2630 2623 2618 2611 2617 2610 2631 2624 2619 2612 2618 2611 2632 2625 2620 2613 2619 2612 2633 2626 2621 2627 2620 2613 2636 2628 2622 2616 2635 2629 2637 2630 2623 2615 2636 2628 2638 2631 2624 2617 2637 2630 2639 2632 2625 2618 2638 2631 2639 2632 2627 2620 2626 2619 2640 2633 2628 2621 2627 2620 2641 2634 2629 2622 2628 2621 2642 2635 2630 2623 2629 2622 2643 2636 2631 2624 2630 2623 2644 2637 2632 2625 2631 2624 2645 2638 2633 2626 2632 2625 2646 2639 2634 2640 2633 2626 2649 2641 2635 2629 2648 2642 2650 2643 2636 2628 2649 2641 2651 2644 2637 2630 2650 2643 2652 2645 2638 2631 2651 2644 2652 2645 2640 2633 2639 2632 2653 2646 2641 2634 2640 2633 2654 2647 2642 2635 2641 2634 2655 2648 2643 2636 2642 2635 2656 2649 2644 2637 2643 2636 2657 2650 2645 2638 2644 2637 2658 2651 2646 2639 2645 2638 2659 2652 2647 2653 2646 2639 2662 2654 2648 2642 2661 2655 2663 2656 2649 2641 2662 2654 2664 2657 2650 2643 2663 2656 2665 2658 2651 2644 2664 2657 2665 2658 2653 2646 2652 2645 2666 2659 2654 2647 2653 2646 2667 2660 2655 2648 2654 2647 2668 2661 2656 2649 2655 2648 2669 2662 2657 2650 2656 2649 2670 2663 2658 2651 2657 2650 2671 2664 2659 2652 2658 2651 2672 2665 2660 2666 2659 2652 2675 2667 2661 2655 2674 2668 2676 2669 2662 2654 2675 2667 2677 2670 2663 2656 2676 2669 2678 2671 2664 2657 2677 2670 2678 2671 2666 2659 2665 2658 2679 2672 2667 2660 2666 2659 2680 2673 2668 2661 2667 2660 2681 2674 2669 2662 2668 2661 2682 2675 2670 2663 2669 2662 2683 2676 2671 2664 2670 2663 2684 2677 2672 2665 2671 2664 2685 2678 2673 2679 2672 2665 2377 2371 2674 2668 2378 2372 2380 2374 2675 2667 2377 2371 2382 2376 2676 2669 2380 2374 2384 2378 2677 2670 2382 2376 2384 2378 2679 2672 2678 2671 2386 2382 2680 2673 2679 2672 2388 2384 2681 2674 2680 2673 2390 2386 2682 2675 2681 2674 2392 2388 2683 2676 2682 2675 2394 2390 2684 2677 2683 2676 2396 2392 2685 2678 2684 2677 2398 2394 2686 2680 2685 2678 2688 2681 2690 2682 2687 2683 2691 2684 2689 2685 2688 2681 2693 2686 2692 2687 2691 2684 2695 2688 2694 2689 2693 2686 2697 2690 2696 2691 2695 2688 2699 2692 2698 2693 2697 2690 2701 2694 2700 2695 2699 2692 2701 2694 2704 2696 2702 2697 2703 2698 2706 2699 2704 2696 2705 2700 2708 2701 2706 2699 2707 2702 2710 2703 2708 2701 2709 2704 2378 2372 2710 2703 2712 2705 2687 2683 2711 2706 2713 2707 2688 2681 2712 2705 2714 2708 2691 2684 2713 2707 2715 2709 2693 2686 2714 2708 2716 2710 2695 2688 2715 2709 2717 2711 2697 2690 2716 2710 2718 2712 2699 2692 2717 2711 2718 2712 2703 2698 2701 2694 2719 2713 2705 2700 2703 2698 2720 2714 2707 2702 2705 2700 2721 2715 2709 2704 2707 2702 2722 2716 2375 2370 2709 2704 2724 2717 2711 2706 2723 2718 2725 2719 2712 2705 2724 2717 2726 2720 2713 2707 2725 2719 2727 2721 2714 2708 2726 2720 2728 2722 2715 2709 2727 2721 2729 2723 2716 2710 2728 2722 2729 2723 2718 2712 2717 2711 2730 2724 2719 2713 2718 2712 2731 2725 2720 2714 2719 2713 2732 2726 2721 2715 2720 2714 2733 2727 2722 2716 2721 2715 2734 2728 2401 2395 2722 2716 2736 2729 2723 2718 2735 2730 2737 2731 2724 2717 2736 2729 2738 2732 2725 2719 2737 2731 2739 2733 2726 2720 2738 2732 2740 2734 2727 2721 2739 2733 2741 2735 2728 2722 2740 2734 2741 2735 2730 2724 2729 2723 2742 2736 2731 2725 2730 2724 2743 2737 2732 2726 2731 2725 2744 2738 2733 2727 2732 2726 2745 2739 2734 2728 2733 2727 2746 2740 2414 2408 2734 2728 2748 2741 2735 2730 2747 2742 2749 2743 2736 2729 2748 2741 2750 2744 2737 2731 2749 2743 2751 2745 2738 2732 2750 2744 2752 2746 2739 2733 2751 2745 2753 2747 2740 2734 2752 2746 2753 2747 2742 2736 2741 2735 2754 2748 2743 2737 2742 2736 2755 2749 2744 2738 2743 2737 2756 2750 2745 2739 2744 2738 2757 2751 2746 2740 2745 2739 2758 2752 2427 2421 2746 2740 2760 2753 2747 2742 2759 2754 2761 2755 2748 2741 2760 2753 2762 2756 2749 2743 2761 2755 2763 2757 2750 2744 2762 2756 2764 2758 2751 2745 2763 2757 2765 2759 2752 2746 2764 2758 2765 2759 2754 2748 2753 2747 2766 2760 2755 2749 2754 2748 2767 2761 2756 2750 2755 2749 2768 2762 2757 2751 2756 2750 2769 2763 2758 2752 2757 2751 2770 2764 2440 2434 2758 2752 2772 2765 2759 2754 2771 2766 2773 2767 2760 2753 2772 2765 2774 2768 2761 2755 2773 2767 2775 2769 2762 2756 2774 2768 2776 2770 2763 2757 2775 2769 2777 2771 2764 2758 2776 2770 2777 2771 2766 2760 2765 2759 2778 2772 2767 2761 2766 2760 2779 2773 2768 2762 2767 2761 2780 2774 2769 2763 2768 2762 2781 2775 2770 2764 2769 2763 2782 2776 2453 2447 2770 2764 2784 2777 2771 2766 2783 2778 2785 2779 2772 2765 2784 2777 2786 2780 2773 2767 2785 2779 2787 2781 2774 2768 2786 2780 2788 2782 2775 2769 2787 2781 2788 2782 2777 2771 2776 2770 2789 2783 2778 2772 2777 2771 2790 2784 2779 2773 2778 2772 2791 2785 2780 2774 2779 2773 2792 2786 2781 2775 2780 2774 2793 2787 2782 2776 2781 2775 2794 2788 2466 2460 2782 2776 2796 2789 2783 2778 2795 2790 2797 2791 2784 2777 2796 2789 2798 2792 2785 2779 2797 2791 2799 2793 2786 2780 2798 2792 2800 2794 2787 2781 2799 2793 2800 2794 2789 2783 2788 2782 2801 2795 2790 2784 2789 2783 2802 2796 2791 2785 2790 2784 2803 2797 2792 2786 2791 2785 2804 2798 2793 2787 2792 2786 2805 2799 2794 2788 2793 2787 2806 2800 2479 2473 2794 2788 2808 2801 2795 2790 2807 2802 2809 2803 2796 2789 2808 2801 2810 2804 2797 2791 2809 2803 2811 2805 2798 2792 2810 2804 2812 2806 2799 2793 2811 2805 2812 2806 2801 2795 2800 2794 2813 2807 2802 2796 2801 2795 2814 2808 2803 2797 2802 2796 2815 2809 2804 2798 2803 2797 2816 2810 2805 2799 2804 2798 2817 2811 2806 2800 2805 2799 2818 2812 2492 2486 2806 2800 2820 2813 2807 2802 2819 2814 2821 2815 2808 2801 2820 2813 2822 2816 2809 2803 2821 2815 2823 2817 2810 2804 2822 2816 2824 2818 2811 2805 2823 2817 2824 2818 2813 2807 2812 2806 2825 2819 2814 2808 2813 2807 2826 2820 2815 2809 2814 2808 2827 2821 2816 2810 2815 2809 2828 2822 2817 2811 2816 2810 2829 2823 2818 2812 2817 2811 2830 2824 2505 2499 2818 2812 2832 2825 2819 2814 2831 2826 2833 2827 2820 2813 2832 2825 2834 2828 2821 2815 2833 2827 2835 2829 2822 2816 2834 2828 2836 2830 2823 2817 2835 2829 2836 2830 2825 2819 2824 2818 2837 2831 2826 2820 2825 2819 2838 2832 2827 2821 2826 2820 2839 2833 2828 2822 2827 2821 2840 2834 2829 2823 2828 2822 2841 2835 2830 2824 2829 2823 2842 2836 2518 2512 2830 2824 2843 2837 2832 2825 2831 2826 2844 2838 2833 2827 2832 2825 2845 2839 2834 2828 2833 2827 2846 2840 2835 2829 2834 2828 2847 2841 2836 2830 2835 2829 2849 2842 2836 2830 2848 2843 2850 2844 2837 2831 2849 2842 2851 2845 2838 2832 2850 2844 2852 2846 2839 2833 2851 2845 2853 2847 2840 2834 2852 2846 2854 2848 2841 2835 2853 2847 2544 2539 2842 2836 2854 2848 2855 2849 2844 2838 2843 2837 2856 2850 2845 2839 2844 2838 2857 2851 2846 2840 2845 2839 2858 2852 2847 2841 2846 2840 2859 2853 2848 2843 2847 2841 2861 2854 2848 2843 2860 2855 2862 2856 2849 2842 2861 2854 2863 2857 2850 2844 2862 2856 2864 2858 2851 2845 2863 2857 2865 2859 2852 2846 2864 2858 2866 2860 2853 2847 2865 2859 2557 2551 2854 2848 2866 2860 2867 2861 2856 2850 2855 2849 2868 2862 2857 2851 2856 2850 2869 2863 2858 2852 2857 2851 2870 2864 2859 2853 2858 2852 2871 2865 2860 2855 2859 2853 2873 2866 2860 2855 2872 2867 2874 2868 2861 2854 2873 2866 2875 2869 2862 2856 2874 2868 2876 2870 2863 2857 2875 2869 2877 2871 2864 2858 2876 2870 2878 2872 2865 2859 2877 2871 2570 2564 2866 2860 2878 2872 2879 2873 2868 2862 2867 2861 2880 2874 2869 2863 2868 2862 2881 2875 2870 2864 2869 2863 2882 2876 2871 2865 2870 2864 2883 2877 2872 2867 2871 2865 2885 2878 2872 2867 2884 2879 2886 2880 2873 2866 2885 2878 2887 2881 2874 2868 2886 2880 2888 2882 2875 2869 2887 2881 2889 2883 2876 2870 2888 2882 2890 2884 2877 2871 2889 2883 2583 2577 2878 2872 2890 2884 2891 2885 2880 2874 2879 2873 2892 2886 2881 2875 2880 2874 2893 2887 2882 2876 2881 2875 2894 2888 2883 2877 2882 2876 2895 2889 2884 2879 2883 2877 2897 2890 2884 2879 2896 2891 2898 2892 2885 2878 2897 2890 2899 2893 2886 2880 2898 2892 2900 2894 2887 2881 2899 2893 2901 2895 2888 2882 2900 2894 2902 2896 2889 2883 2901 2895 2596 2590 2890 2884 2902 2896 2903 2897 2892 2886 2891 2885 2904 2898 2893 2887 2892 2886 2905 2899 2894 2888 2893 2887 2906 2900 2895 2889 2894 2888 2907 2901 2896 2891 2895 2889 2908 2902 2897 2890 2896 2891 2910 2903 2897 2890 2909 2904 2911 2905 2898 2892 2910 2903 2912 2906 2899 2893 2911 2905 2913 2907 2900 2894 2912 2906 2914 2908 2901 2895 2913 2907 2609 2603 2902 2896 2914 2908 2915 2909 2904 2898 2903 2897 2916 2910 2905 2899 2904 2898 2917 2911 2906 2900 2905 2899 2918 2912 2907 2901 2906 2900 2919 2913 2908 2902 2907 2901 2920 2914 2909 2904 2908 2902 2922 2915 2909 2904 2921 2916 2923 2917 2910 2903 2922 2915 2924 2918 2911 2905 2923 2917 2925 2919 2912 2906 2924 2918 2926 2920 2913 2907 2925 2919 2622 2616 2914 2908 2926 2920 2927 2921 2916 2910 2915 2909 2928 2922 2917 2911 2916 2910 2929 2923 2918 2912 2917 2911 2930 2924 2919 2913 2918 2912 2931 2925 2920 2914 2919 2913 2932 2926 2921 2916 2920 2914 2934 2927 2921 2916 2933 2928 2935 2929 2922 2915 2934 2927 2936 2930 2923 2917 2935 2929 2937 2931 2924 2918 2936 2930 2938 2932 2925 2919 2937 2931 2635 2629 2926 2920 2938 2932 2939 2933 2928 2922 2927 2921 2940 2934 2929 2923 2928 2922 2941 2935 2930 2924 2929 2923 2942 2936 2931 2925 2930 2924 2943 2937 2932 2926 2931 2925 2944 2938 2933 2928 2932 2926 2946 2939 2933 2928 2945 2940 2947 2941 2934 2927 2946 2939 2948 2942 2935 2929 2947 2941 2949 2943 2936 2930 2948 2942 2950 2944 2937 2931 2949 2943 2648 2642 2938 2932 2950 2944 2951 2945 2940 2934 2939 2933 2952 2946 2941 2935 2940 2934 2953 2947 2942 2936 2941 2935 2954 2948 2943 2937 2942 2936 2955 2949 2944 2938 2943 2937 2956 2950 2945 2940 2944 2938 2958 2951 2945 2940 2957 2952 2959 2953 2946 2939 2958 2951 2960 2954 2947 2941 2959 2953 2961 2955 2948 2942 2960 2954 2962 2956 2949 2943 2961 2955 2661 2655 2950 2944 2962 2956 2963 2957 2952 2946 2951 2945 2964 2958 2953 2947 2952 2946 2965 2959 2954 2948 2953 2947 2966 2960 2955 2949 2954 2948 2967 2961 2956 2950 2955 2949 2968 2962 2957 2952 2956 2950 2969 2963 2958 2951 2957 2952 2971 2964 2958 2951 2970 2965 2972 2966 2959 2953 2971 2964 2973 2967 2960 2954 2972 2966 2974 2968 2961 2955 2973 2967 2674 2668 2962 2956 2974 2968 2690 2682 2964 2958 2963 2957 2689 2685 2965 2959 2964 2958 2692 2687 2966 2960 2965 2959 2694 2689 2967 2961 2966 2960 2696 2691 2968 2962 2967 2961 2698 2693 2969 2963 2968 2962 2700 2695 2970 2965 2969 2963 2704 2696 2970 2965 2702 2697 2706 2699 2971 2964 2704 2696 2708 2701 2972 2966 2706 2699 2710 2703 2973 2967 2708 2701 2378 2372 2974 2968 2710 2703 2976 2969 2978 2970 2975 2971 2976 2969 2980 2972 2977 2973 2979 2974 2982 2975 2980 2972 2981 2976 2984 2977 2982 2975 2983 2978 2986 2979 2984 2977 2985 2980 2988 2981 2986 2979 2987 2982 2990 2983 2988 2981 2989 2984 2992 2985 2990 2983 2993 2986 2992 2985 2991 2987 2995 2988 2994 2989 2993 2986 2997 2990 2996 2991 2995 2988 2997 2990 2999 2992 2998 2993 3001 2994 2975 2971 3000 2995 3001 2994 2979 2974 2976 2969 3002 2996 2981 2976 2979 2974 3003 2997 2983 2978 2981 2976 3004 2998 2985 2980 2983 2978 3005 2999 2987 2982 2985 2980 3006 3000 2989 2984 2987 2982 3007 3001 2991 2987 2989 2984 3009 3002 2991 2987 3008 3003 3010 3004 2993 2986 3009 3002 3011 3005 2995 2988 3010 3004 3011 3005 2999 2992 2997 2990 3013 3006 3000 2995 3012 3007 3013 3006 3002 2996 3001 2994 3014 3008 3003 2997 3002 2996 3015 3009 3004 2998 3003 2997 3016 3010 3005 2999 3004 2998 3017 3011 3006 3000 3005 2999 3018 3012 3007 3001 3006 3000 3019 3013 3008 3003 3007 3001 3021 3014 3008 3003 3020 3015 3022 3016 3009 3002 3021 3014 3023 3017 3010 3004 3022 3016 3023 3017 2999 2992 3011 3005 3025 3018 3012 3007 3024 3019 3025 3018 3014 3008 3013 3006 3026 3020 3015 3009 3014 3008 3027 3021 3016 3010 3015 3009 3028 3022 3017 3011 3016 3010 3029 3023 3018 3012 3017 3011 3030 3024 3019 3013 3018 3012 3031 3025 3020 3015 3019 3013 3033 3026 3020 3015 3032 3027 3034 3028 3021 3014 3033 3026 3035 3029 3022 3016 3034 3028 3035 3029 2999 2992 3023 3017 3037 3030 3024 3019 3036 3031 3037 3030 3026 3020 3025 3018 3038 3032 3027 3021 3026 3020 3039 3033 3028 3022 3027 3021 3040 3034 3029 3023 3028 3022 3041 3035 3030 3024 3029 3023 3042 3036 3031 3025 3030 3024 3043 3037 3032 3027 3031 3025 3045 3038 3032 3027 3044 3039 3046 3040 3033 3026 3045 3038 3047 3041 3034 3028 3046 3040 3047 3041 2999 2992 3035 3029 3049 3042 3036 3031 3048 3043 3049 3042 3038 3032 3037 3030 3050 3044 3039 3033 3038 3032 3051 3045 3040 3034 3039 3033 3052 3046 3041 3035 3040 3034 3053 3047 3042 3036 3041 3035 3054 3048 3043 3037 3042 3036 3055 3049 3044 3039 3043 3037 3057 3050 3044 3039 3056 3051 3058 3052 3045 3038 3057 3050 3059 3053 3046 3040 3058 3052 3059 3053 2999 2992 3047 3041 3060 3054 3049 3042 3048 3043 3062 3055 3049 3042 3061 3056 3063 3057 3050 3044 3062 3055 3064 3058 3051 3045 3063 3057 3065 3059 3052 3046 3064 3058 3066 3060 3053 3047 3065 3059 3067 3061 3054 3048 3066 3060 3068 3062 3055 3049 3067 3061 3068 3062 3057 3050 3056 3051 3069 3063 3058 3052 3057 3050 3070 3064 3059 3053 3058 3052 3071 3065 2999 2992 3059 3053 3072 3066 3061 3056 3060 3054 3074 3067 3061 3056 3073 3068 3075 3069 3062 3055 3074 3067 3076 3070 3063 3057 3075 3069 3077 3071 3064 3058 3076 3070 3078 3072 3065 3059 3077 3071 3079 3073 3066 3060 3078 3072 3080 3074 3067 3061 3079 3073 3080 3074 3069 3063 3068 3062 3081 3075 3070 3064 3069 3063 3082 3076 3071 3065 3070 3064 3083 3077 2999 2992 3071 3065 3084 3078 3073 3068 3072 3066 3086 3079 3073 3068 3085 3080 3087 3081 3074 3067 3086 3079 3088 3082 3075 3069 3087 3081 3089 3083 3076 3070 3088 3082 3090 3084 3077 3071 3089 3083 3091 3085 3078 3072 3090 3084 3092 3086 3079 3073 3091 3085 3092 3086 3081 3075 3080 3074 3093 3087 3082 3076 3081 3075 3094 3088 3083 3077 3082 3076 3095 3089 2999 2992 3083 3077 3096 3090 3085 3080 3084 3078 3098 3091 3085 3080 3097 3092 3099 3093 3086 3079 3098 3091 3100 3094 3087 3081 3099 3093 3101 3095 3088 3082 3100 3094 3102 3096 3089 3083 3101 3095 3103 3097 3090 3084 3102 3096 3104 3098 3091 3085 3103 3097 3104 3098 3093 3087 3092 3086 3105 3099 3094 3088 3093 3087 3106 3100 3095 3089 3094 3088 3107 3101 2999 2992 3095 3089 3108 3102 3097 3092 3096 3090 3110 3103 3097 3092 3109 3104 3111 3105 3098 3091 3110 3103 3112 3106 3099 3093 3111 3105 3113 3107 3100 3094 3112 3106 3114 3108 3101 3095 3113 3107 3115 3109 3102 3096 3114 3108 3116 3110 3103 3097 3115 3109 3116 3110 3105 3099 3104 3098 3117 3111 3106 3100 3105 3099 3118 3112 3107 3101 3106 3100 3119 3113 2999 2992 3107 3101 3121 3114 3109 3104 3108 3102 3123 3115 3109 3104 3122 3116 3124 3117 3110 3103 3123 3115 3125 3118 3111 3105 3124 3117 3126 3119 3112 3106 3125 3118 3127 3120 3113 3107 3126 3119 3128 3121 3114 3108 3127 3120 3129 3122 3115 3109 3128 3121 3129 3122 3117 3111 3116 3110 3130 3123 3118 3112 3117 3111 3131 3124 3119 3113 3118 3112 3132 3125 3120 3126 3119 3113 3134 3127 3136 3128 3133 3129 3134 3127 3138 3130 3135 3131 3137 3132 3140 3133 3138 3130 3139 3134 3142 3135 3140 3133 3141 3136 3144 3137 3142 3135 3143 3138 3146 3139 3144 3137 3145 3140 3148 3141 3146 3139 3147 3142 3150 3143 3148 3141 3151 3144 3150 3143 3149 3145 3153 3146 3152 3147 3151 3144 3155 3148 3154 3149 3153 3146 3155 3148 2999 2992 3156 3150 3158 3151 3133 3129 3157 3152 3158 3151 3137 3132 3134 3127 3159 3153 3139 3134 3137 3132 3160 3154 3141 3136 3139 3134 3161 3155 3143 3138 3141 3136 3162 3156 3145 3140 3143 3138 3163 3157 3147 3142 3145 3140 3164 3158 3149 3145 3147 3142 3166 3159 3149 3145 3165 3160 3167 3161 3151 3144 3166 3159 3168 3162 3153 3146 3167 3161 3168 3162 2999 2992 3155 3148 3170 3163 3157 3152 3169 3164 3170 3163 3159 3153 3158 3151 3171 3165 3160 3154 3159 3153 3172 3166 3161 3155 3160 3154 3173 3167 3162 3156 3161 3155 3174 3168 3163 3157 3162 3156 3175 3169 3164 3158 3163 3157 3176 3170 3165 3160 3164 3158 3178 3171 3165 3160 3177 3172 3179 3173 3166 3159 3178 3171 3180 3174 3167 3161 3179 3173 3180 3174 2999 2992 3168 3162 3182 3175 3169 3164 3181 3176 3182 3175 3171 3165 3170 3163 3183 3177 3172 3166 3171 3165 3184 3178 3173 3167 3172 3166 3185 3179 3174 3168 3173 3167 3186 3180 3175 3169 3174 3168 3187 3181 3176 3170 3175 3169 3188 3182 3177 3172 3176 3170 3190 3183 3177 3172 3189 3184 3191 3185 3178 3171 3190 3183 3192 3186 3179 3173 3191 3185 3192 3186 2999 2992 3180 3174 3194 3187 3181 3176 3193 3188 3194 3187 3183 3177 3182 3175 3195 3189 3184 3178 3183 3177 3196 3190 3185 3179 3184 3178 3197 3191 3186 3180 3185 3179 3198 3192 3187 3181 3186 3180 3199 3193 3188 3182 3187 3181 3200 3194 3189 3184 3188 3182 3202 3195 3189 3184 3201 3196 3203 3197 3190 3183 3202 3195 3204 3198 3191 3185 3203 3197 3204 3198 2999 2992 3192 3186 3206 3199 3193 3188 3205 3200 3206 3199 3195 3189 3194 3187 3207 3201 3196 3190 3195 3189 3208 3202 3197 3191 3196 3190 3209 3203 3198 3192 3197 3191 3210 3204 3199 3193 3198 3192 3211 3205 3200 3194 3199 3193 3212 3206 3201 3196 3200 3194 3214 3207 3201 3196 3213 3208 3215 3209 3202 3195 3214 3207 3216 3210 3203 3197 3215 3209 3216 3210 2999 2992 3204 3198 3217 3211 3206 3199 3205 3200 3219 3212 3206 3199 3218 3213 3220 3214 3207 3201 3219 3212 3221 3215 3208 3202 3220 3214 3222 3216 3209 3203 3221 3215 3223 3217 3210 3204 3222 3216 3224 3218 3211 3205 3223 3217 3225 3219 3212 3206 3224 3218 3225 3219 3214 3207 3213 3208 3226 3220 3215 3209 3214 3207 3227 3221 3216 3210 3215 3209 3228 3222 2999 2992 3216 3210 3229 3223 3218 3213 3217 3211 3231 3224 3218 3213 3230 3225 3232 3226 3219 3212 3231 3224 3233 3227 3220 3214 3232 3226 3234 3228 3221 3215 3233 3227 3235 3229 3222 3216 3234 3228 3236 3230 3223 3217 3235 3229 3237 3231 3224 3218 3236 3230 3237 3231 3226 3220 3225 3219 3238 3232 3227 3221 3226 3220 3239 3233 3228 3222 3227 3221 3240 3234 2999 2992 3228 3222 3241 3235 3230 3225 3229 3223 3243 3236 3230 3225 3242 3237 3244 3238 3231 3224 3243 3236 3245 3239 3232 3226 3244 3238 3246 3240 3233 3227 3245 3239 3247 3241 3234 3228 3246 3240 3248 3242 3235 3229 3247 3241 3249 3243 3236 3230 3248 3242 3249 3243 3238 3232 3237 3231 3250 3244 3239 3233 3238 3232 3251 3245 3240 3234 3239 3233 3252 3246 2999 2992 3240 3234 3253 3247 3242 3237 3241 3235 3255 3248 3242 3237 3254 3249 3256 3250 3243 3236 3255 3248 3257 3251 3244 3238 3256 3250 3258 3252 3245 3239 3257 3251 3259 3253 3246 3240 3258 3252 3260 3254 3247 3241 3259 3253 3261 3255 3248 3242 3260 3254 3261 3255 3250 3244 3249 3243 3262 3256 3251 3245 3250 3244 3263 3257 3252 3246 3251 3245 3264 3258 2999 2992 3252 3246 3265 3259 3254 3249 3253 3247 3267 3260 3254 3249 3266 3261 3268 3262 3255 3248 3267 3260 3269 3263 3256 3250 3268 3262 3270 3264 3257 3251 3269 3263 3271 3265 3258 3252 3270 3264 3272 3266 3259 3253 3271 3265 3273 3267 3260 3254 3272 3266 3273 3267 3262 3256 3261 3255 3274 3268 3263 3257 3262 3256 3275 3269 3264 3258 3263 3257 3276 3270 2999 2992 3264 3258 2978 2970 3266 3261 3265 3259 2980 2972 3266 3261 2977 2973 2982 2975 3267 3260 2980 2972 2984 2977 3268 3262 2982 2975 2986 2979 3269 3263 2984 2977 2988 2981 3270 3264 2986 2979 2990 2983 3271 3265 2988 2981 2992 2985 3272 3266 2990 2983 2992 2985 3274 3268 3273 3267 2994 2989 3275 3269 3274 3268 2996 2991 3276 3270 3275 3269 2998 2993 3120 3126 3276 3270 3278 3271 3280 3272 3277 3273 3278 3271 3282 3274 3279 3275 3281 3276 3284 3277 3282 3274 3283 3278 3286 3279 3284 3277 3285 3280 3288 3281 3286 3279 3287 3282 3290 3283 3288 3281 3289 3284 3292 3285 3290 3283 3291 3286 3294 3287 3292 3285 3295 3288 3294 3287 3293 3289 3297 3290 3296 3291 3295 3288 3299 3292 3298 3293 3297 3290 3299 3292 2999 2992 3300 3294 3302 3295 3277 3273 3301 3296 3302 3295 3281 3276 3278 3271 3303 3297 3283 3278 3281 3276 3304 3298 3285 3280 3283 3278 3305 3299 3287 3282 3285 3280 3306 3300 3289 3284 3287 3282 3307 3301 3291 3286 3289 3284 3308 3302 3293 3289 3291 3286 3310 3303 3293 3289 3309 3304 3311 3305 3295 3288 3310 3303 3312 3306 3297 3290 3311 3305 3312 3306 2999 2992 3299 3292 3314 3307 3301 3296 3313 3308 3314 3307 3303 3297 3302 3295 3315 3309 3304 3298 3303 3297 3316 3310 3305 3299 3304 3298 3317 3311 3306 3300 3305 3299 3318 3312 3307 3301 3306 3300 3319 3313 3308 3302 3307 3301 3320 3314 3309 3304 3308 3302 3322 3315 3309 3304 3321 3316 3323 3317 3310 3303 3322 3315 3324 3318 3311 3305 3323 3317 3324 3318 2999 2992 3312 3306 3326 3319 3313 3308 3325 3320 3326 3319 3315 3309 3314 3307 3327 3321 3316 3310 3315 3309 3328 3322 3317 3311 3316 3310 3329 3323 3318 3312 3317 3311 3330 3324 3319 3313 3318 3312 3331 3325 3320 3314 3319 3313 3332 3326 3321 3316 3320 3314 3334 3327 3321 3316 3333 3328 3335 3329 3322 3315 3334 3327 3336 3330 3323 3317 3335 3329 3336 3330 2999 2992 3324 3318 3338 3331 3325 3320 3337 3332 3338 3331 3327 3321 3326 3319 3339 3333 3328 3322 3327 3321 3340 3334 3329 3323 3328 3322 3341 3335 3330 3324 3329 3323 3342 3336 3331 3325 3330 3324 3343 3337 3332 3326 3331 3325 3344 3338 3333 3328 3332 3326 3346 3339 3333 3328 3345 3340 3347 3341 3334 3327 3346 3339 3348 3342 3335 3329 3347 3341 3348 3342 2999 2992 3336 3330 3350 3343 3337 3332 3349 3344 3350 3343 3339 3333 3338 3331 3351 3345 3340 3334 3339 3333 3352 3346 3341 3335 3340 3334 3353 3347 3342 3336 3341 3335 3354 3348 3343 3337 3342 3336 3355 3349 3344 3338 3343 3337 3356 3350 3345 3340 3344 3338 3358 3351 3345 3340 3357 3352 3359 3353 3346 3339 3358 3351 3360 3354 3347 3341 3359 3353 3360 3354 2999 2992 3348 3342 3361 3355 3350 3343 3349 3344 3363 3356 3350 3343 3362 3357 3364 3358 3351 3345 3363 3356 3365 3359 3352 3346 3364 3358 3366 3360 3353 3347 3365 3359 3367 3361 3354 3348 3366 3360 3368 3362 3355 3349 3367 3361 3369 3363 3356 3350 3368 3362 3369 3363 3358 3351 3357 3352 3370 3364 3359 3353 3358 3351 3371 3365 3360 3354 3359 3353 3372 3366 2999 2992 3360 3354 3373 3367 3362 3357 3361 3355 3375 3368 3362 3357 3374 3369 3376 3370 3363 3356 3375 3368 3377 3371 3364 3358 3376 3370 3378 3372 3365 3359 3377 3371 3379 3373 3366 3360 3378 3372 3380 3374 3367 3361 3379 3373 3381 3375 3368 3362 3380 3374 3381 3375 3370 3364 3369 3363 3382 3376 3371 3365 3370 3364 3383 3377 3372 3366 3371 3365 3384 3378 2999 2992 3372 3366 3385 3379 3374 3369 3373 3367 3387 3380 3374 3369 3386 3381 3388 3382 3375 3368 3387 3380 3389 3383 3376 3370 3388 3382 3390 3384 3377 3371 3389 3383 3391 3385 3378 3372 3390 3384 3392 3386 3379 3373 3391 3385 3393 3387 3380 3374 3392 3386 3393 3387 3382 3376 3381 3375 3394 3388 3383 3377 3382 3376 3395 3389 3384 3378 3383 3377 3396 3390 2999 2992 3384 3378 3397 3391 3386 3381 3385 3379 3399 3392 3386 3381 3398 3393 3400 3394 3387 3380 3399 3392 3401 3395 3388 3382 3400 3394 3402 3396 3389 3383 3401 3395 3403 3397 3390 3384 3402 3396 3404 3398 3391 3385 3403 3397 3405 3399 3392 3386 3404 3398 3405 3399 3394 3388 3393 3387 3406 3400 3395 3389 3394 3388 3407 3401 3396 3390 3395 3389 3408 3402 2999 2992 3396 3390 3409 3403 3398 3393 3397 3391 3411 3404 3398 3393 3410 3405 3412 3406 3399 3392 3411 3404 3413 3407 3400 3394 3412 3406 3414 3408 3401 3395 3413 3407 3415 3409 3402 3396 3414 3408 3416 3410 3403 3397 3415 3409 3417 3411 3404 3398 3416 3410 3417 3411 3406 3400 3405 3399 3418 3412 3407 3401 3406 3400 3419 3413 3408 3402 3407 3401 3420 3414 2999 2992 3408 3402 3136 3128 3410 3405 3409 3403 3138 3130 3410 3405 3135 3131 3140 3133 3411 3404 3138 3130 3142 3135 3412 3406 3140 3133 3144 3137 3413 3407 3142 3135 3146 3139 3414 3408 3144 3137 3148 3141 3415 3409 3146 3139 3150 3143 3416 3410 3148 3141 3150 3143 3418 3412 3417 3411 3152 3147 3419 3413 3418 3412 3154 3149 3420 3414 3419 3413 3156 3150 3120 3126 3420 3414 3422 3415 3121 3114 3421 3416 3422 3415 3123 3115 3122 3116 3423 3417 3124 3117 3123 3115 3424 3418 3125 3118 3124 3117 3425 3419 3126 3119 3125 3118 3426 3420 3127 3120 3126 3119 3427 3421 3128 3121 3127 3120 3428 3422 3129 3122 3128 3121 3430 3423 3129 3122 3429 3424 3431 3425 3130 3123 3430 3423 3432 3426 3131 3124 3431 3425 3432 3426 2999 2992 3132 3125 3434 3427 3421 3416 3433 3428 3434 3427 3423 3417 3422 3415 3435 3429 3424 3418 3423 3417 3436 3430 3425 3419 3424 3418 3437 3431 3426 3420 3425 3419 3438 3432 3427 3421 3426 3420 3439 3433 3428 3422 3427 3421 3440 3434 3429 3424 3428 3422 3442 3435 3429 3424 3441 3436 3443 3437 3430 3423 3442 3435 3444 3438 3431 3425 3443 3437 3444 3438 2999 2992 3432 3426 3446 3439 3433 3428 3445 3440 3446 3439 3435 3429 3434 3427 3447 3441 3436 3430 3435 3429 3448 3442 3437 3431 3436 3430 3449 3443 3438 3432 3437 3431 3450 3444 3439 3433 3438 3432 3451 3445 3440 3434 3439 3433 3452 3446 3441 3436 3440 3434 3454 3447 3441 3436 3453 3448 3455 3449 3442 3435 3454 3447 3456 3450 3443 3437 3455 3449 3456 3450 2999 2992 3444 3438 3458 3451 3445 3440 3457 3452 3458 3451 3447 3441 3446 3439 3459 3453 3448 3442 3447 3441 3460 3454 3449 3443 3448 3442 3461 3455 3450 3444 3449 3443 3462 3456 3451 3445 3450 3444 3463 3457 3452 3446 3451 3445 3464 3458 3453 3448 3452 3446 3466 3459 3453 3448 3465 3460 3467 3461 3454 3447 3466 3459 3468 3462 3455 3449 3467 3461 3468 3462 2999 2992 3456 3450 3470 3463 3457 3452 3469 3464 3470 3463 3459 3453 3458 3451 3471 3465 3460 3454 3459 3453 3472 3466 3461 3455 3460 3454 3473 3467 3462 3456 3461 3455 3474 3468 3463 3457 3462 3456 3475 3469 3464 3458 3463 3457 3476 3470 3465 3460 3464 3458 3478 3471 3465 3460 3477 3472 3479 3473 3466 3459 3478 3471 3480 3474 3467 3461 3479 3473 3480 3474 2999 2992 3468 3462 3482 3475 3469 3464 3481 3476 3482 3475 3471 3465 3470 3463 3483 3477 3472 3466 3471 3465 3484 3478 3473 3467 3472 3466 3485 3479 3474 3468 3473 3467 3486 3480 3475 3469 3474 3468 3487 3481 3476 3470 3475 3469 3488 3482 3477 3472 3476 3470 3490 3483 3477 3472 3489 3484 3491 3485 3478 3471 3490 3483 3492 3486 3479 3473 3491 3485 3492 3486 2999 2992 3480 3474 3493 3487 3482 3475 3481 3476 3495 3488 3482 3475 3494 3489 3496 3490 3483 3477 3495 3488 3497 3491 3484 3478 3496 3490 3498 3492 3485 3479 3497 3491 3499 3493 3486 3480 3498 3492 3500 3494 3487 3481 3499 3493 3501 3495 3488 3482 3500 3494 3501 3495 3490 3483 3489 3484 3502 3496 3491 3485 3490 3483 3503 3497 3492 3486 3491 3485 3504 3498 2999 2992 3492 3486 3505 3499 3494 3489 3493 3487 3507 3500 3494 3489 3506 3501 3508 3502 3495 3488 3507 3500 3509 3503 3496 3490 3508 3502 3510 3504 3497 3491 3509 3503 3511 3505 3498 3492 3510 3504 3512 3506 3499 3493 3511 3505 3513 3507 3500 3494 3512 3506 3513 3507 3502 3496 3501 3495 3514 3508 3503 3497 3502 3496 3515 3509 3504 3498 3503 3497 3516 3510 2999 2992 3504 3498 3517 3511 3506 3501 3505 3499 3519 3512 3506 3501 3518 3513 3520 3514 3507 3500 3519 3512 3521 3515 3508 3502 3520 3514 3522 3516 3509 3503 3521 3515 3523 3517 3510 3504 3522 3516 3524 3518 3511 3505 3523 3517 3525 3519 3512 3506 3524 3518 3525 3519 3514 3508 3513 3507 3526 3520 3515 3509 3514 3508 3527 3521 3516 3510 3515 3509 3528 3522 2999 2992 3516 3510 3529 3523 3518 3513 3517 3511 3531 3524 3518 3513 3530 3525 3532 3526 3519 3512 3531 3524 3533 3527 3520 3514 3532 3526 3534 3528 3521 3515 3533 3527 3535 3529 3522 3516 3534 3528 3536 3530 3523 3517 3535 3529 3537 3531 3524 3518 3536 3530 3537 3531 3526 3520 3525 3519 3538 3532 3527 3521 3526 3520 3539 3533 3528 3522 3527 3521 3540 3534 2999 2992 3528 3522 3541 3535 3530 3525 3529 3523 3543 3536 3530 3525 3542 3537 3544 3538 3531 3524 3543 3536 3545 3539 3532 3526 3544 3538 3546 3540 3533 3527 3545 3539 3547 3541 3534 3528 3546 3540 3548 3542 3535 3529 3547 3541 3549 3543 3536 3530 3548 3542 3549 3543 3538 3532 3537 3531 3550 3544 3539 3533 3538 3532 3551 3545 3540 3534 3539 3533 3552 3546 2999 2992 3540 3534 3280 3272 3542 3537 3541 3535 3282 3274 3542 3537 3279 3275 3284 3277 3543 3536 3282 3274 3286 3279 3544 3538 3284 3277 3288 3281 3545 3539 3286 3279 3290 3283 3546 3540 3288 3281 3292 3285 3547 3541 3290 3283 3294 3287 3548 3542 3292 3285 3294 3287 3550 3544 3549 3543 3296 3291 3551 3545 3550 3544 3298 3293 3552 3546 3551 3545 3300 3294 3120 3126 3552 3546 3554 3547 3556 3548 3553 3549 3557 3550 3555 3551 3554 3547 3559 3552 3558 3553 3557 3550 3561 3554 3560 3555 3559 3552 3563 3556 3562 3557 3561 3554 3565 3558 3564 3559 3563 3556 3567 3560 3566 3561 3565 3558 3569 3562 3568 3563 3567 3560 3571 3564 3570 3565 3569 3562 3573 3566 3572 3567 3571 3564 3575 3568 3574 3569 3573 3566 2975 2971 3576 3570 3575 3568 3578 3571 3553 3549 3577 3572 3579 3573 3554 3547 3578 3571 3580 3574 3557 3550 3579 3573 3581 3575 3559 3552 3580 3574 3582 3576 3561 3554 3581 3575 3583 3577 3563 3556 3582 3576 3584 3578 3565 3558 3583 3577 3585 3579 3567 3560 3584 3578 3586 3580 3569 3562 3585 3579 3587 3581 3571 3564 3586 3580 3588 3582 3573 3566 3587 3581 3000 2995 3575 3568 3588 3582 3590 3583 3577 3572 3589 3584 3591 3585 3578 3571 3590 3583 3592 3586 3579 3573 3591 3585 3593 3587 3580 3574 3592 3586 3594 3588 3581 3575 3593 3587 3595 3589 3582 3576 3594 3588 3596 3590 3583 3577 3595 3589 3597 3591 3584 3578 3596 3590 3598 3592 3585 3579 3597 3591 3599 3593 3586 3580 3598 3592 3600 3594 3587 3581 3599 3593 3012 3007 3588 3582 3600 3594 3602 3595 3589 3584 3601 3596 3603 3597 3590 3583 3602 3595 3604 3598 3591 3585 3603 3597 3605 3599 3592 3586 3604 3598 3606 3600 3593 3587 3605 3599 3607 3601 3594 3588 3606 3600 3608 3602 3595 3589 3607 3601 3609 3603 3596 3590 3608 3602 3610 3604 3597 3591 3609 3603 3611 3605 3598 3592 3610 3604 3612 3606 3599 3593 3611 3605 3024 3019 3600 3594 3612 3606 3614 3607 3601 3596 3613 3608 3615 3609 3602 3595 3614 3607 3616 3610 3603 3597 3615 3609 3617 3611 3604 3598 3616 3610 3618 3612 3605 3599 3617 3611 3619 3613 3606 3600 3618 3612 3620 3614 3607 3601 3619 3613 3621 3615 3608 3602 3620 3614 3622 3616 3609 3603 3621 3615 3623 3617 3610 3604 3622 3616 3624 3618 3611 3605 3623 3617 3036 3031 3612 3606 3624 3618 3626 3619 3613 3608 3625 3620 3627 3621 3614 3607 3626 3619 3628 3622 3615 3609 3627 3621 3629 3623 3616 3610 3628 3622 3630 3624 3617 3611 3629 3623 3631 3625 3618 3612 3630 3624 3632 3626 3619 3613 3631 3625 3633 3627 3620 3614 3632 3626 3634 3628 3621 3615 3633 3627 3635 3629 3622 3616 3634 3628 3636 3630 3623 3617 3635 3629 3048 3043 3624 3618 3636 3630 3637 3631 3626 3619 3625 3620 3638 3632 3627 3621 3626 3619 3639 3633 3628 3622 3627 3621 3640 3634 3629 3623 3628 3622 3641 3635 3630 3624 3629 3623 3642 3636 3631 3625 3630 3624 3643 3637 3632 3626 3631 3625 3644 3638 3633 3627 3632 3626 3645 3639 3634 3628 3633 3627 3646 3640 3635 3629 3634 3628 3647 3641 3636 3630 3635 3629 3648 3642 3048 3043 3636 3630 3649 3643 3638 3632 3637 3631 3650 3644 3639 3633 3638 3632 3651 3645 3640 3634 3639 3633 3652 3646 3641 3635 3640 3634 3653 3647 3642 3636 3641 3635 3654 3648 3643 3637 3642 3636 3655 3649 3644 3638 3643 3637 3656 3650 3645 3639 3644 3638 3657 3651 3646 3640 3645 3639 3658 3652 3647 3641 3646 3640 3659 3653 3648 3642 3647 3641 3660 3654 3060 3054 3648 3642 3661 3655 3650 3644 3649 3643 3662 3656 3651 3645 3650 3644 3663 3657 3652 3646 3651 3645 3664 3658 3653 3647 3652 3646 3665 3659 3654 3648 3653 3647 3666 3660 3655 3649 3654 3648 3667 3661 3656 3650 3655 3649 3668 3662 3657 3651 3656 3650 3669 3663 3658 3652 3657 3651 3670 3664 3659 3653 3658 3652 3671 3665 3660 3654 3659 3653 3672 3666 3072 3066 3660 3654 3673 3667 3662 3656 3661 3655 3674 3668 3663 3657 3662 3656 3675 3669 3664 3658 3663 3657 3676 3670 3665 3659 3664 3658 3677 3671 3666 3660 3665 3659 3678 3672 3667 3661 3666 3660 3679 3673 3668 3662 3667 3661 3680 3674 3669 3663 3668 3662 3681 3675 3670 3664 3669 3663 3682 3676 3671 3665 3670 3664 3683 3677 3672 3666 3671 3665 3684 3678 3084 3078 3672 3666 3685 3679 3674 3668 3673 3667 3686 3680 3675 3669 3674 3668 3687 3681 3676 3670 3675 3669 3688 3682 3677 3671 3676 3670 3689 3683 3678 3672 3677 3671 3690 3684 3679 3673 3678 3672 3691 3685 3680 3674 3679 3673 3692 3686 3681 3675 3680 3674 3693 3687 3682 3676 3681 3675 3694 3688 3683 3677 3682 3676 3695 3689 3684 3678 3683 3677 3696 3690 3096 3090 3684 3678 3697 3691 3686 3680 3685 3679 3698 3692 3687 3681 3686 3680 3699 3693 3688 3682 3687 3681 3700 3694 3689 3683 3688 3682 3701 3695 3690 3684 3689 3683 3702 3696 3691 3685 3690 3684 3703 3697 3692 3686 3691 3685 3704 3698 3693 3687 3692 3686 3705 3699 3694 3688 3693 3687 3706 3700 3695 3689 3694 3688 3707 3701 3696 3690 3695 3689 3708 3702 3108 3102 3696 3690 3710 3703 3712 3704 3709 3705 3713 3706 3711 3707 3710 3703 3715 3708 3714 3709 3713 3706 3717 3710 3716 3711 3715 3708 3719 3712 3718 3713 3717 3710 3721 3714 3720 3715 3719 3712 3723 3716 3722 3717 3721 3714 3725 3718 3724 3719 3723 3716 3727 3720 3726 3721 3725 3718 3729 3722 3728 3723 3727 3720 3731 3724 3730 3725 3729 3722 3133 3129 3732 3726 3731 3724 3734 3727 3709 3705 3733 3728 3735 3729 3710 3703 3734 3727 3736 3730 3713 3706 3735 3729 3737 3731 3715 3708 3736 3730 3738 3732 3717 3710 3737 3731 3739 3733 3719 3712 3738 3732 3740 3734 3721 3714 3739 3733 3741 3735 3723 3716 3740 3734 3742 3736 3725 3718 3741 3735 3743 3737 3727 3720 3742 3736 3744 3738 3729 3722 3743 3737 3157 3152 3731 3724 3744 3738 3746 3739 3733 3728 3745 3740 3747 3741 3734 3727 3746 3739 3748 3742 3735 3729 3747 3741 3749 3743 3736 3730 3748 3742 3750 3744 3737 3731 3749 3743 3751 3745 3738 3732 3750 3744 3752 3746 3739 3733 3751 3745 3753 3747 3740 3734 3752 3746 3754 3748 3741 3735 3753 3747 3755 3749 3742 3736 3754 3748 3756 3750 3743 3737 3755 3749 3169 3164 3744 3738 3756 3750 3758 3751 3745 3740 3757 3752 3759 3753 3746 3739 3758 3751 3760 3754 3747 3741 3759 3753 3761 3755 3748 3742 3760 3754 3762 3756 3749 3743 3761 3755 3763 3757 3750 3744 3762 3756 3764 3758 3751 3745 3763 3757 3765 3759 3752 3746 3764 3758 3766 3760 3753 3747 3765 3759 3767 3761 3754 3748 3766 3760 3768 3762 3755 3749 3767 3761 3181 3176 3756 3750 3768 3762 3770 3763 3757 3752 3769 3764 3771 3765 3758 3751 3770 3763 3772 3766 3759 3753 3771 3765 3773 3767 3760 3754 3772 3766 3774 3768 3761 3755 3773 3767 3775 3769 3762 3756 3774 3768 3776 3770 3763 3757 3775 3769 3777 3771 3764 3758 3776 3770 3778 3772 3765 3759 3777 3771 3779 3773 3766 3760 3778 3772 3780 3774 3767 3761 3779 3773 3193 3188 3768 3762 3780 3774 3782 3775 3769 3764 3781 3776 3783 3777 3770 3763 3782 3775 3784 3778 3771 3765 3783 3777 3785 3779 3772 3766 3784 3778 3786 3780 3773 3767 3785 3779 3787 3781 3774 3768 3786 3780 3788 3782 3775 3769 3787 3781 3789 3783 3776 3770 3788 3782 3790 3784 3777 3771 3789 3783 3791 3785 3778 3772 3790 3784 3792 3786 3779 3773 3791 3785 3205 3200 3780 3774 3792 3786 3793 3787 3782 3775 3781 3776 3794 3788 3783 3777 3782 3775 3795 3789 3784 3778 3783 3777 3796 3790 3785 3779 3784 3778 3797 3791 3786 3780 3785 3779 3798 3792 3787 3781 3786 3780 3799 3793 3788 3782 3787 3781 3800 3794 3789 3783 3788 3782 3801 3795 3790 3784 3789 3783 3802 3796 3791 3785 3790 3784 3803 3797 3792 3786 3791 3785 3804 3798 3205 3200 3792 3786 3805 3799 3794 3788 3793 3787 3806 3800 3795 3789 3794 3788 3807 3801 3796 3790 3795 3789 3808 3802 3797 3791 3796 3790 3809 3803 3798 3792 3797 3791 3810 3804 3799 3793 3798 3792 3811 3805 3800 3794 3799 3793 3812 3806 3801 3795 3800 3794 3813 3807 3802 3796 3801 3795 3814 3808 3803 3797 3802 3796 3815 3809 3804 3798 3803 3797 3816 3810 3217 3211 3804 3798 3817 3811 3806 3800 3805 3799 3818 3812 3807 3801 3806 3800 3819 3813 3808 3802 3807 3801 3820 3814 3809 3803 3808 3802 3821 3815 3810 3804 3809 3803 3822 3816 3811 3805 3810 3804 3823 3817 3812 3806 3811 3805 3824 3818 3813 3807 3812 3806 3825 3819 3814 3808 3813 3807 3826 3820 3815 3809 3814 3808 3827 3821 3816 3810 3815 3809 3828 3822 3229 3223 3816 3810 3829 3823 3818 3812 3817 3811 3830 3824 3819 3813 3818 3812 3831 3825 3820 3814 3819 3813 3832 3826 3821 3815 3820 3814 3833 3827 3822 3816 3821 3815 3834 3828 3823 3817 3822 3816 3835 3829 3824 3818 3823 3817 3836 3830 3825 3819 3824 3818 3837 3831 3826 3820 3825 3819 3838 3832 3827 3821 3826 3820 3839 3833 3828 3822 3827 3821 3840 3834 3241 3235 3828 3822 3841 3835 3830 3824 3829 3823 3842 3836 3831 3825 3830 3824 3843 3837 3832 3826 3831 3825 3844 3838 3833 3827 3832 3826 3845 3839 3834 3828 3833 3827 3846 3840 3835 3829 3834 3828 3847 3841 3836 3830 3835 3829 3848 3842 3837 3831 3836 3830 3849 3843 3838 3832 3837 3831 3850 3844 3839 3833 3838 3832 3851 3845 3840 3834 3839 3833 3852 3846 3253 3247 3840 3834 3556 3548 3842 3836 3841 3835 3555 3551 3843 3837 3842 3836 3558 3553 3844 3838 3843 3837 3560 3555 3845 3839 3844 3838 3562 3557 3846 3840 3845 3839 3564 3559 3847 3841 3846 3840 3566 3561 3848 3842 3847 3841 3568 3563 3849 3843 3848 3842 3570 3565 3850 3844 3849 3843 3572 3567 3851 3845 3850 3844 3574 3569 3852 3846 3851 3845 3576 3570 3265 3259 3852 3846 3854 3847 3856 3848 3853 3849 3857 3850 3855 3851 3854 3847 3859 3852 3858 3853 3857 3850 3861 3854 3860 3855 3859 3852 3863 3856 3862 3857 3861 3854 3865 3858 3864 3859 3863 3856 3867 3860 3866 3861 3865 3858 3869 3862 3868 3863 3867 3860 3871 3864 3870 3865 3869 3862 3873 3866 3872 3867 3871 3864 3875 3868 3874 3869 3873 3866 3277 3273 3876 3870 3875 3868 3878 3871 3853 3849 3877 3872 3879 3873 3854 3847 3878 3871 3880 3874 3857 3850 3879 3873 3881 3875 3859 3852 3880 3874 3882 3876 3861 3854 3881 3875 3883 3877 3863 3856 3882 3876 3884 3878 3865 3858 3883 3877 3885 3879 3867 3860 3884 3878 3886 3880 3869 3862 3885 3879 3887 3881 3871 3864 3886 3880 3888 3882 3873 3866 3887 3881 3301 3296 3875 3868 3888 3882 3890 3883 3877 3872 3889 3884 3891 3885 3878 3871 3890 3883 3892 3886 3879 3873 3891 3885 3893 3887 3880 3874 3892 3886 3894 3888 3881 3875 3893 3887 3895 3889 3882 3876 3894 3888 3896 3890 3883 3877 3895 3889 3897 3891 3884 3878 3896 3890 3898 3892 3885 3879 3897 3891 3899 3893 3886 3880 3898 3892 3900 3894 3887 3881 3899 3893 3313 3308 3888 3882 3900 3894 3902 3895 3889 3884 3901 3896 3903 3897 3890 3883 3902 3895 3904 3898 3891 3885 3903 3897 3905 3899 3892 3886 3904 3898 3906 3900 3893 3887 3905 3899 3907 3901 3894 3888 3906 3900 3908 3902 3895 3889 3907 3901 3909 3903 3896 3890 3908 3902 3910 3904 3897 3891 3909 3903 3911 3905 3898 3892 3910 3904 3912 3906 3899 3893 3911 3905 3325 3320 3900 3894 3912 3906 3914 3907 3901 3896 3913 3908 3915 3909 3902 3895 3914 3907 3916 3910 3903 3897 3915 3909 3917 3911 3904 3898 3916 3910 3918 3912 3905 3899 3917 3911 3919 3913 3906 3900 3918 3912 3920 3914 3907 3901 3919 3913 3921 3915 3908 3902 3920 3914 3922 3916 3909 3903 3921 3915 3923 3917 3910 3904 3922 3916 3924 3918 3911 3905 3923 3917 3337 3332 3912 3906 3924 3918 3926 3919 3913 3908 3925 3920 3927 3921 3914 3907 3926 3919 3928 3922 3915 3909 3927 3921 3929 3923 3916 3910 3928 3922 3930 3924 3917 3911 3929 3923 3931 3925 3918 3912 3930 3924 3932 3926 3919 3913 3931 3925 3933 3927 3920 3914 3932 3926 3934 3928 3921 3915 3933 3927 3935 3929 3922 3916 3934 3928 3936 3930 3923 3917 3935 3929 3349 3344 3924 3918 3936 3930 3937 3931 3926 3919 3925 3920 3938 3932 3927 3921 3926 3919 3939 3933 3928 3922 3927 3921 3940 3934 3929 3923 3928 3922 3941 3935 3930 3924 3929 3923 3942 3936 3931 3925 3930 3924 3943 3937 3932 3926 3931 3925 3944 3938 3933 3927 3932 3926 3945 3939 3934 3928 3933 3927 3946 3940 3935 3929 3934 3928 3947 3941 3936 3930 3935 3929 3948 3942 3349 3344 3936 3930 3949 3943 3938 3932 3937 3931 3950 3944 3939 3933 3938 3932 3951 3945 3940 3934 3939 3933 3952 3946 3941 3935 3940 3934 3953 3947 3942 3936 3941 3935 3954 3948 3943 3937 3942 3936 3955 3949 3944 3938 3943 3937 3956 3950 3945 3939 3944 3938 3957 3951 3946 3940 3945 3939 3958 3952 3947 3941 3946 3940 3959 3953 3948 3942 3947 3941 3960 3954 3361 3355 3948 3942 3961 3955 3950 3944 3949 3943 3962 3956 3951 3945 3950 3944 3963 3957 3952 3946 3951 3945 3964 3958 3953 3947 3952 3946 3965 3959 3954 3948 3953 3947 3966 3960 3955 3949 3954 3948 3967 3961 3956 3950 3955 3949 3968 3962 3957 3951 3956 3950 3969 3963 3958 3952 3957 3951 3970 3964 3959 3953 3958 3952 3971 3965 3960 3954 3959 3953 3972 3966 3373 3367 3960 3954 3973 3967 3962 3956 3961 3955 3974 3968 3963 3957 3962 3956 3975 3969 3964 3958 3963 3957 3976 3970 3965 3959 3964 3958 3977 3971 3966 3960 3965 3959 3978 3972 3967 3961 3966 3960 3979 3973 3968 3962 3967 3961 3980 3974 3969 3963 3968 3962 3981 3975 3970 3964 3969 3963 3982 3976 3971 3965 3970 3964 3983 3977 3972 3966 3971 3965 3984 3978 3385 3379 3972 3966 3985 3979 3974 3968 3973 3967 3986 3980 3975 3969 3974 3968 3987 3981 3976 3970 3975 3969 3988 3982 3977 3971 3976 3970 3989 3983 3978 3972 3977 3971 3990 3984 3979 3973 3978 3972 3991 3985 3980 3974 3979 3973 3992 3986 3981 3975 3980 3974 3993 3987 3982 3976 3981 3975 3994 3988 3983 3977 3982 3976 3995 3989 3984 3978 3983 3977 3996 3990 3397 3391 3984 3978 3712 3704 3986 3980 3985 3979 3711 3707 3987 3981 3986 3980 3714 3709 3988 3982 3987 3981 3716 3711 3989 3983 3988 3982 3718 3713 3990 3984 3989 3983 3720 3715 3991 3985 3990 3984 3722 3717 3992 3986 3991 3985 3724 3719 3993 3987 3992 3986 3726 3721 3994 3988 3993 3987 3728 3723 3995 3989 3994 3988 3730 3725 3996 3990 3995 3989 3732 3726 3409 3403 3996 3990 3998 3991 3697 3691 3997 3992 3999 3993 3698 3692 3998 3991 4000 3994 3699 3693 3999 3993 4001 3995 3700 3694 4000 3994 4002 3996 3701 3695 4001 3995 4003 3997 3702 3696 4002 3996 4004 3998 3703 3697 4003 3997 4005 3999 3704 3698 4004 3998 4006 4000 3705 3699 4005 3999 4007 4001 3706 3700 4006 4000 4008 4002 3707 3701 4007 4001 3421 3416 3708 3702 4008 4002 4010 4003 3997 3992 4009 4004 4011 4005 3998 3991 4010 4003 4012 4006 3999 3993 4011 4005 4013 4007 4000 3994 4012 4006 4014 4008 4001 3995 4013 4007 4015 4009 4002 3996 4014 4008 4016 4010 4003 3997 4015 4009 4017 4011 4004 3998 4016 4010 4018 4012 4005 3999 4017 4011 4019 4013 4006 4000 4018 4012 4020 4014 4007 4001 4019 4013 3433 3428 4008 4002 4020 4014 4022 4015 4009 4004 4021 4016 4023 4017 4010 4003 4022 4015 4024 4018 4011 4005 4023 4017 4025 4019 4012 4006 4024 4018 4026 4020 4013 4007 4025 4019 4027 4021 4014 4008 4026 4020 4028 4022 4015 4009 4027 4021 4029 4023 4016 4010 4028 4022 4030 4024 4017 4011 4029 4023 4031 4025 4018 4012 4030 4024 4032 4026 4019 4013 4031 4025 3445 3440 4020 4014 4032 4026 4034 4027 4021 4016 4033 4028 4035 4029 4022 4015 4034 4027 4036 4030 4023 4017 4035 4029 4037 4031 4024 4018 4036 4030 4038 4032 4025 4019 4037 4031 4039 4033 4026 4020 4038 4032 4040 4034 4027 4021 4039 4033 4041 4035 4028 4022 4040 4034 4042 4036 4029 4023 4041 4035 4043 4037 4030 4024 4042 4036 4044 4038 4031 4025 4043 4037 3457 3452 4032 4026 4044 4038 4046 4039 4033 4028 4045 4040 4047 4041 4034 4027 4046 4039 4048 4042 4035 4029 4047 4041 4049 4043 4036 4030 4048 4042 4050 4044 4037 4031 4049 4043 4051 4045 4038 4032 4050 4044 4052 4046 4039 4033 4051 4045 4053 4047 4040 4034 4052 4046 4054 4048 4041 4035 4053 4047 4055 4049 4042 4036 4054 4048 4056 4050 4043 4037 4055 4049 3469 3464 4044 4038 4056 4050 4058 4051 4045 4040 4057 4052 4059 4053 4046 4039 4058 4051 4060 4054 4047 4041 4059 4053 4061 4055 4048 4042 4060 4054 4062 4056 4049 4043 4061 4055 4063 4057 4050 4044 4062 4056 4064 4058 4051 4045 4063 4057 4065 4059 4052 4046 4064 4058 4066 4060 4053 4047 4065 4059 4067 4061 4054 4048 4066 4060 4068 4062 4055 4049 4067 4061 3481 3476 4056 4050 4068 4062 4069 4063 4058 4051 4057 4052 4070 4064 4059 4053 4058 4051 4071 4065 4060 4054 4059 4053 4072 4066 4061 4055 4060 4054 4073 4067 4062 4056 4061 4055 4074 4068 4063 4057 4062 4056 4075 4069 4064 4058 4063 4057 4076 4070 4065 4059 4064 4058 4077 4071 4066 4060 4065 4059 4078 4072 4067 4061 4066 4060 4079 4073 4068 4062 4067 4061 4080 4074 3481 3476 4068 4062 4081 4075 4070 4064 4069 4063 4082 4076 4071 4065 4070 4064 4083 4077 4072 4066 4071 4065 4084 4078 4073 4067 4072 4066 4085 4079 4074 4068 4073 4067 4086 4080 4075 4069 4074 4068 4087 4081 4076 4070 4075 4069 4088 4082 4077 4071 4076 4070 4089 4083 4078 4072 4077 4071 4090 4084 4079 4073 4078 4072 4091 4085 4080 4074 4079 4073 4092 4086 3493 3487 4080 4074 4093 4087 4082 4076 4081 4075 4094 4088 4083 4077 4082 4076 4095 4089 4084 4078 4083 4077 4096 4090 4085 4079 4084 4078 4097 4091 4086 4080 4085 4079 4098 4092 4087 4081 4086 4080 4099 4093 4088 4082 4087 4081 4100 4094 4089 4083 4088 4082 4101 4095 4090 4084 4089 4083 4102 4096 4091 4085 4090 4084 4103 4097 4092 4086 4091 4085 4104 4098 3505 3499 4092 4086 4105 4099 4094 4088 4093 4087 4106 4100 4095 4089 4094 4088 4107 4101 4096 4090 4095 4089 4108 4102 4097 4091 4096 4090 4109 4103 4098 4092 4097 4091 4110 4104 4099 4093 4098 4092 4111 4105 4100 4094 4099 4093 4112 4106 4101 4095 4100 4094 4113 4107 4102 4096 4101 4095 4114 4108 4103 4097 4102 4096 4115 4109 4104 4098 4103 4097 4116 4110 3517 3511 4104 4098 4117 4111 4106 4100 4105 4099 4118 4112 4107 4101 4106 4100 4119 4113 4108 4102 4107 4101 4120 4114 4109 4103 4108 4102 4121 4115 4110 4104 4109 4103 4122 4116 4111 4105 4110 4104 4123 4117 4112 4106 4111 4105 4124 4118 4113 4107 4112 4106 4125 4119 4114 4108 4113 4107 4126 4120 4115 4109 4114 4108 4127 4121 4116 4110 4115 4109 4128 4122 3529 3523 4116 4110 3856 3848 4118 4112 4117 4111 3855 3851 4119 4113 4118 4112 3858 3853 4120 4114 4119 4113 3860 3855 4121 4115 4120 4114 3862 3857 4122 4116 4121 4115 3864 3859 4123 4117 4122 4116 3866 3861 4124 4118 4123 4117 3868 3863 4125 4119 4124 4118 3870 3865 4126 4120 4125 4119 3872 3867 4127 4121 4126 4120 3874 3869 4128 4122 4127 4121 3876 3870 3541 3535 4128 4122 4130 4123 1503 1498 4129 4124 4132 4125 4131 4126 4130 4123 4134 4127 4133 4128 4132 4125 4136 4129 4135 4130 4134 4127 4138 4131 4137 4132 4136 4129 4140 4133 4139 4134 4138 4131 4142 4135 4141 4136 4140 4133 4144 4137 4143 4138 4142 4135 4146 4139 4145 4140 4144 4137 4148 4141 4147 4142 4146 4139 4150 4143 4149 4144 4148 4141 4150 4143 4152 4145 4151 4146 4154 4147 4129 4124 4153 4148 4155 4149 4130 4123 4154 4147 4156 4150 4132 4125 4155 4149 4157 4151 4134 4127 4156 4150 4158 4152 4136 4129 4157 4151 4159 4153 4138 4131 4158 4152 4160 4154 4140 4133 4159 4153 4161 4155 4142 4135 4160 4154 4162 4156 4144 4137 4161 4155 4163 4157 4146 4139 4162 4156 4164 4158 4148 4141 4163 4157 4164 4158 4152 4145 4150 4143 4165 4159 4153 4148 1740 1737 4166 4160 4154 4147 4165 4159 4167 4161 4155 4149 4166 4160 4168 4162 4156 4150 4167 4161 4169 4163 4157 4151 4168 4162 4170 4164 4158 4152 4169 4163 4171 4165 4159 4153 4170 4164 4172 4166 4160 4154 4171 4165 4173 4167 4161 4155 4172 4166 4174 4168 4162 4156 4173 4167 4175 4169 4163 4157 4174 4168 4175 4169 4152 4145 4164 4158 4177 4170 1740 1737 4176 4171 4178 4172 4165 4159 4177 4170 4179 4173 4166 4160 4178 4172 4180 4174 4167 4161 4179 4173 4181 4175 4168 4162 4180 4174 4182 4176 4169 4163 4181 4175 4183 4177 4170 4164 4182 4176 4184 4178 4171 4165 4183 4177 4185 4179 4172 4166 4184 4178 4186 4180 4173 4167 4185 4179 4187 4181 4174 4168 4186 4180 4187 4181 4152 4145 4175 4169 4189 4182 4176 4171 4188 4183 4190 4184 4177 4170 4189 4182 4191 4185 4178 4172 4190 4184 4192 4186 4179 4173 4191 4185 4193 4187 4180 4174 4192 4186 4194 4188 4181 4175 4193 4187 4195 4189 4182 4176 4194 4188 4196 4190 4183 4177 4195 4189 4197 4191 4184 4178 4196 4190 4198 4192 4185 4179 4197 4191 4199 4193 4186 4180 4198 4192 4199 4193 4152 4145 4187 4181 4200 4194 4188 4183 1704 1700 4201 4195 4189 4182 4200 4194 4202 4196 4190 4184 4201 4195 4203 4197 4191 4185 4202 4196 4204 4198 4192 4186 4203 4197 4205 4199 4193 4187 4204 4198 4206 4200 4194 4188 4205 4199 4207 4201 4195 4189 4206 4200 4208 4202 4196 4190 4207 4201 4209 4203 4197 4191 4208 4202 4210 4204 4198 4192 4209 4203 4210 4204 4152 4145 4199 4193 4211 4205 4200 4194 1704 1700 4212 4206 4201 4195 4200 4194 4213 4207 4202 4196 4201 4195 4214 4208 4203 4197 4202 4196 4215 4209 4204 4198 4203 4197 4216 4210 4205 4199 4204 4198 4217 4211 4206 4200 4205 4199 4218 4212 4207 4201 4206 4200 4219 4213 4208 4202 4207 4201 4220 4214 4209 4203 4208 4202 4221 4215 4210 4204 4209 4203 4222 4216 4152 4145 4210 4204 4223 4217 4212 4206 4211 4205 4224 4218 4213 4207 4212 4206 4225 4219 4214 4208 4213 4207 4226 4220 4215 4209 4214 4208 4227 4221 4216 4210 4215 4209 4228 4222 4217 4211 4216 4210 4229 4223 4218 4212 4217 4211 4230 4224 4219 4213 4218 4212 4231 4225 4220 4214 4219 4213 4232 4226 4221 4215 4220 4214 4233 4227 4222 4216 4221 4215 4234 4228 4152 4145 4222 4216 1668 1664 4224 4218 4223 4217 4235 4229 4225 4219 4224 4218 4236 4230 4226 4220 4225 4219 4237 4231 4227 4221 4226 4220 4238 4232 4228 4222 4227 4221 4239 4233 4229 4223 4228 4222 4240 4234 4230 4224 4229 4223 4241 4235 4231 4225 4230 4224 4242 4236 4232 4226 4231 4225 4243 4237 4233 4227 4232 4226 4244 4238 4234 4228 4233 4227 4245 4239 4152 4145 4234 4228 4246 4240 4235 4229 1668 1664 4247 4241 4236 4230 4235 4229 4248 4242 4237 4231 4236 4230 4249 4243 4238 4232 4237 4231 4250 4244 4239 4233 4238 4232 4251 4245 4240 4234 4239 4233 4252 4246 4241 4235 4240 4234 4253 4247 4242 4236 4241 4235 4254 4248 4243 4237 4242 4236 4255 4249 4244 4238 4243 4237 4256 4250 4245 4239 4244 4238 4257 4251 4152 4145 4245 4239 4258 4252 4247 4241 4246 4240 4259 4253 4248 4242 4247 4241 4260 4254 4249 4243 4248 4242 4261 4255 4250 4244 4249 4243 4262 4256 4251 4245 4250 4244 4263 4257 4252 4246 4251 4245 4264 4258 4253 4247 4252 4246 4265 4259 4254 4248 4253 4247 4266 4260 4255 4249 4254 4248 4267 4261 4256 4250 4255 4249 4268 4262 4257 4251 4256 4250 4269 4263 4152 4145 4257 4251 1344 1341 4259 4253 4258 4252 4270 4264 4260 4254 4259 4253 4271 4265 4261 4255 4260 4254 4272 4266 4262 4256 4261 4255 4273 4267 4263 4257 4262 4256 4274 4268 4264 4258 4263 4257 4275 4269 4265 4259 4264 4258 4276 4270 4266 4260 4265 4259 4277 4271 4267 4261 4266 4260 4278 4272 4268 4262 4267 4261 4279 4273 4269 4263 4268 4262 4280 4274 4152 4145 4269 4263 4282 4275 1359 1354 4281 4276 4284 4277 4283 4278 4282 4275 4286 4279 4285 4280 4284 4277 4288 4281 4287 4282 4286 4279 4290 4283 4289 4284 4288 4281 4292 4285 4291 4286 4290 4283 4294 4287 4293 4288 4292 4285 4296 4289 4295 4290 4294 4287 4298 4291 4297 4292 4296 4289 4300 4293 4299 4294 4298 4291 4302 4295 4301 4296 4300 4293 4302 4295 4152 4145 4303 4297 4305 4298 4281 4276 4304 4299 4306 4300 4282 4275 4305 4298 4307 4301 4284 4277 4306 4300 4308 4302 4286 4279 4307 4301 4309 4303 4288 4281 4308 4302 4310 4304 4290 4283 4309 4303 4311 4305 4292 4285 4310 4304 4312 4306 4294 4287 4311 4305 4313 4307 4296 4289 4312 4306 4314 4308 4298 4291 4313 4307 4315 4309 4300 4293 4314 4308 4315 4309 4152 4145 4302 4295 4316 4310 4304 4299 1608 1605 4317 4311 4305 4298 4316 4310 4318 4312 4306 4300 4317 4311 4319 4313 4307 4301 4318 4312 4320 4314 4308 4302 4319 4313 4321 4315 4309 4303 4320 4314 4322 4316 4310 4304 4321 4315 4323 4317 4311 4305 4322 4316 4324 4318 4312 4306 4323 4317 4325 4319 4313 4307 4324 4318 4326 4320 4314 4308 4325 4319 4326 4320 4152 4145 4315 4309 4328 4321 1608 1605 4327 4322 4329 4323 4316 4310 4328 4321 4330 4324 4317 4311 4329 4323 4331 4325 4318 4312 4330 4324 4332 4326 4319 4313 4331 4325 4333 4327 4320 4314 4332 4326 4334 4328 4321 4315 4333 4327 4335 4329 4322 4316 4334 4328 4336 4330 4323 4317 4335 4329 4337 4331 4324 4318 4336 4330 4338 4332 4325 4319 4337 4331 4338 4332 4152 4145 4326 4320 4340 4333 4327 4322 4339 4334 4341 4335 4328 4321 4340 4333 4342 4336 4329 4323 4341 4335 4343 4337 4330 4324 4342 4336 4344 4338 4331 4325 4343 4337 4345 4339 4332 4326 4344 4338 4346 4340 4333 4327 4345 4339 4347 4341 4334 4328 4346 4340 4348 4342 4335 4329 4347 4341 4349 4343 4336 4330 4348 4342 4350 4344 4337 4331 4349 4343 4350 4344 4152 4145 4338 4332 4351 4345 4339 4334 1572 1568 4352 4346 4340 4333 4351 4345 4353 4347 4341 4335 4352 4346 4354 4348 4342 4336 4353 4347 4355 4349 4343 4337 4354 4348 4356 4350 4344 4338 4355 4349 4357 4351 4345 4339 4356 4350 4358 4352 4346 4340 4357 4351 4359 4353 4347 4341 4358 4352 4360 4354 4348 4342 4359 4353 4361 4355 4349 4343 4360 4354 4361 4355 4152 4145 4350 4344 4362 4356 4351 4345 1572 1568 4363 4357 4352 4346 4351 4345 4364 4358 4353 4347 4352 4346 4365 4359 4354 4348 4353 4347 4366 4360 4355 4349 4354 4348 4367 4361 4356 4350 4355 4349 4368 4362 4357 4351 4356 4350 4369 4363 4358 4352 4357 4351 4370 4364 4359 4353 4358 4352 4371 4365 4360 4354 4359 4353 4372 4366 4361 4355 4360 4354 4373 4367 4152 4145 4361 4355 4374 4368 4363 4357 4362 4356 4375 4369 4364 4358 4363 4357 4376 4370 4365 4359 4364 4358 4377 4371 4366 4360 4365 4359 4378 4372 4367 4361 4366 4360 4379 4373 4368 4362 4367 4361 4380 4374 4369 4363 4368 4362 4381 4375 4370 4364 4369 4363 4382 4376 4371 4365 4370 4364 4383 4377 4372 4366 4371 4365 4384 4378 4373 4367 4372 4366 4385 4379 4152 4145 4373 4367 1536 1532 4375 4369 4374 4368 4386 4380 4376 4370 4375 4369 4387 4381 4377 4371 4376 4370 4388 4382 4378 4372 4377 4371 4389 4383 4379 4373 4378 4372 4390 4384 4380 4374 4379 4373 4391 4385 4381 4375 4380 4374 4392 4386 4382 4376 4381 4375 4393 4387 4383 4377 4382 4376 4394 4388 4384 4378 4383 4377 4395 4389 4385 4379 4384 4378 4396 4390 4152 4145 4385 4379 4397 4391 4386 4380 1536 1532 4398 4392 4387 4381 4386 4380 4399 4393 4388 4382 4387 4381 4400 4394 4389 4383 4388 4382 4401 4395 4390 4384 4389 4383 4402 4396 4391 4385 4390 4384 4403 4397 4392 4386 4391 4385 4404 4398 4393 4387 4392 4386 4405 4399 4394 4388 4393 4387 4406 4400 4395 4389 4394 4388 4407 4401 4396 4390 4395 4389 4408 4402 4152 4145 4396 4390 4409 4403 4398 4392 4397 4391 4410 4404 4399 4393 4398 4392 4411 4405 4400 4394 4399 4393 4412 4406 4401 4395 4400 4394 4413 4407 4402 4396 4401 4395 4414 4408 4403 4397 4402 4396 4415 4409 4404 4398 4403 4397 4416 4410 4405 4399 4404 4398 4417 4411 4406 4400 4405 4399 4418 4412 4407 4401 4406 4400 4419 4413 4408 4402 4407 4401 4420 4414 4152 4145 4408 4402 1503 1498 4410 4404 4409 4403 4131 4126 4411 4405 4410 4404 4133 4128 4412 4406 4411 4405 4135 4130 4413 4407 4412 4406 4137 4132 4414 4408 4413 4407 4139 4134 4415 4409 4414 4408 4141 4136 4416 4410 4415 4409 4143 4138 4417 4411 4416 4410 4145 4140 4418 4412 4417 4411 4147 4142 4419 4413 4418 4412 4149 4144 4420 4414 4419 4413 4151 4146 4152 4145 4420 4414 4422 4415 1203 1198 4421 4416 4424 4417 4423 4418 4422 4415 4426 4419 4425 4420 4424 4417 4428 4421 4427 4422 4426 4419 4430 4423 4429 4424 4428 4421 4432 4425 4431 4426 4430 4423 4434 4427 4433 4428 4432 4425 4436 4429 4435 4430 4434 4427 4438 4431 4437 4432 4436 4429 4440 4433 4439 4434 4438 4431 4442 4435 4441 4436 4440 4433 4442 4435 4152 4145 4443 4437 4445 4438 4421 4416 4444 4439 4446 4440 4422 4415 4445 4438 4447 4441 4424 4417 4446 4440 4448 4442 4426 4419 4447 4441 4449 4443 4428 4421 4448 4442 4450 4444 4430 4423 4449 4443 4451 4445 4432 4425 4450 4444 4452 4446 4434 4427 4451 4445 4453 4447 4436 4429 4452 4446 4454 4448 4438 4431 4453 4447 4455 4449 4440 4433 4454 4448 4455 4449 4152 4145 4442 4435 4456 4450 4444 4439 1464 1461 4457 4451 4445 4438 4456 4450 4458 4452 4446 4440 4457 4451 4459 4453 4447 4441 4458 4452 4460 4454 4448 4442 4459 4453 4461 4455 4449 4443 4460 4454 4462 4456 4450 4444 4461 4455 4463 4457 4451 4445 4462 4456 4464 4458 4452 4446 4463 4457 4465 4459 4453 4447 4464 4458 4466 4460 4454 4448 4465 4459 4466 4460 4152 4145 4455 4449 4468 4461 1464 1461 4467 4462 4469 4463 4456 4450 4468 4461 4470 4464 4457 4451 4469 4463 4471 4465 4458 4452 4470 4464 4472 4466 4459 4453 4471 4465 4473 4467 4460 4454 4472 4466 4474 4468 4461 4455 4473 4467 4475 4469 4462 4456 4474 4468 4476 4470 4463 4457 4475 4469 4477 4471 4464 4458 4476 4470 4478 4472 4465 4459 4477 4471 4478 4472 4152 4145 4466 4460 4480 4473 4467 4462 4479 4474 4481 4475 4468 4461 4480 4473 4482 4476 4469 4463 4481 4475 4483 4477 4470 4464 4482 4476 4484 4478 4471 4465 4483 4477 4485 4479 4472 4466 4484 4478 4486 4480 4473 4467 4485 4479 4487 4481 4474 4468 4486 4480 4488 4482 4475 4469 4487 4481 4489 4483 4476 4470 4488 4482 4490 4484 4477 4471 4489 4483 4490 4484 4152 4145 4478 4472 4491 4485 4479 4474 1428 1424 4492 4486 4480 4473 4491 4485 4493 4487 4481 4475 4492 4486 4494 4488 4482 4476 4493 4487 4495 4489 4483 4477 4494 4488 4496 4490 4484 4478 4495 4489 4497 4491 4485 4479 4496 4490 4498 4492 4486 4480 4497 4491 4499 4493 4487 4481 4498 4492 4500 4494 4488 4482 4499 4493 4501 4495 4489 4483 4500 4494 4501 4495 4152 4145 4490 4484 4502 4496 4491 4485 1428 1424 4503 4497 4492 4486 4491 4485 4504 4498 4493 4487 4492 4486 4505 4499 4494 4488 4493 4487 4506 4500 4495 4489 4494 4488 4507 4501 4496 4490 4495 4489 4508 4502 4497 4491 4496 4490 4509 4503 4498 4492 4497 4491 4510 4504 4499 4493 4498 4492 4511 4505 4500 4494 4499 4493 4512 4506 4501 4495 4500 4494 4513 4507 4152 4145 4501 4495 4514 4508 4503 4497 4502 4496 4515 4509 4504 4498 4503 4497 4516 4510 4505 4499 4504 4498 4517 4511 4506 4500 4505 4499 4518 4512 4507 4501 4506 4500 4519 4513 4508 4502 4507 4501 4520 4514 4509 4503 4508 4502 4521 4515 4510 4504 4509 4503 4522 4516 4511 4505 4510 4504 4523 4517 4512 4506 4511 4505 4524 4518 4513 4507 4512 4506 4525 4519 4152 4145 4513 4507 1392 1388 4515 4509 4514 4508 4526 4520 4516 4510 4515 4509 4527 4521 4517 4511 4516 4510 4528 4522 4518 4512 4517 4511 4529 4523 4519 4513 4518 4512 4530 4524 4520 4514 4519 4513 4531 4525 4521 4515 4520 4514 4532 4526 4522 4516 4521 4515 4533 4527 4523 4517 4522 4516 4534 4528 4524 4518 4523 4517 4535 4529 4525 4519 4524 4518 4536 4530 4152 4145 4525 4519 4537 4531 4526 4520 1392 1388 4538 4532 4527 4521 4526 4520 4539 4533 4528 4522 4527 4521 4540 4534 4529 4523 4528 4522 4541 4535 4530 4524 4529 4523 4542 4536 4531 4525 4530 4524 4543 4537 4532 4526 4531 4525 4544 4538 4533 4527 4532 4526 4545 4539 4534 4528 4533 4527 4546 4540 4535 4529 4534 4528 4547 4541 4536 4530 4535 4529 4548 4542 4152 4145 4536 4530 4549 4543 4538 4532 4537 4531 4550 4544 4539 4533 4538 4532 4551 4545 4540 4534 4539 4533 4552 4546 4541 4535 4540 4534 4553 4547 4542 4536 4541 4535 4554 4548 4543 4537 4542 4536 4555 4549 4544 4538 4543 4537 4556 4550 4545 4539 4544 4538 4557 4551 4546 4540 4545 4539 4558 4552 4547 4541 4546 4540 4559 4553 4548 4542 4547 4541 4560 4554 4152 4145 4548 4542 1359 1354 4550 4544 4549 4543 4283 4278 4551 4545 4550 4544 4285 4280 4552 4546 4551 4545 4287 4282 4553 4547 4552 4546 4289 4284 4554 4548 4553 4547 4291 4286 4555 4549 4554 4548 4293 4288 4556 4550 4555 4549 4295 4290 4557 4551 4556 4550 4297 4292 4558 4552 4557 4551 4299 4294 4559 4553 4558 4552 4301 4296 4560 4554 4559 4553 4303 4297 4152 4145 4560 4554 4562 4555 1344 1341 4561 4556 4563 4557 4270 4264 4562 4555 4564 4558 4271 4265 4563 4557 4565 4559 4272 4266 4564 4558 4566 4560 4273 4267 4565 4559 4567 4561 4274 4268 4566 4560 4568 4562 4275 4269 4567 4561 4569 4563 4276 4270 4568 4562 4570 4564 4277 4271 4569 4563 4571 4565 4278 4272 4570 4564 4572 4566 4279 4273 4571 4565 4572 4566 4152 4145 4280 4274 4574 4567 4561 4556 4573 4568 4575 4569 4562 4555 4574 4567 4576 4570 4563 4557 4575 4569 4577 4571 4564 4558 4576 4570 4578 4572 4565 4559 4577 4571 4579 4573 4566 4560 4578 4572 4580 4574 4567 4561 4579 4573 4581 4575 4568 4562 4580 4574 4582 4576 4569 4563 4581 4575 4583 4577 4570 4564 4582 4576 4584 4578 4571 4565 4583 4577 4584 4578 4152 4145 4572 4566 4585 4579 4573 4568 1308 1305 4586 4580 4574 4567 4585 4579 4587 4581 4575 4569 4586 4580 4588 4582 4576 4570 4587 4581 4589 4583 4577 4571 4588 4582 4590 4584 4578 4572 4589 4583 4591 4585 4579 4573 4590 4584 4592 4586 4580 4574 4591 4585 4593 4587 4581 4575 4592 4586 4594 4588 4582 4576 4593 4587 4595 4589 4583 4577 4594 4588 4595 4589 4152 4145 4584 4578 4597 4590 1308 1305 4596 4591 4598 4592 4585 4579 4597 4590 4599 4593 4586 4580 4598 4592 4600 4594 4587 4581 4599 4593 4601 4595 4588 4582 4600 4594 4602 4596 4589 4583 4601 4595 4603 4597 4590 4584 4602 4596 4604 4598 4591 4585 4603 4597 4605 4599 4592 4586 4604 4598 4606 4600 4593 4587 4605 4599 4607 4601 4594 4588 4606 4600 4607 4601 4152 4145 4595 4589 4609 4602 4596 4591 4608 4603 4610 4604 4597 4590 4609 4602 4611 4605 4598 4592 4610 4604 4612 4606 4599 4593 4611 4605 4613 4607 4600 4594 4612 4606 4614 4608 4601 4595 4613 4607 4615 4609 4602 4596 4614 4608 4616 4610 4603 4597 4615 4609 4617 4611 4604 4598 4616 4610 4618 4612 4605 4599 4617 4611 4619 4613 4606 4600 4618 4612 4619 4613 4152 4145 4607 4601 4620 4614 4608 4603 1272 1268 4621 4615 4609 4602 4620 4614 4622 4616 4610 4604 4621 4615 4623 4617 4611 4605 4622 4616 4624 4618 4612 4606 4623 4617 4625 4619 4613 4607 4624 4618 4626 4620 4614 4608 4625 4619 4627 4621 4615 4609 4626 4620 4628 4622 4616 4610 4627 4621 4629 4623 4617 4611 4628 4622 4630 4624 4618 4612 4629 4623 4630 4624 4152 4145 4619 4613 4631 4625 4620 4614 1272 1268 4632 4626 4621 4615 4620 4614 4633 4627 4622 4616 4621 4615 4634 4628 4623 4617 4622 4616 4635 4629 4624 4618 4623 4617 4636 4630 4625 4619 4624 4618 4637 4631 4626 4620 4625 4619 4638 4632 4627 4621 4626 4620 4639 4633 4628 4622 4627 4621 4640 4634 4629 4623 4628 4622 4641 4635 4630 4624 4629 4623 4642 4636 4152 4145 4630 4624 4643 4637 4632 4626 4631 4625 4644 4638 4633 4627 4632 4626 4645 4639 4634 4628 4633 4627 4646 4640 4635 4629 4634 4628 4647 4641 4636 4630 4635 4629 4648 4642 4637 4631 4636 4630 4649 4643 4638 4632 4637 4631 4650 4644 4639 4633 4638 4632 4651 4645 4640 4634 4639 4633 4652 4646 4641 4635 4640 4634 4653 4647 4642 4636 4641 4635 4654 4648 4152 4145 4642 4636 1236 1232 4644 4638 4643 4637 4655 4649 4645 4639 4644 4638 4656 4650 4646 4640 4645 4639 4657 4651 4647 4641 4646 4640 4658 4652 4648 4642 4647 4641 4659 4653 4649 4643 4648 4642 4660 4654 4650 4644 4649 4643 4661 4655 4651 4645 4650 4644 4662 4656 4652 4646 4651 4645 4663 4657 4653 4647 4652 4646 4664 4658 4654 4648 4653 4647 4665 4659 4152 4145 4654 4648 4666 4660 4655 4649 1236 1232 4667 4661 4656 4650 4655 4649 4668 4662 4657 4651 4656 4650 4669 4663 4658 4652 4657 4651 4670 4664 4659 4653 4658 4652 4671 4665 4660 4654 4659 4653 4672 4666 4661 4655 4660 4654 4673 4667 4662 4656 4661 4655 4674 4668 4663 4657 4662 4656 4675 4669 4664 4658 4663 4657 4676 4670 4665 4659 4664 4658 4677 4671 4152 4145 4665 4659 4678 4672 4667 4661 4666 4660 4679 4673 4668 4662 4667 4661 4680 4674 4669 4663 4668 4662 4681 4675 4670 4664 4669 4663 4682 4676 4671 4665 4670 4664 4683 4677 4672 4666 4671 4665 4684 4678 4673 4667 4672 4666 4685 4679 4674 4668 4673 4667 4686 4680 4675 4669 4674 4668 4687 4681 4676 4670 4675 4669 4688 4682 4677 4671 4676 4670 4689 4683 4152 4145 4677 4671 1203 1198 4679 4673 4678 4672 4423 4418 4680 4674 4679 4673 4425 4420 4681 4675 4680 4674 4427 4422 4682 4676 4681 4675 4429 4424 4683 4677 4682 4676 4431 4426 4684 4678 4683 4677 4433 4428 4685 4679 4684 4678 4435 4430 4686 4680 4685 4679 4437 4432 4687 4681 4686 4680 4439 4434 4688 4682 4687 4681 4441 4436 4689 4683 4688 4682 4443 4437 4152 4145 4689 4683 1 0 2 4 3 1 4 3 5 6 2 4 6 5 7 8 5 6 8 7 9 10 7 8 10 9 11 12 9 10 12 11 13 14 11 12 14 13 15 16 13 14 16 15 17 18 15 16 18 17 19 20 17 18 18 17 20 21 21 19 20 21 22 23 23 22 22 23 24 37 25 24 27 25 1 0 0 2 28 27 4 3 1 0 29 28 6 5 4 3 30 29 8 7 6 5 31 30 10 9 8 7 32 31 12 11 10 9 33 32 14 13 12 11 34 33 16 15 14 13 35 34 18 17 16 15 35 34 36 35 20 21 36 35 37 36 22 23 37 36 38 50 24 37 40 38 27 25 26 26 41 40 28 27 27 25 42 41 29 28 28 27 43 42 30 29 29 28 44 43 31 30 30 29 45 44 32 31 31 30 46 45 33 32 32 31 47 46 34 33 33 32 48 47 35 34 34 33 48 47 49 48 36 35 49 48 50 49 37 36 50 49 51 63 38 50 53 51 40 38 39 39 54 53 41 40 40 38 55 54 42 41 41 40 56 55 43 42 42 41 57 56 44 43 43 42 58 57 45 44 44 43 59 58 46 45 45 44 60 59 47 46 46 45 61 60 48 47 47 46 61 60 62 61 49 48 62 61 63 62 50 49 63 62 64 76 51 63 66 64 53 51 52 52 67 66 54 53 53 51 68 67 55 54 54 53 69 68 56 55 55 54 70 69 57 56 56 55 71 70 58 57 57 56 72 71 59 58 58 57 73 72 60 59 59 58 74 73 61 60 60 59 74 73 75 74 62 61 75 74 76 75 63 62 76 75 77 89 64 76 79 77 66 64 65 65 80 79 67 66 66 64 81 80 68 67 67 66 82 81 69 68 68 67 83 82 70 69 69 68 84 83 71 70 70 69 85 84 72 71 71 70 86 85 73 72 72 71 87 86 74 73 73 72 87 86 88 87 75 74 88 87 89 88 76 75 89 88 90 3350 77 89 91 90 92 91 79 77 92 91 93 92 80 79 93 92 94 93 81 80 94 93 95 94 82 81 95 94 96 95 83 82 96 95 97 96 84 83 97 96 98 97 85 84 98 97 99 98 86 85 99 98 100 100 87 86 101 99 88 87 87 86 102 101 89 88 88 87 103 102 90 3350 89 88 104 103 105 104 92 91 105 104 106 105 93 92 106 105 107 106 94 93 107 106 108 107 95 94 108 107 109 108 96 95 109 108 110 109 97 96 110 109 111 110 98 97 111 110 112 111 99 98 112 111 113 113 100 100 114 112 101 99 100 100 115 114 102 101 101 99 116 115 103 102 102 101 117 116 118 117 105 104 118 117 119 118 106 105 119 118 120 119 107 106 120 119 121 120 108 107 121 120 122 121 109 108 122 121 123 122 110 109 123 122 124 123 111 110 124 123 125 124 112 111 125 124 126 126 113 113 127 125 114 112 113 113 128 127 115 114 114 112 129 128 116 115 115 114 130 129 131 130 118 117 131 130 132 131 119 118 132 131 133 132 120 119 133 132 134 133 121 120 134 133 135 134 122 121 135 134 136 135 123 122 136 135 137 136 124 123 137 136 138 137 125 124 138 137 139 139 126 126 140 138 127 125 126 126 141 140 128 127 127 125 142 141 129 128 128 127 143 142 144 143 131 130 144 143 145 144 132 131 145 144 146 145 133 132 146 145 147 146 134 133 147 146 148 147 135 134 148 147 149 148 136 135 149 148 150 149 137 136 150 149 151 150 138 137 151 150 152 152 139 139 153 151 140 138 139 139 154 153 141 140 140 138 155 154 142 141 141 140 156 155 157 156 144 143 157 156 158 157 145 144 158 157 159 158 146 145 159 158 160 159 147 146 160 159 161 160 148 147 161 160 162 161 149 148 162 161 163 162 150 149 163 162 164 163 151 150 164 163 165 165 152 152 166 164 153 151 152 152 167 166 154 153 153 151 168 167 155 154 154 153 170 168 171 172 172 169 173 171 174 174 171 172 175 173 176 176 174 174 177 175 178 178 176 176 179 177 180 180 178 178 181 179 182 182 180 180 183 181 184 184 182 182 185 183 186 186 184 184 187 185 188 188 186 186 187 185 189 189 190 187 189 189 191 191 192 190 191 191 193 205 194 192 196 193 170 168 169 170 197 195 173 171 170 168 198 196 175 173 173 171 199 197 177 175 175 173 200 198 179 177 177 175 201 199 181 179 179 177 202 200 183 181 181 179 203 201 185 183 183 181 204 202 187 185 185 183 204 202 205 203 189 189 205 203 206 204 191 191 206 204 207 218 193 205 209 206 196 193 195 194 210 208 197 195 196 193 211 209 198 196 197 195 212 210 199 197 198 196 213 211 200 198 199 197 214 212 201 199 200 198 215 213 202 200 201 199 216 214 203 201 202 200 217 215 204 202 203 201 217 215 218 216 205 203 218 216 219 217 206 204 219 217 220 231 207 218 222 219 209 206 208 207 223 221 210 208 209 206 224 222 211 209 210 208 225 223 212 210 211 209 226 224 213 211 212 210 227 225 214 212 213 211 228 226 215 213 214 212 229 227 216 214 215 213 230 228 217 215 216 214 230 228 231 229 218 216 231 229 232 230 219 217 232 230 233 244 220 231 235 232 222 219 221 220 236 234 223 221 222 219 237 235 224 222 223 221 238 236 225 223 224 222 239 237 226 224 225 223 240 238 227 225 226 224 241 239 228 226 227 225 242 240 229 227 228 226 243 241 230 228 229 227 243 241 244 242 231 229 244 242 245 243 232 230 245 243 246 257 233 244 248 245 235 232 234 233 249 247 236 234 235 232 250 248 237 235 236 234 251 249 238 236 237 235 252 250 239 237 238 236 253 251 240 238 239 237 254 252 241 239 240 238 255 253 242 240 241 239 256 254 243 241 242 240 256 254 257 255 244 242 257 255 258 256 245 243 258 256 259 3482 246 257 260 258 261 259 248 245 261 259 262 260 249 247 262 260 263 261 250 248 263 261 264 262 251 249 264 262 265 263 252 250 265 263 266 264 253 251 266 264 267 265 254 252 267 265 268 266 255 253 268 266 269 268 256 254 270 267 257 255 256 254 271 269 258 256 257 255 272 270 259 3482 258 256 273 271 274 272 261 259 274 272 275 273 262 260 275 273 276 274 263 261 276 274 277 275 264 262 277 275 278 276 265 263 278 276 279 277 266 264 279 277 280 278 267 265 280 278 281 279 268 266 281 279 282 281 269 268 283 280 270 267 269 268 284 282 271 269 270 267 285 283 272 270 271 269 286 284 287 285 274 272 287 285 288 286 275 273 288 286 289 287 276 274 289 287 290 288 277 275 290 288 291 289 278 276 291 289 292 290 279 277 292 290 293 291 280 278 293 291 294 292 281 279 294 292 295 294 282 281 296 293 283 280 282 281 297 295 284 282 283 280 298 296 285 283 284 282 299 297 300 298 287 285 300 298 301 299 288 286 301 299 302 300 289 287 302 300 303 301 290 288 303 301 304 302 291 289 304 302 305 303 292 290 305 303 306 304 293 291 306 304 307 305 294 292 307 305 308 307 295 294 309 306 296 293 295 294 310 308 297 295 296 293 311 309 298 296 297 295 312 310 313 311 300 298 313 311 314 312 301 299 314 312 315 313 302 300 315 313 316 314 303 301 316 314 317 315 304 302 317 315 318 316 305 303 318 316 319 317 306 304 319 317 320 318 307 305 320 318 321 320 308 307 322 319 309 306 308 307 323 321 310 308 309 306 324 322 311 309 310 308 3 1 2 4 313 311 2 4 5 6 314 312 5 6 7 8 315 313 7 8 9 10 316 314 9 10 11 12 317 315 11 12 13 14 318 316 13 14 15 16 319 317 15 16 17 18 320 318 17 18 19 20 321 320 21 19 322 319 321 320 23 22 323 321 322 319 25 24 324 322 323 321 326 323 327 327 328 324 329 326 330 329 327 327 331 328 332 331 330 329 333 330 334 333 332 331 335 332 336 335 334 333 337 334 338 337 336 335 339 336 340 339 338 337 341 338 342 341 340 339 343 340 344 343 342 341 343 340 345 344 346 342 345 344 347 346 348 345 347 346 349 360 350 347 352 348 326 323 325 325 353 350 329 326 326 323 354 351 331 328 329 326 355 352 333 330 331 328 356 353 335 332 333 330 357 354 337 334 335 332 358 355 339 336 337 334 359 356 341 338 339 336 360 357 343 340 341 338 360 357 361 358 345 344 361 358 362 359 347 346 362 359 363 373 349 360 365 361 352 348 351 349 366 363 353 350 352 348 367 364 354 351 353 350 368 365 355 352 354 351 369 366 356 353 355 352 370 367 357 354 356 353 371 368 358 355 357 354 372 369 359 356 358 355 373 370 360 357 359 356 373 370 374 371 361 358 374 371 375 372 362 359 375 372 376 386 363 373 378 374 365 361 364 362 379 376 366 363 365 361 380 377 367 364 366 363 381 378 368 365 367 364 382 379 369 366 368 365 383 380 370 367 369 366 384 381 371 368 370 367 385 382 372 369 371 368 386 383 373 370 372 369 386 383 387 384 374 371 387 384 388 385 375 372 388 385 389 399 376 386 391 387 378 374 377 375 392 389 379 376 378 374 393 390 380 377 379 376 394 391 381 378 380 377 395 392 382 379 381 378 396 393 383 380 382 379 397 394 384 381 383 380 398 395 385 382 384 381 399 396 386 383 385 382 399 396 400 397 387 384 400 397 401 398 388 385 401 398 402 412 389 399 404 400 391 387 390 388 405 402 392 389 391 387 406 403 393 390 392 389 407 404 394 391 393 390 408 405 395 392 394 391 409 406 396 393 395 392 410 407 397 394 396 393 411 408 398 395 397 394 412 409 399 396 398 395 412 409 413 410 400 397 413 410 414 411 401 398 414 411 415 3049 402 412 416 413 417 414 404 400 417 414 418 415 405 402 418 415 419 416 406 403 419 416 420 417 407 404 420 417 421 418 408 405 421 418 422 419 409 406 422 419 423 420 410 407 423 420 424 421 411 408 424 421 425 423 412 409 426 422 413 410 412 409 427 424 414 411 413 410 428 425 415 3049 414 411 429 426 430 427 417 414 430 427 431 428 418 415 431 428 432 429 419 416 432 429 433 430 420 417 433 430 434 431 421 418 434 431 435 432 422 419 435 432 436 433 423 420 436 433 437 434 424 421 437 434 438 436 425 423 439 435 426 422 425 423 440 437 427 424 426 422 441 438 428 425 427 424 442 439 443 440 430 427 443 440 444 441 431 428 444 441 445 442 432 429 445 442 446 443 433 430 446 443 447 444 434 431 447 444 448 445 435 432 448 445 449 446 436 433 449 446 450 447 437 434 450 447 451 449 438 436 452 448 439 435 438 436 453 450 440 437 439 435 454 451 441 438 440 437 455 452 456 453 443 440 456 453 457 454 444 441 457 454 458 455 445 442 458 455 459 456 446 443 459 456 460 457 447 444 460 457 461 458 448 445 461 458 462 459 449 446 462 459 463 460 450 447 463 460 464 462 451 449 465 461 452 448 451 449 466 463 453 450 452 448 467 464 454 451 453 450 468 465 469 466 456 453 469 466 470 467 457 454 470 467 471 468 458 455 471 468 472 469 459 456 472 469 473 470 460 457 473 470 474 471 461 458 474 471 475 472 462 459 475 472 476 473 463 460 476 473 477 475 464 462 478 474 465 461 464 462 479 476 466 463 465 461 480 477 467 464 466 463 172 169 171 172 469 466 171 172 174 174 470 467 174 174 176 176 471 468 176 176 178 178 472 469 178 178 180 180 473 470 180 180 182 182 474 471 182 182 184 184 475 472 184 184 186 186 476 473 186 186 188 188 477 475 190 187 478 474 477 475 192 190 479 476 478 474 194 192 480 477 479 476 482 478 157 156 156 155 483 480 158 157 157 156 484 481 159 158 158 157 485 482 160 159 159 158 486 483 161 160 160 159 487 484 162 161 161 160 488 485 163 162 162 161 489 486 164 163 163 162 490 487 165 165 164 163 490 487 491 488 166 164 491 488 492 489 167 166 492 489 493 502 168 167 495 490 482 478 481 479 496 492 483 480 482 478 497 493 484 481 483 480 498 494 485 482 484 481 499 495 486 483 485 482 500 496 487 484 486 483 501 497 488 485 487 484 502 498 489 486 488 485 503 499 490 487 489 486 503 499 504 500 491 488 504 500 505 501 492 489 505 501 506 515 493 502 508 503 495 490 494 491 509 505 496 492 495 490 510 506 497 493 496 492 511 507 498 494 497 493 512 508 499 495 498 494 513 509 500 496 499 495 514 510 501 497 500 496 515 511 502 498 501 497 516 512 503 499 502 498 516 512 517 513 504 500 517 513 518 514 505 501 518 514 519 528 506 515 521 516 508 503 507 504 522 518 509 505 508 503 523 519 510 506 509 505 524 520 511 507 510 506 525 521 512 508 511 507 526 522 513 509 512 508 527 523 514 510 513 509 528 524 515 511 514 510 529 525 516 512 515 511 529 525 530 526 517 513 530 526 531 527 518 514 531 527 532 541 519 528 534 529 521 516 520 517 535 531 522 518 521 516 536 532 523 519 522 518 537 533 524 520 523 519 538 534 525 521 524 520 539 535 526 522 525 521 540 536 527 523 526 522 541 537 528 524 527 523 542 538 529 525 528 524 542 538 543 539 530 526 543 539 544 540 531 527 544 540 545 554 532 541 547 542 534 529 533 530 548 544 535 531 534 529 549 545 536 532 535 531 550 546 537 533 536 532 551 547 538 534 537 533 552 548 539 535 538 534 553 549 540 536 539 535 554 550 541 537 540 536 555 551 542 538 541 537 555 551 556 552 543 539 556 552 557 553 544 540 557 553 558 3206 545 554 559 555 560 556 547 542 560 556 561 557 548 544 561 557 562 558 549 545 562 558 563 559 550 546 563 559 564 560 551 547 564 560 565 561 552 548 565 561 566 562 553 549 566 562 567 563 554 550 567 563 568 565 555 551 569 564 556 552 555 551 570 566 557 553 556 552 571 567 558 3206 557 553 572 568 573 569 560 556 573 569 574 570 561 557 574 570 575 571 562 558 575 571 576 572 563 559 576 572 577 573 564 560 577 573 578 574 565 561 578 574 579 575 566 562 579 575 580 576 567 563 580 576 581 578 568 565 582 577 569 564 568 565 583 579 570 566 569 564 584 580 571 567 570 566 585 581 586 582 573 569 586 582 587 583 574 570 587 583 588 584 575 571 588 584 589 585 576 572 589 585 590 586 577 573 590 586 591 587 578 574 591 587 592 588 579 575 592 588 593 589 580 576 593 589 594 591 581 578 595 590 582 577 581 578 596 592 583 579 582 577 597 593 584 580 583 579 598 594 599 595 586 582 599 595 600 596 587 583 600 596 601 597 588 584 601 597 602 598 589 585 602 598 603 599 590 586 603 599 604 600 591 587 604 600 605 601 592 588 605 601 606 602 593 589 606 602 607 604 594 591 608 603 595 590 594 591 609 605 596 592 595 590 610 606 597 593 596 592 611 607 612 608 599 595 612 608 613 609 600 596 613 609 614 610 601 597 614 610 615 611 602 598 615 611 616 612 603 599 616 612 617 613 604 600 617 613 618 614 605 601 618 614 619 615 606 602 619 615 620 617 607 604 621 616 608 603 607 604 622 618 609 605 608 603 623 619 610 606 609 605 328 324 327 327 612 608 327 327 330 329 613 609 330 329 332 331 614 610 332 331 334 333 615 611 334 333 336 335 616 612 336 335 338 337 617 613 338 337 340 339 618 614 340 339 342 341 619 615 342 341 344 343 620 617 346 342 621 616 620 617 348 345 622 618 621 616 350 347 623 619 622 618 625 620 626 624 627 621 628 623 629 626 626 624 630 625 631 628 629 626 632 627 633 630 631 628 634 629 635 632 633 630 636 631 637 634 635 632 638 633 639 636 637 634 640 635 641 638 639 636 642 637 643 640 641 638 644 639 645 642 643 640 646 641 647 643 645 642 0 2 3 1 647 643 649 644 625 620 624 622 650 646 628 623 625 620 651 647 630 625 628 623 652 648 632 627 630 625 653 649 634 629 632 627 654 650 636 631 634 629 655 651 638 633 636 631 656 652 640 635 638 633 657 653 642 637 640 635 658 654 644 639 642 637 659 655 646 641 644 639 26 26 0 2 646 641 661 656 649 644 648 645 662 658 650 646 649 644 663 659 651 647 650 646 664 660 652 648 651 647 665 661 653 649 652 648 666 662 654 650 653 649 667 663 655 651 654 650 668 664 656 652 655 651 669 665 657 653 656 652 670 666 658 654 657 653 671 667 659 655 658 654 39 39 26 26 659 655 673 668 661 656 660 657 674 670 662 658 661 656 675 671 663 659 662 658 676 672 664 660 663 659 677 673 665 661 664 660 678 674 666 662 665 661 679 675 667 663 666 662 680 676 668 664 667 663 681 677 669 665 668 664 682 678 670 666 669 665 683 679 671 667 670 666 52 52 39 39 671 667 685 680 673 668 672 669 686 682 674 670 673 668 687 683 675 671 674 670 688 684 676 672 675 671 689 685 677 673 676 672 690 686 678 674 677 673 691 687 679 675 678 674 692 688 680 676 679 675 693 689 681 677 680 676 694 690 682 678 681 677 695 691 683 679 682 678 65 65 52 52 683 679 697 692 685 680 684 681 698 694 686 682 685 680 699 695 687 683 686 682 700 696 688 684 687 683 701 697 689 685 688 684 702 698 690 686 689 685 703 699 691 687 690 686 704 700 692 688 691 687 705 701 693 689 692 688 706 702 694 690 693 689 707 703 695 691 694 690 78 78 65 65 695 691 708 704 709 705 697 692 709 705 710 706 698 694 710 706 711 707 699 695 711 707 712 708 700 696 712 708 713 709 701 697 713 709 714 710 702 698 714 710 715 711 703 699 715 711 716 712 704 700 716 712 717 713 705 701 717 713 718 714 706 702 718 714 719 715 707 703 719 715 91 90 78 78 720 716 721 717 709 705 721 717 722 718 710 706 722 718 723 719 711 707 723 719 724 720 712 708 724 720 725 721 713 709 725 721 726 722 714 710 726 722 727 723 715 711 727 723 728 724 716 712 728 724 729 725 717 713 729 725 730 726 718 714 730 726 731 727 719 715 731 727 104 103 91 90 732 728 733 729 721 717 733 729 734 730 722 718 734 730 735 731 723 719 735 731 736 732 724 720 736 732 737 733 725 721 737 733 738 734 726 722 738 734 739 735 727 723 739 735 740 736 728 724 740 736 741 737 729 725 741 737 742 738 730 726 742 738 743 739 731 727 743 739 117 116 104 103 744 740 745 741 733 729 745 741 746 742 734 730 746 742 747 743 735 731 747 743 748 744 736 732 748 744 749 745 737 733 749 745 750 746 738 734 750 746 751 747 739 735 751 747 752 748 740 736 752 748 753 749 741 737 753 749 754 750 742 738 754 750 755 751 743 739 755 751 130 129 117 116 756 752 757 753 745 741 757 753 758 754 746 742 758 754 759 755 747 743 759 755 760 756 748 744 760 756 761 757 749 745 761 757 762 758 750 746 762 758 763 759 751 747 763 759 764 760 752 748 764 760 765 761 753 749 765 761 766 762 754 750 766 762 767 763 755 751 767 763 143 142 130 129 768 764 769 765 757 753 769 765 770 766 758 754 770 766 771 767 759 755 771 767 772 768 760 756 772 768 773 769 761 757 773 769 774 770 762 758 774 770 775 771 763 759 775 771 776 772 764 760 776 772 777 773 765 761 777 773 778 774 766 762 778 774 779 775 767 763 779 775 156 155 143 142 781 776 782 780 783 777 784 779 785 782 782 780 786 781 787 784 785 782 788 783 789 786 787 784 790 785 791 788 789 786 792 787 793 790 791 788 794 789 795 792 793 790 796 791 797 794 795 792 798 793 799 796 797 794 800 795 801 798 799 796 802 797 803 799 801 798 169 170 172 169 803 799 805 800 781 776 780 778 806 802 784 779 781 776 807 803 786 781 784 779 808 804 788 783 786 781 809 805 790 785 788 783 810 806 792 787 790 785 811 807 794 789 792 787 812 808 796 791 794 789 813 809 798 793 796 791 814 810 800 795 798 793 815 811 802 797 800 795 195 194 169 170 802 797 817 812 805 800 804 801 818 814 806 802 805 800 819 815 807 803 806 802 820 816 808 804 807 803 821 817 809 805 808 804 822 818 810 806 809 805 823 819 811 807 810 806 824 820 812 808 811 807 825 821 813 809 812 808 826 822 814 810 813 809 827 823 815 811 814 810 208 207 195 194 815 811 829 824 817 812 816 813 830 826 818 814 817 812 831 827 819 815 818 814 832 828 820 816 819 815 833 829 821 817 820 816 834 830 822 818 821 817 835 831 823 819 822 818 836 832 824 820 823 819 837 833 825 821 824 820 838 834 826 822 825 821 839 835 827 823 826 822 221 220 208 207 827 823 841 836 829 824 828 825 842 838 830 826 829 824 843 839 831 827 830 826 844 840 832 828 831 827 845 841 833 829 832 828 846 842 834 830 833 829 847 843 835 831 834 830 848 844 836 832 835 831 849 845 837 833 836 832 850 846 838 834 837 833 851 847 839 835 838 834 234 233 221 220 839 835 853 848 841 836 840 837 854 850 842 838 841 836 855 851 843 839 842 838 856 852 844 840 843 839 857 853 845 841 844 840 858 854 846 842 845 841 859 855 847 843 846 842 860 856 848 844 847 843 861 857 849 845 848 844 862 858 850 846 849 845 863 859 851 847 850 846 247 246 234 233 851 847 864 860 865 861 853 848 865 861 866 862 854 850 866 862 867 863 855 851 867 863 868 864 856 852 868 864 869 865 857 853 869 865 870 866 858 854 870 866 871 867 859 855 871 867 872 868 860 856 872 868 873 869 861 857 873 869 874 870 862 858 874 870 875 871 863 859 875 871 260 258 247 246 876 872 877 873 865 861 877 873 878 874 866 862 878 874 879 875 867 863 879 875 880 876 868 864 880 876 881 877 869 865 881 877 882 878 870 866 882 878 883 879 871 867 883 879 884 880 872 868 884 880 885 881 873 869 885 881 886 882 874 870 886 882 887 883 875 871 887 883 273 271 260 258 888 884 889 885 877 873 889 885 890 886 878 874 890 886 891 887 879 875 891 887 892 888 880 876 892 888 893 889 881 877 893 889 894 890 882 878 894 890 895 891 883 879 895 891 896 892 884 880 896 892 897 893 885 881 897 893 898 894 886 882 898 894 899 895 887 883 899 895 286 284 273 271 900 896 901 897 889 885 901 897 902 898 890 886 902 898 903 899 891 887 903 899 904 900 892 888 904 900 905 901 893 889 905 901 906 902 894 890 906 902 907 903 895 891 907 903 908 904 896 892 908 904 909 905 897 893 909 905 910 906 898 894 910 906 911 907 899 895 911 907 299 297 286 284 912 908 913 909 901 897 913 909 914 910 902 898 914 910 915 911 903 899 915 911 916 912 904 900 916 912 917 913 905 901 917 913 918 914 906 902 918 914 919 915 907 903 919 915 920 916 908 904 920 916 921 917 909 905 921 917 922 918 910 906 922 918 923 919 911 907 923 919 312 310 299 297 627 621 626 624 913 909 626 624 629 626 914 910 629 626 631 628 915 911 631 628 633 630 916 912 633 630 635 632 917 913 635 632 637 634 918 914 637 634 639 636 919 915 639 636 641 638 920 916 641 638 643 640 921 917 643 640 645 642 922 918 645 642 647 643 923 919 647 643 3 1 312 310 925 920 926 924 927 921 928 923 929 926 926 924 930 925 931 928 929 926 932 927 933 930 931 928 934 929 935 932 933 930 936 931 937 934 935 932 938 933 939 936 937 934 940 935 941 938 939 936 942 937 943 940 941 938 944 939 945 942 943 940 946 941 947 943 945 942 325 325 328 324 947 943 949 944 925 920 924 922 950 946 928 923 925 920 951 947 930 925 928 923 952 948 932 927 930 925 953 949 934 929 932 927 954 950 936 931 934 929 955 951 938 933 936 931 956 952 940 935 938 933 957 953 942 937 940 935 958 954 944 939 942 937 959 955 946 941 944 939 351 349 325 325 946 941 961 956 949 944 948 945 962 958 950 946 949 944 963 959 951 947 950 946 964 960 952 948 951 947 965 961 953 949 952 948 966 962 954 950 953 949 967 963 955 951 954 950 968 964 956 952 955 951 969 965 957 953 956 952 970 966 958 954 957 953 971 967 959 955 958 954 364 362 351 349 959 955 973 968 961 956 960 957 974 970 962 958 961 956 975 971 963 959 962 958 976 972 964 960 963 959 977 973 965 961 964 960 978 974 966 962 965 961 979 975 967 963 966 962 980 976 968 964 967 963 981 977 969 965 968 964 982 978 970 966 969 965 983 979 971 967 970 966 377 375 364 362 971 967 985 980 973 968 972 969 986 982 974 970 973 968 987 983 975 971 974 970 988 984 976 972 975 971 989 985 977 973 976 972 990 986 978 974 977 973 991 987 979 975 978 974 992 988 980 976 979 975 993 989 981 977 980 976 994 990 982 978 981 977 995 991 983 979 982 978 390 388 377 375 983 979 997 992 985 980 984 981 998 994 986 982 985 980 999 995 987 983 986 982 1000 996 988 984 987 983 1001 997 989 985 988 984 1002 998 990 986 989 985 1003 999 991 987 990 986 1004 1000 992 988 991 987 1005 1001 993 989 992 988 1006 1002 994 990 993 989 1007 1003 995 991 994 990 403 401 390 388 995 991 1008 1004 1009 1005 997 992 1009 1005 1010 1006 998 994 1010 1006 1011 1007 999 995 1011 1007 1012 1008 1000 996 1012 1008 1013 1009 1001 997 1013 1009 1014 1010 1002 998 1014 1010 1015 1011 1003 999 1015 1011 1016 1012 1004 1000 1016 1012 1017 1013 1005 1001 1017 1013 1018 1014 1006 1002 1018 1014 1019 1015 1007 1003 1019 1015 416 413 403 401 1020 1016 1021 1017 1009 1005 1021 1017 1022 1018 1010 1006 1022 1018 1023 1019 1011 1007 1023 1019 1024 1020 1012 1008 1024 1020 1025 1021 1013 1009 1025 1021 1026 1022 1014 1010 1026 1022 1027 1023 1015 1011 1027 1023 1028 1024 1016 1012 1028 1024 1029 1025 1017 1013 1029 1025 1030 1026 1018 1014 1030 1026 1031 1027 1019 1015 1031 1027 429 426 416 413 1032 1028 1033 1029 1021 1017 1033 1029 1034 1030 1022 1018 1034 1030 1035 1031 1023 1019 1035 1031 1036 1032 1024 1020 1036 1032 1037 1033 1025 1021 1037 1033 1038 1034 1026 1022 1038 1034 1039 1035 1027 1023 1039 1035 1040 1036 1028 1024 1040 1036 1041 1037 1029 1025 1041 1037 1042 1038 1030 1026 1042 1038 1043 1039 1031 1027 1043 1039 442 439 429 426 1044 1040 1045 1041 1033 1029 1045 1041 1046 1042 1034 1030 1046 1042 1047 1043 1035 1031 1047 1043 1048 1044 1036 1032 1048 1044 1049 1045 1037 1033 1049 1045 1050 1046 1038 1034 1050 1046 1051 1047 1039 1035 1051 1047 1052 1048 1040 1036 1052 1048 1053 1049 1041 1037 1053 1049 1054 1050 1042 1038 1054 1050 1055 1051 1043 1039 1055 1051 455 452 442 439 1056 1052 1057 1053 1045 1041 1057 1053 1058 1054 1046 1042 1058 1054 1059 1055 1047 1043 1059 1055 1060 1056 1048 1044 1060 1056 1061 1057 1049 1045 1061 1057 1062 1058 1050 1046 1062 1058 1063 1059 1051 1047 1063 1059 1064 1060 1052 1048 1064 1060 1065 1061 1053 1049 1065 1061 1066 1062 1054 1050 1066 1062 1067 1063 1055 1051 1067 1063 468 465 455 452 783 777 782 780 1057 1053 782 780 785 782 1058 1054 785 782 787 784 1059 1055 787 784 789 786 1060 1056 789 786 791 788 1061 1057 791 788 793 790 1062 1058 793 790 795 792 1063 1059 795 792 797 794 1064 1060 797 794 799 796 1065 1061 799 796 801 798 1066 1062 801 798 803 799 1067 1063 803 799 172 169 468 465 1069 1064 769 765 768 764 1070 1066 770 766 769 765 1071 1067 771 767 770 766 1072 1068 772 768 771 767 1073 1069 773 769 772 768 1074 1070 774 770 773 769 1075 1071 775 771 774 770 1076 1072 776 772 775 771 1077 1073 777 773 776 772 1078 1074 778 774 777 773 1079 1075 779 775 778 774 481 479 156 155 779 775 1081 1076 1069 1064 1068 1065 1082 1078 1070 1066 1069 1064 1083 1079 1071 1067 1070 1066 1084 1080 1072 1068 1071 1067 1085 1081 1073 1069 1072 1068 1086 1082 1074 1070 1073 1069 1087 1083 1075 1071 1074 1070 1088 1084 1076 1072 1075 1071 1089 1085 1077 1073 1076 1072 1090 1086 1078 1074 1077 1073 1091 1087 1079 1075 1078 1074 494 491 481 479 1079 1075 1093 1088 1081 1076 1080 1077 1094 1090 1082 1078 1081 1076 1095 1091 1083 1079 1082 1078 1096 1092 1084 1080 1083 1079 1097 1093 1085 1081 1084 1080 1098 1094 1086 1082 1085 1081 1099 1095 1087 1083 1086 1082 1100 1096 1088 1084 1087 1083 1101 1097 1089 1085 1088 1084 1102 1098 1090 1086 1089 1085 1103 1099 1091 1087 1090 1086 507 504 494 491 1091 1087 1105 1100 1093 1088 1092 1089 1106 1102 1094 1090 1093 1088 1107 1103 1095 1091 1094 1090 1108 1104 1096 1092 1095 1091 1109 1105 1097 1093 1096 1092 1110 1106 1098 1094 1097 1093 1111 1107 1099 1095 1098 1094 1112 1108 1100 1096 1099 1095 1113 1109 1101 1097 1100 1096 1114 1110 1102 1098 1101 1097 1115 1111 1103 1099 1102 1098 520 517 507 504 1103 1099 1117 1112 1105 1100 1104 1101 1118 1114 1106 1102 1105 1100 1119 1115 1107 1103 1106 1102 1120 1116 1108 1104 1107 1103 1121 1117 1109 1105 1108 1104 1122 1118 1110 1106 1109 1105 1123 1119 1111 1107 1110 1106 1124 1120 1112 1108 1111 1107 1125 1121 1113 1109 1112 1108 1126 1122 1114 1110 1113 1109 1127 1123 1115 1111 1114 1110 533 530 520 517 1115 1111 1129 1124 1117 1112 1116 1113 1130 1126 1118 1114 1117 1112 1131 1127 1119 1115 1118 1114 1132 1128 1120 1116 1119 1115 1133 1129 1121 1117 1120 1116 1134 1130 1122 1118 1121 1117 1135 1131 1123 1119 1122 1118 1136 1132 1124 1120 1123 1119 1137 1133 1125 1121 1124 1120 1138 1134 1126 1122 1125 1121 1139 1135 1127 1123 1126 1122 546 543 533 530 1127 1123 1140 1136 1141 1137 1129 1124 1141 1137 1142 1138 1130 1126 1142 1138 1143 1139 1131 1127 1143 1139 1144 1140 1132 1128 1144 1140 1145 1141 1133 1129 1145 1141 1146 1142 1134 1130 1146 1142 1147 1143 1135 1131 1147 1143 1148 1144 1136 1132 1148 1144 1149 1145 1137 1133 1149 1145 1150 1146 1138 1134 1150 1146 1151 1147 1139 1135 1151 1147 559 555 546 543 1152 1148 1153 1149 1141 1137 1153 1149 1154 1150 1142 1138 1154 1150 1155 1151 1143 1139 1155 1151 1156 1152 1144 1140 1156 1152 1157 1153 1145 1141 1157 1153 1158 1154 1146 1142 1158 1154 1159 1155 1147 1143 1159 1155 1160 1156 1148 1144 1160 1156 1161 1157 1149 1145 1161 1157 1162 1158 1150 1146 1162 1158 1163 1159 1151 1147 1163 1159 572 568 559 555 1164 1160 1165 1161 1153 1149 1165 1161 1166 1162 1154 1150 1166 1162 1167 1163 1155 1151 1167 1163 1168 1164 1156 1152 1168 1164 1169 1165 1157 1153 1169 1165 1170 1166 1158 1154 1170 1166 1171 1167 1159 1155 1171 1167 1172 1168 1160 1156 1172 1168 1173 1169 1161 1157 1173 1169 1174 1170 1162 1158 1174 1170 1175 1171 1163 1159 1175 1171 585 581 572 568 1176 1172 1177 1173 1165 1161 1177 1173 1178 1174 1166 1162 1178 1174 1179 1175 1167 1163 1179 1175 1180 1176 1168 1164 1180 1176 1181 1177 1169 1165 1181 1177 1182 1178 1170 1166 1182 1178 1183 1179 1171 1167 1183 1179 1184 1180 1172 1168 1184 1180 1185 1181 1173 1169 1185 1181 1186 1182 1174 1170 1186 1182 1187 1183 1175 1171 1187 1183 598 594 585 581 1188 1184 1189 1185 1177 1173 1189 1185 1190 1186 1178 1174 1190 1186 1191 1187 1179 1175 1191 1187 1192 1188 1180 1176 1192 1188 1193 1189 1181 1177 1193 1189 1194 1190 1182 1178 1194 1190 1195 1191 1183 1179 1195 1191 1196 1192 1184 1180 1196 1192 1197 1193 1185 1181 1197 1193 1198 1194 1186 1182 1198 1194 1199 1195 1187 1183 1199 1195 611 607 598 594 927 921 926 924 1189 1185 926 924 929 926 1190 1186 929 926 931 928 1191 1187 931 928 933 930 1192 1188 933 930 935 932 1193 1189 935 932 937 934 1194 1190 937 934 939 936 1195 1191 939 936 941 938 1196 1192 941 938 943 940 1197 1193 943 940 945 942 1198 1194 945 942 947 943 1199 1195 947 943 328 324 611 607 1200 1196 1201 1199 1202 1197 1201 1199 1204 1201 1205 1200 1204 1201 1206 1203 1207 1202 1206 1203 1208 1205 1209 1204 1208 1205 1210 1207 1211 1206 1210 1207 1212 1209 1213 1208 1212 1209 1214 1211 1215 1210 1214 1211 1216 1213 1217 1212 1216 1213 1218 1215 1219 1214 1218 1215 1220 1217 1221 1216 1220 1217 1222 1219 1223 1218 1222 1219 624 622 627 621 1224 1220 1225 1221 1201 1199 1225 1221 1226 1222 1204 1201 1226 1222 1227 1223 1206 1203 1227 1223 1228 1224 1208 1205 1228 1224 1229 1225 1210 1207 1229 1225 1230 1226 1212 1209 1230 1226 1231 1227 1214 1211 1231 1227 1232 1228 1216 1213 1232 1228 1233 1229 1218 1215 1233 1229 1234 1230 1220 1217 1234 1230 1235 1231 1222 1219 1235 1231 648 645 624 622 1236 1232 1237 1233 1225 1221 1237 1233 1238 1234 1226 1222 1238 1234 1239 1235 1227 1223 1239 1235 1240 1236 1228 1224 1240 1236 1241 1237 1229 1225 1241 1237 1242 1238 1230 1226 1242 1238 1243 1239 1231 1227 1243 1239 1244 1240 1232 1228 1244 1240 1245 1241 1233 1229 1245 1241 1246 1242 1234 1230 1246 1242 1247 1243 1235 1231 1247 1243 660 657 648 645 1248 1244 1249 1245 1237 1233 1249 1245 1250 1246 1238 1234 1250 1246 1251 1247 1239 1235 1251 1247 1252 1248 1240 1236 1252 1248 1253 1249 1241 1237 1253 1249 1254 1250 1242 1238 1254 1250 1255 1251 1243 1239 1255 1251 1256 1252 1244 1240 1256 1252 1257 1253 1245 1241 1257 1253 1258 1254 1246 1242 1258 1254 1259 1255 1247 1243 1259 1255 672 669 660 657 1260 1256 1261 1257 1249 1245 1261 1257 1262 1258 1250 1246 1262 1258 1263 1259 1251 1247 1263 1259 1264 1260 1252 1248 1264 1260 1265 1261 1253 1249 1265 1261 1266 1262 1254 1250 1266 1262 1267 1263 1255 1251 1267 1263 1268 1264 1256 1252 1268 1264 1269 1265 1257 1253 1269 1265 1270 1266 1258 1254 1270 1266 1271 1267 1259 1255 1271 1267 684 681 672 669 1272 1268 1273 1269 1261 1257 1273 1269 1274 1270 1262 1258 1274 1270 1275 1271 1263 1259 1275 1271 1276 1272 1264 1260 1276 1272 1277 1273 1265 1261 1277 1273 1278 1274 1266 1262 1278 1274 1279 1275 1267 1263 1279 1275 1280 1276 1268 1264 1280 1276 1281 1277 1269 1265 1281 1277 1282 1278 1270 1266 1282 1278 1283 1279 1271 1267 1283 1279 696 693 684 681 1285 1280 1273 1269 1272 1268 1286 1282 1274 1270 1273 1269 1287 1283 1275 1271 1274 1270 1288 1284 1276 1272 1275 1271 1289 1285 1277 1273 1276 1272 1290 1286 1278 1274 1277 1273 1291 1287 1279 1275 1278 1274 1292 1288 1280 1276 1279 1275 1293 1289 1281 1277 1280 1276 1294 1290 1282 1278 1281 1277 1295 1291 1283 1279 1282 1278 708 704 696 693 1283 1279 1297 1292 1285 1280 1284 1281 1298 1294 1286 1282 1285 1280 1299 1295 1287 1283 1286 1282 1300 1296 1288 1284 1287 1283 1301 1297 1289 1285 1288 1284 1302 1298 1290 1286 1289 1285 1303 1299 1291 1287 1290 1286 1304 1300 1292 1288 1291 1287 1305 1301 1293 1289 1292 1288 1306 1302 1294 1290 1293 1289 1307 1303 1295 1291 1294 1290 720 716 708 704 1295 1291 1309 1304 1297 1292 1296 1293 1310 1306 1298 1294 1297 1292 1311 1307 1299 1295 1298 1294 1312 1308 1300 1296 1299 1295 1313 1309 1301 1297 1300 1296 1314 1310 1302 1298 1301 1297 1315 1311 1303 1299 1302 1298 1316 1312 1304 1300 1303 1299 1317 1313 1305 1301 1304 1300 1318 1314 1306 1302 1305 1301 1319 1315 1307 1303 1306 1302 732 728 720 716 1307 1303 1321 1316 1309 1304 1308 1305 1322 1318 1310 1306 1309 1304 1323 1319 1311 1307 1310 1306 1324 1320 1312 1308 1311 1307 1325 1321 1313 1309 1312 1308 1326 1322 1314 1310 1313 1309 1327 1323 1315 1311 1314 1310 1328 1324 1316 1312 1315 1311 1329 1325 1317 1313 1316 1312 1330 1326 1318 1314 1317 1313 1331 1327 1319 1315 1318 1314 744 740 732 728 1319 1315 1333 1328 1321 1316 1320 1317 1334 1330 1322 1318 1321 1316 1335 1331 1323 1319 1322 1318 1336 1332 1324 1320 1323 1319 1337 1333 1325 1321 1324 1320 1338 1334 1326 1322 1325 1321 1339 1335 1327 1323 1326 1322 1340 1336 1328 1324 1327 1323 1341 1337 1329 1325 1328 1324 1342 1338 1330 1326 1329 1325 1343 1339 1331 1327 1330 1326 756 752 744 740 1331 1327 1345 1340 1333 1328 1332 1329 1346 1342 1334 1330 1333 1328 1347 1343 1335 1331 1334 1330 1348 1344 1336 1332 1335 1331 1349 1345 1337 1333 1336 1332 1350 1346 1338 1334 1337 1333 1351 1347 1339 1335 1338 1334 1352 1348 1340 1336 1339 1335 1353 1349 1341 1337 1340 1336 1354 1350 1342 1338 1341 1337 1355 1351 1343 1339 1342 1338 768 764 756 752 1343 1339 1356 1352 1357 1355 1358 1353 1357 1355 1360 1357 1361 1356 1360 1357 1362 1359 1363 1358 1362 1359 1364 1361 1365 1360 1364 1361 1366 1363 1367 1362 1366 1363 1368 1365 1369 1364 1368 1365 1370 1367 1371 1366 1370 1367 1372 1369 1373 1368 1372 1369 1374 1371 1375 1370 1374 1371 1376 1373 1377 1372 1376 1373 1378 1375 1379 1374 1378 1375 780 778 783 777 1380 1376 1381 1377 1357 1355 1381 1377 1382 1378 1360 1357 1382 1378 1383 1379 1362 1359 1383 1379 1384 1380 1364 1361 1384 1380 1385 1381 1366 1363 1385 1381 1386 1382 1368 1365 1386 1382 1387 1383 1370 1367 1387 1383 1388 1384 1372 1369 1388 1384 1389 1385 1374 1371 1389 1385 1390 1386 1376 1373 1390 1386 1391 1387 1378 1375 1391 1387 804 801 780 778 1392 1388 1393 1389 1381 1377 1393 1389 1394 1390 1382 1378 1394 1390 1395 1391 1383 1379 1395 1391 1396 1392 1384 1380 1396 1392 1397 1393 1385 1381 1397 1393 1398 1394 1386 1382 1398 1394 1399 1395 1387 1383 1399 1395 1400 1396 1388 1384 1400 1396 1401 1397 1389 1385 1401 1397 1402 1398 1390 1386 1402 1398 1403 1399 1391 1387 1403 1399 816 813 804 801 1404 1400 1405 1401 1393 1389 1405 1401 1406 1402 1394 1390 1406 1402 1407 1403 1395 1391 1407 1403 1408 1404 1396 1392 1408 1404 1409 1405 1397 1393 1409 1405 1410 1406 1398 1394 1410 1406 1411 1407 1399 1395 1411 1407 1412 1408 1400 1396 1412 1408 1413 1409 1401 1397 1413 1409 1414 1410 1402 1398 1414 1410 1415 1411 1403 1399 1415 1411 828 825 816 813 1416 1412 1417 1413 1405 1401 1417 1413 1418 1414 1406 1402 1418 1414 1419 1415 1407 1403 1419 1415 1420 1416 1408 1404 1420 1416 1421 1417 1409 1405 1421 1417 1422 1418 1410 1406 1422 1418 1423 1419 1411 1407 1423 1419 1424 1420 1412 1408 1424 1420 1425 1421 1413 1409 1425 1421 1426 1422 1414 1410 1426 1422 1427 1423 1415 1411 1427 1423 840 837 828 825 1428 1424 1429 1425 1417 1413 1429 1425 1430 1426 1418 1414 1430 1426 1431 1427 1419 1415 1431 1427 1432 1428 1420 1416 1432 1428 1433 1429 1421 1417 1433 1429 1434 1430 1422 1418 1434 1430 1435 1431 1423 1419 1435 1431 1436 1432 1424 1420 1436 1432 1437 1433 1425 1421 1437 1433 1438 1434 1426 1422 1438 1434 1439 1435 1427 1423 1439 1435 852 849 840 837 1441 1436 1429 1425 1428 1424 1442 1438 1430 1426 1429 1425 1443 1439 1431 1427 1430 1426 1444 1440 1432 1428 1431 1427 1445 1441 1433 1429 1432 1428 1446 1442 1434 1430 1433 1429 1447 1443 1435 1431 1434 1430 1448 1444 1436 1432 1435 1431 1449 1445 1437 1433 1436 1432 1450 1446 1438 1434 1437 1433 1451 1447 1439 1435 1438 1434 864 860 852 849 1439 1435 1453 1448 1441 1436 1440 1437 1454 1450 1442 1438 1441 1436 1455 1451 1443 1439 1442 1438 1456 1452 1444 1440 1443 1439 1457 1453 1445 1441 1444 1440 1458 1454 1446 1442 1445 1441 1459 1455 1447 1443 1446 1442 1460 1456 1448 1444 1447 1443 1461 1457 1449 1445 1448 1444 1462 1458 1450 1446 1449 1445 1463 1459 1451 1447 1450 1446 876 872 864 860 1451 1447 1465 1460 1453 1448 1452 1449 1466 1462 1454 1450 1453 1448 1467 1463 1455 1451 1454 1450 1468 1464 1456 1452 1455 1451 1469 1465 1457 1453 1456 1452 1470 1466 1458 1454 1457 1453 1471 1467 1459 1455 1458 1454 1472 1468 1460 1456 1459 1455 1473 1469 1461 1457 1460 1456 1474 1470 1462 1458 1461 1457 1475 1471 1463 1459 1462 1458 888 884 876 872 1463 1459 1477 1472 1465 1460 1464 1461 1478 1474 1466 1462 1465 1460 1479 1475 1467 1463 1466 1462 1480 1476 1468 1464 1467 1463 1481 1477 1469 1465 1468 1464 1482 1478 1470 1466 1469 1465 1483 1479 1471 1467 1470 1466 1484 1480 1472 1468 1471 1467 1485 1481 1473 1469 1472 1468 1486 1482 1474 1470 1473 1469 1487 1483 1475 1471 1474 1470 900 896 888 884 1475 1471 1489 1484 1477 1472 1476 1473 1490 1486 1478 1474 1477 1472 1491 1487 1479 1475 1478 1474 1492 1488 1480 1476 1479 1475 1493 1489 1481 1477 1480 1476 1494 1490 1482 1478 1481 1477 1495 1491 1483 1479 1482 1478 1496 1492 1484 1480 1483 1479 1497 1493 1485 1481 1484 1480 1498 1494 1486 1482 1485 1481 1499 1495 1487 1483 1486 1482 912 908 900 896 1487 1483 1202 1197 1489 1484 1488 1485 1205 1200 1490 1486 1489 1484 1207 1202 1491 1487 1490 1486 1209 1204 1492 1488 1491 1487 1211 1206 1493 1489 1492 1488 1213 1208 1494 1490 1493 1489 1215 1210 1495 1491 1494 1490 1217 1212 1496 1492 1495 1491 1219 1214 1497 1493 1496 1492 1221 1216 1498 1494 1497 1493 1223 1218 1499 1495 1498 1494 627 621 912 908 1499 1495 1500 1496 1501 1499 1502 1497 1501 1499 1504 1501 1505 1500 1504 1501 1506 1503 1507 1502 1506 1503 1508 1505 1509 1504 1508 1505 1510 1507 1511 1506 1510 1507 1512 1509 1513 1508 1512 1509 1514 1511 1515 1510 1514 1511 1516 1513 1517 1512 1516 1513 1518 1515 1519 1514 1518 1515 1520 1517 1521 1516 1520 1517 1522 1519 1523 1518 1522 1519 924 922 927 921 1524 1520 1525 1521 1501 1499 1525 1521 1526 1522 1504 1501 1526 1522 1527 1523 1506 1503 1527 1523 1528 1524 1508 1505 1528 1524 1529 1525 1510 1507 1529 1525 1530 1526 1512 1509 1530 1526 1531 1527 1514 1511 1531 1527 1532 1528 1516 1513 1532 1528 1533 1529 1518 1515 1533 1529 1534 1530 1520 1517 1534 1530 1535 1531 1522 1519 1535 1531 948 945 924 922 1536 1532 1537 1533 1525 1521 1537 1533 1538 1534 1526 1522 1538 1534 1539 1535 1527 1523 1539 1535 1540 1536 1528 1524 1540 1536 1541 1537 1529 1525 1541 1537 1542 1538 1530 1526 1542 1538 1543 1539 1531 1527 1543 1539 1544 1540 1532 1528 1544 1540 1545 1541 1533 1529 1545 1541 1546 1542 1534 1530 1546 1542 1547 1543 1535 1531 1547 1543 960 957 948 945 1548 1544 1549 1545 1537 1533 1549 1545 1550 1546 1538 1534 1550 1546 1551 1547 1539 1535 1551 1547 1552 1548 1540 1536 1552 1548 1553 1549 1541 1537 1553 1549 1554 1550 1542 1538 1554 1550 1555 1551 1543 1539 1555 1551 1556 1552 1544 1540 1556 1552 1557 1553 1545 1541 1557 1553 1558 1554 1546 1542 1558 1554 1559 1555 1547 1543 1559 1555 972 969 960 957 1560 1556 1561 1557 1549 1545 1561 1557 1562 1558 1550 1546 1562 1558 1563 1559 1551 1547 1563 1559 1564 1560 1552 1548 1564 1560 1565 1561 1553 1549 1565 1561 1566 1562 1554 1550 1566 1562 1567 1563 1555 1551 1567 1563 1568 1564 1556 1552 1568 1564 1569 1565 1557 1553 1569 1565 1570 1566 1558 1554 1570 1566 1571 1567 1559 1555 1571 1567 984 981 972 969 1572 1568 1573 1569 1561 1557 1573 1569 1574 1570 1562 1558 1574 1570 1575 1571 1563 1559 1575 1571 1576 1572 1564 1560 1576 1572 1577 1573 1565 1561 1577 1573 1578 1574 1566 1562 1578 1574 1579 1575 1567 1563 1579 1575 1580 1576 1568 1564 1580 1576 1581 1577 1569 1565 1581 1577 1582 1578 1570 1566 1582 1578 1583 1579 1571 1567 1583 1579 996 993 984 981 1585 1580 1573 1569 1572 1568 1586 1582 1574 1570 1573 1569 1587 1583 1575 1571 1574 1570 1588 1584 1576 1572 1575 1571 1589 1585 1577 1573 1576 1572 1590 1586 1578 1574 1577 1573 1591 1587 1579 1575 1578 1574 1592 1588 1580 1576 1579 1575 1593 1589 1581 1577 1580 1576 1594 1590 1582 1578 1581 1577 1595 1591 1583 1579 1582 1578 1008 1004 996 993 1583 1579 1597 1592 1585 1580 1584 1581 1598 1594 1586 1582 1585 1580 1599 1595 1587 1583 1586 1582 1600 1596 1588 1584 1587 1583 1601 1597 1589 1585 1588 1584 1602 1598 1590 1586 1589 1585 1603 1599 1591 1587 1590 1586 1604 1600 1592 1588 1591 1587 1605 1601 1593 1589 1592 1588 1606 1602 1594 1590 1593 1589 1607 1603 1595 1591 1594 1590 1020 1016 1008 1004 1595 1591 1609 1604 1597 1592 1596 1593 1610 1606 1598 1594 1597 1592 1611 1607 1599 1595 1598 1594 1612 1608 1600 1596 1599 1595 1613 1609 1601 1597 1600 1596 1614 1610 1602 1598 1601 1597 1615 1611 1603 1599 1602 1598 1616 1612 1604 1600 1603 1599 1617 1613 1605 1601 1604 1600 1618 1614 1606 1602 1605 1601 1619 1615 1607 1603 1606 1602 1032 1028 1020 1016 1607 1603 1621 1616 1609 1604 1608 1605 1622 1618 1610 1606 1609 1604 1623 1619 1611 1607 1610 1606 1624 1620 1612 1608 1611 1607 1625 1621 1613 1609 1612 1608 1626 1622 1614 1610 1613 1609 1627 1623 1615 1611 1614 1610 1628 1624 1616 1612 1615 1611 1629 1625 1617 1613 1616 1612 1630 1626 1618 1614 1617 1613 1631 1627 1619 1615 1618 1614 1044 1040 1032 1028 1619 1615 1633 1628 1621 1616 1620 1617 1634 1630 1622 1618 1621 1616 1635 1631 1623 1619 1622 1618 1636 1632 1624 1620 1623 1619 1637 1633 1625 1621 1624 1620 1638 1634 1626 1622 1625 1621 1639 1635 1627 1623 1626 1622 1640 1636 1628 1624 1627 1623 1641 1637 1629 1625 1628 1624 1642 1638 1630 1626 1629 1625 1643 1639 1631 1627 1630 1626 1056 1052 1044 1040 1631 1627 1358 1353 1633 1628 1632 1629 1361 1356 1634 1630 1633 1628 1363 1358 1635 1631 1634 1630 1365 1360 1636 1632 1635 1631 1367 1362 1637 1633 1636 1632 1369 1364 1638 1634 1637 1633 1371 1366 1639 1635 1638 1634 1373 1368 1640 1636 1639 1635 1375 1370 1641 1637 1640 1636 1377 1372 1642 1638 1641 1637 1379 1374 1643 1639 1642 1638 783 777 1056 1052 1643 1639 1644 1640 1645 1641 1345 1340 1645 1641 1646 1642 1346 1342 1646 1642 1647 1643 1347 1343 1647 1643 1648 1644 1348 1344 1648 1644 1649 1645 1349 1345 1649 1645 1650 1646 1350 1346 1650 1646 1651 1647 1351 1347 1651 1647 1652 1648 1352 1348 1652 1648 1653 1649 1353 1349 1653 1649 1654 1650 1354 1350 1654 1650 1655 1651 1355 1351 1655 1651 1068 1065 768 764 1656 1652 1657 1653 1645 1641 1657 1653 1658 1654 1646 1642 1658 1654 1659 1655 1647 1643 1659 1655 1660 1656 1648 1644 1660 1656 1661 1657 1649 1645 1661 1657 1662 1658 1650 1646 1662 1658 1663 1659 1651 1647 1663 1659 1664 1660 1652 1648 1664 1660 1665 1661 1653 1649 1665 1661 1666 1662 1654 1650 1666 1662 1667 1663 1655 1651 1667 1663 1080 1077 1068 1065 1668 1664 1669 1665 1657 1653 1669 1665 1670 1666 1658 1654 1670 1666 1671 1667 1659 1655 1671 1667 1672 1668 1660 1656 1672 1668 1673 1669 1661 1657 1673 1669 1674 1670 1662 1658 1674 1670 1675 1671 1663 1659 1675 1671 1676 1672 1664 1660 1676 1672 1677 1673 1665 1661 1677 1673 1678 1674 1666 1662 1678 1674 1679 1675 1667 1663 1679 1675 1092 1089 1080 1077 1680 1676 1681 1677 1669 1665 1681 1677 1682 1678 1670 1666 1682 1678 1683 1679 1671 1667 1683 1679 1684 1680 1672 1668 1684 1680 1685 1681 1673 1669 1685 1681 1686 1682 1674 1670 1686 1682 1687 1683 1675 1671 1687 1683 1688 1684 1676 1672 1688 1684 1689 1685 1677 1673 1689 1685 1690 1686 1678 1674 1690 1686 1691 1687 1679 1675 1691 1687 1104 1101 1092 1089 1692 1688 1693 1689 1681 1677 1693 1689 1694 1690 1682 1678 1694 1690 1695 1691 1683 1679 1695 1691 1696 1692 1684 1680 1696 1692 1697 1693 1685 1681 1697 1693 1698 1694 1686 1682 1698 1694 1699 1695 1687 1683 1699 1695 1700 1696 1688 1684 1700 1696 1701 1697 1689 1685 1701 1697 1702 1698 1690 1686 1702 1698 1703 1699 1691 1687 1703 1699 1116 1113 1104 1101 1704 1700 1705 1701 1693 1689 1705 1701 1706 1702 1694 1690 1706 1702 1707 1703 1695 1691 1707 1703 1708 1704 1696 1692 1708 1704 1709 1705 1697 1693 1709 1705 1710 1706 1698 1694 1710 1706 1711 1707 1699 1695 1711 1707 1712 1708 1700 1696 1712 1708 1713 1709 1701 1697 1713 1709 1714 1710 1702 1698 1714 1710 1715 1711 1703 1699 1715 1711 1128 1125 1116 1113 1717 1712 1705 1701 1704 1700 1718 1714 1706 1702 1705 1701 1719 1715 1707 1703 1706 1702 1720 1716 1708 1704 1707 1703 1721 1717 1709 1705 1708 1704 1722 1718 1710 1706 1709 1705 1723 1719 1711 1707 1710 1706 1724 1720 1712 1708 1711 1707 1725 1721 1713 1709 1712 1708 1726 1722 1714 1710 1713 1709 1727 1723 1715 1711 1714 1710 1140 1136 1128 1125 1715 1711 1729 1724 1717 1712 1716 1713 1730 1726 1718 1714 1717 1712 1731 1727 1719 1715 1718 1714 1732 1728 1720 1716 1719 1715 1733 1729 1721 1717 1720 1716 1734 1730 1722 1718 1721 1717 1735 1731 1723 1719 1722 1718 1736 1732 1724 1720 1723 1719 1737 1733 1725 1721 1724 1720 1738 1734 1726 1722 1725 1721 1739 1735 1727 1723 1726 1722 1152 1148 1140 1136 1727 1723 1741 1736 1729 1724 1728 1725 1742 1738 1730 1726 1729 1724 1743 1739 1731 1727 1730 1726 1744 1740 1732 1728 1731 1727 1745 1741 1733 1729 1732 1728 1746 1742 1734 1730 1733 1729 1747 1743 1735 1731 1734 1730 1748 1744 1736 1732 1735 1731 1749 1745 1737 1733 1736 1732 1750 1746 1738 1734 1737 1733 1751 1747 1739 1735 1738 1734 1164 1160 1152 1148 1739 1735 1753 1748 1741 1736 1740 1737 1754 1750 1742 1738 1741 1736 1755 1751 1743 1739 1742 1738 1756 1752 1744 1740 1743 1739 1757 1753 1745 1741 1744 1740 1758 1754 1746 1742 1745 1741 1759 1755 1747 1743 1746 1742 1760 1756 1748 1744 1747 1743 1761 1757 1749 1745 1748 1744 1762 1758 1750 1746 1749 1745 1763 1759 1751 1747 1750 1746 1176 1172 1164 1160 1751 1747 1765 1760 1753 1748 1752 1749 1766 1762 1754 1750 1753 1748 1767 1763 1755 1751 1754 1750 1768 1764 1756 1752 1755 1751 1769 1765 1757 1753 1756 1752 1770 1766 1758 1754 1757 1753 1771 1767 1759 1755 1758 1754 1772 1768 1760 1756 1759 1755 1773 1769 1761 1757 1760 1756 1774 1770 1762 1758 1761 1757 1775 1771 1763 1759 1762 1758 1188 1184 1176 1172 1763 1759 1502 1497 1765 1760 1764 1761 1505 1500 1766 1762 1765 1760 1507 1502 1767 1763 1766 1762 1509 1504 1768 1764 1767 1763 1511 1506 1769 1765 1768 1764 1513 1508 1770 1766 1769 1765 1515 1510 1771 1767 1770 1766 1517 1512 1772 1768 1771 1767 1519 1514 1773 1769 1772 1768 1521 1516 1774 1770 1773 1769 1523 1518 1775 1771 1774 1770 927 921 1188 1184 1775 1771 1776 1772 1777 1775 1778 1773 1777 1775 1780 1777 1781 1776 1780 1777 1782 1779 1783 1778 1782 1779 1784 1781 1785 1780 1784 1781 1786 1783 1787 1782 1786 1783 1788 1785 1789 1784 1788 1785 1790 1787 1791 1786 1790 1787 1792 1789 1793 1788 1792 1789 1794 1791 1795 1790 1794 1791 1796 1793 1797 1792 1796 1793 1798 1796 1799 1794 1800 1795 1801 4684 1799 1794 1802 1797 1803 1798 1777 1775 1803 1798 1804 1799 1780 1777 1804 1799 1805 1800 1782 1779 1805 1800 1806 1801 1784 1781 1806 1801 1807 1802 1786 1783 1807 1802 1808 1803 1788 1785 1808 1803 1809 1804 1790 1787 1809 1804 1810 1805 1792 1789 1810 1805 1811 1806 1794 1791 1811 1806 1812 1807 1796 1793 1812 1807 1813 1809 1798 1796 1814 1808 1800 1795 1798 1796 1815 1810 1816 1811 1803 1798 1816 1811 1817 1812 1804 1799 1817 1812 1818 1813 1805 1800 1818 1813 1819 1814 1806 1801 1819 1814 1820 1815 1807 1802 1820 1815 1821 1816 1808 1803 1821 1816 1822 1817 1809 1804 1822 1817 1823 1818 1810 1805 1823 1818 1824 1819 1811 1806 1824 1819 1825 1820 1812 1807 1825 1820 1826 1822 1813 1809 1827 1821 1814 1808 1813 1809 1828 1823 1829 1824 1816 1811 1829 1824 1830 1825 1817 1812 1830 1825 1831 1826 1818 1813 1831 1826 1832 1827 1819 1814 1832 1827 1833 1828 1820 1815 1833 1828 1834 1829 1821 1816 1834 1829 1835 1830 1822 1817 1835 1830 1836 1831 1823 1818 1836 1831 1837 1832 1824 1819 1837 1832 1838 1833 1825 1820 1838 1833 1839 1835 1826 1822 1840 1834 1827 1821 1826 1822 1841 1836 1842 1837 1829 1824 1842 1837 1843 1838 1830 1825 1843 1838 1844 1839 1831 1826 1844 1839 1845 1840 1832 1827 1845 1840 1846 1841 1833 1828 1846 1841 1847 1842 1834 1829 1847 1842 1848 1843 1835 1830 1848 1843 1849 1844 1836 1831 1849 1844 1850 1845 1837 1832 1850 1845 1851 1846 1838 1833 1851 1846 1852 1848 1839 1835 1853 1847 1840 1834 1839 1835 1854 1849 1855 1850 1842 1837 1855 1850 1856 1851 1843 1838 1856 1851 1857 1852 1844 1839 1857 1852 1858 1853 1845 1840 1858 1853 1859 1854 1846 1841 1859 1854 1860 1855 1847 1842 1860 1855 1861 1856 1848 1843 1861 1856 1862 1857 1849 1844 1862 1857 1863 1858 1850 1845 1863 1858 1864 1859 1851 1846 1864 1859 1865 1861 1852 1848 1866 1860 1853 1847 1852 1848 1867 1862 1868 1863 1855 1850 1868 1863 1869 1864 1856 1851 1869 1864 1870 1865 1857 1852 1870 1865 1871 1866 1858 1853 1871 1866 1872 1867 1859 1854 1872 1867 1873 1868 1860 1855 1873 1868 1874 1869 1861 1856 1874 1869 1875 1870 1862 1857 1875 1870 1876 1871 1863 1858 1876 1871 1877 1872 1864 1859 1877 1872 1878 1874 1865 1861 1879 1873 1866 1860 1865 1861 1880 1875 1881 1876 1868 1863 1881 1876 1882 1877 1869 1864 1882 1877 1883 1878 1870 1865 1883 1878 1884 1879 1871 1866 1884 1879 1885 1880 1872 1867 1885 1880 1886 1881 1873 1868 1886 1881 1887 1882 1874 1869 1887 1882 1888 1883 1875 1870 1888 1883 1889 1884 1876 1871 1889 1884 1890 1885 1877 1872 1890 1885 1891 1887 1878 1874 1892 1886 1879 1873 1878 1874 1893 1888 1894 1889 1881 1876 1894 1889 1895 1890 1882 1877 1895 1890 1896 1891 1883 1878 1896 1891 1897 1892 1884 1879 1897 1892 1898 1893 1885 1880 1898 1893 1899 1894 1886 1881 1899 1894 1900 1895 1887 1882 1900 1895 1901 1896 1888 1883 1901 1896 1902 1897 1889 1884 1902 1897 1903 1898 1890 1885 1903 1898 1904 1900 1891 1887 1905 1899 1892 1886 1891 1887 1906 1901 1907 1902 1894 1889 1907 1902 1908 1903 1895 1890 1908 1903 1909 1904 1896 1891 1909 1904 1910 1905 1897 1892 1910 1905 1911 1906 1898 1893 1911 1906 1912 1907 1899 1894 1912 1907 1913 1908 1900 1895 1913 1908 1914 1909 1901 1896 1914 1909 1915 1910 1902 1897 1915 1910 1916 1911 1903 1898 1916 1911 1917 1913 1904 1900 1918 1912 1905 1899 1904 1900 1919 1914 1920 1915 1907 1902 1920 1915 1921 1916 1908 1903 1921 1916 1922 1917 1909 1904 1922 1917 1923 1918 1910 1905 1923 1918 1924 1919 1911 1906 1924 1919 1925 1920 1912 1907 1925 1920 1926 1921 1913 1908 1926 1921 1927 1922 1914 1909 1927 1922 1928 1923 1915 1910 1928 1923 1929 1924 1916 1911 1929 1924 1930 1926 1917 1913 1931 1925 1918 1912 1917 1913 1932 1927 1933 1928 1920 1915 1933 1928 1934 1929 1921 1916 1934 1929 1935 1930 1922 1917 1935 1930 1936 1931 1923 1918 1936 1931 1937 1932 1924 1919 1937 1932 1938 1933 1925 1920 1938 1933 1939 1934 1926 1921 1939 1934 1940 1935 1927 1922 1940 1935 1941 1936 1928 1923 1941 1936 1942 1937 1929 1924 1942 1937 1943 1939 1930 1926 1944 1938 1931 1925 1930 1926 1946 1940 1933 1928 1932 1927 1947 1942 1934 1929 1933 1928 1948 1943 1935 1930 1934 1929 1949 1944 1936 1931 1935 1930 1950 1945 1937 1932 1936 1931 1951 1946 1938 1933 1937 1932 1952 1947 1939 1934 1938 1933 1953 1948 1940 1935 1939 1934 1954 1949 1941 1936 1940 1935 1955 1950 1942 1937 1941 1936 1956 1951 1943 1939 1942 1937 1956 1951 1957 1964 1944 1938 1959 1952 1946 1940 1945 1941 1960 1954 1947 1942 1946 1940 1961 1955 1948 1943 1947 1942 1962 1956 1949 1944 1948 1943 1963 1957 1950 1945 1949 1944 1964 1958 1951 1946 1950 1945 1965 1959 1952 1947 1951 1946 1966 1960 1953 1948 1952 1947 1967 1961 1954 1949 1953 1948 1968 1962 1955 1950 1954 1949 1969 1963 1956 1951 1955 1950 1969 1963 1970 1977 1957 1964 1972 1965 1959 1952 1958 1953 1973 1967 1960 1954 1959 1952 1974 1968 1961 1955 1960 1954 1975 1969 1962 1956 1961 1955 1976 1970 1963 1957 1962 1956 1977 1971 1964 1958 1963 1957 1978 1972 1965 1959 1964 1958 1979 1973 1966 1960 1965 1959 1980 1974 1967 1961 1966 1960 1981 1975 1968 1962 1967 1961 1982 1976 1969 1963 1968 1962 1982 1976 1983 1990 1970 1977 1985 1978 1972 1965 1971 1966 1986 1980 1973 1967 1972 1965 1987 1981 1974 1968 1973 1967 1988 1982 1975 1969 1974 1968 1989 1983 1976 1970 1975 1969 1990 1984 1977 1971 1976 1970 1991 1985 1978 1972 1977 1971 1992 1986 1979 1973 1978 1972 1993 1987 1980 1974 1979 1973 1994 1988 1981 1975 1980 1974 1995 1989 1982 1976 1981 1975 1995 1989 1996 2003 1983 1990 1998 1991 1985 1978 1984 1979 1999 1993 1986 1980 1985 1978 2000 1994 1987 1981 1986 1980 2001 1995 1988 1982 1987 1981 2002 1996 1989 1983 1988 1982 2003 1997 1990 1984 1989 1983 2004 1998 1991 1985 1990 1984 2005 1999 1992 1986 1991 1985 2006 2000 1993 1987 1992 1986 2007 2001 1994 1988 1993 1987 2008 2002 1995 1989 1994 1988 2008 2002 2009 2016 1996 2003 2011 2004 1998 1991 1997 1992 2012 2006 1999 1993 1998 1991 2013 2007 2000 1994 1999 1993 2014 2008 2001 1995 2000 1994 2015 2009 2002 1996 2001 1995 2016 2010 2003 1997 2002 1996 2017 2011 2004 1998 2003 1997 2018 2012 2005 1999 2004 1998 2019 2013 2006 2000 2005 1999 2020 2014 2007 2001 2006 2000 2021 2015 2008 2002 2007 2001 2021 2015 2022 2029 2009 2016 2024 2017 2011 2004 2010 2005 2025 2019 2012 2006 2011 2004 2026 2020 2013 2007 2012 2006 2027 2021 2014 2008 2013 2007 2028 2022 2015 2009 2014 2008 2029 2023 2016 2010 2015 2009 2030 2024 2017 2011 2016 2010 2031 2025 2018 2012 2017 2011 2032 2026 2019 2013 2018 2012 2033 2027 2020 2014 2019 2013 2034 2028 2021 2015 2020 2014 2034 2028 2035 2042 2022 2029 2037 2030 2024 2017 2023 2018 2038 2032 2025 2019 2024 2017 2039 2033 2026 2020 2025 2019 2040 2034 2027 2021 2026 2020 2041 2035 2028 2022 2027 2021 2042 2036 2029 2023 2028 2022 2043 2037 2030 2024 2029 2023 2044 2038 2031 2025 2030 2024 2045 2039 2032 2026 2031 2025 2046 2040 2033 2027 2032 2026 2047 2041 2034 2028 2033 2027 2047 2041 2048 2055 2035 2042 2050 2043 2037 2030 2036 2031 2051 2045 2038 2032 2037 2030 2052 2046 2039 2033 2038 2032 2053 2047 2040 2034 2039 2033 2054 2048 2041 2035 2040 2034 2055 2049 2042 2036 2041 2035 2056 2050 2043 2037 2042 2036 2057 2051 2044 2038 2043 2037 2058 2052 2045 2039 2044 2038 2059 2053 2046 2040 2045 2039 2060 2054 2047 2041 2046 2040 2060 2054 2061 2068 2048 2055 2063 2056 2050 2043 2049 2044 2064 2058 2051 2045 2050 2043 2065 2059 2052 2046 2051 2045 2066 2060 2053 2047 2052 2046 2067 2061 2054 2048 2053 2047 2068 2062 2055 2049 2054 2048 2069 2063 2056 2050 2055 2049 2070 2064 2057 2051 2056 2050 2071 2065 2058 2052 2057 2051 2072 2066 2059 2053 2058 2052 2073 2067 2060 2054 2059 2053 2073 2067 2074 2081 2061 2068 2076 2069 2063 2056 2062 2057 2077 2071 2064 2058 2063 2056 2078 2072 2065 2059 2064 2058 2079 2073 2066 2060 2065 2059 2080 2074 2067 2061 2066 2060 2081 2075 2068 2062 2067 2061 2082 2076 2069 2063 2068 2062 2083 2077 2070 2064 2069 2063 2084 2078 2071 2065 2070 2064 2085 2079 2072 2066 2071 2065 2086 2080 2073 2067 2072 2066 2086 2080 2087 2082 2074 2081 1778 1773 2076 2069 2075 2070 1781 1776 2077 2071 2076 2069 1783 1778 2078 2072 2077 2071 1785 1780 2079 2073 2078 2072 1787 1782 2080 2074 2079 2073 1789 1784 2081 2075 2080 2074 1791 1786 2082 2076 2081 2075 1793 1788 2083 2077 2082 2076 1795 1790 2084 2078 2083 2077 1797 1792 2085 2079 2084 2078 1799 1794 2086 2080 2085 2079 1799 1794 1801 4684 2087 2082 2088 2083 2089 2086 2090 2084 2089 2086 2092 2088 2093 2087 2092 2088 2094 2090 2095 2089 2094 2090 2096 2092 2097 2091 2096 2092 2098 2094 2099 2093 2098 2094 2100 2096 2101 2095 2100 2096 2102 2098 2103 2097 2102 2098 2104 2100 2105 2099 2104 2100 2106 2102 2107 2101 2106 2102 2108 2104 2109 2103 2108 2104 2110 2106 2111 2105 2110 2106 1776 1772 1779 1774 2112 2107 2113 2108 2089 2086 2113 2108 2114 2109 2092 2088 2114 2109 2115 2110 2094 2090 2115 2110 2116 2111 2096 2092 2116 2111 2117 2112 2098 2094 2117 2112 2118 2113 2100 2096 2118 2113 2119 2114 2102 2098 2119 2114 2120 2115 2104 2100 2120 2115 2121 2116 2106 2102 2121 2116 2122 2117 2108 2104 2122 2117 2123 2118 2110 2106 2123 2118 1802 1797 1776 1772 2124 2119 2125 2120 2113 2108 2125 2120 2126 2121 2114 2109 2126 2121 2127 2122 2115 2110 2127 2122 2128 2123 2116 2111 2128 2123 2129 2124 2117 2112 2129 2124 2130 2125 2118 2113 2130 2125 2131 2126 2119 2114 2131 2126 2132 2127 2120 2115 2132 2127 2133 2128 2121 2116 2133 2128 2134 2129 2122 2117 2134 2129 2135 2130 2123 2118 2135 2130 1815 1810 1802 1797 2136 2131 2137 2132 2125 2120 2137 2132 2138 2133 2126 2121 2138 2133 2139 2134 2127 2122 2139 2134 2140 2135 2128 2123 2140 2135 2141 2136 2129 2124 2141 2136 2142 2137 2130 2125 2142 2137 2143 2138 2131 2126 2143 2138 2144 2139 2132 2127 2144 2139 2145 2140 2133 2128 2145 2140 2146 2141 2134 2129 2146 2141 2147 2142 2135 2130 2147 2142 1828 1823 1815 1810 2148 2143 2149 2144 2137 2132 2149 2144 2150 2145 2138 2133 2150 2145 2151 2146 2139 2134 2151 2146 2152 2147 2140 2135 2152 2147 2153 2148 2141 2136 2153 2148 2154 2149 2142 2137 2154 2149 2155 2150 2143 2138 2155 2150 2156 2151 2144 2139 2156 2151 2157 2152 2145 2140 2157 2152 2158 2153 2146 2141 2158 2153 2159 2154 2147 2142 2159 2154 1841 1836 1828 1823 2160 2155 2161 2156 2149 2144 2161 2156 2162 2157 2150 2145 2162 2157 2163 2158 2151 2146 2163 2158 2164 2159 2152 2147 2164 2159 2165 2160 2153 2148 2165 2160 2166 2161 2154 2149 2166 2161 2167 2162 2155 2150 2167 2162 2168 2163 2156 2151 2168 2163 2169 2164 2157 2152 2169 2164 2170 2165 2158 2153 2170 2165 2171 2166 2159 2154 2171 2166 1854 1849 1841 1836 2172 2167 2173 2168 2161 2156 2173 2168 2174 2169 2162 2157 2174 2169 2175 2170 2163 2158 2175 2170 2176 2171 2164 2159 2176 2171 2177 2172 2165 2160 2177 2172 2178 2173 2166 2161 2178 2173 2179 2174 2167 2162 2179 2174 2180 2175 2168 2163 2180 2175 2181 2176 2169 2164 2181 2176 2182 2177 2170 2165 2182 2177 2183 2178 2171 2166 2183 2178 1867 1862 1854 1849 2184 2179 2185 2180 2173 2168 2185 2180 2186 2181 2174 2169 2186 2181 2187 2182 2175 2170 2187 2182 2188 2183 2176 2171 2188 2183 2189 2184 2177 2172 2189 2184 2190 2185 2178 2173 2190 2185 2191 2186 2179 2174 2191 2186 2192 2187 2180 2175 2192 2187 2193 2188 2181 2176 2193 2188 2194 2189 2182 2177 2194 2189 2195 2190 2183 2178 2195 2190 1880 1875 1867 1862 2196 2191 2197 2192 2185 2180 2197 2192 2198 2193 2186 2181 2198 2193 2199 2194 2187 2182 2199 2194 2200 2195 2188 2183 2200 2195 2201 2196 2189 2184 2201 2196 2202 2197 2190 2185 2202 2197 2203 2198 2191 2186 2203 2198 2204 2199 2192 2187 2204 2199 2205 2200 2193 2188 2205 2200 2206 2201 2194 2189 2206 2201 2207 2202 2195 2190 2207 2202 1893 1888 1880 1875 2208 2203 2209 2204 2197 2192 2209 2204 2210 2205 2198 2193 2210 2205 2211 2206 2199 2194 2211 2206 2212 2207 2200 2195 2212 2207 2213 2208 2201 2196 2213 2208 2214 2209 2202 2197 2214 2209 2215 2210 2203 2198 2215 2210 2216 2211 2204 2199 2216 2211 2217 2212 2205 2200 2217 2212 2218 2213 2206 2201 2218 2213 2219 2214 2207 2202 2219 2214 1906 1901 1893 1888 2220 2215 2221 2216 2209 2204 2221 2216 2222 2217 2210 2205 2222 2217 2223 2218 2211 2206 2223 2218 2224 2219 2212 2207 2224 2219 2225 2220 2213 2208 2225 2220 2226 2221 2214 2209 2226 2221 2227 2222 2215 2210 2227 2222 2228 2223 2216 2211 2228 2223 2229 2224 2217 2212 2229 2224 2230 2225 2218 2213 2230 2225 2231 2226 2219 2214 2231 2226 1919 1914 1906 1901 783 777 2232 2227 2221 2216 2232 2227 2233 2228 2222 2217 2233 2228 2234 2229 2223 2218 2234 2229 2235 2230 2224 2219 2235 2230 2236 2231 2225 2220 2236 2231 2237 2232 2226 2221 2237 2232 2238 2233 2227 2222 2238 2233 2239 2234 2228 2223 2239 2234 2240 2235 2229 2224 2240 2235 2241 2236 2230 2225 2241 2236 2242 2237 2231 2226 2242 2237 1932 1927 1919 1914 2244 2238 2232 2227 783 777 2245 2240 2233 2228 2232 2227 2246 2241 2234 2229 2233 2228 2247 2242 2235 2230 2234 2229 2248 2243 2236 2231 2235 2230 2249 2244 2237 2232 2236 2231 2250 2245 2238 2233 2237 2232 2251 2246 2239 2234 2238 2233 2252 2247 2240 2235 2239 2234 2253 2248 2241 2236 2240 2235 2254 2249 2242 2237 2241 2236 1945 1941 1932 1927 2242 2237 2256 2250 2244 2238 2243 2239 2257 2252 2245 2240 2244 2238 2258 2253 2246 2241 2245 2240 2259 2254 2247 2242 2246 2241 2260 2255 2248 2243 2247 2242 2261 2256 2249 2244 2248 2243 2262 2257 2250 2245 2249 2244 2263 2258 2251 2246 2250 2245 2264 2259 2252 2247 2251 2246 2265 2260 2253 2248 2252 2247 2266 2261 2254 2249 2253 2248 1958 1953 1945 1941 2254 2249 2268 2262 2256 2250 2255 2251 2269 2264 2257 2252 2256 2250 2270 2265 2258 2253 2257 2252 2271 2266 2259 2254 2258 2253 2272 2267 2260 2255 2259 2254 2273 2268 2261 2256 2260 2255 2274 2269 2262 2257 2261 2256 2275 2270 2263 2258 2262 2257 2276 2271 2264 2259 2263 2258 2277 2272 2265 2260 2264 2259 2278 2273 2266 2261 2265 2260 1971 1966 1958 1953 2266 2261 2280 2274 2268 2262 2267 2263 2281 2276 2269 2264 2268 2262 2282 2277 2270 2265 2269 2264 2283 2278 2271 2266 2270 2265 2284 2279 2272 2267 2271 2266 2285 2280 2273 2268 2272 2267 2286 2281 2274 2269 2273 2268 2287 2282 2275 2270 2274 2269 2288 2283 2276 2271 2275 2270 2289 2284 2277 2272 2276 2271 2290 2285 2278 2273 2277 2272 1984 1979 1971 1966 2278 2273 2292 2286 2280 2274 2279 2275 2293 2288 2281 2276 2280 2274 2294 2289 2282 2277 2281 2276 2295 2290 2283 2278 2282 2277 2296 2291 2284 2279 2283 2278 2297 2292 2285 2280 2284 2279 2298 2293 2286 2281 2285 2280 2299 2294 2287 2282 2286 2281 2300 2295 2288 2283 2287 2282 2301 2296 2289 2284 2288 2283 2302 2297 2290 2285 2289 2284 1997 1992 1984 1979 2290 2285 2304 2298 2292 2286 2291 2287 2305 2300 2293 2288 2292 2286 2306 2301 2294 2289 2293 2288 2307 2302 2295 2290 2294 2289 2308 2303 2296 2291 2295 2290 2309 2304 2297 2292 2296 2291 2310 2305 2298 2293 2297 2292 2311 2306 2299 2294 2298 2293 2312 2307 2300 2295 2299 2294 2313 2308 2301 2296 2300 2295 2314 2309 2302 2297 2301 2296 2010 2005 1997 1992 2302 2297 2316 2310 2304 2298 2303 2299 2317 2312 2305 2300 2304 2298 2318 2313 2306 2301 2305 2300 2319 2314 2307 2302 2306 2301 2320 2315 2308 2303 2307 2302 2321 2316 2309 2304 2308 2303 2322 2317 2310 2305 2309 2304 2323 2318 2311 2306 2310 2305 2324 2319 2312 2307 2311 2306 2325 2320 2313 2308 2312 2307 2326 2321 2314 2309 2313 2308 2023 2018 2010 2005 2314 2309 2328 2322 2316 2310 2315 2311 2329 2324 2317 2312 2316 2310 2330 2325 2318 2313 2317 2312 2331 2326 2319 2314 2318 2313 2332 2327 2320 2315 2319 2314 2333 2328 2321 2316 2320 2315 2334 2329 2322 2317 2321 2316 2335 2330 2323 2318 2322 2317 2336 2331 2324 2319 2323 2318 2337 2332 2325 2320 2324 2319 2338 2333 2326 2321 2325 2320 2036 2031 2023 2018 2326 2321 2340 2334 2328 2322 2327 2323 2341 2336 2329 2324 2328 2322 2342 2337 2330 2325 2329 2324 2343 2338 2331 2326 2330 2325 2344 2339 2332 2327 2331 2326 2345 2340 2333 2328 2332 2327 2346 2341 2334 2329 2333 2328 2347 2342 2335 2330 2334 2329 2348 2343 2336 2331 2335 2330 2349 2344 2337 2332 2336 2331 2350 2345 2338 2333 2337 2332 2049 2044 2036 2031 2338 2333 2352 2346 2340 2334 2339 2335 2353 2348 2341 2336 2340 2334 2354 2349 2342 2337 2341 2336 2355 2350 2343 2338 2342 2337 2356 2351 2344 2339 2343 2338 2357 2352 2345 2340 2344 2339 2358 2353 2346 2341 2345 2340 2359 2354 2347 2342 2346 2341 2360 2355 2348 2343 2347 2342 2361 2356 2349 2344 2348 2343 2362 2357 2350 2345 2349 2344 2062 2057 2049 2044 2350 2345 2364 2358 2352 2346 2351 2347 2365 2360 2353 2348 2352 2346 2366 2361 2354 2349 2353 2348 2367 2362 2355 2350 2354 2349 2368 2363 2356 2351 2355 2350 2369 2364 2357 2352 2356 2351 2370 2365 2358 2353 2357 2352 2371 2366 2359 2354 2358 2353 2372 2367 2360 2355 2359 2354 2373 2368 2361 2356 2360 2355 2374 2369 2362 2357 2361 2356 2075 2070 2062 2057 2362 2357 2090 2084 2364 2358 2363 2359 2093 2087 2365 2360 2364 2358 2095 2089 2366 2361 2365 2360 2097 2091 2367 2362 2366 2361 2099 2093 2368 2363 2367 2362 2101 2095 2369 2364 2368 2363 2103 2097 2370 2365 2369 2364 2105 2099 2371 2366 2370 2365 2107 2101 2372 2367 2371 2366 2109 2103 2373 2368 2372 2367 2111 2105 2374 2369 2373 2368 1779 1774 2075 2070 2374 2369 2375 2370 2376 2373 2377 2371 2376 2373 2379 2375 2380 2374 2379 2375 2381 2377 2382 2376 2381 2377 2383 2380 2384 2378 2385 2379 2386 2382 2384 2378 2387 2381 2388 2384 2386 2382 2389 2383 2390 2386 2388 2384 2391 2385 2392 2388 2390 2386 2393 2387 2394 2390 2392 2388 2395 2389 2396 2392 2394 2390 2397 2391 2398 2394 2396 2392 2399 2393 2400 4685 2398 2394 2401 2395 2402 2396 2376 2373 2402 2396 2403 2397 2379 2375 2403 2397 2404 2398 2381 2377 2404 2398 2405 2400 2383 2380 2406 2399 2385 2379 2383 2380 2407 2401 2387 2381 2385 2379 2408 2402 2389 2383 2387 2381 2409 2403 2391 2385 2389 2383 2410 2404 2393 2387 2391 2385 2411 2405 2395 2389 2393 2387 2412 2406 2397 2391 2395 2389 2413 2407 2399 2393 2397 2391 2414 2408 2415 2409 2402 2396 2415 2409 2416 2410 2403 2397 2416 2410 2417 2411 2404 2398 2417 2411 2418 2413 2405 2400 2419 2412 2406 2399 2405 2400 2420 2414 2407 2401 2406 2399 2421 2415 2408 2402 2407 2401 2422 2416 2409 2403 2408 2402 2423 2417 2410 2404 2409 2403 2424 2418 2411 2405 2410 2404 2425 2419 2412 2406 2411 2405 2426 2420 2413 2407 2412 2406 2427 2421 2428 2422 2415 2409 2428 2422 2429 2423 2416 2410 2429 2423 2430 2424 2417 2411 2430 2424 2431 2426 2418 2413 2432 2425 2419 2412 2418 2413 2433 2427 2420 2414 2419 2412 2434 2428 2421 2415 2420 2414 2435 2429 2422 2416 2421 2415 2436 2430 2423 2417 2422 2416 2437 2431 2424 2418 2423 2417 2438 2432 2425 2419 2424 2418 2439 2433 2426 2420 2425 2419 2440 2434 2441 2435 2428 2422 2441 2435 2442 2436 2429 2423 2442 2436 2443 2437 2430 2424 2443 2437 2444 2439 2431 2426 2445 2438 2432 2425 2431 2426 2446 2440 2433 2427 2432 2425 2447 2441 2434 2428 2433 2427 2448 2442 2435 2429 2434 2428 2449 2443 2436 2430 2435 2429 2450 2444 2437 2431 2436 2430 2451 2445 2438 2432 2437 2431 2452 2446 2439 2433 2438 2432 2453 2447 2454 2448 2441 2435 2454 2448 2455 2449 2442 2436 2455 2449 2456 2451 2443 2437 2457 2450 2444 2439 2443 2437 2458 2452 2445 2438 2444 2439 2459 2453 2446 2440 2445 2438 2460 2454 2447 2441 2446 2440 2461 2455 2448 2442 2447 2441 2462 2456 2449 2443 2448 2442 2463 2457 2450 2444 2449 2443 2464 2458 2451 2445 2450 2444 2465 2459 2452 2446 2451 2445 2466 2460 2467 2461 2454 2448 2467 2461 2468 2462 2455 2449 2468 2462 2469 2464 2456 2451 2470 2463 2457 2450 2456 2451 2471 2465 2458 2452 2457 2450 2472 2466 2459 2453 2458 2452 2473 2467 2460 2454 2459 2453 2474 2468 2461 2455 2460 2454 2475 2469 2462 2456 2461 2455 2476 2470 2463 2457 2462 2456 2477 2471 2464 2458 2463 2457 2478 2472 2465 2459 2464 2458 2479 2473 2480 2474 2467 2461 2480 2474 2481 2475 2468 2462 2481 2475 2482 2477 2469 2464 2483 2476 2470 2463 2469 2464 2484 2478 2471 2465 2470 2463 2485 2479 2472 2466 2471 2465 2486 2480 2473 2467 2472 2466 2487 2481 2474 2468 2473 2467 2488 2482 2475 2469 2474 2468 2489 2483 2476 2470 2475 2469 2490 2484 2477 2471 2476 2470 2491 2485 2478 2472 2477 2471 2492 2486 2493 2487 2480 2474 2493 2487 2494 2488 2481 2475 2494 2488 2495 2490 2482 2477 2496 2489 2483 2476 2482 2477 2497 2491 2484 2478 2483 2476 2498 2492 2485 2479 2484 2478 2499 2493 2486 2480 2485 2479 2500 2494 2487 2481 2486 2480 2501 2495 2488 2482 2487 2481 2502 2496 2489 2483 2488 2482 2503 2497 2490 2484 2489 2483 2504 2498 2491 2485 2490 2484 2505 2499 2506 2500 2493 2487 2506 2500 2507 2501 2494 2488 2507 2501 2508 2503 2495 2490 2509 2502 2496 2489 2495 2490 2510 2504 2497 2491 2496 2489 2511 2505 2498 2492 2497 2491 2512 2506 2499 2493 2498 2492 2513 2507 2500 2494 2499 2493 2514 2508 2501 2495 2500 2494 2515 2509 2502 2496 2501 2495 2516 2510 2503 2497 2502 2496 2517 2511 2504 2498 2503 2497 2518 2512 2519 2513 2506 2500 2519 2513 2520 2515 2507 2501 2521 2514 2508 2503 2507 2501 2522 2516 2509 2502 2508 2503 2523 2517 2510 2504 2509 2502 2524 2518 2511 2505 2510 2504 2525 2519 2512 2506 2511 2505 2526 2520 2513 2507 2512 2506 2527 2521 2514 2508 2513 2507 2528 2522 2515 2509 2514 2508 2529 2523 2516 2510 2515 2509 2530 2524 2517 2511 2516 2510 2531 2525 2532 2526 2519 2513 2532 2526 2533 2528 2520 2515 2534 2527 2521 2514 2520 2515 2535 2529 2522 2516 2521 2514 2536 2530 2523 2517 2522 2516 2537 2531 2524 2518 2523 2517 2538 2532 2525 2519 2524 2518 2539 2533 2526 2520 2525 2519 2540 2534 2527 2521 2526 2520 2541 2535 2528 2522 2527 2521 2542 2536 2529 2523 2528 2522 2543 2537 2530 2524 2529 2523 2545 2538 2532 2526 2531 2525 2546 2540 2533 2528 2532 2526 2546 2540 2547 2541 2534 2527 2547 2541 2548 2542 2535 2529 2548 2542 2549 2543 2536 2530 2549 2543 2550 2544 2537 2531 2550 2544 2551 2545 2538 2532 2551 2545 2552 2546 2539 2533 2552 2546 2553 2547 2540 2534 2553 2547 2554 2548 2541 2535 2554 2548 2555 2549 2542 2536 2555 2549 2556 2562 2543 2537 2558 2550 2545 2538 2544 2539 2559 2552 2546 2540 2545 2538 2559 2552 2560 2553 2547 2541 2560 2553 2561 2554 2548 2542 2561 2554 2562 2555 2549 2543 2562 2555 2563 2556 2550 2544 2563 2556 2564 2557 2551 2545 2564 2557 2565 2558 2552 2546 2565 2558 2566 2559 2553 2547 2566 2559 2567 2560 2554 2548 2567 2560 2568 2561 2555 2549 2568 2561 2569 2575 2556 2562 2571 2563 2558 2550 2557 2551 2572 2565 2559 2552 2558 2550 2573 2566 2560 2553 2559 2552 2573 2566 2574 2567 2561 2554 2574 2567 2575 2568 2562 2555 2575 2568 2576 2569 2563 2556 2576 2569 2577 2570 2564 2557 2577 2570 2578 2571 2565 2558 2578 2571 2579 2572 2566 2559 2579 2572 2580 2573 2567 2560 2580 2573 2581 2574 2568 2561 2581 2574 2582 2588 2569 2575 2584 2576 2571 2563 2570 2564 2585 2578 2572 2565 2571 2563 2586 2579 2573 2566 2572 2565 2586 2579 2587 2580 2574 2567 2587 2580 2588 2581 2575 2568 2588 2581 2589 2582 2576 2569 2589 2582 2590 2583 2577 2570 2590 2583 2591 2584 2578 2571 2591 2584 2592 2585 2579 2572 2592 2585 2593 2586 2580 2573 2593 2586 2594 2587 2581 2574 2594 2587 2595 2601 2582 2588 2597 2589 2584 2576 2583 2577 2598 2591 2585 2578 2584 2576 2599 2592 2586 2579 2585 2578 2599 2592 2600 2593 2587 2580 2600 2593 2601 2594 2588 2581 2601 2594 2602 2595 2589 2582 2602 2595 2603 2596 2590 2583 2603 2596 2604 2597 2591 2584 2604 2597 2605 2598 2592 2585 2605 2598 2606 2599 2593 2586 2606 2599 2607 2600 2594 2587 2607 2600 2608 2614 2595 2601 2610 2602 2597 2589 2596 2590 2611 2604 2598 2591 2597 2589 2612 2605 2599 2592 2598 2591 2612 2605 2613 2606 2600 2593 2613 2606 2614 2607 2601 2594 2614 2607 2615 2608 2602 2595 2615 2608 2616 2609 2603 2596 2616 2609 2617 2610 2604 2597 2617 2610 2618 2611 2605 2598 2618 2611 2619 2612 2606 2599 2619 2612 2620 2613 2607 2600 2620 2613 2621 2627 2608 2614 2623 2615 2610 2602 2609 2603 2624 2617 2611 2604 2610 2602 2625 2618 2612 2605 2611 2604 2625 2618 2626 2619 2613 2606 2626 2619 2627 2620 2614 2607 2627 2620 2628 2621 2615 2608 2628 2621 2629 2622 2616 2609 2629 2622 2630 2623 2617 2610 2630 2623 2631 2624 2618 2611 2631 2624 2632 2625 2619 2612 2632 2625 2633 2626 2620 2613 2633 2626 2634 2640 2621 2627 2636 2628 2623 2615 2622 2616 2637 2630 2624 2617 2623 2615 2638 2631 2625 2618 2624 2617 2639 2632 2626 2619 2625 2618 2639 2632 2640 2633 2627 2620 2640 2633 2641 2634 2628 2621 2641 2634 2642 2635 2629 2622 2642 2635 2643 2636 2630 2623 2643 2636 2644 2637 2631 2624 2644 2637 2645 2638 2632 2625 2645 2638 2646 2639 2633 2626 2646 2639 2647 2653 2634 2640 2649 2641 2636 2628 2635 2629 2650 2643 2637 2630 2636 2628 2651 2644 2638 2631 2637 2630 2652 2645 2639 2632 2638 2631 2652 2645 2653 2646 2640 2633 2653 2646 2654 2647 2641 2634 2654 2647 2655 2648 2642 2635 2655 2648 2656 2649 2643 2636 2656 2649 2657 2650 2644 2637 2657 2650 2658 2651 2645 2638 2658 2651 2659 2652 2646 2639 2659 2652 2660 2666 2647 2653 2662 2654 2649 2641 2648 2642 2663 2656 2650 2643 2649 2641 2664 2657 2651 2644 2650 2643 2665 2658 2652 2645 2651 2644 2665 2658 2666 2659 2653 2646 2666 2659 2667 2660 2654 2647 2667 2660 2668 2661 2655 2648 2668 2661 2669 2662 2656 2649 2669 2662 2670 2663 2657 2650 2670 2663 2671 2664 2658 2651 2671 2664 2672 2665 2659 2652 2672 2665 2673 2679 2660 2666 2675 2667 2662 2654 2661 2655 2676 2669 2663 2656 2662 2654 2677 2670 2664 2657 2663 2656 2678 2671 2665 2658 2664 2657 2678 2671 2679 2672 2666 2659 2679 2672 2680 2673 2667 2660 2680 2673 2681 2674 2668 2661 2681 2674 2682 2675 2669 2662 2682 2675 2683 2676 2670 2663 2683 2676 2684 2677 2671 2664 2684 2677 2685 2678 2672 2665 2685 2678 2686 2680 2673 2679 2377 2371 2675 2667 2674 2668 2380 2374 2676 2669 2675 2667 2382 2376 2677 2670 2676 2669 2384 2378 2678 2671 2677 2670 2384 2378 2386 2382 2679 2672 2386 2382 2388 2384 2680 2673 2388 2384 2390 2386 2681 2674 2390 2386 2392 2388 2682 2675 2392 2388 2394 2390 2683 2676 2394 2390 2396 2392 2684 2677 2396 2392 2398 2394 2685 2678 2398 2394 2400 4685 2686 2680 2688 2681 2689 2685 2690 2682 2691 2684 2692 2687 2689 2685 2693 2686 2694 2689 2692 2687 2695 2688 2696 2691 2694 2689 2697 2690 2698 2693 2696 2691 2699 2692 2700 2695 2698 2693 2701 2694 2702 2697 2700 2695 2701 2694 2703 2698 2704 2696 2703 2698 2705 2700 2706 2699 2705 2700 2707 2702 2708 2701 2707 2702 2709 2704 2710 2703 2709 2704 2375 2370 2378 2372 2712 2705 2688 2681 2687 2683 2713 2707 2691 2684 2688 2681 2714 2708 2693 2686 2691 2684 2715 2709 2695 2688 2693 2686 2716 2710 2697 2690 2695 2688 2717 2711 2699 2692 2697 2690 2718 2712 2701 2694 2699 2692 2718 2712 2719 2713 2703 2698 2719 2713 2720 2714 2705 2700 2720 2714 2721 2715 2707 2702 2721 2715 2722 2716 2709 2704 2722 2716 2401 2395 2375 2370 2724 2717 2712 2705 2711 2706 2725 2719 2713 2707 2712 2705 2726 2720 2714 2708 2713 2707 2727 2721 2715 2709 2714 2708 2728 2722 2716 2710 2715 2709 2729 2723 2717 2711 2716 2710 2729 2723 2730 2724 2718 2712 2730 2724 2731 2725 2719 2713 2731 2725 2732 2726 2720 2714 2732 2726 2733 2727 2721 2715 2733 2727 2734 2728 2722 2716 2734 2728 2414 2408 2401 2395 2736 2729 2724 2717 2723 2718 2737 2731 2725 2719 2724 2717 2738 2732 2726 2720 2725 2719 2739 2733 2727 2721 2726 2720 2740 2734 2728 2722 2727 2721 2741 2735 2729 2723 2728 2722 2741 2735 2742 2736 2730 2724 2742 2736 2743 2737 2731 2725 2743 2737 2744 2738 2732 2726 2744 2738 2745 2739 2733 2727 2745 2739 2746 2740 2734 2728 2746 2740 2427 2421 2414 2408 2748 2741 2736 2729 2735 2730 2749 2743 2737 2731 2736 2729 2750 2744 2738 2732 2737 2731 2751 2745 2739 2733 2738 2732 2752 2746 2740 2734 2739 2733 2753 2747 2741 2735 2740 2734 2753 2747 2754 2748 2742 2736 2754 2748 2755 2749 2743 2737 2755 2749 2756 2750 2744 2738 2756 2750 2757 2751 2745 2739 2757 2751 2758 2752 2746 2740 2758 2752 2440 2434 2427 2421 2760 2753 2748 2741 2747 2742 2761 2755 2749 2743 2748 2741 2762 2756 2750 2744 2749 2743 2763 2757 2751 2745 2750 2744 2764 2758 2752 2746 2751 2745 2765 2759 2753 2747 2752 2746 2765 2759 2766 2760 2754 2748 2766 2760 2767 2761 2755 2749 2767 2761 2768 2762 2756 2750 2768 2762 2769 2763 2757 2751 2769 2763 2770 2764 2758 2752 2770 2764 2453 2447 2440 2434 2772 2765 2760 2753 2759 2754 2773 2767 2761 2755 2760 2753 2774 2768 2762 2756 2761 2755 2775 2769 2763 2757 2762 2756 2776 2770 2764 2758 2763 2757 2777 2771 2765 2759 2764 2758 2777 2771 2778 2772 2766 2760 2778 2772 2779 2773 2767 2761 2779 2773 2780 2774 2768 2762 2780 2774 2781 2775 2769 2763 2781 2775 2782 2776 2770 2764 2782 2776 2466 2460 2453 2447 2784 2777 2772 2765 2771 2766 2785 2779 2773 2767 2772 2765 2786 2780 2774 2768 2773 2767 2787 2781 2775 2769 2774 2768 2788 2782 2776 2770 2775 2769 2788 2782 2789 2783 2777 2771 2789 2783 2790 2784 2778 2772 2790 2784 2791 2785 2779 2773 2791 2785 2792 2786 2780 2774 2792 2786 2793 2787 2781 2775 2793 2787 2794 2788 2782 2776 2794 2788 2479 2473 2466 2460 2796 2789 2784 2777 2783 2778 2797 2791 2785 2779 2784 2777 2798 2792 2786 2780 2785 2779 2799 2793 2787 2781 2786 2780 2800 2794 2788 2782 2787 2781 2800 2794 2801 2795 2789 2783 2801 2795 2802 2796 2790 2784 2802 2796 2803 2797 2791 2785 2803 2797 2804 2798 2792 2786 2804 2798 2805 2799 2793 2787 2805 2799 2806 2800 2794 2788 2806 2800 2492 2486 2479 2473 2808 2801 2796 2789 2795 2790 2809 2803 2797 2791 2796 2789 2810 2804 2798 2792 2797 2791 2811 2805 2799 2793 2798 2792 2812 2806 2800 2794 2799 2793 2812 2806 2813 2807 2801 2795 2813 2807 2814 2808 2802 2796 2814 2808 2815 2809 2803 2797 2815 2809 2816 2810 2804 2798 2816 2810 2817 2811 2805 2799 2817 2811 2818 2812 2806 2800 2818 2812 2505 2499 2492 2486 2820 2813 2808 2801 2807 2802 2821 2815 2809 2803 2808 2801 2822 2816 2810 2804 2809 2803 2823 2817 2811 2805 2810 2804 2824 2818 2812 2806 2811 2805 2824 2818 2825 2819 2813 2807 2825 2819 2826 2820 2814 2808 2826 2820 2827 2821 2815 2809 2827 2821 2828 2822 2816 2810 2828 2822 2829 2823 2817 2811 2829 2823 2830 2824 2818 2812 2830 2824 2518 2512 2505 2499 2832 2825 2820 2813 2819 2814 2833 2827 2821 2815 2820 2813 2834 2828 2822 2816 2821 2815 2835 2829 2823 2817 2822 2816 2836 2830 2824 2818 2823 2817 2836 2830 2837 2831 2825 2819 2837 2831 2838 2832 2826 2820 2838 2832 2839 2833 2827 2821 2839 2833 2840 2834 2828 2822 2840 2834 2841 2835 2829 2823 2841 2835 2842 2836 2830 2824 2842 2836 2531 2525 2518 2512 2843 2837 2844 2838 2832 2825 2844 2838 2845 2839 2833 2827 2845 2839 2846 2840 2834 2828 2846 2840 2847 2841 2835 2829 2847 2841 2848 2843 2836 2830 2849 2842 2837 2831 2836 2830 2850 2844 2838 2832 2837 2831 2851 2845 2839 2833 2838 2832 2852 2846 2840 2834 2839 2833 2853 2847 2841 2835 2840 2834 2854 2848 2842 2836 2841 2835 2544 2539 2531 2525 2842 2836 2855 2849 2856 2850 2844 2838 2856 2850 2857 2851 2845 2839 2857 2851 2858 2852 2846 2840 2858 2852 2859 2853 2847 2841 2859 2853 2860 2855 2848 2843 2861 2854 2849 2842 2848 2843 2862 2856 2850 2844 2849 2842 2863 2857 2851 2845 2850 2844 2864 2858 2852 2846 2851 2845 2865 2859 2853 2847 2852 2846 2866 2860 2854 2848 2853 2847 2557 2551 2544 2539 2854 2848 2867 2861 2868 2862 2856 2850 2868 2862 2869 2863 2857 2851 2869 2863 2870 2864 2858 2852 2870 2864 2871 2865 2859 2853 2871 2865 2872 2867 2860 2855 2873 2866 2861 2854 2860 2855 2874 2868 2862 2856 2861 2854 2875 2869 2863 2857 2862 2856 2876 2870 2864 2858 2863 2857 2877 2871 2865 2859 2864 2858 2878 2872 2866 2860 2865 2859 2570 2564 2557 2551 2866 2860 2879 2873 2880 2874 2868 2862 2880 2874 2881 2875 2869 2863 2881 2875 2882 2876 2870 2864 2882 2876 2883 2877 2871 2865 2883 2877 2884 2879 2872 2867 2885 2878 2873 2866 2872 2867 2886 2880 2874 2868 2873 2866 2887 2881 2875 2869 2874 2868 2888 2882 2876 2870 2875 2869 2889 2883 2877 2871 2876 2870 2890 2884 2878 2872 2877 2871 2583 2577 2570 2564 2878 2872 2891 2885 2892 2886 2880 2874 2892 2886 2893 2887 2881 2875 2893 2887 2894 2888 2882 2876 2894 2888 2895 2889 2883 2877 2895 2889 2896 2891 2884 2879 2897 2890 2885 2878 2884 2879 2898 2892 2886 2880 2885 2878 2899 2893 2887 2881 2886 2880 2900 2894 2888 2882 2887 2881 2901 2895 2889 2883 2888 2882 2902 2896 2890 2884 2889 2883 2596 2590 2583 2577 2890 2884 2903 2897 2904 2898 2892 2886 2904 2898 2905 2899 2893 2887 2905 2899 2906 2900 2894 2888 2906 2900 2907 2901 2895 2889 2907 2901 2908 2902 2896 2891 2908 2902 2909 2904 2897 2890 2910 2903 2898 2892 2897 2890 2911 2905 2899 2893 2898 2892 2912 2906 2900 2894 2899 2893 2913 2907 2901 2895 2900 2894 2914 2908 2902 2896 2901 2895 2609 2603 2596 2590 2902 2896 2915 2909 2916 2910 2904 2898 2916 2910 2917 2911 2905 2899 2917 2911 2918 2912 2906 2900 2918 2912 2919 2913 2907 2901 2919 2913 2920 2914 2908 2902 2920 2914 2921 2916 2909 2904 2922 2915 2910 2903 2909 2904 2923 2917 2911 2905 2910 2903 2924 2918 2912 2906 2911 2905 2925 2919 2913 2907 2912 2906 2926 2920 2914 2908 2913 2907 2622 2616 2609 2603 2914 2908 2927 2921 2928 2922 2916 2910 2928 2922 2929 2923 2917 2911 2929 2923 2930 2924 2918 2912 2930 2924 2931 2925 2919 2913 2931 2925 2932 2926 2920 2914 2932 2926 2933 2928 2921 2916 2934 2927 2922 2915 2921 2916 2935 2929 2923 2917 2922 2915 2936 2930 2924 2918 2923 2917 2937 2931 2925 2919 2924 2918 2938 2932 2926 2920 2925 2919 2635 2629 2622 2616 2926 2920 2939 2933 2940 2934 2928 2922 2940 2934 2941 2935 2929 2923 2941 2935 2942 2936 2930 2924 2942 2936 2943 2937 2931 2925 2943 2937 2944 2938 2932 2926 2944 2938 2945 2940 2933 2928 2946 2939 2934 2927 2933 2928 2947 2941 2935 2929 2934 2927 2948 2942 2936 2930 2935 2929 2949 2943 2937 2931 2936 2930 2950 2944 2938 2932 2937 2931 2648 2642 2635 2629 2938 2932 2951 2945 2952 2946 2940 2934 2952 2946 2953 2947 2941 2935 2953 2947 2954 2948 2942 2936 2954 2948 2955 2949 2943 2937 2955 2949 2956 2950 2944 2938 2956 2950 2957 2952 2945 2940 2958 2951 2946 2939 2945 2940 2959 2953 2947 2941 2946 2939 2960 2954 2948 2942 2947 2941 2961 2955 2949 2943 2948 2942 2962 2956 2950 2944 2949 2943 2661 2655 2648 2642 2950 2944 2963 2957 2964 2958 2952 2946 2964 2958 2965 2959 2953 2947 2965 2959 2966 2960 2954 2948 2966 2960 2967 2961 2955 2949 2967 2961 2968 2962 2956 2950 2968 2962 2969 2963 2957 2952 2969 2963 2970 2965 2958 2951 2971 2964 2959 2953 2958 2951 2972 2966 2960 2954 2959 2953 2973 2967 2961 2955 2960 2954 2974 2968 2962 2956 2961 2955 2674 2668 2661 2655 2962 2956 2690 2682 2689 2685 2964 2958 2689 2685 2692 2687 2965 2959 2692 2687 2694 2689 2966 2960 2694 2689 2696 2691 2967 2961 2696 2691 2698 2693 2968 2962 2698 2693 2700 2695 2969 2963 2700 2695 2702 2697 2970 2965 2704 2696 2971 2964 2970 2965 2706 2699 2972 2966 2971 2964 2708 2701 2973 2967 2972 2966 2710 2703 2974 2968 2973 2967 2378 2372 2674 2668 2974 2968 2976 2969 2977 2973 2978 2970 2976 2969 2979 2974 2980 2972 2979 2974 2981 2976 2982 2975 2981 2976 2983 2978 2984 2977 2983 2978 2985 2980 2986 2979 2985 2980 2987 2982 2988 2981 2987 2982 2989 2984 2990 2983 2989 2984 2991 2987 2992 2985 2993 2986 2994 2989 2992 2985 2995 2988 2996 2991 2994 2989 2997 2990 2998 2993 2996 2991 3001 2994 2976 2969 2975 2971 3001 2994 3002 2996 2979 2974 3002 2996 3003 2997 2981 2976 3003 2997 3004 2998 2983 2978 3004 2998 3005 2999 2985 2980 3005 2999 3006 3000 2987 2982 3006 3000 3007 3001 2989 2984 3007 3001 3008 3003 2991 2987 3009 3002 2993 2986 2991 2987 3010 3004 2995 2988 2993 2986 3011 3005 2997 2990 2995 2988 3013 3006 3001 2994 3000 2995 3013 3006 3014 3008 3002 2996 3014 3008 3015 3009 3003 2997 3015 3009 3016 3010 3004 2998 3016 3010 3017 3011 3005 2999 3017 3011 3018 3012 3006 3000 3018 3012 3019 3013 3007 3001 3019 3013 3020 3015 3008 3003 3021 3014 3009 3002 3008 3003 3022 3016 3010 3004 3009 3002 3023 3017 3011 3005 3010 3004 3025 3018 3013 3006 3012 3007 3025 3018 3026 3020 3014 3008 3026 3020 3027 3021 3015 3009 3027 3021 3028 3022 3016 3010 3028 3022 3029 3023 3017 3011 3029 3023 3030 3024 3018 3012 3030 3024 3031 3025 3019 3013 3031 3025 3032 3027 3020 3015 3033 3026 3021 3014 3020 3015 3034 3028 3022 3016 3021 3014 3035 3029 3023 3017 3022 3016 3037 3030 3025 3018 3024 3019 3037 3030 3038 3032 3026 3020 3038 3032 3039 3033 3027 3021 3039 3033 3040 3034 3028 3022 3040 3034 3041 3035 3029 3023 3041 3035 3042 3036 3030 3024 3042 3036 3043 3037 3031 3025 3043 3037 3044 3039 3032 3027 3045 3038 3033 3026 3032 3027 3046 3040 3034 3028 3033 3026 3047 3041 3035 3029 3034 3028 3049 3042 3037 3030 3036 3031 3049 3042 3050 3044 3038 3032 3050 3044 3051 3045 3039 3033 3051 3045 3052 3046 3040 3034 3052 3046 3053 3047 3041 3035 3053 3047 3054 3048 3042 3036 3054 3048 3055 3049 3043 3037 3055 3049 3056 3051 3044 3039 3057 3050 3045 3038 3044 3039 3058 3052 3046 3040 3045 3038 3059 3053 3047 3041 3046 3040 3060 3054 3061 3056 3049 3042 3062 3055 3050 3044 3049 3042 3063 3057 3051 3045 3050 3044 3064 3058 3052 3046 3051 3045 3065 3059 3053 3047 3052 3046 3066 3060 3054 3048 3053 3047 3067 3061 3055 3049 3054 3048 3068 3062 3056 3051 3055 3049 3068 3062 3069 3063 3057 3050 3069 3063 3070 3064 3058 3052 3070 3064 3071 3065 3059 3053 3072 3066 3073 3068 3061 3056 3074 3067 3062 3055 3061 3056 3075 3069 3063 3057 3062 3055 3076 3070 3064 3058 3063 3057 3077 3071 3065 3059 3064 3058 3078 3072 3066 3060 3065 3059 3079 3073 3067 3061 3066 3060 3080 3074 3068 3062 3067 3061 3080 3074 3081 3075 3069 3063 3081 3075 3082 3076 3070 3064 3082 3076 3083 3077 3071 3065 3084 3078 3085 3080 3073 3068 3086 3079 3074 3067 3073 3068 3087 3081 3075 3069 3074 3067 3088 3082 3076 3070 3075 3069 3089 3083 3077 3071 3076 3070 3090 3084 3078 3072 3077 3071 3091 3085 3079 3073 3078 3072 3092 3086 3080 3074 3079 3073 3092 3086 3093 3087 3081 3075 3093 3087 3094 3088 3082 3076 3094 3088 3095 3089 3083 3077 3096 3090 3097 3092 3085 3080 3098 3091 3086 3079 3085 3080 3099 3093 3087 3081 3086 3079 3100 3094 3088 3082 3087 3081 3101 3095 3089 3083 3088 3082 3102 3096 3090 3084 3089 3083 3103 3097 3091 3085 3090 3084 3104 3098 3092 3086 3091 3085 3104 3098 3105 3099 3093 3087 3105 3099 3106 3100 3094 3088 3106 3100 3107 3101 3095 3089 3108 3102 3109 3104 3097 3092 3110 3103 3098 3091 3097 3092 3111 3105 3099 3093 3098 3091 3112 3106 3100 3094 3099 3093 3113 3107 3101 3095 3100 3094 3114 3108 3102 3096 3101 3095 3115 3109 3103 3097 3102 3096 3116 3110 3104 3098 3103 3097 3116 3110 3117 3111 3105 3099 3117 3111 3118 3112 3106 3100 3118 3112 3119 3113 3107 3101 3119 3113 3120 3126 2999 2992 3121 3114 3122 3116 3109 3104 3123 3115 3110 3103 3109 3104 3124 3117 3111 3105 3110 3103 3125 3118 3112 3106 3111 3105 3126 3119 3113 3107 3112 3106 3127 3120 3114 3108 3113 3107 3128 3121 3115 3109 3114 3108 3129 3122 3116 3110 3115 3109 3129 3122 3130 3123 3117 3111 3130 3123 3131 3124 3118 3112 3131 3124 3132 3125 3119 3113 3132 3125 2999 2992 3120 3126 3134 3127 3135 3131 3136 3128 3134 3127 3137 3132 3138 3130 3137 3132 3139 3134 3140 3133 3139 3134 3141 3136 3142 3135 3141 3136 3143 3138 3144 3137 3143 3138 3145 3140 3146 3139 3145 3140 3147 3142 3148 3141 3147 3142 3149 3145 3150 3143 3151 3144 3152 3147 3150 3143 3153 3146 3154 3149 3152 3147 3155 3148 3156 3150 3154 3149 3158 3151 3134 3127 3133 3129 3158 3151 3159 3153 3137 3132 3159 3153 3160 3154 3139 3134 3160 3154 3161 3155 3141 3136 3161 3155 3162 3156 3143 3138 3162 3156 3163 3157 3145 3140 3163 3157 3164 3158 3147 3142 3164 3158 3165 3160 3149 3145 3166 3159 3151 3144 3149 3145 3167 3161 3153 3146 3151 3144 3168 3162 3155 3148 3153 3146 3170 3163 3158 3151 3157 3152 3170 3163 3171 3165 3159 3153 3171 3165 3172 3166 3160 3154 3172 3166 3173 3167 3161 3155 3173 3167 3174 3168 3162 3156 3174 3168 3175 3169 3163 3157 3175 3169 3176 3170 3164 3158 3176 3170 3177 3172 3165 3160 3178 3171 3166 3159 3165 3160 3179 3173 3167 3161 3166 3159 3180 3174 3168 3162 3167 3161 3182 3175 3170 3163 3169 3164 3182 3175 3183 3177 3171 3165 3183 3177 3184 3178 3172 3166 3184 3178 3185 3179 3173 3167 3185 3179 3186 3180 3174 3168 3186 3180 3187 3181 3175 3169 3187 3181 3188 3182 3176 3170 3188 3182 3189 3184 3177 3172 3190 3183 3178 3171 3177 3172 3191 3185 3179 3173 3178 3171 3192 3186 3180 3174 3179 3173 3194 3187 3182 3175 3181 3176 3194 3187 3195 3189 3183 3177 3195 3189 3196 3190 3184 3178 3196 3190 3197 3191 3185 3179 3197 3191 3198 3192 3186 3180 3198 3192 3199 3193 3187 3181 3199 3193 3200 3194 3188 3182 3200 3194 3201 3196 3189 3184 3202 3195 3190 3183 3189 3184 3203 3197 3191 3185 3190 3183 3204 3198 3192 3186 3191 3185 3206 3199 3194 3187 3193 3188 3206 3199 3207 3201 3195 3189 3207 3201 3208 3202 3196 3190 3208 3202 3209 3203 3197 3191 3209 3203 3210 3204 3198 3192 3210 3204 3211 3205 3199 3193 3211 3205 3212 3206 3200 3194 3212 3206 3213 3208 3201 3196 3214 3207 3202 3195 3201 3196 3215 3209 3203 3197 3202 3195 3216 3210 3204 3198 3203 3197 3217 3211 3218 3213 3206 3199 3219 3212 3207 3201 3206 3199 3220 3214 3208 3202 3207 3201 3221 3215 3209 3203 3208 3202 3222 3216 3210 3204 3209 3203 3223 3217 3211 3205 3210 3204 3224 3218 3212 3206 3211 3205 3225 3219 3213 3208 3212 3206 3225 3219 3226 3220 3214 3207 3226 3220 3227 3221 3215 3209 3227 3221 3228 3222 3216 3210 3229 3223 3230 3225 3218 3213 3231 3224 3219 3212 3218 3213 3232 3226 3220 3214 3219 3212 3233 3227 3221 3215 3220 3214 3234 3228 3222 3216 3221 3215 3235 3229 3223 3217 3222 3216 3236 3230 3224 3218 3223 3217 3237 3231 3225 3219 3224 3218 3237 3231 3238 3232 3226 3220 3238 3232 3239 3233 3227 3221 3239 3233 3240 3234 3228 3222 3241 3235 3242 3237 3230 3225 3243 3236 3231 3224 3230 3225 3244 3238 3232 3226 3231 3224 3245 3239 3233 3227 3232 3226 3246 3240 3234 3228 3233 3227 3247 3241 3235 3229 3234 3228 3248 3242 3236 3230 3235 3229 3249 3243 3237 3231 3236 3230 3249 3243 3250 3244 3238 3232 3250 3244 3251 3245 3239 3233 3251 3245 3252 3246 3240 3234 3253 3247 3254 3249 3242 3237 3255 3248 3243 3236 3242 3237 3256 3250 3244 3238 3243 3236 3257 3251 3245 3239 3244 3238 3258 3252 3246 3240 3245 3239 3259 3253 3247 3241 3246 3240 3260 3254 3248 3242 3247 3241 3261 3255 3249 3243 3248 3242 3261 3255 3262 3256 3250 3244 3262 3256 3263 3257 3251 3245 3263 3257 3264 3258 3252 3246 3265 3259 3266 3261 3254 3249 3267 3260 3255 3248 3254 3249 3268 3262 3256 3250 3255 3248 3269 3263 3257 3251 3256 3250 3270 3264 3258 3252 3257 3251 3271 3265 3259 3253 3258 3252 3272 3266 3260 3254 3259 3253 3273 3267 3261 3255 3260 3254 3273 3267 3274 3268 3262 3256 3274 3268 3275 3269 3263 3257 3275 3269 3276 3270 3264 3258 3276 3270 3120 3126 2999 2992 2978 2970 2977 2973 3266 3261 2980 2972 3267 3260 3266 3261 2982 2975 3268 3262 3267 3260 2984 2977 3269 3263 3268 3262 2986 2979 3270 3264 3269 3263 2988 2981 3271 3265 3270 3264 2990 2983 3272 3266 3271 3265 2992 2985 3273 3267 3272 3266 2992 2985 2994 2989 3274 3268 2994 2989 2996 2991 3275 3269 2996 2991 2998 2993 3276 3270 2998 2993 2999 2992 3120 3126 3278 3271 3279 3275 3280 3272 3278 3271 3281 3276 3282 3274 3281 3276 3283 3278 3284 3277 3283 3278 3285 3280 3286 3279 3285 3280 3287 3282 3288 3281 3287 3282 3289 3284 3290 3283 3289 3284 3291 3286 3292 3285 3291 3286 3293 3289 3294 3287 3295 3288 3296 3291 3294 3287 3297 3290 3298 3293 3296 3291 3299 3292 3300 3294 3298 3293 3302 3295 3278 3271 3277 3273 3302 3295 3303 3297 3281 3276 3303 3297 3304 3298 3283 3278 3304 3298 3305 3299 3285 3280 3305 3299 3306 3300 3287 3282 3306 3300 3307 3301 3289 3284 3307 3301 3308 3302 3291 3286 3308 3302 3309 3304 3293 3289 3310 3303 3295 3288 3293 3289 3311 3305 3297 3290 3295 3288 3312 3306 3299 3292 3297 3290 3314 3307 3302 3295 3301 3296 3314 3307 3315 3309 3303 3297 3315 3309 3316 3310 3304 3298 3316 3310 3317 3311 3305 3299 3317 3311 3318 3312 3306 3300 3318 3312 3319 3313 3307 3301 3319 3313 3320 3314 3308 3302 3320 3314 3321 3316 3309 3304 3322 3315 3310 3303 3309 3304 3323 3317 3311 3305 3310 3303 3324 3318 3312 3306 3311 3305 3326 3319 3314 3307 3313 3308 3326 3319 3327 3321 3315 3309 3327 3321 3328 3322 3316 3310 3328 3322 3329 3323 3317 3311 3329 3323 3330 3324 3318 3312 3330 3324 3331 3325 3319 3313 3331 3325 3332 3326 3320 3314 3332 3326 3333 3328 3321 3316 3334 3327 3322 3315 3321 3316 3335 3329 3323 3317 3322 3315 3336 3330 3324 3318 3323 3317 3338 3331 3326 3319 3325 3320 3338 3331 3339 3333 3327 3321 3339 3333 3340 3334 3328 3322 3340 3334 3341 3335 3329 3323 3341 3335 3342 3336 3330 3324 3342 3336 3343 3337 3331 3325 3343 3337 3344 3338 3332 3326 3344 3338 3345 3340 3333 3328 3346 3339 3334 3327 3333 3328 3347 3341 3335 3329 3334 3327 3348 3342 3336 3330 3335 3329 3350 3343 3338 3331 3337 3332 3350 3343 3351 3345 3339 3333 3351 3345 3352 3346 3340 3334 3352 3346 3353 3347 3341 3335 3353 3347 3354 3348 3342 3336 3354 3348 3355 3349 3343 3337 3355 3349 3356 3350 3344 3338 3356 3350 3357 3352 3345 3340 3358 3351 3346 3339 3345 3340 3359 3353 3347 3341 3346 3339 3360 3354 3348 3342 3347 3341 3361 3355 3362 3357 3350 3343 3363 3356 3351 3345 3350 3343 3364 3358 3352 3346 3351 3345 3365 3359 3353 3347 3352 3346 3366 3360 3354 3348 3353 3347 3367 3361 3355 3349 3354 3348 3368 3362 3356 3350 3355 3349 3369 3363 3357 3352 3356 3350 3369 3363 3370 3364 3358 3351 3370 3364 3371 3365 3359 3353 3371 3365 3372 3366 3360 3354 3373 3367 3374 3369 3362 3357 3375 3368 3363 3356 3362 3357 3376 3370 3364 3358 3363 3356 3377 3371 3365 3359 3364 3358 3378 3372 3366 3360 3365 3359 3379 3373 3367 3361 3366 3360 3380 3374 3368 3362 3367 3361 3381 3375 3369 3363 3368 3362 3381 3375 3382 3376 3370 3364 3382 3376 3383 3377 3371 3365 3383 3377 3384 3378 3372 3366 3385 3379 3386 3381 3374 3369 3387 3380 3375 3368 3374 3369 3388 3382 3376 3370 3375 3368 3389 3383 3377 3371 3376 3370 3390 3384 3378 3372 3377 3371 3391 3385 3379 3373 3378 3372 3392 3386 3380 3374 3379 3373 3393 3387 3381 3375 3380 3374 3393 3387 3394 3388 3382 3376 3394 3388 3395 3389 3383 3377 3395 3389 3396 3390 3384 3378 3397 3391 3398 3393 3386 3381 3399 3392 3387 3380 3386 3381 3400 3394 3388 3382 3387 3380 3401 3395 3389 3383 3388 3382 3402 3396 3390 3384 3389 3383 3403 3397 3391 3385 3390 3384 3404 3398 3392 3386 3391 3385 3405 3399 3393 3387 3392 3386 3405 3399 3406 3400 3394 3388 3406 3400 3407 3401 3395 3389 3407 3401 3408 3402 3396 3390 3409 3403 3410 3405 3398 3393 3411 3404 3399 3392 3398 3393 3412 3406 3400 3394 3399 3392 3413 3407 3401 3395 3400 3394 3414 3408 3402 3396 3401 3395 3415 3409 3403 3397 3402 3396 3416 3410 3404 3398 3403 3397 3417 3411 3405 3399 3404 3398 3417 3411 3418 3412 3406 3400 3418 3412 3419 3413 3407 3401 3419 3413 3420 3414 3408 3402 3420 3414 3120 3126 2999 2992 3136 3128 3135 3131 3410 3405 3138 3130 3411 3404 3410 3405 3140 3133 3412 3406 3411 3404 3142 3135 3413 3407 3412 3406 3144 3137 3414 3408 3413 3407 3146 3139 3415 3409 3414 3408 3148 3141 3416 3410 3415 3409 3150 3143 3417 3411 3416 3410 3150 3143 3152 3147 3418 3412 3152 3147 3154 3149 3419 3413 3154 3149 3156 3150 3420 3414 3156 3150 2999 2992 3120 3126 3422 3415 3122 3116 3121 3114 3422 3415 3423 3417 3123 3115 3423 3417 3424 3418 3124 3117 3424 3418 3425 3419 3125 3118 3425 3419 3426 3420 3126 3119 3426 3420 3427 3421 3127 3120 3427 3421 3428 3422 3128 3121 3428 3422 3429 3424 3129 3122 3430 3423 3130 3123 3129 3122 3431 3425 3131 3124 3130 3123 3432 3426 3132 3125 3131 3124 3434 3427 3422 3415 3421 3416 3434 3427 3435 3429 3423 3417 3435 3429 3436 3430 3424 3418 3436 3430 3437 3431 3425 3419 3437 3431 3438 3432 3426 3420 3438 3432 3439 3433 3427 3421 3439 3433 3440 3434 3428 3422 3440 3434 3441 3436 3429 3424 3442 3435 3430 3423 3429 3424 3443 3437 3431 3425 3430 3423 3444 3438 3432 3426 3431 3425 3446 3439 3434 3427 3433 3428 3446 3439 3447 3441 3435 3429 3447 3441 3448 3442 3436 3430 3448 3442 3449 3443 3437 3431 3449 3443 3450 3444 3438 3432 3450 3444 3451 3445 3439 3433 3451 3445 3452 3446 3440 3434 3452 3446 3453 3448 3441 3436 3454 3447 3442 3435 3441 3436 3455 3449 3443 3437 3442 3435 3456 3450 3444 3438 3443 3437 3458 3451 3446 3439 3445 3440 3458 3451 3459 3453 3447 3441 3459 3453 3460 3454 3448 3442 3460 3454 3461 3455 3449 3443 3461 3455 3462 3456 3450 3444 3462 3456 3463 3457 3451 3445 3463 3457 3464 3458 3452 3446 3464 3458 3465 3460 3453 3448 3466 3459 3454 3447 3453 3448 3467 3461 3455 3449 3454 3447 3468 3462 3456 3450 3455 3449 3470 3463 3458 3451 3457 3452 3470 3463 3471 3465 3459 3453 3471 3465 3472 3466 3460 3454 3472 3466 3473 3467 3461 3455 3473 3467 3474 3468 3462 3456 3474 3468 3475 3469 3463 3457 3475 3469 3476 3470 3464 3458 3476 3470 3477 3472 3465 3460 3478 3471 3466 3459 3465 3460 3479 3473 3467 3461 3466 3459 3480 3474 3468 3462 3467 3461 3482 3475 3470 3463 3469 3464 3482 3475 3483 3477 3471 3465 3483 3477 3484 3478 3472 3466 3484 3478 3485 3479 3473 3467 3485 3479 3486 3480 3474 3468 3486 3480 3487 3481 3475 3469 3487 3481 3488 3482 3476 3470 3488 3482 3489 3484 3477 3472 3490 3483 3478 3471 3477 3472 3491 3485 3479 3473 3478 3471 3492 3486 3480 3474 3479 3473 3493 3487 3494 3489 3482 3475 3495 3488 3483 3477 3482 3475 3496 3490 3484 3478 3483 3477 3497 3491 3485 3479 3484 3478 3498 3492 3486 3480 3485 3479 3499 3493 3487 3481 3486 3480 3500 3494 3488 3482 3487 3481 3501 3495 3489 3484 3488 3482 3501 3495 3502 3496 3490 3483 3502 3496 3503 3497 3491 3485 3503 3497 3504 3498 3492 3486 3505 3499 3506 3501 3494 3489 3507 3500 3495 3488 3494 3489 3508 3502 3496 3490 3495 3488 3509 3503 3497 3491 3496 3490 3510 3504 3498 3492 3497 3491 3511 3505 3499 3493 3498 3492 3512 3506 3500 3494 3499 3493 3513 3507 3501 3495 3500 3494 3513 3507 3514 3508 3502 3496 3514 3508 3515 3509 3503 3497 3515 3509 3516 3510 3504 3498 3517 3511 3518 3513 3506 3501 3519 3512 3507 3500 3506 3501 3520 3514 3508 3502 3507 3500 3521 3515 3509 3503 3508 3502 3522 3516 3510 3504 3509 3503 3523 3517 3511 3505 3510 3504 3524 3518 3512 3506 3511 3505 3525 3519 3513 3507 3512 3506 3525 3519 3526 3520 3514 3508 3526 3520 3527 3521 3515 3509 3527 3521 3528 3522 3516 3510 3529 3523 3530 3525 3518 3513 3531 3524 3519 3512 3518 3513 3532 3526 3520 3514 3519 3512 3533 3527 3521 3515 3520 3514 3534 3528 3522 3516 3521 3515 3535 3529 3523 3517 3522 3516 3536 3530 3524 3518 3523 3517 3537 3531 3525 3519 3524 3518 3537 3531 3538 3532 3526 3520 3538 3532 3539 3533 3527 3521 3539 3533 3540 3534 3528 3522 3541 3535 3542 3537 3530 3525 3543 3536 3531 3524 3530 3525 3544 3538 3532 3526 3531 3524 3545 3539 3533 3527 3532 3526 3546 3540 3534 3528 3533 3527 3547 3541 3535 3529 3534 3528 3548 3542 3536 3530 3535 3529 3549 3543 3537 3531 3536 3530 3549 3543 3550 3544 3538 3532 3550 3544 3551 3545 3539 3533 3551 3545 3552 3546 3540 3534 3552 3546 3120 3126 2999 2992 3280 3272 3279 3275 3542 3537 3282 3274 3543 3536 3542 3537 3284 3277 3544 3538 3543 3536 3286 3279 3545 3539 3544 3538 3288 3281 3546 3540 3545 3539 3290 3283 3547 3541 3546 3540 3292 3285 3548 3542 3547 3541 3294 3287 3549 3543 3548 3542 3294 3287 3296 3291 3550 3544 3296 3291 3298 3293 3551 3545 3298 3293 3300 3294 3552 3546 3300 3294 2999 2992 3120 3126 3554 3547 3555 3551 3556 3548 3557 3550 3558 3553 3555 3551 3559 3552 3560 3555 3558 3553 3561 3554 3562 3557 3560 3555 3563 3556 3564 3559 3562 3557 3565 3558 3566 3561 3564 3559 3567 3560 3568 3563 3566 3561 3569 3562 3570 3565 3568 3563 3571 3564 3572 3567 3570 3565 3573 3566 3574 3569 3572 3567 3575 3568 3576 3570 3574 3569 2975 2971 2978 2970 3576 3570 3578 3571 3554 3547 3553 3549 3579 3573 3557 3550 3554 3547 3580 3574 3559 3552 3557 3550 3581 3575 3561 3554 3559 3552 3582 3576 3563 3556 3561 3554 3583 3577 3565 3558 3563 3556 3584 3578 3567 3560 3565 3558 3585 3579 3569 3562 3567 3560 3586 3580 3571 3564 3569 3562 3587 3581 3573 3566 3571 3564 3588 3582 3575 3568 3573 3566 3000 2995 2975 2971 3575 3568 3590 3583 3578 3571 3577 3572 3591 3585 3579 3573 3578 3571 3592 3586 3580 3574 3579 3573 3593 3587 3581 3575 3580 3574 3594 3588 3582 3576 3581 3575 3595 3589 3583 3577 3582 3576 3596 3590 3584 3578 3583 3577 3597 3591 3585 3579 3584 3578 3598 3592 3586 3580 3585 3579 3599 3593 3587 3581 3586 3580 3600 3594 3588 3582 3587 3581 3012 3007 3000 2995 3588 3582 3602 3595 3590 3583 3589 3584 3603 3597 3591 3585 3590 3583 3604 3598 3592 3586 3591 3585 3605 3599 3593 3587 3592 3586 3606 3600 3594 3588 3593 3587 3607 3601 3595 3589 3594 3588 3608 3602 3596 3590 3595 3589 3609 3603 3597 3591 3596 3590 3610 3604 3598 3592 3597 3591 3611 3605 3599 3593 3598 3592 3612 3606 3600 3594 3599 3593 3024 3019 3012 3007 3600 3594 3614 3607 3602 3595 3601 3596 3615 3609 3603 3597 3602 3595 3616 3610 3604 3598 3603 3597 3617 3611 3605 3599 3604 3598 3618 3612 3606 3600 3605 3599 3619 3613 3607 3601 3606 3600 3620 3614 3608 3602 3607 3601 3621 3615 3609 3603 3608 3602 3622 3616 3610 3604 3609 3603 3623 3617 3611 3605 3610 3604 3624 3618 3612 3606 3611 3605 3036 3031 3024 3019 3612 3606 3626 3619 3614 3607 3613 3608 3627 3621 3615 3609 3614 3607 3628 3622 3616 3610 3615 3609 3629 3623 3617 3611 3616 3610 3630 3624 3618 3612 3617 3611 3631 3625 3619 3613 3618 3612 3632 3626 3620 3614 3619 3613 3633 3627 3621 3615 3620 3614 3634 3628 3622 3616 3621 3615 3635 3629 3623 3617 3622 3616 3636 3630 3624 3618 3623 3617 3048 3043 3036 3031 3624 3618 3637 3631 3638 3632 3626 3619 3638 3632 3639 3633 3627 3621 3639 3633 3640 3634 3628 3622 3640 3634 3641 3635 3629 3623 3641 3635 3642 3636 3630 3624 3642 3636 3643 3637 3631 3625 3643 3637 3644 3638 3632 3626 3644 3638 3645 3639 3633 3627 3645 3639 3646 3640 3634 3628 3646 3640 3647 3641 3635 3629 3647 3641 3648 3642 3636 3630 3648 3642 3060 3054 3048 3043 3649 3643 3650 3644 3638 3632 3650 3644 3651 3645 3639 3633 3651 3645 3652 3646 3640 3634 3652 3646 3653 3647 3641 3635 3653 3647 3654 3648 3642 3636 3654 3648 3655 3649 3643 3637 3655 3649 3656 3650 3644 3638 3656 3650 3657 3651 3645 3639 3657 3651 3658 3652 3646 3640 3658 3652 3659 3653 3647 3641 3659 3653 3660 3654 3648 3642 3660 3654 3072 3066 3060 3054 3661 3655 3662 3656 3650 3644 3662 3656 3663 3657 3651 3645 3663 3657 3664 3658 3652 3646 3664 3658 3665 3659 3653 3647 3665 3659 3666 3660 3654 3648 3666 3660 3667 3661 3655 3649 3667 3661 3668 3662 3656 3650 3668 3662 3669 3663 3657 3651 3669 3663 3670 3664 3658 3652 3670 3664 3671 3665 3659 3653 3671 3665 3672 3666 3660 3654 3672 3666 3084 3078 3072 3066 3673 3667 3674 3668 3662 3656 3674 3668 3675 3669 3663 3657 3675 3669 3676 3670 3664 3658 3676 3670 3677 3671 3665 3659 3677 3671 3678 3672 3666 3660 3678 3672 3679 3673 3667 3661 3679 3673 3680 3674 3668 3662 3680 3674 3681 3675 3669 3663 3681 3675 3682 3676 3670 3664 3682 3676 3683 3677 3671 3665 3683 3677 3684 3678 3672 3666 3684 3678 3096 3090 3084 3078 3685 3679 3686 3680 3674 3668 3686 3680 3687 3681 3675 3669 3687 3681 3688 3682 3676 3670 3688 3682 3689 3683 3677 3671 3689 3683 3690 3684 3678 3672 3690 3684 3691 3685 3679 3673 3691 3685 3692 3686 3680 3674 3692 3686 3693 3687 3681 3675 3693 3687 3694 3688 3682 3676 3694 3688 3695 3689 3683 3677 3695 3689 3696 3690 3684 3678 3696 3690 3108 3102 3096 3090 3697 3691 3698 3692 3686 3680 3698 3692 3699 3693 3687 3681 3699 3693 3700 3694 3688 3682 3700 3694 3701 3695 3689 3683 3701 3695 3702 3696 3690 3684 3702 3696 3703 3697 3691 3685 3703 3697 3704 3698 3692 3686 3704 3698 3705 3699 3693 3687 3705 3699 3706 3700 3694 3688 3706 3700 3707 3701 3695 3689 3707 3701 3708 3702 3696 3690 3708 3702 3121 3114 3108 3102 3710 3703 3711 3707 3712 3704 3713 3706 3714 3709 3711 3707 3715 3708 3716 3711 3714 3709 3717 3710 3718 3713 3716 3711 3719 3712 3720 3715 3718 3713 3721 3714 3722 3717 3720 3715 3723 3716 3724 3719 3722 3717 3725 3718 3726 3721 3724 3719 3727 3720 3728 3723 3726 3721 3729 3722 3730 3725 3728 3723 3731 3724 3732 3726 3730 3725 3133 3129 3136 3128 3732 3726 3734 3727 3710 3703 3709 3705 3735 3729 3713 3706 3710 3703 3736 3730 3715 3708 3713 3706 3737 3731 3717 3710 3715 3708 3738 3732 3719 3712 3717 3710 3739 3733 3721 3714 3719 3712 3740 3734 3723 3716 3721 3714 3741 3735 3725 3718 3723 3716 3742 3736 3727 3720 3725 3718 3743 3737 3729 3722 3727 3720 3744 3738 3731 3724 3729 3722 3157 3152 3133 3129 3731 3724 3746 3739 3734 3727 3733 3728 3747 3741 3735 3729 3734 3727 3748 3742 3736 3730 3735 3729 3749 3743 3737 3731 3736 3730 3750 3744 3738 3732 3737 3731 3751 3745 3739 3733 3738 3732 3752 3746 3740 3734 3739 3733 3753 3747 3741 3735 3740 3734 3754 3748 3742 3736 3741 3735 3755 3749 3743 3737 3742 3736 3756 3750 3744 3738 3743 3737 3169 3164 3157 3152 3744 3738 3758 3751 3746 3739 3745 3740 3759 3753 3747 3741 3746 3739 3760 3754 3748 3742 3747 3741 3761 3755 3749 3743 3748 3742 3762 3756 3750 3744 3749 3743 3763 3757 3751 3745 3750 3744 3764 3758 3752 3746 3751 3745 3765 3759 3753 3747 3752 3746 3766 3760 3754 3748 3753 3747 3767 3761 3755 3749 3754 3748 3768 3762 3756 3750 3755 3749 3181 3176 3169 3164 3756 3750 3770 3763 3758 3751 3757 3752 3771 3765 3759 3753 3758 3751 3772 3766 3760 3754 3759 3753 3773 3767 3761 3755 3760 3754 3774 3768 3762 3756 3761 3755 3775 3769 3763 3757 3762 3756 3776 3770 3764 3758 3763 3757 3777 3771 3765 3759 3764 3758 3778 3772 3766 3760 3765 3759 3779 3773 3767 3761 3766 3760 3780 3774 3768 3762 3767 3761 3193 3188 3181 3176 3768 3762 3782 3775 3770 3763 3769 3764 3783 3777 3771 3765 3770 3763 3784 3778 3772 3766 3771 3765 3785 3779 3773 3767 3772 3766 3786 3780 3774 3768 3773 3767 3787 3781 3775 3769 3774 3768 3788 3782 3776 3770 3775 3769 3789 3783 3777 3771 3776 3770 3790 3784 3778 3772 3777 3771 3791 3785 3779 3773 3778 3772 3792 3786 3780 3774 3779 3773 3205 3200 3193 3188 3780 3774 3793 3787 3794 3788 3782 3775 3794 3788 3795 3789 3783 3777 3795 3789 3796 3790 3784 3778 3796 3790 3797 3791 3785 3779 3797 3791 3798 3792 3786 3780 3798 3792 3799 3793 3787 3781 3799 3793 3800 3794 3788 3782 3800 3794 3801 3795 3789 3783 3801 3795 3802 3796 3790 3784 3802 3796 3803 3797 3791 3785 3803 3797 3804 3798 3792 3786 3804 3798 3217 3211 3205 3200 3805 3799 3806 3800 3794 3788 3806 3800 3807 3801 3795 3789 3807 3801 3808 3802 3796 3790 3808 3802 3809 3803 3797 3791 3809 3803 3810 3804 3798 3792 3810 3804 3811 3805 3799 3793 3811 3805 3812 3806 3800 3794 3812 3806 3813 3807 3801 3795 3813 3807 3814 3808 3802 3796 3814 3808 3815 3809 3803 3797 3815 3809 3816 3810 3804 3798 3816 3810 3229 3223 3217 3211 3817 3811 3818 3812 3806 3800 3818 3812 3819 3813 3807 3801 3819 3813 3820 3814 3808 3802 3820 3814 3821 3815 3809 3803 3821 3815 3822 3816 3810 3804 3822 3816 3823 3817 3811 3805 3823 3817 3824 3818 3812 3806 3824 3818 3825 3819 3813 3807 3825 3819 3826 3820 3814 3808 3826 3820 3827 3821 3815 3809 3827 3821 3828 3822 3816 3810 3828 3822 3241 3235 3229 3223 3829 3823 3830 3824 3818 3812 3830 3824 3831 3825 3819 3813 3831 3825 3832 3826 3820 3814 3832 3826 3833 3827 3821 3815 3833 3827 3834 3828 3822 3816 3834 3828 3835 3829 3823 3817 3835 3829 3836 3830 3824 3818 3836 3830 3837 3831 3825 3819 3837 3831 3838 3832 3826 3820 3838 3832 3839 3833 3827 3821 3839 3833 3840 3834 3828 3822 3840 3834 3253 3247 3241 3235 3841 3835 3842 3836 3830 3824 3842 3836 3843 3837 3831 3825 3843 3837 3844 3838 3832 3826 3844 3838 3845 3839 3833 3827 3845 3839 3846 3840 3834 3828 3846 3840 3847 3841 3835 3829 3847 3841 3848 3842 3836 3830 3848 3842 3849 3843 3837 3831 3849 3843 3850 3844 3838 3832 3850 3844 3851 3845 3839 3833 3851 3845 3852 3846 3840 3834 3852 3846 3265 3259 3253 3247 3556 3548 3555 3551 3842 3836 3555 3551 3558 3553 3843 3837 3558 3553 3560 3555 3844 3838 3560 3555 3562 3557 3845 3839 3562 3557 3564 3559 3846 3840 3564 3559 3566 3561 3847 3841 3566 3561 3568 3563 3848 3842 3568 3563 3570 3565 3849 3843 3570 3565 3572 3567 3850 3844 3572 3567 3574 3569 3851 3845 3574 3569 3576 3570 3852 3846 3576 3570 2978 2970 3265 3259 3854 3847 3855 3851 3856 3848 3857 3850 3858 3853 3855 3851 3859 3852 3860 3855 3858 3853 3861 3854 3862 3857 3860 3855 3863 3856 3864 3859 3862 3857 3865 3858 3866 3861 3864 3859 3867 3860 3868 3863 3866 3861 3869 3862 3870 3865 3868 3863 3871 3864 3872 3867 3870 3865 3873 3866 3874 3869 3872 3867 3875 3868 3876 3870 3874 3869 3277 3273 3280 3272 3876 3870 3878 3871 3854 3847 3853 3849 3879 3873 3857 3850 3854 3847 3880 3874 3859 3852 3857 3850 3881 3875 3861 3854 3859 3852 3882 3876 3863 3856 3861 3854 3883 3877 3865 3858 3863 3856 3884 3878 3867 3860 3865 3858 3885 3879 3869 3862 3867 3860 3886 3880 3871 3864 3869 3862 3887 3881 3873 3866 3871 3864 3888 3882 3875 3868 3873 3866 3301 3296 3277 3273 3875 3868 3890 3883 3878 3871 3877 3872 3891 3885 3879 3873 3878 3871 3892 3886 3880 3874 3879 3873 3893 3887 3881 3875 3880 3874 3894 3888 3882 3876 3881 3875 3895 3889 3883 3877 3882 3876 3896 3890 3884 3878 3883 3877 3897 3891 3885 3879 3884 3878 3898 3892 3886 3880 3885 3879 3899 3893 3887 3881 3886 3880 3900 3894 3888 3882 3887 3881 3313 3308 3301 3296 3888 3882 3902 3895 3890 3883 3889 3884 3903 3897 3891 3885 3890 3883 3904 3898 3892 3886 3891 3885 3905 3899 3893 3887 3892 3886 3906 3900 3894 3888 3893 3887 3907 3901 3895 3889 3894 3888 3908 3902 3896 3890 3895 3889 3909 3903 3897 3891 3896 3890 3910 3904 3898 3892 3897 3891 3911 3905 3899 3893 3898 3892 3912 3906 3900 3894 3899 3893 3325 3320 3313 3308 3900 3894 3914 3907 3902 3895 3901 3896 3915 3909 3903 3897 3902 3895 3916 3910 3904 3898 3903 3897 3917 3911 3905 3899 3904 3898 3918 3912 3906 3900 3905 3899 3919 3913 3907 3901 3906 3900 3920 3914 3908 3902 3907 3901 3921 3915 3909 3903 3908 3902 3922 3916 3910 3904 3909 3903 3923 3917 3911 3905 3910 3904 3924 3918 3912 3906 3911 3905 3337 3332 3325 3320 3912 3906 3926 3919 3914 3907 3913 3908 3927 3921 3915 3909 3914 3907 3928 3922 3916 3910 3915 3909 3929 3923 3917 3911 3916 3910 3930 3924 3918 3912 3917 3911 3931 3925 3919 3913 3918 3912 3932 3926 3920 3914 3919 3913 3933 3927 3921 3915 3920 3914 3934 3928 3922 3916 3921 3915 3935 3929 3923 3917 3922 3916 3936 3930 3924 3918 3923 3917 3349 3344 3337 3332 3924 3918 3937 3931 3938 3932 3926 3919 3938 3932 3939 3933 3927 3921 3939 3933 3940 3934 3928 3922 3940 3934 3941 3935 3929 3923 3941 3935 3942 3936 3930 3924 3942 3936 3943 3937 3931 3925 3943 3937 3944 3938 3932 3926 3944 3938 3945 3939 3933 3927 3945 3939 3946 3940 3934 3928 3946 3940 3947 3941 3935 3929 3947 3941 3948 3942 3936 3930 3948 3942 3361 3355 3349 3344 3949 3943 3950 3944 3938 3932 3950 3944 3951 3945 3939 3933 3951 3945 3952 3946 3940 3934 3952 3946 3953 3947 3941 3935 3953 3947 3954 3948 3942 3936 3954 3948 3955 3949 3943 3937 3955 3949 3956 3950 3944 3938 3956 3950 3957 3951 3945 3939 3957 3951 3958 3952 3946 3940 3958 3952 3959 3953 3947 3941 3959 3953 3960 3954 3948 3942 3960 3954 3373 3367 3361 3355 3961 3955 3962 3956 3950 3944 3962 3956 3963 3957 3951 3945 3963 3957 3964 3958 3952 3946 3964 3958 3965 3959 3953 3947 3965 3959 3966 3960 3954 3948 3966 3960 3967 3961 3955 3949 3967 3961 3968 3962 3956 3950 3968 3962 3969 3963 3957 3951 3969 3963 3970 3964 3958 3952 3970 3964 3971 3965 3959 3953 3971 3965 3972 3966 3960 3954 3972 3966 3385 3379 3373 3367 3973 3967 3974 3968 3962 3956 3974 3968 3975 3969 3963 3957 3975 3969 3976 3970 3964 3958 3976 3970 3977 3971 3965 3959 3977 3971 3978 3972 3966 3960 3978 3972 3979 3973 3967 3961 3979 3973 3980 3974 3968 3962 3980 3974 3981 3975 3969 3963 3981 3975 3982 3976 3970 3964 3982 3976 3983 3977 3971 3965 3983 3977 3984 3978 3972 3966 3984 3978 3397 3391 3385 3379 3985 3979 3986 3980 3974 3968 3986 3980 3987 3981 3975 3969 3987 3981 3988 3982 3976 3970 3988 3982 3989 3983 3977 3971 3989 3983 3990 3984 3978 3972 3990 3984 3991 3985 3979 3973 3991 3985 3992 3986 3980 3974 3992 3986 3993 3987 3981 3975 3993 3987 3994 3988 3982 3976 3994 3988 3995 3989 3983 3977 3995 3989 3996 3990 3984 3978 3996 3990 3409 3403 3397 3391 3712 3704 3711 3707 3986 3980 3711 3707 3714 3709 3987 3981 3714 3709 3716 3711 3988 3982 3716 3711 3718 3713 3989 3983 3718 3713 3720 3715 3990 3984 3720 3715 3722 3717 3991 3985 3722 3717 3724 3719 3992 3986 3724 3719 3726 3721 3993 3987 3726 3721 3728 3723 3994 3988 3728 3723 3730 3725 3995 3989 3730 3725 3732 3726 3996 3990 3732 3726 3136 3128 3409 3403 3998 3991 3698 3692 3697 3691 3999 3993 3699 3693 3698 3692 4000 3994 3700 3694 3699 3693 4001 3995 3701 3695 3700 3694 4002 3996 3702 3696 3701 3695 4003 3997 3703 3697 3702 3696 4004 3998 3704 3698 3703 3697 4005 3999 3705 3699 3704 3698 4006 4000 3706 3700 3705 3699 4007 4001 3707 3701 3706 3700 4008 4002 3708 3702 3707 3701 3421 3416 3121 3114 3708 3702 4010 4003 3998 3991 3997 3992 4011 4005 3999 3993 3998 3991 4012 4006 4000 3994 3999 3993 4013 4007 4001 3995 4000 3994 4014 4008 4002 3996 4001 3995 4015 4009 4003 3997 4002 3996 4016 4010 4004 3998 4003 3997 4017 4011 4005 3999 4004 3998 4018 4012 4006 4000 4005 3999 4019 4013 4007 4001 4006 4000 4020 4014 4008 4002 4007 4001 3433 3428 3421 3416 4008 4002 4022 4015 4010 4003 4009 4004 4023 4017 4011 4005 4010 4003 4024 4018 4012 4006 4011 4005 4025 4019 4013 4007 4012 4006 4026 4020 4014 4008 4013 4007 4027 4021 4015 4009 4014 4008 4028 4022 4016 4010 4015 4009 4029 4023 4017 4011 4016 4010 4030 4024 4018 4012 4017 4011 4031 4025 4019 4013 4018 4012 4032 4026 4020 4014 4019 4013 3445 3440 3433 3428 4020 4014 4034 4027 4022 4015 4021 4016 4035 4029 4023 4017 4022 4015 4036 4030 4024 4018 4023 4017 4037 4031 4025 4019 4024 4018 4038 4032 4026 4020 4025 4019 4039 4033 4027 4021 4026 4020 4040 4034 4028 4022 4027 4021 4041 4035 4029 4023 4028 4022 4042 4036 4030 4024 4029 4023 4043 4037 4031 4025 4030 4024 4044 4038 4032 4026 4031 4025 3457 3452 3445 3440 4032 4026 4046 4039 4034 4027 4033 4028 4047 4041 4035 4029 4034 4027 4048 4042 4036 4030 4035 4029 4049 4043 4037 4031 4036 4030 4050 4044 4038 4032 4037 4031 4051 4045 4039 4033 4038 4032 4052 4046 4040 4034 4039 4033 4053 4047 4041 4035 4040 4034 4054 4048 4042 4036 4041 4035 4055 4049 4043 4037 4042 4036 4056 4050 4044 4038 4043 4037 3469 3464 3457 3452 4044 4038 4058 4051 4046 4039 4045 4040 4059 4053 4047 4041 4046 4039 4060 4054 4048 4042 4047 4041 4061 4055 4049 4043 4048 4042 4062 4056 4050 4044 4049 4043 4063 4057 4051 4045 4050 4044 4064 4058 4052 4046 4051 4045 4065 4059 4053 4047 4052 4046 4066 4060 4054 4048 4053 4047 4067 4061 4055 4049 4054 4048 4068 4062 4056 4050 4055 4049 3481 3476 3469 3464 4056 4050 4069 4063 4070 4064 4058 4051 4070 4064 4071 4065 4059 4053 4071 4065 4072 4066 4060 4054 4072 4066 4073 4067 4061 4055 4073 4067 4074 4068 4062 4056 4074 4068 4075 4069 4063 4057 4075 4069 4076 4070 4064 4058 4076 4070 4077 4071 4065 4059 4077 4071 4078 4072 4066 4060 4078 4072 4079 4073 4067 4061 4079 4073 4080 4074 4068 4062 4080 4074 3493 3487 3481 3476 4081 4075 4082 4076 4070 4064 4082 4076 4083 4077 4071 4065 4083 4077 4084 4078 4072 4066 4084 4078 4085 4079 4073 4067 4085 4079 4086 4080 4074 4068 4086 4080 4087 4081 4075 4069 4087 4081 4088 4082 4076 4070 4088 4082 4089 4083 4077 4071 4089 4083 4090 4084 4078 4072 4090 4084 4091 4085 4079 4073 4091 4085 4092 4086 4080 4074 4092 4086 3505 3499 3493 3487 4093 4087 4094 4088 4082 4076 4094 4088 4095 4089 4083 4077 4095 4089 4096 4090 4084 4078 4096 4090 4097 4091 4085 4079 4097 4091 4098 4092 4086 4080 4098 4092 4099 4093 4087 4081 4099 4093 4100 4094 4088 4082 4100 4094 4101 4095 4089 4083 4101 4095 4102 4096 4090 4084 4102 4096 4103 4097 4091 4085 4103 4097 4104 4098 4092 4086 4104 4098 3517 3511 3505 3499 4105 4099 4106 4100 4094 4088 4106 4100 4107 4101 4095 4089 4107 4101 4108 4102 4096 4090 4108 4102 4109 4103 4097 4091 4109 4103 4110 4104 4098 4092 4110 4104 4111 4105 4099 4093 4111 4105 4112 4106 4100 4094 4112 4106 4113 4107 4101 4095 4113 4107 4114 4108 4102 4096 4114 4108 4115 4109 4103 4097 4115 4109 4116 4110 4104 4098 4116 4110 3529 3523 3517 3511 4117 4111 4118 4112 4106 4100 4118 4112 4119 4113 4107 4101 4119 4113 4120 4114 4108 4102 4120 4114 4121 4115 4109 4103 4121 4115 4122 4116 4110 4104 4122 4116 4123 4117 4111 4105 4123 4117 4124 4118 4112 4106 4124 4118 4125 4119 4113 4107 4125 4119 4126 4120 4114 4108 4126 4120 4127 4121 4115 4109 4127 4121 4128 4122 4116 4110 4128 4122 3541 3535 3529 3523 3856 3848 3855 3851 4118 4112 3855 3851 3858 3853 4119 4113 3858 3853 3860 3855 4120 4114 3860 3855 3862 3857 4121 4115 3862 3857 3864 3859 4122 4116 3864 3859 3866 3861 4123 4117 3866 3861 3868 3863 4124 4118 3868 3863 3870 3865 4125 4119 3870 3865 3872 3867 4126 4120 3872 3867 3874 3869 4127 4121 3874 3869 3876 3870 4128 4122 3876 3870 3280 3272 3541 3535 4130 4123 4131 4126 1503 1498 4132 4125 4133 4128 4131 4126 4134 4127 4135 4130 4133 4128 4136 4129 4137 4132 4135 4130 4138 4131 4139 4134 4137 4132 4140 4133 4141 4136 4139 4134 4142 4135 4143 4138 4141 4136 4144 4137 4145 4140 4143 4138 4146 4139 4147 4142 4145 4140 4148 4141 4149 4144 4147 4142 4150 4143 4151 4146 4149 4144 4154 4147 4130 4123 4129 4124 4155 4149 4132 4125 4130 4123 4156 4150 4134 4127 4132 4125 4157 4151 4136 4129 4134 4127 4158 4152 4138 4131 4136 4129 4159 4153 4140 4133 4138 4131 4160 4154 4142 4135 4140 4133 4161 4155 4144 4137 4142 4135 4162 4156 4146 4139 4144 4137 4163 4157 4148 4141 4146 4139 4164 4158 4150 4143 4148 4141 4165 4159 4154 4147 4153 4148 4166 4160 4155 4149 4154 4147 4167 4161 4156 4150 4155 4149 4168 4162 4157 4151 4156 4150 4169 4163 4158 4152 4157 4151 4170 4164 4159 4153 4158 4152 4171 4165 4160 4154 4159 4153 4172 4166 4161 4155 4160 4154 4173 4167 4162 4156 4161 4155 4174 4168 4163 4157 4162 4156 4175 4169 4164 4158 4163 4157 4177 4170 4165 4159 1740 1737 4178 4172 4166 4160 4165 4159 4179 4173 4167 4161 4166 4160 4180 4174 4168 4162 4167 4161 4181 4175 4169 4163 4168 4162 4182 4176 4170 4164 4169 4163 4183 4177 4171 4165 4170 4164 4184 4178 4172 4166 4171 4165 4185 4179 4173 4167 4172 4166 4186 4180 4174 4168 4173 4167 4187 4181 4175 4169 4174 4168 4189 4182 4177 4170 4176 4171 4190 4184 4178 4172 4177 4170 4191 4185 4179 4173 4178 4172 4192 4186 4180 4174 4179 4173 4193 4187 4181 4175 4180 4174 4194 4188 4182 4176 4181 4175 4195 4189 4183 4177 4182 4176 4196 4190 4184 4178 4183 4177 4197 4191 4185 4179 4184 4178 4198 4192 4186 4180 4185 4179 4199 4193 4187 4181 4186 4180 4200 4194 4189 4182 4188 4183 4201 4195 4190 4184 4189 4182 4202 4196 4191 4185 4190 4184 4203 4197 4192 4186 4191 4185 4204 4198 4193 4187 4192 4186 4205 4199 4194 4188 4193 4187 4206 4200 4195 4189 4194 4188 4207 4201 4196 4190 4195 4189 4208 4202 4197 4191 4196 4190 4209 4203 4198 4192 4197 4191 4210 4204 4199 4193 4198 4192 4211 4205 4212 4206 4200 4194 4212 4206 4213 4207 4201 4195 4213 4207 4214 4208 4202 4196 4214 4208 4215 4209 4203 4197 4215 4209 4216 4210 4204 4198 4216 4210 4217 4211 4205 4199 4217 4211 4218 4212 4206 4200 4218 4212 4219 4213 4207 4201 4219 4213 4220 4214 4208 4202 4220 4214 4221 4215 4209 4203 4221 4215 4222 4216 4210 4204 4223 4217 4224 4218 4212 4206 4224 4218 4225 4219 4213 4207 4225 4219 4226 4220 4214 4208 4226 4220 4227 4221 4215 4209 4227 4221 4228 4222 4216 4210 4228 4222 4229 4223 4217 4211 4229 4223 4230 4224 4218 4212 4230 4224 4231 4225 4219 4213 4231 4225 4232 4226 4220 4214 4232 4226 4233 4227 4221 4215 4233 4227 4234 4228 4222 4216 1668 1664 4235 4229 4224 4218 4235 4229 4236 4230 4225 4219 4236 4230 4237 4231 4226 4220 4237 4231 4238 4232 4227 4221 4238 4232 4239 4233 4228 4222 4239 4233 4240 4234 4229 4223 4240 4234 4241 4235 4230 4224 4241 4235 4242 4236 4231 4225 4242 4236 4243 4237 4232 4226 4243 4237 4244 4238 4233 4227 4244 4238 4245 4239 4234 4228 4246 4240 4247 4241 4235 4229 4247 4241 4248 4242 4236 4230 4248 4242 4249 4243 4237 4231 4249 4243 4250 4244 4238 4232 4250 4244 4251 4245 4239 4233 4251 4245 4252 4246 4240 4234 4252 4246 4253 4247 4241 4235 4253 4247 4254 4248 4242 4236 4254 4248 4255 4249 4243 4237 4255 4249 4256 4250 4244 4238 4256 4250 4257 4251 4245 4239 4258 4252 4259 4253 4247 4241 4259 4253 4260 4254 4248 4242 4260 4254 4261 4255 4249 4243 4261 4255 4262 4256 4250 4244 4262 4256 4263 4257 4251 4245 4263 4257 4264 4258 4252 4246 4264 4258 4265 4259 4253 4247 4265 4259 4266 4260 4254 4248 4266 4260 4267 4261 4255 4249 4267 4261 4268 4262 4256 4250 4268 4262 4269 4263 4257 4251 1344 1341 4270 4264 4259 4253 4270 4264 4271 4265 4260 4254 4271 4265 4272 4266 4261 4255 4272 4266 4273 4267 4262 4256 4273 4267 4274 4268 4263 4257 4274 4268 4275 4269 4264 4258 4275 4269 4276 4270 4265 4259 4276 4270 4277 4271 4266 4260 4277 4271 4278 4272 4267 4261 4278 4272 4279 4273 4268 4262 4279 4273 4280 4274 4269 4263 4282 4275 4283 4278 1359 1354 4284 4277 4285 4280 4283 4278 4286 4279 4287 4282 4285 4280 4288 4281 4289 4284 4287 4282 4290 4283 4291 4286 4289 4284 4292 4285 4293 4288 4291 4286 4294 4287 4295 4290 4293 4288 4296 4289 4297 4292 4295 4290 4298 4291 4299 4294 4297 4292 4300 4293 4301 4296 4299 4294 4302 4295 4303 4297 4301 4296 4305 4298 4282 4275 4281 4276 4306 4300 4284 4277 4282 4275 4307 4301 4286 4279 4284 4277 4308 4302 4288 4281 4286 4279 4309 4303 4290 4283 4288 4281 4310 4304 4292 4285 4290 4283 4311 4305 4294 4287 4292 4285 4312 4306 4296 4289 4294 4287 4313 4307 4298 4291 4296 4289 4314 4308 4300 4293 4298 4291 4315 4309 4302 4295 4300 4293 4316 4310 4305 4298 4304 4299 4317 4311 4306 4300 4305 4298 4318 4312 4307 4301 4306 4300 4319 4313 4308 4302 4307 4301 4320 4314 4309 4303 4308 4302 4321 4315 4310 4304 4309 4303 4322 4316 4311 4305 4310 4304 4323 4317 4312 4306 4311 4305 4324 4318 4313 4307 4312 4306 4325 4319 4314 4308 4313 4307 4326 4320 4315 4309 4314 4308 4328 4321 4316 4310 1608 1605 4329 4323 4317 4311 4316 4310 4330 4324 4318 4312 4317 4311 4331 4325 4319 4313 4318 4312 4332 4326 4320 4314 4319 4313 4333 4327 4321 4315 4320 4314 4334 4328 4322 4316 4321 4315 4335 4329 4323 4317 4322 4316 4336 4330 4324 4318 4323 4317 4337 4331 4325 4319 4324 4318 4338 4332 4326 4320 4325 4319 4340 4333 4328 4321 4327 4322 4341 4335 4329 4323 4328 4321 4342 4336 4330 4324 4329 4323 4343 4337 4331 4325 4330 4324 4344 4338 4332 4326 4331 4325 4345 4339 4333 4327 4332 4326 4346 4340 4334 4328 4333 4327 4347 4341 4335 4329 4334 4328 4348 4342 4336 4330 4335 4329 4349 4343 4337 4331 4336 4330 4350 4344 4338 4332 4337 4331 4351 4345 4340 4333 4339 4334 4352 4346 4341 4335 4340 4333 4353 4347 4342 4336 4341 4335 4354 4348 4343 4337 4342 4336 4355 4349 4344 4338 4343 4337 4356 4350 4345 4339 4344 4338 4357 4351 4346 4340 4345 4339 4358 4352 4347 4341 4346 4340 4359 4353 4348 4342 4347 4341 4360 4354 4349 4343 4348 4342 4361 4355 4350 4344 4349 4343 4362 4356 4363 4357 4351 4345 4363 4357 4364 4358 4352 4346 4364 4358 4365 4359 4353 4347 4365 4359 4366 4360 4354 4348 4366 4360 4367 4361 4355 4349 4367 4361 4368 4362 4356 4350 4368 4362 4369 4363 4357 4351 4369 4363 4370 4364 4358 4352 4370 4364 4371 4365 4359 4353 4371 4365 4372 4366 4360 4354 4372 4366 4373 4367 4361 4355 4374 4368 4375 4369 4363 4357 4375 4369 4376 4370 4364 4358 4376 4370 4377 4371 4365 4359 4377 4371 4378 4372 4366 4360 4378 4372 4379 4373 4367 4361 4379 4373 4380 4374 4368 4362 4380 4374 4381 4375 4369 4363 4381 4375 4382 4376 4370 4364 4382 4376 4383 4377 4371 4365 4383 4377 4384 4378 4372 4366 4384 4378 4385 4379 4373 4367 1536 1532 4386 4380 4375 4369 4386 4380 4387 4381 4376 4370 4387 4381 4388 4382 4377 4371 4388 4382 4389 4383 4378 4372 4389 4383 4390 4384 4379 4373 4390 4384 4391 4385 4380 4374 4391 4385 4392 4386 4381 4375 4392 4386 4393 4387 4382 4376 4393 4387 4394 4388 4383 4377 4394 4388 4395 4389 4384 4378 4395 4389 4396 4390 4385 4379 4397 4391 4398 4392 4386 4380 4398 4392 4399 4393 4387 4381 4399 4393 4400 4394 4388 4382 4400 4394 4401 4395 4389 4383 4401 4395 4402 4396 4390 4384 4402 4396 4403 4397 4391 4385 4403 4397 4404 4398 4392 4386 4404 4398 4405 4399 4393 4387 4405 4399 4406 4400 4394 4388 4406 4400 4407 4401 4395 4389 4407 4401 4408 4402 4396 4390 4409 4403 4410 4404 4398 4392 4410 4404 4411 4405 4399 4393 4411 4405 4412 4406 4400 4394 4412 4406 4413 4407 4401 4395 4413 4407 4414 4408 4402 4396 4414 4408 4415 4409 4403 4397 4415 4409 4416 4410 4404 4398 4416 4410 4417 4411 4405 4399 4417 4411 4418 4412 4406 4400 4418 4412 4419 4413 4407 4401 4419 4413 4420 4414 4408 4402 1503 1498 4131 4126 4410 4404 4131 4126 4133 4128 4411 4405 4133 4128 4135 4130 4412 4406 4135 4130 4137 4132 4413 4407 4137 4132 4139 4134 4414 4408 4139 4134 4141 4136 4415 4409 4141 4136 4143 4138 4416 4410 4143 4138 4145 4140 4417 4411 4145 4140 4147 4142 4418 4412 4147 4142 4149 4144 4419 4413 4149 4144 4151 4146 4420 4414 4422 4415 4423 4418 1203 1198 4424 4417 4425 4420 4423 4418 4426 4419 4427 4422 4425 4420 4428 4421 4429 4424 4427 4422 4430 4423 4431 4426 4429 4424 4432 4425 4433 4428 4431 4426 4434 4427 4435 4430 4433 4428 4436 4429 4437 4432 4435 4430 4438 4431 4439 4434 4437 4432 4440 4433 4441 4436 4439 4434 4442 4435 4443 4437 4441 4436 4445 4438 4422 4415 4421 4416 4446 4440 4424 4417 4422 4415 4447 4441 4426 4419 4424 4417 4448 4442 4428 4421 4426 4419 4449 4443 4430 4423 4428 4421 4450 4444 4432 4425 4430 4423 4451 4445 4434 4427 4432 4425 4452 4446 4436 4429 4434 4427 4453 4447 4438 4431 4436 4429 4454 4448 4440 4433 4438 4431 4455 4449 4442 4435 4440 4433 4456 4450 4445 4438 4444 4439 4457 4451 4446 4440 4445 4438 4458 4452 4447 4441 4446 4440 4459 4453 4448 4442 4447 4441 4460 4454 4449 4443 4448 4442 4461 4455 4450 4444 4449 4443 4462 4456 4451 4445 4450 4444 4463 4457 4452 4446 4451 4445 4464 4458 4453 4447 4452 4446 4465 4459 4454 4448 4453 4447 4466 4460 4455 4449 4454 4448 4468 4461 4456 4450 1464 1461 4469 4463 4457 4451 4456 4450 4470 4464 4458 4452 4457 4451 4471 4465 4459 4453 4458 4452 4472 4466 4460 4454 4459 4453 4473 4467 4461 4455 4460 4454 4474 4468 4462 4456 4461 4455 4475 4469 4463 4457 4462 4456 4476 4470 4464 4458 4463 4457 4477 4471 4465 4459 4464 4458 4478 4472 4466 4460 4465 4459 4480 4473 4468 4461 4467 4462 4481 4475 4469 4463 4468 4461 4482 4476 4470 4464 4469 4463 4483 4477 4471 4465 4470 4464 4484 4478 4472 4466 4471 4465 4485 4479 4473 4467 4472 4466 4486 4480 4474 4468 4473 4467 4487 4481 4475 4469 4474 4468 4488 4482 4476 4470 4475 4469 4489 4483 4477 4471 4476 4470 4490 4484 4478 4472 4477 4471 4491 4485 4480 4473 4479 4474 4492 4486 4481 4475 4480 4473 4493 4487 4482 4476 4481 4475 4494 4488 4483 4477 4482 4476 4495 4489 4484 4478 4483 4477 4496 4490 4485 4479 4484 4478 4497 4491 4486 4480 4485 4479 4498 4492 4487 4481 4486 4480 4499 4493 4488 4482 4487 4481 4500 4494 4489 4483 4488 4482 4501 4495 4490 4484 4489 4483 4502 4496 4503 4497 4491 4485 4503 4497 4504 4498 4492 4486 4504 4498 4505 4499 4493 4487 4505 4499 4506 4500 4494 4488 4506 4500 4507 4501 4495 4489 4507 4501 4508 4502 4496 4490 4508 4502 4509 4503 4497 4491 4509 4503 4510 4504 4498 4492 4510 4504 4511 4505 4499 4493 4511 4505 4512 4506 4500 4494 4512 4506 4513 4507 4501 4495 4514 4508 4515 4509 4503 4497 4515 4509 4516 4510 4504 4498 4516 4510 4517 4511 4505 4499 4517 4511 4518 4512 4506 4500 4518 4512 4519 4513 4507 4501 4519 4513 4520 4514 4508 4502 4520 4514 4521 4515 4509 4503 4521 4515 4522 4516 4510 4504 4522 4516 4523 4517 4511 4505 4523 4517 4524 4518 4512 4506 4524 4518 4525 4519 4513 4507 1392 1388 4526 4520 4515 4509 4526 4520 4527 4521 4516 4510 4527 4521 4528 4522 4517 4511 4528 4522 4529 4523 4518 4512 4529 4523 4530 4524 4519 4513 4530 4524 4531 4525 4520 4514 4531 4525 4532 4526 4521 4515 4532 4526 4533 4527 4522 4516 4533 4527 4534 4528 4523 4517 4534 4528 4535 4529 4524 4518 4535 4529 4536 4530 4525 4519 4537 4531 4538 4532 4526 4520 4538 4532 4539 4533 4527 4521 4539 4533 4540 4534 4528 4522 4540 4534 4541 4535 4529 4523 4541 4535 4542 4536 4530 4524 4542 4536 4543 4537 4531 4525 4543 4537 4544 4538 4532 4526 4544 4538 4545 4539 4533 4527 4545 4539 4546 4540 4534 4528 4546 4540 4547 4541 4535 4529 4547 4541 4548 4542 4536 4530 4549 4543 4550 4544 4538 4532 4550 4544 4551 4545 4539 4533 4551 4545 4552 4546 4540 4534 4552 4546 4553 4547 4541 4535 4553 4547 4554 4548 4542 4536 4554 4548 4555 4549 4543 4537 4555 4549 4556 4550 4544 4538 4556 4550 4557 4551 4545 4539 4557 4551 4558 4552 4546 4540 4558 4552 4559 4553 4547 4541 4559 4553 4560 4554 4548 4542 1359 1354 4283 4278 4550 4544 4283 4278 4285 4280 4551 4545 4285 4280 4287 4282 4552 4546 4287 4282 4289 4284 4553 4547 4289 4284 4291 4286 4554 4548 4291 4286 4293 4288 4555 4549 4293 4288 4295 4290 4556 4550 4295 4290 4297 4292 4557 4551 4297 4292 4299 4294 4558 4552 4299 4294 4301 4296 4559 4553 4301 4296 4303 4297 4560 4554 4562 4555 4270 4264 1344 1341 4563 4557 4271 4265 4270 4264 4564 4558 4272 4266 4271 4265 4565 4559 4273 4267 4272 4266 4566 4560 4274 4268 4273 4267 4567 4561 4275 4269 4274 4268 4568 4562 4276 4270 4275 4269 4569 4563 4277 4271 4276 4270 4570 4564 4278 4272 4277 4271 4571 4565 4279 4273 4278 4272 4572 4566 4280 4274 4279 4273 4574 4567 4562 4555 4561 4556 4575 4569 4563 4557 4562 4555 4576 4570 4564 4558 4563 4557 4577 4571 4565 4559 4564 4558 4578 4572 4566 4560 4565 4559 4579 4573 4567 4561 4566 4560 4580 4574 4568 4562 4567 4561 4581 4575 4569 4563 4568 4562 4582 4576 4570 4564 4569 4563 4583 4577 4571 4565 4570 4564 4584 4578 4572 4566 4571 4565 4585 4579 4574 4567 4573 4568 4586 4580 4575 4569 4574 4567 4587 4581 4576 4570 4575 4569 4588 4582 4577 4571 4576 4570 4589 4583 4578 4572 4577 4571 4590 4584 4579 4573 4578 4572 4591 4585 4580 4574 4579 4573 4592 4586 4581 4575 4580 4574 4593 4587 4582 4576 4581 4575 4594 4588 4583 4577 4582 4576 4595 4589 4584 4578 4583 4577 4597 4590 4585 4579 1308 1305 4598 4592 4586 4580 4585 4579 4599 4593 4587 4581 4586 4580 4600 4594 4588 4582 4587 4581 4601 4595 4589 4583 4588 4582 4602 4596 4590 4584 4589 4583 4603 4597 4591 4585 4590 4584 4604 4598 4592 4586 4591 4585 4605 4599 4593 4587 4592 4586 4606 4600 4594 4588 4593 4587 4607 4601 4595 4589 4594 4588 4609 4602 4597 4590 4596 4591 4610 4604 4598 4592 4597 4590 4611 4605 4599 4593 4598 4592 4612 4606 4600 4594 4599 4593 4613 4607 4601 4595 4600 4594 4614 4608 4602 4596 4601 4595 4615 4609 4603 4597 4602 4596 4616 4610 4604 4598 4603 4597 4617 4611 4605 4599 4604 4598 4618 4612 4606 4600 4605 4599 4619 4613 4607 4601 4606 4600 4620 4614 4609 4602 4608 4603 4621 4615 4610 4604 4609 4602 4622 4616 4611 4605 4610 4604 4623 4617 4612 4606 4611 4605 4624 4618 4613 4607 4612 4606 4625 4619 4614 4608 4613 4607 4626 4620 4615 4609 4614 4608 4627 4621 4616 4610 4615 4609 4628 4622 4617 4611 4616 4610 4629 4623 4618 4612 4617 4611 4630 4624 4619 4613 4618 4612 4631 4625 4632 4626 4620 4614 4632 4626 4633 4627 4621 4615 4633 4627 4634 4628 4622 4616 4634 4628 4635 4629 4623 4617 4635 4629 4636 4630 4624 4618 4636 4630 4637 4631 4625 4619 4637 4631 4638 4632 4626 4620 4638 4632 4639 4633 4627 4621 4639 4633 4640 4634 4628 4622 4640 4634 4641 4635 4629 4623 4641 4635 4642 4636 4630 4624 4643 4637 4644 4638 4632 4626 4644 4638 4645 4639 4633 4627 4645 4639 4646 4640 4634 4628 4646 4640 4647 4641 4635 4629 4647 4641 4648 4642 4636 4630 4648 4642 4649 4643 4637 4631 4649 4643 4650 4644 4638 4632 4650 4644 4651 4645 4639 4633 4651 4645 4652 4646 4640 4634 4652 4646 4653 4647 4641 4635 4653 4647 4654 4648 4642 4636 1236 1232 4655 4649 4644 4638 4655 4649 4656 4650 4645 4639 4656 4650 4657 4651 4646 4640 4657 4651 4658 4652 4647 4641 4658 4652 4659 4653 4648 4642 4659 4653 4660 4654 4649 4643 4660 4654 4661 4655 4650 4644 4661 4655 4662 4656 4651 4645 4662 4656 4663 4657 4652 4646 4663 4657 4664 4658 4653 4647 4664 4658 4665 4659 4654 4648 4666 4660 4667 4661 4655 4649 4667 4661 4668 4662 4656 4650 4668 4662 4669 4663 4657 4651 4669 4663 4670 4664 4658 4652 4670 4664 4671 4665 4659 4653 4671 4665 4672 4666 4660 4654 4672 4666 4673 4667 4661 4655 4673 4667 4674 4668 4662 4656 4674 4668 4675 4669 4663 4657 4675 4669 4676 4670 4664 4658 4676 4670 4677 4671 4665 4659 4678 4672 4679 4673 4667 4661 4679 4673 4680 4674 4668 4662 4680 4674 4681 4675 4669 4663 4681 4675 4682 4676 4670 4664 4682 4676 4683 4677 4671 4665 4683 4677 4684 4678 4672 4666 4684 4678 4685 4679 4673 4667 4685 4679 4686 4680 4674 4668 4686 4680 4687 4681 4675 4669 4687 4681 4688 4682 4676 4670 4688 4682 4689 4683 4677 4671 1203 1198 4423 4418 4679 4673 4423 4418 4425 4420 4680 4674 4425 4420 4427 4422 4681 4675 4427 4422 4429 4424 4682 4676 4429 4424 4431 4426 4683 4677 4431 4426 4433 4428 4684 4678 4433 4428 4435 4430 4685 4679 4435 4430 4437 4432 4686 4680 4437 4432 4439 4434 4687 4681 4439 4434 4441 4436 4688 4682 4441 4436 4443 4437 4689 4683

+
+
+
+
+ + + + + 10 0 0 0 0 10 0 3e-8 0 0 10 0 0 0 0 1 + + + + + + + +
diff --git a/third_party/ktx-src/tests/loadtests/common/models/torusknot.obj b/third_party/ktx-src/tests/loadtests/common/models/torusknot.obj new file mode 100644 index 0000000000000000000000000000000000000000..26f338bf7f49ac4ec8e17c8591825e0d8c4af24e --- /dev/null +++ b/third_party/ktx-src/tests/loadtests/common/models/torusknot.obj @@ -0,0 +1,7351 @@ +# Copyright 2020 The Khronos Group Inc. +# SPDX-License-Identifier: Apache-2.0 + +# Max2Obj Version 4.0 Mar 10th, 2001 +# +# object default to come ... +# +v 15.660946 -0.003400 7.140616 +v 16.623837 -2.092263 9.246682 +v 16.187216 -3.620506 11.929938 +v 14.468071 -4.178637 14.471407 +v 11.927050 -3.617106 16.190104 +v 9.245015 -2.086375 16.625505 +v 7.140616 0.003399 15.660946 +v 6.177724 2.092262 13.554880 +v 6.614346 3.620504 10.871625 +v 8.333488 4.178636 8.330156 +v 10.874509 3.617106 6.611460 +v 13.556543 2.086376 6.176056 +v 16.462965 0.729815 7.894794 +v 17.500208 -0.949694 10.309210 +v 17.118944 -2.030972 13.209470 +v 15.421336 -2.224293 15.818449 +v 12.862252 -1.477857 17.437077 +v 10.127401 0.008331 17.631639 +v 7.949581 1.836046 16.350008 +v 6.912336 3.515554 13.935593 +v 7.293598 4.596832 11.035334 +v 8.991206 4.790154 8.426353 +v 11.550287 4.043719 6.807726 +v 14.285141 2.557533 6.613161 +v 17.222685 1.696798 8.476895 +v 18.386761 0.562117 11.138371 +v 18.100492 0.015742 14.195420 +v 16.440586 0.204076 16.828911 +v 13.851812 1.076654 18.333199 +v 11.027830 2.399669 18.305212 +v 8.725326 3.818620 16.752451 +v 7.561249 4.953302 14.090977 +v 7.847516 5.499677 11.033926 +v 9.507421 5.311343 8.400437 +v 12.096194 4.438766 6.896148 +v 14.920176 3.115752 6.924132 +v 17.903679 2.943770 8.790598 +v 19.226376 2.479268 11.576409 +v 19.058125 2.539896 14.689936 +v 17.444008 3.109408 17.296909 +v 14.816529 4.035206 18.698795 +v 11.879718 5.069221 18.519957 +v 9.420492 5.934390 16.808317 +v 8.097796 6.398893 14.022507 +v 8.266047 6.338265 10.908981 +v 9.880162 5.768752 8.302008 +v 12.507640 4.842956 6.900121 +v 15.444449 3.808941 7.078956 +v 18.453142 4.485442 8.723570 +v 19.920918 4.764392 11.461060 +v 19.859074 5.462236 14.500010 +v 18.284185 6.391986 17.026134 +v 15.618238 7.304519 18.362562 +v 12.575574 7.955320 18.151199 +v 9.971472 8.170009 16.448679 +v 8.503695 7.891060 13.711191 +v 8.565536 7.193217 10.672241 +v 10.140425 6.263466 8.146115 +v 12.806370 5.350934 6.809686 +v 15.849034 4.700131 7.021048 +v 18.799183 6.297976 8.162218 +v 20.350073 7.304626 10.673676 +v 20.346804 8.604879 13.508345 +v 18.790253 9.850336 15.906679 +v 16.097492 10.707275 17.226048 +v 12.990051 10.946082 17.112925 +v 10.300562 10.502769 15.597624 +v 8.749670 9.496119 13.086166 +v 8.752938 8.195866 10.251497 +v 10.309488 6.950408 7.853163 +v 13.002245 6.093468 6.533794 +v 16.109688 5.854661 6.646914 +v 18.854580 8.314384 7.010524 +v 20.403906 9.951674 9.165725 +v 20.394840 11.762344 11.704903 +v 18.829813 13.261228 13.947682 +v 16.128170 14.046698 15.293116 +v 13.013818 13.908291 15.380693 +v 10.321241 12.883090 14.186952 +v 8.771915 11.245801 12.031751 +v 8.780980 9.435131 9.492575 +v 10.346006 7.936248 7.249794 +v 13.047647 7.150776 5.904360 +v 16.162001 7.289183 5.816781 +v 18.529339 10.419541 5.216613 +v 19.998974 12.554376 6.951171 +v 19.925346 14.760720 9.154044 +v 18.328190 16.447388 11.234972 +v 15.635459 17.162437 12.636375 +v 12.568669 16.714273 12.982746 +v 9.949564 15.222978 12.181276 +v 8.479931 13.088145 10.446720 +v 8.553556 10.881800 8.243848 +v 10.150711 9.195131 6.162919 +v 12.843442 8.480081 4.761516 +v 15.910231 8.928246 4.415143 +v 17.751842 12.455373 2.801124 +v 19.082010 14.959821 4.098974 +v 18.899794 17.454697 5.961344 +v 17.254017 19.271500 7.889211 +v 14.585665 19.923416 9.366007 +v 11.609720 19.235773 9.996024 +v 9.123586 17.392815 9.610451 +v 7.793417 14.888367 8.312601 +v 7.975633 12.393492 6.450232 +v 9.621408 10.576688 4.522364 +v 12.289760 9.924769 3.045568 +v 15.265704 10.612413 2.415550 +v 16.494225 14.238697 -0.121089 +v 17.640060 17.006639 0.745846 +v 17.317730 19.702570 2.280149 +v 15.613602 21.604116 4.070705 +v 12.984294 22.201761 5.637737 +v 10.134328 21.335367 6.561358 +v 7.827351 19.237080 6.594087 +v 6.681512 16.469139 5.727152 +v 7.003841 13.773208 4.192849 +v 8.707970 11.871661 2.402293 +v 11.337276 11.274014 0.835262 +v 14.187243 12.140409 -0.088361 +v 14.792074 15.594687 -3.341879 +v 15.715168 18.540148 -2.896698 +v 15.227655 21.367985 -1.675349 +v 13.460165 23.320482 -0.005092 +v 10.886295 23.874470 1.666530 +v 8.195713 22.881506 2.891606 +v 6.109356 20.607656 3.341879 +v 5.186262 17.662197 2.896699 +v 5.673774 14.834359 1.675350 +v 7.441263 12.881862 0.005094 +v 10.015131 12.327872 -1.666528 +v 12.705713 13.320834 -2.891605 +v 12.745848 16.397278 -6.594481 +v 13.406097 19.445118 -6.566779 +v 12.728996 22.347027 -5.646732 +v 10.895975 24.325439 -4.080865 +v 8.398190 24.850243 -2.288750 +v 5.904919 23.780815 -0.750584 +v 4.084234 21.403709 0.121483 +v 3.423985 18.355871 0.093782 +v 4.101085 15.453962 -0.826264 +v 5.934105 13.475549 -2.392131 +v 8.431890 12.950744 -4.184246 +v 10.925160 14.020168 -5.722412 +v 10.500126 16.597614 -9.611298 +v 10.849089 19.671982 -10.001834 +v 9.953882 22.592937 -9.375222 +v 8.054377 24.577818 -7.899363 +v 5.659543 25.094772 -5.969711 +v 3.411075 24.005283 -4.103316 +v 1.911448 21.601280 -2.800276 +v 1.562484 18.526915 -2.409740 +v 2.457689 15.605958 -3.036351 +v 4.357193 13.621078 -4.512209 +v 6.752027 13.104122 -6.441861 +v 9.000495 14.193609 -8.308255 +v 8.207661 16.227789 -12.182342 +v 8.184776 19.240313 -12.988693 +v 7.036245 22.119408 -12.645610 +v 5.069818 24.093626 -11.245021 +v 2.812394 24.633976 -9.162211 +v 0.868851 23.595671 -6.955271 +v -0.240041 21.256922 -5.215546 +v -0.217157 18.244400 -4.409195 +v 0.931373 15.365303 -4.752278 +v 2.897801 13.391086 -6.152867 +v 5.155223 12.850735 -8.235674 +v 7.098767 13.889039 -10.442615 +v 5.994843 15.379350 -14.188342 +v 5.530716 18.221020 -15.386476 +v 4.089674 20.985481 -15.301736 +v 2.057843 22.931997 -13.956833 +v -0.020349 23.539001 -11.712131 +v -1.588053 22.643848 -9.169095 +v -2.225203 20.486389 -7.009132 +v -1.761077 17.644720 -5.810999 +v -0.320036 14.880260 -5.895737 +v 1.711794 12.933742 -7.240640 +v 3.789986 12.326736 -9.485340 +v 5.357691 13.221890 -12.028375 +v 3.942928 14.170704 -15.599359 +v 2.975858 16.717300 -17.117796 +v 1.211409 19.286255 -17.232746 +v -0.877636 21.189219 -15.913412 +v -2.731520 21.916294 -13.513308 +v -3.853495 21.272663 -10.675538 +v -3.942930 19.430784 -8.160482 +v -2.975860 16.884190 -6.642047 +v -1.211412 14.315233 -6.527094 +v 0.877633 12.412269 -7.846426 +v 2.731517 11.685191 -10.246530 +v 3.853493 12.328822 -13.084298 +v 2.086504 12.718756 -16.450474 +v 0.592287 14.861341 -18.154196 +v -1.496367 17.167572 -18.365959 +v -3.619805 19.019499 -17.029020 +v -5.209053 19.920898 -14.501609 +v -5.838274 19.630239 -11.460948 +v -5.338868 18.225407 -8.721777 +v -3.844652 16.082823 -7.018054 +v -1.755999 13.776588 -6.806290 +v 0.367439 11.924663 -8.143228 +v 1.956688 11.023263 -10.670636 +v 2.585910 11.313920 -13.711297 +v 0.424937 11.123117 -16.810051 +v -1.559324 12.815009 -18.520678 +v -3.926045 14.838151 -18.698305 +v -6.041066 16.650444 -17.295343 +v -7.337668 17.766285 -14.687710 +v -7.468429 17.886688 -11.574122 +v -6.398311 16.979389 -8.788863 +v -4.414051 15.287498 -7.078238 +v -2.047330 13.264357 -6.900608 +v 0.067691 11.452062 -8.303569 +v 1.364294 10.336220 -10.911200 +v 1.495056 10.215817 -14.024787 +v -1.060723 9.462605 -16.753857 +v -3.445022 10.742734 -18.303829 +v -6.004488 12.524447 -18.329395 +v -8.053315 14.330337 -16.823708 +v -9.042521 15.676515 -14.190210 +v -8.707049 16.202274 -11.134551 +v -7.136789 15.766739 -8.475488 +v -4.752491 14.486610 -6.925517 +v -2.193025 12.704898 -6.899948 +v -0.144198 10.899010 -8.405636 +v 0.845009 9.552831 -11.039130 +v 0.509539 9.027070 -14.094790 +v -2.389844 7.799525 -16.350708 +v -5.064412 8.768617 -17.628822 +v -7.719601 10.392520 -17.431494 +v -9.643953 12.236112 -15.811597 +v -10.321842 13.805402 -13.203183 +v -9.571628 14.679901 -10.305176 +v -7.594329 14.625290 -7.894093 +v -4.919762 13.656199 -6.615979 +v -2.264573 12.032297 -6.813305 +v -0.340220 10.188705 -8.433201 +v 0.337671 8.619414 -11.041612 +v -0.412542 7.744914 -13.939621 +v -3.573221 6.182272 -15.660946 +v -6.436986 6.958163 -16.621609 +v -9.103381 8.515180 -16.183355 +v -10.857946 10.436121 -14.463614 +v -11.230551 12.206273 -11.923188 +v -10.121352 13.351322 -9.242785 +v -7.827561 13.564459 -7.140615 +v -4.963797 12.788569 -6.179952 +v -2.297402 11.231553 -6.618206 +v -0.542836 9.310613 -8.337946 +v -0.170231 7.540461 -10.878368 +v -1.279428 6.395409 -13.558772 +v -4.607167 4.648070 -14.740469 +v -7.580026 5.330908 -15.389983 +v -10.198205 6.892676 -14.732683 +v -11.760165 8.914901 -12.944691 +v -11.847381 10.855726 -10.505098 +v -10.436483 12.195112 -8.067591 +v -7.905520 12.574169 -6.285299 +v -4.932662 11.891331 -5.635785 +v -2.314483 10.329564 -6.293085 +v -0.752522 8.307341 -8.081076 +v -0.665305 6.366515 -10.520668 +v -2.076201 5.027128 -12.958174 +v -5.483558 3.218988 -13.645123 +v -8.508762 3.877059 -14.020761 +v -11.046376 5.486856 -13.187039 +v -12.416449 7.617035 -11.367351 +v -12.251870 9.696815 -9.049280 +v -10.596739 11.168923 -6.853952 +v -7.894546 11.638906 -5.369604 +v -4.869341 10.980837 -4.993964 +v -2.331727 9.371040 -5.827686 +v -0.961654 7.240862 -7.647374 +v -1.126231 5.161081 -9.965444 +v -2.781362 3.688972 -12.160772 +v -6.197084 1.902817 -12.429477 +v -9.239122 2.572718 -12.581989 +v -11.687390 4.247683 -11.619438 +v -12.885876 6.478907 -9.799741 +v -12.513446 8.668533 -7.610482 +v -10.669893 10.229856 -5.638273 +v -7.849196 10.744518 -4.411564 +v -4.807158 10.074618 -4.259052 +v -2.358891 8.399654 -5.221601 +v -1.160404 6.168431 -7.041298 +v -1.532832 3.978804 -9.230556 +v -3.376383 2.417481 -11.202766 +v -6.753824 0.694469 -11.141261 +v -9.794066 1.389137 -11.121590 +v -12.160327 3.128585 -10.072227 +v -13.218567 5.446730 -8.274352 +v -12.685231 7.722427 -6.209701 +v -10.703229 9.345904 -4.431497 +v -7.803635 9.882153 -3.416208 +v -4.763392 9.187487 -3.435879 +v -2.397132 7.448039 -4.485240 +v -1.338892 5.129895 -6.283115 +v -1.872225 2.854198 -8.347765 +v -3.854226 1.230720 -10.125971 +v -7.167943 -0.417369 -9.818399 +v -10.199439 0.299750 -9.670746 +v -12.500073 2.092449 -8.566510 +v -13.453394 4.480375 -6.801569 +v -12.803958 6.823685 -4.848838 +v -10.725783 8.494492 -3.231551 +v -7.775714 9.045104 -2.383058 +v -4.744220 8.327986 -2.530710 +v -2.443585 6.535288 -3.634947 +v -1.490264 4.147362 -5.399887 +v -2.139697 1.804052 -7.352617 +v -4.217870 0.133244 -8.969905 +v -7.459830 -1.446840 -8.487734 +v -10.482331 -0.717163 -8.246727 +v -12.736500 1.113124 -7.108833 +v -13.618334 3.553596 -5.378952 +v -12.891544 5.950331 -3.520601 +v -10.750876 7.661126 -2.031727 +v -7.769920 8.227573 -1.311270 +v -4.747419 7.497897 -1.552277 +v -2.493251 5.667611 -2.690170 +v -1.611416 3.227140 -4.420052 +v -2.338204 0.830405 -6.278401 +v -4.478869 -0.880390 -7.767276 +v -7.652333 -2.408571 -7.166126 +v -10.668480 -1.678447 -6.856609 +v -12.893852 0.173297 -5.696961 +v -13.732164 2.650490 -3.997909 +v -12.958790 5.089368 -2.214712 +v -10.780954 6.836436 -0.825177 +v -7.782207 7.423570 -0.201628 +v -4.766060 6.693447 -0.511145 +v -2.540687 4.841703 -1.670792 +v -1.702374 2.364512 -3.369844 +v -2.475747 -0.074367 -5.153040 +v -4.653582 -1.821436 -6.542576 +v -7.766745 -3.315559 -5.864392 +v -10.779755 -2.596657 -5.502484 +v -12.990548 -0.738544 -4.325268 +v -13.806744 1.760901 -2.648180 +v -13.009643 4.231953 -0.920594 +v -10.812828 6.012496 0.394586 +v -7.804935 6.625436 0.944957 +v -4.791926 5.906535 0.583049 +v -2.581133 4.048423 -0.594166 +v -1.764936 1.548979 -2.271253 +v -2.562035 -0.922074 -3.998840 +v -4.758847 -2.702618 -5.314020 +v -7.822847 -4.179983 -4.588487 +v -10.835104 -3.481726 -4.182569 +v -13.040862 -1.630163 -2.985749 +v -13.849089 0.878581 -1.318716 +v -13.043221 3.372290 0.371851 +v -10.839190 5.182777 1.632966 +v -7.827565 5.824924 2.126714 +v -4.815309 5.126667 1.720796 +v -2.609550 3.275105 0.523978 +v -1.801323 0.766362 -1.143055 +v -2.607189 -1.727347 -2.833622 +v -4.811218 -3.537835 -4.094737 +v -7.838037 -5.012915 -3.341963 +v -10.850429 -4.341489 -2.893957 +v -13.055653 -2.506764 -1.670521 +v -13.862821 -0.000350 0.000526 +v -13.055653 2.506160 1.671428 +v -10.850430 4.341148 2.894470 +v -7.838038 5.012932 3.341937 +v -4.825646 4.341508 2.893932 +v -2.620422 2.506783 1.670497 +v -1.813253 0.000370 -0.000550 +v -2.620420 -2.506140 -1.671453 +v -4.825642 -4.341129 -2.894495 +v -7.827653 -5.824646 -2.127128 +v -10.839254 -5.182905 -1.632704 +v -13.043243 -3.372785 -0.370989 +v -13.849064 -0.879305 1.319940 +v -13.040796 1.629408 2.987000 +v -10.835016 3.481147 4.183504 +v -7.822760 4.179740 4.588849 +v -4.811160 3.538000 4.094425 +v -2.607170 1.727881 2.832711 +v -1.801349 -0.765598 1.141783 +v -2.609614 -3.274311 -0.525277 +v -4.815393 -5.126051 -1.721782 +v -7.805285 -6.624900 -0.945739 +v -10.813106 -6.012306 -0.394584 +v -13.009772 -4.232154 0.921371 +v -13.806692 -1.761434 2.649518 +v -12.990329 0.737825 4.326801 +v -10.779428 2.595950 5.503794 +v -7.766398 3.315058 5.865122 +v -4.758579 2.702465 5.313968 +v -2.561911 0.922314 3.998014 +v -1.764990 -1.548405 2.269867 +v -2.581351 -4.047664 0.592584 +v -4.792251 -5.905790 -0.584409 +v -7.783046 -7.422705 0.200423 +v -10.781632 -6.835834 0.824993 +v -12.959126 -5.089184 2.215592 +v -13.732068 -2.650769 3.999610 +v -12.893351 -0.173961 5.699020 +v -10.667706 1.677583 6.858468 +v -7.651496 2.407743 7.167280 +v -4.652911 1.820872 6.542711 +v -2.475417 0.074224 5.152112 +v -1.702474 -2.364190 3.368095 +v -2.541189 -4.840999 1.668684 +v -4.766831 -6.692544 0.509236 +v -7.771285 -8.226487 1.309866 +v -10.751961 -7.660303 2.031688 +v -12.892058 -5.949986 3.521933 +v -13.618139 -3.553818 5.381289 +v -12.735652 -1.113847 7.111545 +v -10.481056 0.716137 8.249078 +v -7.458471 1.445792 8.489088 +v -4.477795 0.879608 7.767266 +v -2.337697 -0.830707 6.277022 +v -1.611615 -3.226876 4.417666 +v -2.494101 -5.666845 2.687411 +v -4.748695 -7.496830 1.549877 +v -7.778081 -9.043522 2.381240 +v -10.727651 -8.493041 3.231556 +v -12.804826 -6.822748 4.850658 +v -13.453030 -4.480197 6.804708 +v -12.498576 -2.093073 8.570122 +v -10.197211 -0.301003 9.673856 +v -7.165583 0.415828 9.820167 +v -4.216014 -0.134653 8.969851 +v -2.138839 -1.804945 7.350750 +v -1.490634 -4.147495 5.396701 +v -2.445086 -6.534619 3.631287 +v -4.746449 -8.326689 2.527552 +v -7.806747 -9.880287 3.414414 +v -10.705597 -9.344200 4.431918 +v -12.686219 -7.721335 6.212216 +v -13.217913 -5.446537 8.278281 +v -12.158206 -3.129337 10.076512 +v -9.791050 -1.390627 11.125073 +v -6.750721 -0.696292 11.143005 +v -3.851872 -1.232379 10.125504 +v -1.871248 -2.855243 8.345204 +v -1.339555 -5.130041 6.279140 +v -2.399259 -7.447240 4.480909 +v -4.766414 -9.185951 3.432346 +v -7.852993 -10.742368 4.409977 +v -10.672590 -10.228132 5.639390 +v -12.514323 -8.667693 7.613999 +v -12.884699 -6.479168 9.804708 +v -11.684476 -4.248971 11.624518 +v -9.235254 -2.574680 12.585814 +v -6.193300 -1.904922 12.431017 +v -3.373703 -2.419156 11.201604 +v -1.531970 -3.979595 9.226996 +v -1.161593 -6.168120 7.036288 +v -2.361814 -8.398317 5.216477 +v -4.811034 -10.072608 4.255180 +v -7.899740 -11.636011 5.368176 +v -10.600177 -11.166740 6.855944 +v -12.252632 -9.695924 9.054152 +v -12.414333 -7.617667 11.373792 +v -11.041952 -5.488836 13.193317 +v -8.503217 -3.879850 14.025187 +v -5.478379 -3.221835 13.646505 +v -2.777943 -3.691105 12.158739 +v -1.125487 -5.161920 9.960532 +v -0.963785 -7.240177 7.640893 +v -2.336164 -9.369007 5.821367 +v -4.874898 -10.977995 4.989495 +v -7.910900 -12.571130 6.284552 +v -10.439503 -12.193579 8.070510 +v -11.847235 -10.856104 10.510896 +v -11.756894 -8.917082 12.951809 +v -10.192688 -6.896069 14.739207 +v -7.573745 -5.334595 15.394161 +v -4.601809 -4.651058 14.741176 +v -2.073206 -5.028608 12.955218 +v -0.665474 -6.366082 10.514833 +v -0.755813 -8.305104 8.073921 +v -2.320017 -10.326117 6.286521 +v -4.938959 -11.887590 5.631566 +v -7.833267 -13.561144 7.140597 +v -10.123775 -13.350609 9.246604 +v -11.229046 -12.208344 11.929818 +v -10.852921 -10.440413 14.471272 +v -9.096184 -8.520536 16.189983 +v -6.429550 -6.963141 16.625429 +v -3.567543 -6.185532 15.660929 +v -1.277033 -6.396066 13.554923 +v -0.171762 -7.538333 10.871711 +v -0.547886 -9.306261 8.330257 +v -2.304622 -11.226138 6.611544 +v -4.971255 -12.783533 6.176097 +v -7.599634 -14.622120 7.894804 +v -9.572668 -14.680679 10.309288 +v -10.318343 -13.809911 13.209590 +v -9.636856 -12.243134 15.818578 +v -7.710813 -10.400167 17.437174 +v -5.056293 -8.774831 17.631676 +v -2.384573 -7.802634 16.349970 +v -0.411540 -7.744074 13.935486 +v 0.334136 -8.614843 11.035185 +v -0.347349 -10.181618 8.426197 +v -2.273392 -12.024585 6.807601 +v -4.927911 -13.649921 6.613097 +v -7.141916 -15.763635 8.476892 +v -8.706678 -16.204313 11.138347 +v -9.036758 -15.683143 14.195380 +v -8.043711 -14.339768 16.828863 +v -5.993621 -12.534146 18.333153 +v -3.435811 -10.750093 18.305180 +v -1.055643 -9.465643 16.752438 +v 0.509120 -9.024963 14.090981 +v 0.839200 -9.546135 11.033949 +v -0.153847 -10.889507 8.400467 +v -2.203935 -12.695129 6.896175 +v -4.761744 -14.479183 6.924148 +v -6.402459 -16.976910 8.790584 +v -7.466076 -17.890160 11.576390 +v -7.329452 -17.774769 14.689916 +v -6.029196 -16.661655 17.296896 +v -3.913710 -14.849076 18.698790 +v -1.549837 -12.822713 18.519962 +v 0.429024 -11.125525 16.808331 +v 1.492642 -10.212276 14.022526 +v 1.356019 -10.327666 10.908999 +v 0.055764 -11.440779 8.302020 +v -2.059721 -13.253356 6.900125 +v -4.423594 -15.279719 7.078951 +v -5.342093 -18.223579 8.723576 +v -5.834422 -19.634171 11.461069 +v -5.199166 -19.929523 14.500025 +v -3.606542 -19.030499 17.026154 +v -1.483292 -17.177990 18.362585 +v 0.601660 -14.868374 18.151218 +v 2.089653 -12.720512 16.448696 +v 2.581982 -11.309921 13.711202 +v 1.946727 -11.014566 10.672248 +v 0.354104 -11.913590 8.146119 +v -1.769145 -13.766099 6.809688 +v -3.854098 -16.075714 7.021050 +v -3.945395 -19.429543 8.162217 +v -3.849083 -21.275963 10.673686 +v -2.721425 -21.923244 13.508371 +v -0.864577 -21.197947 15.906722 +v 1.223922 -19.294415 17.226101 +v 2.984458 -16.722694 17.112982 +v 3.945299 -14.171881 15.597676 +v 3.848988 -12.325459 13.086207 +v 2.721331 -11.678177 10.251522 +v 0.864483 -12.403474 7.853172 +v -1.224015 -14.307005 6.533792 +v -2.984552 -16.878723 6.646909 +v -2.226876 -20.485712 7.010565 +v -1.583590 -22.646120 9.165755 +v -0.010962 -23.543608 11.704926 +v 2.069625 -22.937696 13.947704 +v 4.100678 -20.990740 15.293142 +v 5.537979 -18.224421 15.380731 +v 5.996403 -15.379974 14.186999 +v 5.353119 -13.219567 12.031809 +v 3.780491 -12.322077 9.492640 +v 1.699905 -12.927987 7.249861 +v -0.331148 -14.874943 5.904422 +v -1.768450 -17.641262 5.816833 +v -0.241182 -21.256622 5.216713 +v 0.872778 -23.596766 6.951315 +v 2.820320 -24.636169 9.154211 +v 5.079600 -24.096327 11.235135 +v 7.045248 -22.121887 12.636506 +v 8.190569 -19.241899 12.982827 +v 8.208675 -16.228054 12.181303 +v 7.094716 -13.887912 10.446702 +v 5.147175 -12.848506 8.243807 +v 2.887895 -13.388349 6.162883 +v 0.922247 -15.362787 4.761511 +v -0.223075 -18.242773 4.415188 +v 1.910728 -21.601234 2.801149 +v 3.414563 -24.005417 4.098997 +v 5.666286 -25.095049 5.961380 +v 8.062550 -24.578163 7.889274 +v 9.961277 -22.593260 9.366101 +v 10.853705 -19.672192 9.996147 +v 10.500710 -16.597656 9.610592 +v 8.996876 -14.193476 8.312745 +v 6.745153 -13.103843 6.450363 +v 4.348889 -13.620727 4.522469 +v 2.450162 -15.605627 3.045640 +v 1.557732 -18.526693 2.415593 +v 4.083869 -21.403786 -0.120956 +v 5.908016 -23.780090 0.746043 +v 8.403900 -24.848917 2.280383 +v 10.902751 -24.323872 4.070941 +v 12.735004 -22.345640 5.637937 +v 13.409710 -19.444290 6.561496 +v 12.746078 -16.397232 6.594151 +v 10.921934 -14.020928 5.727153 +v 8.426050 -12.952101 4.192813 +v 5.927199 -13.477145 2.402256 +v 4.094945 -15.455374 0.835259 +v 3.420239 -18.356724 -0.088301 +v 6.109364 -20.607651 -3.341894 +v 8.198625 -22.879824 -2.896652 +v 10.891316 -23.871569 -1.675226 +v 13.465932 -23.317152 -0.004896 +v 15.232606 -21.365124 1.666774 +v 15.717960 -18.538534 2.891863 +v 14.791943 -15.594761 3.342107 +v 12.702682 -13.322590 2.896866 +v 10.009992 -12.330841 1.675441 +v 7.435376 -12.885259 0.005111 +v 5.668701 -14.837284 -1.666559 +v 5.183347 -17.663874 -2.891648 +v 7.827480 -19.236927 -6.594368 +v 10.136860 -21.332642 -6.566659 +v 12.988535 -22.197212 -5.646609 +v 15.618402 -21.598974 -4.080743 +v 17.321791 -19.698227 -2.288635 +v 17.642279 -17.004274 -0.750477 +v 16.493994 -14.238957 0.121581 +v 14.184614 -12.143242 0.093874 +v 11.332939 -11.278671 -0.826176 +v 8.703072 -11.876908 -2.392041 +v 6.999682 -13.777653 -4.184149 +v 6.679193 -16.471605 -5.722308 +v 9.123846 -17.392275 -9.611174 +v 11.611872 -19.231617 -10.001781 +v 14.589119 -19.916782 -9.375227 +v 17.257839 -19.264177 -7.899400 +v 18.902950 -17.448669 -5.969745 +v 19.083647 -14.956722 -4.103311 +v 17.751509 -12.456052 -2.800209 +v 15.263485 -10.616709 -2.409602 +v 12.286237 -9.931543 -3.036155 +v 9.617517 -10.584147 -4.511981 +v 7.972404 -12.399652 -6.441636 +v 7.791708 -14.891599 -8.308069 +v 9.949833 -15.221990 -12.182291 +v 12.570203 -16.708420 -12.988656 +v 15.637840 -17.153309 -12.645576 +v 18.330772 -16.437449 -11.244978 +v 19.927437 -14.752656 -9.162151 +v 20.000004 -12.550367 -6.955187 +v 18.529028 -10.420687 -5.215440 +v 15.908661 -8.934258 -4.409075 +v 12.841024 -8.489369 -4.752154 +v 10.148089 -9.205228 -6.152752 +v 8.551426 -10.890019 -8.235577 +v 8.478857 -13.092307 -10.442541 +v 10.321498 -12.881318 -14.188387 +v 13.014523 -13.900242 -15.386487 +v 16.129131 -14.034554 -15.301697 +v 18.830772 -13.248263 -13.956738 +v 20.395538 -11.752056 -11.711989 +v 20.404156 -9.946841 -9.168930 +v 18.854313 -8.316322 -7.008973 +v 16.161289 -7.297398 -5.810873 +v 13.046679 -7.163086 -5.895661 +v 10.345040 -7.949376 -7.240619 +v 8.780272 -9.445582 -9.485365 +v 8.771653 -11.250796 -12.028424 +v 10.300734 -10.500094 -15.599331 +v 12.989688 -10.935893 -17.117762 +v 16.096695 -10.692322 -17.232706 +v 18.789232 -9.834647 -15.913366 +v 20.345840 -8.592681 -13.513258 +v 20.349422 -7.299209 -10.675488 +v 18.799025 -6.300813 -8.160435 +v 16.110071 -5.865015 -6.642005 +v 13.003066 -6.108585 -6.527059 +v 10.310528 -6.966259 -7.846397 +v 8.753920 -8.208225 -10.246504 +v 8.750334 -9.501698 -13.084274 +v 9.971531 -8.166462 -16.450436 +v 12.574179 -7.943764 -18.154156 +v 15.615765 -7.288072 -18.365923 +v 18.281300 -6.375076 -17.028992 +v 19.856556 -5.449414 -14.501593 +v 19.919447 -4.759115 -11.460942 +v 18.453117 -4.489146 -8.721779 +v 15.850472 -4.711843 -7.018058 +v 12.808886 -5.367536 -6.806291 +v 10.143350 -6.280531 -8.143221 +v 8.568092 -7.206193 -10.670617 +v 8.505201 -7.896492 -13.711268 +v 9.420460 -5.929655 -16.810045 +v 11.877805 -5.057171 -18.520674 +v 14.813254 -4.019090 -18.698307 +v 17.440254 -3.093564 -17.295349 +v 19.054907 -2.528588 -14.687720 +v 19.224562 -2.475545 -11.574132 +v 17.903763 -2.948650 -8.788871 +v 15.446420 -3.821133 -7.078241 +v 12.510971 -4.859214 -6.900606 +v 9.883970 -5.784740 -8.303564 +v 8.269319 -6.349717 -10.911191 +v 8.099660 -6.402761 -14.024778 +v 8.725252 -3.812991 -16.753815 +v 11.025984 -2.388186 -18.303844 +v 13.848694 -1.062412 -18.329468 +v 16.437040 -0.190909 -16.823822 +v 18.097477 -0.007196 -14.190340 +v 18.385092 -0.560498 -11.134665 +v 17.222818 -1.702558 -8.475559 +v 14.922089 -3.127364 -6.925529 +v 12.099379 -4.453137 -6.899904 +v 9.511033 -5.324641 -8.405550 +v 7.850595 -5.508355 -11.039029 +v 7.562979 -4.955054 -14.094706 +v 7.949543 -1.830241 -16.350725 +v 10.126071 0.001457 -17.628862 +v 12.859996 1.488988 -17.431557 +v 15.418765 2.233770 -15.811672 +v 17.116760 2.036240 -13.203259 +v 17.499001 0.949325 -10.305236 +v 16.463070 -0.735737 -7.894130 +v 14.286543 -2.567434 -6.615992 +v 11.552619 -4.054966 -6.813297 +v 8.993850 -4.799748 -8.433180 +v 7.295855 -4.602219 -11.041593 +v 6.913611 -3.515305 -13.939614 +v 7.140652 0.003355 -15.660982 +v 9.244494 2.095484 -16.621643 +v 11.926122 3.626116 -16.183388 +v 14.466993 4.185119 -14.463647 +v 16.186287 3.622709 -11.923223 +v 16.623318 2.089583 -9.242821 +v 15.660982 -0.003458 -7.140652 +v 13.557141 -2.095586 -6.179991 +v 10.875514 -3.626219 -6.618245 +v 8.334642 -4.185223 -8.337985 +v 6.615348 -3.622814 -10.878408 +v 6.178317 -2.089690 -13.558810 +v 6.328969 1.666230 -14.740465 +v 8.406857 3.899313 -15.389892 +v 11.068551 5.385684 -14.732540 +v 13.600853 5.727071 -12.944546 +v 15.325236 4.832000 -10.505001 +v 15.779652 2.940306 -8.067580 +v 14.842340 0.558865 -6.285388 +v 12.764456 -1.674217 -5.635961 +v 10.102762 -3.160589 -6.293311 +v 7.570459 -3.501977 -8.081305 +v 5.846075 -2.606908 -10.520848 +v 5.391658 -0.715214 -12.958269 +v 5.529537 3.139230 -13.645201 +v 7.612005 5.430130 -14.020866 +v 10.274910 6.822931 -13.187154 +v 12.804726 6.944432 -11.367457 +v 14.523591 5.762076 -9.049363 +v 14.970938 3.592676 -6.854002 +v 14.026899 1.017522 -5.369619 +v 11.944431 -1.273379 -4.993954 +v 9.281528 -2.666180 -5.827665 +v 6.751713 -2.787681 -7.647361 +v 5.032847 -1.605327 -9.965454 +v 4.585498 0.564071 -12.160816 +v 4.746467 4.415694 -12.429417 +v 6.847730 6.715144 -12.581884 +v 9.522493 7.997782 -11.619331 +v 12.054055 7.919927 -9.799673 +v 13.764087 6.502438 -7.610485 +v 14.194386 4.125132 -5.638359 +v 13.229654 1.425005 -4.411724 +v 11.128393 -0.874445 -4.259256 +v 8.453630 -2.157084 -5.221808 +v 5.922069 -2.079229 -7.041466 +v 4.212036 -0.661742 -9.230654 +v 3.781735 1.715564 -11.202780 +v 3.978373 5.501783 -11.141281 +v 6.100116 7.787357 -11.121606 +v 8.789669 8.966842 -10.072250 +v 11.326367 8.724195 -8.274388 +v 13.030506 7.124437 -6.209754 +v 13.445461 4.596217 -4.431568 +v 12.460047 1.816974 -3.416291 +v 10.338305 -0.468599 -3.435966 +v 7.648753 -1.648084 -4.485321 +v 5.112054 -1.405439 -6.283182 +v 3.407914 0.194318 -8.347815 +v 2.992958 2.722536 -10.126002 +v 3.222563 6.416106 -9.818563 +v 5.359309 8.682942 -9.670937 +v 8.062113 9.779079 -8.566690 +v 10.606761 9.410809 -6.801705 +v 12.311417 7.676805 -4.848909 +v 12.719317 5.041698 -3.231551 +v 11.721169 2.211559 -2.383002 +v 9.584424 -0.055278 -2.530627 +v 6.881620 -1.151415 -3.634872 +v 4.336972 -0.783145 -5.399856 +v 2.632316 0.950855 -7.352653 +v 2.224413 3.585963 -8.970011 +v 2.476927 7.183930 -8.487682 +v 4.620164 9.436595 -8.246714 +v 7.332376 10.473539 -7.108877 +v 9.886831 10.016916 -5.379054 +v 11.599062 8.189076 -3.520751 +v 12.010280 5.479789 -2.031897 +v 11.010299 2.615005 -1.311430 +v 8.867064 0.362340 -1.552398 +v 6.154850 -0.674605 -2.690234 +v 3.600396 -0.217983 -4.420056 +v 1.888164 1.609855 -6.278359 +v 1.476945 4.319142 -7.767214 +v 1.740319 7.831358 -7.166200 +v 3.880723 10.078341 -6.856735 +v 6.597084 11.079692 -5.697119 +v 9.161554 10.567100 -3.998071 +v 10.886989 8.677913 -2.214850 +v 11.311056 5.918338 -0.825268 +v 10.320129 3.027801 -0.201663 +v 8.179727 0.780818 -0.511127 +v 5.463367 -0.220533 -1.670743 +v 2.898895 0.292058 -3.369789 +v 1.173461 2.181243 -5.153010 +v 0.749391 4.940817 -6.542593 +v 1.012027 8.383993 -5.864398 +v 3.141127 10.633878 -5.502488 +v 5.855708 11.619409 -4.325284 +v 8.428399 11.076513 -2.648218 +v 10.169851 9.150661 -0.920658 +v 10.613441 6.357881 0.394498 +v 9.640312 3.446498 0.944854 +v 7.511213 1.196614 0.582945 +v 4.796633 0.211082 -0.594258 +v 2.223942 0.753976 -2.271324 +v 0.482490 2.679828 -3.998884 +v 0.038897 5.472606 -5.314040 +v 0.291484 8.864756 -4.588543 +v 2.402354 11.124298 -4.182683 +v 5.108757 12.108744 -2.985906 +v 7.685514 11.554312 -1.318887 +v 9.442186 9.609560 0.371697 +v 9.908074 6.795586 1.632855 +v 8.958344 3.866390 2.126662 +v 6.847476 1.606847 1.720802 +v 4.141073 0.622401 0.524025 +v 1.564316 1.176832 -1.142993 +v -0.192358 3.121581 -2.833576 +v -0.658247 5.935555 -4.094735 +v -0.422251 9.294373 -3.342035 +v 1.665405 11.567474 -2.894009 +v 4.356924 12.559898 -1.670553 +v 6.931118 12.005724 0.000508 +v 8.698233 10.053444 1.671415 +v 9.184772 7.226167 2.894449 +v 8.260366 4.281462 3.341901 +v 6.172712 2.008360 2.893875 +v 3.481193 1.015935 1.670419 +v 0.906999 1.570108 -0.000641 +v -0.860116 3.522387 -1.671548 +v -1.346656 6.349663 -2.894583 +v -1.130457 9.691257 -2.127146 +v 0.931116 11.978506 -1.632742 +v 3.600734 12.982152 -0.371053 +v 6.163074 12.433270 1.319853 +v 7.931561 10.478931 2.986899 +v 8.432329 7.642801 4.183402 +v 7.531199 4.684817 4.588758 +v 5.469626 2.397568 4.094355 +v 2.800009 1.393921 2.832666 +v 0.237668 1.942802 1.141760 +v -1.530819 3.897138 -0.525285 +v -2.031589 6.733268 -1.721788 +v -1.834612 10.072011 -0.945844 +v 0.199863 12.370537 -0.394744 +v 2.839874 13.382812 0.921186 +v 5.378031 12.837596 2.649342 +v 7.134237 10.880980 4.326667 +v 7.637918 8.037239 5.503724 +v 6.754114 5.068348 5.865119 +v 4.719639 2.769822 5.314019 +v 2.079629 1.757547 3.998090 +v -0.458527 2.302762 2.269934 +v -2.214734 4.259376 0.592609 +v -2.718417 7.103117 -0.584448 +v -2.536719 10.451645 0.200396 +v -0.529214 12.755080 0.825005 +v 2.072158 13.767536 2.215626 +v 4.570361 13.217724 3.999642 +v 6.296005 11.252968 5.699028 +v 6.786704 8.399721 6.858435 +v 5.910976 5.422510 7.167199 +v 3.903472 3.119074 6.542590 +v 1.302101 2.106618 5.151970 +v -1.196102 2.656428 3.367955 +v -2.921747 4.621183 1.668569 +v -3.412447 7.474429 0.509162 +v -3.238711 10.843341 1.309850 +v -1.258047 13.141599 2.031656 +v 1.293188 14.139832 3.521878 +v 3.731391 13.570562 5.381213 +v 5.403248 11.586327 7.111452 +v 5.860786 8.718799 8.248980 +v 4.981410 5.736331 8.488997 +v 3.000746 3.438073 7.767191 +v 0.449512 2.439841 6.276969 +v -1.988690 3.009109 4.417635 +v -3.660548 4.993342 2.687396 +v -4.118089 7.860869 1.549868 +v -3.943067 11.257649 2.381349 +v -1.991655 13.536894 3.231681 +v 0.493433 14.500725 4.850752 +v 2.846322 13.890884 6.804732 +v 4.436555 11.870781 8.570055 +v 4.838032 8.981697 9.673702 +v 3.943177 5.997762 9.819954 +v 1.991766 3.718518 8.969622 +v -0.493322 2.754687 7.350552 +v -2.846210 3.364525 5.396572 +v -4.436445 5.384627 3.631249 +v -4.837923 8.273710 2.527601 +v -4.653071 11.701023 3.414312 +v -2.739368 13.943431 4.431846 +v -0.343628 14.847237 6.212181 +v 1.892212 14.170265 8.278278 +v 3.369061 12.093912 10.076529 +v 3.691197 9.174534 11.125090 +v 2.772306 6.194376 11.143005 +v 0.858603 3.951969 10.125472 +v -1.537136 3.048162 8.345138 +v -3.772976 3.725132 6.279041 +v -5.249825 5.801484 4.480792 +v -5.571963 8.720860 3.432227 +v -5.376552 12.172102 4.409901 +v -3.521431 14.356815 5.639365 +v -1.249217 15.171562 7.614018 +v 0.831253 14.398033 9.804754 +v 2.162518 12.243492 11.624566 +v 2.387868 9.285251 12.585836 +v 1.446919 6.315964 12.430994 +v -0.408200 4.131251 11.201531 +v -2.680414 3.316503 9.226879 +v -4.760884 4.090031 7.036144 +v -6.092150 6.244569 5.216332 +v -6.317501 9.202810 4.255060 +v -6.127293 12.659294 5.368171 +v -4.370651 14.763338 6.855866 +v -2.270608 15.459044 9.054011 +v -0.389868 14.559996 11.373614 +v 0.767625 12.307096 13.193140 +v 0.891724 9.304006 14.025047 +v -0.050825 6.355401 13.646428 +v -1.807466 4.251357 12.158733 +v -3.907508 3.555650 9.960590 +v -5.788249 4.454696 7.640987 +v -6.945743 6.707594 5.821462 +v -7.069842 9.710684 4.989552 +v -6.931525 13.136537 6.284533 +v -5.340287 15.137632 8.070479 +v -3.478130 15.688070 10.510851 +v -1.844017 14.640359 12.951753 +v -0.875808 12.275235 14.739148 +v -0.832932 9.226428 15.394104 +v -1.726880 6.310867 14.741127 +v -3.318117 4.309771 12.955183 +v -5.180274 3.759332 10.514812 +v -6.814387 4.807041 8.073910 +v -7.782598 7.172164 6.286515 +v -7.825473 10.220970 5.631557 +v -7.827671 13.564346 7.140573 +v -6.500120 15.442738 9.246585 +v -4.958262 15.828817 11.929800 +v -3.615237 14.619139 14.471253 +v -2.830907 12.137832 16.189964 +v -2.815432 9.049762 16.625406 +v -3.572959 6.182375 15.660903 +v -4.900509 4.303984 13.554893 +v -6.442367 3.917902 10.871678 +v -7.785392 5.127579 8.330225 +v -8.569723 7.608884 6.611513 +v -8.585198 10.696955 6.176069 +v -8.863209 13.892570 7.894796 +v -7.927368 15.630528 10.309280 +v -6.800410 15.840893 13.209580 +v -5.784303 14.467299 15.818563 +v -5.151310 11.877800 17.437153 +v -5.071044 8.766249 17.631653 +v -5.565010 5.966384 16.349947 +v -6.500851 4.228426 13.935463 +v -7.627808 4.018059 11.035164 +v -8.643915 5.391651 8.426182 +v -9.276908 7.981149 6.807589 +v -9.357175 11.092701 6.613088 +v -10.080903 14.066797 8.476833 +v -9.680193 15.642314 11.138262 +v -9.063778 15.667653 14.195290 +v -8.396826 14.136024 16.828787 +v -7.858045 11.457826 18.333113 +v -7.591802 8.350680 18.305182 +v -7.669436 5.647143 16.752481 +v -8.070146 4.071625 14.091053 +v -8.686561 4.046284 11.034027 +v -9.353513 5.577912 8.400528 +v -9.892294 8.256109 6.896202 +v -10.158537 11.363256 6.924130 +v -11.501132 14.033176 8.790604 +v -11.760205 15.410911 11.576415 +v -11.728584 15.234884 14.689940 +v -11.414742 13.552260 17.296911 +v -10.902773 10.813896 18.698793 +v -10.329858 7.753535 18.519955 +v -9.849509 5.191199 16.808313 +v -9.590436 3.813462 14.022503 +v -9.622057 3.989488 10.908978 +v -9.935899 5.672111 8.302006 +v -10.447868 8.410475 6.900122 +v -11.020783 11.470835 7.078959 +v -13.110920 13.738241 8.723636 +v -14.086302 14.869904 11.461151 +v -14.659694 14.467417 14.500108 +v -14.677453 12.638627 17.026217 +v -14.134824 9.873553 18.362614 +v -13.177200 6.913099 18.151209 +v -12.061178 4.550514 16.448650 +v -11.085796 3.418850 13.711135 +v -10.512405 3.821335 10.672179 +v -10.494645 5.650126 8.146069 +v -11.037274 8.415197 6.809671 +v -11.994897 11.375651 7.021074 +v -14.853767 13.131588 8.162225 +v -16.501028 13.971365 10.673665 +v -17.625458 13.318406 13.508330 +v -17.925770 11.347673 15.906674 +v -17.321495 8.587222 17.226061 +v -15.974546 5.776713 17.112965 +v -14.245839 3.669219 15.597688 +v -12.598579 2.829443 13.086247 +v -11.474147 3.482399 10.251583 +v -11.173835 5.453131 7.853240 +v -11.778111 8.213582 6.533851 +v -13.125058 11.024091 6.646946 +v -16.627674 12.171412 7.010600 +v -18.820257 12.694530 9.165814 +v -20.383808 11.781343 11.704993 +v -20.899372 9.676541 13.947764 +v -20.228806 6.944103 15.293181 +v -18.551786 4.316184 15.380739 +v -16.317669 2.496931 14.186978 +v -14.125086 1.973812 12.031765 +v -12.561536 2.886997 9.492586 +v -12.045971 4.991798 7.249814 +v -12.716537 7.724236 5.904396 +v -14.393555 10.352157 5.816837 +v -18.288183 10.837183 5.216717 +v -20.871824 11.042500 6.951269 +v -22.745775 9.875554 9.154125 +v -23.407907 7.649025 11.235034 +v -22.680807 4.959512 12.636415 +v -20.759300 2.527667 12.982772 +v -18.158251 1.005100 12.181297 +v -15.574610 0.799782 10.446747 +v -13.700662 1.966728 8.243890 +v -13.038527 4.193254 6.162982 +v -13.765625 6.882768 4.761600 +v -15.687131 9.314613 4.415242 +v -19.662584 9.145872 2.801142 +v -22.496592 9.045594 4.098975 +v -24.566107 7.640352 5.961344 +v -25.316608 5.306679 7.889231 +v -24.546995 2.669881 9.366058 +v -22.463488 0.436487 9.996112 +v -19.624357 -0.795069 9.610570 +v -16.790352 -0.694791 8.312738 +v -14.720834 0.710450 6.450368 +v -13.970334 3.044122 4.522481 +v -14.739945 5.680920 3.045653 +v -16.823452 7.914315 2.415599 +v -20.578175 7.165105 -0.121033 +v -23.548185 6.773514 0.745984 +v -25.721750 5.146445 2.280351 +v -26.516468 2.719872 4.070935 +v -25.719393 0.143992 5.637951 +v -23.544100 -1.890990 6.561518 +v -20.573456 -2.839802 6.594166 +v -17.603447 -2.448210 5.727149 +v -15.429879 -0.821143 4.192782 +v -14.635162 1.605430 2.402198 +v -15.432237 4.181310 0.835183 +v -17.607527 6.216292 -0.088384 +v -20.901432 5.012963 -3.341890 +v -23.913822 4.339675 -2.896677 +v -26.119045 2.503587 -1.675286 +v -26.926212 -0.003325 -0.004988 +v -26.119045 -2.509336 1.666663 +v -23.913822 -4.342962 2.891748 +v -20.901432 -5.012884 3.342008 +v -17.889044 -4.339598 2.896796 +v -15.683820 -2.503510 1.675405 +v -14.876652 0.003402 0.005108 +v -15.683817 2.509413 -1.666543 +v -17.889038 4.343039 -2.891629 +v -20.573393 2.839624 -6.594430 +v -23.543018 1.887475 -6.566760 +v -25.717590 -0.149881 -5.646736 +v -26.514433 -2.726537 -4.080879 +v -25.720036 -5.152081 -2.288759 +v -23.547253 -6.776588 -0.750572 +v -20.578283 -7.164776 0.121524 +v -17.608660 -6.212628 0.093854 +v -15.434088 -4.175273 -0.826169 +v -14.637243 -1.598617 -2.392025 +v -15.431639 0.826927 -4.184145 +v -17.604420 2.451436 -5.722332 +v -19.624077 0.794654 -9.611174 +v -22.460979 -0.440409 -10.001840 +v -24.542946 -2.676243 -9.375348 +v -25.312115 -5.313756 -7.899568 +v -24.562386 -7.646231 -5.969932 +v -22.494648 -9.048681 -4.103485 +v -19.662952 -9.145322 -2.800340 +v -16.826050 -7.910260 -2.409672 +v -14.744083 -5.674427 -3.036163 +v -13.974915 -3.036913 -4.511943 +v -14.724643 -0.704439 -6.441579 +v -16.792377 0.698013 -8.308026 +v -18.157486 -1.005874 -12.182375 +v -20.754940 -2.531981 -12.988762 +v -22.674036 -4.966195 -12.645690 +v -23.400555 -7.656271 -11.245088 +v -22.739824 -9.881405 -9.162243 +v -20.868889 -11.045374 -6.955255 +v -18.289063 -10.836294 -5.215481 +v -15.691610 -9.310189 -4.409095 +v -13.772513 -6.875976 -4.752166 +v -13.045995 -4.185900 -6.152767 +v -13.706722 -1.960765 -8.235610 +v -15.577657 -0.796794 -10.442599 +v -16.316353 -2.497970 -14.188320 +v -18.545292 -4.320722 -15.386417 +v -20.218889 -6.950913 -15.301657 +v -20.888712 -9.683785 -13.956752 +v -20.375277 -11.787069 -11.712069 +v -18.816158 -12.697191 -9.169066 +v -16.629124 -12.170284 -7.009143 +v -14.400187 -10.347534 -5.811046 +v -12.726586 -7.717342 -5.895805 +v -12.056765 -4.984470 -7.240709 +v -12.570199 -2.881186 -9.485392 +v -14.129315 -1.971063 -12.028393 +v -14.243655 -3.670675 -15.599360 +v -15.965478 -5.781507 -17.117825 +v -17.307991 -8.594064 -17.232798 +v -17.911469 -11.354718 -15.913472 +v -17.614208 -13.323759 -13.513358 +v -16.495863 -13.973582 -10.675567 +v -14.856092 -13.130068 -8.160482 +v -13.134270 -11.019236 -6.642017 +v -11.791757 -8.206682 -6.527043 +v -11.188278 -5.446026 -7.846367 +v -11.485537 -3.476984 -10.246480 +v -12.603881 -2.827160 -13.084270 +v -12.057949 -4.552451 -16.450510 +v -13.166332 -6.917793 -18.154232 +v -14.119248 -9.879743 -18.365984 +v -14.661364 -12.644645 -17.029026 +v -14.647418 -14.471647 -14.501601 +v -14.081150 -14.871206 -11.460923 +v -13.114290 -13.736263 -8.721744 +v -12.005907 -11.370920 -7.018022 +v -11.052991 -8.408973 -6.806270 +v -10.510876 -5.644070 -8.143224 +v -10.524820 -3.817066 -10.670650 +v -11.091087 -3.417505 -13.711328 +v -9.845374 -5.193546 -16.810047 +v -10.318458 -7.757911 -18.520676 +v -10.887181 -10.819123 -18.698309 +v -11.399156 -13.556935 -17.295349 +v -11.717196 -15.237752 -14.687720 +v -11.756085 -15.411199 -11.574133 +v -11.505403 -14.030804 -8.788871 +v -11.032319 -11.466440 -7.078241 +v -10.463595 -8.405227 -6.900607 +v -9.951621 -5.667415 -8.303564 +v -9.633581 -3.986597 -10.911192 +v -9.594690 -3.813148 -14.024779 +v -7.664592 -5.649853 -16.753822 +v -7.581054 -8.354763 -18.303827 +v -7.844291 -11.462186 -18.329426 +v -8.383767 -14.139490 -16.823761 +v -9.054933 -15.669296 -14.190273 +v -9.677946 -15.641691 -11.134604 +v -10.085874 -14.064075 -8.475517 +v -10.169411 -11.359167 -6.925512 +v -9.906175 -8.251744 -6.899912 +v -9.366699 -5.574439 -8.405576 +v -8.695535 -4.044632 -11.039063 +v -8.072520 -4.072235 -14.094731 +v -5.559308 -5.969616 -16.350746 +v -5.061334 -8.770462 -17.628754 +v -5.140209 -11.881866 -17.431337 +v -5.774800 -14.470127 -15.811395 +v -6.795067 -15.841725 -13.202986 +v -7.927632 -15.629142 -10.305033 +v -8.869024 -13.889338 -7.894041 +v -9.366998 -11.088492 -6.616032 +v -9.288123 -7.977089 -6.813447 +v -8.653533 -5.388827 -8.433390 +v -7.633266 -4.017227 -11.041798 +v -6.500702 -4.229809 -13.939749 +v -3.567669 -6.185463 -15.660933 +v -2.807666 -9.053452 -16.621691 +v -2.822761 -12.141137 -16.183508 +v -3.608907 -14.621173 -14.463794 +v -4.955459 -15.829038 -11.923345 +v -6.501608 -15.441086 -9.242870 +v -7.833065 -13.561266 -7.140603 +v -8.593068 -10.693277 -6.179844 +v -8.577974 -7.605593 -6.618026 +v -7.791828 -5.125556 -8.337740 +v -6.445277 -3.917690 -10.878188 +v -4.899128 -4.305642 -13.558662 +v -1.721814 -6.313907 -14.740459 +v -0.826661 -9.229877 -15.389956 +v -0.870024 -12.278167 -14.732640 +v -1.840283 -14.641994 -12.944639 +v -3.477459 -15.687969 -10.505045 +v -5.342871 -15.135826 -8.067547 +v -6.936684 -13.133510 -6.285269 +v -7.831837 -10.217541 -5.635772 +v -7.788476 -7.169249 -6.293087 +v -6.818217 -4.805423 -8.081088 +v -5.181042 -3.759446 -10.520681 +v -3.315630 -4.311589 -12.958180 +v -0.046065 -6.358297 -13.645137 +v 0.896702 -9.307211 -14.020798 +v 0.771477 -12.309753 -13.187082 +v -0.388188 -14.561396 -11.367381 +v -2.271560 -15.458812 -9.049282 +v -4.373991 -14.761540 -6.853919 +v -6.132137 -12.656414 -5.369537 +v -7.074905 -9.707500 -4.993875 +v -6.949680 -6.704958 -5.827591 +v -5.790017 -4.453316 -7.647291 +v -3.906646 -3.555899 -9.965389 +v -1.804214 -4.253169 -12.160752 +v 1.450919 -6.318370 -12.429347 +v 2.391790 -9.287808 -12.581709 +v 2.165301 -12.245522 -11.619075 +v 0.832141 -14.398991 -9.799382 +v -1.250472 -15.171195 -7.610216 +v -3.524504 -14.355225 -5.638162 +v -5.380628 -12.169718 -4.411630 +v -6.321500 -9.200278 -4.259268 +v -6.095012 -6.242566 -5.221902 +v -4.761852 -4.089097 -7.041594 +v -2.679240 -3.316890 -9.230759 +v -0.405209 -4.132860 -11.202813 +v 2.775447 -6.196167 -11.141261 +v 3.694032 -9.176408 -11.121563 +v 3.370821 -12.095371 -10.072171 +v 1.892418 -14.170919 -8.274270 +v -0.345040 -14.846913 -6.209605 +v -2.742028 -13.942220 -4.431402 +v -4.656274 -11.699252 -3.416129 +v -5.574859 -8.719011 -3.435827 +v -5.251648 -5.800050 -4.485218 +v -3.773247 -3.724500 -6.283118 +v -1.535790 -3.048505 -8.347783 +v 0.861198 -3.953196 -10.125986 +v 3.945380 -5.998884 -9.818410 +v 4.840099 -8.982794 -9.670792 +v 4.437925 -11.871559 -8.566566 +v 2.846622 -13.891140 -6.801609 +v 0.492576 -14.500389 -4.848839 +v -1.993447 -13.536060 -3.231500 +v -3.945319 -11.256544 -2.382956 +v -4.840038 -8.272636 -2.530574 +v -4.437865 -5.383871 -3.634799 +v -2.846563 -3.364290 -5.399755 +v -0.492518 -2.755039 -7.352525 +v 1.993505 -3.719366 -8.969864 +v 4.983056 -5.737009 -8.487594 +v 5.862326 -8.719429 -8.246605 +v 5.404262 -11.586744 -7.108750 +v 3.731603 -13.570656 -5.378914 +v 1.292536 -14.139579 -3.520607 +v -1.259392 -13.141069 -2.031759 +v -3.240395 -10.842679 -1.311307 +v -4.119665 -7.860259 -1.552295 +v -3.661602 -4.992945 -2.690150 +v -1.988945 -3.009033 -4.419985 +v 0.450121 -2.440108 -6.278293 +v 3.002049 -3.438615 -7.767141 +v 5.912042 -5.422799 -7.166115 +v 6.787820 -8.399920 -6.856611 +v 6.296868 -11.253024 -5.696960 +v 4.570736 -13.217625 -3.997890 +v 2.071940 -13.767308 -2.214665 +v -0.529969 -12.754788 -0.825098 +v -2.537812 -10.451368 -0.201524 +v -3.413591 -7.474249 -0.511027 +v -2.922640 -4.621145 -1.670678 +v -1.196509 -2.656544 -3.369747 +v 1.302285 -2.106859 -5.152972 +v 3.904195 -3.119377 -6.542540 +v 6.754731 -5.068396 -5.864375 +v 7.638689 -8.037172 -5.502420 +v 7.134953 -10.880820 -4.325159 +v 5.378496 -12.837385 -2.648036 +v 2.839962 -13.382608 -0.920437 +v 0.199548 -12.370398 0.394730 +v -1.835249 -10.071974 0.945068 +v -2.719208 -7.103198 0.583114 +v -2.215472 -4.259551 -0.594147 +v -0.459017 -2.302985 -2.271269 +v 2.079516 -1.757761 -3.998868 +v 4.719931 -2.769970 -5.314036 +v 7.531441 -4.684770 -4.588411 +v 8.432865 -7.642588 -4.182486 +v 7.932244 -10.478609 -2.985663 +v 6.163721 -12.432926 -1.318631 +v 3.601168 -12.981879 0.371931 +v 0.931221 -11.978378 1.633038 +v -1.130711 -9.691311 2.126778 +v -2.032136 -6.733494 1.720854 +v -1.531517 -3.897472 0.524031 +v 0.237006 -1.943155 -1.143001 +v 2.799558 -1.394199 -2.833563 +v 5.469505 -2.397699 -4.094670 +v 8.260345 -4.281472 -3.341935 +v 9.185065 -7.225996 -2.893939 +v 8.698761 -10.053138 -1.670498 +v 6.931739 -12.005365 0.000568 +v 4.357470 -12.559584 1.671499 +v 1.665728 -11.567287 2.894569 +v -0.422236 -9.294365 3.342059 +v -1.346956 -6.349841 2.894065 +v -0.860653 -3.522701 1.670624 +v 0.906368 -1.570472 -0.000441 +v 3.480636 -1.016253 -1.671372 +v 6.172378 -2.008546 -2.894443 +v 8.958155 -3.866605 -2.127065 +v 9.908154 -6.795622 -1.632703 +v 9.442512 -9.609407 -0.371031 +v 7.685999 -11.554008 1.319889 +v 5.109271 -12.108374 2.986976 +v 2.402760 -11.123960 4.183534 +v 0.291674 -8.864540 4.588947 +v -0.658325 -5.935525 4.094586 +v -0.192685 -3.121740 2.832914 +v 1.563827 -1.177137 1.141995 +v 4.140554 -0.622771 -0.525091 +v 6.847065 -1.607183 -1.721650 +v 9.640034 -3.447073 -0.945625 +v 10.613402 -6.358233 -0.394516 +v 10.170062 -9.150695 0.921400 +v 8.428806 -11.076220 2.649522 +v 5.856202 -11.618865 4.326803 +v 3.141578 -10.633229 5.503816 +v 1.012314 -8.383413 5.865181 +v 0.038945 -5.472253 5.314072 +v 0.482284 -2.679792 3.998158 +v 2.223538 -0.754267 2.270036 +v 4.796141 -0.211620 0.592755 +v 7.510766 -1.197254 -0.584259 +v 10.319818 -3.028959 0.200480 +v 11.310912 -5.919209 0.825152 +v 10.887053 -8.678261 2.215834 +v 9.161811 -10.566831 3.999895 +v 6.597466 -11.078876 5.699297 +v 3.881130 -10.077197 6.858686 +v 1.740645 -7.830191 7.167406 +v 0.749550 -4.939943 6.542735 +v 1.173409 -2.180890 5.152053 +v 2.898649 -0.292320 3.367993 +v 5.462994 0.219728 1.668591 +v 8.179329 -0.781950 0.509201 +v 11.010036 -2.616911 1.309906 +v 12.010052 -5.481328 2.031789 +v 11.598930 -8.189834 3.522092 +v 9.886833 -10.016685 5.381490 +v 7.332516 -10.472383 7.111759 +v 4.620405 -9.434818 8.249275 +v 2.477209 -7.182009 8.489241 +v 1.477194 -4.317594 7.767358 +v 1.888314 -1.609087 6.277056 +v 3.600410 0.217766 4.417658 +v 6.154727 0.673463 2.687389 +v 8.866838 -0.364099 1.549873 +v 11.721029 -2.214092 2.381411 +v 12.719110 -5.043736 3.231688 +v 12.311199 -7.677802 4.850743 +v 10.606596 -9.410490 6.804750 +v 8.062048 -9.777531 8.570136 +v 5.359365 -8.680574 9.673866 +v 3.222730 -6.413551 9.820196 +v 2.224649 -3.583906 8.969919 +v 2.632560 -0.949841 7.350865 +v 4.337161 0.782848 5.396859 +v 6.881708 1.149890 3.631473 +v 9.584391 0.052935 2.527742 +v 12.460020 -1.820681 3.414496 +v 13.445210 -4.599161 4.432078 +v 13.030103 -7.125823 6.212441 +v 11.325925 -8.723649 8.278538 +v 8.789310 -8.964503 10.076759 +v 6.099942 -7.783850 11.125273 +v 3.978435 -5.498044 11.143131 +v 2.993245 -2.719565 10.125549 +v 3.408352 -0.192903 8.345186 +v 5.112529 1.404924 6.279090 +v 7.649142 1.645780 4.480869 +v 10.338511 0.465128 3.432354 +v 13.229733 -1.429728 4.410049 +v 14.194185 -4.128666 5.639517 +v 13.763666 -6.503831 7.614174 +v 12.053534 -7.918798 9.804914 +v 9.522016 -7.994431 11.624728 +v 6.847432 -6.710460 12.585999 +v 4.746432 -4.410927 12.431154 +v 3.781980 -1.711990 11.201688 +v 4.212498 0.663174 9.227031 +v 5.922630 2.078143 7.036292 +v 8.454146 2.153776 5.216477 +v 11.128732 0.869807 4.255205 +v 14.027025 -1.023027 5.368340 +v 14.970943 -3.596290 6.856076 +v 14.523480 -5.762822 9.054245 +v 12.804537 -6.942102 11.373847 +v 10.274699 -6.818142 13.193349 +v 7.611838 -5.424158 14.025214 +v 5.529463 -3.133667 13.646547 +v 4.585546 -0.560404 12.158813 +v 5.033006 1.606128 9.960644 +v 6.751949 2.785408 7.641042 +v 9.281786 2.661450 5.821540 +v 11.944647 1.267467 4.989673 +v 14.842455 -0.565785 6.284601 +v 15.779701 -2.944328 8.070695 +v 15.325215 -4.832036 10.511192 +v 13.600777 -5.723100 12.952164 +v 11.068446 -5.378760 14.739552 +v 8.406761 -3.891282 15.394429 +v 6.328917 -1.659234 14.741322 +v 5.391670 0.719308 12.955229 +v 5.846156 2.607017 10.514732 +v 7.570593 3.498082 8.073761 +v 10.102922 3.153744 6.286372 +v 12.764607 1.666266 5.631493 +# 1440 vertices + +vt 0.000000 0.000000 0.000000 +vt 0.000000 0.083333 0.000000 +vt 0.000000 0.166667 0.000000 +vt 0.000000 0.250000 0.000000 +vt 0.000000 0.333333 0.000000 +vt 0.000000 0.416667 0.000000 +vt 0.000000 0.500000 0.000000 +vt 0.000000 0.583333 0.000000 +vt 0.000000 0.666667 0.000000 +vt 0.000000 0.750000 0.000000 +vt 0.000000 0.833333 0.000000 +vt 0.000000 0.916667 0.000000 +vt 0.000000 1.000000 0.000000 +vt 0.008333 0.000000 0.000000 +vt 0.008333 0.083333 0.000000 +vt 0.008333 0.166667 0.000000 +vt 0.008333 0.250000 0.000000 +vt 0.008333 0.333333 0.000000 +vt 0.008333 0.416667 0.000000 +vt 0.008333 0.500000 0.000000 +vt 0.008333 0.583333 0.000000 +vt 0.008333 0.666667 0.000000 +vt 0.008333 0.750000 0.000000 +vt 0.008333 0.833333 0.000000 +vt 0.008333 0.916667 0.000000 +vt 0.008333 1.000000 0.000000 +vt 0.016667 0.000000 0.000000 +vt 0.016667 0.083333 0.000000 +vt 0.016667 0.166667 0.000000 +vt 0.016667 0.250000 0.000000 +vt 0.016667 0.333333 0.000000 +vt 0.016667 0.416667 0.000000 +vt 0.016667 0.500000 0.000000 +vt 0.016667 0.583333 0.000000 +vt 0.016667 0.666667 0.000000 +vt 0.016667 0.750000 0.000000 +vt 0.016667 0.833333 0.000000 +vt 0.016667 0.916667 0.000000 +vt 0.016667 1.000000 0.000000 +vt 0.025000 0.000000 0.000000 +vt 0.025000 0.083333 0.000000 +vt 0.025000 0.166667 0.000000 +vt 0.025000 0.250000 0.000000 +vt 0.025000 0.333333 0.000000 +vt 0.025000 0.416667 0.000000 +vt 0.025000 0.500000 0.000000 +vt 0.025000 0.583333 0.000000 +vt 0.025000 0.666667 0.000000 +vt 0.025000 0.750000 0.000000 +vt 0.025000 0.833333 0.000000 +vt 0.025000 0.916667 0.000000 +vt 0.025000 1.000000 0.000000 +vt 0.033333 0.000000 0.000000 +vt 0.033333 0.083333 0.000000 +vt 0.033333 0.166667 0.000000 +vt 0.033333 0.250000 0.000000 +vt 0.033333 0.333333 0.000000 +vt 0.033333 0.416667 0.000000 +vt 0.033333 0.500000 0.000000 +vt 0.033333 0.583333 0.000000 +vt 0.033333 0.666667 0.000000 +vt 0.033333 0.750000 0.000000 +vt 0.033333 0.833333 0.000000 +vt 0.033333 0.916667 0.000000 +vt 0.033333 1.000000 0.000000 +vt 0.041667 0.000000 0.000000 +vt 0.041667 0.083333 0.000000 +vt 0.041667 0.166667 0.000000 +vt 0.041667 0.250000 0.000000 +vt 0.041667 0.333333 0.000000 +vt 0.041667 0.416667 0.000000 +vt 0.041667 0.500000 0.000000 +vt 0.041667 0.583333 0.000000 +vt 0.041667 0.666667 0.000000 +vt 0.041667 0.750000 0.000000 +vt 0.041667 0.833333 0.000000 +vt 0.041667 0.916667 0.000000 +vt 0.041667 1.000000 0.000000 +vt 0.050000 0.000000 0.000000 +vt 0.050000 0.083333 0.000000 +vt 0.050000 0.166667 0.000000 +vt 0.050000 0.250000 0.000000 +vt 0.050000 0.333333 0.000000 +vt 0.050000 0.416667 0.000000 +vt 0.050000 0.500000 0.000000 +vt 0.050000 0.583333 0.000000 +vt 0.050000 0.666667 0.000000 +vt 0.050000 0.750000 0.000000 +vt 0.050000 0.833333 0.000000 +vt 0.050000 0.916667 0.000000 +vt 0.050000 1.000000 0.000000 +vt 0.058333 0.000000 0.000000 +vt 0.058333 0.083333 0.000000 +vt 0.058333 0.166667 0.000000 +vt 0.058333 0.250000 0.000000 +vt 0.058333 0.333333 0.000000 +vt 0.058333 0.416667 0.000000 +vt 0.058333 0.500000 0.000000 +vt 0.058333 0.583333 0.000000 +vt 0.058333 0.666667 0.000000 +vt 0.058333 0.750000 0.000000 +vt 0.058333 0.833333 0.000000 +vt 0.058333 0.916667 0.000000 +vt 0.058333 1.000000 0.000000 +vt 0.066667 0.000000 0.000000 +vt 0.066667 0.083333 0.000000 +vt 0.066667 0.166667 0.000000 +vt 0.066667 0.250000 0.000000 +vt 0.066667 0.333333 0.000000 +vt 0.066667 0.416667 0.000000 +vt 0.066667 0.500000 0.000000 +vt 0.066667 0.583333 0.000000 +vt 0.066667 0.666667 0.000000 +vt 0.066667 0.750000 0.000000 +vt 0.066667 0.833333 0.000000 +vt 0.066667 0.916667 0.000000 +vt 0.066667 1.000000 0.000000 +vt 0.075000 0.000000 0.000000 +vt 0.075000 0.083333 0.000000 +vt 0.075000 0.166667 0.000000 +vt 0.075000 0.250000 0.000000 +vt 0.075000 0.333333 0.000000 +vt 0.075000 0.416667 0.000000 +vt 0.075000 0.500000 0.000000 +vt 0.075000 0.583333 0.000000 +vt 0.075000 0.666667 0.000000 +vt 0.075000 0.750000 0.000000 +vt 0.075000 0.833333 0.000000 +vt 0.075000 0.916667 0.000000 +vt 0.075000 1.000000 0.000000 +vt 0.083333 0.000000 0.000000 +vt 0.083333 0.083333 0.000000 +vt 0.083333 0.166667 0.000000 +vt 0.083333 0.250000 0.000000 +vt 0.083333 0.333333 0.000000 +vt 0.083333 0.416667 0.000000 +vt 0.083333 0.500000 0.000000 +vt 0.083333 0.583333 0.000000 +vt 0.083333 0.666667 0.000000 +vt 0.083333 0.750000 0.000000 +vt 0.083333 0.833333 0.000000 +vt 0.083333 0.916667 0.000000 +vt 0.083333 1.000000 0.000000 +vt 0.091667 0.000000 0.000000 +vt 0.091667 0.083333 0.000000 +vt 0.091667 0.166667 0.000000 +vt 0.091667 0.250000 0.000000 +vt 0.091667 0.333333 0.000000 +vt 0.091667 0.416667 0.000000 +vt 0.091667 0.500000 0.000000 +vt 0.091667 0.583333 0.000000 +vt 0.091667 0.666667 0.000000 +vt 0.091667 0.750000 0.000000 +vt 0.091667 0.833333 0.000000 +vt 0.091667 0.916667 0.000000 +vt 0.091667 1.000000 0.000000 +vt 0.100000 0.000000 0.000000 +vt 0.100000 0.083333 0.000000 +vt 0.100000 0.166667 0.000000 +vt 0.100000 0.250000 0.000000 +vt 0.100000 0.333333 0.000000 +vt 0.100000 0.416667 0.000000 +vt 0.100000 0.500000 0.000000 +vt 0.100000 0.583333 0.000000 +vt 0.100000 0.666667 0.000000 +vt 0.100000 0.750000 0.000000 +vt 0.100000 0.833333 0.000000 +vt 0.100000 0.916667 0.000000 +vt 0.100000 1.000000 0.000000 +vt 0.108333 0.000000 0.000000 +vt 0.108333 0.083333 0.000000 +vt 0.108333 0.166667 0.000000 +vt 0.108333 0.250000 0.000000 +vt 0.108333 0.333333 0.000000 +vt 0.108333 0.416667 0.000000 +vt 0.108333 0.500000 0.000000 +vt 0.108333 0.583333 0.000000 +vt 0.108333 0.666667 0.000000 +vt 0.108333 0.750000 0.000000 +vt 0.108333 0.833333 0.000000 +vt 0.108333 0.916667 0.000000 +vt 0.108333 1.000000 0.000000 +vt 0.116667 0.000000 0.000000 +vt 0.116667 0.083333 0.000000 +vt 0.116667 0.166667 0.000000 +vt 0.116667 0.250000 0.000000 +vt 0.116667 0.333333 0.000000 +vt 0.116667 0.416667 0.000000 +vt 0.116667 0.500000 0.000000 +vt 0.116667 0.583333 0.000000 +vt 0.116667 0.666667 0.000000 +vt 0.116667 0.750000 0.000000 +vt 0.116667 0.833333 0.000000 +vt 0.116667 0.916667 0.000000 +vt 0.116667 1.000000 0.000000 +vt 0.125000 0.000000 0.000000 +vt 0.125000 0.083333 0.000000 +vt 0.125000 0.166667 0.000000 +vt 0.125000 0.250000 0.000000 +vt 0.125000 0.333333 0.000000 +vt 0.125000 0.416667 0.000000 +vt 0.125000 0.500000 0.000000 +vt 0.125000 0.583333 0.000000 +vt 0.125000 0.666667 0.000000 +vt 0.125000 0.750000 0.000000 +vt 0.125000 0.833333 0.000000 +vt 0.125000 0.916667 0.000000 +vt 0.125000 1.000000 0.000000 +vt 0.133333 0.000000 0.000000 +vt 0.133333 0.083333 0.000000 +vt 0.133333 0.166667 0.000000 +vt 0.133333 0.250000 0.000000 +vt 0.133333 0.333333 0.000000 +vt 0.133333 0.416667 0.000000 +vt 0.133333 0.500000 0.000000 +vt 0.133333 0.583333 0.000000 +vt 0.133333 0.666667 0.000000 +vt 0.133333 0.750000 0.000000 +vt 0.133333 0.833333 0.000000 +vt 0.133333 0.916667 0.000000 +vt 0.133333 1.000000 0.000000 +vt 0.141667 0.000000 0.000000 +vt 0.141667 0.083333 0.000000 +vt 0.141667 0.166667 0.000000 +vt 0.141667 0.250000 0.000000 +vt 0.141667 0.333333 0.000000 +vt 0.141667 0.416667 0.000000 +vt 0.141667 0.500000 0.000000 +vt 0.141667 0.583333 0.000000 +vt 0.141667 0.666667 0.000000 +vt 0.141667 0.750000 0.000000 +vt 0.141667 0.833333 0.000000 +vt 0.141667 0.916667 0.000000 +vt 0.141667 1.000000 0.000000 +vt 0.150000 0.000000 0.000000 +vt 0.150000 0.083333 0.000000 +vt 0.150000 0.166667 0.000000 +vt 0.150000 0.250000 0.000000 +vt 0.150000 0.333333 0.000000 +vt 0.150000 0.416667 0.000000 +vt 0.150000 0.500000 0.000000 +vt 0.150000 0.583333 0.000000 +vt 0.150000 0.666667 0.000000 +vt 0.150000 0.750000 0.000000 +vt 0.150000 0.833333 0.000000 +vt 0.150000 0.916667 0.000000 +vt 0.150000 1.000000 0.000000 +vt 0.158333 0.000000 0.000000 +vt 0.158333 0.083333 0.000000 +vt 0.158333 0.166667 0.000000 +vt 0.158333 0.250000 0.000000 +vt 0.158333 0.333333 0.000000 +vt 0.158333 0.416667 0.000000 +vt 0.158333 0.500000 0.000000 +vt 0.158333 0.583333 0.000000 +vt 0.158333 0.666667 0.000000 +vt 0.158333 0.750000 0.000000 +vt 0.158333 0.833333 0.000000 +vt 0.158333 0.916667 0.000000 +vt 0.158333 1.000000 0.000000 +vt 0.166667 0.000000 0.000000 +vt 0.166667 0.083333 0.000000 +vt 0.166667 0.166667 0.000000 +vt 0.166667 0.250000 0.000000 +vt 0.166667 0.333333 0.000000 +vt 0.166667 0.416667 0.000000 +vt 0.166667 0.500000 0.000000 +vt 0.166667 0.583333 0.000000 +vt 0.166667 0.666667 0.000000 +vt 0.166667 0.750000 0.000000 +vt 0.166667 0.833333 0.000000 +vt 0.166667 0.916667 0.000000 +vt 0.166667 1.000000 0.000000 +vt 0.175000 0.000000 0.000000 +vt 0.175000 0.083333 0.000000 +vt 0.175000 0.166667 0.000000 +vt 0.175000 0.250000 0.000000 +vt 0.175000 0.333333 0.000000 +vt 0.175000 0.416667 0.000000 +vt 0.175000 0.500000 0.000000 +vt 0.175000 0.583333 0.000000 +vt 0.175000 0.666667 0.000000 +vt 0.175000 0.750000 0.000000 +vt 0.175000 0.833333 0.000000 +vt 0.175000 0.916667 0.000000 +vt 0.175000 1.000000 0.000000 +vt 0.183333 0.000000 0.000000 +vt 0.183333 0.083333 0.000000 +vt 0.183333 0.166667 0.000000 +vt 0.183333 0.250000 0.000000 +vt 0.183333 0.333333 0.000000 +vt 0.183333 0.416667 0.000000 +vt 0.183333 0.500000 0.000000 +vt 0.183333 0.583333 0.000000 +vt 0.183333 0.666667 0.000000 +vt 0.183333 0.750000 0.000000 +vt 0.183333 0.833333 0.000000 +vt 0.183333 0.916667 0.000000 +vt 0.183333 1.000000 0.000000 +vt 0.191667 0.000000 0.000000 +vt 0.191667 0.083333 0.000000 +vt 0.191667 0.166667 0.000000 +vt 0.191667 0.250000 0.000000 +vt 0.191667 0.333333 0.000000 +vt 0.191667 0.416667 0.000000 +vt 0.191667 0.500000 0.000000 +vt 0.191667 0.583333 0.000000 +vt 0.191667 0.666667 0.000000 +vt 0.191667 0.750000 0.000000 +vt 0.191667 0.833333 0.000000 +vt 0.191667 0.916667 0.000000 +vt 0.191667 1.000000 0.000000 +vt 0.200000 0.000000 0.000000 +vt 0.200000 0.083333 0.000000 +vt 0.200000 0.166667 0.000000 +vt 0.200000 0.250000 0.000000 +vt 0.200000 0.333333 0.000000 +vt 0.200000 0.416667 0.000000 +vt 0.200000 0.500000 0.000000 +vt 0.200000 0.583333 0.000000 +vt 0.200000 0.666667 0.000000 +vt 0.200000 0.750000 0.000000 +vt 0.200000 0.833333 0.000000 +vt 0.200000 0.916667 0.000000 +vt 0.200000 1.000000 0.000000 +vt 0.208333 0.000000 0.000000 +vt 0.208333 0.083333 0.000000 +vt 0.208333 0.166667 0.000000 +vt 0.208333 0.250000 0.000000 +vt 0.208333 0.333333 0.000000 +vt 0.208333 0.416667 0.000000 +vt 0.208333 0.500000 0.000000 +vt 0.208333 0.583333 0.000000 +vt 0.208333 0.666667 0.000000 +vt 0.208333 0.750000 0.000000 +vt 0.208333 0.833333 0.000000 +vt 0.208333 0.916667 0.000000 +vt 0.208333 1.000000 0.000000 +vt 0.216667 0.000000 0.000000 +vt 0.216667 0.083333 0.000000 +vt 0.216667 0.166667 0.000000 +vt 0.216667 0.250000 0.000000 +vt 0.216667 0.333333 0.000000 +vt 0.216667 0.416667 0.000000 +vt 0.216667 0.500000 0.000000 +vt 0.216667 0.583333 0.000000 +vt 0.216667 0.666667 0.000000 +vt 0.216667 0.750000 0.000000 +vt 0.216667 0.833333 0.000000 +vt 0.216667 0.916667 0.000000 +vt 0.216667 1.000000 0.000000 +vt 0.225000 0.000000 0.000000 +vt 0.225000 0.083333 0.000000 +vt 0.225000 0.166667 0.000000 +vt 0.225000 0.250000 0.000000 +vt 0.225000 0.333333 0.000000 +vt 0.225000 0.416667 0.000000 +vt 0.225000 0.500000 0.000000 +vt 0.225000 0.583333 0.000000 +vt 0.225000 0.666667 0.000000 +vt 0.225000 0.750000 0.000000 +vt 0.225000 0.833333 0.000000 +vt 0.225000 0.916667 0.000000 +vt 0.225000 1.000000 0.000000 +vt 0.233333 0.000000 0.000000 +vt 0.233333 0.083333 0.000000 +vt 0.233333 0.166667 0.000000 +vt 0.233333 0.250000 0.000000 +vt 0.233333 0.333333 0.000000 +vt 0.233333 0.416667 0.000000 +vt 0.233333 0.500000 0.000000 +vt 0.233333 0.583333 0.000000 +vt 0.233333 0.666667 0.000000 +vt 0.233333 0.750000 0.000000 +vt 0.233333 0.833333 0.000000 +vt 0.233333 0.916667 0.000000 +vt 0.233333 1.000000 0.000000 +vt 0.241667 0.000000 0.000000 +vt 0.241667 0.083333 0.000000 +vt 0.241667 0.166667 0.000000 +vt 0.241667 0.250000 0.000000 +vt 0.241667 0.333333 0.000000 +vt 0.241667 0.416667 0.000000 +vt 0.241667 0.500000 0.000000 +vt 0.241667 0.583333 0.000000 +vt 0.241667 0.666667 0.000000 +vt 0.241667 0.750000 0.000000 +vt 0.241667 0.833333 0.000000 +vt 0.241667 0.916667 0.000000 +vt 0.241667 1.000000 0.000000 +vt 0.250000 0.000000 0.000000 +vt 0.250000 0.083333 0.000000 +vt 0.250000 0.166667 0.000000 +vt 0.250000 0.250000 0.000000 +vt 0.250000 0.333333 0.000000 +vt 0.250000 0.416667 0.000000 +vt 0.250000 0.500000 0.000000 +vt 0.250000 0.583333 0.000000 +vt 0.250000 0.666667 0.000000 +vt 0.250000 0.750000 0.000000 +vt 0.250000 0.833333 0.000000 +vt 0.250000 0.916667 0.000000 +vt 0.250000 1.000000 0.000000 +vt 0.258333 0.000000 0.000000 +vt 0.258333 0.083333 0.000000 +vt 0.258333 0.166667 0.000000 +vt 0.258333 0.250000 0.000000 +vt 0.258333 0.333333 0.000000 +vt 0.258333 0.416667 0.000000 +vt 0.258333 0.500000 0.000000 +vt 0.258333 0.583333 0.000000 +vt 0.258333 0.666667 0.000000 +vt 0.258333 0.750000 0.000000 +vt 0.258333 0.833333 0.000000 +vt 0.258333 0.916667 0.000000 +vt 0.258333 1.000000 0.000000 +vt 0.266667 0.000000 0.000000 +vt 0.266667 0.083333 0.000000 +vt 0.266667 0.166667 0.000000 +vt 0.266667 0.250000 0.000000 +vt 0.266667 0.333333 0.000000 +vt 0.266667 0.416667 0.000000 +vt 0.266667 0.500000 0.000000 +vt 0.266667 0.583333 0.000000 +vt 0.266667 0.666667 0.000000 +vt 0.266667 0.750000 0.000000 +vt 0.266667 0.833333 0.000000 +vt 0.266667 0.916667 0.000000 +vt 0.266667 1.000000 0.000000 +vt 0.275000 0.000000 0.000000 +vt 0.275000 0.083333 0.000000 +vt 0.275000 0.166667 0.000000 +vt 0.275000 0.250000 0.000000 +vt 0.275000 0.333333 0.000000 +vt 0.275000 0.416667 0.000000 +vt 0.275000 0.500000 0.000000 +vt 0.275000 0.583333 0.000000 +vt 0.275000 0.666667 0.000000 +vt 0.275000 0.750000 0.000000 +vt 0.275000 0.833333 0.000000 +vt 0.275000 0.916667 0.000000 +vt 0.275000 1.000000 0.000000 +vt 0.283333 0.000000 0.000000 +vt 0.283333 0.083333 0.000000 +vt 0.283333 0.166667 0.000000 +vt 0.283333 0.250000 0.000000 +vt 0.283333 0.333333 0.000000 +vt 0.283333 0.416667 0.000000 +vt 0.283333 0.500000 0.000000 +vt 0.283333 0.583333 0.000000 +vt 0.283333 0.666667 0.000000 +vt 0.283333 0.750000 0.000000 +vt 0.283333 0.833333 0.000000 +vt 0.283333 0.916667 0.000000 +vt 0.283333 1.000000 0.000000 +vt 0.291667 0.000000 0.000000 +vt 0.291667 0.083333 0.000000 +vt 0.291667 0.166667 0.000000 +vt 0.291667 0.250000 0.000000 +vt 0.291667 0.333333 0.000000 +vt 0.291667 0.416667 0.000000 +vt 0.291667 0.500000 0.000000 +vt 0.291667 0.583333 0.000000 +vt 0.291667 0.666667 0.000000 +vt 0.291667 0.750000 0.000000 +vt 0.291667 0.833333 0.000000 +vt 0.291667 0.916667 0.000000 +vt 0.291667 1.000000 0.000000 +vt 0.300000 0.000000 0.000000 +vt 0.300000 0.083333 0.000000 +vt 0.300000 0.166667 0.000000 +vt 0.300000 0.250000 0.000000 +vt 0.300000 0.333333 0.000000 +vt 0.300000 0.416667 0.000000 +vt 0.300000 0.500000 0.000000 +vt 0.300000 0.583333 0.000000 +vt 0.300000 0.666667 0.000000 +vt 0.300000 0.750000 0.000000 +vt 0.300000 0.833333 0.000000 +vt 0.300000 0.916667 0.000000 +vt 0.300000 1.000000 0.000000 +vt 0.308333 0.000000 0.000000 +vt 0.308333 0.083333 0.000000 +vt 0.308333 0.166667 0.000000 +vt 0.308333 0.250000 0.000000 +vt 0.308333 0.333333 0.000000 +vt 0.308333 0.416667 0.000000 +vt 0.308333 0.500000 0.000000 +vt 0.308333 0.583333 0.000000 +vt 0.308333 0.666667 0.000000 +vt 0.308333 0.750000 0.000000 +vt 0.308333 0.833333 0.000000 +vt 0.308333 0.916667 0.000000 +vt 0.308333 1.000000 0.000000 +vt 0.316666 0.000000 0.000000 +vt 0.316666 0.083333 0.000000 +vt 0.316666 0.166667 0.000000 +vt 0.316666 0.250000 0.000000 +vt 0.316666 0.333333 0.000000 +vt 0.316666 0.416667 0.000000 +vt 0.316666 0.500000 0.000000 +vt 0.316666 0.583333 0.000000 +vt 0.316666 0.666667 0.000000 +vt 0.316666 0.750000 0.000000 +vt 0.316666 0.833333 0.000000 +vt 0.316666 0.916667 0.000000 +vt 0.316666 1.000000 0.000000 +vt 0.325000 0.000000 0.000000 +vt 0.325000 0.083333 0.000000 +vt 0.325000 0.166667 0.000000 +vt 0.325000 0.250000 0.000000 +vt 0.325000 0.333333 0.000000 +vt 0.325000 0.416667 0.000000 +vt 0.325000 0.500000 0.000000 +vt 0.325000 0.583333 0.000000 +vt 0.325000 0.666667 0.000000 +vt 0.325000 0.750000 0.000000 +vt 0.325000 0.833333 0.000000 +vt 0.325000 0.916667 0.000000 +vt 0.325000 1.000000 0.000000 +vt 0.333333 0.000000 0.000000 +vt 0.333333 0.083333 0.000000 +vt 0.333333 0.166667 0.000000 +vt 0.333333 0.250000 0.000000 +vt 0.333333 0.333333 0.000000 +vt 0.333333 0.416667 0.000000 +vt 0.333333 0.500000 0.000000 +vt 0.333333 0.583333 0.000000 +vt 0.333333 0.666667 0.000000 +vt 0.333333 0.750000 0.000000 +vt 0.333333 0.833333 0.000000 +vt 0.333333 0.916667 0.000000 +vt 0.333333 1.000000 0.000000 +vt 0.341666 0.000000 0.000000 +vt 0.341666 0.083333 0.000000 +vt 0.341666 0.166667 0.000000 +vt 0.341666 0.250000 0.000000 +vt 0.341666 0.333333 0.000000 +vt 0.341666 0.416667 0.000000 +vt 0.341666 0.500000 0.000000 +vt 0.341666 0.583333 0.000000 +vt 0.341666 0.666667 0.000000 +vt 0.341666 0.750000 0.000000 +vt 0.341666 0.833333 0.000000 +vt 0.341666 0.916667 0.000000 +vt 0.341666 1.000000 0.000000 +vt 0.350000 0.000000 0.000000 +vt 0.350000 0.083333 0.000000 +vt 0.350000 0.166667 0.000000 +vt 0.350000 0.250000 0.000000 +vt 0.350000 0.333333 0.000000 +vt 0.350000 0.416667 0.000000 +vt 0.350000 0.500000 0.000000 +vt 0.350000 0.583333 0.000000 +vt 0.350000 0.666667 0.000000 +vt 0.350000 0.750000 0.000000 +vt 0.350000 0.833333 0.000000 +vt 0.350000 0.916667 0.000000 +vt 0.350000 1.000000 0.000000 +vt 0.358333 0.000000 0.000000 +vt 0.358333 0.083333 0.000000 +vt 0.358333 0.166667 0.000000 +vt 0.358333 0.250000 0.000000 +vt 0.358333 0.333333 0.000000 +vt 0.358333 0.416667 0.000000 +vt 0.358333 0.500000 0.000000 +vt 0.358333 0.583333 0.000000 +vt 0.358333 0.666667 0.000000 +vt 0.358333 0.750000 0.000000 +vt 0.358333 0.833333 0.000000 +vt 0.358333 0.916667 0.000000 +vt 0.358333 1.000000 0.000000 +vt 0.366666 0.000000 0.000000 +vt 0.366666 0.083333 0.000000 +vt 0.366666 0.166667 0.000000 +vt 0.366666 0.250000 0.000000 +vt 0.366666 0.333333 0.000000 +vt 0.366666 0.416667 0.000000 +vt 0.366666 0.500000 0.000000 +vt 0.366666 0.583333 0.000000 +vt 0.366666 0.666667 0.000000 +vt 0.366666 0.750000 0.000000 +vt 0.366666 0.833333 0.000000 +vt 0.366666 0.916667 0.000000 +vt 0.366666 1.000000 0.000000 +vt 0.375000 0.000000 0.000000 +vt 0.375000 0.083333 0.000000 +vt 0.375000 0.166667 0.000000 +vt 0.375000 0.250000 0.000000 +vt 0.375000 0.333333 0.000000 +vt 0.375000 0.416667 0.000000 +vt 0.375000 0.500000 0.000000 +vt 0.375000 0.583333 0.000000 +vt 0.375000 0.666667 0.000000 +vt 0.375000 0.750000 0.000000 +vt 0.375000 0.833333 0.000000 +vt 0.375000 0.916667 0.000000 +vt 0.375000 1.000000 0.000000 +vt 0.383333 0.000000 0.000000 +vt 0.383333 0.083333 0.000000 +vt 0.383333 0.166667 0.000000 +vt 0.383333 0.250000 0.000000 +vt 0.383333 0.333333 0.000000 +vt 0.383333 0.416667 0.000000 +vt 0.383333 0.500000 0.000000 +vt 0.383333 0.583333 0.000000 +vt 0.383333 0.666667 0.000000 +vt 0.383333 0.750000 0.000000 +vt 0.383333 0.833333 0.000000 +vt 0.383333 0.916667 0.000000 +vt 0.383333 1.000000 0.000000 +vt 0.391666 0.000000 0.000000 +vt 0.391666 0.083333 0.000000 +vt 0.391666 0.166667 0.000000 +vt 0.391666 0.250000 0.000000 +vt 0.391666 0.333333 0.000000 +vt 0.391666 0.416667 0.000000 +vt 0.391666 0.500000 0.000000 +vt 0.391666 0.583333 0.000000 +vt 0.391666 0.666667 0.000000 +vt 0.391666 0.750000 0.000000 +vt 0.391666 0.833333 0.000000 +vt 0.391666 0.916667 0.000000 +vt 0.391666 1.000000 0.000000 +vt 0.400000 0.000000 0.000000 +vt 0.400000 0.083333 0.000000 +vt 0.400000 0.166667 0.000000 +vt 0.400000 0.250000 0.000000 +vt 0.400000 0.333333 0.000000 +vt 0.400000 0.416667 0.000000 +vt 0.400000 0.500000 0.000000 +vt 0.400000 0.583333 0.000000 +vt 0.400000 0.666667 0.000000 +vt 0.400000 0.750000 0.000000 +vt 0.400000 0.833333 0.000000 +vt 0.400000 0.916667 0.000000 +vt 0.400000 1.000000 0.000000 +vt 0.408333 0.000000 0.000000 +vt 0.408333 0.083333 0.000000 +vt 0.408333 0.166667 0.000000 +vt 0.408333 0.250000 0.000000 +vt 0.408333 0.333333 0.000000 +vt 0.408333 0.416667 0.000000 +vt 0.408333 0.500000 0.000000 +vt 0.408333 0.583333 0.000000 +vt 0.408333 0.666667 0.000000 +vt 0.408333 0.750000 0.000000 +vt 0.408333 0.833333 0.000000 +vt 0.408333 0.916667 0.000000 +vt 0.408333 1.000000 0.000000 +vt 0.416666 0.000000 0.000000 +vt 0.416666 0.083333 0.000000 +vt 0.416666 0.166667 0.000000 +vt 0.416666 0.250000 0.000000 +vt 0.416666 0.333333 0.000000 +vt 0.416666 0.416667 0.000000 +vt 0.416666 0.500000 0.000000 +vt 0.416666 0.583333 0.000000 +vt 0.416666 0.666667 0.000000 +vt 0.416666 0.750000 0.000000 +vt 0.416666 0.833333 0.000000 +vt 0.416666 0.916667 0.000000 +vt 0.416666 1.000000 0.000000 +vt 0.425000 0.000000 0.000000 +vt 0.425000 0.083333 0.000000 +vt 0.425000 0.166667 0.000000 +vt 0.425000 0.250000 0.000000 +vt 0.425000 0.333333 0.000000 +vt 0.425000 0.416667 0.000000 +vt 0.425000 0.500000 0.000000 +vt 0.425000 0.583333 0.000000 +vt 0.425000 0.666667 0.000000 +vt 0.425000 0.750000 0.000000 +vt 0.425000 0.833333 0.000000 +vt 0.425000 0.916667 0.000000 +vt 0.425000 1.000000 0.000000 +vt 0.433333 0.000000 0.000000 +vt 0.433333 0.083333 0.000000 +vt 0.433333 0.166667 0.000000 +vt 0.433333 0.250000 0.000000 +vt 0.433333 0.333333 0.000000 +vt 0.433333 0.416667 0.000000 +vt 0.433333 0.500000 0.000000 +vt 0.433333 0.583333 0.000000 +vt 0.433333 0.666667 0.000000 +vt 0.433333 0.750000 0.000000 +vt 0.433333 0.833333 0.000000 +vt 0.433333 0.916667 0.000000 +vt 0.433333 1.000000 0.000000 +vt 0.441666 0.000000 0.000000 +vt 0.441666 0.083333 0.000000 +vt 0.441666 0.166667 0.000000 +vt 0.441666 0.250000 0.000000 +vt 0.441666 0.333333 0.000000 +vt 0.441666 0.416667 0.000000 +vt 0.441666 0.500000 0.000000 +vt 0.441666 0.583333 0.000000 +vt 0.441666 0.666667 0.000000 +vt 0.441666 0.750000 0.000000 +vt 0.441666 0.833333 0.000000 +vt 0.441666 0.916667 0.000000 +vt 0.441666 1.000000 0.000000 +vt 0.450000 0.000000 0.000000 +vt 0.450000 0.083333 0.000000 +vt 0.450000 0.166667 0.000000 +vt 0.450000 0.250000 0.000000 +vt 0.450000 0.333333 0.000000 +vt 0.450000 0.416667 0.000000 +vt 0.450000 0.500000 0.000000 +vt 0.450000 0.583333 0.000000 +vt 0.450000 0.666667 0.000000 +vt 0.450000 0.750000 0.000000 +vt 0.450000 0.833333 0.000000 +vt 0.450000 0.916667 0.000000 +vt 0.450000 1.000000 0.000000 +vt 0.458333 0.000000 0.000000 +vt 0.458333 0.083333 0.000000 +vt 0.458333 0.166667 0.000000 +vt 0.458333 0.250000 0.000000 +vt 0.458333 0.333333 0.000000 +vt 0.458333 0.416667 0.000000 +vt 0.458333 0.500000 0.000000 +vt 0.458333 0.583333 0.000000 +vt 0.458333 0.666667 0.000000 +vt 0.458333 0.750000 0.000000 +vt 0.458333 0.833333 0.000000 +vt 0.458333 0.916667 0.000000 +vt 0.458333 1.000000 0.000000 +vt 0.466666 0.000000 0.000000 +vt 0.466666 0.083333 0.000000 +vt 0.466666 0.166667 0.000000 +vt 0.466666 0.250000 0.000000 +vt 0.466666 0.333333 0.000000 +vt 0.466666 0.416667 0.000000 +vt 0.466666 0.500000 0.000000 +vt 0.466666 0.583333 0.000000 +vt 0.466666 0.666667 0.000000 +vt 0.466666 0.750000 0.000000 +vt 0.466666 0.833333 0.000000 +vt 0.466666 0.916667 0.000000 +vt 0.466666 1.000000 0.000000 +vt 0.475000 0.000000 0.000000 +vt 0.475000 0.083333 0.000000 +vt 0.475000 0.166667 0.000000 +vt 0.475000 0.250000 0.000000 +vt 0.475000 0.333333 0.000000 +vt 0.475000 0.416667 0.000000 +vt 0.475000 0.500000 0.000000 +vt 0.475000 0.583333 0.000000 +vt 0.475000 0.666667 0.000000 +vt 0.475000 0.750000 0.000000 +vt 0.475000 0.833333 0.000000 +vt 0.475000 0.916667 0.000000 +vt 0.475000 1.000000 0.000000 +vt 0.483333 0.000000 0.000000 +vt 0.483333 0.083333 0.000000 +vt 0.483333 0.166667 0.000000 +vt 0.483333 0.250000 0.000000 +vt 0.483333 0.333333 0.000000 +vt 0.483333 0.416667 0.000000 +vt 0.483333 0.500000 0.000000 +vt 0.483333 0.583333 0.000000 +vt 0.483333 0.666667 0.000000 +vt 0.483333 0.750000 0.000000 +vt 0.483333 0.833333 0.000000 +vt 0.483333 0.916667 0.000000 +vt 0.483333 1.000000 0.000000 +vt 0.491666 0.000000 0.000000 +vt 0.491666 0.083333 0.000000 +vt 0.491666 0.166667 0.000000 +vt 0.491666 0.250000 0.000000 +vt 0.491666 0.333333 0.000000 +vt 0.491666 0.416667 0.000000 +vt 0.491666 0.500000 0.000000 +vt 0.491666 0.583333 0.000000 +vt 0.491666 0.666667 0.000000 +vt 0.491666 0.750000 0.000000 +vt 0.491666 0.833333 0.000000 +vt 0.491666 0.916667 0.000000 +vt 0.491666 1.000000 0.000000 +vt 0.500000 0.000000 0.000000 +vt 0.500000 0.083333 0.000000 +vt 0.500000 0.166667 0.000000 +vt 0.500000 0.250000 0.000000 +vt 0.500000 0.333333 0.000000 +vt 0.500000 0.416667 0.000000 +vt 0.500000 0.500000 0.000000 +vt 0.500000 0.583333 0.000000 +vt 0.500000 0.666667 0.000000 +vt 0.500000 0.750000 0.000000 +vt 0.500000 0.833333 0.000000 +vt 0.500000 0.916667 0.000000 +vt 0.500000 1.000000 0.000000 +vt 0.508333 0.000000 0.000000 +vt 0.508333 0.083333 0.000000 +vt 0.508333 0.166667 0.000000 +vt 0.508333 0.250000 0.000000 +vt 0.508333 0.333333 0.000000 +vt 0.508333 0.416667 0.000000 +vt 0.508333 0.500000 0.000000 +vt 0.508333 0.583333 0.000000 +vt 0.508333 0.666667 0.000000 +vt 0.508333 0.750000 0.000000 +vt 0.508333 0.833333 0.000000 +vt 0.508333 0.916667 0.000000 +vt 0.508333 1.000000 0.000000 +vt 0.516666 0.000000 0.000000 +vt 0.516666 0.083333 0.000000 +vt 0.516666 0.166667 0.000000 +vt 0.516666 0.250000 0.000000 +vt 0.516666 0.333333 0.000000 +vt 0.516666 0.416667 0.000000 +vt 0.516666 0.500000 0.000000 +vt 0.516666 0.583333 0.000000 +vt 0.516666 0.666667 0.000000 +vt 0.516666 0.750000 0.000000 +vt 0.516666 0.833333 0.000000 +vt 0.516666 0.916667 0.000000 +vt 0.516666 1.000000 0.000000 +vt 0.525000 0.000000 0.000000 +vt 0.525000 0.083333 0.000000 +vt 0.525000 0.166667 0.000000 +vt 0.525000 0.250000 0.000000 +vt 0.525000 0.333333 0.000000 +vt 0.525000 0.416667 0.000000 +vt 0.525000 0.500000 0.000000 +vt 0.525000 0.583333 0.000000 +vt 0.525000 0.666667 0.000000 +vt 0.525000 0.750000 0.000000 +vt 0.525000 0.833333 0.000000 +vt 0.525000 0.916667 0.000000 +vt 0.525000 1.000000 0.000000 +vt 0.533333 0.000000 0.000000 +vt 0.533333 0.083333 0.000000 +vt 0.533333 0.166667 0.000000 +vt 0.533333 0.250000 0.000000 +vt 0.533333 0.333333 0.000000 +vt 0.533333 0.416667 0.000000 +vt 0.533333 0.500000 0.000000 +vt 0.533333 0.583333 0.000000 +vt 0.533333 0.666667 0.000000 +vt 0.533333 0.750000 0.000000 +vt 0.533333 0.833333 0.000000 +vt 0.533333 0.916667 0.000000 +vt 0.533333 1.000000 0.000000 +vt 0.541666 0.000000 0.000000 +vt 0.541666 0.083333 0.000000 +vt 0.541666 0.166667 0.000000 +vt 0.541666 0.250000 0.000000 +vt 0.541666 0.333333 0.000000 +vt 0.541666 0.416667 0.000000 +vt 0.541666 0.500000 0.000000 +vt 0.541666 0.583333 0.000000 +vt 0.541666 0.666667 0.000000 +vt 0.541666 0.750000 0.000000 +vt 0.541666 0.833333 0.000000 +vt 0.541666 0.916667 0.000000 +vt 0.541666 1.000000 0.000000 +vt 0.550000 0.000000 0.000000 +vt 0.550000 0.083333 0.000000 +vt 0.550000 0.166667 0.000000 +vt 0.550000 0.250000 0.000000 +vt 0.550000 0.333333 0.000000 +vt 0.550000 0.416667 0.000000 +vt 0.550000 0.500000 0.000000 +vt 0.550000 0.583333 0.000000 +vt 0.550000 0.666667 0.000000 +vt 0.550000 0.750000 0.000000 +vt 0.550000 0.833333 0.000000 +vt 0.550000 0.916667 0.000000 +vt 0.550000 1.000000 0.000000 +vt 0.558333 0.000000 0.000000 +vt 0.558333 0.083333 0.000000 +vt 0.558333 0.166667 0.000000 +vt 0.558333 0.250000 0.000000 +vt 0.558333 0.333333 0.000000 +vt 0.558333 0.416667 0.000000 +vt 0.558333 0.500000 0.000000 +vt 0.558333 0.583333 0.000000 +vt 0.558333 0.666667 0.000000 +vt 0.558333 0.750000 0.000000 +vt 0.558333 0.833333 0.000000 +vt 0.558333 0.916667 0.000000 +vt 0.558333 1.000000 0.000000 +vt 0.566666 0.000000 0.000000 +vt 0.566666 0.083333 0.000000 +vt 0.566666 0.166667 0.000000 +vt 0.566666 0.250000 0.000000 +vt 0.566666 0.333333 0.000000 +vt 0.566666 0.416667 0.000000 +vt 0.566666 0.500000 0.000000 +vt 0.566666 0.583333 0.000000 +vt 0.566666 0.666667 0.000000 +vt 0.566666 0.750000 0.000000 +vt 0.566666 0.833333 0.000000 +vt 0.566666 0.916667 0.000000 +vt 0.566666 1.000000 0.000000 +vt 0.575000 0.000000 0.000000 +vt 0.575000 0.083333 0.000000 +vt 0.575000 0.166667 0.000000 +vt 0.575000 0.250000 0.000000 +vt 0.575000 0.333333 0.000000 +vt 0.575000 0.416667 0.000000 +vt 0.575000 0.500000 0.000000 +vt 0.575000 0.583333 0.000000 +vt 0.575000 0.666667 0.000000 +vt 0.575000 0.750000 0.000000 +vt 0.575000 0.833333 0.000000 +vt 0.575000 0.916667 0.000000 +vt 0.575000 1.000000 0.000000 +vt 0.583333 0.000000 0.000000 +vt 0.583333 0.083333 0.000000 +vt 0.583333 0.166667 0.000000 +vt 0.583333 0.250000 0.000000 +vt 0.583333 0.333333 0.000000 +vt 0.583333 0.416667 0.000000 +vt 0.583333 0.500000 0.000000 +vt 0.583333 0.583333 0.000000 +vt 0.583333 0.666667 0.000000 +vt 0.583333 0.750000 0.000000 +vt 0.583333 0.833333 0.000000 +vt 0.583333 0.916667 0.000000 +vt 0.583333 1.000000 0.000000 +vt 0.591666 0.000000 0.000000 +vt 0.591666 0.083333 0.000000 +vt 0.591666 0.166667 0.000000 +vt 0.591666 0.250000 0.000000 +vt 0.591666 0.333333 0.000000 +vt 0.591666 0.416667 0.000000 +vt 0.591666 0.500000 0.000000 +vt 0.591666 0.583333 0.000000 +vt 0.591666 0.666667 0.000000 +vt 0.591666 0.750000 0.000000 +vt 0.591666 0.833333 0.000000 +vt 0.591666 0.916667 0.000000 +vt 0.591666 1.000000 0.000000 +vt 0.599999 0.000000 0.000000 +vt 0.599999 0.083333 0.000000 +vt 0.599999 0.166667 0.000000 +vt 0.599999 0.250000 0.000000 +vt 0.599999 0.333333 0.000000 +vt 0.599999 0.416667 0.000000 +vt 0.599999 0.500000 0.000000 +vt 0.599999 0.583333 0.000000 +vt 0.599999 0.666667 0.000000 +vt 0.599999 0.750000 0.000000 +vt 0.599999 0.833333 0.000000 +vt 0.599999 0.916667 0.000000 +vt 0.599999 1.000000 0.000000 +vt 0.608333 0.000000 0.000000 +vt 0.608333 0.083333 0.000000 +vt 0.608333 0.166667 0.000000 +vt 0.608333 0.250000 0.000000 +vt 0.608333 0.333333 0.000000 +vt 0.608333 0.416667 0.000000 +vt 0.608333 0.500000 0.000000 +vt 0.608333 0.583333 0.000000 +vt 0.608333 0.666667 0.000000 +vt 0.608333 0.750000 0.000000 +vt 0.608333 0.833333 0.000000 +vt 0.608333 0.916667 0.000000 +vt 0.608333 1.000000 0.000000 +vt 0.616666 0.000000 0.000000 +vt 0.616666 0.083333 0.000000 +vt 0.616666 0.166667 0.000000 +vt 0.616666 0.250000 0.000000 +vt 0.616666 0.333333 0.000000 +vt 0.616666 0.416667 0.000000 +vt 0.616666 0.500000 0.000000 +vt 0.616666 0.583333 0.000000 +vt 0.616666 0.666667 0.000000 +vt 0.616666 0.750000 0.000000 +vt 0.616666 0.833333 0.000000 +vt 0.616666 0.916667 0.000000 +vt 0.616666 1.000000 0.000000 +vt 0.624999 0.000000 0.000000 +vt 0.624999 0.083333 0.000000 +vt 0.624999 0.166667 0.000000 +vt 0.624999 0.250000 0.000000 +vt 0.624999 0.333333 0.000000 +vt 0.624999 0.416667 0.000000 +vt 0.624999 0.500000 0.000000 +vt 0.624999 0.583333 0.000000 +vt 0.624999 0.666667 0.000000 +vt 0.624999 0.750000 0.000000 +vt 0.624999 0.833333 0.000000 +vt 0.624999 0.916667 0.000000 +vt 0.624999 1.000000 0.000000 +vt 0.633333 0.000000 0.000000 +vt 0.633333 0.083333 0.000000 +vt 0.633333 0.166667 0.000000 +vt 0.633333 0.250000 0.000000 +vt 0.633333 0.333333 0.000000 +vt 0.633333 0.416667 0.000000 +vt 0.633333 0.500000 0.000000 +vt 0.633333 0.583333 0.000000 +vt 0.633333 0.666667 0.000000 +vt 0.633333 0.750000 0.000000 +vt 0.633333 0.833333 0.000000 +vt 0.633333 0.916667 0.000000 +vt 0.633333 1.000000 0.000000 +vt 0.641666 0.000000 0.000000 +vt 0.641666 0.083333 0.000000 +vt 0.641666 0.166667 0.000000 +vt 0.641666 0.250000 0.000000 +vt 0.641666 0.333333 0.000000 +vt 0.641666 0.416667 0.000000 +vt 0.641666 0.500000 0.000000 +vt 0.641666 0.583333 0.000000 +vt 0.641666 0.666667 0.000000 +vt 0.641666 0.750000 0.000000 +vt 0.641666 0.833333 0.000000 +vt 0.641666 0.916667 0.000000 +vt 0.641666 1.000000 0.000000 +vt 0.649999 0.000000 0.000000 +vt 0.649999 0.083333 0.000000 +vt 0.649999 0.166667 0.000000 +vt 0.649999 0.250000 0.000000 +vt 0.649999 0.333333 0.000000 +vt 0.649999 0.416667 0.000000 +vt 0.649999 0.500000 0.000000 +vt 0.649999 0.583333 0.000000 +vt 0.649999 0.666667 0.000000 +vt 0.649999 0.750000 0.000000 +vt 0.649999 0.833333 0.000000 +vt 0.649999 0.916667 0.000000 +vt 0.649999 1.000000 0.000000 +vt 0.658333 0.000000 0.000000 +vt 0.658333 0.083333 0.000000 +vt 0.658333 0.166667 0.000000 +vt 0.658333 0.250000 0.000000 +vt 0.658333 0.333333 0.000000 +vt 0.658333 0.416667 0.000000 +vt 0.658333 0.500000 0.000000 +vt 0.658333 0.583333 0.000000 +vt 0.658333 0.666667 0.000000 +vt 0.658333 0.750000 0.000000 +vt 0.658333 0.833333 0.000000 +vt 0.658333 0.916667 0.000000 +vt 0.658333 1.000000 0.000000 +vt 0.666666 0.000000 0.000000 +vt 0.666666 0.083333 0.000000 +vt 0.666666 0.166667 0.000000 +vt 0.666666 0.250000 0.000000 +vt 0.666666 0.333333 0.000000 +vt 0.666666 0.416667 0.000000 +vt 0.666666 0.500000 0.000000 +vt 0.666666 0.583333 0.000000 +vt 0.666666 0.666667 0.000000 +vt 0.666666 0.750000 0.000000 +vt 0.666666 0.833333 0.000000 +vt 0.666666 0.916667 0.000000 +vt 0.666666 1.000000 0.000000 +vt 0.675000 0.000000 0.000000 +vt 0.675000 0.083333 0.000000 +vt 0.675000 0.166667 0.000000 +vt 0.675000 0.250000 0.000000 +vt 0.675000 0.333333 0.000000 +vt 0.675000 0.416667 0.000000 +vt 0.675000 0.500000 0.000000 +vt 0.675000 0.583333 0.000000 +vt 0.675000 0.666667 0.000000 +vt 0.675000 0.750000 0.000000 +vt 0.675000 0.833333 0.000000 +vt 0.675000 0.916667 0.000000 +vt 0.675000 1.000000 0.000000 +vt 0.683333 0.000000 0.000000 +vt 0.683333 0.083333 0.000000 +vt 0.683333 0.166667 0.000000 +vt 0.683333 0.250000 0.000000 +vt 0.683333 0.333333 0.000000 +vt 0.683333 0.416667 0.000000 +vt 0.683333 0.500000 0.000000 +vt 0.683333 0.583333 0.000000 +vt 0.683333 0.666667 0.000000 +vt 0.683333 0.750000 0.000000 +vt 0.683333 0.833333 0.000000 +vt 0.683333 0.916667 0.000000 +vt 0.683333 1.000000 0.000000 +vt 0.691666 0.000000 0.000000 +vt 0.691666 0.083333 0.000000 +vt 0.691666 0.166667 0.000000 +vt 0.691666 0.250000 0.000000 +vt 0.691666 0.333333 0.000000 +vt 0.691666 0.416667 0.000000 +vt 0.691666 0.500000 0.000000 +vt 0.691666 0.583333 0.000000 +vt 0.691666 0.666667 0.000000 +vt 0.691666 0.750000 0.000000 +vt 0.691666 0.833333 0.000000 +vt 0.691666 0.916667 0.000000 +vt 0.691666 1.000000 0.000000 +vt 0.700000 0.000000 0.000000 +vt 0.700000 0.083333 0.000000 +vt 0.700000 0.166667 0.000000 +vt 0.700000 0.250000 0.000000 +vt 0.700000 0.333333 0.000000 +vt 0.700000 0.416667 0.000000 +vt 0.700000 0.500000 0.000000 +vt 0.700000 0.583333 0.000000 +vt 0.700000 0.666667 0.000000 +vt 0.700000 0.750000 0.000000 +vt 0.700000 0.833333 0.000000 +vt 0.700000 0.916667 0.000000 +vt 0.700000 1.000000 0.000000 +vt 0.708333 0.000000 0.000000 +vt 0.708333 0.083333 0.000000 +vt 0.708333 0.166667 0.000000 +vt 0.708333 0.250000 0.000000 +vt 0.708333 0.333333 0.000000 +vt 0.708333 0.416667 0.000000 +vt 0.708333 0.500000 0.000000 +vt 0.708333 0.583333 0.000000 +vt 0.708333 0.666667 0.000000 +vt 0.708333 0.750000 0.000000 +vt 0.708333 0.833333 0.000000 +vt 0.708333 0.916667 0.000000 +vt 0.708333 1.000000 0.000000 +vt 0.716666 0.000000 0.000000 +vt 0.716666 0.083333 0.000000 +vt 0.716666 0.166667 0.000000 +vt 0.716666 0.250000 0.000000 +vt 0.716666 0.333333 0.000000 +vt 0.716666 0.416667 0.000000 +vt 0.716666 0.500000 0.000000 +vt 0.716666 0.583333 0.000000 +vt 0.716666 0.666667 0.000000 +vt 0.716666 0.750000 0.000000 +vt 0.716666 0.833333 0.000000 +vt 0.716666 0.916667 0.000000 +vt 0.716666 1.000000 0.000000 +vt 0.725000 0.000000 0.000000 +vt 0.725000 0.083333 0.000000 +vt 0.725000 0.166667 0.000000 +vt 0.725000 0.250000 0.000000 +vt 0.725000 0.333333 0.000000 +vt 0.725000 0.416667 0.000000 +vt 0.725000 0.500000 0.000000 +vt 0.725000 0.583333 0.000000 +vt 0.725000 0.666667 0.000000 +vt 0.725000 0.750000 0.000000 +vt 0.725000 0.833333 0.000000 +vt 0.725000 0.916667 0.000000 +vt 0.725000 1.000000 0.000000 +vt 0.733333 0.000000 0.000000 +vt 0.733333 0.083333 0.000000 +vt 0.733333 0.166667 0.000000 +vt 0.733333 0.250000 0.000000 +vt 0.733333 0.333333 0.000000 +vt 0.733333 0.416667 0.000000 +vt 0.733333 0.500000 0.000000 +vt 0.733333 0.583333 0.000000 +vt 0.733333 0.666667 0.000000 +vt 0.733333 0.750000 0.000000 +vt 0.733333 0.833333 0.000000 +vt 0.733333 0.916667 0.000000 +vt 0.733333 1.000000 0.000000 +vt 0.741666 0.000000 0.000000 +vt 0.741666 0.083333 0.000000 +vt 0.741666 0.166667 0.000000 +vt 0.741666 0.250000 0.000000 +vt 0.741666 0.333333 0.000000 +vt 0.741666 0.416667 0.000000 +vt 0.741666 0.500000 0.000000 +vt 0.741666 0.583333 0.000000 +vt 0.741666 0.666667 0.000000 +vt 0.741666 0.750000 0.000000 +vt 0.741666 0.833333 0.000000 +vt 0.741666 0.916667 0.000000 +vt 0.741666 1.000000 0.000000 +vt 0.750000 0.000000 0.000000 +vt 0.750000 0.083333 0.000000 +vt 0.750000 0.166667 0.000000 +vt 0.750000 0.250000 0.000000 +vt 0.750000 0.333333 0.000000 +vt 0.750000 0.416667 0.000000 +vt 0.750000 0.500000 0.000000 +vt 0.750000 0.583333 0.000000 +vt 0.750000 0.666667 0.000000 +vt 0.750000 0.750000 0.000000 +vt 0.750000 0.833333 0.000000 +vt 0.750000 0.916667 0.000000 +vt 0.750000 1.000000 0.000000 +vt 0.758333 0.000000 0.000000 +vt 0.758333 0.083333 0.000000 +vt 0.758333 0.166667 0.000000 +vt 0.758333 0.250000 0.000000 +vt 0.758333 0.333333 0.000000 +vt 0.758333 0.416667 0.000000 +vt 0.758333 0.500000 0.000000 +vt 0.758333 0.583333 0.000000 +vt 0.758333 0.666667 0.000000 +vt 0.758333 0.750000 0.000000 +vt 0.758333 0.833333 0.000000 +vt 0.758333 0.916667 0.000000 +vt 0.758333 1.000000 0.000000 +vt 0.766667 0.000000 0.000000 +vt 0.766667 0.083333 0.000000 +vt 0.766667 0.166667 0.000000 +vt 0.766667 0.250000 0.000000 +vt 0.766667 0.333333 0.000000 +vt 0.766667 0.416667 0.000000 +vt 0.766667 0.500000 0.000000 +vt 0.766667 0.583333 0.000000 +vt 0.766667 0.666667 0.000000 +vt 0.766667 0.750000 0.000000 +vt 0.766667 0.833333 0.000000 +vt 0.766667 0.916667 0.000000 +vt 0.766667 1.000000 0.000000 +vt 0.775000 0.000000 0.000000 +vt 0.775000 0.083333 0.000000 +vt 0.775000 0.166667 0.000000 +vt 0.775000 0.250000 0.000000 +vt 0.775000 0.333333 0.000000 +vt 0.775000 0.416667 0.000000 +vt 0.775000 0.500000 0.000000 +vt 0.775000 0.583333 0.000000 +vt 0.775000 0.666667 0.000000 +vt 0.775000 0.750000 0.000000 +vt 0.775000 0.833333 0.000000 +vt 0.775000 0.916667 0.000000 +vt 0.775000 1.000000 0.000000 +vt 0.783333 0.000000 0.000000 +vt 0.783333 0.083333 0.000000 +vt 0.783333 0.166667 0.000000 +vt 0.783333 0.250000 0.000000 +vt 0.783333 0.333333 0.000000 +vt 0.783333 0.416667 0.000000 +vt 0.783333 0.500000 0.000000 +vt 0.783333 0.583333 0.000000 +vt 0.783333 0.666667 0.000000 +vt 0.783333 0.750000 0.000000 +vt 0.783333 0.833333 0.000000 +vt 0.783333 0.916667 0.000000 +vt 0.783333 1.000000 0.000000 +vt 0.791667 0.000000 0.000000 +vt 0.791667 0.083333 0.000000 +vt 0.791667 0.166667 0.000000 +vt 0.791667 0.250000 0.000000 +vt 0.791667 0.333333 0.000000 +vt 0.791667 0.416667 0.000000 +vt 0.791667 0.500000 0.000000 +vt 0.791667 0.583333 0.000000 +vt 0.791667 0.666667 0.000000 +vt 0.791667 0.750000 0.000000 +vt 0.791667 0.833333 0.000000 +vt 0.791667 0.916667 0.000000 +vt 0.791667 1.000000 0.000000 +vt 0.800000 0.000000 0.000000 +vt 0.800000 0.083333 0.000000 +vt 0.800000 0.166667 0.000000 +vt 0.800000 0.250000 0.000000 +vt 0.800000 0.333333 0.000000 +vt 0.800000 0.416667 0.000000 +vt 0.800000 0.500000 0.000000 +vt 0.800000 0.583333 0.000000 +vt 0.800000 0.666667 0.000000 +vt 0.800000 0.750000 0.000000 +vt 0.800000 0.833333 0.000000 +vt 0.800000 0.916667 0.000000 +vt 0.800000 1.000000 0.000000 +vt 0.808333 0.000000 0.000000 +vt 0.808333 0.083333 0.000000 +vt 0.808333 0.166667 0.000000 +vt 0.808333 0.250000 0.000000 +vt 0.808333 0.333333 0.000000 +vt 0.808333 0.416667 0.000000 +vt 0.808333 0.500000 0.000000 +vt 0.808333 0.583333 0.000000 +vt 0.808333 0.666667 0.000000 +vt 0.808333 0.750000 0.000000 +vt 0.808333 0.833333 0.000000 +vt 0.808333 0.916667 0.000000 +vt 0.808333 1.000000 0.000000 +vt 0.816667 0.000000 0.000000 +vt 0.816667 0.083333 0.000000 +vt 0.816667 0.166667 0.000000 +vt 0.816667 0.250000 0.000000 +vt 0.816667 0.333333 0.000000 +vt 0.816667 0.416667 0.000000 +vt 0.816667 0.500000 0.000000 +vt 0.816667 0.583333 0.000000 +vt 0.816667 0.666667 0.000000 +vt 0.816667 0.750000 0.000000 +vt 0.816667 0.833333 0.000000 +vt 0.816667 0.916667 0.000000 +vt 0.816667 1.000000 0.000000 +vt 0.825000 0.000000 0.000000 +vt 0.825000 0.083333 0.000000 +vt 0.825000 0.166667 0.000000 +vt 0.825000 0.250000 0.000000 +vt 0.825000 0.333333 0.000000 +vt 0.825000 0.416667 0.000000 +vt 0.825000 0.500000 0.000000 +vt 0.825000 0.583333 0.000000 +vt 0.825000 0.666667 0.000000 +vt 0.825000 0.750000 0.000000 +vt 0.825000 0.833333 0.000000 +vt 0.825000 0.916667 0.000000 +vt 0.825000 1.000000 0.000000 +vt 0.833333 0.000000 0.000000 +vt 0.833333 0.083333 0.000000 +vt 0.833333 0.166667 0.000000 +vt 0.833333 0.250000 0.000000 +vt 0.833333 0.333333 0.000000 +vt 0.833333 0.416667 0.000000 +vt 0.833333 0.500000 0.000000 +vt 0.833333 0.583333 0.000000 +vt 0.833333 0.666667 0.000000 +vt 0.833333 0.750000 0.000000 +vt 0.833333 0.833333 0.000000 +vt 0.833333 0.916667 0.000000 +vt 0.833333 1.000000 0.000000 +vt 0.841667 0.000000 0.000000 +vt 0.841667 0.083333 0.000000 +vt 0.841667 0.166667 0.000000 +vt 0.841667 0.250000 0.000000 +vt 0.841667 0.333333 0.000000 +vt 0.841667 0.416667 0.000000 +vt 0.841667 0.500000 0.000000 +vt 0.841667 0.583333 0.000000 +vt 0.841667 0.666667 0.000000 +vt 0.841667 0.750000 0.000000 +vt 0.841667 0.833333 0.000000 +vt 0.841667 0.916667 0.000000 +vt 0.841667 1.000000 0.000000 +vt 0.850000 0.000000 0.000000 +vt 0.850000 0.083333 0.000000 +vt 0.850000 0.166667 0.000000 +vt 0.850000 0.250000 0.000000 +vt 0.850000 0.333333 0.000000 +vt 0.850000 0.416667 0.000000 +vt 0.850000 0.500000 0.000000 +vt 0.850000 0.583333 0.000000 +vt 0.850000 0.666667 0.000000 +vt 0.850000 0.750000 0.000000 +vt 0.850000 0.833333 0.000000 +vt 0.850000 0.916667 0.000000 +vt 0.850000 1.000000 0.000000 +vt 0.858334 0.000000 0.000000 +vt 0.858334 0.083333 0.000000 +vt 0.858334 0.166667 0.000000 +vt 0.858334 0.250000 0.000000 +vt 0.858334 0.333333 0.000000 +vt 0.858334 0.416667 0.000000 +vt 0.858334 0.500000 0.000000 +vt 0.858334 0.583333 0.000000 +vt 0.858334 0.666667 0.000000 +vt 0.858334 0.750000 0.000000 +vt 0.858334 0.833333 0.000000 +vt 0.858334 0.916667 0.000000 +vt 0.858334 1.000000 0.000000 +vt 0.866667 0.000000 0.000000 +vt 0.866667 0.083333 0.000000 +vt 0.866667 0.166667 0.000000 +vt 0.866667 0.250000 0.000000 +vt 0.866667 0.333333 0.000000 +vt 0.866667 0.416667 0.000000 +vt 0.866667 0.500000 0.000000 +vt 0.866667 0.583333 0.000000 +vt 0.866667 0.666667 0.000000 +vt 0.866667 0.750000 0.000000 +vt 0.866667 0.833333 0.000000 +vt 0.866667 0.916667 0.000000 +vt 0.866667 1.000000 0.000000 +vt 0.875000 0.000000 0.000000 +vt 0.875000 0.083333 0.000000 +vt 0.875000 0.166667 0.000000 +vt 0.875000 0.250000 0.000000 +vt 0.875000 0.333333 0.000000 +vt 0.875000 0.416667 0.000000 +vt 0.875000 0.500000 0.000000 +vt 0.875000 0.583333 0.000000 +vt 0.875000 0.666667 0.000000 +vt 0.875000 0.750000 0.000000 +vt 0.875000 0.833333 0.000000 +vt 0.875000 0.916667 0.000000 +vt 0.875000 1.000000 0.000000 +vt 0.883334 0.000000 0.000000 +vt 0.883334 0.083333 0.000000 +vt 0.883334 0.166667 0.000000 +vt 0.883334 0.250000 0.000000 +vt 0.883334 0.333333 0.000000 +vt 0.883334 0.416667 0.000000 +vt 0.883334 0.500000 0.000000 +vt 0.883334 0.583333 0.000000 +vt 0.883334 0.666667 0.000000 +vt 0.883334 0.750000 0.000000 +vt 0.883334 0.833333 0.000000 +vt 0.883334 0.916667 0.000000 +vt 0.883334 1.000000 0.000000 +vt 0.891667 0.000000 0.000000 +vt 0.891667 0.083333 0.000000 +vt 0.891667 0.166667 0.000000 +vt 0.891667 0.250000 0.000000 +vt 0.891667 0.333333 0.000000 +vt 0.891667 0.416667 0.000000 +vt 0.891667 0.500000 0.000000 +vt 0.891667 0.583333 0.000000 +vt 0.891667 0.666667 0.000000 +vt 0.891667 0.750000 0.000000 +vt 0.891667 0.833333 0.000000 +vt 0.891667 0.916667 0.000000 +vt 0.891667 1.000000 0.000000 +vt 0.900000 0.000000 0.000000 +vt 0.900000 0.083333 0.000000 +vt 0.900000 0.166667 0.000000 +vt 0.900000 0.250000 0.000000 +vt 0.900000 0.333333 0.000000 +vt 0.900000 0.416667 0.000000 +vt 0.900000 0.500000 0.000000 +vt 0.900000 0.583333 0.000000 +vt 0.900000 0.666667 0.000000 +vt 0.900000 0.750000 0.000000 +vt 0.900000 0.833333 0.000000 +vt 0.900000 0.916667 0.000000 +vt 0.900000 1.000000 0.000000 +vt 0.908334 0.000000 0.000000 +vt 0.908334 0.083333 0.000000 +vt 0.908334 0.166667 0.000000 +vt 0.908334 0.250000 0.000000 +vt 0.908334 0.333333 0.000000 +vt 0.908334 0.416667 0.000000 +vt 0.908334 0.500000 0.000000 +vt 0.908334 0.583333 0.000000 +vt 0.908334 0.666667 0.000000 +vt 0.908334 0.750000 0.000000 +vt 0.908334 0.833333 0.000000 +vt 0.908334 0.916667 0.000000 +vt 0.908334 1.000000 0.000000 +vt 0.916667 0.000000 0.000000 +vt 0.916667 0.083333 0.000000 +vt 0.916667 0.166667 0.000000 +vt 0.916667 0.250000 0.000000 +vt 0.916667 0.333333 0.000000 +vt 0.916667 0.416667 0.000000 +vt 0.916667 0.500000 0.000000 +vt 0.916667 0.583333 0.000000 +vt 0.916667 0.666667 0.000000 +vt 0.916667 0.750000 0.000000 +vt 0.916667 0.833333 0.000000 +vt 0.916667 0.916667 0.000000 +vt 0.916667 1.000000 0.000000 +vt 0.925000 0.000000 0.000000 +vt 0.925000 0.083333 0.000000 +vt 0.925000 0.166667 0.000000 +vt 0.925000 0.250000 0.000000 +vt 0.925000 0.333333 0.000000 +vt 0.925000 0.416667 0.000000 +vt 0.925000 0.500000 0.000000 +vt 0.925000 0.583333 0.000000 +vt 0.925000 0.666667 0.000000 +vt 0.925000 0.750000 0.000000 +vt 0.925000 0.833333 0.000000 +vt 0.925000 0.916667 0.000000 +vt 0.925000 1.000000 0.000000 +vt 0.933334 0.000000 0.000000 +vt 0.933334 0.083333 0.000000 +vt 0.933334 0.166667 0.000000 +vt 0.933334 0.250000 0.000000 +vt 0.933334 0.333333 0.000000 +vt 0.933334 0.416667 0.000000 +vt 0.933334 0.500000 0.000000 +vt 0.933334 0.583333 0.000000 +vt 0.933334 0.666667 0.000000 +vt 0.933334 0.750000 0.000000 +vt 0.933334 0.833333 0.000000 +vt 0.933334 0.916667 0.000000 +vt 0.933334 1.000000 0.000000 +vt 0.941667 0.000000 0.000000 +vt 0.941667 0.083333 0.000000 +vt 0.941667 0.166667 0.000000 +vt 0.941667 0.250000 0.000000 +vt 0.941667 0.333333 0.000000 +vt 0.941667 0.416667 0.000000 +vt 0.941667 0.500000 0.000000 +vt 0.941667 0.583333 0.000000 +vt 0.941667 0.666667 0.000000 +vt 0.941667 0.750000 0.000000 +vt 0.941667 0.833333 0.000000 +vt 0.941667 0.916667 0.000000 +vt 0.941667 1.000000 0.000000 +vt 0.950001 0.000000 0.000000 +vt 0.950001 0.083333 0.000000 +vt 0.950001 0.166667 0.000000 +vt 0.950001 0.250000 0.000000 +vt 0.950001 0.333333 0.000000 +vt 0.950001 0.416667 0.000000 +vt 0.950001 0.500000 0.000000 +vt 0.950001 0.583333 0.000000 +vt 0.950001 0.666667 0.000000 +vt 0.950001 0.750000 0.000000 +vt 0.950001 0.833333 0.000000 +vt 0.950001 0.916667 0.000000 +vt 0.950001 1.000000 0.000000 +vt 0.958334 0.000000 0.000000 +vt 0.958334 0.083333 0.000000 +vt 0.958334 0.166667 0.000000 +vt 0.958334 0.250000 0.000000 +vt 0.958334 0.333333 0.000000 +vt 0.958334 0.416667 0.000000 +vt 0.958334 0.500000 0.000000 +vt 0.958334 0.583333 0.000000 +vt 0.958334 0.666667 0.000000 +vt 0.958334 0.750000 0.000000 +vt 0.958334 0.833333 0.000000 +vt 0.958334 0.916667 0.000000 +vt 0.958334 1.000000 0.000000 +vt 0.966667 0.000000 0.000000 +vt 0.966667 0.083333 0.000000 +vt 0.966667 0.166667 0.000000 +vt 0.966667 0.250000 0.000000 +vt 0.966667 0.333333 0.000000 +vt 0.966667 0.416667 0.000000 +vt 0.966667 0.500000 0.000000 +vt 0.966667 0.583333 0.000000 +vt 0.966667 0.666667 0.000000 +vt 0.966667 0.750000 0.000000 +vt 0.966667 0.833333 0.000000 +vt 0.966667 0.916667 0.000000 +vt 0.966667 1.000000 0.000000 +vt 0.975001 0.000000 0.000000 +vt 0.975001 0.083333 0.000000 +vt 0.975001 0.166667 0.000000 +vt 0.975001 0.250000 0.000000 +vt 0.975001 0.333333 0.000000 +vt 0.975001 0.416667 0.000000 +vt 0.975001 0.500000 0.000000 +vt 0.975001 0.583333 0.000000 +vt 0.975001 0.666667 0.000000 +vt 0.975001 0.750000 0.000000 +vt 0.975001 0.833333 0.000000 +vt 0.975001 0.916667 0.000000 +vt 0.975001 1.000000 0.000000 +vt 0.983334 0.000000 0.000000 +vt 0.983334 0.083333 0.000000 +vt 0.983334 0.166667 0.000000 +vt 0.983334 0.250000 0.000000 +vt 0.983334 0.333333 0.000000 +vt 0.983334 0.416667 0.000000 +vt 0.983334 0.500000 0.000000 +vt 0.983334 0.583333 0.000000 +vt 0.983334 0.666667 0.000000 +vt 0.983334 0.750000 0.000000 +vt 0.983334 0.833333 0.000000 +vt 0.983334 0.916667 0.000000 +vt 0.983334 1.000000 0.000000 +vt 0.991667 0.000000 0.000000 +vt 0.991667 0.083333 0.000000 +vt 0.991667 0.166667 0.000000 +vt 0.991667 0.250000 0.000000 +vt 0.991667 0.333333 0.000000 +vt 0.991667 0.416667 0.000000 +vt 0.991667 0.500000 0.000000 +vt 0.991667 0.583333 0.000000 +vt 0.991667 0.666667 0.000000 +vt 0.991667 0.750000 0.000000 +vt 0.991667 0.833333 0.000000 +vt 0.991667 0.916667 0.000000 +vt 0.991667 1.000000 0.000000 +vt 1.000001 0.000000 0.000000 +vt 1.000001 0.083333 0.000000 +vt 1.000001 0.166667 0.000000 +vt 1.000001 0.250000 0.000000 +vt 1.000001 0.333333 0.000000 +vt 1.000001 0.416667 0.000000 +vt 1.000001 0.500000 0.000000 +vt 1.000001 0.583333 0.000000 +vt 1.000001 0.666667 0.000000 +vt 1.000001 0.750000 0.000000 +vt 1.000001 0.833333 0.000000 +vt 1.000001 0.916667 0.000000 +vt 1.000001 1.000000 0.000000 +# 1573 texture vertices + +vn 0.706087 -0.006584 -0.708094 +vn 0.867285 -0.348497 -0.355480 +vn 0.796273 -0.598027 0.091180 +vn 0.511819 -0.689382 0.512633 +vn 0.089978 -0.597623 0.796712 +vn -0.356096 -0.346479 0.867841 +vn -0.706522 -0.002193 0.707688 +vn -0.866975 0.344610 0.359998 +vn -0.794133 0.602130 -0.082409 +vn -0.508660 0.697600 -0.504598 +vn -0.087976 0.599868 -0.795248 +vn 0.356392 0.339770 -0.870368 +vn 0.704919 -0.098427 -0.702426 +vn 0.879575 -0.369912 -0.299187 +vn 0.818284 -0.545003 0.182709 +vn 0.537410 -0.576880 0.615142 +vn 0.112131 -0.455943 0.882917 +vn -0.343334 -0.213583 0.914606 +vn -0.706471 0.086456 0.702442 +vn -0.879463 0.366063 0.304209 +vn -0.815428 0.552176 -0.173720 +vn -0.533854 0.587659 -0.607994 +vn -0.111207 0.454977 -0.883532 +vn 0.341870 0.201106 -0.917977 +vn 0.704202 -0.180675 -0.686627 +vn 0.900242 -0.360542 -0.244078 +vn 0.854561 -0.447927 0.262842 +vn 0.579562 -0.418166 0.699460 +vn 0.148828 -0.277872 0.949019 +vn -0.321855 -0.063783 0.944638 +vn -0.705913 0.167817 0.688131 +vn -0.900168 0.357408 0.248910 +vn -0.852094 0.456519 -0.255980 +vn -0.577341 0.428069 -0.695295 +vn -0.149554 0.271508 -0.950746 +vn 0.319186 0.046558 -0.946548 +vn 0.704391 -0.247785 -0.665159 +vn 0.925877 -0.318074 -0.203914 +vn 0.899078 -0.307147 0.311962 +vn 0.631184 -0.216021 0.744944 +vn 0.193764 -0.067997 0.978689 +vn -0.295515 0.097701 0.950329 +vn -0.705232 0.237374 0.668058 +vn -0.925970 0.315297 0.207767 +vn -0.898853 0.311443 -0.308327 +vn -0.632034 0.218482 -0.743504 +vn -0.195728 0.056607 -0.979023 +vn 0.293278 -0.114855 -0.949103 +vn 0.704913 -0.299944 -0.642753 +vn 0.949221 -0.250685 -0.190096 +vn 0.939458 -0.136816 0.314166 +vn 0.677864 0.012679 0.735078 +vn 0.234278 0.158293 0.959196 +vn -0.271888 0.261065 0.926241 +vn -0.704820 0.293792 0.645690 +vn -0.949326 0.248139 0.192890 +vn -0.940472 0.135502 -0.311691 +vn -0.679764 -0.017231 -0.733228 +vn -0.235714 -0.169489 -0.956929 +vn 0.271258 -0.272418 -0.923151 +vn 0.705629 -0.340378 -0.621475 +vn 0.963172 -0.173548 -0.205381 +vn 0.963062 0.038570 0.266503 +vn 0.704755 0.240062 0.667601 +vn 0.257281 0.377021 0.889754 +vn -0.258861 0.412666 0.873326 +vn -0.705260 0.337638 0.623386 +vn -0.963095 0.171830 0.207177 +vn -0.963566 -0.041441 -0.264242 +vn -0.705524 -0.245729 -0.664721 +vn -0.257565 -0.384354 -0.886528 +vn 0.259082 -0.418179 -0.870634 +vn 0.707279 -0.370781 -0.601895 +vn 0.964613 -0.100606 -0.243720 +vn 0.963863 0.196042 0.180377 +vn 0.704647 0.440173 0.556524 +vn 0.256333 0.566233 0.783373 +vn -0.260402 0.540397 0.800101 +vn -0.707029 0.369783 0.602802 +vn -0.964465 0.099774 0.244645 +vn -0.963764 -0.198114 -0.178636 +vn -0.704431 -0.443893 -0.553838 +vn -0.255993 -0.570148 -0.780640 +vn 0.260729 -0.542838 -0.798340 +vn 0.710065 -0.391745 -0.585102 +vn 0.954382 -0.039081 -0.296020 +vn 0.943274 0.323936 0.072802 +vn 0.679212 0.600241 0.422352 +vn 0.232918 0.715578 0.658557 +vn -0.275569 0.639065 0.718093 +vn -0.709962 0.391435 0.585434 +vn -0.954281 0.038781 0.296384 +vn -0.943006 -0.324946 -0.071758 +vn -0.678738 -0.602023 -0.420575 +vn -0.232461 -0.717344 -0.656794 +vn 0.275825 -0.640074 -0.717096 +vn 0.713282 -0.404532 -0.572349 +vn 0.934618 0.009822 -0.355516 +vn 0.905749 0.421608 -0.043184 +vn 0.634003 0.720518 0.280882 +vn 0.192191 0.826207 0.529570 +vn -0.300942 0.710424 0.636185 +vn -0.713258 0.404456 0.572432 +vn -0.934593 -0.009879 0.355581 +vn -0.905573 -0.421942 0.043621 +vn -0.633664 -0.721151 -0.280020 +vn -0.191869 -0.826850 -0.528682 +vn 0.301101 -0.710787 -0.635704 +vn 0.715817 -0.411099 -0.564449 +vn 0.906667 0.047375 -0.419179 +vn 0.854736 0.493301 -0.161494 +vn 0.573621 0.807138 0.139600 +vn 0.138667 0.904524 0.403247 +vn -0.333288 0.759456 0.558700 +vn -0.715823 0.411090 0.564449 +vn -0.906717 -0.047332 0.419074 +vn -0.854746 -0.493296 0.161457 +vn -0.573545 -0.807218 -0.139449 +vn -0.138553 -0.904658 -0.402985 +vn 0.333361 -0.759555 -0.558522 +vn 0.716451 -0.413639 -0.561784 +vn 0.870396 0.074611 -0.486666 +vn 0.791228 0.543056 -0.281156 +vn 0.499908 0.866079 -0.000172 +vn 0.074544 0.956840 0.280892 +vn -0.370646 0.791124 0.486564 +vn -0.716467 0.413641 0.561761 +vn -0.870546 -0.074538 0.486410 +vn -0.791498 -0.542907 0.280683 +vn -0.500170 -0.865927 -0.000272 +vn -0.074672 -0.956772 -0.281090 +vn 0.370643 -0.791128 -0.486559 +vn 0.713915 -0.414360 -0.564474 +vn 0.824267 0.091113 -0.558822 +vn 0.713816 0.572386 -0.403536 +vn 0.411963 0.900388 -0.139958 +vn -0.000325 0.986917 0.161230 +vn -0.412372 0.808898 0.419087 +vn -0.713955 0.414358 0.564425 +vn -0.824601 -0.091060 0.558338 +vn -0.714509 -0.572237 0.402519 +vn -0.412728 -0.900206 0.138867 +vn -0.000130 -0.986813 -0.161863 +vn 0.412281 -0.808880 -0.419211 +vn 0.706879 -0.415459 -0.572465 +vn 0.765589 0.094585 -0.636339 +vn 0.619154 0.579523 -0.529907 +vn 0.306678 0.909301 -0.281283 +vn -0.087970 0.995199 0.042900 +vn -0.458880 0.814310 0.355426 +vn -0.707010 0.415438 0.572318 +vn -0.766317 -0.094656 0.635452 +vn -0.620644 -0.579602 0.528074 +vn -0.308326 -0.909354 0.279303 +vn 0.086972 -0.995235 -0.044084 +vn 0.458634 -0.814320 -0.355722 +vn 0.693940 -0.419115 -0.585483 +vn 0.691032 0.080838 -0.718289 +vn 0.502857 0.559386 -0.658955 +vn 0.179779 0.888207 -0.422809 +vn -0.191405 0.978784 -0.073114 +vn -0.511139 0.806946 0.295932 +vn -0.694354 0.419020 0.585060 +vn -0.692599 -0.081300 0.716726 +vn -0.505875 -0.560230 0.655922 +vn -0.183015 -0.889071 0.419594 +vn 0.189487 -0.979300 0.071173 +vn 0.510582 -0.807071 -0.296551 +vn 0.673696 -0.427394 -0.602884 +vn 0.597892 0.044574 -0.800336 +vn 0.361634 0.504846 -0.783806 +vn 0.028253 0.830034 -0.556997 +vn -0.312581 0.932549 -0.180680 +vn -0.569574 0.784994 0.243658 +vn -0.674855 0.427021 0.601851 +vn -0.601147 -0.046037 0.797812 +vn -0.367340 -0.507580 0.779374 +vn -0.033968 -0.832839 0.552471 +vn 0.309371 -0.934156 0.177881 +vn 0.568444 -0.785438 -0.244863 +vn 0.644926 -0.441917 -0.623522 +vn 0.486366 -0.018036 -0.873569 +vn 0.197096 0.410883 -0.890128 +vn -0.145296 0.729868 -0.667968 +vn -0.448674 0.852975 -0.266694 +vn -0.632051 0.747208 0.205408 +vn -0.647755 0.440663 0.621474 +vn -0.492825 0.014288 0.870011 +vn -0.206800 -0.417277 0.884937 +vn 0.137042 -0.735918 0.663057 +vn 0.444523 -0.856175 0.263368 +vn 0.630102 -0.748285 -0.207463 +vn 0.606655 -0.463443 -0.645902 +vn 0.361451 -0.105182 -0.926440 +vn 0.019024 0.281458 -0.959385 +vn -0.328884 0.592736 -0.735186 +vn -0.588808 0.744737 -0.314120 +vn -0.691861 0.696506 0.190285 +vn -0.612390 0.460092 0.642879 +vn -0.373052 0.096940 0.922732 +vn -0.032694 -0.292647 0.955662 +vn 0.321062 -0.601047 0.731889 +vn 0.585907 -0.748359 0.310919 +vn 0.689251 -0.698275 -0.193249 +vn 0.557879 -0.492000 -0.668361 +vn 0.231666 -0.207331 -0.950444 +vn -0.156747 0.133225 -0.978612 +vn -0.503584 0.437975 -0.744702 +vn -0.716056 0.624634 -0.311603 +vn -0.738452 0.642608 0.204314 +vn -0.566841 0.485608 0.665489 +vn -0.247421 0.194387 0.949208 +vn 0.143371 -0.145854 0.978862 +vn 0.501645 -0.442738 0.743192 +vn 0.717623 -0.624683 0.307877 +vn 0.735719 -0.644490 -0.208206 +vn 0.497839 -0.527380 -0.688496 +vn 0.104909 -0.310823 -0.944660 +vn -0.315996 -0.010480 -0.948703 +vn -0.652700 0.292396 -0.698918 +vn -0.815542 0.515877 -0.262225 +vn -0.762231 0.599292 0.244649 +vn -0.508359 0.519076 0.687118 +vn -0.119883 0.297823 0.947064 +vn 0.307847 0.002313 0.951433 +vn 0.657266 -0.289777 0.695723 +vn 0.820453 -0.511323 0.255744 +vn 0.759287 -0.601055 -0.249432 +vn 0.427523 -0.568613 -0.702783 +vn -0.014112 -0.404269 -0.914531 +vn -0.451762 -0.131110 -0.882452 +vn -0.768899 0.176775 -0.614446 +vn -0.881297 0.436119 -0.181978 +vn -0.759879 0.576794 0.299822 +vn -0.437320 0.560867 0.702979 +vn 0.003151 0.395124 0.918622 +vn 0.448815 0.128463 0.884343 +vn 0.774941 -0.171029 0.608453 +vn 0.885391 -0.431266 0.173473 +vn 0.756364 -0.578826 -0.304753 +vn 0.350661 -0.612994 -0.708008 +vn -0.122849 -0.481651 -0.867710 +vn -0.563300 -0.220889 -0.796179 +vn -0.853371 0.098657 -0.511883 +vn -0.916027 0.390792 -0.090423 +vn -0.735014 0.577010 0.356108 +vn -0.358148 0.607954 0.708606 +vn 0.116431 0.477495 0.870886 +vn 0.563478 0.222047 0.795731 +vn 0.858264 -0.093225 0.504671 +vn 0.918245 -0.387438 0.081958 +vn 0.731470 -0.578727 -0.360592 +vn 0.273022 -0.656960 -0.702753 +vn -0.219020 -0.541963 -0.811361 +vn -0.652317 -0.281500 -0.703733 +vn -0.911334 0.054116 -0.408096 +vn -0.927155 0.374665 -0.003071 +vn -0.695650 0.594385 0.403458 +vn -0.277893 0.655133 0.702549 +vn 0.216024 0.541781 0.812285 +vn 0.653771 0.284554 0.701151 +vn 0.914758 -0.049692 0.400934 +vn 0.928097 -0.372312 -0.004406 +vn 0.692725 -0.595016 -0.407539 +vn 0.200702 -0.697290 -0.688117 +vn -0.300436 -0.587117 -0.751686 +vn -0.721065 -0.319413 -0.614850 +vn -0.948885 0.033798 -0.313808 +vn -0.923135 0.377818 0.071245 +vn -0.650585 0.620749 0.437503 +vn -0.203432 0.698045 0.686548 +vn 0.299458 0.589334 0.750340 +vn 0.722742 0.323177 0.610902 +vn 0.951174 -0.030060 0.307188 +vn 0.923502 -0.375641 -0.077708 +vn 0.648577 -0.620002 -0.441527 +vn 0.138474 -0.732145 -0.666925 +vn -0.365831 -0.620479 -0.693666 +vn -0.772125 -0.342343 -0.535373 +vn -0.971809 0.027609 -0.234148 +vn -0.911515 0.390313 0.129602 +vn -0.607204 0.648855 0.458575 +vn -0.139839 0.734248 0.664323 +vn 0.365746 0.623564 0.690940 +vn 0.773504 0.345983 0.531024 +vn 0.973262 -0.024426 0.228396 +vn 0.911656 -0.388117 -0.135084 +vn 0.605989 -0.647180 -0.462531 +vn 0.088816 -0.760914 -0.642745 +vn -0.415492 -0.645436 -0.640921 +vn -0.808482 -0.356786 -0.468039 +vn -0.985015 0.027651 -0.170237 +vn -0.897845 0.404962 0.172860 +vn -0.570162 0.674240 0.469378 +vn -0.089423 0.763447 0.639651 +vn 0.415695 0.648529 0.637658 +vn 0.809456 0.359991 0.463883 +vn 0.985912 -0.024902 0.165400 +vn 0.897931 -0.402767 -0.177479 +vn 0.569514 -0.672150 -0.473146 +vn 0.052105 -0.783918 -0.618674 +vn -0.450957 -0.664859 -0.595483 +vn -0.833191 -0.367431 -0.413264 +vn -0.992269 0.028670 -0.120746 +vn -0.885587 0.417387 0.203773 +vn -0.541620 0.694681 0.473356 +vn -0.052347 0.786280 0.615649 +vn 0.451173 0.667510 0.592345 +vn 0.833798 0.370047 0.409691 +vn 0.992797 -0.026378 0.116866 +vn 0.885660 -0.415379 -0.207526 +vn 0.541314 -0.692638 -0.476688 +vn 0.027154 -0.801779 -0.597003 +vn -0.474531 -0.680688 -0.558108 +vn -0.849065 -0.377014 -0.370066 +vn -0.996141 0.027884 -0.083222 +vn -0.876357 0.425564 0.225599 +vn -0.521749 0.709530 0.473651 +vn -0.027241 0.803695 0.594417 +vn 0.474676 0.682744 0.555467 +vn 0.849401 0.379014 0.367242 +vn 0.996432 -0.026078 0.080275 +vn 0.876417 -0.423896 -0.228486 +vn 0.521622 -0.707808 -0.476360 +vn 0.011881 -0.815100 -0.579198 +vn -0.488802 -0.693957 -0.528674 +vn -0.858507 -0.386713 -0.336776 +vn -0.998195 0.024313 -0.054909 +vn -0.870441 0.429016 0.241409 +vn -0.509450 0.718987 0.472778 +vn -0.011907 0.816525 0.577188 +vn 0.488878 0.695449 0.526639 +vn 0.858670 0.388168 0.334681 +vn 0.998342 -0.022963 0.052779 +vn 0.870486 -0.427733 -0.243513 +vn 0.509409 -0.717667 -0.474823 +vn 0.003905 -0.824377 -0.566027 +vn -0.496262 -0.705093 -0.506526 +vn -0.863454 -0.396773 -0.311479 +vn -0.999289 0.017972 -0.033148 +vn -0.867373 0.428026 0.253884 +vn -0.503046 0.723530 0.472704 +vn -0.003913 0.825301 0.564679 +vn 0.496289 0.706050 0.505164 +vn 0.863515 0.397711 0.310109 +vn 0.999349 -0.017085 0.031783 +vn 0.867398 -0.427172 -0.255234 +vn 0.503037 -0.722657 -0.474046 +vn 0.000756 -0.829916 -0.557888 +vn -0.499261 -0.714031 -0.490814 +vn -0.865502 -0.406771 -0.292307 +vn -0.999833 0.009538 -0.015561 +vn -0.866262 0.423352 0.265262 +vn -0.500577 0.723797 0.474911 +vn -0.000761 0.830369 0.557214 +vn 0.499265 0.714502 0.490125 +vn 0.865515 0.407233 0.291626 +vn 0.999848 -0.009103 0.014902 +vn 0.866268 -0.422935 -0.265906 +vn 0.500574 -0.723371 -0.475563 +vn -0.000004 -0.831894 -0.554934 +vn -0.500002 -0.720433 -0.480597 +vn -0.866026 -0.415941 -0.277473 +vn -1.000000 -0.000003 0.000009 +vn -0.866024 0.415936 0.277488 +vn -0.499999 0.720430 0.480606 +vn -0.000000 0.831891 0.554939 +vn 0.499999 0.720447 0.480580 +vn 0.866025 0.415951 0.277463 +vn 1.000000 -0.000008 0.000009 +vn 0.866023 -0.415963 -0.277449 +vn 0.499996 -0.720454 -0.480573 +vn -0.000778 -0.830373 -0.557208 +vn -0.500592 -0.723793 -0.474901 +vn -0.866270 -0.423346 -0.265243 +vn -0.999833 -0.009534 0.015588 +vn -0.865493 0.406772 0.292333 +vn -0.499246 0.714030 0.490830 +vn 0.000774 0.829913 0.557893 +vn 0.500589 0.723361 0.475563 +vn 0.866277 0.422914 0.265910 +vn 0.999848 0.009075 -0.014891 +vn 0.865507 -0.407259 -0.291612 +vn 0.499250 -0.714518 -0.490115 +vn -0.003971 -0.825311 -0.564664 +vn -0.503097 -0.723510 -0.472680 +vn -0.867402 -0.427991 -0.253845 +vn -0.999288 -0.017937 0.033200 +vn -0.863423 0.396798 0.311531 +vn -0.496211 0.705103 0.506561 +vn 0.003963 0.824370 0.566037 +vn 0.503087 0.722630 0.474035 +vn 0.867427 0.427123 0.255218 +vn 0.999350 0.017021 -0.031791 +vn 0.863488 -0.397775 -0.310103 +vn 0.496241 -0.706092 -0.505153 +vn -0.012032 -0.816539 -0.577164 +vn -0.509559 -0.718939 -0.472734 +vn -0.870503 -0.428930 -0.241338 +vn -0.998192 -0.024223 0.055000 +vn -0.858441 0.386782 0.336865 +vn -0.488691 0.693991 0.528732 +vn 0.012007 0.815093 0.579206 +vn 0.509517 0.717615 0.474785 +vn 0.870548 0.427640 0.243455 +vn 0.998343 0.022842 -0.052825 +vn 0.858609 -0.388287 -0.334699 +vn 0.488771 -0.695529 -0.526633 +vn -0.027451 -0.803731 -0.594359 +vn -0.521931 -0.709458 -0.473558 +vn -0.876458 -0.425426 -0.225465 +vn -0.996131 -0.027737 0.083384 +vn -0.848949 0.377125 0.370220 +vn -0.474339 0.680739 0.558208 +vn 0.027369 0.801760 0.597020 +vn 0.521804 0.707715 0.476299 +vn 0.876520 0.423735 0.228390 +vn 0.996431 0.025869 -0.080350 +vn 0.849298 -0.379222 -0.367265 +vn 0.474496 -0.682889 -0.555442 +vn -0.052683 -0.786319 -0.615571 +vn -0.541908 -0.694551 -0.473217 +vn -0.885743 -0.417156 -0.203571 +vn -0.992247 -0.028424 0.120986 +vn -0.832999 0.367620 0.413484 +vn -0.450649 0.664953 0.595612 +vn 0.052446 0.783901 0.618667 +vn 0.541597 0.692508 0.476555 +vn 0.885815 0.415143 0.207335 +vn 0.992787 0.026068 -0.117023 +vn 0.833626 -0.370357 -0.409760 +vn 0.450882 -0.667720 -0.592330 +vn -0.089860 -0.763509 -0.639515 +vn -0.570530 -0.674079 -0.469162 +vn -0.898032 -0.404674 -0.172564 +vn -0.984965 -0.027352 0.170575 +vn -0.808211 0.357010 0.468337 +vn -0.415075 0.645540 0.641085 +vn 0.089266 0.760883 0.642719 +vn 0.569880 0.671977 0.472952 +vn 0.898124 0.402452 0.177218 +vn 0.985890 0.024479 -0.165598 +vn 0.809227 -0.360424 -0.463947 +vn 0.415313 -0.648826 -0.637604 +vn -0.140369 -0.734354 -0.664094 +vn -0.607641 -0.648674 -0.458252 +vn -0.911713 -0.389988 -0.129180 +vn -0.971706 -0.027286 0.234611 +vn -0.771752 0.342570 0.535766 +vn -0.365293 0.620570 0.693868 +vn 0.139032 0.732087 0.666873 +vn 0.606428 0.646956 0.462269 +vn 0.911880 0.387703 0.134766 +vn 0.973231 0.023843 -0.228590 +vn 0.773230 -0.346598 -0.531022 +vn 0.365285 -0.623992 -0.690797 +vn -0.204094 -0.698135 -0.686260 +vn -0.651114 -0.620487 -0.437089 +vn -0.923343 -0.377411 -0.070702 +vn -0.948705 -0.033421 0.314391 +vn -0.720555 0.319669 0.615314 +vn -0.299745 0.587228 0.751875 +vn 0.201386 0.697248 0.687960 +vn 0.649087 0.619771 0.441101 +vn 0.923739 0.375155 0.077239 +vn 0.951113 0.029315 -0.307450 +vn 0.722397 -0.323980 -0.610884 +vn 0.298882 -0.589866 -0.750151 +vn -0.278534 -0.655324 -0.702118 +vn -0.696140 -0.594181 -0.402911 +vn -0.927281 -0.374346 0.003745 +vn -0.911038 -0.053861 0.408789 +vn -0.651691 0.281635 0.704259 +vn -0.218246 0.541997 0.811547 +vn 0.273737 0.656895 0.702536 +vn 0.693230 0.594765 0.407046 +vn 0.928346 0.371695 0.003951 +vn 0.914769 0.048638 -0.401038 +vn 0.653527 -0.285727 -0.700901 +vn 0.215509 -0.542555 -0.811905 +vn -0.358733 -0.608193 -0.708105 +vn -0.735442 -0.576844 -0.355494 +vn -0.916041 -0.390586 0.091165 +vn -0.852939 -0.098567 0.512620 +vn -0.562561 0.220881 0.796703 +vn -0.122031 0.481624 0.867840 +vn 0.351344 0.612960 0.707698 +vn 0.731920 0.578513 0.360021 +vn 0.918535 0.386663 -0.082375 +vn 0.858492 0.091695 -0.504562 +vn 0.563513 -0.223752 -0.795229 +vn 0.116070 -0.478525 -0.870369 +vn -0.437720 -0.561247 -0.702426 +vn -0.760155 -0.576762 -0.299182 +vn -0.881136 -0.436137 0.182715 +vn -0.768297 -0.176956 0.615147 +vn -0.450918 0.130876 0.882918 +vn -0.013294 0.404138 0.914602 +vn 0.428113 0.568603 0.702431 +vn 0.756748 0.578618 0.304193 +vn 0.885898 0.430116 -0.173742 +vn 0.775833 0.168524 -0.608015 +vn 0.449606 -0.131169 -0.883544 +vn 0.003206 -0.396607 -0.917983 +vn -0.508562 -0.519535 -0.686621 +vn -0.762359 -0.599364 -0.244074 +vn -0.815199 -0.516103 0.262845 +vn -0.651926 -0.292825 0.699462 +vn -0.315058 0.010054 0.949019 +vn 0.105692 0.310630 0.944637 +vn 0.498294 0.527430 0.688128 +vn 0.759613 0.600862 0.248905 +vn 0.821406 0.509670 -0.255984 +vn 0.659387 0.285953 -0.695298 +vn 0.309917 -0.006252 -0.950743 +vn -0.119256 -0.299730 -0.946541 +vn -0.566782 -0.486128 -0.665160 +vn -0.738399 -0.642795 -0.203916 +vn -0.715538 -0.625049 0.311960 +vn -0.502677 -0.438607 0.744943 +vn -0.155775 -0.133803 0.978688 +vn 0.232364 0.207075 0.950330 +vn 0.558186 0.492061 0.668060 +vn 0.736042 0.644263 0.207769 +vn 0.719148 0.622705 -0.308326 +vn 0.505229 0.438117 -0.743503 +vn 0.146882 0.141211 -0.979023 +vn -0.246109 -0.196552 -0.949103 +vn -0.612215 -0.460500 -0.642754 +vn -0.691711 -0.696705 -0.190097 +vn -0.588219 -0.745183 0.314166 +vn -0.327957 -0.593383 0.735079 +vn 0.019941 -0.282033 0.959197 +vn 0.362028 0.104932 0.926242 +vn 0.606840 0.463497 0.645691 +vn 0.689559 0.698070 0.192890 +vn 0.587589 0.746718 -0.311692 +vn 0.324967 0.597304 -0.733229 +vn -0.028918 0.288875 -0.956930 +vn -0.371547 -0.098709 -0.923152 +vn -0.647590 -0.440903 -0.621476 +vn -0.631884 -0.747356 -0.205381 +vn -0.448132 -0.853319 0.266503 +vn -0.144483 -0.730364 0.667602 +vn 0.197864 -0.411320 0.889756 +vn 0.486806 0.017849 0.873328 +vn 0.645032 0.441954 0.623387 +vn 0.630360 0.748147 0.207176 +vn 0.445901 0.855188 -0.264244 +vn 0.139961 0.733862 -0.664724 +vn -0.204073 0.415233 -0.886530 +vn -0.491692 -0.015283 -0.870635 +vn -0.674745 -0.427131 -0.601896 +vn -0.569436 -0.785076 -0.243718 +vn -0.312158 -0.932749 0.180379 +vn 0.028874 -0.830327 0.556528 +vn 0.362202 -0.505105 0.783376 +vn 0.598196 -0.044683 0.800103 +vn 0.673755 0.427414 0.602803 +vn 0.568641 0.785364 0.244645 +vn 0.310314 0.933699 -0.178639 +vn -0.032202 0.831999 -0.553842 +vn -0.365761 0.506767 -0.780645 +vn -0.600473 0.045620 -0.798343 +vn -0.694293 -0.419062 -0.585102 +vn -0.511038 -0.806978 -0.296018 +vn -0.191104 -0.978866 0.072806 +vn 0.180213 -0.888334 0.422357 +vn 0.503246 -0.559500 0.658561 +vn 0.691229 -0.080882 0.718095 +vn 0.693973 0.419128 0.585434 +vn 0.510727 0.807041 0.296382 +vn 0.190093 0.979140 -0.071760 +vn -0.181995 0.888815 -0.420578 +vn -0.505005 0.559989 -0.656797 +vn -0.692230 0.081164 -0.717098 +vn -0.706975 -0.415454 -0.572349 +vn -0.458804 -0.814315 -0.355514 +vn -0.087755 -0.995206 -0.043180 +vn 0.306981 -0.909321 0.280887 +vn 0.619417 -0.579545 0.529575 +vn 0.765714 -0.094588 0.636188 +vn 0.706898 0.415471 0.572432 +vn 0.458743 0.814321 0.355579 +vn 0.087376 0.995220 0.043618 +vn -0.307702 0.909344 -0.280022 +vn -0.620137 0.579588 -0.528685 +vn -0.766109 0.094632 -0.635706 +vn -0.713931 -0.414366 -0.564449 +vn -0.412308 -0.808884 -0.419177 +vn -0.000160 -0.986874 -0.161489 +vn 0.412187 -0.900340 0.139607 +vn 0.714003 -0.572352 0.403253 +vn 0.824350 -0.091092 0.558704 +vn 0.713926 0.414376 0.564449 +vn 0.412369 0.808907 0.419073 +vn 0.000168 0.986880 0.161455 +vn -0.412298 0.900313 -0.139450 +vn -0.714180 0.572320 -0.402986 +vn -0.824474 0.091078 -0.558523 +vn -0.716447 -0.413645 -0.561784 +vn -0.370584 -0.791092 -0.486664 +vn 0.074684 -0.956753 -0.281151 +vn 0.500088 -0.865974 -0.000165 +vn 0.791372 -0.542979 0.280898 +vn 0.870454 -0.074575 0.486568 +vn 0.716457 0.413658 0.561761 +vn 0.370723 0.791185 0.486407 +vn -0.074421 0.956912 0.280680 +vn -0.499829 0.866124 -0.000274 +vn -0.791252 0.543054 -0.281091 +vn -0.870459 0.074578 -0.486559 +vn -0.715804 -0.411089 -0.564474 +vn -0.333228 -0.759394 -0.558820 +vn 0.138793 -0.904377 -0.403533 +vn 0.573776 -0.806966 -0.139955 +vn 0.854856 -0.493178 0.161233 +vn 0.906711 -0.047325 0.419089 +vn 0.715822 0.411125 0.564425 +vn 0.333442 0.759658 0.558334 +vn -0.138314 0.904905 0.402511 +vn -0.573234 0.807540 0.138859 +vn -0.854538 0.493522 -0.161869 +vn -0.906650 0.047395 -0.419213 +vn -0.713237 -0.404446 -0.572465 +vn -0.300883 -0.710313 -0.636337 +vn 0.192304 -0.825965 -0.529906 +vn 0.634138 -0.720242 -0.281282 +vn 0.905852 -0.421417 0.042901 +vn 0.934653 -0.009754 0.355426 +vn 0.713285 0.404570 0.572317 +vn 0.301186 0.710982 0.635446 +vn -0.191624 0.827302 0.528064 +vn -0.633356 0.721704 0.279291 +vn -0.905381 0.422304 -0.044092 +vn -0.934537 0.009974 -0.355725 +vn -0.709934 -0.391412 -0.585483 +vn -0.275509 -0.638871 -0.718288 +vn 0.233013 -0.715182 -0.658953 +vn 0.679320 -0.599799 -0.422806 +vn 0.943354 -0.323633 -0.073112 +vn 0.954404 0.039185 0.295933 +vn 0.710059 0.391820 0.585058 +vn 0.275893 0.640466 0.716720 +vn -0.232232 0.718226 0.655911 +vn -0.678447 0.603041 0.419584 +vn -0.942841 0.325556 0.071166 +vn -0.954234 -0.038640 -0.296554 +vn -0.706981 -0.369741 -0.602884 +vn -0.260342 -0.540078 -0.800336 +vn 0.256393 -0.565610 -0.783803 +vn 0.704705 -0.439490 -0.556992 +vn 0.963902 -0.195577 -0.180673 +vn 0.964611 0.100766 0.243662 +vn 0.707237 0.370933 0.601851 +vn 0.260703 0.543636 0.797805 +vn -0.255908 0.571929 0.779364 +vn -0.704276 0.445846 0.552464 +vn -0.963689 0.199158 0.177877 +vn -0.964431 -0.099568 -0.244865 +vn -0.705174 -0.337565 -0.623522 +vn -0.258801 -0.412191 -0.873568 +vn 0.257288 -0.376138 -0.890125 +vn 0.704734 -0.239110 -0.667964 +vn 0.963036 -0.037930 -0.266689 +vn 0.963126 0.173764 0.205411 +vn 0.705503 0.340642 0.621473 +vn 0.258785 0.419661 0.870008 +vn -0.257974 0.387744 0.884932 +vn -0.705846 0.249288 0.663051 +vn -0.963732 0.043125 0.263365 +vn -0.963085 -0.171540 -0.207464 +vn -0.704682 -0.293659 -0.645901 +vn -0.271816 -0.260441 -0.926438 +vn 0.234238 -0.157213 -0.959383 +vn 0.677767 -0.011554 -0.735186 +vn 0.939366 0.137548 -0.314121 +vn 0.949123 0.250914 0.190284 +vn 0.704647 0.300303 0.642877 +vn 0.270478 0.274613 0.922729 +vn -0.237095 0.174653 0.955658 +vn -0.681056 0.022492 0.731886 +vn -0.941054 -0.133220 0.310918 +vn -0.949351 -0.247767 -0.193249 +vn -0.705025 -0.237144 -0.668358 +vn -0.295388 -0.096975 -0.950443 +vn 0.193749 0.069123 -0.978613 +vn 0.631089 0.217119 -0.744705 +vn 0.898978 0.307798 -0.311607 +vn 0.925744 0.318208 0.204310 +vn 0.703976 0.248084 0.665486 +vn 0.292064 0.117064 0.949207 +vn -0.197994 -0.051237 0.978863 +vn -0.634245 -0.213055 0.743196 +vn -0.899804 -0.309129 0.307883 +vn -0.926006 -0.314906 -0.208200 +vn -0.705654 -0.167459 -0.688484 +vn -0.321647 0.064545 -0.944657 +vn 0.148910 0.278889 -0.948708 +vn 0.579561 0.419052 -0.698930 +vn 0.854527 0.448345 -0.262240 +vn 0.900117 0.360477 0.244634 +vn 0.703718 0.180729 0.687108 +vn 0.317873 -0.045073 0.947061 +vn -0.151914 -0.267736 0.951441 +vn -0.579591 -0.424282 0.695743 +vn -0.853053 -0.454844 0.255767 +vn -0.900180 -0.357027 -0.249413 +vn -0.706197 -0.085948 -0.702779 +vn -0.343055 0.214344 -0.914533 +vn 0.112332 0.456782 -0.882458 +vn 0.537537 0.577493 -0.614456 +vn 0.818336 0.545167 -0.181988 +vn 0.879457 0.369684 0.299814 +vn 0.704388 0.098307 0.702975 +vn 0.340619 -0.200282 0.918622 +vn -0.113147 -0.452914 0.884345 +vn -0.535581 -0.585604 0.608458 +vn -0.816182 -0.551136 0.173482 +vn -0.879461 -0.365621 -0.304745 +vn -0.706195 0.002824 -0.708012 +vn -0.355691 0.347222 -0.867710 +vn 0.090362 0.598279 -0.796176 +vn 0.512131 0.689713 -0.511877 +vn 0.796450 0.597907 -0.090415 +vn 0.867205 0.348041 0.356121 +vn 0.705561 0.006201 0.708622 +vn 0.355287 -0.339564 0.870900 +vn -0.089458 -0.599001 0.795736 +vn -0.509878 -0.696662 0.504666 +vn -0.794659 -0.601499 0.081949 +vn -0.866928 -0.344100 -0.360599 +vn -0.705434 0.092050 -0.702773 +vn -0.359814 0.460668 -0.811369 +vn 0.082407 0.705672 -0.703730 +vn 0.502564 0.762164 -0.408087 +vn 0.788071 0.615577 -0.003061 +vn 0.862589 0.305219 0.403463 +vn 0.706307 -0.086944 0.702546 +vn 0.361172 -0.458005 0.812272 +vn -0.080469 -0.708483 0.701126 +vn -0.500421 -0.767372 0.400897 +vn -0.786478 -0.617602 -0.004444 +vn -0.861650 -0.302400 -0.407571 +vn -0.704231 0.174843 -0.688105 +vn -0.358247 0.553755 -0.751675 +vn 0.083906 0.784177 -0.614838 +vn 0.503706 0.804869 -0.313795 +vn 0.788757 0.610560 0.071262 +vn 0.862862 0.253064 0.437525 +vn 0.706219 -0.172825 0.686576 +vn 0.360624 -0.553979 0.750372 +vn -0.081518 -0.787474 0.610934 +vn -0.501641 -0.808688 0.307214 +vn -0.787081 -0.611938 -0.077690 +vn -0.861237 -0.251670 -0.441513 +vn -0.703274 0.246164 -0.666940 +vn -0.354410 0.627067 -0.693672 +vn 0.089612 0.839849 -0.535372 +vn 0.509839 0.827792 -0.234144 +vn 0.793796 0.594214 0.129605 +vn 0.865534 0.201398 0.458575 +vn 0.705793 -0.246049 0.664316 +vn 0.357139 -0.628551 0.690924 +vn -0.087133 -0.842882 0.530997 +vn -0.507792 -0.830661 0.228363 +vn -0.791947 -0.595453 -0.135116 +vn -0.863459 -0.201198 -0.462555 +vn -0.703376 0.303547 -0.642746 +vn -0.351210 0.682549 -0.640920 +vn 0.095264 0.878560 -0.468036 +vn 0.516462 0.839218 -0.170233 +vn 0.799635 0.575067 0.172864 +vn 0.868990 0.156646 0.469381 +vn 0.705870 -0.304287 0.639654 +vn 0.353786 -0.684270 0.637660 +vn -0.092977 -0.881003 0.463884 +vn -0.514530 -0.841369 0.165399 +vn -0.797776 -0.576241 -0.177482 +vn -0.866856 -0.157132 -0.473149 +vn -0.704955 0.346829 -0.618666 +vn -0.350319 0.722967 -0.595479 +vn 0.098378 0.905282 -0.413262 +vn 0.520951 0.845003 -0.120745 +vn 0.804252 0.558260 0.203777 +vn 0.872415 0.121731 0.473363 +vn 0.707109 -0.347791 0.615661 +vn 0.352495 -0.724470 0.592360 +vn -0.096428 -0.907105 0.409709 +vn -0.519242 -0.846596 0.116884 +vn -0.802561 -0.559317 -0.207510 +vn -0.870505 -0.122478 -0.476676 +vn -0.707930 0.377375 -0.597011 +vn -0.352218 0.751299 -0.558115 +vn 0.098041 0.923815 -0.370072 +vn 0.522229 0.848735 -0.083228 +vn 0.806735 0.546156 0.225593 +vn 0.875350 0.097073 0.473645 +vn 0.709643 -0.378266 0.594409 +vn 0.353937 -0.752461 0.555455 +vn -0.096465 -0.925115 0.367228 +vn -0.520799 -0.849898 0.080261 +vn -0.805310 -0.547050 -0.228498 +vn -0.873785 -0.097831 -0.476370 +vn -0.711839 0.397264 -0.579195 +vn -0.356584 0.770295 -0.528672 +vn 0.094351 0.936846 -0.336774 +vn 0.520154 0.852306 -0.054907 +vn 0.806758 0.539316 0.241412 +vn 0.877383 0.081703 0.472783 +vn 0.713081 -0.397950 0.577193 +vn 0.357833 -0.771104 0.526644 +vn -0.093176 -0.937712 0.334685 +vn -0.519062 -0.853106 0.052782 +vn -0.805673 -0.539994 -0.243510 +vn -0.876224 -0.082325 -0.474820 +vn -0.715883 0.408808 -0.566029 +vn -0.362495 0.782322 -0.506527 +vn 0.088114 0.946159 -0.311480 +vn 0.515211 0.856422 -0.033149 +vn 0.804370 0.537152 0.253883 +vn 0.878119 0.073884 0.472704 +vn 0.716688 -0.409264 0.564678 +vn 0.363312 -0.782825 0.505162 +vn -0.087330 -0.946682 0.310106 +vn -0.514471 -0.856918 0.031781 +vn -0.803641 -0.537602 -0.255237 +vn -0.877357 -0.074313 -0.474048 +vn -0.719107 0.414304 -0.557887 +vn -0.368738 0.789389 -0.490813 +vn 0.080478 0.952932 -0.292308 +vn 0.508178 0.861112 -0.015562 +vn 0.799765 0.538528 0.265262 +vn 0.877115 0.071613 0.474912 +vn 0.719500 -0.414526 0.557215 +vn 0.369143 -0.789627 0.490126 +vn -0.080085 -0.953174 0.291626 +vn -0.507808 -0.861342 0.014902 +vn -0.799407 -0.538742 -0.265906 +vn -0.876745 -0.071824 -0.475562 +vn -0.720439 0.415951 -0.554935 +vn -0.373912 0.793231 -0.480598 +vn 0.072798 0.957971 -0.277474 +vn 0.499997 0.866027 0.000008 +vn 0.793223 0.542031 0.277487 +vn 0.873911 0.072796 0.480605 +vn 0.720439 -0.415946 0.554939 +vn 0.373926 -0.793235 0.480581 +vn -0.072789 -0.957975 0.277463 +vn -0.500007 -0.866021 0.000009 +vn -0.793247 -0.542017 -0.277449 +vn -0.873929 -0.072782 -0.480573 +vn -0.718736 0.415861 -0.557206 +vn -0.376527 0.795422 -0.474900 +vn 0.066506 0.961885 -0.265243 +vn 0.491659 0.870648 0.015588 +vn 0.785021 0.546153 0.292333 +vn 0.867991 0.075345 0.490831 +vn 0.718338 -0.415626 0.557894 +vn 0.376154 -0.795203 0.475564 +vn -0.066884 -0.961674 0.265912 +vn -0.492065 -0.870431 -0.014890 +vn -0.785451 -0.545921 -0.291611 +vn -0.868417 -0.075104 -0.490113 +vn -0.712753 0.416095 -0.564666 +vn -0.375027 0.797450 -0.472682 +vn 0.063053 0.965187 -0.253846 +vn 0.484113 0.874376 0.033198 +vn 0.775351 0.549345 0.311528 +vn 0.858744 0.077177 0.506559 +vn 0.711945 -0.415620 0.566035 +vn 0.374272 -0.797003 0.474033 +vn -0.063814 -0.964776 0.255215 +vn -0.484934 -0.873973 -0.031794 +vn -0.776226 -0.548914 -0.310106 +vn -0.859613 -0.076710 -0.505154 +vn -0.701130 0.418688 -0.577163 +vn -0.367842 0.800759 -0.472734 +vn 0.063785 0.968343 -0.241338 +vn 0.478117 0.876572 0.054999 +vn 0.764183 0.550043 0.336864 +vn 0.845360 0.076225 0.528731 +vn 0.699889 -0.417943 0.579206 +vn 0.366716 -0.800061 0.474786 +vn -0.064926 -0.967736 0.243457 +vn -0.479389 -0.876011 -0.052822 +vn -0.765571 -0.549435 -0.334696 +vn -0.846732 -0.075525 -0.526631 +vn -0.682327 0.425629 -0.594365 +vn -0.353448 0.806728 -0.473566 +vn 0.069793 0.971746 -0.225474 +vn 0.474040 0.876547 0.083375 +vn 0.751073 0.546655 0.370211 +vn 0.826711 0.070428 0.558201 +vn 0.680668 -0.424575 0.597015 +vn 0.352007 -0.805749 0.476298 +vn -0.071286 -0.970956 0.228393 +vn -0.475805 -0.875873 -0.080346 +vn -0.753060 -0.545910 -0.367263 +vn -0.828645 -0.069491 -0.555444 +vn -0.654650 0.438770 -0.615560 +vn -0.330568 0.816575 -0.473213 +vn 0.081580 0.975655 -0.203571 +vn 0.471486 0.873535 0.120985 +vn 0.734854 0.537607 0.413483 +vn 0.801187 0.057818 0.595615 +vn 0.652660 -0.437351 0.618675 +vn 0.328939 -0.815278 0.476571 +vn -0.083376 -0.974706 0.207359 +vn -0.473817 -0.872817 -0.116995 +vn -0.737557 -0.536775 -0.409734 +vn -0.803717 -0.056630 -0.592311 +vn -0.616279 0.459579 -0.639521 +vn -0.298493 0.831133 -0.469169 +vn 0.098570 0.980053 -0.172569 +vn 0.468805 0.866676 0.170571 +vn 0.713292 0.521419 0.468333 +vn 0.766597 0.036688 0.641080 +vn 0.614314 -0.457754 0.642712 +vn 0.297010 -0.829523 0.472944 +vn -0.100529 -0.979025 0.177211 +vn -0.471747 -0.866043 -0.165603 +vn -0.716750 -0.520595 -0.463951 +vn -0.769553 -0.035255 -0.637609 +vn -0.565781 0.488744 -0.664094 +vn -0.257943 0.850571 -0.458251 +vn 0.118123 0.984561 -0.129179 +vn 0.462228 0.855162 0.234612 +vn 0.682555 0.497066 0.535765 +vn 0.720079 0.006061 0.693865 +vn 0.564490 -0.486455 0.666867 +vn 0.257067 -0.848665 0.462261 +vn -0.120178 -0.983564 0.134756 +vn -0.465965 -0.854762 -0.228601 +vn -0.686775 -0.496334 -0.531029 +vn -0.723033 -0.004346 -0.690800 +vn -0.502571 0.525809 -0.686256 +vn -0.211817 0.874119 -0.437091 +vn 0.134811 0.988345 -0.070708 +vn 0.445400 0.838321 0.314383 +vn 0.637117 0.464196 0.615308 +vn 0.658429 -0.034014 0.751874 +vn 0.503147 -0.523019 0.687965 +vn 0.212199 -0.872004 0.441112 +vn -0.136975 -0.987557 0.077256 +vn -0.450173 -0.838350 -0.307432 +vn -0.641781 -0.463633 -0.610870 +vn -0.660292 0.036083 -0.750142 +vn -0.428263 0.568868 -0.702125 +vn -0.166513 0.899960 -0.402920 +vn 0.139438 0.990224 0.003735 +vn 0.408868 0.815921 0.408779 +vn 0.569748 0.423575 0.704252 +vn 0.578511 -0.081978 0.811544 +vn 0.432027 -0.565499 0.702540 +vn 0.168474 -0.897731 0.407057 +vn -0.142273 -0.989819 0.003967 +vn -0.415264 -0.816540 -0.401022 +vn -0.574212 -0.423120 -0.700892 +vn -0.577622 0.084628 -0.811906 +vn -0.347346 0.614764 -0.708107 +vn -0.131843 0.925331 -0.355499 +vn 0.119760 0.988609 0.091160 +vn 0.341107 0.787954 0.512616 +vn 0.472569 0.376757 0.796701 +vn 0.478116 -0.135125 0.867840 +vn 0.355171 -0.610749 0.707700 +vn 0.135050 -0.923116 0.360026 +vn -0.124409 -0.988806 -0.082367 +vn -0.349844 -0.789327 -0.504552 +vn -0.475542 -0.376145 -0.795220 +vn -0.472457 0.138738 -0.870366 +vn -0.267185 0.659700 -0.702430 +vn -0.119404 0.946694 -0.299186 +vn 0.062870 0.981154 0.182712 +vn 0.230909 0.753843 0.615144 +vn 0.338810 0.325068 0.882915 +vn 0.356649 -0.190556 0.914598 +vn 0.278376 -0.655059 0.702428 +vn 0.122729 -0.944672 0.304190 +vn -0.070455 -0.982267 -0.173744 +vn -0.241964 -0.756152 -0.608019 +vn -0.338390 -0.323786 -0.883547 +vn -0.345066 0.195526 -0.917986 +vn -0.195667 0.700185 -0.686626 +vn -0.137900 0.959899 -0.244083 +vn -0.039371 0.964037 0.262835 +vn 0.072361 0.711005 0.699454 +vn 0.166233 0.267833 0.949016 +vn 0.216166 -0.246835 0.944640 +vn 0.207618 -0.695242 0.688138 +vn 0.140545 -0.958273 0.248919 +vn 0.030662 -0.966199 -0.255968 +vn -0.082083 -0.714034 -0.695283 +vn -0.160397 -0.265283 -0.950735 +vn -0.199966 0.253130 -0.946540 +vn -0.137599 0.733914 -0.665159 +vn -0.187470 0.960871 -0.203914 +vn -0.183532 0.932200 0.311961 +vn -0.128500 0.654634 0.744944 +vn -0.037984 0.201806 0.978689 +vn 0.063155 -0.304771 0.950330 +vn 0.147049 -0.729433 0.668060 +vn 0.189934 -0.959561 0.207769 +vn 0.179714 -0.934152 -0.308324 +vn 0.126812 -0.656599 -0.743503 +vn 0.048853 -0.197807 -0.979023 +vn -0.047155 0.311416 -0.949103 +vn -0.092700 0.760446 -0.642751 +vn -0.257506 0.947394 -0.190091 +vn -0.351232 0.882004 0.314172 +vn -0.349900 0.580709 0.735083 +vn -0.254214 0.123744 0.959199 +vn -0.090138 -0.365995 0.926241 +vn 0.097982 -0.757290 0.645687 +vn 0.259771 -0.946210 0.192886 +vn 0.352891 -0.882221 -0.311695 +vn 0.354806 -0.580074 -0.733230 +vn 0.264632 -0.119390 -0.956930 +vn 0.100284 0.371126 -0.923152 +vn -0.058042 0.781280 -0.621476 +vn -0.331288 0.920906 -0.205380 +vn -0.514930 0.814753 0.266505 +vn -0.560272 0.490308 0.667603 +vn -0.455146 0.034304 0.889756 +vn -0.227946 -0.430512 0.873327 +vn 0.060227 -0.779592 0.623386 +vn 0.332734 -0.919982 0.207174 +vn 0.517663 -0.813756 -0.264246 +vn 0.565558 -0.488142 -0.664727 +vn 0.461631 -0.030887 -0.886534 +vn 0.232604 0.433457 -0.870638 +vn -0.032534 0.797912 -0.601895 +vn -0.395178 0.885684 -0.243718 +vn -0.651706 0.736711 0.180380 +vn -0.733522 0.390158 0.556528 +vn -0.618536 -0.061124 0.783376 +vn -0.337795 -0.495713 0.800102 +vn 0.033274 -0.797196 0.602802 +vn 0.395824 -0.885140 0.244644 +vn 0.653448 -0.735590 -0.178640 +vn 0.736629 -0.388114 -0.553846 +vn 0.621749 0.063372 -0.780648 +vn 0.339742 0.497214 -0.798344 +vn -0.015773 0.810806 -0.585102 +vn -0.443345 0.846061 -0.296019 +vn -0.752171 0.654933 0.072805 +vn -0.859428 0.288096 0.422355 +vn -0.736166 -0.156075 0.658559 +vn -0.415661 -0.558181 0.718094 +vn 0.015988 -0.810562 0.585434 +vn 0.443555 -0.845823 0.296382 +vn 0.752912 -0.654197 -0.071763 +vn 0.860731 -0.286798 -0.420581 +vn 0.737465 0.157350 -0.656800 +vn 0.416404 0.558906 -0.717099 +vn -0.006307 0.819986 -0.572349 +vn -0.475815 0.804493 -0.355515 +vn -0.817997 0.573600 -0.043182 +vn -0.940987 0.188806 0.280885 +vn -0.811610 -0.246660 0.529573 +vn -0.464773 -0.615835 0.636187 +vn 0.006360 -0.819927 0.572432 +vn 0.475851 -0.804444 0.355579 +vn 0.818197 -0.573281 0.043618 +vn 0.941365 -0.188196 -0.280024 +vn 0.812006 0.247259 -0.528686 +vn 0.465008 0.616154 -0.635706 +vn -0.001886 0.825466 -0.564449 +vn -0.494361 0.761510 -0.419177 +vn -0.854579 0.493575 -0.161490 +vn -0.985811 0.093205 0.139605 +vn -0.852673 -0.332170 0.403252 +vn -0.491063 -0.668362 0.558703 +vn 0.001897 -0.825466 0.564449 +vn 0.494350 -0.761575 0.419073 +vn 0.854580 -0.493585 0.161456 +vn 0.985843 -0.093095 -0.139449 +vn 0.852733 0.332339 -0.402985 +vn 0.491113 0.668477 -0.558522 +vn -0.000004 0.827284 -0.561783 +vn -0.499813 0.716480 -0.486665 +vn -0.865915 0.413696 -0.281154 +vn -1.000000 -0.000104 -0.000168 +vn -0.865920 -0.413861 0.280895 +vn -0.499811 -0.716549 0.486567 +vn 0.000010 -0.827299 0.561761 +vn 0.499825 -0.716647 0.486408 +vn 0.865921 -0.414005 0.280680 +vn 1.000000 -0.000197 -0.000273 +vn 0.865925 0.413718 -0.281090 +vn 0.499816 0.716550 -0.486559 +vn 0.001889 0.825449 -0.564474 +vn -0.491040 0.668280 -0.558822 +vn -0.852609 0.331988 -0.403537 +vn -0.985740 -0.093425 -0.139960 +vn -0.854532 -0.493741 0.161229 +vn -0.494340 -0.761574 0.419087 +vn -0.001867 -0.825482 0.564425 +vn 0.491162 -0.668597 0.558335 +vn 0.852828 -0.332669 0.402512 +vn 0.985967 0.092665 0.138858 +vn 0.854672 0.493290 -0.161869 +vn 0.494371 0.761484 -0.419213 +vn 0.006358 0.819904 -0.572465 +vn -0.464707 0.615727 -0.636339 +vn -0.811457 0.246440 -0.529910 +vn -0.940815 -0.189063 -0.281288 +vn -0.817881 -0.573786 0.042896 +vn -0.475773 -0.804558 0.355424 +vn -0.006274 -0.820008 0.572317 +vn 0.465135 -0.616324 0.635448 +vn 0.812276 -0.247699 0.528065 +vn 0.941693 0.187650 0.279290 +vn 0.818417 0.572931 -0.044093 +vn 0.475906 0.804346 -0.355726 +vn 0.015994 0.810527 -0.585483 +vn -0.415523 0.558033 -0.718289 +vn -0.735870 0.155794 -0.658956 +vn -0.859098 -0.288412 -0.422811 +vn -0.751948 -0.655155 -0.073116 +vn -0.443265 -0.846133 0.295931 +vn -0.015705 -0.810838 0.585059 +vn 0.416709 -0.559160 0.716725 +vn 0.738113 -0.157990 0.655918 +vn 0.861470 0.286035 0.419588 +vn 0.753359 0.653747 0.071167 +vn 0.443654 0.845711 -0.296554 +vn 0.033286 0.797134 -0.602884 +vn -0.337548 0.495503 -0.800336 +vn -0.618026 0.060762 -0.783806 +vn -0.732957 -0.390549 -0.556997 +vn -0.651321 -0.736977 -0.180679 +vn -0.395038 -0.885763 0.243658 +vn -0.032384 -0.797952 0.601851 +vn 0.340443 -0.497591 0.797811 +vn 0.623249 -0.064337 0.779372 +vn 0.738246 0.387001 0.552470 +vn 0.654319 0.735000 0.177880 +vn 0.395988 0.885006 -0.244863 +vn 0.060249 0.779480 -0.623523 +vn -0.227561 0.430221 -0.873571 +vn -0.454380 -0.034753 -0.890130 +vn -0.559433 -0.490766 -0.667969 +vn -0.514359 -0.815052 -0.266694 +vn -0.331075 -0.920976 0.205408 +vn -0.057746 -0.781304 0.621473 +vn 0.234048 -0.433946 0.870007 +vn 0.464791 0.029537 0.884928 +vn 0.568818 0.486634 0.663049 +vn 0.519214 0.813053 0.263365 +vn 0.332984 0.919826 -0.207465 +vn 0.098025 0.757099 -0.645904 +vn -0.089633 0.365613 -0.926441 +vn -0.253257 -0.124258 -0.959386 +vn -0.348877 -0.581194 -0.735186 +vn -0.350554 -0.882293 -0.314118 +vn -0.257261 -0.947421 0.190287 +vn -0.092257 -0.760389 0.642882 +vn 0.102577 -0.371541 0.922732 +vn 0.269804 0.118007 0.955657 +vn 0.360013 0.578567 0.731882 +vn 0.355154 0.881588 0.310915 +vn 0.260098 0.946046 -0.193252 +vn 0.147145 0.729139 -0.668360 +vn 0.063721 0.304297 -0.950444 +vn -0.037001 -0.202357 -0.978612 +vn -0.127504 -0.655103 -0.744703 +vn -0.182920 -0.932439 -0.311604 +vn -0.187290 -0.960822 0.204313 +vn -0.137137 -0.733703 0.665488 +vn -0.044648 -0.311465 0.949208 +vn 0.054622 0.197089 0.978863 +vn 0.132609 0.655803 0.743194 +vn 0.182188 0.933819 0.307879 +vn 0.190287 0.959397 -0.208203 +vn 0.207814 0.694831 -0.688493 +vn 0.216736 0.246267 -0.944658 +vn 0.167083 -0.268419 -0.948702 +vn 0.073137 -0.711452 -0.698919 +vn -0.038980 -0.964219 -0.262225 +vn -0.137866 -0.959760 0.244649 +vn -0.195319 -0.699796 0.687122 +vn -0.197935 -0.252741 0.947071 +vn -0.155897 0.265443 0.951439 +vn -0.077662 0.714096 0.695727 +vn 0.032605 0.966194 0.255747 +vn 0.140896 0.958088 -0.249429 +vn 0.278661 0.654537 -0.702801 +vn 0.357153 0.189894 -0.914539 +vn 0.339413 -0.325701 -0.882450 +vn 0.231337 -0.754287 -0.614438 +vn 0.062928 -0.981289 -0.181968 +vn -0.119620 -0.946464 0.299827 +vn -0.267120 -0.659148 0.702973 +vn -0.343822 -0.194814 0.918604 +vn -0.335712 0.324473 0.884316 +vn -0.239407 0.756647 0.608416 +vn -0.069244 0.982407 0.173438 +vn 0.123076 0.944437 -0.304779 +vn 0.355544 0.610197 -0.707989 +vn 0.478556 0.134458 -0.867701 +vn 0.472961 -0.377367 -0.796180 +vn 0.341268 -0.788356 -0.511889 +vn 0.119604 -0.988695 -0.090431 +vn -0.132170 -0.925052 0.356103 +vn -0.347400 -0.614156 0.708609 +vn -0.471704 -0.137933 0.870902 +vn -0.473995 0.376945 0.795764 +vn -0.348354 0.789879 0.504718 +vn -0.123566 0.988943 0.082001 +vn 0.135467 0.922846 -0.360561 +vn 0.432419 0.564937 -0.702752 +vn 0.578856 0.081321 -0.811365 +vn 0.569944 -0.424158 -0.703742 +vn 0.408808 -0.816286 -0.408109 +vn 0.139117 -0.990271 -0.003087 +vn -0.166923 -0.899651 0.403440 +vn -0.428423 -0.568246 0.702532 +vn -0.577226 -0.083829 0.812270 +vn -0.573339 0.423886 0.701143 +vn -0.414368 0.817038 0.400934 +vn -0.141638 0.989909 -0.004400 +vn 0.168919 0.897431 -0.407534 +vn 0.503523 0.522469 -0.688107 +vn 0.658684 0.033386 -0.751679 +vn 0.637166 -0.464742 -0.614845 +vn 0.445191 -0.838649 -0.313805 +vn 0.134389 -0.988364 0.071248 +vn -0.212270 -0.873801 0.437508 +vn -0.502788 -0.525206 0.686559 +vn -0.660088 -0.035337 0.750357 +vn -0.641233 0.464319 0.610924 +vn -0.449543 0.838769 0.307210 +vn -0.136431 0.987599 -0.077690 +vn 0.212651 0.871691 -0.441513 +vn 0.564818 0.485977 -0.666939 +vn 0.720263 -0.006598 -0.693670 +vn 0.682532 -0.497524 -0.535369 +vn 0.461978 -0.855426 -0.234143 +vn 0.117713 -0.984554 0.129602 +vn -0.258350 -0.850277 0.458567 +vn -0.565984 -0.488218 0.664308 +vn -0.722915 0.004976 0.690919 +vn -0.686396 0.496894 0.530997 +vn -0.465484 0.855087 0.228365 +vn -0.119711 0.983572 -0.135114 +vn 0.257480 0.848379 -0.462554 +vn 0.614567 0.457380 -0.642737 +vn 0.766716 -0.037104 -0.640914 +vn 0.713235 -0.521769 -0.468031 +vn 0.468569 -0.866871 -0.170230 +vn 0.098222 -0.980036 0.172865 +vn -0.298823 -0.830895 0.469382 +vn -0.616447 -0.459166 0.639656 +vn -0.769483 0.035738 0.637667 +vn -0.716480 0.521014 0.463896 +vn -0.471382 0.866278 0.165415 +vn -0.100154 0.979017 -0.177467 +vn 0.297345 0.829293 -0.473137 +vn 0.652840 0.437090 -0.618670 +vn 0.801266 -0.058103 -0.595481 +vn 0.734805 -0.537842 -0.413264 +vn 0.471314 -0.873661 -0.120747 +vn 0.081335 -0.975634 0.203773 +vn -0.330794 -0.816400 0.473357 +vn -0.654760 -0.438479 0.615651 +vn -0.803666 0.056966 0.592348 +vn -0.737369 0.537062 0.409696 +vn -0.473557 0.872975 0.116873 +vn -0.083104 0.974695 -0.207518 +vn 0.329183 0.815115 -0.476682 +vn 0.680784 0.424399 -0.597008 +vn 0.826756 -0.070619 -0.558111 +vn 0.751030 -0.546812 -0.370068 +vn 0.473914 -0.876629 -0.083224 +vn 0.069620 -0.971730 0.225596 +vn -0.353606 -0.806611 0.473646 +vn -0.682409 -0.425436 0.594410 +vn -0.828619 0.069712 0.555456 +vn -0.752941 0.546098 0.367229 +vn -0.475633 0.875974 0.080262 +vn -0.071103 0.970945 -0.228497 +vn 0.352170 0.805637 -0.476368 +vn 0.699959 0.417842 -0.579195 +vn 0.845388 -0.076333 -0.528671 +vn 0.764160 -0.550130 -0.336773 +vn 0.478045 -0.876617 -0.054906 +vn 0.063685 -0.968331 0.241411 +vn -0.367933 -0.800690 0.472780 +vn -0.701175 -0.418575 0.577190 +vn -0.846714 0.075655 0.526642 +vn -0.765497 0.549546 0.334684 +vn -0.479284 0.876071 0.052783 +vn -0.064815 0.967731 -0.243509 +vn 0.366814 0.799996 -0.474819 +vn 0.711978 0.415573 -0.566027 +vn 0.858760 -0.077226 -0.506526 +vn 0.775344 -0.549383 -0.311479 +vn 0.484083 -0.874394 -0.033148 +vn 0.063009 -0.965180 0.253884 +vn -0.375069 -0.797417 0.472704 +vn -0.712774 -0.416042 0.564679 +vn -0.859602 0.076771 0.505164 +vn -0.776187 0.548968 0.310109 +vn -0.484880 0.874003 0.031785 +vn -0.063760 0.964775 -0.255233 +vn 0.374319 0.796973 -0.474045 +vn 0.718350 0.415614 -0.557888 +vn 0.867999 -0.075357 -0.490814 +vn 0.785025 -0.546161 -0.292307 +vn 0.491657 -0.870650 -0.015561 +vn 0.066498 -0.961880 0.265262 +vn -0.376538 -0.795411 0.474911 +vn -0.718740 -0.415844 0.557213 +vn -0.868410 0.075124 0.490123 +vn -0.785433 0.545941 0.291624 +vn -0.492042 0.870444 0.014901 +vn -0.066863 0.961677 -0.265907 +vn 0.376170 0.795195 -0.475563 +vn 0.720444 0.415944 -0.554934 +vn 0.873915 -0.072798 -0.480596 +vn 0.793229 -0.542030 -0.277472 +vn 0.500003 -0.866023 0.000010 +vn 0.072801 -0.957967 0.277489 +vn -0.373912 -0.793226 0.480606 +vn -0.720439 -0.415945 0.554939 +vn -0.873925 0.072788 0.480580 +vn -0.793237 0.542024 0.277461 +vn -0.499994 0.866029 0.000007 +vn -0.072777 0.957980 -0.277450 +vn 0.373933 0.793236 -0.480574 +vn 0.719513 0.414512 -0.557208 +vn 0.877119 -0.071630 -0.474902 +vn 0.799763 -0.538539 -0.265244 +vn 0.508173 -0.861114 0.015587 +vn 0.080472 -0.952925 0.292333 +vn -0.368746 -0.789375 0.490830 +vn -0.719113 -0.414286 0.557893 +vn -0.876743 0.071842 0.475562 +vn -0.799394 0.538760 0.265908 +vn -0.507785 0.861355 -0.014894 +vn -0.080058 0.953180 -0.291615 +vn 0.369165 0.789622 -0.490117 +vn 0.716725 0.409217 -0.564664 +vn 0.878127 -0.073939 -0.472680 +vn 0.804353 -0.537196 -0.253844 +vn 0.515179 -0.856439 0.033202 +vn 0.088076 -0.946145 0.311532 +vn -0.362530 -0.782282 0.506563 +vn -0.715906 -0.408753 0.566039 +vn -0.877359 0.074371 0.474037 +vn -0.803613 0.537652 0.255219 +vn -0.514416 0.856951 -0.031790 +vn -0.087262 0.946690 -0.310103 +vn 0.363373 0.782803 -0.505153 +vn 0.713161 0.397847 -0.577165 +vn 0.877399 -0.081825 -0.472733 +vn 0.806715 -0.539415 -0.241335 +vn 0.520073 -0.852349 0.055005 +vn 0.094256 -0.936822 0.336870 +vn -0.356670 -0.770211 0.528735 +vn -0.711895 -0.397145 0.579207 +vn -0.876232 0.082450 0.474784 +vn -0.805620 0.540099 0.243453 +vn -0.518951 0.853170 -0.052827 +vn -0.093036 0.937721 -0.334701 +vn 0.357962 0.771050 -0.526635 +vn 0.709775 0.378087 -0.594365 +vn 0.875372 -0.097282 -0.473561 +vn 0.806656 -0.546325 -0.225466 +vn 0.522084 -0.848808 0.083385 +vn 0.097872 -0.923773 0.370222 +vn -0.352371 -0.751158 0.558209 +vn -0.708032 -0.377175 0.597017 +vn -0.873804 0.098040 0.476293 +vn -0.805226 0.547222 0.228383 +vn -0.520620 0.849999 -0.080358 +vn -0.096233 0.925121 -0.367274 +vn 0.354151 0.752365 -0.555450 +vn 0.707313 0.347543 -0.615567 +vn 0.872456 -0.122021 -0.473214 +vn 0.804145 -0.558489 -0.203568 +vn 0.520750 -0.845092 0.120990 +vn 0.098143 -0.905205 0.413488 +vn -0.350531 -0.722750 0.595618 +vn -0.705093 -0.346533 0.618675 +vn -0.870523 0.122780 0.476565 +vn -0.802430 0.559566 0.207347 +vn -0.518969 0.846746 -0.117012 +vn -0.096077 0.907124 -0.409751 +vn 0.352820 0.724342 -0.592324 +vn 0.706146 0.303926 -0.639520 +vn 0.869033 -0.157059 -0.469164 +vn 0.799472 -0.575384 -0.172561 +vn 0.516170 -0.839328 0.170581 +vn 0.094925 -0.878433 0.468343 +vn -0.351517 -0.682232 0.641089 +vn -0.703578 -0.303132 0.642720 +vn -0.866890 0.157544 0.472949 +vn -0.797596 0.576573 0.177214 +vn -0.514144 0.841565 -0.165603 +vn -0.092477 0.881020 -0.463952 +vn 0.354243 0.684080 -0.637610 +vn 0.706147 0.245602 -0.664106 +vn 0.865583 -0.201903 -0.458259 +vn 0.793593 -0.594577 -0.129182 +vn 0.509481 -0.827880 0.234613 +vn 0.089199 -0.839640 0.535768 +vn -0.354786 -0.626637 0.693868 +vn -0.703526 -0.245636 0.666869 +vn -0.863499 0.201703 0.462260 +vn -0.791705 0.595856 0.134754 +vn -0.507269 0.830913 -0.228606 +vn -0.086459 0.842925 -0.531039 +vn 0.357743 0.628330 -0.690812 +vn 0.706659 0.172341 -0.686244 +vn 0.862927 -0.253614 -0.437077 +vn 0.788537 -0.610911 -0.070691 +vn 0.503318 -0.804873 0.314403 +vn 0.083460 -0.783840 0.615329 +vn -0.358659 -0.553193 0.751892 +vn -0.704510 -0.174215 0.687979 +vn -0.861268 0.252244 0.441124 +vn -0.786753 0.612413 0.077269 +vn -0.500934 0.809049 -0.307417 +vn -0.080615 0.787629 -0.610854 +vn 0.361407 0.553798 -0.750129 +vn 0.706792 0.086394 -0.702127 +vn 0.862633 -0.305829 -0.402906 +vn 0.787812 -0.615905 0.003761 +vn 0.502136 -0.762060 0.408807 +vn 0.081912 -0.705190 0.704271 +vn -0.360286 -0.459986 0.811546 +vn -0.705776 -0.091364 0.702519 +vn -0.861707 0.302984 0.407015 +vn -0.786072 0.618123 0.003911 +vn -0.499499 0.767879 -0.401077 +vn -0.079304 0.708806 -0.700932 +vn 0.362121 0.457871 -0.811925 +# 1440 vertex normals + +g default +s 1 +f 1/1/1 13/14/13 14/15/14 +f 1/1/1 14/15/14 2/2/2 +f 2/2/2 14/15/14 15/16/15 +f 2/2/2 15/16/15 3/3/3 +f 3/3/3 15/16/15 16/17/16 +f 3/3/3 16/17/16 4/4/4 +f 4/4/4 16/17/16 17/18/17 +f 4/4/4 17/18/17 5/5/5 +f 5/5/5 17/18/17 18/19/18 +f 5/5/5 18/19/18 6/6/6 +f 6/6/6 18/19/18 19/20/19 +f 6/6/6 19/20/19 7/7/7 +f 7/7/7 19/20/19 20/21/20 +f 7/7/7 20/21/20 8/8/8 +f 8/8/8 20/21/20 21/22/21 +f 8/8/8 21/22/21 9/9/9 +f 9/9/9 21/22/21 22/23/22 +f 9/9/9 22/23/22 10/10/10 +f 10/10/10 22/23/22 23/24/23 +f 10/10/10 23/24/23 11/11/11 +f 11/11/11 23/24/23 24/25/24 +f 11/11/11 24/25/24 12/12/12 +f 12/12/12 24/25/24 13/26/13 +f 12/12/12 13/26/13 1/13/1 +f 13/14/13 25/27/25 26/28/26 +f 13/14/13 26/28/26 14/15/14 +f 14/15/14 26/28/26 27/29/27 +f 14/15/14 27/29/27 15/16/15 +f 15/16/15 27/29/27 28/30/28 +f 15/16/15 28/30/28 16/17/16 +f 16/17/16 28/30/28 29/31/29 +f 16/17/16 29/31/29 17/18/17 +f 17/18/17 29/31/29 30/32/30 +f 17/18/17 30/32/30 18/19/18 +f 18/19/18 30/32/30 31/33/31 +f 18/19/18 31/33/31 19/20/19 +f 19/20/19 31/33/31 32/34/32 +f 19/20/19 32/34/32 20/21/20 +f 20/21/20 32/34/32 33/35/33 +f 20/21/20 33/35/33 21/22/21 +f 21/22/21 33/35/33 34/36/34 +f 21/22/21 34/36/34 22/23/22 +f 22/23/22 34/36/34 35/37/35 +f 22/23/22 35/37/35 23/24/23 +f 23/24/23 35/37/35 36/38/36 +f 23/24/23 36/38/36 24/25/24 +f 24/25/24 36/38/36 25/39/25 +f 24/25/24 25/39/25 13/26/13 +f 25/27/25 37/40/37 38/41/38 +f 25/27/25 38/41/38 26/28/26 +f 26/28/26 38/41/38 39/42/39 +f 26/28/26 39/42/39 27/29/27 +f 27/29/27 39/42/39 40/43/40 +f 27/29/27 40/43/40 28/30/28 +f 28/30/28 40/43/40 41/44/41 +f 28/30/28 41/44/41 29/31/29 +f 29/31/29 41/44/41 42/45/42 +f 29/31/29 42/45/42 30/32/30 +f 30/32/30 42/45/42 43/46/43 +f 30/32/30 43/46/43 31/33/31 +f 31/33/31 43/46/43 44/47/44 +f 31/33/31 44/47/44 32/34/32 +f 32/34/32 44/47/44 45/48/45 +f 32/34/32 45/48/45 33/35/33 +f 33/35/33 45/48/45 46/49/46 +f 33/35/33 46/49/46 34/36/34 +f 34/36/34 46/49/46 47/50/47 +f 34/36/34 47/50/47 35/37/35 +f 35/37/35 47/50/47 48/51/48 +f 35/37/35 48/51/48 36/38/36 +f 36/38/36 48/51/48 37/52/37 +f 36/38/36 37/52/37 25/39/25 +f 37/40/37 49/53/49 50/54/50 +f 37/40/37 50/54/50 38/41/38 +f 38/41/38 50/54/50 51/55/51 +f 38/41/38 51/55/51 39/42/39 +f 39/42/39 51/55/51 52/56/52 +f 39/42/39 52/56/52 40/43/40 +f 40/43/40 52/56/52 53/57/53 +f 40/43/40 53/57/53 41/44/41 +f 41/44/41 53/57/53 54/58/54 +f 41/44/41 54/58/54 42/45/42 +f 42/45/42 54/58/54 55/59/55 +f 42/45/42 55/59/55 43/46/43 +f 43/46/43 55/59/55 56/60/56 +f 43/46/43 56/60/56 44/47/44 +f 44/47/44 56/60/56 57/61/57 +f 44/47/44 57/61/57 45/48/45 +f 45/48/45 57/61/57 58/62/58 +f 45/48/45 58/62/58 46/49/46 +f 46/49/46 58/62/58 59/63/59 +f 46/49/46 59/63/59 47/50/47 +f 47/50/47 59/63/59 60/64/60 +f 47/50/47 60/64/60 48/51/48 +f 48/51/48 60/64/60 49/65/49 +f 48/51/48 49/65/49 37/52/37 +f 49/53/49 61/66/61 62/67/62 +f 49/53/49 62/67/62 50/54/50 +f 50/54/50 62/67/62 63/68/63 +f 50/54/50 63/68/63 51/55/51 +f 51/55/51 63/68/63 64/69/64 +f 51/55/51 64/69/64 52/56/52 +f 52/56/52 64/69/64 65/70/65 +f 52/56/52 65/70/65 53/57/53 +f 53/57/53 65/70/65 66/71/66 +f 53/57/53 66/71/66 54/58/54 +f 54/58/54 66/71/66 67/72/67 +f 54/58/54 67/72/67 55/59/55 +f 55/59/55 67/72/67 68/73/68 +f 55/59/55 68/73/68 56/60/56 +f 56/60/56 68/73/68 69/74/69 +f 56/60/56 69/74/69 57/61/57 +f 57/61/57 69/74/69 70/75/70 +f 57/61/57 70/75/70 58/62/58 +f 58/62/58 70/75/70 71/76/71 +f 58/62/58 71/76/71 59/63/59 +f 59/63/59 71/76/71 72/77/72 +f 59/63/59 72/77/72 60/64/60 +f 60/64/60 72/77/72 61/78/61 +f 60/64/60 61/78/61 49/65/49 +f 61/66/61 73/79/73 74/80/74 +f 61/66/61 74/80/74 62/67/62 +f 62/67/62 74/80/74 75/81/75 +f 62/67/62 75/81/75 63/68/63 +f 63/68/63 75/81/75 76/82/76 +f 63/68/63 76/82/76 64/69/64 +f 64/69/64 76/82/76 77/83/77 +f 64/69/64 77/83/77 65/70/65 +f 65/70/65 77/83/77 78/84/78 +f 65/70/65 78/84/78 66/71/66 +f 66/71/66 78/84/78 79/85/79 +f 66/71/66 79/85/79 67/72/67 +f 67/72/67 79/85/79 80/86/80 +f 67/72/67 80/86/80 68/73/68 +f 68/73/68 80/86/80 81/87/81 +f 68/73/68 81/87/81 69/74/69 +f 69/74/69 81/87/81 82/88/82 +f 69/74/69 82/88/82 70/75/70 +f 70/75/70 82/88/82 83/89/83 +f 70/75/70 83/89/83 71/76/71 +f 71/76/71 83/89/83 84/90/84 +f 71/76/71 84/90/84 72/77/72 +f 72/77/72 84/90/84 73/91/73 +f 72/77/72 73/91/73 61/78/61 +f 73/79/73 85/92/85 86/93/86 +f 73/79/73 86/93/86 74/80/74 +f 74/80/74 86/93/86 87/94/87 +f 74/80/74 87/94/87 75/81/75 +f 75/81/75 87/94/87 88/95/88 +f 75/81/75 88/95/88 76/82/76 +f 76/82/76 88/95/88 89/96/89 +f 76/82/76 89/96/89 77/83/77 +f 77/83/77 89/96/89 90/97/90 +f 77/83/77 90/97/90 78/84/78 +f 78/84/78 90/97/90 91/98/91 +f 78/84/78 91/98/91 79/85/79 +f 79/85/79 91/98/91 92/99/92 +f 79/85/79 92/99/92 80/86/80 +f 80/86/80 92/99/92 93/100/93 +f 80/86/80 93/100/93 81/87/81 +f 81/87/81 93/100/93 94/101/94 +f 81/87/81 94/101/94 82/88/82 +f 82/88/82 94/101/94 95/102/95 +f 82/88/82 95/102/95 83/89/83 +f 83/89/83 95/102/95 96/103/96 +f 83/89/83 96/103/96 84/90/84 +f 84/90/84 96/103/96 85/104/85 +f 84/90/84 85/104/85 73/91/73 +f 85/92/85 97/105/97 98/106/98 +f 85/92/85 98/106/98 86/93/86 +f 86/93/86 98/106/98 99/107/99 +f 86/93/86 99/107/99 87/94/87 +f 87/94/87 99/107/99 100/108/100 +f 87/94/87 100/108/100 88/95/88 +f 88/95/88 100/108/100 101/109/101 +f 88/95/88 101/109/101 89/96/89 +f 89/96/89 101/109/101 102/110/102 +f 89/96/89 102/110/102 90/97/90 +f 90/97/90 102/110/102 103/111/103 +f 90/97/90 103/111/103 91/98/91 +f 91/98/91 103/111/103 104/112/104 +f 91/98/91 104/112/104 92/99/92 +f 92/99/92 104/112/104 105/113/105 +f 92/99/92 105/113/105 93/100/93 +f 93/100/93 105/113/105 106/114/106 +f 93/100/93 106/114/106 94/101/94 +f 94/101/94 106/114/106 107/115/107 +f 94/101/94 107/115/107 95/102/95 +f 95/102/95 107/115/107 108/116/108 +f 95/102/95 108/116/108 96/103/96 +f 96/103/96 108/116/108 97/117/97 +f 96/103/96 97/117/97 85/104/85 +f 97/105/97 109/118/109 110/119/110 +f 97/105/97 110/119/110 98/106/98 +f 98/106/98 110/119/110 111/120/111 +f 98/106/98 111/120/111 99/107/99 +f 99/107/99 111/120/111 112/121/112 +f 99/107/99 112/121/112 100/108/100 +f 100/108/100 112/121/112 113/122/113 +f 100/108/100 113/122/113 101/109/101 +f 101/109/101 113/122/113 114/123/114 +f 101/109/101 114/123/114 102/110/102 +f 102/110/102 114/123/114 115/124/115 +f 102/110/102 115/124/115 103/111/103 +f 103/111/103 115/124/115 116/125/116 +f 103/111/103 116/125/116 104/112/104 +f 104/112/104 116/125/116 117/126/117 +f 104/112/104 117/126/117 105/113/105 +f 105/113/105 117/126/117 118/127/118 +f 105/113/105 118/127/118 106/114/106 +f 106/114/106 118/127/118 119/128/119 +f 106/114/106 119/128/119 107/115/107 +f 107/115/107 119/128/119 120/129/120 +f 107/115/107 120/129/120 108/116/108 +f 108/116/108 120/129/120 109/130/109 +f 108/116/108 109/130/109 97/117/97 +f 109/118/109 121/131/121 122/132/122 +f 109/118/109 122/132/122 110/119/110 +f 110/119/110 122/132/122 123/133/123 +f 110/119/110 123/133/123 111/120/111 +f 111/120/111 123/133/123 124/134/124 +f 111/120/111 124/134/124 112/121/112 +f 112/121/112 124/134/124 125/135/125 +f 112/121/112 125/135/125 113/122/113 +f 113/122/113 125/135/125 126/136/126 +f 113/122/113 126/136/126 114/123/114 +f 114/123/114 126/136/126 127/137/127 +f 114/123/114 127/137/127 115/124/115 +f 115/124/115 127/137/127 128/138/128 +f 115/124/115 128/138/128 116/125/116 +f 116/125/116 128/138/128 129/139/129 +f 116/125/116 129/139/129 117/126/117 +f 117/126/117 129/139/129 130/140/130 +f 117/126/117 130/140/130 118/127/118 +f 118/127/118 130/140/130 131/141/131 +f 118/127/118 131/141/131 119/128/119 +f 119/128/119 131/141/131 132/142/132 +f 119/128/119 132/142/132 120/129/120 +f 120/129/120 132/142/132 121/143/121 +f 120/129/120 121/143/121 109/130/109 +f 121/131/121 133/144/133 134/145/134 +f 121/131/121 134/145/134 122/132/122 +f 122/132/122 134/145/134 135/146/135 +f 122/132/122 135/146/135 123/133/123 +f 123/133/123 135/146/135 136/147/136 +f 123/133/123 136/147/136 124/134/124 +f 124/134/124 136/147/136 137/148/137 +f 124/134/124 137/148/137 125/135/125 +f 125/135/125 137/148/137 138/149/138 +f 125/135/125 138/149/138 126/136/126 +f 126/136/126 138/149/138 139/150/139 +f 126/136/126 139/150/139 127/137/127 +f 127/137/127 139/150/139 140/151/140 +f 127/137/127 140/151/140 128/138/128 +f 128/138/128 140/151/140 141/152/141 +f 128/138/128 141/152/141 129/139/129 +f 129/139/129 141/152/141 142/153/142 +f 129/139/129 142/153/142 130/140/130 +f 130/140/130 142/153/142 143/154/143 +f 130/140/130 143/154/143 131/141/131 +f 131/141/131 143/154/143 144/155/144 +f 131/141/131 144/155/144 132/142/132 +f 132/142/132 144/155/144 133/156/133 +f 132/142/132 133/156/133 121/143/121 +f 133/144/133 145/157/145 146/158/146 +f 133/144/133 146/158/146 134/145/134 +f 134/145/134 146/158/146 147/159/147 +f 134/145/134 147/159/147 135/146/135 +f 135/146/135 147/159/147 148/160/148 +f 135/146/135 148/160/148 136/147/136 +f 136/147/136 148/160/148 149/161/149 +f 136/147/136 149/161/149 137/148/137 +f 137/148/137 149/161/149 150/162/150 +f 137/148/137 150/162/150 138/149/138 +f 138/149/138 150/162/150 151/163/151 +f 138/149/138 151/163/151 139/150/139 +f 139/150/139 151/163/151 152/164/152 +f 139/150/139 152/164/152 140/151/140 +f 140/151/140 152/164/152 153/165/153 +f 140/151/140 153/165/153 141/152/141 +f 141/152/141 153/165/153 154/166/154 +f 141/152/141 154/166/154 142/153/142 +f 142/153/142 154/166/154 155/167/155 +f 142/153/142 155/167/155 143/154/143 +f 143/154/143 155/167/155 156/168/156 +f 143/154/143 156/168/156 144/155/144 +f 144/155/144 156/168/156 145/169/145 +f 144/155/144 145/169/145 133/156/133 +f 145/157/145 157/170/157 158/171/158 +f 145/157/145 158/171/158 146/158/146 +f 146/158/146 158/171/158 159/172/159 +f 146/158/146 159/172/159 147/159/147 +f 147/159/147 159/172/159 160/173/160 +f 147/159/147 160/173/160 148/160/148 +f 148/160/148 160/173/160 161/174/161 +f 148/160/148 161/174/161 149/161/149 +f 149/161/149 161/174/161 162/175/162 +f 149/161/149 162/175/162 150/162/150 +f 150/162/150 162/175/162 163/176/163 +f 150/162/150 163/176/163 151/163/151 +f 151/163/151 163/176/163 164/177/164 +f 151/163/151 164/177/164 152/164/152 +f 152/164/152 164/177/164 165/178/165 +f 152/164/152 165/178/165 153/165/153 +f 153/165/153 165/178/165 166/179/166 +f 153/165/153 166/179/166 154/166/154 +f 154/166/154 166/179/166 167/180/167 +f 154/166/154 167/180/167 155/167/155 +f 155/167/155 167/180/167 168/181/168 +f 155/167/155 168/181/168 156/168/156 +f 156/168/156 168/181/168 157/182/157 +f 156/168/156 157/182/157 145/169/145 +f 157/170/157 169/183/169 170/184/170 +f 157/170/157 170/184/170 158/171/158 +f 158/171/158 170/184/170 171/185/171 +f 158/171/158 171/185/171 159/172/159 +f 159/172/159 171/185/171 172/186/172 +f 159/172/159 172/186/172 160/173/160 +f 160/173/160 172/186/172 173/187/173 +f 160/173/160 173/187/173 161/174/161 +f 161/174/161 173/187/173 174/188/174 +f 161/174/161 174/188/174 162/175/162 +f 162/175/162 174/188/174 175/189/175 +f 162/175/162 175/189/175 163/176/163 +f 163/176/163 175/189/175 176/190/176 +f 163/176/163 176/190/176 164/177/164 +f 164/177/164 176/190/176 177/191/177 +f 164/177/164 177/191/177 165/178/165 +f 165/178/165 177/191/177 178/192/178 +f 165/178/165 178/192/178 166/179/166 +f 166/179/166 178/192/178 179/193/179 +f 166/179/166 179/193/179 167/180/167 +f 167/180/167 179/193/179 180/194/180 +f 167/180/167 180/194/180 168/181/168 +f 168/181/168 180/194/180 169/195/169 +f 168/181/168 169/195/169 157/182/157 +f 169/183/169 181/196/181 182/197/182 +f 169/183/169 182/197/182 170/184/170 +f 170/184/170 182/197/182 183/198/183 +f 170/184/170 183/198/183 171/185/171 +f 171/185/171 183/198/183 184/199/184 +f 171/185/171 184/199/184 172/186/172 +f 172/186/172 184/199/184 185/200/185 +f 172/186/172 185/200/185 173/187/173 +f 173/187/173 185/200/185 186/201/186 +f 173/187/173 186/201/186 174/188/174 +f 174/188/174 186/201/186 187/202/187 +f 174/188/174 187/202/187 175/189/175 +f 175/189/175 187/202/187 188/203/188 +f 175/189/175 188/203/188 176/190/176 +f 176/190/176 188/203/188 189/204/189 +f 176/190/176 189/204/189 177/191/177 +f 177/191/177 189/204/189 190/205/190 +f 177/191/177 190/205/190 178/192/178 +f 178/192/178 190/205/190 191/206/191 +f 178/192/178 191/206/191 179/193/179 +f 179/193/179 191/206/191 192/207/192 +f 179/193/179 192/207/192 180/194/180 +f 180/194/180 192/207/192 181/208/181 +f 180/194/180 181/208/181 169/195/169 +f 181/196/181 193/209/193 194/210/194 +f 181/196/181 194/210/194 182/197/182 +f 182/197/182 194/210/194 195/211/195 +f 182/197/182 195/211/195 183/198/183 +f 183/198/183 195/211/195 196/212/196 +f 183/198/183 196/212/196 184/199/184 +f 184/199/184 196/212/196 197/213/197 +f 184/199/184 197/213/197 185/200/185 +f 185/200/185 197/213/197 198/214/198 +f 185/200/185 198/214/198 186/201/186 +f 186/201/186 198/214/198 199/215/199 +f 186/201/186 199/215/199 187/202/187 +f 187/202/187 199/215/199 200/216/200 +f 187/202/187 200/216/200 188/203/188 +f 188/203/188 200/216/200 201/217/201 +f 188/203/188 201/217/201 189/204/189 +f 189/204/189 201/217/201 202/218/202 +f 189/204/189 202/218/202 190/205/190 +f 190/205/190 202/218/202 203/219/203 +f 190/205/190 203/219/203 191/206/191 +f 191/206/191 203/219/203 204/220/204 +f 191/206/191 204/220/204 192/207/192 +f 192/207/192 204/220/204 193/221/193 +f 192/207/192 193/221/193 181/208/181 +f 193/209/193 205/222/205 206/223/206 +f 193/209/193 206/223/206 194/210/194 +f 194/210/194 206/223/206 207/224/207 +f 194/210/194 207/224/207 195/211/195 +f 195/211/195 207/224/207 208/225/208 +f 195/211/195 208/225/208 196/212/196 +f 196/212/196 208/225/208 209/226/209 +f 196/212/196 209/226/209 197/213/197 +f 197/213/197 209/226/209 210/227/210 +f 197/213/197 210/227/210 198/214/198 +f 198/214/198 210/227/210 211/228/211 +f 198/214/198 211/228/211 199/215/199 +f 199/215/199 211/228/211 212/229/212 +f 199/215/199 212/229/212 200/216/200 +f 200/216/200 212/229/212 213/230/213 +f 200/216/200 213/230/213 201/217/201 +f 201/217/201 213/230/213 214/231/214 +f 201/217/201 214/231/214 202/218/202 +f 202/218/202 214/231/214 215/232/215 +f 202/218/202 215/232/215 203/219/203 +f 203/219/203 215/232/215 216/233/216 +f 203/219/203 216/233/216 204/220/204 +f 204/220/204 216/233/216 205/234/205 +f 204/220/204 205/234/205 193/221/193 +f 205/222/205 217/235/217 218/236/218 +f 205/222/205 218/236/218 206/223/206 +f 206/223/206 218/236/218 219/237/219 +f 206/223/206 219/237/219 207/224/207 +f 207/224/207 219/237/219 220/238/220 +f 207/224/207 220/238/220 208/225/208 +f 208/225/208 220/238/220 221/239/221 +f 208/225/208 221/239/221 209/226/209 +f 209/226/209 221/239/221 222/240/222 +f 209/226/209 222/240/222 210/227/210 +f 210/227/210 222/240/222 223/241/223 +f 210/227/210 223/241/223 211/228/211 +f 211/228/211 223/241/223 224/242/224 +f 211/228/211 224/242/224 212/229/212 +f 212/229/212 224/242/224 225/243/225 +f 212/229/212 225/243/225 213/230/213 +f 213/230/213 225/243/225 226/244/226 +f 213/230/213 226/244/226 214/231/214 +f 214/231/214 226/244/226 227/245/227 +f 214/231/214 227/245/227 215/232/215 +f 215/232/215 227/245/227 228/246/228 +f 215/232/215 228/246/228 216/233/216 +f 216/233/216 228/246/228 217/247/217 +f 216/233/216 217/247/217 205/234/205 +f 217/235/217 229/248/229 230/249/230 +f 217/235/217 230/249/230 218/236/218 +f 218/236/218 230/249/230 231/250/231 +f 218/236/218 231/250/231 219/237/219 +f 219/237/219 231/250/231 232/251/232 +f 219/237/219 232/251/232 220/238/220 +f 220/238/220 232/251/232 233/252/233 +f 220/238/220 233/252/233 221/239/221 +f 221/239/221 233/252/233 234/253/234 +f 221/239/221 234/253/234 222/240/222 +f 222/240/222 234/253/234 235/254/235 +f 222/240/222 235/254/235 223/241/223 +f 223/241/223 235/254/235 236/255/236 +f 223/241/223 236/255/236 224/242/224 +f 224/242/224 236/255/236 237/256/237 +f 224/242/224 237/256/237 225/243/225 +f 225/243/225 237/256/237 238/257/238 +f 225/243/225 238/257/238 226/244/226 +f 226/244/226 238/257/238 239/258/239 +f 226/244/226 239/258/239 227/245/227 +f 227/245/227 239/258/239 240/259/240 +f 227/245/227 240/259/240 228/246/228 +f 228/246/228 240/259/240 229/260/229 +f 228/246/228 229/260/229 217/247/217 +f 229/248/229 241/261/241 242/262/242 +f 229/248/229 242/262/242 230/249/230 +f 230/249/230 242/262/242 243/263/243 +f 230/249/230 243/263/243 231/250/231 +f 231/250/231 243/263/243 244/264/244 +f 231/250/231 244/264/244 232/251/232 +f 232/251/232 244/264/244 245/265/245 +f 232/251/232 245/265/245 233/252/233 +f 233/252/233 245/265/245 246/266/246 +f 233/252/233 246/266/246 234/253/234 +f 234/253/234 246/266/246 247/267/247 +f 234/253/234 247/267/247 235/254/235 +f 235/254/235 247/267/247 248/268/248 +f 235/254/235 248/268/248 236/255/236 +f 236/255/236 248/268/248 249/269/249 +f 236/255/236 249/269/249 237/256/237 +f 237/256/237 249/269/249 250/270/250 +f 237/256/237 250/270/250 238/257/238 +f 238/257/238 250/270/250 251/271/251 +f 238/257/238 251/271/251 239/258/239 +f 239/258/239 251/271/251 252/272/252 +f 239/258/239 252/272/252 240/259/240 +f 240/259/240 252/272/252 241/273/241 +f 240/259/240 241/273/241 229/260/229 +f 241/261/241 253/274/253 254/275/254 +f 241/261/241 254/275/254 242/262/242 +f 242/262/242 254/275/254 255/276/255 +f 242/262/242 255/276/255 243/263/243 +f 243/263/243 255/276/255 256/277/256 +f 243/263/243 256/277/256 244/264/244 +f 244/264/244 256/277/256 257/278/257 +f 244/264/244 257/278/257 245/265/245 +f 245/265/245 257/278/257 258/279/258 +f 245/265/245 258/279/258 246/266/246 +f 246/266/246 258/279/258 259/280/259 +f 246/266/246 259/280/259 247/267/247 +f 247/267/247 259/280/259 260/281/260 +f 247/267/247 260/281/260 248/268/248 +f 248/268/248 260/281/260 261/282/261 +f 248/268/248 261/282/261 249/269/249 +f 249/269/249 261/282/261 262/283/262 +f 249/269/249 262/283/262 250/270/250 +f 250/270/250 262/283/262 263/284/263 +f 250/270/250 263/284/263 251/271/251 +f 251/271/251 263/284/263 264/285/264 +f 251/271/251 264/285/264 252/272/252 +f 252/272/252 264/285/264 253/286/253 +f 252/272/252 253/286/253 241/273/241 +f 253/274/253 265/287/265 266/288/266 +f 253/274/253 266/288/266 254/275/254 +f 254/275/254 266/288/266 267/289/267 +f 254/275/254 267/289/267 255/276/255 +f 255/276/255 267/289/267 268/290/268 +f 255/276/255 268/290/268 256/277/256 +f 256/277/256 268/290/268 269/291/269 +f 256/277/256 269/291/269 257/278/257 +f 257/278/257 269/291/269 270/292/270 +f 257/278/257 270/292/270 258/279/258 +f 258/279/258 270/292/270 271/293/271 +f 258/279/258 271/293/271 259/280/259 +f 259/280/259 271/293/271 272/294/272 +f 259/280/259 272/294/272 260/281/260 +f 260/281/260 272/294/272 273/295/273 +f 260/281/260 273/295/273 261/282/261 +f 261/282/261 273/295/273 274/296/274 +f 261/282/261 274/296/274 262/283/262 +f 262/283/262 274/296/274 275/297/275 +f 262/283/262 275/297/275 263/284/263 +f 263/284/263 275/297/275 276/298/276 +f 263/284/263 276/298/276 264/285/264 +f 264/285/264 276/298/276 265/299/265 +f 264/285/264 265/299/265 253/286/253 +f 265/287/265 277/300/277 278/301/278 +f 265/287/265 278/301/278 266/288/266 +f 266/288/266 278/301/278 279/302/279 +f 266/288/266 279/302/279 267/289/267 +f 267/289/267 279/302/279 280/303/280 +f 267/289/267 280/303/280 268/290/268 +f 268/290/268 280/303/280 281/304/281 +f 268/290/268 281/304/281 269/291/269 +f 269/291/269 281/304/281 282/305/282 +f 269/291/269 282/305/282 270/292/270 +f 270/292/270 282/305/282 283/306/283 +f 270/292/270 283/306/283 271/293/271 +f 271/293/271 283/306/283 284/307/284 +f 271/293/271 284/307/284 272/294/272 +f 272/294/272 284/307/284 285/308/285 +f 272/294/272 285/308/285 273/295/273 +f 273/295/273 285/308/285 286/309/286 +f 273/295/273 286/309/286 274/296/274 +f 274/296/274 286/309/286 287/310/287 +f 274/296/274 287/310/287 275/297/275 +f 275/297/275 287/310/287 288/311/288 +f 275/297/275 288/311/288 276/298/276 +f 276/298/276 288/311/288 277/312/277 +f 276/298/276 277/312/277 265/299/265 +f 277/300/277 289/313/289 290/314/290 +f 277/300/277 290/314/290 278/301/278 +f 278/301/278 290/314/290 291/315/291 +f 278/301/278 291/315/291 279/302/279 +f 279/302/279 291/315/291 292/316/292 +f 279/302/279 292/316/292 280/303/280 +f 280/303/280 292/316/292 293/317/293 +f 280/303/280 293/317/293 281/304/281 +f 281/304/281 293/317/293 294/318/294 +f 281/304/281 294/318/294 282/305/282 +f 282/305/282 294/318/294 295/319/295 +f 282/305/282 295/319/295 283/306/283 +f 283/306/283 295/319/295 296/320/296 +f 283/306/283 296/320/296 284/307/284 +f 284/307/284 296/320/296 297/321/297 +f 284/307/284 297/321/297 285/308/285 +f 285/308/285 297/321/297 298/322/298 +f 285/308/285 298/322/298 286/309/286 +f 286/309/286 298/322/298 299/323/299 +f 286/309/286 299/323/299 287/310/287 +f 287/310/287 299/323/299 300/324/300 +f 287/310/287 300/324/300 288/311/288 +f 288/311/288 300/324/300 289/325/289 +f 288/311/288 289/325/289 277/312/277 +f 289/313/289 301/326/301 302/327/302 +f 289/313/289 302/327/302 290/314/290 +f 290/314/290 302/327/302 303/328/303 +f 290/314/290 303/328/303 291/315/291 +f 291/315/291 303/328/303 304/329/304 +f 291/315/291 304/329/304 292/316/292 +f 292/316/292 304/329/304 305/330/305 +f 292/316/292 305/330/305 293/317/293 +f 293/317/293 305/330/305 306/331/306 +f 293/317/293 306/331/306 294/318/294 +f 294/318/294 306/331/306 307/332/307 +f 294/318/294 307/332/307 295/319/295 +f 295/319/295 307/332/307 308/333/308 +f 295/319/295 308/333/308 296/320/296 +f 296/320/296 308/333/308 309/334/309 +f 296/320/296 309/334/309 297/321/297 +f 297/321/297 309/334/309 310/335/310 +f 297/321/297 310/335/310 298/322/298 +f 298/322/298 310/335/310 311/336/311 +f 298/322/298 311/336/311 299/323/299 +f 299/323/299 311/336/311 312/337/312 +f 299/323/299 312/337/312 300/324/300 +f 300/324/300 312/337/312 301/338/301 +f 300/324/300 301/338/301 289/325/289 +f 301/326/301 313/339/313 314/340/314 +f 301/326/301 314/340/314 302/327/302 +f 302/327/302 314/340/314 315/341/315 +f 302/327/302 315/341/315 303/328/303 +f 303/328/303 315/341/315 316/342/316 +f 303/328/303 316/342/316 304/329/304 +f 304/329/304 316/342/316 317/343/317 +f 304/329/304 317/343/317 305/330/305 +f 305/330/305 317/343/317 318/344/318 +f 305/330/305 318/344/318 306/331/306 +f 306/331/306 318/344/318 319/345/319 +f 306/331/306 319/345/319 307/332/307 +f 307/332/307 319/345/319 320/346/320 +f 307/332/307 320/346/320 308/333/308 +f 308/333/308 320/346/320 321/347/321 +f 308/333/308 321/347/321 309/334/309 +f 309/334/309 321/347/321 322/348/322 +f 309/334/309 322/348/322 310/335/310 +f 310/335/310 322/348/322 323/349/323 +f 310/335/310 323/349/323 311/336/311 +f 311/336/311 323/349/323 324/350/324 +f 311/336/311 324/350/324 312/337/312 +f 312/337/312 324/350/324 313/351/313 +f 312/337/312 313/351/313 301/338/301 +f 313/339/313 325/352/325 326/353/326 +f 313/339/313 326/353/326 314/340/314 +f 314/340/314 326/353/326 327/354/327 +f 314/340/314 327/354/327 315/341/315 +f 315/341/315 327/354/327 328/355/328 +f 315/341/315 328/355/328 316/342/316 +f 316/342/316 328/355/328 329/356/329 +f 316/342/316 329/356/329 317/343/317 +f 317/343/317 329/356/329 330/357/330 +f 317/343/317 330/357/330 318/344/318 +f 318/344/318 330/357/330 331/358/331 +f 318/344/318 331/358/331 319/345/319 +f 319/345/319 331/358/331 332/359/332 +f 319/345/319 332/359/332 320/346/320 +f 320/346/320 332/359/332 333/360/333 +f 320/346/320 333/360/333 321/347/321 +f 321/347/321 333/360/333 334/361/334 +f 321/347/321 334/361/334 322/348/322 +f 322/348/322 334/361/334 335/362/335 +f 322/348/322 335/362/335 323/349/323 +f 323/349/323 335/362/335 336/363/336 +f 323/349/323 336/363/336 324/350/324 +f 324/350/324 336/363/336 325/364/325 +f 324/350/324 325/364/325 313/351/313 +f 325/352/325 337/365/337 338/366/338 +f 325/352/325 338/366/338 326/353/326 +f 326/353/326 338/366/338 339/367/339 +f 326/353/326 339/367/339 327/354/327 +f 327/354/327 339/367/339 340/368/340 +f 327/354/327 340/368/340 328/355/328 +f 328/355/328 340/368/340 341/369/341 +f 328/355/328 341/369/341 329/356/329 +f 329/356/329 341/369/341 342/370/342 +f 329/356/329 342/370/342 330/357/330 +f 330/357/330 342/370/342 343/371/343 +f 330/357/330 343/371/343 331/358/331 +f 331/358/331 343/371/343 344/372/344 +f 331/358/331 344/372/344 332/359/332 +f 332/359/332 344/372/344 345/373/345 +f 332/359/332 345/373/345 333/360/333 +f 333/360/333 345/373/345 346/374/346 +f 333/360/333 346/374/346 334/361/334 +f 334/361/334 346/374/346 347/375/347 +f 334/361/334 347/375/347 335/362/335 +f 335/362/335 347/375/347 348/376/348 +f 335/362/335 348/376/348 336/363/336 +f 336/363/336 348/376/348 337/377/337 +f 336/363/336 337/377/337 325/364/325 +f 337/365/337 349/378/349 350/379/350 +f 337/365/337 350/379/350 338/366/338 +f 338/366/338 350/379/350 351/380/351 +f 338/366/338 351/380/351 339/367/339 +f 339/367/339 351/380/351 352/381/352 +f 339/367/339 352/381/352 340/368/340 +f 340/368/340 352/381/352 353/382/353 +f 340/368/340 353/382/353 341/369/341 +f 341/369/341 353/382/353 354/383/354 +f 341/369/341 354/383/354 342/370/342 +f 342/370/342 354/383/354 355/384/355 +f 342/370/342 355/384/355 343/371/343 +f 343/371/343 355/384/355 356/385/356 +f 343/371/343 356/385/356 344/372/344 +f 344/372/344 356/385/356 357/386/357 +f 344/372/344 357/386/357 345/373/345 +f 345/373/345 357/386/357 358/387/358 +f 345/373/345 358/387/358 346/374/346 +f 346/374/346 358/387/358 359/388/359 +f 346/374/346 359/388/359 347/375/347 +f 347/375/347 359/388/359 360/389/360 +f 347/375/347 360/389/360 348/376/348 +f 348/376/348 360/389/360 349/390/349 +f 348/376/348 349/390/349 337/377/337 +f 349/378/349 361/391/361 362/392/362 +f 349/378/349 362/392/362 350/379/350 +f 350/379/350 362/392/362 363/393/363 +f 350/379/350 363/393/363 351/380/351 +f 351/380/351 363/393/363 364/394/364 +f 351/380/351 364/394/364 352/381/352 +f 352/381/352 364/394/364 365/395/365 +f 352/381/352 365/395/365 353/382/353 +f 353/382/353 365/395/365 366/396/366 +f 353/382/353 366/396/366 354/383/354 +f 354/383/354 366/396/366 367/397/367 +f 354/383/354 367/397/367 355/384/355 +f 355/384/355 367/397/367 368/398/368 +f 355/384/355 368/398/368 356/385/356 +f 356/385/356 368/398/368 369/399/369 +f 356/385/356 369/399/369 357/386/357 +f 357/386/357 369/399/369 370/400/370 +f 357/386/357 370/400/370 358/387/358 +f 358/387/358 370/400/370 371/401/371 +f 358/387/358 371/401/371 359/388/359 +f 359/388/359 371/401/371 372/402/372 +f 359/388/359 372/402/372 360/389/360 +f 360/389/360 372/402/372 361/403/361 +f 360/389/360 361/403/361 349/390/349 +f 361/391/361 373/404/373 374/405/374 +f 361/391/361 374/405/374 362/392/362 +f 362/392/362 374/405/374 375/406/375 +f 362/392/362 375/406/375 363/393/363 +f 363/393/363 375/406/375 376/407/376 +f 363/393/363 376/407/376 364/394/364 +f 364/394/364 376/407/376 377/408/377 +f 364/394/364 377/408/377 365/395/365 +f 365/395/365 377/408/377 378/409/378 +f 365/395/365 378/409/378 366/396/366 +f 366/396/366 378/409/378 379/410/379 +f 366/396/366 379/410/379 367/397/367 +f 367/397/367 379/410/379 380/411/380 +f 367/397/367 380/411/380 368/398/368 +f 368/398/368 380/411/380 381/412/381 +f 368/398/368 381/412/381 369/399/369 +f 369/399/369 381/412/381 382/413/382 +f 369/399/369 382/413/382 370/400/370 +f 370/400/370 382/413/382 383/414/383 +f 370/400/370 383/414/383 371/401/371 +f 371/401/371 383/414/383 384/415/384 +f 371/401/371 384/415/384 372/402/372 +f 372/402/372 384/415/384 373/416/373 +f 372/402/372 373/416/373 361/403/361 +f 373/404/373 385/417/385 386/418/386 +f 373/404/373 386/418/386 374/405/374 +f 374/405/374 386/418/386 387/419/387 +f 374/405/374 387/419/387 375/406/375 +f 375/406/375 387/419/387 388/420/388 +f 375/406/375 388/420/388 376/407/376 +f 376/407/376 388/420/388 389/421/389 +f 376/407/376 389/421/389 377/408/377 +f 377/408/377 389/421/389 390/422/390 +f 377/408/377 390/422/390 378/409/378 +f 378/409/378 390/422/390 391/423/391 +f 378/409/378 391/423/391 379/410/379 +f 379/410/379 391/423/391 392/424/392 +f 379/410/379 392/424/392 380/411/380 +f 380/411/380 392/424/392 393/425/393 +f 380/411/380 393/425/393 381/412/381 +f 381/412/381 393/425/393 394/426/394 +f 381/412/381 394/426/394 382/413/382 +f 382/413/382 394/426/394 395/427/395 +f 382/413/382 395/427/395 383/414/383 +f 383/414/383 395/427/395 396/428/396 +f 383/414/383 396/428/396 384/415/384 +f 384/415/384 396/428/396 385/429/385 +f 384/415/384 385/429/385 373/416/373 +f 385/417/385 397/430/397 398/431/398 +f 385/417/385 398/431/398 386/418/386 +f 386/418/386 398/431/398 399/432/399 +f 386/418/386 399/432/399 387/419/387 +f 387/419/387 399/432/399 400/433/400 +f 387/419/387 400/433/400 388/420/388 +f 388/420/388 400/433/400 401/434/401 +f 388/420/388 401/434/401 389/421/389 +f 389/421/389 401/434/401 402/435/402 +f 389/421/389 402/435/402 390/422/390 +f 390/422/390 402/435/402 403/436/403 +f 390/422/390 403/436/403 391/423/391 +f 391/423/391 403/436/403 404/437/404 +f 391/423/391 404/437/404 392/424/392 +f 392/424/392 404/437/404 405/438/405 +f 392/424/392 405/438/405 393/425/393 +f 393/425/393 405/438/405 406/439/406 +f 393/425/393 406/439/406 394/426/394 +f 394/426/394 406/439/406 407/440/407 +f 394/426/394 407/440/407 395/427/395 +f 395/427/395 407/440/407 408/441/408 +f 395/427/395 408/441/408 396/428/396 +f 396/428/396 408/441/408 397/442/397 +f 396/428/396 397/442/397 385/429/385 +f 397/430/397 409/443/409 410/444/410 +f 397/430/397 410/444/410 398/431/398 +f 398/431/398 410/444/410 411/445/411 +f 398/431/398 411/445/411 399/432/399 +f 399/432/399 411/445/411 412/446/412 +f 399/432/399 412/446/412 400/433/400 +f 400/433/400 412/446/412 413/447/413 +f 400/433/400 413/447/413 401/434/401 +f 401/434/401 413/447/413 414/448/414 +f 401/434/401 414/448/414 402/435/402 +f 402/435/402 414/448/414 415/449/415 +f 402/435/402 415/449/415 403/436/403 +f 403/436/403 415/449/415 416/450/416 +f 403/436/403 416/450/416 404/437/404 +f 404/437/404 416/450/416 417/451/417 +f 404/437/404 417/451/417 405/438/405 +f 405/438/405 417/451/417 418/452/418 +f 405/438/405 418/452/418 406/439/406 +f 406/439/406 418/452/418 419/453/419 +f 406/439/406 419/453/419 407/440/407 +f 407/440/407 419/453/419 420/454/420 +f 407/440/407 420/454/420 408/441/408 +f 408/441/408 420/454/420 409/455/409 +f 408/441/408 409/455/409 397/442/397 +f 409/443/409 421/456/421 422/457/422 +f 409/443/409 422/457/422 410/444/410 +f 410/444/410 422/457/422 423/458/423 +f 410/444/410 423/458/423 411/445/411 +f 411/445/411 423/458/423 424/459/424 +f 411/445/411 424/459/424 412/446/412 +f 412/446/412 424/459/424 425/460/425 +f 412/446/412 425/460/425 413/447/413 +f 413/447/413 425/460/425 426/461/426 +f 413/447/413 426/461/426 414/448/414 +f 414/448/414 426/461/426 427/462/427 +f 414/448/414 427/462/427 415/449/415 +f 415/449/415 427/462/427 428/463/428 +f 415/449/415 428/463/428 416/450/416 +f 416/450/416 428/463/428 429/464/429 +f 416/450/416 429/464/429 417/451/417 +f 417/451/417 429/464/429 430/465/430 +f 417/451/417 430/465/430 418/452/418 +f 418/452/418 430/465/430 431/466/431 +f 418/452/418 431/466/431 419/453/419 +f 419/453/419 431/466/431 432/467/432 +f 419/453/419 432/467/432 420/454/420 +f 420/454/420 432/467/432 421/468/421 +f 420/454/420 421/468/421 409/455/409 +f 421/456/421 433/469/433 434/470/434 +f 421/456/421 434/470/434 422/457/422 +f 422/457/422 434/470/434 435/471/435 +f 422/457/422 435/471/435 423/458/423 +f 423/458/423 435/471/435 436/472/436 +f 423/458/423 436/472/436 424/459/424 +f 424/459/424 436/472/436 437/473/437 +f 424/459/424 437/473/437 425/460/425 +f 425/460/425 437/473/437 438/474/438 +f 425/460/425 438/474/438 426/461/426 +f 426/461/426 438/474/438 439/475/439 +f 426/461/426 439/475/439 427/462/427 +f 427/462/427 439/475/439 440/476/440 +f 427/462/427 440/476/440 428/463/428 +f 428/463/428 440/476/440 441/477/441 +f 428/463/428 441/477/441 429/464/429 +f 429/464/429 441/477/441 442/478/442 +f 429/464/429 442/478/442 430/465/430 +f 430/465/430 442/478/442 443/479/443 +f 430/465/430 443/479/443 431/466/431 +f 431/466/431 443/479/443 444/480/444 +f 431/466/431 444/480/444 432/467/432 +f 432/467/432 444/480/444 433/481/433 +f 432/467/432 433/481/433 421/468/421 +f 433/469/433 445/482/445 446/483/446 +f 433/469/433 446/483/446 434/470/434 +f 434/470/434 446/483/446 447/484/447 +f 434/470/434 447/484/447 435/471/435 +f 435/471/435 447/484/447 448/485/448 +f 435/471/435 448/485/448 436/472/436 +f 436/472/436 448/485/448 449/486/449 +f 436/472/436 449/486/449 437/473/437 +f 437/473/437 449/486/449 450/487/450 +f 437/473/437 450/487/450 438/474/438 +f 438/474/438 450/487/450 451/488/451 +f 438/474/438 451/488/451 439/475/439 +f 439/475/439 451/488/451 452/489/452 +f 439/475/439 452/489/452 440/476/440 +f 440/476/440 452/489/452 453/490/453 +f 440/476/440 453/490/453 441/477/441 +f 441/477/441 453/490/453 454/491/454 +f 441/477/441 454/491/454 442/478/442 +f 442/478/442 454/491/454 455/492/455 +f 442/478/442 455/492/455 443/479/443 +f 443/479/443 455/492/455 456/493/456 +f 443/479/443 456/493/456 444/480/444 +f 444/480/444 456/493/456 445/494/445 +f 444/480/444 445/494/445 433/481/433 +f 445/482/445 457/495/457 458/496/458 +f 445/482/445 458/496/458 446/483/446 +f 446/483/446 458/496/458 459/497/459 +f 446/483/446 459/497/459 447/484/447 +f 447/484/447 459/497/459 460/498/460 +f 447/484/447 460/498/460 448/485/448 +f 448/485/448 460/498/460 461/499/461 +f 448/485/448 461/499/461 449/486/449 +f 449/486/449 461/499/461 462/500/462 +f 449/486/449 462/500/462 450/487/450 +f 450/487/450 462/500/462 463/501/463 +f 450/487/450 463/501/463 451/488/451 +f 451/488/451 463/501/463 464/502/464 +f 451/488/451 464/502/464 452/489/452 +f 452/489/452 464/502/464 465/503/465 +f 452/489/452 465/503/465 453/490/453 +f 453/490/453 465/503/465 466/504/466 +f 453/490/453 466/504/466 454/491/454 +f 454/491/454 466/504/466 467/505/467 +f 454/491/454 467/505/467 455/492/455 +f 455/492/455 467/505/467 468/506/468 +f 455/492/455 468/506/468 456/493/456 +f 456/493/456 468/506/468 457/507/457 +f 456/493/456 457/507/457 445/494/445 +f 457/495/457 469/508/469 470/509/470 +f 457/495/457 470/509/470 458/496/458 +f 458/496/458 470/509/470 471/510/471 +f 458/496/458 471/510/471 459/497/459 +f 459/497/459 471/510/471 472/511/472 +f 459/497/459 472/511/472 460/498/460 +f 460/498/460 472/511/472 473/512/473 +f 460/498/460 473/512/473 461/499/461 +f 461/499/461 473/512/473 474/513/474 +f 461/499/461 474/513/474 462/500/462 +f 462/500/462 474/513/474 475/514/475 +f 462/500/462 475/514/475 463/501/463 +f 463/501/463 475/514/475 476/515/476 +f 463/501/463 476/515/476 464/502/464 +f 464/502/464 476/515/476 477/516/477 +f 464/502/464 477/516/477 465/503/465 +f 465/503/465 477/516/477 478/517/478 +f 465/503/465 478/517/478 466/504/466 +f 466/504/466 478/517/478 479/518/479 +f 466/504/466 479/518/479 467/505/467 +f 467/505/467 479/518/479 480/519/480 +f 467/505/467 480/519/480 468/506/468 +f 468/506/468 480/519/480 469/520/469 +f 468/506/468 469/520/469 457/507/457 +f 469/508/469 481/521/481 482/522/482 +f 469/508/469 482/522/482 470/509/470 +f 470/509/470 482/522/482 483/523/483 +f 470/509/470 483/523/483 471/510/471 +f 471/510/471 483/523/483 484/524/484 +f 471/510/471 484/524/484 472/511/472 +f 472/511/472 484/524/484 485/525/485 +f 472/511/472 485/525/485 473/512/473 +f 473/512/473 485/525/485 486/526/486 +f 473/512/473 486/526/486 474/513/474 +f 474/513/474 486/526/486 487/527/487 +f 474/513/474 487/527/487 475/514/475 +f 475/514/475 487/527/487 488/528/488 +f 475/514/475 488/528/488 476/515/476 +f 476/515/476 488/528/488 489/529/489 +f 476/515/476 489/529/489 477/516/477 +f 477/516/477 489/529/489 490/530/490 +f 477/516/477 490/530/490 478/517/478 +f 478/517/478 490/530/490 491/531/491 +f 478/517/478 491/531/491 479/518/479 +f 479/518/479 491/531/491 492/532/492 +f 479/518/479 492/532/492 480/519/480 +f 480/519/480 492/532/492 481/533/481 +f 480/519/480 481/533/481 469/520/469 +f 481/521/481 493/534/493 494/535/494 +f 481/521/481 494/535/494 482/522/482 +f 482/522/482 494/535/494 495/536/495 +f 482/522/482 495/536/495 483/523/483 +f 483/523/483 495/536/495 496/537/496 +f 483/523/483 496/537/496 484/524/484 +f 484/524/484 496/537/496 497/538/497 +f 484/524/484 497/538/497 485/525/485 +f 485/525/485 497/538/497 498/539/498 +f 485/525/485 498/539/498 486/526/486 +f 486/526/486 498/539/498 499/540/499 +f 486/526/486 499/540/499 487/527/487 +f 487/527/487 499/540/499 500/541/500 +f 487/527/487 500/541/500 488/528/488 +f 488/528/488 500/541/500 501/542/501 +f 488/528/488 501/542/501 489/529/489 +f 489/529/489 501/542/501 502/543/502 +f 489/529/489 502/543/502 490/530/490 +f 490/530/490 502/543/502 503/544/503 +f 490/530/490 503/544/503 491/531/491 +f 491/531/491 503/544/503 504/545/504 +f 491/531/491 504/545/504 492/532/492 +f 492/532/492 504/545/504 493/546/493 +f 492/532/492 493/546/493 481/533/481 +f 493/534/493 505/547/505 506/548/506 +f 493/534/493 506/548/506 494/535/494 +f 494/535/494 506/548/506 507/549/507 +f 494/535/494 507/549/507 495/536/495 +f 495/536/495 507/549/507 508/550/508 +f 495/536/495 508/550/508 496/537/496 +f 496/537/496 508/550/508 509/551/509 +f 496/537/496 509/551/509 497/538/497 +f 497/538/497 509/551/509 510/552/510 +f 497/538/497 510/552/510 498/539/498 +f 498/539/498 510/552/510 511/553/511 +f 498/539/498 511/553/511 499/540/499 +f 499/540/499 511/553/511 512/554/512 +f 499/540/499 512/554/512 500/541/500 +f 500/541/500 512/554/512 513/555/513 +f 500/541/500 513/555/513 501/542/501 +f 501/542/501 513/555/513 514/556/514 +f 501/542/501 514/556/514 502/543/502 +f 502/543/502 514/556/514 515/557/515 +f 502/543/502 515/557/515 503/544/503 +f 503/544/503 515/557/515 516/558/516 +f 503/544/503 516/558/516 504/545/504 +f 504/545/504 516/558/516 505/559/505 +f 504/545/504 505/559/505 493/546/493 +f 505/547/505 517/560/517 518/561/518 +f 505/547/505 518/561/518 506/548/506 +f 506/548/506 518/561/518 519/562/519 +f 506/548/506 519/562/519 507/549/507 +f 507/549/507 519/562/519 520/563/520 +f 507/549/507 520/563/520 508/550/508 +f 508/550/508 520/563/520 521/564/521 +f 508/550/508 521/564/521 509/551/509 +f 509/551/509 521/564/521 522/565/522 +f 509/551/509 522/565/522 510/552/510 +f 510/552/510 522/565/522 523/566/523 +f 510/552/510 523/566/523 511/553/511 +f 511/553/511 523/566/523 524/567/524 +f 511/553/511 524/567/524 512/554/512 +f 512/554/512 524/567/524 525/568/525 +f 512/554/512 525/568/525 513/555/513 +f 513/555/513 525/568/525 526/569/526 +f 513/555/513 526/569/526 514/556/514 +f 514/556/514 526/569/526 527/570/527 +f 514/556/514 527/570/527 515/557/515 +f 515/557/515 527/570/527 528/571/528 +f 515/557/515 528/571/528 516/558/516 +f 516/558/516 528/571/528 517/572/517 +f 516/558/516 517/572/517 505/559/505 +f 517/560/517 529/573/529 530/574/530 +f 517/560/517 530/574/530 518/561/518 +f 518/561/518 530/574/530 531/575/531 +f 518/561/518 531/575/531 519/562/519 +f 519/562/519 531/575/531 532/576/532 +f 519/562/519 532/576/532 520/563/520 +f 520/563/520 532/576/532 533/577/533 +f 520/563/520 533/577/533 521/564/521 +f 521/564/521 533/577/533 534/578/534 +f 521/564/521 534/578/534 522/565/522 +f 522/565/522 534/578/534 535/579/535 +f 522/565/522 535/579/535 523/566/523 +f 523/566/523 535/579/535 536/580/536 +f 523/566/523 536/580/536 524/567/524 +f 524/567/524 536/580/536 537/581/537 +f 524/567/524 537/581/537 525/568/525 +f 525/568/525 537/581/537 538/582/538 +f 525/568/525 538/582/538 526/569/526 +f 526/569/526 538/582/538 539/583/539 +f 526/569/526 539/583/539 527/570/527 +f 527/570/527 539/583/539 540/584/540 +f 527/570/527 540/584/540 528/571/528 +f 528/571/528 540/584/540 529/585/529 +f 528/571/528 529/585/529 517/572/517 +f 529/573/529 541/586/541 542/587/542 +f 529/573/529 542/587/542 530/574/530 +f 530/574/530 542/587/542 543/588/543 +f 530/574/530 543/588/543 531/575/531 +f 531/575/531 543/588/543 544/589/544 +f 531/575/531 544/589/544 532/576/532 +f 532/576/532 544/589/544 545/590/545 +f 532/576/532 545/590/545 533/577/533 +f 533/577/533 545/590/545 546/591/546 +f 533/577/533 546/591/546 534/578/534 +f 534/578/534 546/591/546 547/592/547 +f 534/578/534 547/592/547 535/579/535 +f 535/579/535 547/592/547 548/593/548 +f 535/579/535 548/593/548 536/580/536 +f 536/580/536 548/593/548 549/594/549 +f 536/580/536 549/594/549 537/581/537 +f 537/581/537 549/594/549 550/595/550 +f 537/581/537 550/595/550 538/582/538 +f 538/582/538 550/595/550 551/596/551 +f 538/582/538 551/596/551 539/583/539 +f 539/583/539 551/596/551 552/597/552 +f 539/583/539 552/597/552 540/584/540 +f 540/584/540 552/597/552 541/598/541 +f 540/584/540 541/598/541 529/585/529 +f 541/586/541 553/599/553 554/600/554 +f 541/586/541 554/600/554 542/587/542 +f 542/587/542 554/600/554 555/601/555 +f 542/587/542 555/601/555 543/588/543 +f 543/588/543 555/601/555 556/602/556 +f 543/588/543 556/602/556 544/589/544 +f 544/589/544 556/602/556 557/603/557 +f 544/589/544 557/603/557 545/590/545 +f 545/590/545 557/603/557 558/604/558 +f 545/590/545 558/604/558 546/591/546 +f 546/591/546 558/604/558 559/605/559 +f 546/591/546 559/605/559 547/592/547 +f 547/592/547 559/605/559 560/606/560 +f 547/592/547 560/606/560 548/593/548 +f 548/593/548 560/606/560 561/607/561 +f 548/593/548 561/607/561 549/594/549 +f 549/594/549 561/607/561 562/608/562 +f 549/594/549 562/608/562 550/595/550 +f 550/595/550 562/608/562 563/609/563 +f 550/595/550 563/609/563 551/596/551 +f 551/596/551 563/609/563 564/610/564 +f 551/596/551 564/610/564 552/597/552 +f 552/597/552 564/610/564 553/611/553 +f 552/597/552 553/611/553 541/598/541 +f 553/599/553 565/612/565 566/613/566 +f 553/599/553 566/613/566 554/600/554 +f 554/600/554 566/613/566 567/614/567 +f 554/600/554 567/614/567 555/601/555 +f 555/601/555 567/614/567 568/615/568 +f 555/601/555 568/615/568 556/602/556 +f 556/602/556 568/615/568 569/616/569 +f 556/602/556 569/616/569 557/603/557 +f 557/603/557 569/616/569 570/617/570 +f 557/603/557 570/617/570 558/604/558 +f 558/604/558 570/617/570 571/618/571 +f 558/604/558 571/618/571 559/605/559 +f 559/605/559 571/618/571 572/619/572 +f 559/605/559 572/619/572 560/606/560 +f 560/606/560 572/619/572 573/620/573 +f 560/606/560 573/620/573 561/607/561 +f 561/607/561 573/620/573 574/621/574 +f 561/607/561 574/621/574 562/608/562 +f 562/608/562 574/621/574 575/622/575 +f 562/608/562 575/622/575 563/609/563 +f 563/609/563 575/622/575 576/623/576 +f 563/609/563 576/623/576 564/610/564 +f 564/610/564 576/623/576 565/624/565 +f 564/610/564 565/624/565 553/611/553 +f 565/612/565 577/625/577 578/626/578 +f 565/612/565 578/626/578 566/613/566 +f 566/613/566 578/626/578 579/627/579 +f 566/613/566 579/627/579 567/614/567 +f 567/614/567 579/627/579 580/628/580 +f 567/614/567 580/628/580 568/615/568 +f 568/615/568 580/628/580 581/629/581 +f 568/615/568 581/629/581 569/616/569 +f 569/616/569 581/629/581 582/630/582 +f 569/616/569 582/630/582 570/617/570 +f 570/617/570 582/630/582 583/631/583 +f 570/617/570 583/631/583 571/618/571 +f 571/618/571 583/631/583 584/632/584 +f 571/618/571 584/632/584 572/619/572 +f 572/619/572 584/632/584 585/633/585 +f 572/619/572 585/633/585 573/620/573 +f 573/620/573 585/633/585 586/634/586 +f 573/620/573 586/634/586 574/621/574 +f 574/621/574 586/634/586 587/635/587 +f 574/621/574 587/635/587 575/622/575 +f 575/622/575 587/635/587 588/636/588 +f 575/622/575 588/636/588 576/623/576 +f 576/623/576 588/636/588 577/637/577 +f 576/623/576 577/637/577 565/624/565 +f 577/625/577 589/638/589 590/639/590 +f 577/625/577 590/639/590 578/626/578 +f 578/626/578 590/639/590 591/640/591 +f 578/626/578 591/640/591 579/627/579 +f 579/627/579 591/640/591 592/641/592 +f 579/627/579 592/641/592 580/628/580 +f 580/628/580 592/641/592 593/642/593 +f 580/628/580 593/642/593 581/629/581 +f 581/629/581 593/642/593 594/643/594 +f 581/629/581 594/643/594 582/630/582 +f 582/630/582 594/643/594 595/644/595 +f 582/630/582 595/644/595 583/631/583 +f 583/631/583 595/644/595 596/645/596 +f 583/631/583 596/645/596 584/632/584 +f 584/632/584 596/645/596 597/646/597 +f 584/632/584 597/646/597 585/633/585 +f 585/633/585 597/646/597 598/647/598 +f 585/633/585 598/647/598 586/634/586 +f 586/634/586 598/647/598 599/648/599 +f 586/634/586 599/648/599 587/635/587 +f 587/635/587 599/648/599 600/649/600 +f 587/635/587 600/649/600 588/636/588 +f 588/636/588 600/649/600 589/650/589 +f 588/636/588 589/650/589 577/637/577 +f 589/638/589 601/651/601 602/652/602 +f 589/638/589 602/652/602 590/639/590 +f 590/639/590 602/652/602 603/653/603 +f 590/639/590 603/653/603 591/640/591 +f 591/640/591 603/653/603 604/654/604 +f 591/640/591 604/654/604 592/641/592 +f 592/641/592 604/654/604 605/655/605 +f 592/641/592 605/655/605 593/642/593 +f 593/642/593 605/655/605 606/656/606 +f 593/642/593 606/656/606 594/643/594 +f 594/643/594 606/656/606 607/657/607 +f 594/643/594 607/657/607 595/644/595 +f 595/644/595 607/657/607 608/658/608 +f 595/644/595 608/658/608 596/645/596 +f 596/645/596 608/658/608 609/659/609 +f 596/645/596 609/659/609 597/646/597 +f 597/646/597 609/659/609 610/660/610 +f 597/646/597 610/660/610 598/647/598 +f 598/647/598 610/660/610 611/661/611 +f 598/647/598 611/661/611 599/648/599 +f 599/648/599 611/661/611 612/662/612 +f 599/648/599 612/662/612 600/649/600 +f 600/649/600 612/662/612 601/663/601 +f 600/649/600 601/663/601 589/650/589 +f 601/651/601 613/664/613 614/665/614 +f 601/651/601 614/665/614 602/652/602 +f 602/652/602 614/665/614 615/666/615 +f 602/652/602 615/666/615 603/653/603 +f 603/653/603 615/666/615 616/667/616 +f 603/653/603 616/667/616 604/654/604 +f 604/654/604 616/667/616 617/668/617 +f 604/654/604 617/668/617 605/655/605 +f 605/655/605 617/668/617 618/669/618 +f 605/655/605 618/669/618 606/656/606 +f 606/656/606 618/669/618 619/670/619 +f 606/656/606 619/670/619 607/657/607 +f 607/657/607 619/670/619 620/671/620 +f 607/657/607 620/671/620 608/658/608 +f 608/658/608 620/671/620 621/672/621 +f 608/658/608 621/672/621 609/659/609 +f 609/659/609 621/672/621 622/673/622 +f 609/659/609 622/673/622 610/660/610 +f 610/660/610 622/673/622 623/674/623 +f 610/660/610 623/674/623 611/661/611 +f 611/661/611 623/674/623 624/675/624 +f 611/661/611 624/675/624 612/662/612 +f 612/662/612 624/675/624 613/676/613 +f 612/662/612 613/676/613 601/663/601 +f 613/664/613 625/677/625 626/678/626 +f 613/664/613 626/678/626 614/665/614 +f 614/665/614 626/678/626 627/679/627 +f 614/665/614 627/679/627 615/666/615 +f 615/666/615 627/679/627 628/680/628 +f 615/666/615 628/680/628 616/667/616 +f 616/667/616 628/680/628 629/681/629 +f 616/667/616 629/681/629 617/668/617 +f 617/668/617 629/681/629 630/682/630 +f 617/668/617 630/682/630 618/669/618 +f 618/669/618 630/682/630 631/683/631 +f 618/669/618 631/683/631 619/670/619 +f 619/670/619 631/683/631 632/684/632 +f 619/670/619 632/684/632 620/671/620 +f 620/671/620 632/684/632 633/685/633 +f 620/671/620 633/685/633 621/672/621 +f 621/672/621 633/685/633 634/686/634 +f 621/672/621 634/686/634 622/673/622 +f 622/673/622 634/686/634 635/687/635 +f 622/673/622 635/687/635 623/674/623 +f 623/674/623 635/687/635 636/688/636 +f 623/674/623 636/688/636 624/675/624 +f 624/675/624 636/688/636 625/689/625 +f 624/675/624 625/689/625 613/676/613 +f 625/677/625 637/690/637 638/691/638 +f 625/677/625 638/691/638 626/678/626 +f 626/678/626 638/691/638 639/692/639 +f 626/678/626 639/692/639 627/679/627 +f 627/679/627 639/692/639 640/693/640 +f 627/679/627 640/693/640 628/680/628 +f 628/680/628 640/693/640 641/694/641 +f 628/680/628 641/694/641 629/681/629 +f 629/681/629 641/694/641 642/695/642 +f 629/681/629 642/695/642 630/682/630 +f 630/682/630 642/695/642 643/696/643 +f 630/682/630 643/696/643 631/683/631 +f 631/683/631 643/696/643 644/697/644 +f 631/683/631 644/697/644 632/684/632 +f 632/684/632 644/697/644 645/698/645 +f 632/684/632 645/698/645 633/685/633 +f 633/685/633 645/698/645 646/699/646 +f 633/685/633 646/699/646 634/686/634 +f 634/686/634 646/699/646 647/700/647 +f 634/686/634 647/700/647 635/687/635 +f 635/687/635 647/700/647 648/701/648 +f 635/687/635 648/701/648 636/688/636 +f 636/688/636 648/701/648 637/702/637 +f 636/688/636 637/702/637 625/689/625 +f 637/690/637 649/703/649 650/704/650 +f 637/690/637 650/704/650 638/691/638 +f 638/691/638 650/704/650 651/705/651 +f 638/691/638 651/705/651 639/692/639 +f 639/692/639 651/705/651 652/706/652 +f 639/692/639 652/706/652 640/693/640 +f 640/693/640 652/706/652 653/707/653 +f 640/693/640 653/707/653 641/694/641 +f 641/694/641 653/707/653 654/708/654 +f 641/694/641 654/708/654 642/695/642 +f 642/695/642 654/708/654 655/709/655 +f 642/695/642 655/709/655 643/696/643 +f 643/696/643 655/709/655 656/710/656 +f 643/696/643 656/710/656 644/697/644 +f 644/697/644 656/710/656 657/711/657 +f 644/697/644 657/711/657 645/698/645 +f 645/698/645 657/711/657 658/712/658 +f 645/698/645 658/712/658 646/699/646 +f 646/699/646 658/712/658 659/713/659 +f 646/699/646 659/713/659 647/700/647 +f 647/700/647 659/713/659 660/714/660 +f 647/700/647 660/714/660 648/701/648 +f 648/701/648 660/714/660 649/715/649 +f 648/701/648 649/715/649 637/702/637 +f 649/703/649 661/716/661 662/717/662 +f 649/703/649 662/717/662 650/704/650 +f 650/704/650 662/717/662 663/718/663 +f 650/704/650 663/718/663 651/705/651 +f 651/705/651 663/718/663 664/719/664 +f 651/705/651 664/719/664 652/706/652 +f 652/706/652 664/719/664 665/720/665 +f 652/706/652 665/720/665 653/707/653 +f 653/707/653 665/720/665 666/721/666 +f 653/707/653 666/721/666 654/708/654 +f 654/708/654 666/721/666 667/722/667 +f 654/708/654 667/722/667 655/709/655 +f 655/709/655 667/722/667 668/723/668 +f 655/709/655 668/723/668 656/710/656 +f 656/710/656 668/723/668 669/724/669 +f 656/710/656 669/724/669 657/711/657 +f 657/711/657 669/724/669 670/725/670 +f 657/711/657 670/725/670 658/712/658 +f 658/712/658 670/725/670 671/726/671 +f 658/712/658 671/726/671 659/713/659 +f 659/713/659 671/726/671 672/727/672 +f 659/713/659 672/727/672 660/714/660 +f 660/714/660 672/727/672 661/728/661 +f 660/714/660 661/728/661 649/715/649 +f 661/716/661 673/729/673 674/730/674 +f 661/716/661 674/730/674 662/717/662 +f 662/717/662 674/730/674 675/731/675 +f 662/717/662 675/731/675 663/718/663 +f 663/718/663 675/731/675 676/732/676 +f 663/718/663 676/732/676 664/719/664 +f 664/719/664 676/732/676 677/733/677 +f 664/719/664 677/733/677 665/720/665 +f 665/720/665 677/733/677 678/734/678 +f 665/720/665 678/734/678 666/721/666 +f 666/721/666 678/734/678 679/735/679 +f 666/721/666 679/735/679 667/722/667 +f 667/722/667 679/735/679 680/736/680 +f 667/722/667 680/736/680 668/723/668 +f 668/723/668 680/736/680 681/737/681 +f 668/723/668 681/737/681 669/724/669 +f 669/724/669 681/737/681 682/738/682 +f 669/724/669 682/738/682 670/725/670 +f 670/725/670 682/738/682 683/739/683 +f 670/725/670 683/739/683 671/726/671 +f 671/726/671 683/739/683 684/740/684 +f 671/726/671 684/740/684 672/727/672 +f 672/727/672 684/740/684 673/741/673 +f 672/727/672 673/741/673 661/728/661 +f 673/729/673 685/742/685 686/743/686 +f 673/729/673 686/743/686 674/730/674 +f 674/730/674 686/743/686 687/744/687 +f 674/730/674 687/744/687 675/731/675 +f 675/731/675 687/744/687 688/745/688 +f 675/731/675 688/745/688 676/732/676 +f 676/732/676 688/745/688 689/746/689 +f 676/732/676 689/746/689 677/733/677 +f 677/733/677 689/746/689 690/747/690 +f 677/733/677 690/747/690 678/734/678 +f 678/734/678 690/747/690 691/748/691 +f 678/734/678 691/748/691 679/735/679 +f 679/735/679 691/748/691 692/749/692 +f 679/735/679 692/749/692 680/736/680 +f 680/736/680 692/749/692 693/750/693 +f 680/736/680 693/750/693 681/737/681 +f 681/737/681 693/750/693 694/751/694 +f 681/737/681 694/751/694 682/738/682 +f 682/738/682 694/751/694 695/752/695 +f 682/738/682 695/752/695 683/739/683 +f 683/739/683 695/752/695 696/753/696 +f 683/739/683 696/753/696 684/740/684 +f 684/740/684 696/753/696 685/754/685 +f 684/740/684 685/754/685 673/741/673 +f 685/742/685 697/755/697 698/756/698 +f 685/742/685 698/756/698 686/743/686 +f 686/743/686 698/756/698 699/757/699 +f 686/743/686 699/757/699 687/744/687 +f 687/744/687 699/757/699 700/758/700 +f 687/744/687 700/758/700 688/745/688 +f 688/745/688 700/758/700 701/759/701 +f 688/745/688 701/759/701 689/746/689 +f 689/746/689 701/759/701 702/760/702 +f 689/746/689 702/760/702 690/747/690 +f 690/747/690 702/760/702 703/761/703 +f 690/747/690 703/761/703 691/748/691 +f 691/748/691 703/761/703 704/762/704 +f 691/748/691 704/762/704 692/749/692 +f 692/749/692 704/762/704 705/763/705 +f 692/749/692 705/763/705 693/750/693 +f 693/750/693 705/763/705 706/764/706 +f 693/750/693 706/764/706 694/751/694 +f 694/751/694 706/764/706 707/765/707 +f 694/751/694 707/765/707 695/752/695 +f 695/752/695 707/765/707 708/766/708 +f 695/752/695 708/766/708 696/753/696 +f 696/753/696 708/766/708 697/767/697 +f 696/753/696 697/767/697 685/754/685 +f 697/755/697 709/768/709 710/769/710 +f 697/755/697 710/769/710 698/756/698 +f 698/756/698 710/769/710 711/770/711 +f 698/756/698 711/770/711 699/757/699 +f 699/757/699 711/770/711 712/771/712 +f 699/757/699 712/771/712 700/758/700 +f 700/758/700 712/771/712 713/772/713 +f 700/758/700 713/772/713 701/759/701 +f 701/759/701 713/772/713 714/773/714 +f 701/759/701 714/773/714 702/760/702 +f 702/760/702 714/773/714 715/774/715 +f 702/760/702 715/774/715 703/761/703 +f 703/761/703 715/774/715 716/775/716 +f 703/761/703 716/775/716 704/762/704 +f 704/762/704 716/775/716 717/776/717 +f 704/762/704 717/776/717 705/763/705 +f 705/763/705 717/776/717 718/777/718 +f 705/763/705 718/777/718 706/764/706 +f 706/764/706 718/777/718 719/778/719 +f 706/764/706 719/778/719 707/765/707 +f 707/765/707 719/778/719 720/779/720 +f 707/765/707 720/779/720 708/766/708 +f 708/766/708 720/779/720 709/780/709 +f 708/766/708 709/780/709 697/767/697 +f 709/768/709 721/781/721 722/782/722 +f 709/768/709 722/782/722 710/769/710 +f 710/769/710 722/782/722 723/783/723 +f 710/769/710 723/783/723 711/770/711 +f 711/770/711 723/783/723 724/784/724 +f 711/770/711 724/784/724 712/771/712 +f 712/771/712 724/784/724 725/785/725 +f 712/771/712 725/785/725 713/772/713 +f 713/772/713 725/785/725 726/786/726 +f 713/772/713 726/786/726 714/773/714 +f 714/773/714 726/786/726 727/787/727 +f 714/773/714 727/787/727 715/774/715 +f 715/774/715 727/787/727 728/788/728 +f 715/774/715 728/788/728 716/775/716 +f 716/775/716 728/788/728 729/789/729 +f 716/775/716 729/789/729 717/776/717 +f 717/776/717 729/789/729 730/790/730 +f 717/776/717 730/790/730 718/777/718 +f 718/777/718 730/790/730 731/791/731 +f 718/777/718 731/791/731 719/778/719 +f 719/778/719 731/791/731 732/792/732 +f 719/778/719 732/792/732 720/779/720 +f 720/779/720 732/792/732 721/793/721 +f 720/779/720 721/793/721 709/780/709 +f 721/781/721 733/794/733 734/795/734 +f 721/781/721 734/795/734 722/782/722 +f 722/782/722 734/795/734 735/796/735 +f 722/782/722 735/796/735 723/783/723 +f 723/783/723 735/796/735 736/797/736 +f 723/783/723 736/797/736 724/784/724 +f 724/784/724 736/797/736 737/798/737 +f 724/784/724 737/798/737 725/785/725 +f 725/785/725 737/798/737 738/799/738 +f 725/785/725 738/799/738 726/786/726 +f 726/786/726 738/799/738 739/800/739 +f 726/786/726 739/800/739 727/787/727 +f 727/787/727 739/800/739 740/801/740 +f 727/787/727 740/801/740 728/788/728 +f 728/788/728 740/801/740 741/802/741 +f 728/788/728 741/802/741 729/789/729 +f 729/789/729 741/802/741 742/803/742 +f 729/789/729 742/803/742 730/790/730 +f 730/790/730 742/803/742 743/804/743 +f 730/790/730 743/804/743 731/791/731 +f 731/791/731 743/804/743 744/805/744 +f 731/791/731 744/805/744 732/792/732 +f 732/792/732 744/805/744 733/806/733 +f 732/792/732 733/806/733 721/793/721 +f 733/794/733 745/807/745 746/808/746 +f 733/794/733 746/808/746 734/795/734 +f 734/795/734 746/808/746 747/809/747 +f 734/795/734 747/809/747 735/796/735 +f 735/796/735 747/809/747 748/810/748 +f 735/796/735 748/810/748 736/797/736 +f 736/797/736 748/810/748 749/811/749 +f 736/797/736 749/811/749 737/798/737 +f 737/798/737 749/811/749 750/812/750 +f 737/798/737 750/812/750 738/799/738 +f 738/799/738 750/812/750 751/813/751 +f 738/799/738 751/813/751 739/800/739 +f 739/800/739 751/813/751 752/814/752 +f 739/800/739 752/814/752 740/801/740 +f 740/801/740 752/814/752 753/815/753 +f 740/801/740 753/815/753 741/802/741 +f 741/802/741 753/815/753 754/816/754 +f 741/802/741 754/816/754 742/803/742 +f 742/803/742 754/816/754 755/817/755 +f 742/803/742 755/817/755 743/804/743 +f 743/804/743 755/817/755 756/818/756 +f 743/804/743 756/818/756 744/805/744 +f 744/805/744 756/818/756 745/819/745 +f 744/805/744 745/819/745 733/806/733 +f 745/807/745 757/820/757 758/821/758 +f 745/807/745 758/821/758 746/808/746 +f 746/808/746 758/821/758 759/822/759 +f 746/808/746 759/822/759 747/809/747 +f 747/809/747 759/822/759 760/823/760 +f 747/809/747 760/823/760 748/810/748 +f 748/810/748 760/823/760 761/824/761 +f 748/810/748 761/824/761 749/811/749 +f 749/811/749 761/824/761 762/825/762 +f 749/811/749 762/825/762 750/812/750 +f 750/812/750 762/825/762 763/826/763 +f 750/812/750 763/826/763 751/813/751 +f 751/813/751 763/826/763 764/827/764 +f 751/813/751 764/827/764 752/814/752 +f 752/814/752 764/827/764 765/828/765 +f 752/814/752 765/828/765 753/815/753 +f 753/815/753 765/828/765 766/829/766 +f 753/815/753 766/829/766 754/816/754 +f 754/816/754 766/829/766 767/830/767 +f 754/816/754 767/830/767 755/817/755 +f 755/817/755 767/830/767 768/831/768 +f 755/817/755 768/831/768 756/818/756 +f 756/818/756 768/831/768 757/832/757 +f 756/818/756 757/832/757 745/819/745 +f 757/820/757 769/833/769 770/834/770 +f 757/820/757 770/834/770 758/821/758 +f 758/821/758 770/834/770 771/835/771 +f 758/821/758 771/835/771 759/822/759 +f 759/822/759 771/835/771 772/836/772 +f 759/822/759 772/836/772 760/823/760 +f 760/823/760 772/836/772 773/837/773 +f 760/823/760 773/837/773 761/824/761 +f 761/824/761 773/837/773 774/838/774 +f 761/824/761 774/838/774 762/825/762 +f 762/825/762 774/838/774 775/839/775 +f 762/825/762 775/839/775 763/826/763 +f 763/826/763 775/839/775 776/840/776 +f 763/826/763 776/840/776 764/827/764 +f 764/827/764 776/840/776 777/841/777 +f 764/827/764 777/841/777 765/828/765 +f 765/828/765 777/841/777 778/842/778 +f 765/828/765 778/842/778 766/829/766 +f 766/829/766 778/842/778 779/843/779 +f 766/829/766 779/843/779 767/830/767 +f 767/830/767 779/843/779 780/844/780 +f 767/830/767 780/844/780 768/831/768 +f 768/831/768 780/844/780 769/845/769 +f 768/831/768 769/845/769 757/832/757 +f 769/833/769 781/846/781 782/847/782 +f 769/833/769 782/847/782 770/834/770 +f 770/834/770 782/847/782 783/848/783 +f 770/834/770 783/848/783 771/835/771 +f 771/835/771 783/848/783 784/849/784 +f 771/835/771 784/849/784 772/836/772 +f 772/836/772 784/849/784 785/850/785 +f 772/836/772 785/850/785 773/837/773 +f 773/837/773 785/850/785 786/851/786 +f 773/837/773 786/851/786 774/838/774 +f 774/838/774 786/851/786 787/852/787 +f 774/838/774 787/852/787 775/839/775 +f 775/839/775 787/852/787 788/853/788 +f 775/839/775 788/853/788 776/840/776 +f 776/840/776 788/853/788 789/854/789 +f 776/840/776 789/854/789 777/841/777 +f 777/841/777 789/854/789 790/855/790 +f 777/841/777 790/855/790 778/842/778 +f 778/842/778 790/855/790 791/856/791 +f 778/842/778 791/856/791 779/843/779 +f 779/843/779 791/856/791 792/857/792 +f 779/843/779 792/857/792 780/844/780 +f 780/844/780 792/857/792 781/858/781 +f 780/844/780 781/858/781 769/845/769 +f 781/846/781 793/859/793 794/860/794 +f 781/846/781 794/860/794 782/847/782 +f 782/847/782 794/860/794 795/861/795 +f 782/847/782 795/861/795 783/848/783 +f 783/848/783 795/861/795 796/862/796 +f 783/848/783 796/862/796 784/849/784 +f 784/849/784 796/862/796 797/863/797 +f 784/849/784 797/863/797 785/850/785 +f 785/850/785 797/863/797 798/864/798 +f 785/850/785 798/864/798 786/851/786 +f 786/851/786 798/864/798 799/865/799 +f 786/851/786 799/865/799 787/852/787 +f 787/852/787 799/865/799 800/866/800 +f 787/852/787 800/866/800 788/853/788 +f 788/853/788 800/866/800 801/867/801 +f 788/853/788 801/867/801 789/854/789 +f 789/854/789 801/867/801 802/868/802 +f 789/854/789 802/868/802 790/855/790 +f 790/855/790 802/868/802 803/869/803 +f 790/855/790 803/869/803 791/856/791 +f 791/856/791 803/869/803 804/870/804 +f 791/856/791 804/870/804 792/857/792 +f 792/857/792 804/870/804 793/871/793 +f 792/857/792 793/871/793 781/858/781 +f 793/859/793 805/872/805 806/873/806 +f 793/859/793 806/873/806 794/860/794 +f 794/860/794 806/873/806 807/874/807 +f 794/860/794 807/874/807 795/861/795 +f 795/861/795 807/874/807 808/875/808 +f 795/861/795 808/875/808 796/862/796 +f 796/862/796 808/875/808 809/876/809 +f 796/862/796 809/876/809 797/863/797 +f 797/863/797 809/876/809 810/877/810 +f 797/863/797 810/877/810 798/864/798 +f 798/864/798 810/877/810 811/878/811 +f 798/864/798 811/878/811 799/865/799 +f 799/865/799 811/878/811 812/879/812 +f 799/865/799 812/879/812 800/866/800 +f 800/866/800 812/879/812 813/880/813 +f 800/866/800 813/880/813 801/867/801 +f 801/867/801 813/880/813 814/881/814 +f 801/867/801 814/881/814 802/868/802 +f 802/868/802 814/881/814 815/882/815 +f 802/868/802 815/882/815 803/869/803 +f 803/869/803 815/882/815 816/883/816 +f 803/869/803 816/883/816 804/870/804 +f 804/870/804 816/883/816 805/884/805 +f 804/870/804 805/884/805 793/871/793 +f 805/872/805 817/885/817 818/886/818 +f 805/872/805 818/886/818 806/873/806 +f 806/873/806 818/886/818 819/887/819 +f 806/873/806 819/887/819 807/874/807 +f 807/874/807 819/887/819 820/888/820 +f 807/874/807 820/888/820 808/875/808 +f 808/875/808 820/888/820 821/889/821 +f 808/875/808 821/889/821 809/876/809 +f 809/876/809 821/889/821 822/890/822 +f 809/876/809 822/890/822 810/877/810 +f 810/877/810 822/890/822 823/891/823 +f 810/877/810 823/891/823 811/878/811 +f 811/878/811 823/891/823 824/892/824 +f 811/878/811 824/892/824 812/879/812 +f 812/879/812 824/892/824 825/893/825 +f 812/879/812 825/893/825 813/880/813 +f 813/880/813 825/893/825 826/894/826 +f 813/880/813 826/894/826 814/881/814 +f 814/881/814 826/894/826 827/895/827 +f 814/881/814 827/895/827 815/882/815 +f 815/882/815 827/895/827 828/896/828 +f 815/882/815 828/896/828 816/883/816 +f 816/883/816 828/896/828 817/897/817 +f 816/883/816 817/897/817 805/884/805 +f 817/885/817 829/898/829 830/899/830 +f 817/885/817 830/899/830 818/886/818 +f 818/886/818 830/899/830 831/900/831 +f 818/886/818 831/900/831 819/887/819 +f 819/887/819 831/900/831 832/901/832 +f 819/887/819 832/901/832 820/888/820 +f 820/888/820 832/901/832 833/902/833 +f 820/888/820 833/902/833 821/889/821 +f 821/889/821 833/902/833 834/903/834 +f 821/889/821 834/903/834 822/890/822 +f 822/890/822 834/903/834 835/904/835 +f 822/890/822 835/904/835 823/891/823 +f 823/891/823 835/904/835 836/905/836 +f 823/891/823 836/905/836 824/892/824 +f 824/892/824 836/905/836 837/906/837 +f 824/892/824 837/906/837 825/893/825 +f 825/893/825 837/906/837 838/907/838 +f 825/893/825 838/907/838 826/894/826 +f 826/894/826 838/907/838 839/908/839 +f 826/894/826 839/908/839 827/895/827 +f 827/895/827 839/908/839 840/909/840 +f 827/895/827 840/909/840 828/896/828 +f 828/896/828 840/909/840 829/910/829 +f 828/896/828 829/910/829 817/897/817 +f 829/898/829 841/911/841 842/912/842 +f 829/898/829 842/912/842 830/899/830 +f 830/899/830 842/912/842 843/913/843 +f 830/899/830 843/913/843 831/900/831 +f 831/900/831 843/913/843 844/914/844 +f 831/900/831 844/914/844 832/901/832 +f 832/901/832 844/914/844 845/915/845 +f 832/901/832 845/915/845 833/902/833 +f 833/902/833 845/915/845 846/916/846 +f 833/902/833 846/916/846 834/903/834 +f 834/903/834 846/916/846 847/917/847 +f 834/903/834 847/917/847 835/904/835 +f 835/904/835 847/917/847 848/918/848 +f 835/904/835 848/918/848 836/905/836 +f 836/905/836 848/918/848 849/919/849 +f 836/905/836 849/919/849 837/906/837 +f 837/906/837 849/919/849 850/920/850 +f 837/906/837 850/920/850 838/907/838 +f 838/907/838 850/920/850 851/921/851 +f 838/907/838 851/921/851 839/908/839 +f 839/908/839 851/921/851 852/922/852 +f 839/908/839 852/922/852 840/909/840 +f 840/909/840 852/922/852 841/923/841 +f 840/909/840 841/923/841 829/910/829 +f 841/911/841 853/924/853 854/925/854 +f 841/911/841 854/925/854 842/912/842 +f 842/912/842 854/925/854 855/926/855 +f 842/912/842 855/926/855 843/913/843 +f 843/913/843 855/926/855 856/927/856 +f 843/913/843 856/927/856 844/914/844 +f 844/914/844 856/927/856 857/928/857 +f 844/914/844 857/928/857 845/915/845 +f 845/915/845 857/928/857 858/929/858 +f 845/915/845 858/929/858 846/916/846 +f 846/916/846 858/929/858 859/930/859 +f 846/916/846 859/930/859 847/917/847 +f 847/917/847 859/930/859 860/931/860 +f 847/917/847 860/931/860 848/918/848 +f 848/918/848 860/931/860 861/932/861 +f 848/918/848 861/932/861 849/919/849 +f 849/919/849 861/932/861 862/933/862 +f 849/919/849 862/933/862 850/920/850 +f 850/920/850 862/933/862 863/934/863 +f 850/920/850 863/934/863 851/921/851 +f 851/921/851 863/934/863 864/935/864 +f 851/921/851 864/935/864 852/922/852 +f 852/922/852 864/935/864 853/936/853 +f 852/922/852 853/936/853 841/923/841 +f 853/924/853 865/937/865 866/938/866 +f 853/924/853 866/938/866 854/925/854 +f 854/925/854 866/938/866 867/939/867 +f 854/925/854 867/939/867 855/926/855 +f 855/926/855 867/939/867 868/940/868 +f 855/926/855 868/940/868 856/927/856 +f 856/927/856 868/940/868 869/941/869 +f 856/927/856 869/941/869 857/928/857 +f 857/928/857 869/941/869 870/942/870 +f 857/928/857 870/942/870 858/929/858 +f 858/929/858 870/942/870 871/943/871 +f 858/929/858 871/943/871 859/930/859 +f 859/930/859 871/943/871 872/944/872 +f 859/930/859 872/944/872 860/931/860 +f 860/931/860 872/944/872 873/945/873 +f 860/931/860 873/945/873 861/932/861 +f 861/932/861 873/945/873 874/946/874 +f 861/932/861 874/946/874 862/933/862 +f 862/933/862 874/946/874 875/947/875 +f 862/933/862 875/947/875 863/934/863 +f 863/934/863 875/947/875 876/948/876 +f 863/934/863 876/948/876 864/935/864 +f 864/935/864 876/948/876 865/949/865 +f 864/935/864 865/949/865 853/936/853 +f 865/937/865 877/950/877 878/951/878 +f 865/937/865 878/951/878 866/938/866 +f 866/938/866 878/951/878 879/952/879 +f 866/938/866 879/952/879 867/939/867 +f 867/939/867 879/952/879 880/953/880 +f 867/939/867 880/953/880 868/940/868 +f 868/940/868 880/953/880 881/954/881 +f 868/940/868 881/954/881 869/941/869 +f 869/941/869 881/954/881 882/955/882 +f 869/941/869 882/955/882 870/942/870 +f 870/942/870 882/955/882 883/956/883 +f 870/942/870 883/956/883 871/943/871 +f 871/943/871 883/956/883 884/957/884 +f 871/943/871 884/957/884 872/944/872 +f 872/944/872 884/957/884 885/958/885 +f 872/944/872 885/958/885 873/945/873 +f 873/945/873 885/958/885 886/959/886 +f 873/945/873 886/959/886 874/946/874 +f 874/946/874 886/959/886 887/960/887 +f 874/946/874 887/960/887 875/947/875 +f 875/947/875 887/960/887 888/961/888 +f 875/947/875 888/961/888 876/948/876 +f 876/948/876 888/961/888 877/962/877 +f 876/948/876 877/962/877 865/949/865 +f 877/950/877 889/963/889 890/964/890 +f 877/950/877 890/964/890 878/951/878 +f 878/951/878 890/964/890 891/965/891 +f 878/951/878 891/965/891 879/952/879 +f 879/952/879 891/965/891 892/966/892 +f 879/952/879 892/966/892 880/953/880 +f 880/953/880 892/966/892 893/967/893 +f 880/953/880 893/967/893 881/954/881 +f 881/954/881 893/967/893 894/968/894 +f 881/954/881 894/968/894 882/955/882 +f 882/955/882 894/968/894 895/969/895 +f 882/955/882 895/969/895 883/956/883 +f 883/956/883 895/969/895 896/970/896 +f 883/956/883 896/970/896 884/957/884 +f 884/957/884 896/970/896 897/971/897 +f 884/957/884 897/971/897 885/958/885 +f 885/958/885 897/971/897 898/972/898 +f 885/958/885 898/972/898 886/959/886 +f 886/959/886 898/972/898 899/973/899 +f 886/959/886 899/973/899 887/960/887 +f 887/960/887 899/973/899 900/974/900 +f 887/960/887 900/974/900 888/961/888 +f 888/961/888 900/974/900 889/975/889 +f 888/961/888 889/975/889 877/962/877 +f 889/963/889 901/976/901 902/977/902 +f 889/963/889 902/977/902 890/964/890 +f 890/964/890 902/977/902 903/978/903 +f 890/964/890 903/978/903 891/965/891 +f 891/965/891 903/978/903 904/979/904 +f 891/965/891 904/979/904 892/966/892 +f 892/966/892 904/979/904 905/980/905 +f 892/966/892 905/980/905 893/967/893 +f 893/967/893 905/980/905 906/981/906 +f 893/967/893 906/981/906 894/968/894 +f 894/968/894 906/981/906 907/982/907 +f 894/968/894 907/982/907 895/969/895 +f 895/969/895 907/982/907 908/983/908 +f 895/969/895 908/983/908 896/970/896 +f 896/970/896 908/983/908 909/984/909 +f 896/970/896 909/984/909 897/971/897 +f 897/971/897 909/984/909 910/985/910 +f 897/971/897 910/985/910 898/972/898 +f 898/972/898 910/985/910 911/986/911 +f 898/972/898 911/986/911 899/973/899 +f 899/973/899 911/986/911 912/987/912 +f 899/973/899 912/987/912 900/974/900 +f 900/974/900 912/987/912 901/988/901 +f 900/974/900 901/988/901 889/975/889 +f 901/976/901 913/989/913 914/990/914 +f 901/976/901 914/990/914 902/977/902 +f 902/977/902 914/990/914 915/991/915 +f 902/977/902 915/991/915 903/978/903 +f 903/978/903 915/991/915 916/992/916 +f 903/978/903 916/992/916 904/979/904 +f 904/979/904 916/992/916 917/993/917 +f 904/979/904 917/993/917 905/980/905 +f 905/980/905 917/993/917 918/994/918 +f 905/980/905 918/994/918 906/981/906 +f 906/981/906 918/994/918 919/995/919 +f 906/981/906 919/995/919 907/982/907 +f 907/982/907 919/995/919 920/996/920 +f 907/982/907 920/996/920 908/983/908 +f 908/983/908 920/996/920 921/997/921 +f 908/983/908 921/997/921 909/984/909 +f 909/984/909 921/997/921 922/998/922 +f 909/984/909 922/998/922 910/985/910 +f 910/985/910 922/998/922 923/999/923 +f 910/985/910 923/999/923 911/986/911 +f 911/986/911 923/999/923 924/1000/924 +f 911/986/911 924/1000/924 912/987/912 +f 912/987/912 924/1000/924 913/1001/913 +f 912/987/912 913/1001/913 901/988/901 +f 913/989/913 925/1002/925 926/1003/926 +f 913/989/913 926/1003/926 914/990/914 +f 914/990/914 926/1003/926 927/1004/927 +f 914/990/914 927/1004/927 915/991/915 +f 915/991/915 927/1004/927 928/1005/928 +f 915/991/915 928/1005/928 916/992/916 +f 916/992/916 928/1005/928 929/1006/929 +f 916/992/916 929/1006/929 917/993/917 +f 917/993/917 929/1006/929 930/1007/930 +f 917/993/917 930/1007/930 918/994/918 +f 918/994/918 930/1007/930 931/1008/931 +f 918/994/918 931/1008/931 919/995/919 +f 919/995/919 931/1008/931 932/1009/932 +f 919/995/919 932/1009/932 920/996/920 +f 920/996/920 932/1009/932 933/1010/933 +f 920/996/920 933/1010/933 921/997/921 +f 921/997/921 933/1010/933 934/1011/934 +f 921/997/921 934/1011/934 922/998/922 +f 922/998/922 934/1011/934 935/1012/935 +f 922/998/922 935/1012/935 923/999/923 +f 923/999/923 935/1012/935 936/1013/936 +f 923/999/923 936/1013/936 924/1000/924 +f 924/1000/924 936/1013/936 925/1014/925 +f 924/1000/924 925/1014/925 913/1001/913 +f 925/1002/925 937/1015/937 938/1016/938 +f 925/1002/925 938/1016/938 926/1003/926 +f 926/1003/926 938/1016/938 939/1017/939 +f 926/1003/926 939/1017/939 927/1004/927 +f 927/1004/927 939/1017/939 940/1018/940 +f 927/1004/927 940/1018/940 928/1005/928 +f 928/1005/928 940/1018/940 941/1019/941 +f 928/1005/928 941/1019/941 929/1006/929 +f 929/1006/929 941/1019/941 942/1020/942 +f 929/1006/929 942/1020/942 930/1007/930 +f 930/1007/930 942/1020/942 943/1021/943 +f 930/1007/930 943/1021/943 931/1008/931 +f 931/1008/931 943/1021/943 944/1022/944 +f 931/1008/931 944/1022/944 932/1009/932 +f 932/1009/932 944/1022/944 945/1023/945 +f 932/1009/932 945/1023/945 933/1010/933 +f 933/1010/933 945/1023/945 946/1024/946 +f 933/1010/933 946/1024/946 934/1011/934 +f 934/1011/934 946/1024/946 947/1025/947 +f 934/1011/934 947/1025/947 935/1012/935 +f 935/1012/935 947/1025/947 948/1026/948 +f 935/1012/935 948/1026/948 936/1013/936 +f 936/1013/936 948/1026/948 937/1027/937 +f 936/1013/936 937/1027/937 925/1014/925 +f 937/1015/937 949/1028/949 950/1029/950 +f 937/1015/937 950/1029/950 938/1016/938 +f 938/1016/938 950/1029/950 951/1030/951 +f 938/1016/938 951/1030/951 939/1017/939 +f 939/1017/939 951/1030/951 952/1031/952 +f 939/1017/939 952/1031/952 940/1018/940 +f 940/1018/940 952/1031/952 953/1032/953 +f 940/1018/940 953/1032/953 941/1019/941 +f 941/1019/941 953/1032/953 954/1033/954 +f 941/1019/941 954/1033/954 942/1020/942 +f 942/1020/942 954/1033/954 955/1034/955 +f 942/1020/942 955/1034/955 943/1021/943 +f 943/1021/943 955/1034/955 956/1035/956 +f 943/1021/943 956/1035/956 944/1022/944 +f 944/1022/944 956/1035/956 957/1036/957 +f 944/1022/944 957/1036/957 945/1023/945 +f 945/1023/945 957/1036/957 958/1037/958 +f 945/1023/945 958/1037/958 946/1024/946 +f 946/1024/946 958/1037/958 959/1038/959 +f 946/1024/946 959/1038/959 947/1025/947 +f 947/1025/947 959/1038/959 960/1039/960 +f 947/1025/947 960/1039/960 948/1026/948 +f 948/1026/948 960/1039/960 949/1040/949 +f 948/1026/948 949/1040/949 937/1027/937 +f 949/1028/949 961/1041/961 962/1042/962 +f 949/1028/949 962/1042/962 950/1029/950 +f 950/1029/950 962/1042/962 963/1043/963 +f 950/1029/950 963/1043/963 951/1030/951 +f 951/1030/951 963/1043/963 964/1044/964 +f 951/1030/951 964/1044/964 952/1031/952 +f 952/1031/952 964/1044/964 965/1045/965 +f 952/1031/952 965/1045/965 953/1032/953 +f 953/1032/953 965/1045/965 966/1046/966 +f 953/1032/953 966/1046/966 954/1033/954 +f 954/1033/954 966/1046/966 967/1047/967 +f 954/1033/954 967/1047/967 955/1034/955 +f 955/1034/955 967/1047/967 968/1048/968 +f 955/1034/955 968/1048/968 956/1035/956 +f 956/1035/956 968/1048/968 969/1049/969 +f 956/1035/956 969/1049/969 957/1036/957 +f 957/1036/957 969/1049/969 970/1050/970 +f 957/1036/957 970/1050/970 958/1037/958 +f 958/1037/958 970/1050/970 971/1051/971 +f 958/1037/958 971/1051/971 959/1038/959 +f 959/1038/959 971/1051/971 972/1052/972 +f 959/1038/959 972/1052/972 960/1039/960 +f 960/1039/960 972/1052/972 961/1053/961 +f 960/1039/960 961/1053/961 949/1040/949 +f 961/1041/961 973/1054/973 974/1055/974 +f 961/1041/961 974/1055/974 962/1042/962 +f 962/1042/962 974/1055/974 975/1056/975 +f 962/1042/962 975/1056/975 963/1043/963 +f 963/1043/963 975/1056/975 976/1057/976 +f 963/1043/963 976/1057/976 964/1044/964 +f 964/1044/964 976/1057/976 977/1058/977 +f 964/1044/964 977/1058/977 965/1045/965 +f 965/1045/965 977/1058/977 978/1059/978 +f 965/1045/965 978/1059/978 966/1046/966 +f 966/1046/966 978/1059/978 979/1060/979 +f 966/1046/966 979/1060/979 967/1047/967 +f 967/1047/967 979/1060/979 980/1061/980 +f 967/1047/967 980/1061/980 968/1048/968 +f 968/1048/968 980/1061/980 981/1062/981 +f 968/1048/968 981/1062/981 969/1049/969 +f 969/1049/969 981/1062/981 982/1063/982 +f 969/1049/969 982/1063/982 970/1050/970 +f 970/1050/970 982/1063/982 983/1064/983 +f 970/1050/970 983/1064/983 971/1051/971 +f 971/1051/971 983/1064/983 984/1065/984 +f 971/1051/971 984/1065/984 972/1052/972 +f 972/1052/972 984/1065/984 973/1066/973 +f 972/1052/972 973/1066/973 961/1053/961 +f 973/1054/973 985/1067/985 986/1068/986 +f 973/1054/973 986/1068/986 974/1055/974 +f 974/1055/974 986/1068/986 987/1069/987 +f 974/1055/974 987/1069/987 975/1056/975 +f 975/1056/975 987/1069/987 988/1070/988 +f 975/1056/975 988/1070/988 976/1057/976 +f 976/1057/976 988/1070/988 989/1071/989 +f 976/1057/976 989/1071/989 977/1058/977 +f 977/1058/977 989/1071/989 990/1072/990 +f 977/1058/977 990/1072/990 978/1059/978 +f 978/1059/978 990/1072/990 991/1073/991 +f 978/1059/978 991/1073/991 979/1060/979 +f 979/1060/979 991/1073/991 992/1074/992 +f 979/1060/979 992/1074/992 980/1061/980 +f 980/1061/980 992/1074/992 993/1075/993 +f 980/1061/980 993/1075/993 981/1062/981 +f 981/1062/981 993/1075/993 994/1076/994 +f 981/1062/981 994/1076/994 982/1063/982 +f 982/1063/982 994/1076/994 995/1077/995 +f 982/1063/982 995/1077/995 983/1064/983 +f 983/1064/983 995/1077/995 996/1078/996 +f 983/1064/983 996/1078/996 984/1065/984 +f 984/1065/984 996/1078/996 985/1079/985 +f 984/1065/984 985/1079/985 973/1066/973 +f 985/1067/985 997/1080/997 998/1081/998 +f 985/1067/985 998/1081/998 986/1068/986 +f 986/1068/986 998/1081/998 999/1082/999 +f 986/1068/986 999/1082/999 987/1069/987 +f 987/1069/987 999/1082/999 1000/1083/1000 +f 987/1069/987 1000/1083/1000 988/1070/988 +f 988/1070/988 1000/1083/1000 1001/1084/1001 +f 988/1070/988 1001/1084/1001 989/1071/989 +f 989/1071/989 1001/1084/1001 1002/1085/1002 +f 989/1071/989 1002/1085/1002 990/1072/990 +f 990/1072/990 1002/1085/1002 1003/1086/1003 +f 990/1072/990 1003/1086/1003 991/1073/991 +f 991/1073/991 1003/1086/1003 1004/1087/1004 +f 991/1073/991 1004/1087/1004 992/1074/992 +f 992/1074/992 1004/1087/1004 1005/1088/1005 +f 992/1074/992 1005/1088/1005 993/1075/993 +f 993/1075/993 1005/1088/1005 1006/1089/1006 +f 993/1075/993 1006/1089/1006 994/1076/994 +f 994/1076/994 1006/1089/1006 1007/1090/1007 +f 994/1076/994 1007/1090/1007 995/1077/995 +f 995/1077/995 1007/1090/1007 1008/1091/1008 +f 995/1077/995 1008/1091/1008 996/1078/996 +f 996/1078/996 1008/1091/1008 997/1092/997 +f 996/1078/996 997/1092/997 985/1079/985 +f 997/1080/997 1009/1093/1009 1010/1094/1010 +f 997/1080/997 1010/1094/1010 998/1081/998 +f 998/1081/998 1010/1094/1010 1011/1095/1011 +f 998/1081/998 1011/1095/1011 999/1082/999 +f 999/1082/999 1011/1095/1011 1012/1096/1012 +f 999/1082/999 1012/1096/1012 1000/1083/1000 +f 1000/1083/1000 1012/1096/1012 1013/1097/1013 +f 1000/1083/1000 1013/1097/1013 1001/1084/1001 +f 1001/1084/1001 1013/1097/1013 1014/1098/1014 +f 1001/1084/1001 1014/1098/1014 1002/1085/1002 +f 1002/1085/1002 1014/1098/1014 1015/1099/1015 +f 1002/1085/1002 1015/1099/1015 1003/1086/1003 +f 1003/1086/1003 1015/1099/1015 1016/1100/1016 +f 1003/1086/1003 1016/1100/1016 1004/1087/1004 +f 1004/1087/1004 1016/1100/1016 1017/1101/1017 +f 1004/1087/1004 1017/1101/1017 1005/1088/1005 +f 1005/1088/1005 1017/1101/1017 1018/1102/1018 +f 1005/1088/1005 1018/1102/1018 1006/1089/1006 +f 1006/1089/1006 1018/1102/1018 1019/1103/1019 +f 1006/1089/1006 1019/1103/1019 1007/1090/1007 +f 1007/1090/1007 1019/1103/1019 1020/1104/1020 +f 1007/1090/1007 1020/1104/1020 1008/1091/1008 +f 1008/1091/1008 1020/1104/1020 1009/1105/1009 +f 1008/1091/1008 1009/1105/1009 997/1092/997 +f 1009/1093/1009 1021/1106/1021 1022/1107/1022 +f 1009/1093/1009 1022/1107/1022 1010/1094/1010 +f 1010/1094/1010 1022/1107/1022 1023/1108/1023 +f 1010/1094/1010 1023/1108/1023 1011/1095/1011 +f 1011/1095/1011 1023/1108/1023 1024/1109/1024 +f 1011/1095/1011 1024/1109/1024 1012/1096/1012 +f 1012/1096/1012 1024/1109/1024 1025/1110/1025 +f 1012/1096/1012 1025/1110/1025 1013/1097/1013 +f 1013/1097/1013 1025/1110/1025 1026/1111/1026 +f 1013/1097/1013 1026/1111/1026 1014/1098/1014 +f 1014/1098/1014 1026/1111/1026 1027/1112/1027 +f 1014/1098/1014 1027/1112/1027 1015/1099/1015 +f 1015/1099/1015 1027/1112/1027 1028/1113/1028 +f 1015/1099/1015 1028/1113/1028 1016/1100/1016 +f 1016/1100/1016 1028/1113/1028 1029/1114/1029 +f 1016/1100/1016 1029/1114/1029 1017/1101/1017 +f 1017/1101/1017 1029/1114/1029 1030/1115/1030 +f 1017/1101/1017 1030/1115/1030 1018/1102/1018 +f 1018/1102/1018 1030/1115/1030 1031/1116/1031 +f 1018/1102/1018 1031/1116/1031 1019/1103/1019 +f 1019/1103/1019 1031/1116/1031 1032/1117/1032 +f 1019/1103/1019 1032/1117/1032 1020/1104/1020 +f 1020/1104/1020 1032/1117/1032 1021/1118/1021 +f 1020/1104/1020 1021/1118/1021 1009/1105/1009 +f 1021/1106/1021 1033/1119/1033 1034/1120/1034 +f 1021/1106/1021 1034/1120/1034 1022/1107/1022 +f 1022/1107/1022 1034/1120/1034 1035/1121/1035 +f 1022/1107/1022 1035/1121/1035 1023/1108/1023 +f 1023/1108/1023 1035/1121/1035 1036/1122/1036 +f 1023/1108/1023 1036/1122/1036 1024/1109/1024 +f 1024/1109/1024 1036/1122/1036 1037/1123/1037 +f 1024/1109/1024 1037/1123/1037 1025/1110/1025 +f 1025/1110/1025 1037/1123/1037 1038/1124/1038 +f 1025/1110/1025 1038/1124/1038 1026/1111/1026 +f 1026/1111/1026 1038/1124/1038 1039/1125/1039 +f 1026/1111/1026 1039/1125/1039 1027/1112/1027 +f 1027/1112/1027 1039/1125/1039 1040/1126/1040 +f 1027/1112/1027 1040/1126/1040 1028/1113/1028 +f 1028/1113/1028 1040/1126/1040 1041/1127/1041 +f 1028/1113/1028 1041/1127/1041 1029/1114/1029 +f 1029/1114/1029 1041/1127/1041 1042/1128/1042 +f 1029/1114/1029 1042/1128/1042 1030/1115/1030 +f 1030/1115/1030 1042/1128/1042 1043/1129/1043 +f 1030/1115/1030 1043/1129/1043 1031/1116/1031 +f 1031/1116/1031 1043/1129/1043 1044/1130/1044 +f 1031/1116/1031 1044/1130/1044 1032/1117/1032 +f 1032/1117/1032 1044/1130/1044 1033/1131/1033 +f 1032/1117/1032 1033/1131/1033 1021/1118/1021 +f 1033/1119/1033 1045/1132/1045 1046/1133/1046 +f 1033/1119/1033 1046/1133/1046 1034/1120/1034 +f 1034/1120/1034 1046/1133/1046 1047/1134/1047 +f 1034/1120/1034 1047/1134/1047 1035/1121/1035 +f 1035/1121/1035 1047/1134/1047 1048/1135/1048 +f 1035/1121/1035 1048/1135/1048 1036/1122/1036 +f 1036/1122/1036 1048/1135/1048 1049/1136/1049 +f 1036/1122/1036 1049/1136/1049 1037/1123/1037 +f 1037/1123/1037 1049/1136/1049 1050/1137/1050 +f 1037/1123/1037 1050/1137/1050 1038/1124/1038 +f 1038/1124/1038 1050/1137/1050 1051/1138/1051 +f 1038/1124/1038 1051/1138/1051 1039/1125/1039 +f 1039/1125/1039 1051/1138/1051 1052/1139/1052 +f 1039/1125/1039 1052/1139/1052 1040/1126/1040 +f 1040/1126/1040 1052/1139/1052 1053/1140/1053 +f 1040/1126/1040 1053/1140/1053 1041/1127/1041 +f 1041/1127/1041 1053/1140/1053 1054/1141/1054 +f 1041/1127/1041 1054/1141/1054 1042/1128/1042 +f 1042/1128/1042 1054/1141/1054 1055/1142/1055 +f 1042/1128/1042 1055/1142/1055 1043/1129/1043 +f 1043/1129/1043 1055/1142/1055 1056/1143/1056 +f 1043/1129/1043 1056/1143/1056 1044/1130/1044 +f 1044/1130/1044 1056/1143/1056 1045/1144/1045 +f 1044/1130/1044 1045/1144/1045 1033/1131/1033 +f 1045/1132/1045 1057/1145/1057 1058/1146/1058 +f 1045/1132/1045 1058/1146/1058 1046/1133/1046 +f 1046/1133/1046 1058/1146/1058 1059/1147/1059 +f 1046/1133/1046 1059/1147/1059 1047/1134/1047 +f 1047/1134/1047 1059/1147/1059 1060/1148/1060 +f 1047/1134/1047 1060/1148/1060 1048/1135/1048 +f 1048/1135/1048 1060/1148/1060 1061/1149/1061 +f 1048/1135/1048 1061/1149/1061 1049/1136/1049 +f 1049/1136/1049 1061/1149/1061 1062/1150/1062 +f 1049/1136/1049 1062/1150/1062 1050/1137/1050 +f 1050/1137/1050 1062/1150/1062 1063/1151/1063 +f 1050/1137/1050 1063/1151/1063 1051/1138/1051 +f 1051/1138/1051 1063/1151/1063 1064/1152/1064 +f 1051/1138/1051 1064/1152/1064 1052/1139/1052 +f 1052/1139/1052 1064/1152/1064 1065/1153/1065 +f 1052/1139/1052 1065/1153/1065 1053/1140/1053 +f 1053/1140/1053 1065/1153/1065 1066/1154/1066 +f 1053/1140/1053 1066/1154/1066 1054/1141/1054 +f 1054/1141/1054 1066/1154/1066 1067/1155/1067 +f 1054/1141/1054 1067/1155/1067 1055/1142/1055 +f 1055/1142/1055 1067/1155/1067 1068/1156/1068 +f 1055/1142/1055 1068/1156/1068 1056/1143/1056 +f 1056/1143/1056 1068/1156/1068 1057/1157/1057 +f 1056/1143/1056 1057/1157/1057 1045/1144/1045 +f 1057/1145/1057 1069/1158/1069 1070/1159/1070 +f 1057/1145/1057 1070/1159/1070 1058/1146/1058 +f 1058/1146/1058 1070/1159/1070 1071/1160/1071 +f 1058/1146/1058 1071/1160/1071 1059/1147/1059 +f 1059/1147/1059 1071/1160/1071 1072/1161/1072 +f 1059/1147/1059 1072/1161/1072 1060/1148/1060 +f 1060/1148/1060 1072/1161/1072 1073/1162/1073 +f 1060/1148/1060 1073/1162/1073 1061/1149/1061 +f 1061/1149/1061 1073/1162/1073 1074/1163/1074 +f 1061/1149/1061 1074/1163/1074 1062/1150/1062 +f 1062/1150/1062 1074/1163/1074 1075/1164/1075 +f 1062/1150/1062 1075/1164/1075 1063/1151/1063 +f 1063/1151/1063 1075/1164/1075 1076/1165/1076 +f 1063/1151/1063 1076/1165/1076 1064/1152/1064 +f 1064/1152/1064 1076/1165/1076 1077/1166/1077 +f 1064/1152/1064 1077/1166/1077 1065/1153/1065 +f 1065/1153/1065 1077/1166/1077 1078/1167/1078 +f 1065/1153/1065 1078/1167/1078 1066/1154/1066 +f 1066/1154/1066 1078/1167/1078 1079/1168/1079 +f 1066/1154/1066 1079/1168/1079 1067/1155/1067 +f 1067/1155/1067 1079/1168/1079 1080/1169/1080 +f 1067/1155/1067 1080/1169/1080 1068/1156/1068 +f 1068/1156/1068 1080/1169/1080 1069/1170/1069 +f 1068/1156/1068 1069/1170/1069 1057/1157/1057 +f 1069/1158/1069 1081/1171/1081 1082/1172/1082 +f 1069/1158/1069 1082/1172/1082 1070/1159/1070 +f 1070/1159/1070 1082/1172/1082 1083/1173/1083 +f 1070/1159/1070 1083/1173/1083 1071/1160/1071 +f 1071/1160/1071 1083/1173/1083 1084/1174/1084 +f 1071/1160/1071 1084/1174/1084 1072/1161/1072 +f 1072/1161/1072 1084/1174/1084 1085/1175/1085 +f 1072/1161/1072 1085/1175/1085 1073/1162/1073 +f 1073/1162/1073 1085/1175/1085 1086/1176/1086 +f 1073/1162/1073 1086/1176/1086 1074/1163/1074 +f 1074/1163/1074 1086/1176/1086 1087/1177/1087 +f 1074/1163/1074 1087/1177/1087 1075/1164/1075 +f 1075/1164/1075 1087/1177/1087 1088/1178/1088 +f 1075/1164/1075 1088/1178/1088 1076/1165/1076 +f 1076/1165/1076 1088/1178/1088 1089/1179/1089 +f 1076/1165/1076 1089/1179/1089 1077/1166/1077 +f 1077/1166/1077 1089/1179/1089 1090/1180/1090 +f 1077/1166/1077 1090/1180/1090 1078/1167/1078 +f 1078/1167/1078 1090/1180/1090 1091/1181/1091 +f 1078/1167/1078 1091/1181/1091 1079/1168/1079 +f 1079/1168/1079 1091/1181/1091 1092/1182/1092 +f 1079/1168/1079 1092/1182/1092 1080/1169/1080 +f 1080/1169/1080 1092/1182/1092 1081/1183/1081 +f 1080/1169/1080 1081/1183/1081 1069/1170/1069 +f 1081/1171/1081 1093/1184/1093 1094/1185/1094 +f 1081/1171/1081 1094/1185/1094 1082/1172/1082 +f 1082/1172/1082 1094/1185/1094 1095/1186/1095 +f 1082/1172/1082 1095/1186/1095 1083/1173/1083 +f 1083/1173/1083 1095/1186/1095 1096/1187/1096 +f 1083/1173/1083 1096/1187/1096 1084/1174/1084 +f 1084/1174/1084 1096/1187/1096 1097/1188/1097 +f 1084/1174/1084 1097/1188/1097 1085/1175/1085 +f 1085/1175/1085 1097/1188/1097 1098/1189/1098 +f 1085/1175/1085 1098/1189/1098 1086/1176/1086 +f 1086/1176/1086 1098/1189/1098 1099/1190/1099 +f 1086/1176/1086 1099/1190/1099 1087/1177/1087 +f 1087/1177/1087 1099/1190/1099 1100/1191/1100 +f 1087/1177/1087 1100/1191/1100 1088/1178/1088 +f 1088/1178/1088 1100/1191/1100 1101/1192/1101 +f 1088/1178/1088 1101/1192/1101 1089/1179/1089 +f 1089/1179/1089 1101/1192/1101 1102/1193/1102 +f 1089/1179/1089 1102/1193/1102 1090/1180/1090 +f 1090/1180/1090 1102/1193/1102 1103/1194/1103 +f 1090/1180/1090 1103/1194/1103 1091/1181/1091 +f 1091/1181/1091 1103/1194/1103 1104/1195/1104 +f 1091/1181/1091 1104/1195/1104 1092/1182/1092 +f 1092/1182/1092 1104/1195/1104 1093/1196/1093 +f 1092/1182/1092 1093/1196/1093 1081/1183/1081 +f 1093/1184/1093 1105/1197/1105 1106/1198/1106 +f 1093/1184/1093 1106/1198/1106 1094/1185/1094 +f 1094/1185/1094 1106/1198/1106 1107/1199/1107 +f 1094/1185/1094 1107/1199/1107 1095/1186/1095 +f 1095/1186/1095 1107/1199/1107 1108/1200/1108 +f 1095/1186/1095 1108/1200/1108 1096/1187/1096 +f 1096/1187/1096 1108/1200/1108 1109/1201/1109 +f 1096/1187/1096 1109/1201/1109 1097/1188/1097 +f 1097/1188/1097 1109/1201/1109 1110/1202/1110 +f 1097/1188/1097 1110/1202/1110 1098/1189/1098 +f 1098/1189/1098 1110/1202/1110 1111/1203/1111 +f 1098/1189/1098 1111/1203/1111 1099/1190/1099 +f 1099/1190/1099 1111/1203/1111 1112/1204/1112 +f 1099/1190/1099 1112/1204/1112 1100/1191/1100 +f 1100/1191/1100 1112/1204/1112 1113/1205/1113 +f 1100/1191/1100 1113/1205/1113 1101/1192/1101 +f 1101/1192/1101 1113/1205/1113 1114/1206/1114 +f 1101/1192/1101 1114/1206/1114 1102/1193/1102 +f 1102/1193/1102 1114/1206/1114 1115/1207/1115 +f 1102/1193/1102 1115/1207/1115 1103/1194/1103 +f 1103/1194/1103 1115/1207/1115 1116/1208/1116 +f 1103/1194/1103 1116/1208/1116 1104/1195/1104 +f 1104/1195/1104 1116/1208/1116 1105/1209/1105 +f 1104/1195/1104 1105/1209/1105 1093/1196/1093 +f 1105/1197/1105 1117/1210/1117 1118/1211/1118 +f 1105/1197/1105 1118/1211/1118 1106/1198/1106 +f 1106/1198/1106 1118/1211/1118 1119/1212/1119 +f 1106/1198/1106 1119/1212/1119 1107/1199/1107 +f 1107/1199/1107 1119/1212/1119 1120/1213/1120 +f 1107/1199/1107 1120/1213/1120 1108/1200/1108 +f 1108/1200/1108 1120/1213/1120 1121/1214/1121 +f 1108/1200/1108 1121/1214/1121 1109/1201/1109 +f 1109/1201/1109 1121/1214/1121 1122/1215/1122 +f 1109/1201/1109 1122/1215/1122 1110/1202/1110 +f 1110/1202/1110 1122/1215/1122 1123/1216/1123 +f 1110/1202/1110 1123/1216/1123 1111/1203/1111 +f 1111/1203/1111 1123/1216/1123 1124/1217/1124 +f 1111/1203/1111 1124/1217/1124 1112/1204/1112 +f 1112/1204/1112 1124/1217/1124 1125/1218/1125 +f 1112/1204/1112 1125/1218/1125 1113/1205/1113 +f 1113/1205/1113 1125/1218/1125 1126/1219/1126 +f 1113/1205/1113 1126/1219/1126 1114/1206/1114 +f 1114/1206/1114 1126/1219/1126 1127/1220/1127 +f 1114/1206/1114 1127/1220/1127 1115/1207/1115 +f 1115/1207/1115 1127/1220/1127 1128/1221/1128 +f 1115/1207/1115 1128/1221/1128 1116/1208/1116 +f 1116/1208/1116 1128/1221/1128 1117/1222/1117 +f 1116/1208/1116 1117/1222/1117 1105/1209/1105 +f 1117/1210/1117 1129/1223/1129 1130/1224/1130 +f 1117/1210/1117 1130/1224/1130 1118/1211/1118 +f 1118/1211/1118 1130/1224/1130 1131/1225/1131 +f 1118/1211/1118 1131/1225/1131 1119/1212/1119 +f 1119/1212/1119 1131/1225/1131 1132/1226/1132 +f 1119/1212/1119 1132/1226/1132 1120/1213/1120 +f 1120/1213/1120 1132/1226/1132 1133/1227/1133 +f 1120/1213/1120 1133/1227/1133 1121/1214/1121 +f 1121/1214/1121 1133/1227/1133 1134/1228/1134 +f 1121/1214/1121 1134/1228/1134 1122/1215/1122 +f 1122/1215/1122 1134/1228/1134 1135/1229/1135 +f 1122/1215/1122 1135/1229/1135 1123/1216/1123 +f 1123/1216/1123 1135/1229/1135 1136/1230/1136 +f 1123/1216/1123 1136/1230/1136 1124/1217/1124 +f 1124/1217/1124 1136/1230/1136 1137/1231/1137 +f 1124/1217/1124 1137/1231/1137 1125/1218/1125 +f 1125/1218/1125 1137/1231/1137 1138/1232/1138 +f 1125/1218/1125 1138/1232/1138 1126/1219/1126 +f 1126/1219/1126 1138/1232/1138 1139/1233/1139 +f 1126/1219/1126 1139/1233/1139 1127/1220/1127 +f 1127/1220/1127 1139/1233/1139 1140/1234/1140 +f 1127/1220/1127 1140/1234/1140 1128/1221/1128 +f 1128/1221/1128 1140/1234/1140 1129/1235/1129 +f 1128/1221/1128 1129/1235/1129 1117/1222/1117 +f 1129/1223/1129 1141/1236/1141 1142/1237/1142 +f 1129/1223/1129 1142/1237/1142 1130/1224/1130 +f 1130/1224/1130 1142/1237/1142 1143/1238/1143 +f 1130/1224/1130 1143/1238/1143 1131/1225/1131 +f 1131/1225/1131 1143/1238/1143 1144/1239/1144 +f 1131/1225/1131 1144/1239/1144 1132/1226/1132 +f 1132/1226/1132 1144/1239/1144 1145/1240/1145 +f 1132/1226/1132 1145/1240/1145 1133/1227/1133 +f 1133/1227/1133 1145/1240/1145 1146/1241/1146 +f 1133/1227/1133 1146/1241/1146 1134/1228/1134 +f 1134/1228/1134 1146/1241/1146 1147/1242/1147 +f 1134/1228/1134 1147/1242/1147 1135/1229/1135 +f 1135/1229/1135 1147/1242/1147 1148/1243/1148 +f 1135/1229/1135 1148/1243/1148 1136/1230/1136 +f 1136/1230/1136 1148/1243/1148 1149/1244/1149 +f 1136/1230/1136 1149/1244/1149 1137/1231/1137 +f 1137/1231/1137 1149/1244/1149 1150/1245/1150 +f 1137/1231/1137 1150/1245/1150 1138/1232/1138 +f 1138/1232/1138 1150/1245/1150 1151/1246/1151 +f 1138/1232/1138 1151/1246/1151 1139/1233/1139 +f 1139/1233/1139 1151/1246/1151 1152/1247/1152 +f 1139/1233/1139 1152/1247/1152 1140/1234/1140 +f 1140/1234/1140 1152/1247/1152 1141/1248/1141 +f 1140/1234/1140 1141/1248/1141 1129/1235/1129 +f 1141/1236/1141 1153/1249/1153 1154/1250/1154 +f 1141/1236/1141 1154/1250/1154 1142/1237/1142 +f 1142/1237/1142 1154/1250/1154 1155/1251/1155 +f 1142/1237/1142 1155/1251/1155 1143/1238/1143 +f 1143/1238/1143 1155/1251/1155 1156/1252/1156 +f 1143/1238/1143 1156/1252/1156 1144/1239/1144 +f 1144/1239/1144 1156/1252/1156 1157/1253/1157 +f 1144/1239/1144 1157/1253/1157 1145/1240/1145 +f 1145/1240/1145 1157/1253/1157 1158/1254/1158 +f 1145/1240/1145 1158/1254/1158 1146/1241/1146 +f 1146/1241/1146 1158/1254/1158 1159/1255/1159 +f 1146/1241/1146 1159/1255/1159 1147/1242/1147 +f 1147/1242/1147 1159/1255/1159 1160/1256/1160 +f 1147/1242/1147 1160/1256/1160 1148/1243/1148 +f 1148/1243/1148 1160/1256/1160 1161/1257/1161 +f 1148/1243/1148 1161/1257/1161 1149/1244/1149 +f 1149/1244/1149 1161/1257/1161 1162/1258/1162 +f 1149/1244/1149 1162/1258/1162 1150/1245/1150 +f 1150/1245/1150 1162/1258/1162 1163/1259/1163 +f 1150/1245/1150 1163/1259/1163 1151/1246/1151 +f 1151/1246/1151 1163/1259/1163 1164/1260/1164 +f 1151/1246/1151 1164/1260/1164 1152/1247/1152 +f 1152/1247/1152 1164/1260/1164 1153/1261/1153 +f 1152/1247/1152 1153/1261/1153 1141/1248/1141 +f 1153/1249/1153 1165/1262/1165 1166/1263/1166 +f 1153/1249/1153 1166/1263/1166 1154/1250/1154 +f 1154/1250/1154 1166/1263/1166 1167/1264/1167 +f 1154/1250/1154 1167/1264/1167 1155/1251/1155 +f 1155/1251/1155 1167/1264/1167 1168/1265/1168 +f 1155/1251/1155 1168/1265/1168 1156/1252/1156 +f 1156/1252/1156 1168/1265/1168 1169/1266/1169 +f 1156/1252/1156 1169/1266/1169 1157/1253/1157 +f 1157/1253/1157 1169/1266/1169 1170/1267/1170 +f 1157/1253/1157 1170/1267/1170 1158/1254/1158 +f 1158/1254/1158 1170/1267/1170 1171/1268/1171 +f 1158/1254/1158 1171/1268/1171 1159/1255/1159 +f 1159/1255/1159 1171/1268/1171 1172/1269/1172 +f 1159/1255/1159 1172/1269/1172 1160/1256/1160 +f 1160/1256/1160 1172/1269/1172 1173/1270/1173 +f 1160/1256/1160 1173/1270/1173 1161/1257/1161 +f 1161/1257/1161 1173/1270/1173 1174/1271/1174 +f 1161/1257/1161 1174/1271/1174 1162/1258/1162 +f 1162/1258/1162 1174/1271/1174 1175/1272/1175 +f 1162/1258/1162 1175/1272/1175 1163/1259/1163 +f 1163/1259/1163 1175/1272/1175 1176/1273/1176 +f 1163/1259/1163 1176/1273/1176 1164/1260/1164 +f 1164/1260/1164 1176/1273/1176 1165/1274/1165 +f 1164/1260/1164 1165/1274/1165 1153/1261/1153 +f 1165/1262/1165 1177/1275/1177 1178/1276/1178 +f 1165/1262/1165 1178/1276/1178 1166/1263/1166 +f 1166/1263/1166 1178/1276/1178 1179/1277/1179 +f 1166/1263/1166 1179/1277/1179 1167/1264/1167 +f 1167/1264/1167 1179/1277/1179 1180/1278/1180 +f 1167/1264/1167 1180/1278/1180 1168/1265/1168 +f 1168/1265/1168 1180/1278/1180 1181/1279/1181 +f 1168/1265/1168 1181/1279/1181 1169/1266/1169 +f 1169/1266/1169 1181/1279/1181 1182/1280/1182 +f 1169/1266/1169 1182/1280/1182 1170/1267/1170 +f 1170/1267/1170 1182/1280/1182 1183/1281/1183 +f 1170/1267/1170 1183/1281/1183 1171/1268/1171 +f 1171/1268/1171 1183/1281/1183 1184/1282/1184 +f 1171/1268/1171 1184/1282/1184 1172/1269/1172 +f 1172/1269/1172 1184/1282/1184 1185/1283/1185 +f 1172/1269/1172 1185/1283/1185 1173/1270/1173 +f 1173/1270/1173 1185/1283/1185 1186/1284/1186 +f 1173/1270/1173 1186/1284/1186 1174/1271/1174 +f 1174/1271/1174 1186/1284/1186 1187/1285/1187 +f 1174/1271/1174 1187/1285/1187 1175/1272/1175 +f 1175/1272/1175 1187/1285/1187 1188/1286/1188 +f 1175/1272/1175 1188/1286/1188 1176/1273/1176 +f 1176/1273/1176 1188/1286/1188 1177/1287/1177 +f 1176/1273/1176 1177/1287/1177 1165/1274/1165 +f 1177/1275/1177 1189/1288/1189 1190/1289/1190 +f 1177/1275/1177 1190/1289/1190 1178/1276/1178 +f 1178/1276/1178 1190/1289/1190 1191/1290/1191 +f 1178/1276/1178 1191/1290/1191 1179/1277/1179 +f 1179/1277/1179 1191/1290/1191 1192/1291/1192 +f 1179/1277/1179 1192/1291/1192 1180/1278/1180 +f 1180/1278/1180 1192/1291/1192 1193/1292/1193 +f 1180/1278/1180 1193/1292/1193 1181/1279/1181 +f 1181/1279/1181 1193/1292/1193 1194/1293/1194 +f 1181/1279/1181 1194/1293/1194 1182/1280/1182 +f 1182/1280/1182 1194/1293/1194 1195/1294/1195 +f 1182/1280/1182 1195/1294/1195 1183/1281/1183 +f 1183/1281/1183 1195/1294/1195 1196/1295/1196 +f 1183/1281/1183 1196/1295/1196 1184/1282/1184 +f 1184/1282/1184 1196/1295/1196 1197/1296/1197 +f 1184/1282/1184 1197/1296/1197 1185/1283/1185 +f 1185/1283/1185 1197/1296/1197 1198/1297/1198 +f 1185/1283/1185 1198/1297/1198 1186/1284/1186 +f 1186/1284/1186 1198/1297/1198 1199/1298/1199 +f 1186/1284/1186 1199/1298/1199 1187/1285/1187 +f 1187/1285/1187 1199/1298/1199 1200/1299/1200 +f 1187/1285/1187 1200/1299/1200 1188/1286/1188 +f 1188/1286/1188 1200/1299/1200 1189/1300/1189 +f 1188/1286/1188 1189/1300/1189 1177/1287/1177 +f 1189/1288/1189 1201/1301/1201 1202/1302/1202 +f 1189/1288/1189 1202/1302/1202 1190/1289/1190 +f 1190/1289/1190 1202/1302/1202 1203/1303/1203 +f 1190/1289/1190 1203/1303/1203 1191/1290/1191 +f 1191/1290/1191 1203/1303/1203 1204/1304/1204 +f 1191/1290/1191 1204/1304/1204 1192/1291/1192 +f 1192/1291/1192 1204/1304/1204 1205/1305/1205 +f 1192/1291/1192 1205/1305/1205 1193/1292/1193 +f 1193/1292/1193 1205/1305/1205 1206/1306/1206 +f 1193/1292/1193 1206/1306/1206 1194/1293/1194 +f 1194/1293/1194 1206/1306/1206 1207/1307/1207 +f 1194/1293/1194 1207/1307/1207 1195/1294/1195 +f 1195/1294/1195 1207/1307/1207 1208/1308/1208 +f 1195/1294/1195 1208/1308/1208 1196/1295/1196 +f 1196/1295/1196 1208/1308/1208 1209/1309/1209 +f 1196/1295/1196 1209/1309/1209 1197/1296/1197 +f 1197/1296/1197 1209/1309/1209 1210/1310/1210 +f 1197/1296/1197 1210/1310/1210 1198/1297/1198 +f 1198/1297/1198 1210/1310/1210 1211/1311/1211 +f 1198/1297/1198 1211/1311/1211 1199/1298/1199 +f 1199/1298/1199 1211/1311/1211 1212/1312/1212 +f 1199/1298/1199 1212/1312/1212 1200/1299/1200 +f 1200/1299/1200 1212/1312/1212 1201/1313/1201 +f 1200/1299/1200 1201/1313/1201 1189/1300/1189 +f 1201/1301/1201 1213/1314/1213 1214/1315/1214 +f 1201/1301/1201 1214/1315/1214 1202/1302/1202 +f 1202/1302/1202 1214/1315/1214 1215/1316/1215 +f 1202/1302/1202 1215/1316/1215 1203/1303/1203 +f 1203/1303/1203 1215/1316/1215 1216/1317/1216 +f 1203/1303/1203 1216/1317/1216 1204/1304/1204 +f 1204/1304/1204 1216/1317/1216 1217/1318/1217 +f 1204/1304/1204 1217/1318/1217 1205/1305/1205 +f 1205/1305/1205 1217/1318/1217 1218/1319/1218 +f 1205/1305/1205 1218/1319/1218 1206/1306/1206 +f 1206/1306/1206 1218/1319/1218 1219/1320/1219 +f 1206/1306/1206 1219/1320/1219 1207/1307/1207 +f 1207/1307/1207 1219/1320/1219 1220/1321/1220 +f 1207/1307/1207 1220/1321/1220 1208/1308/1208 +f 1208/1308/1208 1220/1321/1220 1221/1322/1221 +f 1208/1308/1208 1221/1322/1221 1209/1309/1209 +f 1209/1309/1209 1221/1322/1221 1222/1323/1222 +f 1209/1309/1209 1222/1323/1222 1210/1310/1210 +f 1210/1310/1210 1222/1323/1222 1223/1324/1223 +f 1210/1310/1210 1223/1324/1223 1211/1311/1211 +f 1211/1311/1211 1223/1324/1223 1224/1325/1224 +f 1211/1311/1211 1224/1325/1224 1212/1312/1212 +f 1212/1312/1212 1224/1325/1224 1213/1326/1213 +f 1212/1312/1212 1213/1326/1213 1201/1313/1201 +f 1213/1314/1213 1225/1327/1225 1226/1328/1226 +f 1213/1314/1213 1226/1328/1226 1214/1315/1214 +f 1214/1315/1214 1226/1328/1226 1227/1329/1227 +f 1214/1315/1214 1227/1329/1227 1215/1316/1215 +f 1215/1316/1215 1227/1329/1227 1228/1330/1228 +f 1215/1316/1215 1228/1330/1228 1216/1317/1216 +f 1216/1317/1216 1228/1330/1228 1229/1331/1229 +f 1216/1317/1216 1229/1331/1229 1217/1318/1217 +f 1217/1318/1217 1229/1331/1229 1230/1332/1230 +f 1217/1318/1217 1230/1332/1230 1218/1319/1218 +f 1218/1319/1218 1230/1332/1230 1231/1333/1231 +f 1218/1319/1218 1231/1333/1231 1219/1320/1219 +f 1219/1320/1219 1231/1333/1231 1232/1334/1232 +f 1219/1320/1219 1232/1334/1232 1220/1321/1220 +f 1220/1321/1220 1232/1334/1232 1233/1335/1233 +f 1220/1321/1220 1233/1335/1233 1221/1322/1221 +f 1221/1322/1221 1233/1335/1233 1234/1336/1234 +f 1221/1322/1221 1234/1336/1234 1222/1323/1222 +f 1222/1323/1222 1234/1336/1234 1235/1337/1235 +f 1222/1323/1222 1235/1337/1235 1223/1324/1223 +f 1223/1324/1223 1235/1337/1235 1236/1338/1236 +f 1223/1324/1223 1236/1338/1236 1224/1325/1224 +f 1224/1325/1224 1236/1338/1236 1225/1339/1225 +f 1224/1325/1224 1225/1339/1225 1213/1326/1213 +f 1225/1327/1225 1237/1340/1237 1238/1341/1238 +f 1225/1327/1225 1238/1341/1238 1226/1328/1226 +f 1226/1328/1226 1238/1341/1238 1239/1342/1239 +f 1226/1328/1226 1239/1342/1239 1227/1329/1227 +f 1227/1329/1227 1239/1342/1239 1240/1343/1240 +f 1227/1329/1227 1240/1343/1240 1228/1330/1228 +f 1228/1330/1228 1240/1343/1240 1241/1344/1241 +f 1228/1330/1228 1241/1344/1241 1229/1331/1229 +f 1229/1331/1229 1241/1344/1241 1242/1345/1242 +f 1229/1331/1229 1242/1345/1242 1230/1332/1230 +f 1230/1332/1230 1242/1345/1242 1243/1346/1243 +f 1230/1332/1230 1243/1346/1243 1231/1333/1231 +f 1231/1333/1231 1243/1346/1243 1244/1347/1244 +f 1231/1333/1231 1244/1347/1244 1232/1334/1232 +f 1232/1334/1232 1244/1347/1244 1245/1348/1245 +f 1232/1334/1232 1245/1348/1245 1233/1335/1233 +f 1233/1335/1233 1245/1348/1245 1246/1349/1246 +f 1233/1335/1233 1246/1349/1246 1234/1336/1234 +f 1234/1336/1234 1246/1349/1246 1247/1350/1247 +f 1234/1336/1234 1247/1350/1247 1235/1337/1235 +f 1235/1337/1235 1247/1350/1247 1248/1351/1248 +f 1235/1337/1235 1248/1351/1248 1236/1338/1236 +f 1236/1338/1236 1248/1351/1248 1237/1352/1237 +f 1236/1338/1236 1237/1352/1237 1225/1339/1225 +f 1237/1340/1237 1249/1353/1249 1250/1354/1250 +f 1237/1340/1237 1250/1354/1250 1238/1341/1238 +f 1238/1341/1238 1250/1354/1250 1251/1355/1251 +f 1238/1341/1238 1251/1355/1251 1239/1342/1239 +f 1239/1342/1239 1251/1355/1251 1252/1356/1252 +f 1239/1342/1239 1252/1356/1252 1240/1343/1240 +f 1240/1343/1240 1252/1356/1252 1253/1357/1253 +f 1240/1343/1240 1253/1357/1253 1241/1344/1241 +f 1241/1344/1241 1253/1357/1253 1254/1358/1254 +f 1241/1344/1241 1254/1358/1254 1242/1345/1242 +f 1242/1345/1242 1254/1358/1254 1255/1359/1255 +f 1242/1345/1242 1255/1359/1255 1243/1346/1243 +f 1243/1346/1243 1255/1359/1255 1256/1360/1256 +f 1243/1346/1243 1256/1360/1256 1244/1347/1244 +f 1244/1347/1244 1256/1360/1256 1257/1361/1257 +f 1244/1347/1244 1257/1361/1257 1245/1348/1245 +f 1245/1348/1245 1257/1361/1257 1258/1362/1258 +f 1245/1348/1245 1258/1362/1258 1246/1349/1246 +f 1246/1349/1246 1258/1362/1258 1259/1363/1259 +f 1246/1349/1246 1259/1363/1259 1247/1350/1247 +f 1247/1350/1247 1259/1363/1259 1260/1364/1260 +f 1247/1350/1247 1260/1364/1260 1248/1351/1248 +f 1248/1351/1248 1260/1364/1260 1249/1365/1249 +f 1248/1351/1248 1249/1365/1249 1237/1352/1237 +f 1249/1353/1249 1261/1366/1261 1262/1367/1262 +f 1249/1353/1249 1262/1367/1262 1250/1354/1250 +f 1250/1354/1250 1262/1367/1262 1263/1368/1263 +f 1250/1354/1250 1263/1368/1263 1251/1355/1251 +f 1251/1355/1251 1263/1368/1263 1264/1369/1264 +f 1251/1355/1251 1264/1369/1264 1252/1356/1252 +f 1252/1356/1252 1264/1369/1264 1265/1370/1265 +f 1252/1356/1252 1265/1370/1265 1253/1357/1253 +f 1253/1357/1253 1265/1370/1265 1266/1371/1266 +f 1253/1357/1253 1266/1371/1266 1254/1358/1254 +f 1254/1358/1254 1266/1371/1266 1267/1372/1267 +f 1254/1358/1254 1267/1372/1267 1255/1359/1255 +f 1255/1359/1255 1267/1372/1267 1268/1373/1268 +f 1255/1359/1255 1268/1373/1268 1256/1360/1256 +f 1256/1360/1256 1268/1373/1268 1269/1374/1269 +f 1256/1360/1256 1269/1374/1269 1257/1361/1257 +f 1257/1361/1257 1269/1374/1269 1270/1375/1270 +f 1257/1361/1257 1270/1375/1270 1258/1362/1258 +f 1258/1362/1258 1270/1375/1270 1271/1376/1271 +f 1258/1362/1258 1271/1376/1271 1259/1363/1259 +f 1259/1363/1259 1271/1376/1271 1272/1377/1272 +f 1259/1363/1259 1272/1377/1272 1260/1364/1260 +f 1260/1364/1260 1272/1377/1272 1261/1378/1261 +f 1260/1364/1260 1261/1378/1261 1249/1365/1249 +f 1261/1366/1261 1273/1379/1273 1274/1380/1274 +f 1261/1366/1261 1274/1380/1274 1262/1367/1262 +f 1262/1367/1262 1274/1380/1274 1275/1381/1275 +f 1262/1367/1262 1275/1381/1275 1263/1368/1263 +f 1263/1368/1263 1275/1381/1275 1276/1382/1276 +f 1263/1368/1263 1276/1382/1276 1264/1369/1264 +f 1264/1369/1264 1276/1382/1276 1277/1383/1277 +f 1264/1369/1264 1277/1383/1277 1265/1370/1265 +f 1265/1370/1265 1277/1383/1277 1278/1384/1278 +f 1265/1370/1265 1278/1384/1278 1266/1371/1266 +f 1266/1371/1266 1278/1384/1278 1279/1385/1279 +f 1266/1371/1266 1279/1385/1279 1267/1372/1267 +f 1267/1372/1267 1279/1385/1279 1280/1386/1280 +f 1267/1372/1267 1280/1386/1280 1268/1373/1268 +f 1268/1373/1268 1280/1386/1280 1281/1387/1281 +f 1268/1373/1268 1281/1387/1281 1269/1374/1269 +f 1269/1374/1269 1281/1387/1281 1282/1388/1282 +f 1269/1374/1269 1282/1388/1282 1270/1375/1270 +f 1270/1375/1270 1282/1388/1282 1283/1389/1283 +f 1270/1375/1270 1283/1389/1283 1271/1376/1271 +f 1271/1376/1271 1283/1389/1283 1284/1390/1284 +f 1271/1376/1271 1284/1390/1284 1272/1377/1272 +f 1272/1377/1272 1284/1390/1284 1273/1391/1273 +f 1272/1377/1272 1273/1391/1273 1261/1378/1261 +f 1273/1379/1273 1285/1392/1285 1286/1393/1286 +f 1273/1379/1273 1286/1393/1286 1274/1380/1274 +f 1274/1380/1274 1286/1393/1286 1287/1394/1287 +f 1274/1380/1274 1287/1394/1287 1275/1381/1275 +f 1275/1381/1275 1287/1394/1287 1288/1395/1288 +f 1275/1381/1275 1288/1395/1288 1276/1382/1276 +f 1276/1382/1276 1288/1395/1288 1289/1396/1289 +f 1276/1382/1276 1289/1396/1289 1277/1383/1277 +f 1277/1383/1277 1289/1396/1289 1290/1397/1290 +f 1277/1383/1277 1290/1397/1290 1278/1384/1278 +f 1278/1384/1278 1290/1397/1290 1291/1398/1291 +f 1278/1384/1278 1291/1398/1291 1279/1385/1279 +f 1279/1385/1279 1291/1398/1291 1292/1399/1292 +f 1279/1385/1279 1292/1399/1292 1280/1386/1280 +f 1280/1386/1280 1292/1399/1292 1293/1400/1293 +f 1280/1386/1280 1293/1400/1293 1281/1387/1281 +f 1281/1387/1281 1293/1400/1293 1294/1401/1294 +f 1281/1387/1281 1294/1401/1294 1282/1388/1282 +f 1282/1388/1282 1294/1401/1294 1295/1402/1295 +f 1282/1388/1282 1295/1402/1295 1283/1389/1283 +f 1283/1389/1283 1295/1402/1295 1296/1403/1296 +f 1283/1389/1283 1296/1403/1296 1284/1390/1284 +f 1284/1390/1284 1296/1403/1296 1285/1404/1285 +f 1284/1390/1284 1285/1404/1285 1273/1391/1273 +f 1285/1392/1285 1297/1405/1297 1298/1406/1298 +f 1285/1392/1285 1298/1406/1298 1286/1393/1286 +f 1286/1393/1286 1298/1406/1298 1299/1407/1299 +f 1286/1393/1286 1299/1407/1299 1287/1394/1287 +f 1287/1394/1287 1299/1407/1299 1300/1408/1300 +f 1287/1394/1287 1300/1408/1300 1288/1395/1288 +f 1288/1395/1288 1300/1408/1300 1301/1409/1301 +f 1288/1395/1288 1301/1409/1301 1289/1396/1289 +f 1289/1396/1289 1301/1409/1301 1302/1410/1302 +f 1289/1396/1289 1302/1410/1302 1290/1397/1290 +f 1290/1397/1290 1302/1410/1302 1303/1411/1303 +f 1290/1397/1290 1303/1411/1303 1291/1398/1291 +f 1291/1398/1291 1303/1411/1303 1304/1412/1304 +f 1291/1398/1291 1304/1412/1304 1292/1399/1292 +f 1292/1399/1292 1304/1412/1304 1305/1413/1305 +f 1292/1399/1292 1305/1413/1305 1293/1400/1293 +f 1293/1400/1293 1305/1413/1305 1306/1414/1306 +f 1293/1400/1293 1306/1414/1306 1294/1401/1294 +f 1294/1401/1294 1306/1414/1306 1307/1415/1307 +f 1294/1401/1294 1307/1415/1307 1295/1402/1295 +f 1295/1402/1295 1307/1415/1307 1308/1416/1308 +f 1295/1402/1295 1308/1416/1308 1296/1403/1296 +f 1296/1403/1296 1308/1416/1308 1297/1417/1297 +f 1296/1403/1296 1297/1417/1297 1285/1404/1285 +f 1297/1405/1297 1309/1418/1309 1310/1419/1310 +f 1297/1405/1297 1310/1419/1310 1298/1406/1298 +f 1298/1406/1298 1310/1419/1310 1311/1420/1311 +f 1298/1406/1298 1311/1420/1311 1299/1407/1299 +f 1299/1407/1299 1311/1420/1311 1312/1421/1312 +f 1299/1407/1299 1312/1421/1312 1300/1408/1300 +f 1300/1408/1300 1312/1421/1312 1313/1422/1313 +f 1300/1408/1300 1313/1422/1313 1301/1409/1301 +f 1301/1409/1301 1313/1422/1313 1314/1423/1314 +f 1301/1409/1301 1314/1423/1314 1302/1410/1302 +f 1302/1410/1302 1314/1423/1314 1315/1424/1315 +f 1302/1410/1302 1315/1424/1315 1303/1411/1303 +f 1303/1411/1303 1315/1424/1315 1316/1425/1316 +f 1303/1411/1303 1316/1425/1316 1304/1412/1304 +f 1304/1412/1304 1316/1425/1316 1317/1426/1317 +f 1304/1412/1304 1317/1426/1317 1305/1413/1305 +f 1305/1413/1305 1317/1426/1317 1318/1427/1318 +f 1305/1413/1305 1318/1427/1318 1306/1414/1306 +f 1306/1414/1306 1318/1427/1318 1319/1428/1319 +f 1306/1414/1306 1319/1428/1319 1307/1415/1307 +f 1307/1415/1307 1319/1428/1319 1320/1429/1320 +f 1307/1415/1307 1320/1429/1320 1308/1416/1308 +f 1308/1416/1308 1320/1429/1320 1309/1430/1309 +f 1308/1416/1308 1309/1430/1309 1297/1417/1297 +f 1309/1418/1309 1321/1431/1321 1322/1432/1322 +f 1309/1418/1309 1322/1432/1322 1310/1419/1310 +f 1310/1419/1310 1322/1432/1322 1323/1433/1323 +f 1310/1419/1310 1323/1433/1323 1311/1420/1311 +f 1311/1420/1311 1323/1433/1323 1324/1434/1324 +f 1311/1420/1311 1324/1434/1324 1312/1421/1312 +f 1312/1421/1312 1324/1434/1324 1325/1435/1325 +f 1312/1421/1312 1325/1435/1325 1313/1422/1313 +f 1313/1422/1313 1325/1435/1325 1326/1436/1326 +f 1313/1422/1313 1326/1436/1326 1314/1423/1314 +f 1314/1423/1314 1326/1436/1326 1327/1437/1327 +f 1314/1423/1314 1327/1437/1327 1315/1424/1315 +f 1315/1424/1315 1327/1437/1327 1328/1438/1328 +f 1315/1424/1315 1328/1438/1328 1316/1425/1316 +f 1316/1425/1316 1328/1438/1328 1329/1439/1329 +f 1316/1425/1316 1329/1439/1329 1317/1426/1317 +f 1317/1426/1317 1329/1439/1329 1330/1440/1330 +f 1317/1426/1317 1330/1440/1330 1318/1427/1318 +f 1318/1427/1318 1330/1440/1330 1331/1441/1331 +f 1318/1427/1318 1331/1441/1331 1319/1428/1319 +f 1319/1428/1319 1331/1441/1331 1332/1442/1332 +f 1319/1428/1319 1332/1442/1332 1320/1429/1320 +f 1320/1429/1320 1332/1442/1332 1321/1443/1321 +f 1320/1429/1320 1321/1443/1321 1309/1430/1309 +f 1321/1431/1321 1333/1444/1333 1334/1445/1334 +f 1321/1431/1321 1334/1445/1334 1322/1432/1322 +f 1322/1432/1322 1334/1445/1334 1335/1446/1335 +f 1322/1432/1322 1335/1446/1335 1323/1433/1323 +f 1323/1433/1323 1335/1446/1335 1336/1447/1336 +f 1323/1433/1323 1336/1447/1336 1324/1434/1324 +f 1324/1434/1324 1336/1447/1336 1337/1448/1337 +f 1324/1434/1324 1337/1448/1337 1325/1435/1325 +f 1325/1435/1325 1337/1448/1337 1338/1449/1338 +f 1325/1435/1325 1338/1449/1338 1326/1436/1326 +f 1326/1436/1326 1338/1449/1338 1339/1450/1339 +f 1326/1436/1326 1339/1450/1339 1327/1437/1327 +f 1327/1437/1327 1339/1450/1339 1340/1451/1340 +f 1327/1437/1327 1340/1451/1340 1328/1438/1328 +f 1328/1438/1328 1340/1451/1340 1341/1452/1341 +f 1328/1438/1328 1341/1452/1341 1329/1439/1329 +f 1329/1439/1329 1341/1452/1341 1342/1453/1342 +f 1329/1439/1329 1342/1453/1342 1330/1440/1330 +f 1330/1440/1330 1342/1453/1342 1343/1454/1343 +f 1330/1440/1330 1343/1454/1343 1331/1441/1331 +f 1331/1441/1331 1343/1454/1343 1344/1455/1344 +f 1331/1441/1331 1344/1455/1344 1332/1442/1332 +f 1332/1442/1332 1344/1455/1344 1333/1456/1333 +f 1332/1442/1332 1333/1456/1333 1321/1443/1321 +f 1333/1444/1333 1345/1457/1345 1346/1458/1346 +f 1333/1444/1333 1346/1458/1346 1334/1445/1334 +f 1334/1445/1334 1346/1458/1346 1347/1459/1347 +f 1334/1445/1334 1347/1459/1347 1335/1446/1335 +f 1335/1446/1335 1347/1459/1347 1348/1460/1348 +f 1335/1446/1335 1348/1460/1348 1336/1447/1336 +f 1336/1447/1336 1348/1460/1348 1349/1461/1349 +f 1336/1447/1336 1349/1461/1349 1337/1448/1337 +f 1337/1448/1337 1349/1461/1349 1350/1462/1350 +f 1337/1448/1337 1350/1462/1350 1338/1449/1338 +f 1338/1449/1338 1350/1462/1350 1351/1463/1351 +f 1338/1449/1338 1351/1463/1351 1339/1450/1339 +f 1339/1450/1339 1351/1463/1351 1352/1464/1352 +f 1339/1450/1339 1352/1464/1352 1340/1451/1340 +f 1340/1451/1340 1352/1464/1352 1353/1465/1353 +f 1340/1451/1340 1353/1465/1353 1341/1452/1341 +f 1341/1452/1341 1353/1465/1353 1354/1466/1354 +f 1341/1452/1341 1354/1466/1354 1342/1453/1342 +f 1342/1453/1342 1354/1466/1354 1355/1467/1355 +f 1342/1453/1342 1355/1467/1355 1343/1454/1343 +f 1343/1454/1343 1355/1467/1355 1356/1468/1356 +f 1343/1454/1343 1356/1468/1356 1344/1455/1344 +f 1344/1455/1344 1356/1468/1356 1345/1469/1345 +f 1344/1455/1344 1345/1469/1345 1333/1456/1333 +f 1345/1457/1345 1357/1470/1357 1358/1471/1358 +f 1345/1457/1345 1358/1471/1358 1346/1458/1346 +f 1346/1458/1346 1358/1471/1358 1359/1472/1359 +f 1346/1458/1346 1359/1472/1359 1347/1459/1347 +f 1347/1459/1347 1359/1472/1359 1360/1473/1360 +f 1347/1459/1347 1360/1473/1360 1348/1460/1348 +f 1348/1460/1348 1360/1473/1360 1361/1474/1361 +f 1348/1460/1348 1361/1474/1361 1349/1461/1349 +f 1349/1461/1349 1361/1474/1361 1362/1475/1362 +f 1349/1461/1349 1362/1475/1362 1350/1462/1350 +f 1350/1462/1350 1362/1475/1362 1363/1476/1363 +f 1350/1462/1350 1363/1476/1363 1351/1463/1351 +f 1351/1463/1351 1363/1476/1363 1364/1477/1364 +f 1351/1463/1351 1364/1477/1364 1352/1464/1352 +f 1352/1464/1352 1364/1477/1364 1365/1478/1365 +f 1352/1464/1352 1365/1478/1365 1353/1465/1353 +f 1353/1465/1353 1365/1478/1365 1366/1479/1366 +f 1353/1465/1353 1366/1479/1366 1354/1466/1354 +f 1354/1466/1354 1366/1479/1366 1367/1480/1367 +f 1354/1466/1354 1367/1480/1367 1355/1467/1355 +f 1355/1467/1355 1367/1480/1367 1368/1481/1368 +f 1355/1467/1355 1368/1481/1368 1356/1468/1356 +f 1356/1468/1356 1368/1481/1368 1357/1482/1357 +f 1356/1468/1356 1357/1482/1357 1345/1469/1345 +f 1357/1470/1357 1369/1483/1369 1370/1484/1370 +f 1357/1470/1357 1370/1484/1370 1358/1471/1358 +f 1358/1471/1358 1370/1484/1370 1371/1485/1371 +f 1358/1471/1358 1371/1485/1371 1359/1472/1359 +f 1359/1472/1359 1371/1485/1371 1372/1486/1372 +f 1359/1472/1359 1372/1486/1372 1360/1473/1360 +f 1360/1473/1360 1372/1486/1372 1373/1487/1373 +f 1360/1473/1360 1373/1487/1373 1361/1474/1361 +f 1361/1474/1361 1373/1487/1373 1374/1488/1374 +f 1361/1474/1361 1374/1488/1374 1362/1475/1362 +f 1362/1475/1362 1374/1488/1374 1375/1489/1375 +f 1362/1475/1362 1375/1489/1375 1363/1476/1363 +f 1363/1476/1363 1375/1489/1375 1376/1490/1376 +f 1363/1476/1363 1376/1490/1376 1364/1477/1364 +f 1364/1477/1364 1376/1490/1376 1377/1491/1377 +f 1364/1477/1364 1377/1491/1377 1365/1478/1365 +f 1365/1478/1365 1377/1491/1377 1378/1492/1378 +f 1365/1478/1365 1378/1492/1378 1366/1479/1366 +f 1366/1479/1366 1378/1492/1378 1379/1493/1379 +f 1366/1479/1366 1379/1493/1379 1367/1480/1367 +f 1367/1480/1367 1379/1493/1379 1380/1494/1380 +f 1367/1480/1367 1380/1494/1380 1368/1481/1368 +f 1368/1481/1368 1380/1494/1380 1369/1495/1369 +f 1368/1481/1368 1369/1495/1369 1357/1482/1357 +f 1369/1483/1369 1381/1496/1381 1382/1497/1382 +f 1369/1483/1369 1382/1497/1382 1370/1484/1370 +f 1370/1484/1370 1382/1497/1382 1383/1498/1383 +f 1370/1484/1370 1383/1498/1383 1371/1485/1371 +f 1371/1485/1371 1383/1498/1383 1384/1499/1384 +f 1371/1485/1371 1384/1499/1384 1372/1486/1372 +f 1372/1486/1372 1384/1499/1384 1385/1500/1385 +f 1372/1486/1372 1385/1500/1385 1373/1487/1373 +f 1373/1487/1373 1385/1500/1385 1386/1501/1386 +f 1373/1487/1373 1386/1501/1386 1374/1488/1374 +f 1374/1488/1374 1386/1501/1386 1387/1502/1387 +f 1374/1488/1374 1387/1502/1387 1375/1489/1375 +f 1375/1489/1375 1387/1502/1387 1388/1503/1388 +f 1375/1489/1375 1388/1503/1388 1376/1490/1376 +f 1376/1490/1376 1388/1503/1388 1389/1504/1389 +f 1376/1490/1376 1389/1504/1389 1377/1491/1377 +f 1377/1491/1377 1389/1504/1389 1390/1505/1390 +f 1377/1491/1377 1390/1505/1390 1378/1492/1378 +f 1378/1492/1378 1390/1505/1390 1391/1506/1391 +f 1378/1492/1378 1391/1506/1391 1379/1493/1379 +f 1379/1493/1379 1391/1506/1391 1392/1507/1392 +f 1379/1493/1379 1392/1507/1392 1380/1494/1380 +f 1380/1494/1380 1392/1507/1392 1381/1508/1381 +f 1380/1494/1380 1381/1508/1381 1369/1495/1369 +f 1381/1496/1381 1393/1509/1393 1394/1510/1394 +f 1381/1496/1381 1394/1510/1394 1382/1497/1382 +f 1382/1497/1382 1394/1510/1394 1395/1511/1395 +f 1382/1497/1382 1395/1511/1395 1383/1498/1383 +f 1383/1498/1383 1395/1511/1395 1396/1512/1396 +f 1383/1498/1383 1396/1512/1396 1384/1499/1384 +f 1384/1499/1384 1396/1512/1396 1397/1513/1397 +f 1384/1499/1384 1397/1513/1397 1385/1500/1385 +f 1385/1500/1385 1397/1513/1397 1398/1514/1398 +f 1385/1500/1385 1398/1514/1398 1386/1501/1386 +f 1386/1501/1386 1398/1514/1398 1399/1515/1399 +f 1386/1501/1386 1399/1515/1399 1387/1502/1387 +f 1387/1502/1387 1399/1515/1399 1400/1516/1400 +f 1387/1502/1387 1400/1516/1400 1388/1503/1388 +f 1388/1503/1388 1400/1516/1400 1401/1517/1401 +f 1388/1503/1388 1401/1517/1401 1389/1504/1389 +f 1389/1504/1389 1401/1517/1401 1402/1518/1402 +f 1389/1504/1389 1402/1518/1402 1390/1505/1390 +f 1390/1505/1390 1402/1518/1402 1403/1519/1403 +f 1390/1505/1390 1403/1519/1403 1391/1506/1391 +f 1391/1506/1391 1403/1519/1403 1404/1520/1404 +f 1391/1506/1391 1404/1520/1404 1392/1507/1392 +f 1392/1507/1392 1404/1520/1404 1393/1521/1393 +f 1392/1507/1392 1393/1521/1393 1381/1508/1381 +f 1393/1509/1393 1405/1522/1405 1406/1523/1406 +f 1393/1509/1393 1406/1523/1406 1394/1510/1394 +f 1394/1510/1394 1406/1523/1406 1407/1524/1407 +f 1394/1510/1394 1407/1524/1407 1395/1511/1395 +f 1395/1511/1395 1407/1524/1407 1408/1525/1408 +f 1395/1511/1395 1408/1525/1408 1396/1512/1396 +f 1396/1512/1396 1408/1525/1408 1409/1526/1409 +f 1396/1512/1396 1409/1526/1409 1397/1513/1397 +f 1397/1513/1397 1409/1526/1409 1410/1527/1410 +f 1397/1513/1397 1410/1527/1410 1398/1514/1398 +f 1398/1514/1398 1410/1527/1410 1411/1528/1411 +f 1398/1514/1398 1411/1528/1411 1399/1515/1399 +f 1399/1515/1399 1411/1528/1411 1412/1529/1412 +f 1399/1515/1399 1412/1529/1412 1400/1516/1400 +f 1400/1516/1400 1412/1529/1412 1413/1530/1413 +f 1400/1516/1400 1413/1530/1413 1401/1517/1401 +f 1401/1517/1401 1413/1530/1413 1414/1531/1414 +f 1401/1517/1401 1414/1531/1414 1402/1518/1402 +f 1402/1518/1402 1414/1531/1414 1415/1532/1415 +f 1402/1518/1402 1415/1532/1415 1403/1519/1403 +f 1403/1519/1403 1415/1532/1415 1416/1533/1416 +f 1403/1519/1403 1416/1533/1416 1404/1520/1404 +f 1404/1520/1404 1416/1533/1416 1405/1534/1405 +f 1404/1520/1404 1405/1534/1405 1393/1521/1393 +f 1405/1522/1405 1417/1535/1417 1418/1536/1418 +f 1405/1522/1405 1418/1536/1418 1406/1523/1406 +f 1406/1523/1406 1418/1536/1418 1419/1537/1419 +f 1406/1523/1406 1419/1537/1419 1407/1524/1407 +f 1407/1524/1407 1419/1537/1419 1420/1538/1420 +f 1407/1524/1407 1420/1538/1420 1408/1525/1408 +f 1408/1525/1408 1420/1538/1420 1421/1539/1421 +f 1408/1525/1408 1421/1539/1421 1409/1526/1409 +f 1409/1526/1409 1421/1539/1421 1422/1540/1422 +f 1409/1526/1409 1422/1540/1422 1410/1527/1410 +f 1410/1527/1410 1422/1540/1422 1423/1541/1423 +f 1410/1527/1410 1423/1541/1423 1411/1528/1411 +f 1411/1528/1411 1423/1541/1423 1424/1542/1424 +f 1411/1528/1411 1424/1542/1424 1412/1529/1412 +f 1412/1529/1412 1424/1542/1424 1425/1543/1425 +f 1412/1529/1412 1425/1543/1425 1413/1530/1413 +f 1413/1530/1413 1425/1543/1425 1426/1544/1426 +f 1413/1530/1413 1426/1544/1426 1414/1531/1414 +f 1414/1531/1414 1426/1544/1426 1427/1545/1427 +f 1414/1531/1414 1427/1545/1427 1415/1532/1415 +f 1415/1532/1415 1427/1545/1427 1428/1546/1428 +f 1415/1532/1415 1428/1546/1428 1416/1533/1416 +f 1416/1533/1416 1428/1546/1428 1417/1547/1417 +f 1416/1533/1416 1417/1547/1417 1405/1534/1405 +f 1417/1535/1417 1429/1548/1429 1430/1549/1430 +f 1417/1535/1417 1430/1549/1430 1418/1536/1418 +f 1418/1536/1418 1430/1549/1430 1431/1550/1431 +f 1418/1536/1418 1431/1550/1431 1419/1537/1419 +f 1419/1537/1419 1431/1550/1431 1432/1551/1432 +f 1419/1537/1419 1432/1551/1432 1420/1538/1420 +f 1420/1538/1420 1432/1551/1432 1433/1552/1433 +f 1420/1538/1420 1433/1552/1433 1421/1539/1421 +f 1421/1539/1421 1433/1552/1433 1434/1553/1434 +f 1421/1539/1421 1434/1553/1434 1422/1540/1422 +f 1422/1540/1422 1434/1553/1434 1435/1554/1435 +f 1422/1540/1422 1435/1554/1435 1423/1541/1423 +f 1423/1541/1423 1435/1554/1435 1436/1555/1436 +f 1423/1541/1423 1436/1555/1436 1424/1542/1424 +f 1424/1542/1424 1436/1555/1436 1437/1556/1437 +f 1424/1542/1424 1437/1556/1437 1425/1543/1425 +f 1425/1543/1425 1437/1556/1437 1438/1557/1438 +f 1425/1543/1425 1438/1557/1438 1426/1544/1426 +f 1426/1544/1426 1438/1557/1438 1439/1558/1439 +f 1426/1544/1426 1439/1558/1439 1427/1545/1427 +f 1427/1545/1427 1439/1558/1439 1440/1559/1440 +f 1427/1545/1427 1440/1559/1440 1428/1546/1428 +f 1428/1546/1428 1440/1559/1440 1429/1560/1429 +f 1428/1546/1428 1429/1560/1429 1417/1547/1417 +f 1429/1548/1429 1/1561/1 2/1562/2 +f 1429/1548/1429 2/1562/2 1430/1549/1430 +f 1430/1549/1430 2/1562/2 3/1563/3 +f 1430/1549/1430 3/1563/3 1431/1550/1431 +f 1431/1550/1431 3/1563/3 4/1564/4 +f 1431/1550/1431 4/1564/4 1432/1551/1432 +f 1432/1551/1432 4/1564/4 5/1565/5 +f 1432/1551/1432 5/1565/5 1433/1552/1433 +f 1433/1552/1433 5/1565/5 6/1566/6 +f 1433/1552/1433 6/1566/6 1434/1553/1434 +f 1434/1553/1434 6/1566/6 7/1567/7 +f 1434/1553/1434 7/1567/7 1435/1554/1435 +f 1435/1554/1435 7/1567/7 8/1568/8 +f 1435/1554/1435 8/1568/8 1436/1555/1436 +f 1436/1555/1436 8/1568/8 9/1569/9 +f 1436/1555/1436 9/1569/9 1437/1556/1437 +f 1437/1556/1437 9/1569/9 10/1570/10 +f 1437/1556/1437 10/1570/10 1438/1557/1438 +f 1438/1557/1438 10/1570/10 11/1571/11 +f 1438/1557/1438 11/1571/11 1439/1558/1439 +f 1439/1558/1439 11/1571/11 12/1572/12 +f 1439/1558/1439 12/1572/12 1440/1559/1440 +f 1440/1559/1440 12/1572/12 1/1573/1 +f 1440/1559/1440 1/1573/1 1429/1560/1429 +# 2880 faces + +g diff --git a/third_party/ktx-src/tests/loadtests/common/reenable_warnings.h b/third_party/ktx-src/tests/loadtests/common/reenable_warnings.h new file mode 100644 index 0000000000000000000000000000000000000000..13ba479dbf22dbc917e144eb34a08ab2b64ffa9d --- /dev/null +++ b/third_party/ktx-src/tests/loadtests/common/reenable_warnings.h @@ -0,0 +1,18 @@ +/* -*- tab-width: 4; -*- */ +/* vi: set sw=2 ts=4 expandtab: */ + +/* + * Copyright 2021 Mark Callow. + * SPDX-License-Identifier: Apache-2.0 + */ + +#if !defined REENABLE_WARNINGS_H + +// Reenable warnings disabled by, e.g. disable_glm_warnings.h. +#if defined(_MSC_VER) + #pragma warning(pop) +#elif defined(__clang__) + #pragma clang diagnostic pop +#endif + +#endif /* REENABLE_WARNINGS_H */ diff --git a/third_party/ktx-src/tests/loadtests/common/vecmath.hpp b/third_party/ktx-src/tests/loadtests/common/vecmath.hpp new file mode 100644 index 0000000000000000000000000000000000000000..c05925dcc1e3eae35e8f7c2a0ba4ff96fdd8be8b --- /dev/null +++ b/third_party/ktx-src/tests/loadtests/common/vecmath.hpp @@ -0,0 +1,448 @@ +/* -*- tab-width: 4; -*- */ +/* vi: set sw=2 ts=4 expandtab: */ + +/* + * Copyright 2016-2020 Mark Callow + * SPDX-License-Identifier: Apache-2.0 + */ + +#ifndef VECMATH_9B7E1CFE346D11E6AFA2D7DC87495A69_H +#define VECMATH_9B7E1CFE346D11E6AFA2D7DC87495A69_H + +/** + * @file + * @~English + * + * @brief Vector math package modelled after GLSL. + */ + +#include +#include + +struct vec2 { + // Anonymous unions are portable. + union { + float x; + float r; + }; + union { + float y; + float g; + }; + + vec2() { }; +}; + +struct vec3 { + union { + float x; + float r; + }; + union { + float y; + float g; + }; + union { + float z; + float b; + }; + + vec3() { } + + vec3(float x, float y, float z) : x(x), y(y), z(z) { } + + vec3(const vec3& value) + : x(value.x), y(value.y), z(value.z) { } + + vec3 operator-() const + { + return vec3(-x, -y, -z); + } + + vec3 operator-(const vec3& value) const + { + return vec3(this->x - value.x, this->y - value.y, this->z - value.z); + } + + vec3 operator/(float divisor) const + { + return vec3(x / divisor, y / divisor, z / divisor); + } + + vec3& operator/=(float divisor) + { + x /= divisor; + y /= divisor; + z /= divisor; + return *this; + } + + vec3& operator=(const vec3& value) + { + x = value.x; + y = value.y; + z = value.z; + return *this; + } + + float operator[](int i) const + { + switch (i) { + case 0: return x; + case 1: return y; + case 2: return z; + default: + assert(false); + return z; + } + } + + float& operator[](int i) + { + switch (i) { + case 0: return x; + case 1: return y; + case 2: return z; + default: + assert(false); + return z; + } + } + + vec3 cross(const vec3& value) const + { + return vec3::cross(*this, value); + } + + float dot(const vec3& vec) const + { + return vec3::dot(*this, vec); + } + + float length() const + { + return sqrt(dot(*this)); + } + + vec3& normalize() + { + float length = this->length(); + return (length > 0.0f ? *this /= length : *this); + } + + static vec3 cross(const vec3& a, const vec3& b) + { + return vec3(a.y * b.z - a.z * b.y, + a.z * b.x - a.x * b.z, + a.x * b.y - a.y * b.x); + } + + static float dot(const vec3& a, const vec3& b) + { + return a.x * b.x + a.y * b.y + a.z * b.z; + } + + static vec3 normalize (const vec3& input) + { + float length = input.length(); + return (length > 0.0f ? input / length : input); + } +}; + + +struct vec4 { + + union { + float x; + float r; + }; + union { + float y; + float g; + }; + union { + float z; + float b; + }; + union { + float w; + float a; + }; + + vec4() { } + + vec4(float x, float y, float z, float w) : x(x), y(y), z(z), w(w) { } + + vec4(const vec3& value, float w) + : x(value.x), y(value.y), z(value.z), w(w) { } + + vec4(const vec4& value) + : x(value.x), y(value.y), z(value.z), w(value.w) { } + + vec4 operator/(float divisor) const + { + return vec4(x / divisor, y / divisor, z / divisor, w / divisor); + } + + vec4& operator/=(float divisor) + { + x /= divisor; + y /= divisor; + z /= divisor; + w /= divisor; + return *this; + } + + vec4 operator*(float multiplicand) const + { + return vec4(x * multiplicand, y * multiplicand, z * multiplicand, + w * multiplicand); + } + + vec4& operator=(const vec4& value) + { + x = value.x; + y = value.y; + z = value.z; + w = value.w; + return *this; + } + + float operator[](int i) const + { + switch (i) { + case 0: return x; + case 1: return y; + case 2: return z; + case 3: return w; + default: + assert(false); + return z; + } + } + + float& operator[](int i) + { + switch (i) { + case 0: return x; + case 1: return y; + case 2: return z; + case 3: return w; + default: + assert(false); + return z; + } + } + + float dot(const vec4& vec) const + { + return vec4::dot(*this, vec); + } + + float length() const + { + return sqrt(dot(*this)); + } + + static float dot(const vec4& a, const vec4& b) + { + return a.x * b.x + a.y * b.y + a.z * b.z + a.w * b.w; + } + + static vec4 normalize (const vec4& input) + { + float length = input.length(); + return (length > 0.0f ? input / length : input); + } +}; + +struct mat3 { + vec3 m[3]; + + mat3() + { + m[0] = vec3(1.0f, 0.0f, 0.0f); + m[1] = vec3(0.0f, 1.0f, 0.0f); + m[2] = vec3(0.0f, 0.0f, 1.0f); + } + + mat3(const vec3& value1, const vec3& value2, const vec3& value3) + { + m[0] = value1; + m[1] = value2; + m[2] = value3; + } + + mat3 transpose() const + { + return mat3(vec3(m[0].x, m[1].x, m[2].x), + vec3(m[0].y, m[1].y, m[2].y), + vec3(m[0].z, m[1].z, m[2].z)); + } +}; + +struct mat4 { + vec4 m[4]; + + mat4() + { + m[0] = vec4(1.0f, 0.0f, 0.0f, 0.0f); + m[1] = vec4(0.0f, 1.0f, 0.0f, 0.0f); + m[2] = vec4(0.0f, 0.0f, 1.0f, 0.0f); + m[3] = vec4(0.0f, 0.0f, 0.0f, 1.0f); + } + + mat4(const vec4& value1, const vec4& value2, + const vec4& value3, const vec4& value4) + { + m[0] = value1; + m[1] = value2; + m[2] = value3; + m[3] = value4; + } + + mat4 operator*(float value) const + { + return mat4(m[0] * value, m[1] * value, m[2] * value, m[3] * value); + } + + mat4 operator*(const mat4& value) const + { + mat4 right = value.transpose(); + return mat4( + vec4(m[0].dot(right.m[0]), m[0].dot(right.m[1]), + m[0].dot(right.m[2]), m[0].dot(right.m[3])), + vec4(m[1].dot(right.m[0]), m[1].dot(right.m[1]), + m[1].dot(right.m[2]), m[1].dot(right.m[3])), + vec4(m[2].dot(right.m[0]), m[2].dot(right.m[1]), + m[2].dot(right.m[2]), m[2].dot(right.m[3])), + vec4(m[3].dot(right.m[0]), m[3].dot(right.m[1]), + m[3].dot(right.m[2]), m[3].dot(right.m[3])) + ); + } + + vec4 operator*(const vec4& value) const + { + return vec4(m[0].dot(value), m[1].dot(value), + m[2].dot(value), m[3].dot(value)); + } + + vec4& operator[](int i) + { + return m[i]; + } + + mat4 transpose() const + { + return mat4(vec4(m[0][0], m[1][0], m[2][0], m[3][0]), + vec4(m[0][1], m[1][1], m[2][1], m[3][1]), + vec4(m[0][2], m[1][2], m[2][2], m[3][2]), + vec4(m[0][3], m[1][3], m[2][3], m[3][3])); + } + + static mat4 translate(const vec3& trans) + { + return mat4(vec4(1.0f, 0.0f, 0.0f, trans.x), + vec4(0.0f, 1.0f, 0.0f, trans.y), + vec4(0.0f, 0.0f, 1.0f, trans.z), + vec4(0.0f, 0.0f, 0.0f, 1.0f)); + } + + static mat4 translate(float x, float y, float z) + { + return mat4(vec4(1.0f, 0.0f, 0.0f, x), + vec4(0.0f, 1.0f, 0.0f, y), + vec4(0.0f, 0.0f, 1.0f, z), + vec4(0.0f, 0.0f, 0.0f, 1.0f)); + } + + static mat4 scale(const vec3& scale) + { + return mat4(vec4(scale.x, 0.0f, 0.0f, 0.0f), + vec4(0.0f, scale.y, 0.0f, 0.0f), + vec4(0.0f, 0.0f, scale.z, 0.0f), + vec4(0.0f, 0.0f, 0.0f, 1.0f)); + } + + static mat4 scale(float x, float y, float z) + { + return mat4(vec4(x, 0.0f, 0.0f, 0.0f), + vec4(0.0f, y, 0.0f, 0.0f), + vec4(0.0f, 0.0f, z, 0.0f), + vec4(0.0f, 0.0f, 0.0f, 1.0f)); + } + + static mat4 frustum(float left, float right, float bottom, float top, + float zNear, float zFar) + { + return mat4( + vec4(2.0f * zNear / (right - left), 0.0f, + (right + left) / (right - left), 0.0f), + vec4(0.0f, 2.0f * zNear / (top - bottom), + (top + bottom) / (top - bottom), 0.0f), + vec4(0.0f, 0.0f, (zFar + zNear) / (zNear - zFar), + 2.0f * zFar * zNear / (zNear - zFar)), + vec4(0.0f, 0.0f, -1.0f, 0.0f) + ); + } + + static mat4 ortho(float left, float right, float bottom, float top, + float zNear, float zFar) + { + return mat4( + vec4(2.0f / (right - left), 0.0f, 0.0f, + (right + left) / (left - right)), + vec4(0.0f, 2.0f / (top - bottom), 0.0f, + (top + bottom) / (bottom - top)), + vec4(0.0f, 0.0f, 2.0f / (zNear - zFar), + (zFar + zNear) / (zNear - zFar)), + vec4(0.0f, 0.0f, 0.0f, 1.0f) + ); + } + + static mat4 lookAt(const vec3& eye, const vec3& center, const vec3& up) + { + vec3 const forward(vec3::normalize(center - eye)); + vec3 const side(vec3::normalize(vec3::cross(forward, up))); + vec3 const u(vec3::cross(side, forward)); + + mat4 result; + result[0][0] = side.x; + result[1][0] = side.y; + result[2][0] = side.z; + result[0][1] = u.x; + result[1][1] = u.y; + result[2][1] = u.z; + result[0][2] =-forward.x; + result[1][2] =-forward.y; + result[2][2] =-forward.z; + result[3][0] =-vec3::dot(side, eye); + result[3][1] =-vec3::dot(u, eye); + result[3][2] = vec3::dot(forward, eye); + + return result; + } + + static mat4 lookAt(float eyeX, float eyeY, float eyeZ, + float centerX, float centerY, float centerZ, + float upX, float upY, float upZ) + { + return mat4::lookAt(vec3(eyeX, eyeY, eyeZ), + vec3(centerX, centerY, centerZ), + vec3(upX, upY, upZ)); + } + + static mat4 perspective(float fovY, float aspect, float zNear, float zFar) + { + float scaleY = 1.0f / tan(fovY * 3.1415962f / 360.0f); + return mat4( + vec4(scaleY / aspect, 0.0f, 0.0f, 0.0f), + vec4(0.0f, scaleY, 0.0f, 0.0f), + vec4(0.0f, 0.0f, (zFar + zNear) / (zNear - zFar), + (2.0f * zFar * zNear) / (zNear - zFar)), + vec4(0.0f, 0.0f, -1.0f, 0.0f) + ); + } +}; + +#endif /* VECMATH_9B7E1CFE-346D-11E6-AFA2-D7DC87495A69_H */ diff --git a/third_party/ktx-src/tests/loadtests/compile_shader.cmake b/third_party/ktx-src/tests/loadtests/compile_shader.cmake new file mode 100644 index 0000000000000000000000000000000000000000..fe0734c52e801f4238570bb6417b8e7096f46db3 --- /dev/null +++ b/third_party/ktx-src/tests/loadtests/compile_shader.cmake @@ -0,0 +1,80 @@ +# Copyright 2020 Andreas Atteneder +# SPDX-License-Identifier: Apache-2.0 + +function(compile_shader shader_target shader_name shader_src_path shader_path) + + set(vert_name "${shader_name}.vert") + set(vert2spirv_in "${shader_src_path}/${vert_name}") + set(vert2spirv_out "${CMAKE_CURRENT_BINARY_DIR}/${shader_path}/${vert_name}.spv") + + add_custom_command(OUTPUT + ${vert2spirv_out} + COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/${shader_path} + COMMAND glslc "-fshader-stage=vertex" -o "${vert2spirv_out}" "${vert2spirv_in}" + DEPENDS ${vert2spirv_in} + WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR} + COMMENT "Compiling ${vert_name}." + VERBATIM + ) + + set(frag_name "${shader_name}.frag") + set(frag2spirv_in "${shader_src_path}/${frag_name}") + set(frag2spirv_out "${CMAKE_CURRENT_BINARY_DIR}/${shader_path}/${frag_name}.spv") + + add_custom_command(OUTPUT + ${frag2spirv_out} + COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/${shader_path} + COMMAND glslc "-fshader-stage=fragment" -o "${frag2spirv_out}" "${frag2spirv_in}" + DEPENDS ${frag2spirv_in} + WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR} + COMMENT "Compiling ${frag_name}." + VERBATIM + ) + + add_custom_target( + ${shader_target} + DEPENDS + ${vert2spirv_out} + ${frag2spirv_out} + SOURCES + ${vert2spirv_in} + ${frag2spirv_in} + ) + + set_target_properties(${shader_target} PROPERTIES EXCLUDE_FROM_ALL "FALSE") + + set(SHADER_SOURCES ${SHADER_SOURCES} ${frag2spirv_out} ${vert2spirv_out} PARENT_SCOPE) + +endfunction(compile_shader) + +function(compile_shader_list shader_target shader_src_path shader_path) + + foreach(shader ${ARGN}) + set(spirv_in "${shader_src_path}/${shader}") + set(spirv_out "${CMAKE_CURRENT_BINARY_DIR}/${shader_path}/${shader}.spv") + + add_custom_command(OUTPUT + ${spirv_out} + COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/${shader_path} + COMMAND glslc -o "${spirv_out}" "${spirv_in}" + DEPENDS ${spirv_in} + WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR} + COMMENT "Compiling ${shader}." + VERBATIM + ) + + list(APPEND inputs ${spirv_in}) + list(APPEND outputs ${spirv_out}) + endforeach() + + add_custom_target( + ${shader_target} + DEPENDS ${outputs} + SOURCES ${inputs} + ) + + set_target_properties(${shader_target} PROPERTIES EXCLUDE_FROM_ALL "FALSE") + + set(SHADER_SOURCES ${SHADER_SOURCES} ${outputs} PARENT_SCOPE) + +endfunction() diff --git a/third_party/ktx-src/tests/loadtests/geom/cube.h b/third_party/ktx-src/tests/loadtests/geom/cube.h new file mode 100644 index 0000000000000000000000000000000000000000..832f947ca6c8e9ec1656036c954a437b6799057f --- /dev/null +++ b/third_party/ktx-src/tests/loadtests/geom/cube.h @@ -0,0 +1,72 @@ +/* + * Copyright 2016-2020 Mark Callow + * SPDX-License-Identifier: Apache-2.0 + */ + +static const float cube_face[] = +{ + -1.0f, +1.0f, +1.0f, /* Front */ + +1.0f, -1.0f, +1.0f, + +1.0f, +1.0f, +1.0f, + -1.0f, -1.0f, +1.0f, + -1.0f, +1.0f, -1.0f, /* Back */ + +1.0f, -1.0f, -1.0f, + +1.0f, +1.0f, -1.0f, + -1.0f, -1.0f, -1.0f, + +1.0f, -1.0f, +1.0f, /* Right */ + +1.0f, +1.0f, -1.0f, + +1.0f, +1.0f, +1.0f, + +1.0f, -1.0f, -1.0f, + -1.0f, -1.0f, +1.0f, /* Left */ + -1.0f, +1.0f, -1.0f, + -1.0f, +1.0f, +1.0f, + -1.0f, -1.0f, -1.0f, + -1.0f, -1.0f, +1.0f, /* Bottom */ + +1.0f, -1.0f, -1.0f, + +1.0f, -1.0f, +1.0f, + -1.0f, -1.0f, -1.0f, + -1.0f, +1.0f, +1.0f, /* Top */ + +1.0f, +1.0f, -1.0f, + +1.0f, +1.0f, +1.0f, + -1.0f, +1.0f, -1.0f, +}; +#define CUBE_NUM_FACE_COMPONENTS 3 +#define CUBE_FACE_STRIDE (sizeof(float) * CUBE_NUM_FACE_COMPONENTS) + +static const float cube_color[] = /* almost random colors */ +{ + 0.7f, 0.1f, 0.2f, 0.0f, 0.8f, 0.9f, 0.3f, 0.0f, 0.4f, 1.0f, 0.5f, 0.0f, 0.0f, 0.6f, 0.1f, 0.0f, + 0.8f, 0.2f, 0.3f, 0.0f, 0.9f, 1.0f, 0.4f, 0.0f, 0.5f, 0.0f, 0.6f, 0.0f, 0.1f, 0.7f, 0.2f, 0.0f, + 0.9f, 0.3f, 0.4f, 0.0f, 1.0f, 0.0f, 0.5f, 0.0f, 0.6f, 0.1f, 0.7f, 0.0f, 0.2f, 0.8f, 0.3f, 0.0f, + 1.0f, 0.4f, 0.5f, 0.0f, 0.0f, 0.1f, 0.6f, 0.0f, 0.7f, 0.2f, 0.8f, 0.0f, 0.3f, 0.9f, 0.4f, 0.0f, + 0.0f, 0.5f, 0.6f, 0.0f, 0.1f, 0.2f, 0.7f, 0.0f, 0.8f, 0.3f, 0.9f, 0.0f, 0.4f, 1.0f, 0.5f, 0.0f, + 0.1f, 0.6f, 0.7f, 0.0f, 0.2f, 0.3f, 0.8f, 0.0f, 0.9f, 0.4f, 1.0f, 0.0f, 0.5f, 0.0f, 0.6f, 0.0f, +}; +static const float cube_texture[] = +{ + 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, + 1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, + 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, + 1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, + 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, + 1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f +}; +static const float cube_normal[] = +{ + 0.0f, 0.0f, +1.0f, 0.0f, 0.0f, +1.0f, 0.0f, 0.0f, +1.0f, 0.0f, 0.0f, +1.0f, + 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, -1.0f, + +1.0f, 0.0f, 0.0f, +1.0f, 0.0f, 0.0f, +1.0f, 0.0f, 0.0f, +1.0f, 0.0f, 0.0f, + -1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, + 0.0f, -1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, -1.0f, 0.0f, + 0.0f, +1.0f, 0.0f, 0.0f, +1.0f, 0.0f, 0.0f, +1.0f, 0.0f, 0.0f, +1.0f, 0.0f, +}; + +static const unsigned short cube_index_buffer[] = { + 0, 3, 1, 2, 0, 1, /* Front */ + 6, 5, 4, 5, 7, 4, /* Back */ + 8,11, 9,10, 8, 9, /* Right */ + 15,12,13,12,14,13, /* Left */ + 16,19,17,18,16,17, /* Bottom */ + 23,20,21,20,22,21 /* Top */ +}; +#define CUBE_NUM_INDICES (sizeof(cube_index_buffer) / sizeof(unsigned short)) diff --git a/third_party/ktx-src/tests/loadtests/geom/cube_data.h b/third_party/ktx-src/tests/loadtests/geom/cube_data.h new file mode 100644 index 0000000000000000000000000000000000000000..e5b47070d6ae2ede323e3564bb727bc99127421c --- /dev/null +++ b/third_party/ktx-src/tests/loadtests/geom/cube_data.h @@ -0,0 +1,155 @@ +/* + * Vulkan Samples + * + * Copyright 2015-2016 Valve Corporation + * Copyright 2015-2016 LunarG, Inc. + * SPDX-License-Identifier: Apache-2.0 + */ + +//-------------------------------------------------------------------------------------- +// Mesh and VertexFormat Data +//-------------------------------------------------------------------------------------- +struct Vertex { + float posX, posY, posZ, posW; // Position data + float r, g, b, a; // Color +}; + +struct VertexUV { + float posX, posY, posZ, posW; // Position data + float u, v; // texture u,v +}; + +#define XYZ1(_x_, _y_, _z_) (_x_), (_y_), (_z_), 1.f +#define UV(_u_, _v_) (_u_), (_v_) + +static const Vertex g_vbData[] = { + {XYZ1(-1, -1, -1), XYZ1(0.f, 0.f, 0.f)}, + {XYZ1(1, -1, -1), XYZ1(1.f, 0.f, 0.f)}, + {XYZ1(-1, 1, -1), XYZ1(0.f, 1.f, 0.f)}, + {XYZ1(-1, 1, -1), XYZ1(0.f, 1.f, 0.f)}, + {XYZ1(1, -1, -1), XYZ1(1.f, 0.f, 0.f)}, + {XYZ1(1, 1, -1), XYZ1(1.f, 1.f, 0.f)}, + + {XYZ1(-1, -1, 1), XYZ1(0.f, 0.f, 1.f)}, + {XYZ1(-1, 1, 1), XYZ1(0.f, 1.f, 1.f)}, + {XYZ1(1, -1, 1), XYZ1(1.f, 0.f, 1.f)}, + {XYZ1(1, -1, 1), XYZ1(1.f, 0.f, 1.f)}, + {XYZ1(-1, 1, 1), XYZ1(0.f, 1.f, 1.f)}, + {XYZ1(1, 1, 1), XYZ1(1.f, 1.f, 1.f)}, + + {XYZ1(1, 1, 1), XYZ1(1.f, 1.f, 1.f)}, + {XYZ1(1, 1, -1), XYZ1(1.f, 1.f, 0.f)}, + {XYZ1(1, -1, 1), XYZ1(1.f, 0.f, 1.f)}, + {XYZ1(1, -1, 1), XYZ1(1.f, 0.f, 1.f)}, + {XYZ1(1, 1, -1), XYZ1(1.f, 1.f, 0.f)}, + {XYZ1(1, -1, -1), XYZ1(1.f, 0.f, 0.f)}, + + {XYZ1(-1, 1, 1), XYZ1(0.f, 1.f, 1.f)}, + {XYZ1(-1, -1, 1), XYZ1(0.f, 0.f, 1.f)}, + {XYZ1(-1, 1, -1), XYZ1(0.f, 1.f, 0.f)}, + {XYZ1(-1, 1, -1), XYZ1(0.f, 1.f, 0.f)}, + {XYZ1(-1, -1, 1), XYZ1(0.f, 0.f, 1.f)}, + {XYZ1(-1, -1, -1), XYZ1(0.f, 0.f, 0.f)}, + + {XYZ1(1, 1, 1), XYZ1(1.f, 1.f, 1.f)}, + {XYZ1(-1, 1, 1), XYZ1(0.f, 1.f, 1.f)}, + {XYZ1(1, 1, -1), XYZ1(1.f, 1.f, 0.f)}, + {XYZ1(1, 1, -1), XYZ1(1.f, 1.f, 0.f)}, + {XYZ1(-1, 1, 1), XYZ1(0.f, 1.f, 1.f)}, + {XYZ1(-1, 1, -1), XYZ1(0.f, 1.f, 0.f)}, + + {XYZ1(1, -1, 1), XYZ1(1.f, 0.f, 1.f)}, + {XYZ1(1, -1, -1), XYZ1(1.f, 0.f, 0.f)}, + {XYZ1(-1, -1, 1), XYZ1(0.f, 0.f, 1.f)}, + {XYZ1(-1, -1, 1), XYZ1(0.f, 0.f, 1.f)}, + {XYZ1(1, -1, -1), XYZ1(1.f, 0.f, 0.f)}, + {XYZ1(-1, -1, -1), XYZ1(0.f, 0.f, 0.f)}, +}; + +static const Vertex g_vb_solid_face_colors_Data[] = { + {XYZ1(-1, -1, -1), XYZ1(1.f, 0.f, 0.f)}, + {XYZ1(1, -1, -1), XYZ1(1.f, 0.f, 0.f)}, + {XYZ1(-1, 1, -1), XYZ1(1.f, 0.f, 0.f)}, + {XYZ1(-1, 1, -1), XYZ1(1.f, 0.f, 0.f)}, + {XYZ1(1, -1, -1), XYZ1(1.f, 0.f, 0.f)}, + {XYZ1(1, 1, -1), XYZ1(1.f, 0.f, 0.f)}, + + {XYZ1(-1, -1, 1), XYZ1(0.f, 1.f, 0.f)}, + {XYZ1(-1, 1, 1), XYZ1(0.f, 1.f, 0.f)}, + {XYZ1(1, -1, 1), XYZ1(0.f, 1.f, 0.f)}, + {XYZ1(1, -1, 1), XYZ1(0.f, 1.f, 0.f)}, + {XYZ1(-1, 1, 1), XYZ1(0.f, 1.f, 0.f)}, + {XYZ1(1, 1, 1), XYZ1(0.f, 1.f, 0.f)}, + + {XYZ1(1, 1, 1), XYZ1(0.f, 0.f, 1.f)}, + {XYZ1(1, 1, -1), XYZ1(0.f, 0.f, 1.f)}, + {XYZ1(1, -1, 1), XYZ1(0.f, 0.f, 1.f)}, + {XYZ1(1, -1, 1), XYZ1(0.f, 0.f, 1.f)}, + {XYZ1(1, 1, -1), XYZ1(0.f, 0.f, 1.f)}, + {XYZ1(1, -1, -1), XYZ1(0.f, 0.f, 1.f)}, + + {XYZ1(-1, 1, 1), XYZ1(1.f, 1.f, 0.f)}, + {XYZ1(-1, -1, 1), XYZ1(1.f, 1.f, 0.f)}, + {XYZ1(-1, 1, -1), XYZ1(1.f, 1.f, 0.f)}, + {XYZ1(-1, 1, -1), XYZ1(1.f, 1.f, 0.f)}, + {XYZ1(-1, -1, 1), XYZ1(1.f, 1.f, 0.f)}, + {XYZ1(-1, -1, -1), XYZ1(1.f, 1.f, 0.f)}, + + {XYZ1(1, 1, 1), XYZ1(1.f, 0.f, 1.f)}, + {XYZ1(-1, 1, 1), XYZ1(1.f, 0.f, 1.f)}, + {XYZ1(1, 1, -1), XYZ1(1.f, 0.f, 1.f)}, + {XYZ1(1, 1, -1), XYZ1(1.f, 0.f, 1.f)}, + {XYZ1(-1, 1, 1), XYZ1(1.f, 0.f, 1.f)}, + {XYZ1(-1, 1, -1), XYZ1(1.f, 0.f, 1.f)}, + + {XYZ1(1, -1, 1), XYZ1(0.f, 1.f, 1.f)}, + {XYZ1(1, -1, -1), XYZ1(0.f, 1.f, 1.f)}, + {XYZ1(-1, -1, 1), XYZ1(0.f, 1.f, 1.f)}, + {XYZ1(-1, -1, 1), XYZ1(0.f, 1.f, 1.f)}, + {XYZ1(1, -1, -1), XYZ1(0.f, 1.f, 1.f)}, + {XYZ1(-1, -1, -1), XYZ1(0.f, 1.f, 1.f)}, +}; + +static const VertexUV g_vb_texture_Data[] = { + {XYZ1(-1, -1, -1), UV(0.f, 0.f)}, + {XYZ1(-1, 1, 1), UV(1.f, 1.f)}, + {XYZ1(-1, -1, 1), UV(1.f, 0.f)}, + {XYZ1(-1, 1, 1), UV(1.f, 1.f)}, + {XYZ1(-1, -1, -1), UV(0.f, 0.f)}, + {XYZ1(-1, 1, -1), UV(0.f, 1.f)}, + + {XYZ1(-1, -1, -1), UV(1.f, 0.f)}, + {XYZ1(1, -1, -1), UV(0.f, 0.f)}, + {XYZ1(1, 1, -1), UV(0.f, 1.f)}, + {XYZ1(-1, -1, -1), UV(1.f, 0.f)}, + {XYZ1(1, 1, -1), UV(0.f, 1.f)}, + {XYZ1(-1, 1, -1), UV(1.f, 1.f)}, + + {XYZ1(-1, -1, -1), UV(1.f, 1.f)}, + {XYZ1(1, -1, 1), UV(0.f, 0.f)}, + {XYZ1(1, -1, -1), UV(1.f, 0.f)}, + {XYZ1(-1, -1, -1), UV(1.f, 1.f)}, + {XYZ1(-1, -1, 1), UV(0.f, 1.f)}, + {XYZ1(1, -1, 1), UV(0.f, 0.f)}, + + {XYZ1(-1, 1, -1), UV(1.f, 1.f)}, + {XYZ1(1, 1, 1), UV(0.f, 0.f)}, + {XYZ1(-1, 1, 1), UV(0.f, 1.f)}, + {XYZ1(-1, 1, -1), UV(1.f, 1.f)}, + {XYZ1(1, 1, -1), UV(1.f, 0.f)}, + {XYZ1(1, 1, 1), UV(0.f, 0.f)}, + + {XYZ1(1, 1, -1), UV(1.f, 1.f)}, + {XYZ1(1, -1, 1), UV(0.f, 0.f)}, + {XYZ1(1, 1, 1), UV(0.f, 1.f)}, + {XYZ1(1, -1, 1), UV(0.f, 0.f)}, + {XYZ1(1, 1, -1), UV(1.f, 1.f)}, + {XYZ1(1, -1, -1), UV(1.f, 0.f)}, + + {XYZ1(-1, 1, 1), UV(0.f, 1.f)}, + {XYZ1(1, 1, 1), UV(1.f, 1.f)}, + {XYZ1(-1, -1, 1), UV(0.f, 0.f)}, + {XYZ1(-1, -1, 1), UV(0.f, 0.f)}, + {XYZ1(1, 1, 1), UV(1.f, 1.f)}, + {XYZ1(1, -1, 1), UV(1.f, 0.f)}, +}; diff --git a/third_party/ktx-src/tests/loadtests/geom/frame.h b/third_party/ktx-src/tests/loadtests/geom/frame.h new file mode 100644 index 0000000000000000000000000000000000000000..0ecec3d71ac9ae3ff5818300339c8f9997148179 --- /dev/null +++ b/third_party/ktx-src/tests/loadtests/geom/frame.h @@ -0,0 +1,23 @@ +/* + * Copyright 2016-2020 Mark Callow + * SPDX-License-Identifier: Apache-2.0 + */ + +/* + * Frame definition + */ +static const GLbyte frame_position[] = +{ + -1, -1, 0, + 1, -1, 0, + 1, 1, 0, + -1, 1, 0 +}; + +static const GLbyte frame_color[] = +{ + 1, 1, 0, + 1, 1, 0, + 1, 1, 0, + 1, 1, 0 +}; diff --git a/third_party/ktx-src/tests/loadtests/geom/quad.h b/third_party/ktx-src/tests/loadtests/geom/quad.h new file mode 100644 index 0000000000000000000000000000000000000000..2473534c18373bb70f7146d675f0fef125e3fc60 --- /dev/null +++ b/third_party/ktx-src/tests/loadtests/geom/quad.h @@ -0,0 +1,34 @@ +/* -*- tab-width: 4; -*- */ +/* vi: set et sw=2 ts=4 expandtab: */ + +/* + * Copyright 2016-2020 Mark Callow + * SPDX-License-Identifier: Apache-2.0 + */ + +/* + * Quad definition + */ +static const GLfloat quad_position[] = +{ + 1.0f, -1.0f, 0, + 1.0f, 1.0f, 0, + -1.0f, -1.0f, 0, + -1.0f, 1.0f, 0 +}; + +static const GLfloat quad_color[] = +{ + 0.7f, 0.1f, 0.2f, + 0.8f, 0.9f, 0.3f, + 0.4f, 1.0f, 0.5f, + 0.0f, 0.6f, 0.1f +}; + +static GLfloat quad_texture[] = +{ + 1.0f, 0.0f, + 1.0f, 1.0f, + 0.0f, 0.0f, + 0.0f, 1.0f +}; diff --git a/third_party/ktx-src/tests/loadtests/glloadtests.cmake b/third_party/ktx-src/tests/loadtests/glloadtests.cmake new file mode 100644 index 0000000000000000000000000000000000000000..c8b06c69e3f3f49d72f3bc8434e2126c1f79dbc7 --- /dev/null +++ b/third_party/ktx-src/tests/loadtests/glloadtests.cmake @@ -0,0 +1,449 @@ +# Copyright 2020 Andreas Atteneder +# SPDX-License-Identifier: Apache-2.0 + +set(OPENGL_ES_EMULATOR "" CACHE PATH "Path to OpenGL ES emulation libraries") + +if(NOT APPLE_LOCKED_OS) + find_package(OpenGL REQUIRED) +endif() +if(WIN32) + find_package(GLEW REQUIRED) +endif() + +function( create_gl_target target version sources common_resources test_images + KTX_GL_CONTEXT_PROFILE + KTX_GL_CONTEXT_MAJOR_VERSION KTX_GL_CONTEXT_MINOR_VERSION + EMULATE_GLES) + + set( resources ${common_resources};${test_images} ) + + add_executable( ${target} + ${EXE_FLAG} + glloadtests.cmake + ${sources} + ${resources} + ) + + set_code_sign(${target}) + + # Nota Bene. + # + # 1. With the Visual Studio generator, at least, The SDL and GLEW + # includes coming from GLAppSDL are being converted to system + # includes. To see them in VS, view the whole command line in + # the compile section of the project properties and look at the + # Additional Options pane at the bottom. + # 2. GL_APP_SDL's INTERFACE_INCLUDE_DIRECTORIES includes the SYSTEM + # include from appfwSDL. + # + # I do not understand the reasons for either of these. + target_include_directories( + ${target} + PRIVATE + $ + $ + $ + ) + + set_target_properties(${target} PROPERTIES + CXX_VISIBILITY_PRESET ${STATIC_APP_LIB_SYMBOL_VISIBILITY} + ) + + + target_link_libraries( + ${target} + objUtil + GLAppSDL + appfwSDL + ktx + ) + + if(NOT EMSCRIPTEN AND NOT EMULATE_GLES) + target_link_libraries( + ${target} + ${OPENGL_LIBRARIES} + ) + endif() + + if(APPLE) + if(IOS) + # This is location where CMake puts the configured Info.plist. + # I have not found a CMake variable for this. + set( launch_screen ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${target}.dir/LaunchScreen.storyboard ) + configure_file( glloadtests/resources/ios/LaunchScreen.storyboard.in + ${launch_screen} + ) + set( INFO_PLIST_IN "${PROJECT_SOURCE_DIR}/tests/loadtests/glloadtests/resources/ios/Info.plist.in" ) + set( icon_launch_assets + ${PROJECT_SOURCE_DIR}/icons/ios/CommonIcons.xcassets + glloadtests/resources/ios/LaunchImages.xcassets + ${launch_screen} + ) + target_sources( ${target} + PRIVATE + ${PROJECT_SOURCE_DIR}/icons/ios/CommonIcons.xcassets + glloadtests/resources/ios/LaunchImages.xcassets + glloadtests/resources/ios/LaunchScreen.storyboard.in + ) + # Add to resources so they'll be copied to the bundle. + list( APPEND resources ${icon_launch_assets} ) + target_link_libraries( + ${target} + ${AudioToolbox_LIBRARY} + ${AVFoundation_LIBRARY} + ${CoreAudio_LIBRARY} + ${CoreBluetooth_LIBRARY} + ${CoreGraphics_LIBRARY} + ${CoreMotion_LIBRARY} + ${CoreHaptics_LIBRARY} + ${Foundation_LIBRARY} + ${GameController_LIBRARY} + ${Metal_LIBRARY} + ${OpenGLES_LIBRARY} + ${QuartzCore_LIBRARY} + ${UIKit_LIBRARY} + ) + else() + set( INFO_PLIST_IN "${PROJECT_SOURCE_DIR}/tests/loadtests/glloadtests/resources/mac/Info.plist.in" ) + endif() + elseif(EMSCRIPTEN) + # Beware of de-duplication in list expansion for commands and options. + # SHELL: prevents it but if they are separate items in the list they + # be de-duplicated. + list( TRANSFORM test_images REPLACE + "(${PROJECT_SOURCE_DIR}/tests/testimages/([a-zA-Z0-9_].*$))" + "SHELL:--preload-file \\1@\\2" + OUTPUT_VARIABLE preloads + ) + target_link_options( + ${target} + PRIVATE + "SHELL:--source-map-base ./" + ${preloads} + "SHELL:--exclude-file '${PROJECT_SOURCE_DIR}/tests/testimages/cubemap*'" + "SHELL:--use-port=sdl3" + "SHELL:-s ALLOW_MEMORY_GROWTH=1" + "SHELL:-s DISABLE_EXCEPTION_CATCHING=0" + "SHELL:-s USE_WEBGL2=1" + ) + elseif(WIN32) + target_sources( + ${target} + PRIVATE + glloadtests/resources/win/glloadtests.rc + glloadtests/resources/win/resource.h + ) + if(EMULATE_GLES) + if (KTX_GL_CONTEXT_MAJOR_VERSION EQUAL 1) + target_link_libraries( + ${target} + "${OPENGL_ES_EMULATOR}/libGLES_CM.lib" + "${OPENGL_ES_EMULATOR}/libEGL.lib" + ) + else() + target_link_libraries( + ${target} + "${OPENGL_ES_EMULATOR}/libGLESv2.lib" + "${OPENGL_ES_EMULATOR}/libEGL.lib" + ) + endif() + else() + target_link_libraries( + ${target} + ${GLEW_LIBRARIES} + ) + endif() + ensure_runtime_dependencies_windows(${target}) + elseif(LINUX) + # The output file is configured at CMake config time. + configure_file(glloadtests/resources/linux/glloadtests.desktop.in + ${CMAKE_CURRENT_BINARY_DIR}/${target}.desktop + ) + target_sources( + ${target} + PRIVATE + # Put the input file in sources as that is what must be edited. + glloadtests/resources/linux/glloadtests.desktop.in + #${CMAKE_CURRENT_BINARY_DIR}/${target}.desktop + ) + endif() + + target_link_libraries( ${target} ${LOAD_TEST_COMMON_LIBS} ) + + if(NOT EMULATE_GLES OR KTX_GL_CONTEXT_MAJOR_VERSION GREATER 1) + target_compile_definitions( + ${target} + PRIVATE + $ + GL_CONTEXT_PROFILE=${KTX_GL_CONTEXT_PROFILE} + GL_CONTEXT_MAJOR_VERSION=${KTX_GL_CONTEXT_MAJOR_VERSION} + GL_CONTEXT_MINOR_VERSION=${KTX_GL_CONTEXT_MINOR_VERSION} + $<$:NOMINMAX> + ) + else() + target_compile_definitions( + ${target} + PRIVATE + $ + $<$:NOMINMAX> + ) + endif() + + set_target_properties( ${target} PROPERTIES RESOURCE "${resources}" ) + + if(APPLE) + set(product_name "${target}") + set( bundle_identifier org.khronos.ktx.${product_name} ) + # This property must be set to avoid an Xcode warning. + set_target_properties(${target} PROPERTIES XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER "org.khronos.ktx.${product_name}") + # See important comment about MACOSX_BUNDLE_INFO_PLIST and these + # properties in ./vkloadtests.cmake. + set_target_properties( ${target} PROPERTIES + MACOSX_BUNDLE_BUNDLE_NAME ${product_name} + MACOSX_BUNDLE_EXECUTABLE_NAME ${product_name} + MACOSX_BUNDLE_COPYRIGHT "© 2024 Khronos Group, Inc." + MACOSX_BUNDLE_GUI_IDENTIFIER ${bundle_identifier} + MACOSX_BUNDLE_INFO_PLIST ${INFO_PLIST_IN} + MACOSX_BUNDLE_INFO_STRING "View KTX textures; display via OpenGL." + MACOSX_BUNDLE_ICON_FILE ${KTX_APP_ICON} + MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION} + MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION} + # Because libassimp is built with bitcode disabled. It's not + # important unless submitting to the App Store and currently + # bitcode is optional. + XCODE_ATTRIBUTE_ENABLE_BITCODE "NO" + XCODE_ATTRIBUTE_ONLY_ACTIVE_ARCH "YES" + XCODE_ATTRIBUTE_ASSETCATALOG_COMPILER_APPICON_NAME ${KTX_APP_ICON_BASENAME} + XCODE_ATTRIBUTE_TARGETED_DEVICE_FAMILY "1,2" # iPhone and iPad + ) + unset(product_name) + unset(bundle_identifier) + + # The generated project code for building an Apple bundle automatically + # copies the executable and all files with the RESOURCE property to the + # bundle adjusting for the difference in bundle layout between iOS & + # macOS. + + if(NOT IOS) + set_target_properties( ${target} PROPERTIES + INSTALL_RPATH "@executable_path/../Frameworks" + ) + + if(BUILD_SHARED_LIBS) + add_custom_command( TARGET ${target} POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy $ "$/Frameworks/$" + COMMAND ${CMAKE_COMMAND} -E create_symlink $ "$/Frameworks/$" + COMMENT "Copy KTX library to build destination" + ) + endif() + # Re. SDL3 & assimp: no copy required.: vcpkg libs are static or else + # vcpkg arranges copy. Brew libs cannot be bundled. + + # Specify destination for cmake --install. + install(TARGETS ${target} + BUNDLE + DESTINATION /Applications + COMPONENT GlLoadTestApps + ) + + endif() + + else() + if(EMSCRIPTEN) + set_target_properties(${target} PROPERTIES SUFFIX ".html") + endif() + + # This copies the resources next to the executable for ease + # of use during debugging and testing. + add_custom_command( TARGET ${target} POST_BUILD + COMMAND ${CMAKE_COMMAND} -E make_directory + $/../resources + COMMAND ${CMAKE_COMMAND} -E copy_if_different + ${resources} + $/../resources + ) + + # See important comment and TODO:s starting at line 365 + # in ./vkloadtests.cmake regarding installation of these + # targets. Search for "keep the resources". + + set_target_properties( ${target} PROPERTIES + INSTALL_RPATH "\$ORIGIN;${CMAKE_INSTALL_FULL_LIBDIR}" + ) + + ######### IMPORTANT ###### + # When installing via `cmake --install` ALSO install the + # library component. There seems no way to make a dependency. + ########################## +# set( destroot "${LOAD_TEST_DESTROOT}/$") + # NOTE: WHEN RUNNING MANUAL INSTALLS INSTALL library COMPONENT TOO. +# install(TARGETS ${target} +# RUNTIME +# DESTINATION ${destroot}/bin +# COMPONENT GlLoadTestApps +# LIBRARY +# DESTINATION ${CMAKE_INSTALL_LIBDIR} +# COMPONENT GlLoadTestApps +# RESOURCE +# DESTINATION ${destroot}/resources +# COMPONENT GlLoadTestApps +# ) +# install(TARGETS ktx +# RUNTIME +# DESTINATION ${destroot}/bin +# COMPONENT GlLoadTestApps +# LIBRARY +# DESTINATION ${destroot}/lib +# COMPONENT GlLoadTestApps +# ) +# if(LINUX) +# # Add a link from the regular bin directory to put command +# # on PATH. +# install(CODE " +# EXECUTE_PROCESS(COMMAND ln -s ${destroot}/bin/$ ${CMAKE_INSTALL_FULL_BINDIR} +# )" +# COMPONENT GlLoadTestApps +# ) +# install(FILES +# ${CMAKE_CURRENT_BINARY_DIR}/${target}.desktop +# DESTINATION /usr/share/applications +# COMPONENT GlLoadTestApps +# ) +# endif(LINUX) + endif() +endfunction( create_gl_target target ) + + +set( ES1_TEST_IMAGES + no-npot.ktx + hi_mark.ktx + luminance-reference-metadata.ktx + orient-up-metadata.ktx + orient-down-metadata.ktx + etc1.ktx + etc2-rgb.ktx + etc2-rgba1.ktx + etc2-rgba8.ktx + rgba-reference.ktx + rgb-reference.ktx + rgb-amg-reference.ktx + rgb-mipmap-reference.ktx + hi_mark_sq.ktx +) +list( TRANSFORM ES1_TEST_IMAGES + PREPEND "${PROJECT_SOURCE_DIR}/tests/testimages/" +) + +set( ES1_SOURCES + glloadtests/gles1/ES1LoadTests.cpp + glloadtests/gles1/DrawTexture.cpp + glloadtests/gles1/DrawTexture.h + glloadtests/gles1/TexturedCube.cpp + glloadtests/gles1/TexturedCube.h +) + +set( GL3_TEST_IMAGES + etc1s_Iron_Bars_001_normal.ktx2 + uastc_Iron_Bars_001_normal.ktx2 + color_grid_uastc_zstd.ktx2 + color_grid_zstd.ktx2 + color_grid_uastc.ktx2 + color_grid_basis.ktx2 + kodim17_basis.ktx2 + kodim17_basis.ktx2 + FlightHelmet_baseColor_basis.ktx2 + rgba-reference-u.ktx2 + rgba-reference-u.ktx2 + rgba-reference-u.ktx2 + cubemap_goldengate_uastc_rdo4_zstd5_rd.ktx2 + cubemap_yokohama_basis_rd.ktx2 + orient-down-metadata-u.ktx2 + orient-down-metadata-u.ktx2 + texturearray_bc3_unorm.ktx2 + texturearray_astc_8x8_unorm.ktx2 + texturearray_etc2_unorm.ktx2 + 3dtex_7_reference_u.ktx2 + rgb-mipmap-reference-u.ktx2 + hi_mark.ktx + orient-up-metadata.ktx + orient-down-metadata.ktx + not4_rgb888_srgb.ktx + etc1.ktx + etc2-rgb.ktx + etc2-rgba1.ktx + etc2-rgba8.ktx + etc2-sRGB.ktx + etc2-sRGBa1.ktx + etc2-sRGBa8.ktx + rgba-reference.ktx + rgb-reference.ktx + conftestimage_R11_EAC.ktx + conftestimage_SIGNED_R11_EAC.ktx + conftestimage_RG11_EAC.ktx + conftestimage_SIGNED_RG11_EAC.ktx + texturearray_bc3_unorm.ktx + texturearray_astc_8x8_unorm.ktx + texturearray_etc2_unorm.ktx + rgb-amg-reference.ktx + rgb-mipmap-reference.ktx + hi_mark_sq.ktx +) +list( TRANSFORM GL3_TEST_IMAGES + PREPEND "${PROJECT_SOURCE_DIR}/tests/testimages/" +) +set( GL3_RESOURCE_FILES ${LOAD_TEST_COMMON_RESOURCE_FILES} ${GL3_TEST_IMAGES} ) + +set( GL3_SOURCES + common/TranscodeTargetStrToFmt.cpp + common/TranscodeTargetStrToFmt.h + common/disable_glm_warnings.h + common/reenable_warnings.h + glloadtests/shader-based/DrawTexture.cpp + glloadtests/shader-based/DrawTexture.h + glloadtests/shader-based/EncodeTexture.cpp + glloadtests/shader-based/EncodeTexture.h + glloadtests/shader-based/GL3LoadTests.cpp + glloadtests/shader-based/GL3LoadTestSample.cpp + glloadtests/shader-based/GL3LoadTestSample.h + glloadtests/shader-based/InstancedSampleBase.cpp + glloadtests/shader-based/InstancedSampleBase.h + glloadtests/shader-based/mygl.h + glloadtests/shader-based/shaders.cpp + glloadtests/shader-based/Texture3d.cpp + glloadtests/shader-based/Texture3d.h + glloadtests/shader-based/TextureArray.cpp + glloadtests/shader-based/TextureArray.h + glloadtests/shader-based/TextureMipmap.cpp + glloadtests/shader-based/TextureMipmap.h + glloadtests/shader-based/TextureCubemap.cpp + glloadtests/shader-based/TextureCubemap.h + glloadtests/shader-based/TexturedCube.cpp + glloadtests/shader-based/TexturedCube.h + glloadtests/utils/GLMeshLoader.hpp + glloadtests/utils/GLTextureTranscoder.hpp +) + + +if(WIN32) + if(NOT OPENGL_ES_EMULATOR) + message("OPENGL_ES_EMULATOR not set. Will not build OpenGL ES load tests applications.") + else() + set(EMULATE_GLES ON) + endif() +endif() + +if(IOS OR EMULATE_GLES) + # OpenGL ES 1.0 + create_gl_target( es1loadtests "ES1" "${ES1_SOURCES}" "${KTX_APP_ICON_PATH}" "${ES1_TEST_IMAGES}" SDL_GL_CONTEXT_PROFILE_ES 1 0 ON) +endif() + +if(IOS OR EMSCRIPTEN OR EMULATE_GLES) + # OpenGL ES 3.0 + create_gl_target( es3loadtests "ES3" "${GL3_SOURCES}" "${LOAD_TEST_COMMON_RESOURCE_FILES}" "${GL3_TEST_IMAGES}" SDL_GL_CONTEXT_PROFILE_ES 3 0 ON YES) +endif() + +if( (APPLE AND NOT IOS) OR LINUX OR WIN32 ) + # OpenGL 3.3 + create_gl_target( gl3loadtests "GL3" "${GL3_SOURCES}" "${LOAD_TEST_COMMON_RESOURCE_FILES}" "${GL3_TEST_IMAGES}" SDL_GL_CONTEXT_PROFILE_CORE 3 3 OFF YES) +endif() + diff --git a/third_party/ktx-src/tests/loadtests/glloadtests/GLLoadTests.cpp b/third_party/ktx-src/tests/loadtests/glloadtests/GLLoadTests.cpp new file mode 100644 index 0000000000000000000000000000000000000000..cf04d3b48fd5efd98ca6dc8e6d122aeac72abd93 --- /dev/null +++ b/third_party/ktx-src/tests/loadtests/glloadtests/GLLoadTests.cpp @@ -0,0 +1,313 @@ +/* -*- tab-width: 4; -*- */ +/* vi: set sw=2 ts=4 expandtab: */ + +/* + * Copyright 2015-2020 Mark Callow. + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @internal + * @file + * @~English + * + * @brief Implementation of app for running a set of OpenGL load tests. + */ + +#include +#include +#include + +#include "GLLoadTests.h" +#include "ltexceptions.h" + +GLLoadTests::GLLoadTests(const sampleInvocation samples[], + const uint32_t numSamples, + const char* const name, + const SDL_GLProfile profile, + const int majorVersion, + const int minorVersion) + : GLAppSDL(name, 640, 480, profile, majorVersion, minorVersion), + siSamples(samples), sampleIndex(numSamples) +{ + pCurSample = nullptr; +} + +GLLoadTests::~GLLoadTests() +{ + delete pCurSample; +} + +bool +GLLoadTests::initialize(Args& args) +{ + bool explicitlyLoadOpenGL = false; + for (uint32_t i = 1; i < args.size(); i++) { + if (args[i].compare("--load-gl") == 0) { + explicitlyLoadOpenGL = true; + args.erase(args.begin() + i); + break; + } + } + + if (!GLAppSDL::initialize(args)) + return false; + + // --load-gl allows testing of explicitly loading the OpenGL pointers. + // Default is for ktxTexture_GLUpload to implicitly load them. + if (explicitlyLoadOpenGL) + ktxLoadOpenGL(reinterpret_cast(SDL_GL_GetProcAddress)); + + for (auto it = args.begin() + 1; it != args.end(); it++) { + infiles.push_back(*it); + } + if (infiles.size() > 0) { + sampleIndex.setNumSamples((uint32_t)infiles.size()); + } + // Launch the first sample. + invokeSample(Direction::eForward); + return true; +} + + +void +GLLoadTests::finalize() +{ + delete pCurSample; + GLAppSDL::finalize(); +} + + +bool +GLLoadTests::doEvent(SDL_Event* event) +{ + bool result = false; + switch (event->type) { + case SDL_EVENT_KEY_UP: + switch (event->key.key) { + case 'q': + quit = true; + break; + case 'n': + ++sampleIndex; + invokeSample(Direction::eForward); + break; + case 'p': + --sampleIndex; + invokeSample(Direction::eBack); + break; + default: + result = true; + } + break; + case SDL_EVENT_MOUSE_BUTTON_DOWN: + // Forward to sample in case this is the start of motion. + result = true; + switch (event->button.button) { + case SDL_BUTTON_LEFT: + buttonDown.x = event->button.x; + buttonDown.y = event->button.y; + buttonDown.timestamp = event->button.timestamp; + break; + default: + break; + } + break; + case SDL_EVENT_MOUSE_BUTTON_UP: + // Forward to sample so it doesn't get stuck in button down state. + result = true; + switch (event->button.button) { + case SDL_BUTTON_LEFT: + if (SDL_fabs(event->button.x - buttonDown.x) < 5 + && SDL_fabs(event->button.y - buttonDown.y) < 5 + && (event->button.timestamp - buttonDown.timestamp) < 100) { + // Advance to the next sample. + ++sampleIndex; + invokeSample(Direction::eForward); + } + break; + default: + break; + } + break; + // On macOS drop events come also when Launch Pad sends a file open event. + case SDL_EVENT_DROP_BEGIN: + // Opens of multiple selected files from Finder/LaunchPad come as + // a BEGIN, COMPLETE sequence per file. Only clear infiles after a + // suitable pause between COMPLETE and BEGIN. + if (event->drop.timestamp - dropCompleteTime > 500) { + infiles.clear(); + } + break; + case SDL_EVENT_DROP_FILE: + infiles.push_back(event->drop.data); + break; + case SDL_EVENT_DROP_COMPLETE: + if (!infiles.empty()) { + // Guard against the drop being text. + dropCompleteTime = event->drop.timestamp; + sampleIndex.setNumSamples((uint32_t)infiles.size()); + invokeSample(Direction::eForward); + } + break; + case SDL_EVENT_USER: + if (event->user.code == SwipeDetector::swipeGesture) { + // This is horrible. + uint64_t udirection = reinterpret_cast(event->user.data1); + SwipeDetector::Direction direction = + static_cast(udirection); + switch (direction) { + case SwipeDetector::Direction::left: + ++sampleIndex; + invokeSample(Direction::eForward); + break; + case SwipeDetector::Direction::right: + --sampleIndex; + invokeSample(Direction::eBack); + break; + default: + result = true; + } + } else { + result = true; + } + break; + default: + result = swipeDetector.doEvent(event); + } + + if (result) { + // Further processing required. + if (pCurSample != nullptr) + result = pCurSample->doEvent(event); // Give sample a chance. + if (result) + return GLAppSDL::doEvent(event); // Pass to base class. + } + return result; +} + + +void +GLLoadTests::windowResized() +{ + if (pCurSample != nullptr) + pCurSample->resize(w_width, w_height); +} + + +void +GLLoadTests::drawFrame(uint32_t msTicks) +{ + if (pCurSample != nullptr) + pCurSample->run(msTicks); + + GLAppSDL::drawFrame(msTicks); +} + +#if 0 +void +GLLoadTests::getOverlayText(GLTextOverlay * textOverlay) +{ + if (enableTextOverlay && pCurSample != nullptr) { + pCurSample->getOverlayText(textOverlay); + } +} +#endif + +void +GLLoadTests::invokeSample(Direction dir) +{ + const sampleInvocation* sampleInv = &siSamples[sampleIndex]; + + delete pCurSample; + // Certain events can be triggered during new sample initialization + // while pCurSample is not valid, e.g. FOCUS_LOST. Protect against + // problems from this by indicating there is no current sample. + pCurSample = nullptr; + + uint32_t unsupportedTypeExceptions = 0; + std::string fileTitle; + for (;;) { + try { + if (infiles.size() > 0) { + fileTitle = "Viewing file "; + fileTitle += infiles[sampleIndex]; + pCurSample = showFile(infiles[sampleIndex]); + } else { + sampleInv = &siSamples[sampleIndex]; + pCurSample = sampleInv->createSample(w_width, w_height, + sampleInv->args, + sBasePath); + } + break; + } catch (unsupported_ctype& e) { + (void)e; // To quiet unused variable warnings from some compilers. + unsupportedTypeExceptions++; + if (unsupportedTypeExceptions == sampleIndex.getNumSamples()) { + SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, + infiles.size() > 0 ? fileTitle.c_str() : sampleInv->title, + "None of the specified samples or files use texture types " + "supported on this platform.", + NULL); + exit(0); + } else { + dir == Direction::eForward ? ++sampleIndex : --sampleIndex; + } + } catch (std::exception& e) { + const SDL_MessageBoxButtonData buttons[] = { + /* .flags, .buttonid, .text */ + { SDL_MESSAGEBOX_BUTTON_RETURNKEY_DEFAULT, 0, "Continue" }, + { SDL_MESSAGEBOX_BUTTON_ESCAPEKEY_DEFAULT, 1, "Abort" }, + }; +#if 0 + const SDL_MessageBoxColorScheme colorScheme = { + { /* .colors (.r, .g, .b) */ + /* [SDL_MESSAGEBOX_COLOR_BACKGROUND] */ + { 255, 0, 0 }, + /* [SDL_MESSAGEBOX_COLOR_TEXT] */ + { 0, 255, 0 }, + /* [SDL_MESSAGEBOX_COLOR_BUTTON_BORDER] */ + { 255, 255, 0 }, + /* [SDL_MESSAGEBOX_COLOR_BUTTON_BACKGROUND] */ + { 0, 0, 255 }, + /* [SDL_MESSAGEBOX_COLOR_BUTTON_SELECTED] */ + { 255, 0, 255 } + } + }; +#endif + const SDL_MessageBoxData messageboxdata = { + SDL_MESSAGEBOX_ERROR, // .flags + NULL, // .window + infiles.size() > 0 ? + fileTitle.c_str() : sampleInv->title, // .title + e.what(), // .message + SDL_arraysize(buttons), // .numbuttons + buttons, // .buttons + NULL //&colorScheme // .colorScheme + }; + int buttonid; + if (!SDL_ShowMessageBox(&messageboxdata, &buttonid)) { + SDL_Log("error displaying error message box"); + exit(1); + } + if (buttonid == 0) { + // Continue + dir == Direction::eForward ? ++sampleIndex : --sampleIndex; + } else { + // We've been told to quit or no button was pressed. + exit(1); + } + } + } + setAppTitle(infiles.size() > 0 ? fileTitle.c_str() : sampleInv->title); + pCurSample->resize(w_width, w_height); +} + +void +GLLoadTests::onFPSUpdate() +{ + // Using onFPSUpdate avoids rewriting the title every frame. + //setWindowTitle(pCurSample->title); + GLAppSDL::onFPSUpdate(); +} + diff --git a/third_party/ktx-src/tests/loadtests/glloadtests/GLLoadTests.h b/third_party/ktx-src/tests/loadtests/glloadtests/GLLoadTests.h new file mode 100644 index 0000000000000000000000000000000000000000..bce8b683ed20ffff00f7af3f1fd7bce84fecbeef --- /dev/null +++ b/third_party/ktx-src/tests/loadtests/glloadtests/GLLoadTests.h @@ -0,0 +1,100 @@ +/* -*- tab-width: 4; -*- */ +/* vi: set sw=2 ts=4 expandtab: */ + +#ifndef GL_LOAD_TESTS_H +#define GL_LOAD_TESTS_H + +/* + * Copyright 2015-2020 Mark Callow. + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @internal + * @file + * @~English + * + * @brief Definition of app for running a set of OpenGL load tests. + */ + +#include +#include + +#include "GLAppSDL.h" +#include "LoadTestSample.h" +#include "SwipeDetector.h" + +class GLLoadTests : public GLAppSDL { + public: + /** A table of samples and arguments */ + typedef struct sampleInvocation_ { + const LoadTestSample::PFN_create createSample; + const char* const args; + const char* const title; + } sampleInvocation; + + GLLoadTests(const sampleInvocation samples[], + const uint32_t numSamples, + const char* const name, + const SDL_GLProfile profile, + const int majorVersion, + const int minorVersion); + virtual ~GLLoadTests(); + virtual bool doEvent(SDL_Event* event); + virtual void drawFrame(uint32_t msTicks); + virtual void finalize(); + //virtual void getOverlayText(TextOverlay* textOverlay, float yOffset); + virtual bool initialize(Args& args); + virtual void onFPSUpdate(); + virtual void windowResized(); + + protected: + enum class Direction { + eForward, + eBack + }; + void invokeSample(Direction dir); + LoadTestSample* showFile(const std::string& filename); + LoadTestSample* pCurSample; + + bool quit = false; + + const sampleInvocation* const siSamples; + class sampleIndex { + public: + sampleIndex(const uint32_t numSamples) : numSamples(numSamples) { + index = 0; + } + sampleIndex& operator++() { + if (++index >= numSamples) + index = 0; + return *this; + } + sampleIndex& operator--() { + if (--index > numSamples /* underflow */) + index = numSamples-1; + return *this; + } + operator int32_t() { + return index; + } + uint32_t getNumSamples() { return numSamples; } + void setNumSamples(uint32_t ns) { numSamples = ns; } + protected: + uint32_t numSamples; + uint32_t index; + } sampleIndex; + + std::vector infiles; + + Sint64 dropCompleteTime = 0; + struct { + float x; + float y; + Sint64 timestamp; + } buttonDown; + + SwipeDetector swipeDetector; +}; + +#endif /* GL_LOAD_TESTS_H */ diff --git a/third_party/ktx-src/tests/loadtests/glloadtests/gles1/DrawTexture.cpp b/third_party/ktx-src/tests/loadtests/glloadtests/gles1/DrawTexture.cpp new file mode 100644 index 0000000000000000000000000000000000000000..8f922ec635691463cd3d15fec7de1a54b7f0bf64 --- /dev/null +++ b/third_party/ktx-src/tests/loadtests/glloadtests/gles1/DrawTexture.cpp @@ -0,0 +1,250 @@ +/* -*- tab-width: 4; -*- */ +/* vi: set sw=2 ts=4 expandtab: */ + +/* + * Copyright 2018-2020 Mark Callow. + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @file DrawTexture.cpp + * @brief Draw textures at actual size using the DrawTexture functions + * from OES_draw_texture. + * + * @author Mark Callow + */ + + +#if defined(_WIN32) + #if _MSC_VER < 1900 + #define snprintf _snprintf + #endif + #define _CRT_SECURE_NO_WARNINGS +#endif + +#include +#include +#include +#include "disable_glm_warnings.h" +#include +#include +#include "reenable_warnings.h" + +#include "DrawTexture.h" +#include "frame.h" + +/* ------------------------------------------------------------------------ */ + +#if 0 +static int isPowerOfTwo (int x) +{ + if (x < 0) x = -1; + return ((x != 0) && !(x & (x - 1))); +} +#endif + +/* ------------------------------------------------------------------------ */ + +LoadTestSample* +DrawTexture::create(uint32_t width, uint32_t height, + const char* const szArgs, + const std::string sBasePath) +{ + return new DrawTexture(width, height, szArgs, sBasePath); +} + +DrawTexture::DrawTexture(uint32_t width, uint32_t height, + const char* const szArgs, + const std::string sBasePath) + : LoadTestSample(width, height, sBasePath) +{ + GLint iCropRect[4] = {0, 0, 0, 0}; + const GLchar* szExtensions = (const GLchar*)glGetString(GL_EXTENSIONS); + const char* filename; + std::string pathname; + GLenum target; + GLboolean npotTexture; + GLenum glerror; + ktxTexture* kTexture; + KTX_error_code ktxresult; + GLint sign_s = 1, sign_t = 1; + + bInitialized = false; + gnTexture = 0; + + + if (strstr(szExtensions, "OES_draw_texture") != NULL) { + glDrawTexsOES = (PFNGLDRAWTEXSOESPROC)SDL_GL_GetProcAddress("glDrawTexsOES"); + glDrawTexiOES = (PFNGLDRAWTEXIOESPROC)SDL_GL_GetProcAddress("glDrawTexiOES"); + glDrawTexxOES = (PFNGLDRAWTEXXOESPROC)SDL_GL_GetProcAddress("glDrawTexxOES"); + glDrawTexfOES = (PFNGLDRAWTEXFOESPROC)SDL_GL_GetProcAddress("glDrawTexfOES"); + glDrawTexsvOES = (PFNGLDRAWTEXSVOESPROC)SDL_GL_GetProcAddress("glDrawTexsvOES"); + glDrawTexivOES = (PFNGLDRAWTEXIVOESPROC)SDL_GL_GetProcAddress("glDrawTexivOES"); + glDrawTexxvOES = (PFNGLDRAWTEXXVOESPROC)SDL_GL_GetProcAddress("glDrawTexxvOES"); + glDrawTexfvOES = (PFNGLDRAWTEXFVOESPROC)SDL_GL_GetProcAddress("glDrawTexfvOES"); + } else { + /* Can't do anything */ + std::stringstream message; + + message << "DrawTexture: this OpenGL ES implementation does not support" + << " OES_draw_texture. Can't Run Test"; + throw std::runtime_error(message.str()); + } + + if (strstr(szExtensions, "OES_texture_npot") != NULL) + bNpotSupported = GL_TRUE; + else + bNpotSupported = GL_FALSE; + + + if ((filename = strchr(szArgs, ' ')) != NULL) { + npotTexture = GL_FALSE; + if (!strncmp(szArgs, "--npot ", 7)) { + npotTexture = GL_TRUE; +#if defined(DEBUG) + } else { + assert(0); /* Unknown argument in sampleInvocations */ +#endif + } + } else { + filename = szArgs; + npotTexture = GL_FALSE; + } + + if (npotTexture && !bNpotSupported) { + /* Load error texture. */ + filename = "no-npot.ktx"; + } + + pathname = getAssetPath() + filename; + + ktxresult = ktxTexture_CreateFromNamedFile(pathname.c_str(), + KTX_TEXTURE_CREATE_NO_FLAGS, + &kTexture); + if (KTX_SUCCESS != ktxresult) { + std::stringstream message; + + message << "Creation of ktxTexture from \"" << pathname + << "\" failed: " << ktxErrorString(ktxresult); + throw std::runtime_error(message.str()); + } + ktxresult = ktxTexture_GLUpload(kTexture, &gnTexture, &target, &glerror); + + if (KTX_SUCCESS == ktxresult) { + if (target != GL_TEXTURE_2D) { + /* Can only draw 2D textures */ + glDeleteTextures(1, &gnTexture); + return; + } + + if (kTexture->orientation.x == KTX_ORIENT_X_LEFT) + sign_s = -1; + if (kTexture->orientation.y == KTX_ORIENT_Y_DOWN) + sign_t = -1; + + iCropRect[2] = uTexWidth = kTexture->baseWidth; + iCropRect[3] = uTexHeight = kTexture->baseHeight; + iCropRect[2] *= sign_s; + iCropRect[3] *= sign_t; + + glEnable(target); + + if (kTexture->numLevels > 1) + // Enable bilinear mipmapping. + // TO DO: application can consider inserting a key,value pair in + // the KTX file that indicates what type of filtering to use. + glTexParameteri(target, + GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST); + else + glTexParameteri(target, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(target, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + + glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); + glTexParameteriv(target, GL_TEXTURE_CROP_RECT_OES, iCropRect); + + /* Check for any errors */ + assert(GL_NO_ERROR == glGetError()); + + ktxTexture_Destroy(kTexture); + } else { + std::stringstream message; + + message << "Load of texture from \"" << pathname << "\" failed: "; + if (ktxresult == KTX_GL_ERROR) { + message << std::showbase << "GL error " << std::hex << glerror + << "occurred."; + } else { + message << ktxErrorString(ktxresult); + } + throw std::runtime_error(message.str()); + } + + glClearColor(0.4f, 0.4f, 0.5f, 1.0f); + glColor4f(1.0f, 1.0f, 0.0f, 1.0f); + glEnableClientState(GL_VERTEX_ARRAY); + glVertexPointer(3, GL_BYTE, 0, (GLvoid *)frame_position); + + bInitialized = GL_TRUE; +} + +/* ------------------------------------------------------------------------ */ + +DrawTexture::~DrawTexture() +{ + if (bInitialized) { + glDeleteTextures(1, &gnTexture); + } + assert(GL_NO_ERROR == glGetError()); +} + +/* ------------------------------------------------------------------------ */ + +void +DrawTexture::resize(uint32_t uNewWidth, uint32_t uNewHeight) +{ + glViewport(0, 0, uNewWidth, uNewHeight); + this->uWidth = uNewWidth; + this->uHeight = uNewHeight; + + // Set up an orthographic projection where 1 = 1 pixel + framePMatrix = glm::ortho(0.f, (float)uWidth, 0.f, (float)uHeight); + // Move (0,0,0) to the center of the window. + framePMatrix *= glm::translate(glm::mat4(), + glm::vec3((float)uWidth/2, (float)uHeight/2, 0)); + + glMatrixMode(GL_PROJECTION); + glLoadMatrixf(glm::value_ptr(framePMatrix)); + + glMatrixMode(GL_MODELVIEW); + // Scale the frame to fill the viewport. To guarantee its lines + // appear we need to inset them by half-a-pixel hence the -1. + // [Lines at the edges of the clip volume may or may not appear + // depending on the OpenGL ES implementation. This is because + // (a) the edges are on the points of the diamonds of the diamond + // exit rule and slight precision errors can easily push the + // lines outside the diamonds. + // (b) the specification allows lines to be up to 1 pixel either + // side of the exact position.] + glLoadIdentity(); + glScalef((float)(uWidth - 1) / 2, (float)(uHeight - 1) / 2, 1); +} + +/* ------------------------------------------------------------------------ */ + +void +DrawTexture::run(uint32_t /*msTicks*/) +{ + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + glDisable(GL_TEXTURE_2D); + glDrawArrays(GL_LINE_LOOP, 0, 4); + + glEnable(GL_TEXTURE_2D); + glDrawTexiOES(uWidth/2 - uTexWidth/2, + (uHeight)/2 - uTexHeight/2, + 0, + uTexWidth, uTexHeight); + + assert(GL_NO_ERROR == glGetError()); +} + +/* ------------------------------------------------------------------------ */ diff --git a/third_party/ktx-src/tests/loadtests/glloadtests/gles1/DrawTexture.h b/third_party/ktx-src/tests/loadtests/glloadtests/gles1/DrawTexture.h new file mode 100644 index 0000000000000000000000000000000000000000..b21a176dd256c2f0fdd51b7f623588ceca17ea9e --- /dev/null +++ b/third_party/ktx-src/tests/loadtests/glloadtests/gles1/DrawTexture.h @@ -0,0 +1,66 @@ +/* -*- tab-width: 4; -*- */ +/* vi: set sw=2 ts=4 expandtab: */ + +/* + * Copyright 2018-2020 Mark Callow. + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @file DrawTexture.h + * @brief Draw textures at actual size using the DrawTexture functions + * from OES_draw_texture. + * + * @author Mark Callow + */ + +#ifndef DRAW_TEXTURE_H +#define DRAW_TEXTURE_H + +#include +#include + +#include "LoadTestSample.h" + +class DrawTexture : public LoadTestSample { + public: + DrawTexture(uint32_t width, uint32_t height, + const char* const szArgs, + const std::string sBasePath); + ~DrawTexture(); + + virtual void resize(uint32_t width, uint32_t height); + virtual void run(uint32_t msTicks); + + //virtual void getOverlayText(GLTextOverlay *textOverlay); + + static LoadTestSample* + create(uint32_t width, uint32_t height, + const char* const szArgs, const std::string sBasePath); + + protected: + PFNGLDRAWTEXSOESPROC glDrawTexsOES; + PFNGLDRAWTEXIOESPROC glDrawTexiOES; + PFNGLDRAWTEXXOESPROC glDrawTexxOES; + PFNGLDRAWTEXFOESPROC glDrawTexfOES; + PFNGLDRAWTEXSVOESPROC glDrawTexsvOES; + PFNGLDRAWTEXIVOESPROC glDrawTexivOES; + PFNGLDRAWTEXXVOESPROC glDrawTexxvOES; + PFNGLDRAWTEXFVOESPROC glDrawTexfvOES; + + uint32_t uWidth; + uint32_t uHeight; + + uint32_t uTexWidth; + uint32_t uTexHeight; + + glm::mat4 framePMatrix; + + GLuint gnTexture; + + bool bNpotSupported; + + bool bInitialized; +}; + +#endif /* DRAW_TEXTURE_H */ diff --git a/third_party/ktx-src/tests/loadtests/glloadtests/gles1/ES1LoadTests.cpp b/third_party/ktx-src/tests/loadtests/glloadtests/gles1/ES1LoadTests.cpp new file mode 100644 index 0000000000000000000000000000000000000000..b5548118b6810f3fe14fb1b0a338d3b339e9f908 --- /dev/null +++ b/third_party/ktx-src/tests/loadtests/glloadtests/gles1/ES1LoadTests.cpp @@ -0,0 +1,109 @@ +/* -*- tab-width: 4; -*- */ +/* vi: set sw=2 ts=4 expandtab: */ + +/* + * Copyright 2018-2020 Mark Callow. + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @file ES1LoadTests.cpp + * @brief List of tests of the KTX loader for OpenGL ES 1.1. + * + * The loader is tested by loading and drawing KTX textures in various formats + * using the DrawTexture and TexturedCube samples. + */ + +#include +#include + +#include "GLLoadTests.h" +#include "DrawTexture.h" +#include "TexturedCube.h" + +LoadTestSample* +GLLoadTests::showFile(const std::string& filename) +{ + KTX_error_code ktxresult; + ktxTexture* kTexture; + ktxresult = ktxTexture_CreateFromNamedFile(filename.c_str(), + KTX_TEXTURE_CREATE_NO_FLAGS, + &kTexture); + if (KTX_SUCCESS != ktxresult) { + std::stringstream message; + + message << "Creation of ktxTexture from \"" << getAssetPath() + << filename << "\" failed: " << ktxErrorString(ktxresult); + throw std::runtime_error(message.str()); + } + + LoadTestSample::PFN_create createViewer; + LoadTestSample* pViewer; + createViewer = DrawTexture::create; + ktxTexture_Destroy(kTexture); + pViewer = createViewer(w_width, w_height, filename.c_str(), ""); + return pViewer; +} + +const GLLoadTests::sampleInvocation siSamples[] = { + { DrawTexture::create, + "--npot hi_mark.ktx", + "RGB8 NPOT HI Logo" + }, + { DrawTexture::create, + "--npot luminance-reference-metadata.ktx", + "LUMINANCE8 NPOT" + }, + { DrawTexture::create, + "orient-up-metadata.ktx", + "RGB8 + KTXOrientation up" + }, + { DrawTexture::create, + "orient-down-metadata.ktx", + "RGB8 + KTXOrientation down" + }, + { DrawTexture::create, + "etc1.ktx", + "ETC1 RGB8" + }, + { DrawTexture::create, + "etc2-rgb.ktx", + "ETC2 RGB8" + }, + { DrawTexture::create, + "etc2-rgba1.ktx", + "ETC2 RGB8A1" + }, + { DrawTexture::create, + "etc2-rgba8.ktx", + "ETC2 RGB8A8" + }, + { DrawTexture::create, + "rgba-reference.ktx", + "RGBA8" + }, + { TexturedCube::create, + "rgb-reference.ktx", + "RGB8" + }, + { TexturedCube::create, + "rgb-amg-reference.ktx", + "RGB8 + Auto Mipmap" + }, + { TexturedCube::create, + "rgb-mipmap-reference.ktx", + "RGB8 Color/level mipmap" + }, + { TexturedCube::create, + "--npot hi_mark_sq.ktx", + "RGB8 NPOT HI Logo" + }, +}; + +const int iNumSamples = sizeof(siSamples) / sizeof(GLLoadTests::sampleInvocation); + +AppBaseSDL* theApp = new GLLoadTests(siSamples, iNumSamples, + "KTX Loader Tests for OpenGL ES 1", + SDL_GL_CONTEXT_PROFILE_ES, 1, 1); + + diff --git a/third_party/ktx-src/tests/loadtests/glloadtests/gles1/TexturedCube.cpp b/third_party/ktx-src/tests/loadtests/glloadtests/gles1/TexturedCube.cpp new file mode 100644 index 0000000000000000000000000000000000000000..668596a7c20727785aebefe24747396056d5947e --- /dev/null +++ b/third_party/ktx-src/tests/loadtests/glloadtests/gles1/TexturedCube.cpp @@ -0,0 +1,202 @@ +/* -*- tab-width: 4; -*- */ +/* vi: set sw=2 ts=4 expandtab: */ + +/* + * Copyright 2018-2020 Mark Callow. + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @file TexturedCube.cpp + * @brief Draw a textured cube. + */ + +#if defined(_WIN32) + #if _MSC_VER < 1900 + #define snprintf _snprintf + #endif + #define _CRT_SECURE_NO_WARNINGS +#endif + +#include +#include +#include +#include "disable_glm_warnings.h" +#include +#include +#include "reenable_warnings.h" + +#include "TexturedCube.h" +#include "cube.h" + + +#if defined(_WIN32) +#define snprintf _snprintf +#endif + +/* ------------------------------------------------------------------------- */ + +LoadTestSample* +TexturedCube::create(uint32_t width, uint32_t height, + const char* const szArgs, + const std::string sBasePath) +{ + return new TexturedCube(width, height, szArgs, sBasePath); +} + +TexturedCube::TexturedCube(uint32_t width, uint32_t height, + const char* const szArgs, + const std::string sBasePath) + : LoadTestSample(width, height, sBasePath) +{ + const GLchar* szExtensions = (const GLchar*)glGetString(GL_EXTENSIONS); + const char* filename; + std::string pathname; + GLuint gnTexture = 0; + GLenum target; + GLenum glerror; + GLboolean npotSupported, npotTexture; + ktxTexture* kTexture; + KTX_error_code ktxresult; + + if (strstr(szExtensions, "OES_texture_npot") != NULL) + npotSupported = GL_TRUE; + else + npotSupported = GL_FALSE; + + if ((filename = strchr(szArgs, ' ')) != NULL) { + npotTexture = GL_FALSE; + if (!strncmp(szArgs, "--npot ", 7)) { + npotTexture = GL_TRUE; +#if defined(DEBUG) + } else { + assert(0); /* Unknown argument in sampleInvocations */ +#endif + } + } else { + filename = szArgs; + npotTexture = GL_FALSE; + } + + if (npotTexture && !npotSupported) { + /* Load error texture. */ + filename = "no-npot.ktx"; + } + pathname = getAssetPath() + filename; + + ktxresult = ktxTexture_CreateFromNamedFile(pathname.c_str(), + KTX_TEXTURE_CREATE_NO_FLAGS, + &kTexture); + if (KTX_SUCCESS != ktxresult) { + std::stringstream message; + + message << "Creation of ktxTexture from \"" << pathname + << "\" failed: " << ktxErrorString(ktxresult); + throw std::runtime_error(message.str()); + } + ktxresult = ktxTexture_GLUpload(kTexture, &gnTexture, &target, &glerror); + + if (KTX_SUCCESS == ktxresult) { + if (target != GL_TEXTURE_2D) { + /* Can only draw 2D textures */ + glDeleteTextures(1, &gnTexture); + return; + } + glEnable(target); + + if (kTexture->numLevels > 1) + // Enable bilinear mipmapping. + // TO DO: application can consider inserting a key,value pair in + // the KTX file that indicates what type of filtering to use. + glTexParameteri(target, + GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST); + else + glTexParameteri(target, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(target, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); + + ktxTexture_Destroy(kTexture); + } else { + std::stringstream message; + + message << "Load of texture from \"" << pathname << "\" failed: "; + if (ktxresult == KTX_GL_ERROR) { + message << std::showbase << "GL error " << std::hex << glerror + << "occurred."; + } else { + message << ktxErrorString(ktxresult); + } + throw std::runtime_error(message.str()); + } + + /* By default dithering is enabled. Dithering does not provide visual + * improvement in this sample so disable it to improve performance. + */ + glDisable(GL_DITHER); + + glEnable(GL_CULL_FACE); + glClearColor(0.2f,0.3f,0.4f,1.0f); + + glEnableClientState(GL_VERTEX_ARRAY); + glEnableClientState(GL_COLOR_ARRAY); + glEnableClientState(GL_TEXTURE_COORD_ARRAY); + + glVertexPointer(3, GL_FLOAT, 0, cube_face); + glColorPointer(4, GL_FLOAT, 0, cube_color); + glTexCoordPointer(2, GL_FLOAT, 0, cube_texture); +} + +TexturedCube::~TexturedCube() +{ + glDisable(GL_TEXTURE_2D); + glEnable(GL_DITHER); + glDisable(GL_CULL_FACE); + glDisableClientState(GL_VERTEX_ARRAY); + glDisableClientState(GL_COLOR_ARRAY); + glDisableClientState(GL_TEXTURE_COORD_ARRAY); + assert(GL_NO_ERROR == glGetError()); +} + +void +TexturedCube::resize(uint32_t uWidth, uint32_t uHeight) +{ + glm::mat4 matProj; + glViewport(0, 0, uWidth, uHeight); + + glMatrixMode( GL_PROJECTION ); + matProj = glm::perspective(glm::radians(45.f), + uWidth / (float)uHeight, + 1.f, 100.f); + glLoadIdentity(); + glLoadMatrixf(glm::value_ptr(matProj)); + + glMatrixMode( GL_MODELVIEW ); + assert(GL_NO_ERROR == glGetError()); +} + +void +TexturedCube::run(uint32_t msTicks) +{ + /* Setup the view matrix : just turn around the cube. */ + const float fDistance = 5.0f; + glm::vec3 eye((float)cos( msTicks*0.001f ) * fDistance, + (float)sin( msTicks*0.0007f ) * fDistance, + (float)sin( msTicks*0.001f ) * fDistance); + glm::vec3 look(0.,0.,0.); + glm::vec3 up(0.,1.,0.); + glm::mat4 matView = glm::lookAt( eye, look, up ); + + glLoadIdentity(); + glLoadMatrixf(glm::value_ptr(matView)); + + /* Draw */ + glClear( GL_COLOR_BUFFER_BIT ); + + glDrawElements(GL_TRIANGLES, CUBE_NUM_INDICES, + GL_UNSIGNED_SHORT, cube_index_buffer); + + assert(GL_NO_ERROR == glGetError()); +} + +/* ------------------------------------------------------------------------- */ + diff --git a/third_party/ktx-src/tests/loadtests/glloadtests/gles1/TexturedCube.h b/third_party/ktx-src/tests/loadtests/glloadtests/gles1/TexturedCube.h new file mode 100644 index 0000000000000000000000000000000000000000..68792007fe388f5d75602556d0b61f95343b4ba8 --- /dev/null +++ b/third_party/ktx-src/tests/loadtests/glloadtests/gles1/TexturedCube.h @@ -0,0 +1,38 @@ +/* -*- tab-width: 4; -*- */ +/* vi: set sw=2 ts=4 expandtab: */ + +/* + * Copyright 2018-2020 Mark Callow. + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @file TexturedCube.cpp + * @brief Draw a textured cube. + */ + +#ifndef TEXTURED_CUBE_H +#define TEXTURED_CUBE_H + +#include +#include + +#include "LoadTestSample.h" +class TexturedCube : public LoadTestSample { + public: + TexturedCube(uint32_t width, uint32_t height, + const char* const szArgs, + const std::string sBasePath); + ~TexturedCube(); + + virtual void resize(uint32_t width, uint32_t height); + virtual void run(uint32_t msTicks); + + //virtual void getOverlayText(GLTextOverlay *textOverlay); + + static LoadTestSample* + create(uint32_t width, uint32_t height, + const char* const szArgs, const std::string sBasePath); +}; + +#endif /* TEXTURED_CUBE_H */ diff --git a/third_party/ktx-src/tests/loadtests/glloadtests/resources/ios/Info.plist.in b/third_party/ktx-src/tests/loadtests/glloadtests/resources/ios/Info.plist.in new file mode 100644 index 0000000000000000000000000000000000000000..c08426ed371b3df744855c95fdd59a53817a5cce --- /dev/null +++ b/third_party/ktx-src/tests/loadtests/glloadtests/resources/ios/Info.plist.in @@ -0,0 +1,50 @@ + + + + + + CFBundleName + ${MACOSX_BUNDLE_BUNDLE_NAME} + CFBundleDisplayName + ${MACOSX_BUNDLE_BUNDLE_NAME} + CFBundleGetInfoString + ${MACOSX_BUNDLE_INFO_STRING} + NSHumanReadableCopyright + ${MACOSX_BUNDLE_COPYRIGHT} + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${MACOSX_BUNDLE_EXECUTABLE_NAME} + CFBundleIdentifier + ${MACOSX_BUNDLE_GUI_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundlePackageType + APPL + CFBundleVersion + ${MACOSX_BUNDLE_BUNDLE_VERSION} + CFBundleShortVersionString + ${MACOSX_BUNDLE_SHORT_VERSION_STRING} + CFBundleSignature + ???? + NSMainNibFile + + UILaunchStoryboardName + LaunchScreen + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UIApplicationSupportsIndirectInputEvents + YES + + diff --git a/third_party/ktx-src/tests/loadtests/glloadtests/resources/ios/LaunchImages.xcassets/Contents.json b/third_party/ktx-src/tests/loadtests/glloadtests/resources/ios/LaunchImages.xcassets/Contents.json new file mode 100644 index 0000000000000000000000000000000000000000..da4a164c918651cdd1e11dca5cc62c333f097601 --- /dev/null +++ b/third_party/ktx-src/tests/loadtests/glloadtests/resources/ios/LaunchImages.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/third_party/ktx-src/tests/loadtests/glloadtests/resources/ios/LaunchImages.xcassets/LaunchImage.launchimage/Contents.json b/third_party/ktx-src/tests/loadtests/glloadtests/resources/ios/LaunchImages.xcassets/LaunchImage.launchimage/Contents.json new file mode 100644 index 0000000000000000000000000000000000000000..62ac6f15a7520d586f61a7c3249e41fe1562b560 --- /dev/null +++ b/third_party/ktx-src/tests/loadtests/glloadtests/resources/ios/LaunchImages.xcassets/LaunchImage.launchimage/Contents.json @@ -0,0 +1,57 @@ +{ + "images" : [ + { + "orientation" : "portrait", + "idiom" : "iphone", + "filename" : "launch-portrait-iphone@x2.png", + "extent" : "full-screen", + "minimum-system-version" : "7.0", + "scale" : "2x" + }, + { + "extent" : "full-screen", + "idiom" : "iphone", + "subtype" : "retina4", + "filename" : "launch-portrait-iphone@r4.png", + "minimum-system-version" : "7.0", + "orientation" : "portrait", + "scale" : "2x" + }, + { + "orientation" : "portrait", + "idiom" : "ipad", + "filename" : "launch-portrait@x1.png", + "extent" : "full-screen", + "minimum-system-version" : "7.0", + "scale" : "1x" + }, + { + "orientation" : "landscape", + "idiom" : "ipad", + "filename" : "launch-landscape@x1.png", + "extent" : "full-screen", + "minimum-system-version" : "7.0", + "scale" : "1x" + }, + { + "orientation" : "portrait", + "idiom" : "ipad", + "filename" : "launch-portrait@2x.png", + "extent" : "full-screen", + "minimum-system-version" : "7.0", + "scale" : "2x" + }, + { + "orientation" : "landscape", + "idiom" : "ipad", + "filename" : "launch-landscape@x2.png", + "extent" : "full-screen", + "minimum-system-version" : "7.0", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/third_party/ktx-src/tests/loadtests/glloadtests/resources/ios/LaunchScreen.storyboard.in b/third_party/ktx-src/tests/loadtests/glloadtests/resources/ios/LaunchScreen.storyboard.in new file mode 100644 index 0000000000000000000000000000000000000000..f49dafee8cd05eb7a25bfbb44c2a85b10f435d65 --- /dev/null +++ b/third_party/ktx-src/tests/loadtests/glloadtests/resources/ios/LaunchScreen.storyboard.in @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/ktx-src/tests/loadtests/glloadtests/shader-based/DrawTexture.cpp b/third_party/ktx-src/tests/loadtests/glloadtests/shader-based/DrawTexture.cpp new file mode 100644 index 0000000000000000000000000000000000000000..2e01f1d96d0e65964820eff00aa7e4cec92a39c4 --- /dev/null +++ b/third_party/ktx-src/tests/loadtests/glloadtests/shader-based/DrawTexture.cpp @@ -0,0 +1,424 @@ +/* -*- tab-iWidth: 4; -*- */ +/* vi: set sw=2 ts=4 expandtab: */ + +/* + * Copyright 2018-2020 Mark Callow. + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @file + * @brief Tests texture loading by using glDrawTexture to draw the texture. + * + * @author Mark Callow + */ + +#if defined(_WIN32) + #if _MSC_VER < 1900 + #define snprintf _snprintf + #endif + #define _CRT_SECURE_NO_WARNINGS +#endif + +#include +#include +#include +#include "disable_glm_warnings.h" +#include +#include +#include "reenable_warnings.h" + +#include "DrawTexture.h" +#include "GLTextureTranscoder.hpp" +#include "TranscodeTargetStrToFmt.h" +#include "frame.h" +#include "quad.h" +#include "argparser.h" +#include "ltexceptions.h" + +#if !defined(GL_TEXTURE_1D) + #define GL_TEXTURE_1D 0x0DE0 +#endif + +/* ------------------------------------------------------------------------- */ + +extern const GLchar* pszVs; +extern const GLchar *pszDecalFs, *pszDecalSrgbEncodeFs; +extern const GLchar *pszColorFs, *pszColorSrgbEncodeFs; + +/* ------------------------------------------------------------------------- */ + +LoadTestSample* +DrawTexture::create(uint32_t width, uint32_t height, + const char* const szArgs, + const std::string sBasePath) +{ + return new DrawTexture(width, height, szArgs, sBasePath); +} + +DrawTexture::DrawTexture(uint32_t width, uint32_t height, + const char* const szArgs, + const std::string sBasePath) + : GL3LoadTestSample(width, height, szArgs, sBasePath) +{ + GLfloat* pfQuadTexCoords = quad_texture; + GLfloat fTmpTexCoords[sizeof(quad_texture)/sizeof(GLfloat)]; + GLenum target; + GLenum glerror; + GLint sign_s = 1, sign_t = 1; + GLint i; + GLuint gnColorFs, gnDecalFs, gnVs; + GLsizeiptr offset; + ktxTexture* kTexture; + KTX_error_code ktxresult; + + bInitialized = false; + transcodeTarget = KTX_TTF_NOSELECTION; + gnTexture = 0; + + processArgs(szArgs); + + std::string ktxfilepath = externalFile ? ktxfilename + : getAssetPath() + ktxfilename; + ktxresult = ktxTexture_CreateFromNamedFile(ktxfilepath.c_str(), + preloadImages ? KTX_TEXTURE_CREATE_LOAD_IMAGE_DATA_BIT + : KTX_TEXTURE_CREATE_NO_FLAGS, + &kTexture); + if (KTX_SUCCESS != ktxresult) { + std::stringstream message; + + message << "Creation of ktxTexture from \"" << ktxfilepath + << "\" failed: " << ktxErrorString(ktxresult); + throw std::runtime_error(message.str()); + } + + if (ktxTexture_NeedsTranscoding(kTexture)) { + TextureTranscoder tc; + tc.transcode((ktxTexture2*)kTexture, transcodeTarget); + } + + ktxresult = ktxTexture_GLUpload(kTexture, &gnTexture, &target, &glerror); + + if (KTX_SUCCESS == ktxresult) { + // GLUpload won't set target to GL_TEXTURE_1D not supported by context. + if (target != GL_TEXTURE_1D && target != GL_TEXTURE_2D) { + /* Can only draw 1D & 2D textures */ + std::stringstream message; + + glDeleteTextures(1, &gnTexture); + message << "DrawTexture supports only 1D & 2D textures. \"" + << ktxfilename << "\" is not one of these."; + throw std::runtime_error(message.str()); + } + + if (kTexture->orientation.x == KTX_ORIENT_X_LEFT) + sign_s = -1; + if (kTexture->orientation.y == KTX_ORIENT_Y_DOWN) + sign_t = -1; + + if (sign_s < 0 || sign_t < 0) { + // Transform the texture coordinates to get correct image + // orientation. + int iNumCoords = sizeof(quad_texture) / sizeof(float); + for (i = 0; i < iNumCoords; i++) { + fTmpTexCoords[i] = quad_texture[i]; + if (i & 1) { // odd, i.e. a y coordinate + if (sign_t < 1) { + fTmpTexCoords[i] = fTmpTexCoords[i] * -1 + 1; + } + } else { // an x coordinate + if (sign_s < 1) { + fTmpTexCoords[i] = fTmpTexCoords[i] * -1 + 1; + } + } + } + pfQuadTexCoords = fTmpTexCoords; + } + + uTexWidth = kTexture->baseWidth; + uTexHeight = kTexture->baseHeight; + + if (kTexture->numLevels > 1) + // Enable bilinear mipmapping. + // TO DO: application can consider inserting a key,value pair in + // the KTX file that indicates what type of filtering to use. + glTexParameteri(target, + GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST); + else + glTexParameteri(target, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(target, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + + ktx_uint32_t swizzleLen; + char* swizzleStr; + ktxresult = ktxHashList_FindValue(&kTexture->kvDataHead, KTX_SWIZZLE_KEY, + &swizzleLen, (void**)&swizzleStr); + if (ktxresult == KTX_SUCCESS && swizzleLen == 5) { + if (contextSupportsSwizzle()) { + GLint swizzle[4]; + swizzle[0] = swizzleStr[0] == 'r' ? GL_RED + : swizzleStr[0] == 'g' ? GL_GREEN + : swizzleStr[0] == 'b' ? GL_BLUE + : swizzleStr[0] == 'a' ? GL_ALPHA + : swizzleStr[0] == '0' ? GL_ZERO + : GL_ONE; + swizzle[1] = swizzleStr[1] == 'r' ? GL_RED + : swizzleStr[1] == 'g' ? GL_GREEN + : swizzleStr[1] == 'b' ? GL_BLUE + : swizzleStr[1] == 'a' ? GL_ALPHA + : swizzleStr[1] == '0' ? GL_ZERO + : GL_ONE; + swizzle[2] = swizzleStr[2] == 'r' ? GL_RED + : swizzleStr[2] == 'g' ? GL_GREEN + : swizzleStr[2] == 'b' ? GL_BLUE + : swizzleStr[2] == 'a' ? GL_ALPHA + : swizzleStr[2] == '2' ? GL_ZERO + : GL_ONE; + swizzle[3] = swizzleStr[3] == 'r' ? GL_RED + : swizzleStr[3] == 'g' ? GL_GREEN + : swizzleStr[3] == 'b' ? GL_BLUE + : swizzleStr[3] == 'a' ? GL_ALPHA + : swizzleStr[3] == '3' ? GL_ZERO + : GL_ONE; + glTexParameteri(target, GL_TEXTURE_SWIZZLE_R, swizzle[0]); + glTexParameteri(target, GL_TEXTURE_SWIZZLE_G, swizzle[1]); + glTexParameteri(target, GL_TEXTURE_SWIZZLE_B, swizzle[2]); + glTexParameteri(target, GL_TEXTURE_SWIZZLE_A, swizzle[3]); + } else { + std::stringstream message; + message << "Input file has swizzle metadata but the " + << "GL context does not support swizzling."; + // I have absolutely no idea why the following line makes clang + // raise an error about no matching conversion from + // std::__1::basic_stringstream to unsupported_ttype + // so I've resorted to using a temporary variable. + //throw(unsupported_ttype(message.str()); + std::string msg = message.str(); + throw(unsupported_ttype(msg)); + } + } + + assert(GL_NO_ERROR == glGetError()); + + ktxTexture_Destroy(kTexture); + } else { + std::stringstream message; + + message << "ktxTexture_GLUpload failed: "; + if (ktxresult != KTX_GL_ERROR) { + message << ktxErrorString(ktxresult); + throw std::runtime_error(message.str()); + } else if (kTexture->isCompressed + // Emscripten/WebGL returns INVALID_VALUE for unsupported + // ETC formats. + && (glerror == GL_INVALID_ENUM || glerror == GL_INVALID_VALUE)) { + throw unsupported_ctype(); + } else { + message << std::showbase << "GL error " << std::hex << glerror + << " occurred."; + throw std::runtime_error(message.str()); + } + } + + glClearColor(0.4f, 0.4f, 0.5f, 1.0f); + + // Must have vertex data in buffer objects to use VAO's on ES3/GL Core + glGenBuffers(1, &gnVbo); + glBindBuffer(GL_ARRAY_BUFFER, gnVbo); + + // Create the buffer data store + glBufferData(GL_ARRAY_BUFFER, + sizeof(frame_position) + sizeof(frame_color) + + sizeof(quad_position) + sizeof(quad_color) + + sizeof(quad_texture), + NULL, GL_STATIC_DRAW); + + glGenVertexArrays(2, gnVaos); + + // Interleave data copying and attrib pointer setup so offset is only + // computed once. + + // Setup VAO and buffer the data for frame + glBindVertexArray(gnVaos[FRAME]); + glEnableVertexAttribArray(0); + glEnableVertexAttribArray(1); + offset = 0; + glBufferSubData(GL_ARRAY_BUFFER, offset, + sizeof(frame_position), frame_position); + glVertexAttribPointer(0, 3, GL_BYTE, GL_FALSE, 0, (GLvoid*)offset); + offset += sizeof(frame_position); + glBufferSubData(GL_ARRAY_BUFFER, offset, sizeof(frame_color), frame_color); + glVertexAttribPointer(1, 3, GL_BYTE, GL_FALSE, 0, (GLvoid*)offset); + offset += sizeof(frame_color); + + // Setup VAO for quad + glBindVertexArray(gnVaos[QUAD]); + glEnableVertexAttribArray(0); + glEnableVertexAttribArray(1); + glEnableVertexAttribArray(2); + glBufferSubData(GL_ARRAY_BUFFER, offset, + sizeof(quad_position), quad_position); + glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (GLvoid*)offset); + offset += sizeof(quad_position); + glBufferSubData(GL_ARRAY_BUFFER, offset, sizeof(quad_color), quad_color); + glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, (GLvoid*)offset); + offset += sizeof(quad_color); + glBufferSubData(GL_ARRAY_BUFFER, offset, + sizeof(quad_texture), pfQuadTexCoords); + glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 0, (GLvoid*)offset); + + glBindVertexArray(0); + + const GLchar *actualColorFs, *actualDecalFs; + if (framebufferColorEncoding() == GL_LINEAR) { + actualColorFs = pszColorSrgbEncodeFs; + actualDecalFs = pszDecalSrgbEncodeFs; + } else { + actualColorFs = pszColorFs; + actualDecalFs = pszDecalFs; + } + try { + makeShader(GL_VERTEX_SHADER, pszVs, &gnVs); + makeShader(GL_FRAGMENT_SHADER, actualColorFs, &gnColorFs); + makeProgram(gnVs, gnColorFs, &gnColProg); + gulMvMatrixLocCP = glGetUniformLocation(gnColProg, "mvmatrix"); + gulPMatrixLocCP = glGetUniformLocation(gnColProg, "pmatrix"); + makeShader(GL_FRAGMENT_SHADER, actualDecalFs, &gnDecalFs); + makeProgram(gnVs, gnDecalFs, &gnTexProg); + } catch (std::exception& e) { + (void)e; // To quiet unused variable warnings from some compilers. + throw; + } + gulMvMatrixLocTP = glGetUniformLocation(gnTexProg, "mvmatrix"); + gulPMatrixLocTP = glGetUniformLocation(gnTexProg, "pmatrix"); + gulSamplerLocTP = glGetUniformLocation(gnTexProg, "sampler"); + glUseProgram(gnTexProg); + // We're using the default texture unit 0 + glUniform1i(gulSamplerLocTP, 0); + glDeleteShader(gnVs); + glDeleteShader(gnColorFs); + glDeleteShader(gnDecalFs); + + // Set the quad's mv matrix to scale by the texture size. + // With the pixel-mapping ortho projection set below, the texture will + // be rendered at actual size just like DrawTex*OES. + quadMvMatrix = glm::scale(glm::mat4(), + glm::vec3((float)uTexWidth / 2, + (float)uTexHeight / 2, + 1)); + + assert(GL_NO_ERROR == glGetError()); + bInitialized = true; +} + +/* ------------------------------------------------------------------------- */ + +DrawTexture::~DrawTexture() +{ + if (bInitialized) { + // A bug in the PVR SDK 3.1 emulator causes the + // glDeleteProgram(gnColProg) below to raise an INVALID_VALUE error + // if the following glUseProgram(0) has been executed. Strangely the + // equivalent line in TexturedCube.cpp, where only 1 program is used, + // does not raise an error. + glUseProgram(0); + glDeleteTextures(1, &gnTexture); + glDeleteProgram(gnTexProg); + glDeleteProgram(gnColProg); + glDeleteBuffers(1, &gnVbo); + glDeleteVertexArrays(2, gnVaos); + } + assert(GL_NO_ERROR == glGetError()); +} + +/* ------------------------------------------------------------------------- */ + +void +DrawTexture::processArgs(std::string sArgs) +{ + // Options descriptor + struct argparser::option longopts[] = { + {"external", argparser::option::no_argument, &externalFile, 1}, + {"preload", argparser::option::no_argument, &preloadImages, 1}, + {"transcode-target", argparser::option::required_argument, nullptr, 2}, + {NULL, argparser::option::no_argument, nullptr, 0} + }; + + argvector argv(sArgs); + argparser ap(argv); + + int ch; + while ((ch = ap.getopt(nullptr, longopts, nullptr)) != -1) { + switch (ch) { + case 0: break; + case 2: + transcodeTarget = TranscodeTargetStrToFmt(ap.optarg); + break; + default: assert(false); // Error in args in sample table. + } + } + assert(ap.optind < argv.size()); + ktxfilename = argv[ap.optind]; +} + +/* ------------------------------------------------------------------------- */ + +void +DrawTexture::resize(uint32_t uNewWidth, uint32_t uNewHeight) +{ + + glViewport(0, 0, uNewWidth, uNewHeight); + this->uWidth = uNewWidth; + this->uHeight = uNewHeight; + + // Set up an orthographic projection where 1 = 1 pixel, and 0,0,0 + // is at the center of the window. + //atSetOrthoZeroAtCenterMatrix(fPMatrix, + // 0.0f, (float)iWidth, + // 0.0f, (float)iHeight, + // -1.0f, 1.0f); + // Set up an orthographic projection where 1 = 1 pixel + pMatrix = glm::ortho(0.f, (float)uWidth, 0.f, (float)uHeight); + // Move (0,0,0) to the center of the window. + pMatrix *= glm::translate(glm::mat4(), + glm::vec3((float)uWidth/2, (float)uHeight/2, 0)); + + // Scale the frame to fill the viewport. To guarantee its lines + // appear we need to inset them by half-a-pixel hence the -1. + // [Lines at the edges of the clip volume may or may not appear + // depending on the OpenGL ES implementation. This is because + // (a) the edges are on the points of the diamonds of the diamond + // exit rule and slight precision errors can easily push the + // lines outside the diamonds. + // (b) the specification allows lines to be up to 1 pixel either + // side of the exact position.] + frameMvMatrix = glm::scale(glm::mat4(), + glm::vec3((float)(uWidth - 1)/2, + (float)(uHeight - 1)/2, + 1)); +} + +/* ------------------------------------------------------------------------- */ + +void +DrawTexture::run(uint32_t /*msTicks*/) +{ + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + glBindVertexArray(gnVaos[FRAME]); + glUseProgram(gnColProg); + glUniformMatrix4fv(gulMvMatrixLocCP, 1, GL_FALSE, + glm::value_ptr(frameMvMatrix)); + glUniformMatrix4fv(gulPMatrixLocCP, 1, GL_FALSE, glm::value_ptr(pMatrix)); + glDrawArrays(GL_LINE_LOOP, 0, 4); + + glBindVertexArray(gnVaos[QUAD]); + glUseProgram(gnTexProg); + glUniformMatrix4fv(gulMvMatrixLocTP, 1, GL_FALSE, + glm::value_ptr(quadMvMatrix)); + glUniformMatrix4fv(gulPMatrixLocTP, 1, GL_FALSE, glm::value_ptr(pMatrix)); + glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); + + assert(GL_NO_ERROR == glGetError()); +} + +/* ------------------------------------------------------------------------- */ diff --git a/third_party/ktx-src/tests/loadtests/glloadtests/shader-based/DrawTexture.h b/third_party/ktx-src/tests/loadtests/glloadtests/shader-based/DrawTexture.h new file mode 100644 index 0000000000000000000000000000000000000000..59f1d14abe492437ed4b5b14c169499f68ff1d6e --- /dev/null +++ b/third_party/ktx-src/tests/loadtests/glloadtests/shader-based/DrawTexture.h @@ -0,0 +1,71 @@ +/* -*- tab-iWidth: 4; -*- */ +/* vi: set sw=2 ts=4 expandtab: */ + +/* + * Copyright 2018-2020 Mark Callow. + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @file + * @brief Definition of texture loading test using glDrawTexture. + * + * @author Mark Callow + */ + +#ifndef DRAW_TEXTURE_H +#define DRAW_TEXTURE_H + +#include "GL3LoadTestSample.h" + +class DrawTexture : public GL3LoadTestSample { + public: + DrawTexture(uint32_t width, uint32_t height, + const char* const szArgs, + const std::string sBasePath); + ~DrawTexture(); + + virtual void resize(uint32_t width, uint32_t height); + virtual void run(uint32_t msTicks); + + //virtual void getOverlayText(GLTextOverlay *textOverlay); + + static LoadTestSample* + create(uint32_t width, uint32_t height, + const char* const szArgs, const std::string sBasePath); + + protected: + void processArgs(std::string sArgs); + + int preloadImages = 0; + + uint32_t uWidth; + uint32_t uHeight; + + uint32_t uTexWidth; + uint32_t uTexHeight; + + glm::mat4 frameMvMatrix; + glm::mat4 quadMvMatrix; + glm::mat4 pMatrix; + + GLuint gnTexture; + GLuint gnTexProg; + GLuint gnColProg; + +#define FRAME 0 +#define QUAD 1 + GLuint gnVaos[2]; + GLuint gnVbo; + + GLint gulMvMatrixLocTP; + GLint gulPMatrixLocTP; + GLint gulSamplerLocTP; + GLint gulMvMatrixLocCP; + GLint gulPMatrixLocCP; + + bool bInitialized; + ktx_transcode_fmt_e transcodeTarget; +}; + +#endif /* DRAW_TEXTURE_H */ diff --git a/third_party/ktx-src/tests/loadtests/glloadtests/shader-based/EncodeTexture.cpp b/third_party/ktx-src/tests/loadtests/glloadtests/shader-based/EncodeTexture.cpp new file mode 100644 index 0000000000000000000000000000000000000000..353fd86a1f7a65b756462ceaa67470687f9a6baa --- /dev/null +++ b/third_party/ktx-src/tests/loadtests/glloadtests/shader-based/EncodeTexture.cpp @@ -0,0 +1,326 @@ +/* -*- tab-width: 4; -*- */ +/* vi: set sw=2 ts=4 sts expandtab: */ + +/* + * Copyright 2018-2020 Mark Callow. + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @file + * @brief Encode a texture then texture a cube with it, transcoding if necessary. + * + * This is used principally to check the encoders are properly linked on platforms where the ktx tools are + * unavailable and libktx is a static library. + * + * @author Mark Callow, github.com/MarkCallow. + */ + +#if defined(_WIN32) + #if _MSC_VER < 1900 + #define snprintf _snprintf + #endif + #define _CRT_SECURE_NO_WARNINGS +#endif + +#include +#include +#include +#include "disable_glm_warnings.h" +#include +#include +#include "reenable_warnings.h" + +#include "EncodeTexture.h" +#include "GLTextureTranscoder.hpp" +#include "TranscodeTargetStrToFmt.h" +#include "cube.h" +#include "argparser.h" +#include "ltexceptions.h" + +/* ------------------------------------------------------------------------- */ + +extern const GLchar* pszVs; +extern const GLchar *pszDecalFs, *pszDecalSrgbEncodeFs; + +/* ------------------------------------------------------------------------- */ + +LoadTestSample* +EncodeTexture::create(uint32_t width, uint32_t height, + const char* const szArgs, + const std::string sBasePath) +{ + return new EncodeTexture(width, height, szArgs, sBasePath); +} + +EncodeTexture::EncodeTexture(uint32_t width, uint32_t height, + const char* const szArgs, + const std::string sBasePath) + : GL3LoadTestSample(width, height, szArgs, sBasePath) +{ + std::string filename; + GLenum target; + GLenum glerror; + GLuint gnDecalFs, gnVs; + GLsizeiptr offset; + ktxTexture2* kTexture; + KTX_error_code ktxresult; + + bInitialized = GL_FALSE; + gnTexture = 0; + encodeTarget = EF_ETC1S; + transcodeTarget = KTX_TTF_NOSELECTION; + + processArgs(szArgs); + + filename = getAssetPath() + ktxfilename; + ktxresult = ktxTexture_CreateFromNamedFile(filename.c_str(), + KTX_TEXTURE_CREATE_NO_FLAGS, + (ktxTexture**)&kTexture); + if (KTX_SUCCESS != ktxresult) { + std::stringstream message; + + message << "Creation of ktxTexture from \"" << filename + << "\" failed: " << ktxErrorString(ktxresult); + throw std::runtime_error(message.str()); + } + + if (!kTexture->isCompressed) { + switch (encodeTarget) { + case EF_ASTC: + ktxresult = ktxTexture2_CompressAstc(kTexture, 0); + break; + case EF_ETC1S: + ktxresult = ktxTexture2_CompressBasis(kTexture, 0); + break; + case EF_UASTC: + { + ktxBasisParams params = { }; + params.structSize = sizeof(params); + params.uastc = KTX_TRUE; + params.threadCount = 1; + ktxresult = ktxTexture2_CompressBasisEx(kTexture, ¶ms); + break; + } + } + if (KTX_SUCCESS != ktxresult) { + std::stringstream message; + + message << "Encoding of ktxTexture2 to " << encodeTarget + << " failed: " << ktxErrorString(ktxresult); + throw std::runtime_error(message.str()); + } + } + + if (ktxTexture2_NeedsTranscoding(kTexture)) { + TextureTranscoder tc; + tc.transcode((ktxTexture2*)kTexture); + } + + ktxresult = ktxTexture_GLUpload(ktxTexture(kTexture), &gnTexture, &target, + &glerror); + + if (KTX_SUCCESS == ktxresult) { + if (target != GL_TEXTURE_2D) { + /* Can only draw 2D textures */ + std::stringstream message; + + glDeleteTextures(1, &gnTexture); + + message << "App can only draw 2D textures."; + throw std::runtime_error(message.str()); + } + + if (kTexture->numLevels > 1) + // Enable bilinear mipmapping. + // TO DO: application can consider inserting a key,value pair in + // the KTX file that indicates what type of filtering to use. + glTexParameteri(target, + GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST); + else + glTexParameteri(target, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(target, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + + ktxTexture_Destroy(ktxTexture(kTexture)); + + assert(GL_NO_ERROR == glGetError()); + } else { + std::stringstream message; + + message << "Load of texture from \"" << filename << "\" failed: "; + if (ktxresult == KTX_GL_ERROR && glerror == GL_INVALID_ENUM) { + throw unsupported_ctype(); + } else { + if (ktxresult == KTX_GL_ERROR) { + message << std::showbase << "GL error " << std::hex << glerror + << " occurred."; + } else { + message << ktxErrorString(ktxresult); + } + throw std::runtime_error(message.str()); + } + } + + // By default dithering is enabled. Dithering does not provide visual + // improvement in this sample so disable it to improve performance. + glDisable(GL_DITHER); + + glEnable(GL_CULL_FACE); + glClearColor(0.2f,0.3f,0.4f,1.0f); + + // Create a VAO and bind it. + glGenVertexArrays(1, &gnVao); + glBindVertexArray(gnVao); + + // Must have vertex data in buffer objects to use VAO's on ES3/GL Core + glGenBuffers(2, gnVbo); + glBindBuffer(GL_ARRAY_BUFFER, gnVbo[0]); + // Must be done after the VAO is bound + // WebGL requires different buffers for data and indices. + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, gnVbo[1]); + + // Create the buffer data store. + glBufferData(GL_ARRAY_BUFFER, + sizeof(cube_face) + sizeof(cube_color) + sizeof(cube_texture) + + sizeof(cube_normal), NULL, GL_STATIC_DRAW); + + // Interleave data copying and attrib pointer setup so offset is only + // computed once. + glEnableVertexAttribArray(0); + glEnableVertexAttribArray(1); + glEnableVertexAttribArray(2); + glEnableVertexAttribArray(3); + offset = 0; + glBufferSubData(GL_ARRAY_BUFFER, offset, sizeof(cube_face), cube_face); + glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (GLvoid*)offset); + offset += sizeof(cube_face); + glBufferSubData(GL_ARRAY_BUFFER, offset, sizeof(cube_color), cube_color); + glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, (GLvoid*)offset); + offset += sizeof(cube_color); + glBufferSubData(GL_ARRAY_BUFFER, offset, sizeof(cube_texture), cube_texture); + glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 0, (GLvoid*)offset); + offset += sizeof(cube_texture); + glBufferSubData(GL_ARRAY_BUFFER, offset, sizeof(cube_normal), cube_normal); + glVertexAttribPointer(3, 3, GL_FLOAT, GL_FALSE, 0, (GLvoid*)offset); + offset += sizeof(cube_normal); + + glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(cube_index_buffer), + cube_index_buffer, GL_STATIC_DRAW); + + const GLchar* actualDecalFs; + if (framebufferColorEncoding() == GL_LINEAR) { + actualDecalFs = pszDecalSrgbEncodeFs; + } else { + actualDecalFs = pszDecalFs; + } + try { + makeShader(GL_VERTEX_SHADER, pszVs, &gnVs); + makeShader(GL_FRAGMENT_SHADER, actualDecalFs, &gnDecalFs); + makeProgram(gnVs, gnDecalFs, &gnTexProg); + } catch (std::exception& e) { + (void)e; // To quiet unused variable warnings from some compilers. + throw; + } + gulMvMatrixLocTP = glGetUniformLocation(gnTexProg, "mvmatrix"); + gulPMatrixLocTP = glGetUniformLocation(gnTexProg, "pmatrix"); + gulSamplerLocTP = glGetUniformLocation(gnTexProg, "sampler"); + glUseProgram(gnTexProg); + // We're using the default texture unit 0 + glUniform1i(gulSamplerLocTP, 0); + glDeleteShader(gnVs); + glDeleteShader(gnDecalFs); + + assert(GL_NO_ERROR == glGetError()); + bInitialized = GL_TRUE; +} + +EncodeTexture::~EncodeTexture() +{ + glEnable(GL_DITHER); + glDisable(GL_CULL_FACE); + if (bInitialized) { + glUseProgram(0); + glDeleteTextures(1, &gnTexture); + glDeleteProgram(gnTexProg); + glDeleteBuffers(2, gnVbo); + glDeleteVertexArrays(1, &gnVao); + } + assert(GL_NO_ERROR == glGetError()); +} + +/* ------------------------------------------------------------------------- */ + +void +EncodeTexture::processArgs(std::string sArgs) +{ + // Options descriptor + struct argparser::option longopts[] = { + {"encode", argparser::option::required_argument, nullptr, 1}, + {"transcode-target", argparser::option::required_argument, nullptr, 2}, + {NULL, argparser::option::no_argument, nullptr, 0} + }; + + argvector argv(sArgs); + argparser ap(argv); + + int ch; + while ((ch = ap.getopt(nullptr, longopts, nullptr)) != -1) { + switch (ch) { + case 0: break; + case 1: + if (!ap.optarg.compare("astc")) + encodeTarget = EF_ASTC; + else if (!ap.optarg.compare("etc1s")) + encodeTarget = EF_ETC1S; + else if (!ap.optarg.compare("uastc")) + encodeTarget = EF_UASTC; + else + assert(false && "Error in args in sample table"); + break; + case 2: + transcodeTarget = TranscodeTargetStrToFmt(ap.optarg); + break; + default: assert(false && "Error in args in sample table"); + } + } + assert(ap.optind < argv.size()); + ktxfilename = argv[ap.optind]; +} + +/* ------------------------------------------------------------------------- */ + +void +EncodeTexture::resize(uint32_t uWidth, uint32_t uHeight) +{ + glm::mat4 matProj; + + glViewport(0, 0, uWidth, uHeight); + + matProj = glm::perspective(glm::radians(45.f), + uWidth / (float)uHeight, + 1.f, 100.f); + glUniformMatrix4fv(gulPMatrixLocTP, 1, GL_FALSE, glm::value_ptr(matProj)); +} + +void +EncodeTexture::run(uint32_t msTicks) +{ + // Setup the view matrix : just turn around the cube. + const float fDistance = 5.0f; + glm::vec3 eye((float)cos( msTicks*0.001f ) * fDistance, + (float)sin( msTicks*0.0007f ) * fDistance, + (float)sin( msTicks*0.001f ) * fDistance); + glm::vec3 look(0.,0.,0.); + glm::vec3 up(0.,1.,0.); + glm::mat4 matView = glm::lookAt( eye, look, up ); + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + glUniformMatrix4fv(gulMvMatrixLocTP, 1, GL_FALSE, glm::value_ptr(matView)); + + glDrawElements(GL_TRIANGLES, CUBE_NUM_INDICES, GL_UNSIGNED_SHORT, 0); + + assert(GL_NO_ERROR == glGetError()); +} + +/* ------------------------------------------------------------------------- */ + diff --git a/third_party/ktx-src/tests/loadtests/glloadtests/shader-based/EncodeTexture.h b/third_party/ktx-src/tests/loadtests/glloadtests/shader-based/EncodeTexture.h new file mode 100644 index 0000000000000000000000000000000000000000..3f5507f792ff3c6c732daf00ea5915142e43d5ed --- /dev/null +++ b/third_party/ktx-src/tests/loadtests/glloadtests/shader-based/EncodeTexture.h @@ -0,0 +1,74 @@ +/* -*- tab-width: 4; -*- */ +/* vi: set sw=2 ts=4 expandtab: */ + +/* + * Copyright 2018-2022 Mark Callow. + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @file + * @brief GLLoadTestSample derived class for encoding a texture and texturing a cube with it. + * + * @author Mark Callow, github.com/MarkCallow. + */ + +#ifndef ENCODE_TEXTURE_H +#define ENCODE_TEXTURE_H + +#include "GL3LoadTestSample.h" + +#include + +class EncodeTexture : public GL3LoadTestSample { + public: + EncodeTexture(uint32_t width, uint32_t height, + const char* const szArgs, + const std::string sBasePath); + ~EncodeTexture(); + + virtual void resize(uint32_t width, uint32_t height); + virtual void run(uint32_t msTicks); + + //virtual void getOverlayText(GLTextOverlay *textOverlay); + + static LoadTestSample* + create(uint32_t width, uint32_t height, + const char* const szArgs, const std::string sBasePath); + + protected: + void processArgs(std::string sArgs); + + GLuint gnTexture; + GLuint gnTexProg; + + GLuint gnVao; + GLuint gnVbo[2]; + + GLint gulMvMatrixLocTP; + GLint gulPMatrixLocTP; + GLint gulSamplerLocTP; + + bool bInitialized; + ktx_transcode_fmt_e transcodeTarget; + enum encode_fmt_e { EF_ASTC = 1, EF_ETC1S = 2, EF_UASTC = 3 }; + friend std::ostream& operator<<(std::ostream& os, encode_fmt_e format); + encode_fmt_e encodeTarget; +}; + +inline std::ostream& operator<<(std::ostream& os, EncodeTexture::encode_fmt_e format) +{ + switch (format) { + case EncodeTexture::EF_ASTC: + os << "astc"; + break; + case EncodeTexture::EF_ETC1S: + os << "etc1s"; + break; + case EncodeTexture::EF_UASTC: + os << "uastc"; + break; + } + return os; +} +#endif /* ENCODE_TEXTURE_H */ diff --git a/third_party/ktx-src/tests/loadtests/glloadtests/shader-based/GL3LoadTestSample.cpp b/third_party/ktx-src/tests/loadtests/glloadtests/shader-based/GL3LoadTestSample.cpp new file mode 100644 index 0000000000000000000000000000000000000000..af2bb4f0382e2109133df9f163b0ac23cf05834e --- /dev/null +++ b/third_party/ktx-src/tests/loadtests/glloadtests/shader-based/GL3LoadTestSample.cpp @@ -0,0 +1,281 @@ +/* -*- tab-width: 4; -*- */ +/* vi: set sw=2 ts=4 expandtab: */ + +/* + * Copyright 2017-2020 Mark Callow. + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @internal + * @class GLLoadTestSample + * @~English + * + * @brief Definition of a base class for OpenGL texture loading test samples. + * + * @author Mark Callow, github.com/MarkCallow. + */ + +#include +#include +#include +#include + +#include "GL3LoadTestSample.h" + +/* ------------------------------------------------------------------------- */ + +static const GLchar* pszESLangVer = "#version 300 es\n"; +// location layout qualifier did not appear until version 330. +static const GLchar* pszGLLangVer = "#version 330 core\n"; + +/* ------------------------------------------------------------------------- */ + +void +GL3LoadTestSample::makeShader(GLenum type, + ShaderSource& source, + GLuint* shader) +{ + GLint sh = glCreateShader(type); + GLint shaderCompiled; + + if (strstr((const char*)glGetString(GL_VERSION), "GL ES") == NULL) + source.insert(source.cbegin(), pszGLLangVer); + else + source.insert(source.cbegin(), pszESLangVer); + glShaderSource(sh, (GLsizei)source.size(), source.data(), NULL); + glCompileShader(sh); + + // Check if compilation succeeded + glGetShaderiv(sh, GL_COMPILE_STATUS, &shaderCompiled); + + if (!shaderCompiled) { + // An error happened, first retrieve the length of the log message + int logLength, charsWritten; + char* infoLog; + std::stringstream message; + + glGetShaderiv(sh, GL_INFO_LOG_LENGTH, &logLength); + + // Allocate enough space for the message and retrieve it + infoLog = new char[logLength]; + glGetShaderInfoLog(sh, logLength, &charsWritten, infoLog); + + message << "makeShader compilation error" << std::endl << infoLog; + delete[] infoLog; + glDeleteShader(sh); + throw std::runtime_error(message.str()); + } else { + *shader = sh; + } +} + +void +GL3LoadTestSample::makeShader(GLenum type, const GLchar* const source, + GLuint* shader) +{ + ShaderSource ss; + ss.push_back(source); + makeShader(type, ss, shader); +} + +void +GL3LoadTestSample::makeProgram(GLuint vs, GLuint fs, GLuint* program) +{ + GLint linked; + GLint fsCompiled, vsCompiled; + + glGetShaderiv(vs, GL_COMPILE_STATUS, &fsCompiled); + glGetShaderiv(fs, GL_COMPILE_STATUS, &vsCompiled); + if (fsCompiled && vsCompiled) { + GLuint prog = glCreateProgram(); + + glAttachShader(prog, vs); + glAttachShader(prog, fs); + + glLinkProgram(prog); + // Check if linking succeeded in the same way we checked for compilation success + glGetProgramiv(prog, GL_LINK_STATUS, &linked); + if (!linked) { + int logLength, charsWritten; + char* infoLog; + std::stringstream message; + + glGetProgramiv(prog, GL_INFO_LOG_LENGTH, &logLength); + infoLog = new char[logLength]; + glGetProgramInfoLog(prog, logLength, &charsWritten, infoLog); + + message << "makeProgram link error" << std::endl << infoLog; + delete[] infoLog; + glDeleteProgram(prog); + throw std::runtime_error(message.str()); + } + *program = prog; + } else { + std::stringstream message; + message << "makeProgram: either vertex or fragment shader is not compiled."; + throw std::runtime_error(message.str()); + } +} + +#if !defined(GL_COMPRESSED_SRGB_PVRTC_2BPPV1_EXT) +#define GL_COMPRESSED_SRGB_PVRTC_2BPPV1_EXT 0x8A54 +#define GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG 0x8C01 +#define GL_COMPRESSED_RGBA_PVRTC_2BPPV2_IMG 0x9137 +#endif +#if !defined(GL_COMPRESSED_RG_RGTC2) +#define GL_COMPRESSED_RG_RGTC2 0x8DBD +#endif +#if !defined(GL_COMPRESSED_RGBA_BPTC_UNORM) +#define GL_COMPRESSED_RGBA_BPTC_UNORM 0x8E8C +#endif +#if !defined(GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT) +#define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT 0x8E8E +#endif + +void +GL3LoadTestSample::determineCompressedTexFeatures(compressedTexFeatures& features) +{ + ktx_int32_t numCompressedFormats; + + memset(&features, false, sizeof(features)); + + glGetIntegerv(GL_NUM_COMPRESSED_TEXTURE_FORMATS, &numCompressedFormats); + GLint* formats = new GLint[numCompressedFormats]; + glGetIntegerv(GL_COMPRESSED_TEXTURE_FORMATS, formats); + + for (ktx_int32_t i = 0; i < numCompressedFormats; i++) { + if (formats[i] == GL_COMPRESSED_RGBA8_ETC2_EAC) + features.etc2 = true; + if (formats[i] == GL_ETC1_RGB8_OES) + features.etc1 = true; + if (formats[i] == GL_COMPRESSED_RGBA_S3TC_DXT5_EXT) + features.bc3 = true; + if (formats[i] == GL_COMPRESSED_RG_RGTC2) + features.rgtc = true; + if (formats[i] == GL_COMPRESSED_SRGB_PVRTC_2BPPV1_EXT) + features.pvrtc_srgb = true; + if (formats[i] == GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG) + features.pvrtc1 = true; + if (formats[i] == GL_COMPRESSED_RGBA_PVRTC_2BPPV2_IMG) + features.pvrtc2 = true; + if (formats[i] == GL_COMPRESSED_RGBA_ASTC_4x4_KHR) + features.astc_ldr = true; + if (formats[i] == GL_COMPRESSED_RGBA_BPTC_UNORM) + features.bc7 = true; + if (formats[i] == GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT) + features.bc6h = true; + } + delete[] formats; + + // Just in case COMPRESSED_TEXTURE_FORMATS didn't return anything. + // There is no ETC2 extension. It went into core in OpenGL ES 2.0. + // ARB_es_compatibility is not a good indicator. ETC2 could be supported + // by software decompression. Better to report unsupported. + if (!features.etc1 && SDL_GL_ExtensionSupported("GL_OES_compressed_ETC1_RGB8_texture")) + features.etc1 = true;; + if (!features.bc3 && SDL_GL_ExtensionSupported("GL_EXT_texture_compression_s3tc")) + features.bc3 = true; + if (!features.rgtc && SDL_GL_ExtensionSupported("GL_ARB_texture_compression_rgtc")) + features.rgtc = true; + if (!features.pvrtc1 && SDL_GL_ExtensionSupported("GL_IMG_texture_compression_pvrtc")) + features.pvrtc1 = true; + if (!features.pvrtc2 && SDL_GL_ExtensionSupported("GL_IMG_texture_compression_pvrtc2")) + features.pvrtc2 = true; + if (!features.pvrtc_srgb && SDL_GL_ExtensionSupported("GL_EXT_pvrtc_sRGB")) + features.pvrtc_srgb = true; + if (!(features.bc7 && features.bc6h) && SDL_GL_ExtensionSupported("GL_ARB_texture_compression_bptc")) + features.bc6h = features.bc7 = true; + if (!features.astc_ldr && SDL_GL_ExtensionSupported("GL_KHR_texture_compression_astc_ldr")) + features.astc_ldr = true; + // The only way to identify this support is the extension string. + // The format name is the same. + if (SDL_GL_ExtensionSupported("GL_KHR_texture_compression_astc_hdr")) + features.astc_hdr = true; +} + +bool +GL3LoadTestSample::contextSupportsSwizzle() +{ + bool esProfile = false; + GLint majorVersion, minorVersion; + if (strstr((const char*)glGetString(GL_VERSION), "GL ES") != NULL) { + esProfile = true; + } + // MAJOR & MINOR only introduced in GL {,ES} 3.0 + glGetIntegerv(GL_MAJOR_VERSION, &majorVersion); + glGetIntegerv(GL_MINOR_VERSION, &minorVersion); + if (glGetError() != GL_NO_ERROR) { + // This is not a GL {,ES} 3.0 context... + assert(false); + return false; + } + if (esProfile) + return true; // ES 3.0+ has swizzle + else if (majorVersion == 3 && minorVersion < 3) + return false; // Swizzle was introduced in OpenGL 3.3. + else + return true; +} +#if !defined(SDL_PLATFORM_IOS) + // SDL only defines this on IOS and on Windows undefined != 0 + #define SDL_PLATFORM_IOS 0 +#endif + +GLint +GL3LoadTestSample::framebufferColorEncoding() +{ + GLint encoding = GL_SRGB; + GLenum attachment; +#if !defined(GL_BACK_LEFT) +#define GL_BACK_LEFT 0x0402 +#endif + if (strstr((const char*)glGetString(GL_VERSION), "GL ES") == NULL) + attachment = GL_BACK_LEFT; + else if (SDL_PLATFORM_IOS) + // iOS does not use the default framebuffer. + attachment = GL_COLOR_ATTACHMENT0; + else + attachment = GL_BACK; + + glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, attachment, + GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING, + &encoding); + return encoding; +} + +// Emscripten assimp port not yet available. +#if !defined(__EMSCRIPTEN__) +void +GL3LoadTestSample::loadMesh(std::string filename, + glMeshLoader::MeshBuffer& meshBuffer, + std::vector vertexLayout, + float scale) +{ + GLMeshLoader *mesh = new GLMeshLoader(); + + mesh->LoadMesh(filename); + + assert(mesh->m_Entries.size() > 0); + + mesh->CreateBuffers( + meshBuffer, + vertexLayout, + scale); + + meshBuffer.dim = mesh->dim.size; + + delete(mesh); +} +#else +void +GL3LoadTestSample::loadMesh(std::string, + glMeshLoader::MeshBuffer&, + std::vector, + float) +{ +} +#endif + + + diff --git a/third_party/ktx-src/tests/loadtests/glloadtests/shader-based/GL3LoadTestSample.h b/third_party/ktx-src/tests/loadtests/glloadtests/shader-based/GL3LoadTestSample.h new file mode 100644 index 0000000000000000000000000000000000000000..60144ad78b5cd6972df3d5d0ea7f45624e397564 --- /dev/null +++ b/third_party/ktx-src/tests/loadtests/glloadtests/shader-based/GL3LoadTestSample.h @@ -0,0 +1,76 @@ +/* -*- tab-width: 4; -*- */ +/* vi: set sw=2 ts=4 expandtab: */ + +/* + * Copyright 2017-2020 Mark Callow, . + * SPDX-License-Identifier: Apache-2.0 + */ + +#ifndef GL3_LOAD_TEST_SAMPLE_H +#define GL3_LOAD_TEST_SAMPLE_H + +#include +#include "LoadTestSample.h" +#include "mygl.h" +#include "utils/GLMeshLoader.hpp" + +#define ARRAY_LEN(a) (sizeof(a) / sizeof(a[0])) + +class GL3LoadTestSample : public LoadTestSample { + public: + typedef uint64_t ticks_t; + GL3LoadTestSample(uint32_t width, uint32_t height, + const char* const /*szArgs*/, + const std::string sBasePath) + : LoadTestSample(width, height, sBasePath) + { + } + + virtual ~GL3LoadTestSample() { } + virtual int doEvent(SDL_Event* event) { return LoadTestSample::doEvent(event); }; + virtual void resize(uint32_t width, uint32_t height) = 0; + virtual void run(uint32_t msTicks) = 0; + + //virtual void getOverlayText(TextOverlay *textOverlay) { }; + + typedef LoadTestSample* (*PFN_create)(uint32_t width, uint32_t height, + const char* const szArgs, + const std::string sBasePath); + + protected: + using ShaderSource = std::vector; + + virtual void keyPressed(uint32_t /*keyCode*/) { } + virtual void viewChanged() { } + + static bool contextSupportsSwizzle(); + + std::string ktxfilename; + int externalFile = 0; + + struct compressedTexFeatures { + bool astc_ldr; + bool astc_hdr; + bool bc6h; + bool bc7; + bool etc1; + bool etc2; + bool bc3; + bool pvrtc1; + bool pvrtc_srgb; + bool pvrtc2; + bool rgtc; + }; + + static void determineCompressedTexFeatures(compressedTexFeatures& features); + static GLint framebufferColorEncoding(); + void loadMesh(std::string filename, glMeshLoader::MeshBuffer& meshBuffer, + std::vector vertexLayout, + float scale); + static void makeShader(GLenum type, ShaderSource& source, GLuint* shader); + static void makeShader(GLenum type, const GLchar* const source, + GLuint* shader); + static void makeProgram(GLuint vs, GLuint fs, GLuint* program); +}; + +#endif /* GL3_LOAD_TEST_SAMPLE_H */ diff --git a/third_party/ktx-src/tests/loadtests/glloadtests/shader-based/GL3LoadTests.cpp b/third_party/ktx-src/tests/loadtests/glloadtests/shader-based/GL3LoadTests.cpp new file mode 100644 index 0000000000000000000000000000000000000000..52cb4037db4c680ec0aa9043b331ec3bf8401ca6 --- /dev/null +++ b/third_party/ktx-src/tests/loadtests/glloadtests/shader-based/GL3LoadTests.cpp @@ -0,0 +1,278 @@ +/* -*- tab-width: 4; -*- */ +/* vi: set sw=2 ts=4 expandtab: */ + +/* + * Copyright 2015-2020 Mark Callow. + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @internal + * @file + * @~English + * + * @brief Instantiate GLLoadTests app with set of tests for OpenGL 3.3+ and + * OpenGL ES 3.x + */ + +#include +#include + +#include "GLLoadTests.h" +#include "EncodeTexture.h" +#include "DrawTexture.h" +#include "TexturedCube.h" +#include "Texture3d.h" +#include "TextureCubemap.h" +#include "TextureArray.h" +#include "TextureMipmap.h" + +#if !defined TEST_COMPRESSION +#define TEST_COMPRESSION 1 +#endif + +LoadTestSample* +GLLoadTests::showFile(const std::string& filename) +{ + KTX_error_code ktxresult; + ktxTexture* kTexture; + ktxresult = ktxTexture_CreateFromNamedFile(filename.c_str(), + KTX_TEXTURE_CREATE_NO_FLAGS, + &kTexture); + if (KTX_SUCCESS != ktxresult) { + std::stringstream message; + + message << "Creation of ktxTexture from \"" << filename + << "\" failed: " << ktxErrorString(ktxresult); + throw std::runtime_error(message.str()); + } + + LoadTestSample::PFN_create createViewer; + LoadTestSample* pViewer; + if (kTexture->numDimensions == 3) + createViewer = Texture3d::create; + else if (kTexture->isArray && kTexture->isCubemap) { + // TODO: Add cubemap array app. + std::stringstream message; + message << "Display of cubemap array textures not yet implemented."; + throw std::runtime_error(message.str()); + } else if (kTexture->isArray) { + createViewer = TextureArray::create; + } else if (kTexture->isCubemap) { +#if !defined(__EMSCRIPTEN__) + createViewer = TextureCubemap::create; +#else + throw std::runtime_error("Emscripten viewer can't display cube maps" + " because there is no libassimp support."); +#endif + } else if (kTexture->numLevels > 1 || kTexture->generateMipmaps) { + // TODO: Add option to choose to display showing the individual + // mipmaps vs. DrawTexture that displays a single rect using the + // mipmaps, if present. + createViewer = TextureMipmap::create; + } else { + createViewer = DrawTexture::create; + } + ktxTexture_Destroy(kTexture); + + // Escape any spaces in filename. + std::string args = "--external " + std::regex_replace( filename, std::regex(" "), "\\ " ); + pViewer = createViewer(w_width, w_height, args.c_str(), sBasePath); + return pViewer; +} + +const GLLoadTests::sampleInvocation siSamples[] = { + { DrawTexture::create, + "etc1s_Iron_Bars_001_normal.ktx2", + "Transcode of ETC1S+BasisLZ Compressed KTX2 XY normal map mipmapped" + }, + { DrawTexture::create, + "uastc_Iron_Bars_001_normal.ktx2", + "Transcode of UASTC+zstd Compressed KTX2 XY normal map mipmapped" + }, + { DrawTexture::create, + "color_grid_uastc_zstd.ktx2", + "Transcode of UASTC+Zstd Compressed KTX2 RGB not mipmapped " + }, + { DrawTexture::create, + "color_grid_zstd.ktx2", + "Zstd Compressed KTX2 RGB not mipmapped" + }, + { DrawTexture::create, + "color_grid_uastc.ktx2", + "Transcode of UASTC Compressed KTX2 RGB not mipmapped" + }, + { DrawTexture::create, + "color_grid_basis.ktx2", + "Transcode of ETC1S+BasisLZ Compressed KTX2 RGB not mipmapped" + }, + { DrawTexture::create, + "kodim17_basis.ktx2", + "Transcode of ETC1S+BasisLZ Compressed KTX2 RGB not mipmapped" + }, + { DrawTexture::create, + "--transcode-target RGBA4444 kodim17_basis.ktx2", + "Transcode of ETC1S+BasisLZ Compressed KTX2 RGB not mipmapped to RGBA4444" + }, + { EncodeTexture::create, + "FlightHelmet_baseColor_basis.ktx2", + "Transcode of ETC1S+BasisLZ Compressed KTX2 RGBA not mipmapped" + }, +#if TEST_COMPRESSION + { EncodeTexture::create, + "--encode etc1s rgba-reference-u.ktx2", + "Encode to ETC1S+BasisLZ then Transcode of Compressed KTX2 RGBA not mipmapped" + }, + { EncodeTexture::create, + "--encode uastc rgba-reference-u.ktx2", + "Encode to UASTC then Transcode of Compressed KTX2 RGBA not mipmapped" + }, + { EncodeTexture::create, + "--encode astc rgba-reference-u.ktx2", + "Encode to ASTC then display RGBA not mipmapped" + }, +#endif +#if !defined(__EMSCRIPTEN__) + { TextureCubemap::create, + "cubemap_goldengate_uastc_rdo4_zstd5_rd.ktx2", + "Transcode of UASTC+rdo+zstd Compressed KTX2 Cube Map Transcoded" + }, + { TextureCubemap::create, + "cubemap_yokohama_basis_rd.ktx2", + "Transcode of ETC1S/BasisLZ Compressed KTX2 mipmapped cube map", + }, +#endif + { DrawTexture::create, + "orient-down-metadata-u.ktx2", + "KTX2: RGB8 + KTXOrientation down" + }, + { DrawTexture::create, + "--preload orient-down-metadata-u.ktx2", + "KTX2: RGB8 + KTXOrientation down with pre-loaded images" + }, + { TextureArray::create, + "texturearray_bc3_unorm.ktx2", + "KTX2: BC3 (S3TC DXT5) Compressed Texture Array" + }, + { TextureArray::create, + "texturearray_astc_8x8_unorm.ktx2", + "KTX2: ASTC 8x8 Compressed Texture Array" + }, + { TextureArray::create, + "texturearray_etc2_unorm.ktx2", + "KTX2: ETC2 Compressed Texture Array" + }, + { Texture3d::create, + "3dtex_7_reference_u.ktx2", + "RGBA8 3d Texture, Depth == 7" + }, + { TexturedCube::create, + "rgb-mipmap-reference-u.ktx2", + "KTX2: RGB8 Color/level mipmap" + }, + { DrawTexture::create, + "hi_mark.ktx", + "RGB8 NPOT HI Logo" + }, + { DrawTexture::create, + "orient-up-metadata.ktx", + "RGB8 + KTXOrientation up" + }, + { DrawTexture::create, + "orient-down-metadata.ktx", + "RGB8 + KTXOrientation down" + }, + { DrawTexture::create, + "not4_rgb888_srgb.ktx", + "RGB8 2D, Row length not Multiple of 4" + }, + { DrawTexture::create, + "etc1.ktx", + "ETC1 RGB8" + }, + { DrawTexture::create, + "etc2-rgb.ktx", + "ETC2 RGB8" + }, + { DrawTexture::create, + "etc2-rgba1.ktx", + "ETC2 RGB8A1" + }, + { DrawTexture::create, + "etc2-rgba8.ktx", + "ETC2 RGB8A8" + }, + { DrawTexture::create, + "etc2-sRGB.ktx", + "ETC2 sRGB8" + }, + { DrawTexture::create, + "etc2-sRGBa1.ktx", + "ETC2 sRGB8A1" + }, + { DrawTexture::create, + "etc2-sRGBa8.ktx", + "ETC2 sRGB8A8" + }, + { DrawTexture::create, + "rgba-reference.ktx", + "RGBA8" + }, + { DrawTexture::create, + "rgb-reference.ktx", + "RGB8" + }, + { DrawTexture::create, + "conftestimage_R11_EAC.ktx", + "ETC2 R11" + }, + { DrawTexture::create, + "conftestimage_SIGNED_R11_EAC.ktx", + "ETC2 Signed R11" + }, + { DrawTexture::create, + "conftestimage_RG11_EAC.ktx", + "ETC2 RG11" + }, + { DrawTexture::create, + "conftestimage_SIGNED_RG11_EAC.ktx", + "ETC2 Signed RG11" + }, + { TextureArray::create, + "texturearray_bc3_unorm.ktx", + "BC3 (S3TC DXT5) Compressed Texture Array" + }, + { TextureArray::create, + "texturearray_astc_8x8_unorm.ktx", + "ASTC 8x8 Compressed Texture Array" + }, + { TextureArray::create, + "texturearray_etc2_unorm.ktx", + "ETC2 Compressed Texture Array" + }, + { TexturedCube::create, + "rgb-amg-reference.ktx", + "RGB8 + Auto Mipmap" + }, + { TexturedCube::create, + "rgb-mipmap-reference.ktx", + "RGB8 Color/level mipmap" + }, + { TexturedCube::create, + "hi_mark_sq.ktx", + "RGB8 NPOT HI Logo" + }, +}; + +const uint32_t uNumSamples = sizeof(siSamples) / sizeof(GLLoadTests::sampleInvocation); + +#if !(defined(GL_CONTEXT_PROFILE) && defined(GL_CONTEXT_MAJOR_VERSION) && defined(GL_CONTEXT_MINOR_VERSION)) + #error GL_CONTEXT_PROFILE, GL_CONTEXT_MAJOR_VERSION & GL_CONTEXT_MINOR_VERSION must be defined. +#endif + +AppBaseSDL* theApp = new GLLoadTests(siSamples, uNumSamples, + "KTX Loader Tests for GL3 & ES3", + GL_CONTEXT_PROFILE, + GL_CONTEXT_MAJOR_VERSION, + GL_CONTEXT_MINOR_VERSION); + diff --git a/third_party/ktx-src/tests/loadtests/glloadtests/shader-based/InstancedSampleBase.cpp b/third_party/ktx-src/tests/loadtests/glloadtests/shader-based/InstancedSampleBase.cpp new file mode 100644 index 0000000000000000000000000000000000000000..052086305e27ed54dc0368dc4ff0117e4d871050 --- /dev/null +++ b/third_party/ktx-src/tests/loadtests/glloadtests/shader-based/InstancedSampleBase.cpp @@ -0,0 +1,476 @@ +/* -*- tab-width: 4; -*- */ +/* vi: set sw=2 ts=4 expandtab: */ + +/* + * Copyright 2018-2021 Mark Callow. + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @internal + * @file + * @~English + * + * @brief Base for samplesusing instancing such as array texture display. + * + * @author Mark Callow, github.com/MarkCallow. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "argparser.h" +#include "InstancedSampleBase.h" +#include "TranscodeTargetStrToFmt.h" +#include "GLTextureTranscoder.hpp" +#include "ltexceptions.h" + +#define member_size(type, member) sizeof(((type *)0)->member) + +using namespace std; + +const GLchar* InstancedSampleBase::pszInstancingFsDeclarations = + "precision mediump float;\n" + + "in vec3 UVW;\n\n" + + "layout (location = 0) out vec4 outFragColor;\n\n"; + +const GLchar* InstancedSampleBase::pszSrgbEncodeFunc = + "vec3 srgb_encode(vec3 color) {\n" + " float r = color.r < 0.0031308 ? 12.92 * color.r : 1.055 * pow(color.r, 1.0/2.4) - 0.055;\n" + " float g = color.g < 0.0031308 ? 12.92 * color.g : 1.055 * pow(color.g, 1.0/2.4) - 0.055;\n" + " float b = color.b < 0.0031308 ? 12.92 * color.b : 1.055 * pow(color.b, 1.0/2.4) - 0.055;\n" + " return vec3(r, g, b);\n" + "}\n\n"; + +const GLchar* InstancedSampleBase::pszInstancingFsMain = + "void main()\n" + "{\n" + " outFragColor = texture(uSampler, UVW);\n" + "}"; + +const GLchar* InstancedSampleBase::pszInstancingSrgbEncodeFsMain = + "void main()\n" + "{\n" + " vec4 t_color = texture(uSampler, UVW);\n" + " outFragColor.rgb = srgb_encode(t_color.rgb);\n" + " outFragColor.a = t_color.a;\n" + "}"; + +const GLchar* InstancedSampleBase::pszInstancingVsDeclarations = + "layout (location = 0) in vec4 inPos;\n" + "layout (location = 1) in vec2 inUV;\n\n" + + "struct Instance\n" + "{\n" + " mat4 model;\n" + "};\n\n" + + "//layout (binding = 0) uniform UBO\n" + "layout(std140) uniform UBO\n" + "{\n" + " mat4 projection;\n" + " mat4 view;\n" + " Instance instance[INSTANCE_COUNT];\n" + "} ubo;\n\n" + + "out vec3 UVW;\n\n"; + + +/* ------------------------------------------------------------------------- */ + + +/** + * @internal + * @class InstancedSampleBase + * @~English + * + * @brief Test loading of 2D texture arrays. + */ +InstancedSampleBase::InstancedSampleBase(uint32_t width, uint32_t height, + const char* const szArgs, + const string sBasePath) + : GL3LoadTestSample(width, height, szArgs, sBasePath), + texUnit(GL_TEXTURE0), uniformBufferBindId(0), + bInitialized(false) +{ + zoom = -15.0f; + rotationSpeed = 0.25f; + //rotation = glm::vec3(-15.0f, 35.0f, 0.0f); + rotation = glm::vec3(15.0f, 35.0f, 0.0f); + gnTexture = 0; + // Ensure we're using the desired unit + glActiveTexture(texUnit); + + processArgs(szArgs); + + KTX_error_code ktxresult; + ktxTexture* kTexture; + GLenum glerror; + string ktxfilepath = externalFile ? ktxfilename + : getAssetPath() + ktxfilename; + ktxresult = + ktxTexture_CreateFromNamedFile(ktxfilepath.c_str(), + KTX_TEXTURE_CREATE_NO_FLAGS, + &kTexture); + if (KTX_SUCCESS != ktxresult) { + std::stringstream message; + + message << "Creation of ktxTexture from \"" << ktxfilepath + << "\" failed: " << ktxErrorString(ktxresult); + throw std::runtime_error(message.str()); + } + + if (ktxTexture_NeedsTranscoding(kTexture)) { + transcodeTarget = KTX_TTF_NOSELECTION; + TextureTranscoder tc; + tc.transcode((ktxTexture2*)kTexture, transcodeTarget); + } + + ktxresult = ktxTexture_GLUpload(kTexture, &gnTexture, &texTarget, + &glerror); + + if (KTX_SUCCESS != ktxresult) { + std::stringstream message; + + message << "ktxTexture_GLUpload failed: "; + if (ktxresult != KTX_GL_ERROR) { + message << ktxErrorString(ktxresult); + throw std::runtime_error(message.str()); + } else if (kTexture->isCompressed && glerror == GL_INVALID_ENUM) { + throw unsupported_ctype(); + } else { + message << std::showbase << "GL error " << std::hex << glerror + << " occurred."; + throw std::runtime_error(message.str()); + } + } + + if (kTexture->generateMipmaps) { + // GLUpload will have generated the mipmaps already. + uint32_t maxDim = (std::max)( + (std::max)(kTexture->baseWidth, kTexture->baseHeight), + kTexture->baseDepth); + textureInfo.numLevels = (uint32_t)floor(log2(maxDim)) + 1; + } else { + textureInfo.numLevels = kTexture->numLevels; + } + textureInfo.numLayers = kTexture->numLayers; + textureInfo.baseDepth = kTexture->baseDepth; + if (textureInfo.numLevels > 1) + bIsMipmapped = true; + else + bIsMipmapped = false; + + // Checking if KVData contains keys of interest would go here. + + ktxTexture_Destroy(kTexture); +} + +InstancedSampleBase::~InstancedSampleBase() +{ + cleanup(); +} + +void +InstancedSampleBase::resize(uint32_t width, uint32_t height) +{ + this->w_width = width; + this->w_height = height; + + glViewport(0, 0, width, height); + updateUniformBufferMatrices(); +} + +void +InstancedSampleBase::run(uint32_t /*msTicks*/) +{ + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + // Keep these permanently bound + //glBindVertexArray(gnVao); + // Must be done after the VAO is bound + //glBindBuffer(GL_ARRAY_BUFFER, gnVbo[0]); + //glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, gnVbo[1]); + glDrawElementsInstanced(GL_TRIANGLES, quad.indexCount, + GL_UNSIGNED_INT, (GLvoid*)quad.indicesOffset, + instanceCount); + + assert(GL_NO_ERROR == glGetError()); +} + +//=================================================================== + +void +InstancedSampleBase::processArgs(string sArgs) +{ + // Options descriptor + struct argparser::option longopts[] = { + {"external", argparser::option::no_argument, &externalFile, 1}, + {"transcode-target", argparser::option::required_argument, nullptr, 2}, + {NULL, argparser::option::no_argument, NULL, 0} + }; + + argvector argv(sArgs); + argparser ap(argv); + + int ch; + while ((ch = ap.getopt(nullptr, longopts, nullptr)) != -1) { + switch (ch) { + case 0: break; + case 2: + transcodeTarget = TranscodeTargetStrToFmt(ap.optarg); + break; + default: assert(false); // Error in args in sample table. + } + } + assert(ap.optind < argv.size()); + ktxfilename = argv[ap.optind]; +} + +/* ------------------------------------------------------------------------- */ + +void +InstancedSampleBase::cleanup() +{ + glEnable(GL_DITHER); + glEnable(GL_CULL_FACE); + glFrontFace(GL_CCW); + glDisable(GL_DEPTH_TEST); + if (bInitialized) { + glUseProgram(0); + glDeleteTextures(1, &gnTexture); + glDeleteProgram(gnInstancingProg); + glDeleteBuffers(2, quad.gnVbo); + glDeleteVertexArrays(1, &quad.gnVao); + delete uboVS.instance; + } + assert(GL_NO_ERROR == glGetError()); +} + +// Setup vertices for a single uv-mapped quad +void +InstancedSampleBase::generateQuad() +{ +#define dim 2.5f + //std::vector vertices = + TAVertex vertices[] = + { + { { dim, dim, 0.0f }, { 1.0f, 1.0f } }, + { { -dim, dim, 0.0f }, { 0.0f, 1.0f } }, + { { -dim, -dim, 0.0f }, { 0.0f, 0.0f } }, + { { dim, -dim, 0.0f }, { 1.0f, 0.0f } } + }; +#undef dim + + // Setup indices + uint32_t indices[] = { 0,1,2, 2,3,0 }; + quad.indexCount = static_cast(ARRAY_LEN(indices)); + + // Create a VAO and bind it. + glGenVertexArrays(1, &quad.gnVao); + glBindVertexArray(quad.gnVao); + + // Must have vertex data in buffer objects to use VAO's on ES3/GL Core + glGenBuffers(2, quad.gnVbo); + glBindBuffer(GL_ARRAY_BUFFER, quad.gnVbo[0]); + // Must be done after the VAO is bound + // WebGL requires different buffers for data and indices. + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, quad.gnVbo[1]); + + // Create the buffer data store. + glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), NULL, GL_STATIC_DRAW); + + glEnableVertexAttribArray(0); + glEnableVertexAttribArray(1); + GLsizeiptr offset = 0; + glBufferSubData(GL_ARRAY_BUFFER, offset, sizeof(vertices), vertices); + quad.verticesOffset = offset; + glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(TAVertex), + (GLvoid*)offset); + offset += member_size(TAVertex, pos); + glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, + sizeof(TAVertex), (GLvoid*)offset); + offset = sizeof(vertices); + + glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), + indices, GL_STATIC_DRAW); + quad.indicesOffset = 0; +} + +#define _PAD16(nbytes) (ktx_uint32_t)(16 * ceilf((float)(nbytes) / 16)) + +void +InstancedSampleBase::prepareUniformBuffers() +{ + uProgramUniforms = glGetUniformBlockIndex(gnInstancingProg, "UBO"); + if (uProgramUniforms == -1) { + std::stringstream message; + + message << "prepareUniformBuffers: UBO not found in program"; + throw std::runtime_error(message.str()); + } + + // INSTANCE_COUNT is set in GLSL code via define set in prepareProgram. + // + // Elements of the array of UboInstanceData will be aligned on 16-byte + // boundaries per the std140 rule for mat4/vec4. _PAD16 is unnecessary + // right now but will become so if anything is added to the ubo before + // the UboInstanceData. _PAD16 is put here as a warning. + uint32_t uboSize = _PAD16(sizeof(uboVS.matrices)) + + instanceCount * sizeof(UboInstanceData); + uboVS.instance = new UboInstanceData[instanceCount]; + + glGenBuffers(1, &gnUbo); + glBindBuffer(GL_UNIFORM_BUFFER, gnUbo); + // Create the data store. + glBufferData(GL_UNIFORM_BUFFER, uboSize, 0, GL_DYNAMIC_DRAW); + + float offset = 1.5f; + float center = (instanceCount * offset) / 2; + for (uint32_t i = 0; i < instanceCount; i++) + { + // Instance model matrix + uboVS.instance[i].model + = glm::translate(glm::mat4(), glm::vec3(0.0f, + i * offset - center, 0.0f)); + uboVS.instance[i].model = glm::rotate(uboVS.instance[i].model, + glm::radians(120.0f), + glm::vec3(1.0f, 0.0f, 0.0f)); + } + + // Update instanced part of the uniform buffer + // N.B. See comment re _PAD16 before uboSize above. + uint32_t dataOffset = _PAD16(sizeof(uboVS.matrices)); + uint32_t dataSize = instanceCount * sizeof(UboInstanceData); + glBufferSubData(GL_UNIFORM_BUFFER, dataOffset, dataSize, uboVS.instance); + + glBindBuffer(GL_UNIFORM_BUFFER, 0); + glBindBufferBase(GL_UNIFORM_BUFFER, uniformBufferBindId, gnUbo); + + glUseProgram(gnInstancingProg); + glUniformBlockBinding(gnInstancingProg, uProgramUniforms, + uniformBufferBindId); + updateUniformBufferMatrices(); + glUseProgram(0); + + assert(glGetError() == GL_NO_ERROR); +} + +void +InstancedSampleBase::updateUniformBufferMatrices() +{ + // Only updates the uniform buffer block part containing the global matrices + + // Projection + uboVS.matrices.projection = glm::perspective(glm::radians(60.0f), + (float)w_width / w_height, + .01f, 256.f); + + // View + uboVS.matrices.view = glm::translate(glm::mat4(), + glm::vec3(0.0f, 1.0f, zoom)); + uboVS.matrices.view *= glm::translate(glm::mat4(), cameraPos); + uboVS.matrices.view = glm::rotate(uboVS.matrices.view, + glm::radians(rotation.x), + glm::vec3(1.0f, 0.0f, 0.0f)); + uboVS.matrices.view = glm::rotate(uboVS.matrices.view, + glm::radians(rotation.y), + glm::vec3(0.0f, 1.0f, 0.0f)); + uboVS.matrices.view = glm::rotate(uboVS.matrices.view, + glm::radians(rotation.z), + glm::vec3(0.0f, 0.0f, 1.0f)); + +#if !defined(EMSCRIPTEN) + // Only update the matrices part of the uniform buffer + uint8_t *pData = (uint8_t*)glMapBufferRange(GL_UNIFORM_BUFFER, 0, + sizeof(uboVS.matrices), + GL_MAP_WRITE_BIT); + memcpy(pData, &uboVS.matrices, sizeof(uboVS.matrices)); + glUnmapBuffer(GL_UNIFORM_BUFFER); +#else + glBufferSubData(GL_UNIFORM_BUFFER, 0, + sizeof(uboVS.matrices), &uboVS.matrices); +#endif +} + +void +InstancedSampleBase::prepareSampler() +{ + glBindTexture(texTarget, gnTexture); + if (bIsMipmapped) + glTexParameteri(texTarget, + GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST); + else + glTexParameteri(texTarget, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(texTarget, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glBindTexture(texTarget, 0); + + glUseProgram(gnInstancingProg); + if ((uSampler = glGetUniformLocation(gnInstancingProg, + "uSampler")) == -1) { + std::stringstream message; + + message << "prepareSampler: uSampler not found in program"; + throw std::runtime_error(message.str()); + } + glUniform1i(uSampler, texUnit - GL_TEXTURE0); + glUseProgram(0); + +} + +void +InstancedSampleBase::prepareProgram(ShaderSource& fs, ShaderSource& vs) +{ + GLuint gnInstancingFs, gnInstancingVs; + + try { + std::stringstream ssDefine; + ssDefine << "#define INSTANCE_COUNT " << instanceCount << "U" << endl; + // str().c_str() doesn't work because str goes outof scope immediately. + // Hence this 2 step process. + string sDefine = ssDefine.str(); + vs.insert(vs.begin(), sDefine.c_str()); + makeShader(GL_VERTEX_SHADER, vs, &gnInstancingVs); + makeShader(GL_FRAGMENT_SHADER, fs, &gnInstancingFs); + makeProgram(gnInstancingVs, gnInstancingFs, &gnInstancingProg); + } catch (std::exception& e) { + (void)e; // To quiet unused variable warnings from some compilers. + throw; + } + glDeleteShader(gnInstancingVs); + glDeleteShader(gnInstancingFs); +} + +void +InstancedSampleBase::prepare(ShaderSource& fs, ShaderSource& vs) +{ + // By default dithering is enabled. Dithering does not provide visual + // improvement in this sample so disable it to improve performance. + glDisable(GL_DITHER); + + glFrontFace(GL_CW); + glDisable(GL_CULL_FACE); + glEnable(GL_DEPTH_TEST); + glClearColor(0.2f,0.3f,0.4f,1.0f); + + + //prepareSamplerAndView(); + //setupVertexDescriptions(); + generateQuad(); + prepareProgram(fs, vs); + prepareUniformBuffers(); + prepareSampler(); + + glUseProgram(gnInstancingProg); + glBindTexture(texTarget, gnTexture); +} + + diff --git a/third_party/ktx-src/tests/loadtests/glloadtests/shader-based/InstancedSampleBase.h b/third_party/ktx-src/tests/loadtests/glloadtests/shader-based/InstancedSampleBase.h new file mode 100644 index 0000000000000000000000000000000000000000..4869d5279185761f38d1ed8160bd922db7bd3584 --- /dev/null +++ b/third_party/ktx-src/tests/loadtests/glloadtests/shader-based/InstancedSampleBase.h @@ -0,0 +1,121 @@ +/* -*- tab-width: 4; -*- */ +/* vi: set sw=2 ts=4 expandtab: */ + +/* + * Copyright 2018-2020 Mark Callow. + * SPDX-License-Identifier: Apache-2.0 + */ + +#ifndef _INSTANCE_SAMPLE_BASE_H_ +#define _INSTANCE_SAMPLE_BASE_H_ + +#include + +#include "GL3LoadTestSample.h" + +#include + +#define VERTEX_BUFFER_BIND_ID 0 +#define ENABLE_VALIDATION false + +class InstancedSampleBase : public GL3LoadTestSample +{ + public: + InstancedSampleBase(uint32_t width, uint32_t height, + const char* const szArgs, + const std::string sBasePath); + ~InstancedSampleBase(); + + virtual void resize(uint32_t width, uint32_t height); + virtual void run(uint32_t msTicks); + + //virtual void getOverlayText(VulkanTextOverlay *textOverlay); + + protected: + using ShaderSource = GL3LoadTestSample::ShaderSource; + + const GLuint texUnit; + const GLuint uniformBufferBindId; + GLenum texTarget; + GLuint gnTexture; + GLuint gnInstancingProg; + GLuint gnUbo; + + ktx_transcode_fmt_e transcodeTarget; + + bool bInitialized; + bool bIsMipmapped; + + struct textureInfo { + uint32_t numLayers; + uint32_t numLevels; + uint32_t baseDepth; + } textureInfo; + uint32_t instanceCount; + + // Vertex layout for this example + struct TAVertex { + float pos[3]; + float uv[2]; + }; + + struct MeshBuffer { + uint32_t indexCount; + glm::vec3 dim; + GLuint gnVao; + GLuint gnVbo[2]; + GLsizeiptr verticesOffset; + GLsizeiptr indicesOffset; + }; + + MeshBuffer quad; + + struct UboInstanceData { + // Model matrix + glm::mat4 model; + }; + + struct { + // Global matrices + struct { + glm::mat4 projection; + glm::mat4 view; + } matrices; + // N.B. The UBO structure declared in the shader has the array of + // instance data inside the structure rather than pointed at from the + // structure. The start of the array will be aligned on a 16-byte + // boundary as it starts with a matrix. + // + // Separate data for each instance + UboInstanceData *instance; + } uboVS; + + GLint uProgramUniforms; + GLint uSampler; + + static const GLchar* pszInstancingFsDeclarations; + static const GLchar* pszSrgbEncodeFunc; + static const GLchar* pszInstancingFsMain; + static const GLchar* pszInstancingSrgbEncodeFsMain; + static const GLchar* pszInstancingVsDeclarations; + + void cleanup(); + + // Setup vertices for a single uv-mapped quad + void generateQuad(); + + void prepareUniformBuffers(); + void updateUniformBufferMatrices(); + void prepareSampler(); + void prepareProgram(ShaderSource& fs, ShaderSource& vs); + void prepare(ShaderSource& fs, ShaderSource& vs); + + void processArgs(std::string sArgs); + + virtual void viewChanged() + { + updateUniformBufferMatrices(); + } +}; + +#endif /* _INSTANCE_SAMPLE_BASE_H_ */ diff --git a/third_party/ktx-src/tests/loadtests/glloadtests/shader-based/Texture3d.cpp b/third_party/ktx-src/tests/loadtests/glloadtests/shader-based/Texture3d.cpp new file mode 100644 index 0000000000000000000000000000000000000000..4f6b20dad6b93094ce6085f3cfc11a9e06e3ffb2 --- /dev/null +++ b/third_party/ktx-src/tests/loadtests/glloadtests/shader-based/Texture3d.cpp @@ -0,0 +1,107 @@ +/* -*- tab-width: 4; -*- */ +/* vi: set sw=2 ts=4 expandtab: */ + +/* + * Copyright 2021 Mark Callow. + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @internal + * @file + * @~English + * + * @brief Definition of test sample for loading and displaying the slices of a 3d texture. + * + * @author Mark Callow, github.com/MarkCallow. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "argparser.h" +#include "Texture3d.h" +#include "ltexceptions.h" + +#define member_size(type, member) sizeof(((type *)0)->member) + +const GLchar* pszFsSampler3dDeclaration = + "uniform mediump sampler3D uSampler;\n\n"; + +const GLchar* psz3dVsMain = + "void main()\n" + "{\n" + " UVW = vec3(inUV, float(gl_InstanceID) / float(INSTANCE_COUNT - 1U));\n" + " mat4 modelView = ubo.view * ubo.instance[gl_InstanceID].model;\n" + " gl_Position = ubo.projection * modelView * inPos;\n" + "}"; + +/* ------------------------------------------------------------------------- */ + +LoadTestSample* +Texture3d::create(uint32_t width, uint32_t height, + const char* const szArgs, const std::string sBasePath) +{ + return new Texture3d(width, height, szArgs, sBasePath); +} + +/** + * @internal + * @class Texture3d + * @~English + * + * @brief Test loading of 2D texture arrays. + */ +Texture3d::Texture3d(uint32_t width, uint32_t height, + const char* const szArgs, + const std::string sBasePath) + : InstancedSampleBase(width, height, szArgs, sBasePath) +{ + zoom = -15.0f; + if (texTarget != GL_TEXTURE_3D) { + std::stringstream message; + + message << "Texture3d requires an 3d texture."; + throw std::runtime_error(message.str()); + } + + // Checking if KVData contains keys of interest would go here. + + instanceCount = textureInfo.baseDepth; + + InstancedSampleBase::ShaderSource fs; + InstancedSampleBase::ShaderSource vs; + + fs.push_back(pszInstancingFsDeclarations); + fs.push_back(pszFsSampler3dDeclaration); + if (framebufferColorEncoding() == GL_LINEAR) { + fs.push_back(pszSrgbEncodeFunc); + fs.push_back(pszInstancingSrgbEncodeFsMain); + } else { + fs.push_back(pszInstancingFsMain);; + } + vs.push_back(pszInstancingVsDeclarations); + vs.push_back(psz3dVsMain); + + try { + prepare(fs, vs); + } catch (std::exception& e) { + (void)e; // To quiet unused variable warnings from some compilers. + cleanup(); + throw; + } + + // Texture was bound by prepare() + // Set this so it is easier to recognize that the texture has the expected + // slices. + glTexParameteri(texTarget, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE); + + bInitialized = true; +} diff --git a/third_party/ktx-src/tests/loadtests/glloadtests/shader-based/Texture3d.h b/third_party/ktx-src/tests/loadtests/glloadtests/shader-based/Texture3d.h new file mode 100644 index 0000000000000000000000000000000000000000..cb53044b779cb014b8e6dfc0d5651379a643efd0 --- /dev/null +++ b/third_party/ktx-src/tests/loadtests/glloadtests/shader-based/Texture3d.h @@ -0,0 +1,41 @@ +/* -*- tab-width: 4; -*- */ +/* vi: set sw=2 ts=4 expandtab: */ + +/* + * Copyright 2021 Mark Callow. + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @internal + * @file + * @~English + * + * @brief Declaration of test sample for loading and displaying the slices of a 3d texture.. + * + * @author Mark Callow, github.com/MarkCallow. + */ + +#include + +#include "InstancedSampleBase.h" + +#include + +#define VERTEX_BUFFER_BIND_ID 0 +#define ENABLE_VALIDATION false + +class Texture3d : public InstancedSampleBase +{ + public: + Texture3d(uint32_t width, uint32_t height, + const char* const szArgs, + const std::string sBasePath); + + static LoadTestSample* + create(uint32_t width, uint32_t height, + const char* const szArgs, const std::string sBasePath); + + protected: + using ShaderSource = GL3LoadTestSample::ShaderSource; +}; diff --git a/third_party/ktx-src/tests/loadtests/glloadtests/shader-based/TextureArray.cpp b/third_party/ktx-src/tests/loadtests/glloadtests/shader-based/TextureArray.cpp new file mode 100644 index 0000000000000000000000000000000000000000..39dc84826c012ce702f31ba4d134c56a68aa39e8 --- /dev/null +++ b/third_party/ktx-src/tests/loadtests/glloadtests/shader-based/TextureArray.cpp @@ -0,0 +1,100 @@ +/* -*- tab-width: 4; -*- */ +/* vi: set sw=2 ts=4 expandtab: */ + +/* + * Copyright 2018-2020 Mark Callow. + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @internal + * @file + * @~English + * + * @brief Definition of test sample for loading and displaying the layers of a 2D array texture. + * + * @author Mark Callow, github.com/MarkCallow. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "argparser.h" +#include "TextureArray.h" +#include "ltexceptions.h" + +#define member_size(type, member) sizeof(((type *)0)->member) + +const GLchar* pszFsArraySamplerDeclaration = + "uniform mediump sampler2DArray uSampler;\n\n"; + +const GLchar* pszArrayVsMain = + "void main()\n" + "{\n" + " UVW = vec3(inUV, gl_InstanceID);\n" + " mat4 modelView = ubo.view * ubo.instance[gl_InstanceID].model;\n" + " gl_Position = ubo.projection * modelView * inPos;\n" + "}"; + +/* ------------------------------------------------------------------------- */ + +LoadTestSample* +TextureArray::create(uint32_t width, uint32_t height, + const char* const szArgs, const std::string sBasePath) +{ + return new TextureArray(width, height, szArgs, sBasePath); +} + +/** + * @internal + * @class TextureArray + * @~English + * + * @brief Test loading of 2D texture arrays. + */ +TextureArray::TextureArray(uint32_t width, uint32_t height, + const char* const szArgs, + const std::string sBasePath) + : InstancedSampleBase(width, height, szArgs, sBasePath) +{ + zoom = -15.0f; + if (texTarget != GL_TEXTURE_2D_ARRAY) { + std::stringstream message; + + message << "TextureArray requires an array texture."; + throw std::runtime_error(message.str()); + } + + // Checking if KVData contains keys of interest would go here. + + instanceCount = textureInfo.numLayers; + InstancedSampleBase::ShaderSource fs; + InstancedSampleBase::ShaderSource vs; + + fs.push_back(pszInstancingFsDeclarations); + fs.push_back(pszFsArraySamplerDeclaration); + if (framebufferColorEncoding() == GL_LINEAR) { + fs.push_back(pszSrgbEncodeFunc); + fs.push_back(pszInstancingSrgbEncodeFsMain); + } else { + fs.push_back(pszInstancingFsMain);; + } + vs.push_back(pszInstancingVsDeclarations); + vs.push_back(pszArrayVsMain); + + try { + prepare(fs, vs); + } catch (std::exception& e) { + (void)e; // To quiet unused variable warnings from some compilers. + cleanup(); + throw; + } + bInitialized = true; +} diff --git a/third_party/ktx-src/tests/loadtests/glloadtests/shader-based/TextureArray.h b/third_party/ktx-src/tests/loadtests/glloadtests/shader-based/TextureArray.h new file mode 100644 index 0000000000000000000000000000000000000000..0d4090ea291acf6922e332b02e45b5b46120f3bb --- /dev/null +++ b/third_party/ktx-src/tests/loadtests/glloadtests/shader-based/TextureArray.h @@ -0,0 +1,41 @@ +/* -*- tab-width: 4; -*- */ +/* vi: set sw=2 ts=4 expandtab: */ + +/* + * Copyright 2021 Mark Callow. + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @internal + * @file + * @~English + * + * @brief Declaration of test sample for loading and displaying the layers of a 2D array texture. + * + * @author Mark Callow, github.com/MarkCallow. + */ + +#include + +#include "InstancedSampleBase.h" + +#include + +#define VERTEX_BUFFER_BIND_ID 0 +#define ENABLE_VALIDATION false + +class TextureArray : public InstancedSampleBase +{ + public: + TextureArray(uint32_t width, uint32_t height, + const char* const szArgs, + const std::string sBasePath); + + static LoadTestSample* + create(uint32_t width, uint32_t height, + const char* const szArgs, const std::string sBasePath); + + protected: + using ShaderSource = GL3LoadTestSample::ShaderSource; +}; diff --git a/third_party/ktx-src/tests/loadtests/glloadtests/shader-based/TextureCubemap.cpp b/third_party/ktx-src/tests/loadtests/glloadtests/shader-based/TextureCubemap.cpp new file mode 100644 index 0000000000000000000000000000000000000000..3e8b10d5bbaf349745b5bab3529452112188d824 --- /dev/null +++ b/third_party/ktx-src/tests/loadtests/glloadtests/shader-based/TextureCubemap.cpp @@ -0,0 +1,710 @@ +/* -*- tab-width: 4; -*- */ +/* vi: set sw=2 ts=4 expandtab: */ + +/* + * Copyright 2020 Mark Callow. + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @internal + * @file + * @~English + * + * @brief Test loading of 2D texture arrays. + * + * @author Mark Callow, github.com/MarkCallow. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "argparser.h" +#include "TextureCubemap.h" +#include "GLTextureTranscoder.hpp" +#include "SwipeDetector.h" +#include "ltexceptions.h" + +#define member_size(type, member) sizeof(((type *)0)->member) + +const GLchar* pszReflectFs = + "precision highp float;" + "uniform UBO\n" + "{\n" + " mat4 projection;\n" + " mat4 modelView;\n" + " mat4 skyboxView;\n" + " mat4 invModelView;\n" + " mat4 uvwTransform;\n" + " float lodBias;\n" + "} ubo;\n\n" + + "uniform samplerCube uSamplerColor;\n\n" + + "in vec3 vPos;\n" + "in vec3 vNormal;\n" + "in float vLodBias;\n" + "in vec3 vViewVec;\n" + "in vec3 vLightVec;\n\n" + + "layout (location = 0) out vec4 outFragColor;\n\n" + + "void main()\n" + "{\n" + " vec3 cI = normalize (vPos);\n" + " vec3 cR = reflect (cI, normalize(vNormal));\n\n" + + " cR = vec3(ubo.uvwTransform * ubo.invModelView * vec4(cR, 0.0));\n\n" + + " vec4 color = texture(uSamplerColor, cR, vLodBias);\n\n" + + " vec3 N = normalize(vNormal);\n" + " vec3 L = normalize(vLightVec);\n" + " vec3 V = normalize(vViewVec);\n" + " vec3 R = reflect(-L, N);\n" + " vec3 ambient = vec3(0.5) * color.rgb;\n" + " vec3 diffuse = max(dot(N, L), 0.0) * vec3(1.0);\n" + " vec3 specular = pow(max(dot(R, V), 0.0), 16.0) * vec3(0.5);\n" + " outFragColor = vec4(ambient + diffuse * color.rgb + specular, 1.0);\n" + "}\n"; + +const GLchar* pszReflectSrgbEncodeFs = + "precision highp float;" + "uniform UBO\n" + "{\n" + " mat4 projection;\n" + " mat4 modelView;\n" + " mat4 skyboxView;\n" + " mat4 invModelView;\n" + " mat4 uvwTransform;\n" + " float lodBias;\n" + "} ubo;\n\n" + + "uniform samplerCube uSamplerColor;\n\n" + + "in vec3 vPos;\n" + "in vec3 vNormal;\n" + "in float vLodBias;\n" + "in vec3 vViewVec;\n" + "in vec3 vLightVec;\n\n" + + "layout (location = 0) out vec4 outFragColor;\n\n" + + "vec3 srgb_encode(vec3 color) {\n" + " float r = color.r < 0.0031308 ? 12.92 * color.r : 1.055 * pow(color.r, 1.0/2.4) - 0.055;\n" + " float g = color.g < 0.0031308 ? 12.92 * color.g : 1.055 * pow(color.g, 1.0/2.4) - 0.055;\n" + " float b = color.b < 0.0031308 ? 12.92 * color.b : 1.055 * pow(color.b, 1.0/2.4) - 0.055;\n" + " return vec3(r, g, b);\n" + "}\n\n" + + "void main()\n" + "{\n" + " vec3 cI = normalize (vPos);\n" + " vec3 cR = reflect (cI, normalize(vNormal));\n\n" + + " cR = vec3(ubo.uvwTransform * ubo.invModelView * vec4(cR, 0.0));\n\n" + + " vec4 color = texture(uSamplerColor, cR, vLodBias);\n\n" + + " vec3 N = normalize(vNormal);\n" + " vec3 L = normalize(vLightVec);\n" + " vec3 V = normalize(vViewVec);\n" + " vec3 R = reflect(-L, N);\n" + " vec3 ambient = vec3(0.5) * color.rgb;\n" + " vec3 diffuse = max(dot(N, L), 0.0) * vec3(1.0);\n" + " vec3 specular = pow(max(dot(R, V), 0.0), 16.0) * vec3(0.5);\n" + " color.rgb = srgb_encode(ambient + diffuse * color.rgb + specular);\n" + " outFragColor = vec4(color.rgb, 1.0);\n" + "}\n"; + +const GLchar* pszReflectVs = + "precision highp float;" + "layout (location = 0) in vec3 inPos;\n" + "layout (location = 1) in vec3 inNormal;\n\n" + + "uniform UBO\n" + "{\n" + " mat4 projection;\n" + " mat4 modelView;\n" + " mat4 skyboxView;\n" + " mat4 invModelView;\n" + " mat4 uvwTransform;\n" + " float lodBias;\n" + "} ubo;\n" + "\n" + "out vec3 vPos;\n" + "out vec3 vNormal;\n" + "out float vLodBias;\n" + "out vec3 vViewVec;\n" + "out vec3 vLightVec;\n\n" + + "void main()\n" + "{\n" + " gl_Position = ubo.projection * ubo.modelView * vec4(inPos, 1.0);\n\n" + + " vPos = vec3(ubo.modelView * vec4(inPos, 1.0));\n" + " vNormal = mat3(ubo.modelView) * inNormal;\n" + " vLodBias = ubo.lodBias;\n\n" + + " vec3 lightPos = vec3(0.0f, -5.0f, 5.0f);\n" + " vLightVec = lightPos.xyz - vPos.xyz;\n" + " vViewVec = -vPos.xyz;\n" + "}\n"; + +const GLchar* pszSkyboxFs = + "precision highp float;" + "uniform samplerCube uSamplerColor;\n\n" + + "in vec3 vUVW;\n\n" + + "layout (location = 0) out vec4 outFragColor;\n\n" + + "void main()\n" + "{\n" + " outFragColor = texture(uSamplerColor, vUVW);\n" + "}\n"; + +const GLchar* pszSkyboxSrgbEncodeFs = + "precision highp float;" + "uniform samplerCube uSamplerColor;\n\n" + + "in vec3 vUVW;\n\n" + + "layout (location = 0) out vec4 outFragColor;\n\n" + + "vec3 srgb_encode(vec3 color) {\n" + " float r = color.r < 0.0031308 ? 12.92 * color.r : 1.055 * pow(color.r, 1.0/2.4) - 0.055;\n" + " float g = color.g < 0.0031308 ? 12.92 * color.g : 1.055 * pow(color.g, 1.0/2.4) - 0.055;\n" + " float b = color.b < 0.0031308 ? 12.92 * color.b : 1.055 * pow(color.b, 1.0/2.4) - 0.055;\n" + " return vec3(r, g, b);\n" + "}\n\n" + + "void main()\n" + "{\n" + " vec4 color = texture(uSamplerColor, vUVW);\n" + " outFragColor.rgb = srgb_encode(color.rgb);\n" + " outFragColor.a = color.a;\n" + "}\n"; + +const GLchar* pszSkyboxVs = + "precision highp float;" + "layout (location = 0) in vec3 inPos;\n\n" + + "uniform UBO\n" + "{\n" + " mat4 projection;\n" + " mat4 modelView;\n" + " mat4 skyboxView;\n" + " mat4 invModelView;\n" + " mat4 uvwTransform;\n" + "} ubo;\n\n" + + "out vec3 vUVW;\n\n" + + "void main()\n" + "{\n" + " vUVW = (ubo.uvwTransform * vec4(inPos.xyz, 1.0)).xyz;\n" + " //vUVW = inPos.xyz;\n" + " gl_Position = (ubo.projection * ubo.skyboxView * vec4(inPos.xyz, 1.0)).xyww;\n" + "}\n"; + +/* ------------------------------------------------------------------------- */ + +// Vertex layout for this example +std::vector vertexLayout = +{ + glMeshLoader::VERTEX_LAYOUT_POSITION, + glMeshLoader::VERTEX_LAYOUT_NORMAL, + glMeshLoader::VERTEX_LAYOUT_UV +}; + +LoadTestSample* +TextureCubemap::create(uint32_t width, uint32_t height, + const char* const szArgs, const std::string sBasePath) +{ + return new TextureCubemap(width, height, szArgs, sBasePath); +} + +/** + * @internal + * @class TextureCubemap + * @~English + * + * @brief Test loading of 2D texture arrays. + */ +TextureCubemap::TextureCubemap(uint32_t width, uint32_t height, + const char* const szArgs, + const std::string sBasePath) + : GL3LoadTestSample(width, height, szArgs, sBasePath), + cubemapTexUnit(GL_TEXTURE0), uniformBufferBindId(0), + bInitialized(false) +{ + zoom = -4.0f; + rotationSpeed = 0.25f; + rotation = { -7.25f, 120.0f, 0.0f }; + gnCubemapTexture = 0; + // Ensure we're using the desired unit + glActiveTexture(cubemapTexUnit); + + processArgs(szArgs); + + KTX_error_code ktxresult; + ktxTexture* kTexture; + GLenum glerror; + std::string ktxfilepath = externalFile ? ktxfilename + : getAssetPath() + ktxfilename; + ktxresult = ktxTexture_CreateFromNamedFile(ktxfilepath.c_str(), + KTX_TEXTURE_CREATE_NO_FLAGS, + &kTexture); + if (KTX_SUCCESS != ktxresult) { + std::stringstream message; + + message << "Creation of ktxTexture from \"" << ktxfilepath + << "\" failed: " << ktxErrorString(ktxresult); + throw std::runtime_error(message.str()); + } + + if (ktxTexture_NeedsTranscoding(kTexture)) { + TextureTranscoder tc; + tc.transcode((ktxTexture2*)kTexture); + //transcoded = true; + } + + ktxresult = ktxTexture_GLUpload(kTexture, + &gnCubemapTexture, &cubemapTexTarget, + &glerror); + + if (KTX_SUCCESS != ktxresult) { + std::stringstream message; + + message << "ktxTexture_GLUpload failed: "; + if (ktxresult != KTX_GL_ERROR) { + message << ktxErrorString(ktxresult); + throw std::runtime_error(message.str()); + } else if (kTexture->isCompressed && glerror == GL_INVALID_ENUM) { + throw unsupported_ctype(); + } else { + message << std::showbase << "GL error " << std::hex << glerror + << " occurred."; + throw std::runtime_error(message.str()); + } + } + if (cubemapTexTarget != GL_TEXTURE_CUBE_MAP) { + std::stringstream message; + + message << "Loaded texture is not a cubemap texture."; + throw std::runtime_error(message.str()); + } + + numLayers = kTexture->numLayers; + if (numLayers > 1 || kTexture->generateMipmaps) + // GLUpload will have generated the mipmaps already. + bIsMipmapped = true; + else + bIsMipmapped = false; + + levelCount = kTexture->numLevels; + + if (kTexture->orientation.y == KTX_ORIENT_Y_DOWN) { + // Assume a KTX-compliant cube map. That means the faces are in a + // LH coord system with +y up, +z forward and +x on the right. + // Scale the skybox cube's z by -1 to convert it to LH coords to + // match the cube map while placing the +z face in the -z direction + // so it will be in front of the view. Alternatively we could multiply + // the cube's x by -1 which will place the +z face in the +z direction + // placing it behind the viewer. + ubo.uvwTransform = glm::scale(glm::mat4(1.0f), glm::vec3(1, 1, -1)); + } else { + std::stringstream message; + + message << "Cubemap faces have unsupported KTXorientation value."; + throw std::runtime_error(message.str()); + } + + ktxTexture_Destroy(kTexture); + + try { + prepare(); + } catch (std::exception& e) { + (void)e; // To quiet unused variable warnings from some compilers. + cleanup(); + throw; + } + bInitialized = true; +} + +TextureCubemap::~TextureCubemap() +{ + cleanup(); +} + +int +TextureCubemap::doEvent(SDL_Event* event) +{ + int result = 0; + switch(event->type) { + case SDL_EVENT_USER: + if (event->user.code == SwipeDetector::swipeGesture) { + SwipeDetector::Direction direction + = SwipeDetector::pointerToDirection(event->user.data1); + switch (direction) { + case SwipeDetector::Direction::up: + toggleObject(+1); + break; + case SwipeDetector::Direction::down: + toggleObject(-1); + break; + default: + result = 1; + } + } else { + result = 1; + } + break; + default: + result = 1; + } + if (result == 1) + result = GL3LoadTestSample::doEvent(event); + return result; +} + +void +TextureCubemap::resize(uint32_t width, uint32_t height) +{ + this->w_width = width; + this->w_height = height; + glViewport(0, 0, width, height); + updateUniformBuffers(); +} + +void +TextureCubemap::run(uint32_t /*msTicks*/) +{ + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + + // Draw object. + glFrontFace(GL_CW); // Why is everything CW? + glCullFace(GL_BACK); + glUseProgram(gnReflectProg); + meshes.objects[meshes.objectIndex].Draw(); + if (bDisplaySkybox) { + // Change so depth test passes when values are equal to the + // depth buffer's content. This works in conjunction with the + // gl_Position = inPos.xyww trick in the shader. + glDepthFunc(GL_LEQUAL); + // The cube is a regular mesh with the front faces on the outside. + // We're inside the cube so want to see the back faces. + glCullFace(GL_FRONT); + glUseProgram(gnSkyboxProg); + meshes.skybox.Draw(); + // Revert to defaults for 3D object. + glDepthFunc(GL_LESS); + } + assert(GL_NO_ERROR == glGetError()); +} + +//=================================================================== + +void +TextureCubemap::processArgs(std::string sArgs) +{ + // Options descriptor + struct argparser::option longopts[] = { + {"external", argparser::option::no_argument, &externalFile, 1}, + {NULL, argparser::option::no_argument, NULL, 0} + }; + + argvector argv(sArgs); + argparser ap(argv); + + int ch; + while ((ch = ap.getopt(nullptr, longopts, nullptr)) != -1) { + switch (ch) { + case 0: break; + default: assert(false); // Error in args in sample table. + } + } + assert(ap.optind < argv.size()); + ktxfilename = argv[ap.optind]; +} + +/* ------------------------------------------------------------------------- */ + +void +TextureCubemap::cleanup() +{ + glEnable(GL_DITHER); + glDisable(GL_CULL_FACE); + glCullFace(GL_BACK); + glFrontFace(GL_CCW); + glDisable(GL_DEPTH_TEST); + if (bInitialized) { + glUseProgram(0); + glDeleteTextures(1, &gnCubemapTexture); + glDeleteProgram(gnReflectProg); + glDeleteProgram(gnSkyboxProg); + meshes.skybox.FreeGLResources(); + for (int i = 0; i < 3; i++) { + meshes.objects[i].FreeGLResources(); + } + } + assert(GL_NO_ERROR == glGetError()); +} + +void +TextureCubemap::loadMeshes() +{ + std::string filepath = getAssetPath(); + + // Skybox + loadMesh(filepath + "cube.obj", meshes.skybox, vertexLayout, 0.05f); + + // Objects + meshes.objects.resize(3); + loadMesh(filepath + "sphere.obj", meshes.objects[0], vertexLayout, 0.05f); + loadMesh(filepath + "teapot.dae", meshes.objects[1], vertexLayout, 0.05f); + loadMesh(filepath + "torusknot.obj", meshes.objects[2], vertexLayout, 0.05f); +} + +void +TextureCubemap::prepareUniformBuffers() +{ + uReflectProgramUniforms = glGetUniformBlockIndex(gnReflectProg, "UBO"); + if (uReflectProgramUniforms == -1) { + std::stringstream message; + + message << "prepareUniformBuffers: UBO not found in reflect program"; + throw std::runtime_error(message.str()); + } + + uSkyboxProgramUniforms = glGetUniformBlockIndex(gnSkyboxProg, "UBO"); + if (uSkyboxProgramUniforms == -1) { + std::stringstream message; + + message << "prepareUniformBuffers: UBO not found in skybox program"; + throw std::runtime_error(message.str()); + } + + glGenBuffers(1, &gnUbo); + + glBindBuffer(GL_UNIFORM_BUFFER, gnUbo); + // Create the data store. + glBufferData(GL_UNIFORM_BUFFER, sizeof(ubo), 0, GL_DYNAMIC_DRAW); + + glBindBufferBase(GL_UNIFORM_BUFFER, uniformBufferBindId, gnUbo); + glUseProgram(gnReflectProg); + glUniformBlockBinding(gnReflectProg, uReflectProgramUniforms, + uniformBufferBindId); + + glUseProgram(gnSkyboxProg); + glUniformBlockBinding(gnSkyboxProg, uSkyboxProgramUniforms, + uniformBufferBindId); + + glBindBuffer(GL_UNIFORM_BUFFER, 0); + + updateUniformBuffers(); + glUseProgram(0); + + assert(glGetError() == GL_NO_ERROR); +} + +void +TextureCubemap::updateUniformBuffers() +{ + // Reflect / 3D object + glm::mat4 viewMatrix = glm::mat4(1.0f); + ubo.projection = glm::perspective(glm::radians(60.0f), + (float)w_width / (float)w_height, + 0.001f, 256.0f); + viewMatrix = glm::translate(viewMatrix, glm::vec3(0.0f, 0.0f, zoom)); + + // Transform the z axis to what the viewer is perceiving as the z axis to make + // the behaviour of 2-finger rotation (the value in rotation.z) understandable. + glm::mat4 zAxisRotMatrix; + zAxisRotMatrix = glm::rotate(zAxisRotMatrix, glm::radians(180.0f - rotation.x), + glm::vec3(1.0f, 0.0f, 0.0f)); + zAxisRotMatrix = glm::rotate(zAxisRotMatrix, glm::radians(rotation.y), + glm::vec3(0.0f, 1.0f, 0.0f)); + zRotationAxis = normalize(zAxisRotMatrix * glm::vec4(0.0f, 0.0f, 1.0f, 1.0f)); + + // I do not understand why this is necessary. Assimp is supposed to + // put models in the GL coordinate system by default but the teapot is + // upside down. Since the other objects are symmetrical it is not possible + // to say if they are upside down. + glm::mat4 object; + object = glm::rotate(object, glm::radians(180.0f), + glm::vec3(1.0f, 0.0f, 0.0f)); + ubo.modelView = viewMatrix * glm::translate(glm::mat4(), cameraPos); + ubo.modelView = glm::rotate(ubo.modelView, glm::radians(rotation.x), + glm::vec3(1.0f, 0.0f, 0.0f)); + ubo.modelView = glm::rotate(ubo.modelView, glm::radians(rotation.y), + glm::vec3(0.0f, 1.0f, 0.0f)); + ubo.modelView = glm::rotate(ubo.modelView, glm::radians(rotation.z), + zRotationAxis); + // Remove translation from modelView so the skybox doesn't move. + ubo.skyboxView = glm::mat4(glm::mat3(ubo.modelView)); + // Do the inverse here because doing it in every fragment is a bit much. + ubo.invModelView = glm::inverse(ubo.modelView); + // Now add the object rotation. + ubo.modelView = ubo.modelView * object; + + + glBindBuffer(GL_UNIFORM_BUFFER, gnUbo); +#if !defined(EMSCRIPTEN) + uint8_t* pData = (uint8_t*)glMapBufferRange(GL_UNIFORM_BUFFER, + 0, sizeof(ubo), + GL_MAP_WRITE_BIT); + memcpy(pData, &ubo, sizeof(ubo)); + glUnmapBuffer(GL_UNIFORM_BUFFER); +#else + glBufferSubData(GL_UNIFORM_BUFFER, 0, sizeof(ubo), &ubo); +#endif + glBindBuffer(GL_UNIFORM_BUFFER, 0); +} + +void +TextureCubemap::prepareSampler() +{ + glBindTexture(cubemapTexTarget, gnCubemapTexture); + if (bIsMipmapped) + glTexParameteri(cubemapTexTarget, + GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST); + else + glTexParameteri(cubemapTexTarget, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(cubemapTexTarget, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + + glUseProgram(gnReflectProg); + if ((uReflectCubemap = glGetUniformLocation(gnReflectProg, + "uSamplerColor")) == -1) { + std::stringstream message; + + message << "prepareSampler: uSamplerColor not found in reflect program"; + throw std::runtime_error(message.str()); + } + glUniform1i(uReflectCubemap, cubemapTexUnit - GL_TEXTURE0); + + glUseProgram(gnSkyboxProg); + if ((uSkyboxCubemap = glGetUniformLocation(gnSkyboxProg, + "uSamplerColor")) == -1) { + std::stringstream message; + + message << "prepareSampler: uSamplerColor not found in skybox program"; + throw std::runtime_error(message.str()); + } + glUniform1i(uSkyboxCubemap, cubemapTexUnit - GL_TEXTURE0); + + glUseProgram(0); +} + +void +TextureCubemap::preparePrograms() +{ + GLuint gnReflectFs, gnReflectVs, gnSkyboxFs, gnSkyboxVs; + const GLchar* actualReflectFs; + const GLchar* actualSkyboxFs; + + if (framebufferColorEncoding() == GL_LINEAR) { + actualReflectFs = pszReflectSrgbEncodeFs; + actualSkyboxFs = pszSkyboxSrgbEncodeFs; + } else { + actualReflectFs = pszReflectFs; + actualSkyboxFs = pszSkyboxFs; + } + try { + makeShader(GL_VERTEX_SHADER, pszReflectVs, &gnReflectVs); + makeShader(GL_FRAGMENT_SHADER, actualReflectFs, &gnReflectFs); + makeProgram(gnReflectVs, gnReflectFs, &gnReflectProg); + makeShader(GL_VERTEX_SHADER, pszSkyboxVs, &gnSkyboxVs); + makeShader(GL_FRAGMENT_SHADER, actualSkyboxFs, &gnSkyboxFs); + makeProgram(gnSkyboxVs, gnSkyboxFs, &gnSkyboxProg); + } catch (std::exception& e) { + (void)e; // To quiet unused variable warnings from some compilers. + throw; + } + glDeleteShader(gnReflectVs); + glDeleteShader(gnReflectFs); + glDeleteShader(gnSkyboxVs); + glDeleteShader(gnSkyboxFs); +} + +void +TextureCubemap::prepare() +{ + // By default dithering is enabled. Dithering does not provide visual + // improvement in this sample so disable it to improve performance. + glDisable(GL_DITHER); + + glEnable(GL_DEPTH_TEST); + glEnable(GL_CULL_FACE); + glClearColor(0.2f,0.3f,0.4f,1.0f); + + loadMeshes(); + + preparePrograms(); + prepareUniformBuffers(); + prepareSampler(); +} + +void +TextureCubemap::toggleSkyBox() +{ + bDisplaySkybox = !bDisplaySkybox; +} + +void +TextureCubemap::toggleObject(int direction) +{ + meshes.objectIndex += direction; + if (meshes.objectIndex >= static_cast(meshes.objects.size())) { + meshes.objectIndex = 0; + } else if (meshes.objectIndex < 0) { + meshes.objectIndex = static_cast(meshes.objects.size()) - 1; + } +} + +void +TextureCubemap::changeLodBias(float delta) +{ + ubo.lodBias += delta; + if (ubo.lodBias < 0.0f) + { + ubo.lodBias = 0.0f; + } + if (ubo.lodBias > levelCount) + { + ubo.lodBias = (float)levelCount; + } + updateUniformBuffers(); +} + +void +TextureCubemap::keyPressed(uint32_t keyCode) +{ + switch (keyCode) + { + case 's': + toggleSkyBox(); + break; + case ' ': + toggleObject(+1); + break; + case SDLK_KP_PLUS: + changeLodBias(0.1f); + break; + case SDLK_KP_MINUS: + changeLodBias(-0.1f); + break; + } +} + + + diff --git a/third_party/ktx-src/tests/loadtests/glloadtests/shader-based/TextureCubemap.h b/third_party/ktx-src/tests/loadtests/glloadtests/shader-based/TextureCubemap.h new file mode 100644 index 0000000000000000000000000000000000000000..a809d06db38e7f4a9510814440176892d3ab8669 --- /dev/null +++ b/third_party/ktx-src/tests/loadtests/glloadtests/shader-based/TextureCubemap.h @@ -0,0 +1,114 @@ +/* -*- tab-width: 4; -*- */ +/* vi: set sw=2 ts=4 expandtab: */ + +/* + * Copyright 2020 Mark Callow. + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @internal + * @file + * @~English + * + * @brief Test loading of a cubemap. + * + * @author Mark Callow, github.com/MarkCallow. + */ + +#include + +#include "GL3LoadTestSample.h" + +#include + +#define VERTEX_BUFFER_BIND_ID 0 +#define ENABLE_VALIDATION false + +class TextureCubemap : public GL3LoadTestSample +{ + public: + TextureCubemap(uint32_t width, uint32_t height, + const char* const szArgs, + const std::string sBasePath); + ~TextureCubemap(); + + virtual int doEvent(SDL_Event* event); + virtual void resize(uint32_t width, uint32_t height); + virtual void run(uint32_t msTicks); + + //virtual void getOverlayText(VulkanTextOverlay *textOverlay); + + static LoadTestSample* + create(uint32_t width, uint32_t height, + const char* const szArgs, const std::string sBasePath); + + protected: + const GLuint cubemapTexUnit; + const GLuint uniformBufferBindId; + GLuint levelCount = 0; + GLenum cubemapTexTarget; + GLuint gnCubemapTexture; + GLuint gnReflectProg; + GLuint gnSkyboxProg; + GLuint gnUbo; + + bool bInitialized; + bool bIsMipmapped; + bool bDisplaySkybox = true; + + uint32_t numLayers; + + // Vertex layout for this example + struct TAVertex { + float pos[3]; + float uv[2]; + }; + + struct { + glMeshLoader::MeshBuffer skybox; + std::vector objects; + int32_t objectIndex = 0; + } meshes; + + struct { + // Global matrices + glm::mat4 projection; + glm::mat4 modelView; + glm::mat4 skyboxView; + glm::mat4 invModelView; + glm::mat4 uvwTransform; + float lodBias = 0.0f; + } ubo; + + GLint uReflectProgramUniforms; + GLint uSkyboxProgramUniforms; + GLint uReflectCubemap; + GLint uSkyboxCubemap; + + glm::vec3 zRotationAxis; + + void cleanup(); + + void loadMeshes(); + + void prepareUniformBuffers(); + void updateUniformBuffers(); + void prepareSampler(); + void preparePrograms(); + void prepare(); + + void toggleSkyBox(); + void toggleObject(int direction); + void changeLodBias(float delta); + + void processArgs(std::string sArgs); + + virtual void keyPressed(uint32_t keyCode); + virtual void viewChanged() + { + updateUniformBuffers(); + } + + GLuint skyboxVAO, skyboxVBO; +}; diff --git a/third_party/ktx-src/tests/loadtests/glloadtests/shader-based/TextureMipmap.cpp b/third_party/ktx-src/tests/loadtests/glloadtests/shader-based/TextureMipmap.cpp new file mode 100644 index 0000000000000000000000000000000000000000..a4b0a1eb44d6e7653aba55d1bafacdccbbf5af53 --- /dev/null +++ b/third_party/ktx-src/tests/loadtests/glloadtests/shader-based/TextureMipmap.cpp @@ -0,0 +1,125 @@ +/* -*- tab-width: 4; -*- */ +/* vi: set sw=2 ts=4 expandtab: */ + +/* + * Copyright 2018-2020 Mark Callow. + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @internal + * @file + * @~English + * + * @brief Definition of test sample for loading and displaying all the levels of a 2D mipmapped texture. + * + * @author Mark Callow, github.com/MarkCallow. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "argparser.h" +#include "TextureMipmap.h" +#include "ltexceptions.h" + +#define member_size(type, member) sizeof(((type *)0)->member) + +const GLchar* pszLodFsDeclarations = + "precision mediump float;\n" + + "in vec2 UV;\n" + "flat in float lambda;\n\n" + + "layout (location = 0) out vec4 outFragColor;\n\n" + + "uniform mediump sampler2D uSampler;\n\n"; + +const GLchar* pszLodFsMain = + "void main()\n" + "{\n" + " outFragColor = textureLod(uSampler, UV, lambda);\n" + "}"; + +const GLchar* pszLodSrgbEncodeFsMain = + "void main()\n" + "{\n" + " vec4 t_color = textureLod(uSampler, UV, lambda);\n" + " outFragColor.rgb = srgb_encode(t_color.rgb);\n" + " outFragColor.a = t_color.a;\n" + "}"; + +const GLchar* pszLodVsMain = + "out vec2 UV;\n" + "flat out float lambda;\n\n" + + "void main()\n" + "{\n" + " UV = inUV;\n" + " lambda = gl_InstanceID + 0.5;\n" + " mat4 modelView = ubo.view * ubo.instance[gl_InstanceID].model;\n" + " gl_Position = ubo.projection * modelView * inPos;\n" + "}"; + +/* ------------------------------------------------------------------------- */ + +LoadTestSample* +TextureMipmap::create(uint32_t width, uint32_t height, + const char* const szArgs, const std::string sBasePath) +{ + return new TextureMipmap(width, height, szArgs, sBasePath); +} + +/** + * @internal + * @class TextureMipmap + * @~English + * + * @brief Test loading of 2D texture arrays. + */ +TextureMipmap::TextureMipmap(uint32_t width, uint32_t height, + const char* const szArgs, + const std::string sBasePath) + : InstancedSampleBase(width, height, szArgs, sBasePath) +{ + zoom = -15.0f; + if (texTarget != GL_TEXTURE_2D || textureInfo.numLevels == 1) { + std::stringstream message; + + message << "TextureMipmap requires a 2D mipmapped texture."; + throw std::runtime_error(message.str()); + } + + // Checking if KVData contains keys of interest would go here. + + instanceCount = textureInfo.numLevels; + + InstancedSampleBase::ShaderSource fs; + InstancedSampleBase::ShaderSource vs; + + fs.push_back(pszLodFsDeclarations); + if (framebufferColorEncoding() == GL_LINEAR) { + fs.push_back(pszSrgbEncodeFunc); + fs.push_back(pszLodSrgbEncodeFsMain); + } else { + fs.push_back(pszLodFsMain);; + } + vs.push_back(pszInstancingVsDeclarations); + vs.push_back(pszLodVsMain); + + try { + prepare(fs, vs); + } catch (std::exception& e) { + (void)e; // To quiet unused variable warnings from some compilers. + cleanup(); + throw; + } + bInitialized = true; +} diff --git a/third_party/ktx-src/tests/loadtests/glloadtests/shader-based/TextureMipmap.h b/third_party/ktx-src/tests/loadtests/glloadtests/shader-based/TextureMipmap.h new file mode 100644 index 0000000000000000000000000000000000000000..57536b477d6d526242b359ec340cde284912f4e2 --- /dev/null +++ b/third_party/ktx-src/tests/loadtests/glloadtests/shader-based/TextureMipmap.h @@ -0,0 +1,41 @@ +/* -*- tab-width: 4; -*- */ +/* vi: set sw=2 ts=4 expandtab: */ + +/* + * Copyright 2021 Mark Callow. + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @internal + * @file + * @~English + * + * @brief Declaration of test sample for loading and displaying all the levels of a 2D mipmapped texture. + * + * @author Mark Callow, github.com/MarkCallow. + */ + +#include + +#include "InstancedSampleBase.h" + +#include + +#define VERTEX_BUFFER_BIND_ID 0 +#define ENABLE_VALIDATION false + +class TextureMipmap : public InstancedSampleBase +{ + public: + TextureMipmap(uint32_t width, uint32_t height, + const char* const szArgs, + const std::string sBasePath); + + static LoadTestSample* + create(uint32_t width, uint32_t height, + const char* const szArgs, const std::string sBasePath); + + protected: + using ShaderSource = GL3LoadTestSample::ShaderSource; +}; diff --git a/third_party/ktx-src/tests/loadtests/glloadtests/shader-based/TexturedCube.cpp b/third_party/ktx-src/tests/loadtests/glloadtests/shader-based/TexturedCube.cpp new file mode 100644 index 0000000000000000000000000000000000000000..614e675263d3f6c54d88bc599ef7d62873832790 --- /dev/null +++ b/third_party/ktx-src/tests/loadtests/glloadtests/shader-based/TexturedCube.cpp @@ -0,0 +1,245 @@ +/* -*- tab-width: 4; -*- */ +/* vi: set sw=2 ts=4 sts expandtab: */ + +/* + * Copyright 2018-2020 Mark Callow. + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @file + * @brief Draw a textured cube. + * + * @author Mark Callow, github.com/MarkCallow. + */ + +#if defined(_WIN32) + #if _MSC_VER < 1900 + #define snprintf _snprintf + #endif + #define _CRT_SECURE_NO_WARNINGS +#endif + +#include +#include +#include +#include "disable_glm_warnings.h" +#include +#include +#include "reenable_warnings.h" + +#include "TexturedCube.h" +#include "cube.h" + +/* ------------------------------------------------------------------------- */ + +extern const GLchar* pszVs; +extern const GLchar *pszDecalFs, *pszDecalSrgbEncodeFs; + +/* ------------------------------------------------------------------------- */ + +LoadTestSample* +TexturedCube::create(uint32_t width, uint32_t height, + const char* const szArgs, + const std::string sBasePath) +{ + return new TexturedCube(width, height, szArgs, sBasePath); +} + +TexturedCube::TexturedCube(uint32_t width, uint32_t height, + const char* const szArgs, + const std::string sBasePath) + : GL3LoadTestSample(width, height, szArgs, sBasePath) +{ + std::string filename; + GLenum target; + GLenum glerror; + GLuint gnDecalFs, gnVs; + GLsizeiptr offset; + ktxTexture* kTexture; + KTX_error_code ktxresult; + + bInitialized = GL_FALSE; + gnTexture = 0; + + filename = getAssetPath() + szArgs; + ktxresult = ktxTexture_CreateFromNamedFile(filename.c_str(), + KTX_TEXTURE_CREATE_NO_FLAGS, + &kTexture); + if (KTX_SUCCESS != ktxresult) { + std::stringstream message; + + message << "Creation of ktxTexture from \"" << filename + << "\" failed: " << ktxErrorString(ktxresult); + throw std::runtime_error(message.str()); + } + ktxresult = ktxTexture_GLUpload(kTexture, &gnTexture, &target, &glerror); + + if (KTX_SUCCESS == ktxresult) { + if (target != GL_TEXTURE_2D) { + /* Can only draw 2D textures */ + std::stringstream message; + + glDeleteTextures(1, &gnTexture); + + message << "App can only draw 2D textures."; + throw std::runtime_error(message.str()); + } + + if (kTexture->numLevels > 1) + // Enable bilinear mipmapping. + // TO DO: application can consider inserting a key,value pair in + // the KTX file that indicates what type of filtering to use. + glTexParameteri(target, + GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST); + else + glTexParameteri(target, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(target, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + + ktxTexture_Destroy(kTexture); + + assert(GL_NO_ERROR == glGetError()); + } else { + std::stringstream message; + + message << "Load of texture from \"" << filename << "\" failed: "; + if (ktxresult == KTX_GL_ERROR) { + message << std::showbase << "GL error " << std::hex << glerror + << " occurred."; + } else { + message << ktxErrorString(ktxresult); + } + throw std::runtime_error(message.str()); + } + + // By default dithering is enabled. Dithering does not provide visual + // improvement in this sample so disable it to improve performance. + glDisable(GL_DITHER); + + glEnable(GL_CULL_FACE); + glClearColor(0.2f,0.3f,0.4f,1.0f); + + // Create a VAO and bind it. + glGenVertexArrays(1, &gnVao); + glBindVertexArray(gnVao); + + // Must have vertex data in buffer objects to use VAO's on ES3/GL Core + glGenBuffers(2, gnVbo); + glBindBuffer(GL_ARRAY_BUFFER, gnVbo[0]); + // Must be done after the VAO is bound + // WebGL requires different buffers for data and indices. + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, gnVbo[1]); + + // Create the buffer data store. + glBufferData(GL_ARRAY_BUFFER, + sizeof(cube_face) + sizeof(cube_color) + sizeof(cube_texture) + + sizeof(cube_normal), NULL, GL_STATIC_DRAW); + + // Interleave data copying and attrib pointer setup so offset is only + // computed once. + glEnableVertexAttribArray(0); + glEnableVertexAttribArray(1); + glEnableVertexAttribArray(2); + glEnableVertexAttribArray(3); + offset = 0; + glBufferSubData(GL_ARRAY_BUFFER, offset, sizeof(cube_face), cube_face); + glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (GLvoid*)offset); + offset += sizeof(cube_face); + glBufferSubData(GL_ARRAY_BUFFER, offset, sizeof(cube_color), cube_color); + glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, (GLvoid*)offset); + offset += sizeof(cube_color); + glBufferSubData(GL_ARRAY_BUFFER, offset, sizeof(cube_texture), cube_texture); + glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 0, (GLvoid*)offset); + offset += sizeof(cube_texture); + glBufferSubData(GL_ARRAY_BUFFER, offset, sizeof(cube_normal), cube_normal); + glVertexAttribPointer(3, 3, GL_FLOAT, GL_FALSE, 0, (GLvoid*)offset); + offset += sizeof(cube_normal); + + glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(cube_index_buffer), + cube_index_buffer, GL_STATIC_DRAW); + + const GLchar* actualDecalFs; + if (framebufferColorEncoding() == GL_LINEAR) { + actualDecalFs = pszDecalSrgbEncodeFs; + } else { + actualDecalFs = pszDecalFs; + } + try { + makeShader(GL_VERTEX_SHADER, pszVs, &gnVs); + makeShader(GL_FRAGMENT_SHADER, actualDecalFs, &gnDecalFs); + makeProgram(gnVs, gnDecalFs, &gnTexProg); + } catch (std::exception& e) { + (void)e; // To quiet unused variable warnings from some compilers. + throw; + } + try { + makeShader(GL_VERTEX_SHADER, pszVs, &gnVs); + makeShader(GL_FRAGMENT_SHADER, pszDecalFs, &gnDecalFs); + makeProgram(gnVs, gnDecalFs, &gnTexProg); + } catch (std::exception& e) { + (void)e; // To quiet unused variable warnings from some compilers. + throw; + } + gulMvMatrixLocTP = glGetUniformLocation(gnTexProg, "mvmatrix"); + gulPMatrixLocTP = glGetUniformLocation(gnTexProg, "pmatrix"); + gulSamplerLocTP = glGetUniformLocation(gnTexProg, "sampler"); + glUseProgram(gnTexProg); + // We're using the default texture unit 0 + glUniform1i(gulSamplerLocTP, 0); + glDeleteShader(gnVs); + glDeleteShader(gnDecalFs); + + assert(GL_NO_ERROR == glGetError()); + bInitialized = GL_TRUE; +} + +TexturedCube::~TexturedCube() +{ + glEnable(GL_DITHER); + glEnable(GL_CULL_FACE); + if (bInitialized) { + glUseProgram(0); + glDeleteTextures(1, &gnTexture); + glDeleteProgram(gnTexProg); + glDeleteBuffers(2, gnVbo); + glDeleteVertexArrays(1, &gnVao); + } + assert(GL_NO_ERROR == glGetError()); +} + + +void +TexturedCube::resize(uint32_t uWidth, uint32_t uHeight) +{ + glm::mat4 matProj; + + glViewport(0, 0, uWidth, uHeight); + + matProj = glm::perspective(glm::radians(45.f), + uWidth / (float)uHeight, + 1.f, 100.f); + glUniformMatrix4fv(gulPMatrixLocTP, 1, GL_FALSE, glm::value_ptr(matProj)); +} + +void +TexturedCube::run(uint32_t msTicks) +{ + // Setup the view matrix : just turn around the cube. + const float fDistance = 5.0f; + glm::vec3 eye((float)cos( msTicks*0.001f ) * fDistance, + (float)sin( msTicks*0.0007f ) * fDistance, + (float)sin( msTicks*0.001f ) * fDistance); + glm::vec3 look(0.,0.,0.); + glm::vec3 up(0.,1.,0.); + glm::mat4 matView = glm::lookAt( eye, look, up ); + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + glUniformMatrix4fv(gulMvMatrixLocTP, 1, GL_FALSE, glm::value_ptr(matView)); + + glDrawElements(GL_TRIANGLES, CUBE_NUM_INDICES, GL_UNSIGNED_SHORT, 0); + + assert(GL_NO_ERROR == glGetError()); +} + +/* ------------------------------------------------------------------------- */ + diff --git a/third_party/ktx-src/tests/loadtests/glloadtests/shader-based/TexturedCube.h b/third_party/ktx-src/tests/loadtests/glloadtests/shader-based/TexturedCube.h new file mode 100644 index 0000000000000000000000000000000000000000..42b14b0563c95b4dc71d7459922707e200676842 --- /dev/null +++ b/third_party/ktx-src/tests/loadtests/glloadtests/shader-based/TexturedCube.h @@ -0,0 +1,51 @@ +/* -*- tab-width: 4; -*- */ +/* vi: set sw=2 ts=4 expandtab: */ + +/* + * Copyright 2018-2020 Mark Callow. + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @file + * @brief GLLoadTestSample derived class for drawing a textured cube. + * + * @author Mark Callow, github.com/MarkCallow. + */ + +#ifndef TEXTURED_CUBE_H +#define TEXTURED_CUBE_H + +#include "GL3LoadTestSample.h" + +class TexturedCube : public GL3LoadTestSample { + public: + TexturedCube(uint32_t width, uint32_t height, + const char* const szArgs, + const std::string sBasePath); + ~TexturedCube(); + + virtual void resize(uint32_t width, uint32_t height); + virtual void run(uint32_t msTicks); + + //virtual void getOverlayText(GLTextOverlay *textOverlay); + + static LoadTestSample* + create(uint32_t width, uint32_t height, + const char* const szArgs, const std::string sBasePath); + + protected: + GLuint gnTexture; + GLuint gnTexProg; + + GLuint gnVao; + GLuint gnVbo[2]; + + GLint gulMvMatrixLocTP; + GLint gulPMatrixLocTP; + GLint gulSamplerLocTP; + + bool bInitialized; +}; + +#endif /* TEXTURED_CUBE_H */ diff --git a/third_party/ktx-src/tests/loadtests/glloadtests/shader-based/mygl.h b/third_party/ktx-src/tests/loadtests/glloadtests/shader-based/mygl.h new file mode 100644 index 0000000000000000000000000000000000000000..db500156d5036e7d73c0de8d68c4af54ea9b51fd --- /dev/null +++ b/third_party/ktx-src/tests/loadtests/glloadtests/shader-based/mygl.h @@ -0,0 +1,81 @@ +/* -*- tab-width: 4; -*- */ +/* vi: set sw=2 ts=4 expandtab: */ + +/* + * Copyright 2016-2020 Mark Callow. + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @file + * @brief Include appropriate version of gl.h for the shader-based tests. + * + * This is a separate header to avoid repetition of these conditionals. + */ + +#ifndef MYGL_H +#define MYGL_H + +#include // For the SDL_GL_CONTEXT_PROFILE macros + +#if GL_CONTEXT_PROFILE == SDL_GL_CONTEXT_PROFILE_CORE + #ifdef _WIN32 + #include + #undef KTX_USE_GETPROC /* Must use GETPROC on Windows */ + #define KTX_USE_GETPROC 1 + #else + #if !defined(KTX_USE_GETPROC) + #define KTX_USE_GETPROC 0 + #endif + #endif + #if KTX_USE_GETPROC + #include + #else + #define GL_GLEXT_PROTOTYPES + #include + #endif + +//#define GL_APIENTRY APIENTRY + +#elif GL_CONTEXT_PROFILE == SDL_GL_CONTEXT_PROFILE_COMPATIBILITY + + #error This application is not intended to run in compatibility mode. + +#elif GL_CONTEXT_PROFILE == SDL_GL_CONTEXT_PROFILE_ES + + #if GL_CONTEXT_MAJOR_VERSION == 1 + + #error This application cannot run on OpenGL ES 1. + + #elif GL_CONTEXT_MAJOR_VERSION == 2 + + #define GL_GLEXT_PROTOTYPES + #include + #include + + #elif GL_CONTEXT_MAJOR_VERSION == 3 + + #define GL_GLEXT_PROTOTYPES + #include + #include + + #else + + #error Unexpected GL_CONTEXT_MAJOR_VERSION + + #endif + +#endif + +/* To help find supported transcode targets */ +#if !defined(GL_ETC1_RGB8_OES) + #define GL_ETC1_RGB8_OES 0x8D64 +#endif +#if !defined(GL_COMPRESSED_RGB8_ETC2) + #define GL_COMPRESSED_RGB8_ETC2 0x9274 +#endif +#if !defined(GL_COMPRESSED_RGBA_S3TC_DXT5_EXT) + #define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3 +#endif + +#endif /* MYGL_H */ diff --git a/third_party/ktx-src/tests/loadtests/glloadtests/shader-based/shaders.cpp b/third_party/ktx-src/tests/loadtests/glloadtests/shader-based/shaders.cpp new file mode 100644 index 0000000000000000000000000000000000000000..7b184e1c65889c159812bb8bc71faa5211e7af90 --- /dev/null +++ b/third_party/ktx-src/tests/loadtests/glloadtests/shader-based/shaders.cpp @@ -0,0 +1,115 @@ +/* -*- tab-iWidth: 4; -*- */ +/* vi: set sw=2 ts=4 expandtab: */ + +/* + * Copyright 2008 HI Corporation. + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @file + * @brief Shaders used by the DrawTexture and TexturedCube samples. + */ + +#include "GL/glcorearb.h" +#include "ktx.h" + +const GLchar* pszVs = +"layout(location = 0) in vec4 position;\n" +"layout(location = 1) in vec4 color;\n" +"layout(location = 2) in vec4 texcoord;\n\n" + +"out vec4 v_color;\n" +"out vec2 v_texcoord;\n\n" + +"uniform highp mat4 mvmatrix;\n" +"uniform highp mat4 pmatrix;\n\n" + +"void main(void)\n" +"{\n" +" mat4 mvpmatrix = pmatrix * mvmatrix;\n" +" v_color = color;\n" +" v_texcoord = texcoord.xy;\n" +" gl_Position = mvpmatrix * position;\n" +"}"; + +const GLchar* pszDecalFs = +"precision mediump float;\n\n" + +"uniform sampler2D sampler;\n\n" + +"in vec4 v_color;\n" +"in vec2 v_texcoord;\n" +"out vec4 fragcolor;\n\n" + +"void main(void)\n" +"{\n" +" vec4 color = texture(sampler, v_texcoord);\n" +" // DECAL\n" +" fragcolor.rgb = v_color.rgb * (1.0f - color.a) + color.rgb * color.a;\n" +" // No need for blending with page or screen background.\n" +" fragcolor.a = 1.0f;\n" +"}"; + +const GLchar* pszColorFs = +"precision mediump float;\n\n" + +"in vec4 v_color;\n" +"out vec4 fragcolor;\n\n" + +"void main(void)\n" +"{\n" +" fragcolor = v_color;\n" +"}"; + +// For use when sRGB rendering is not available. Note this is really a +// workaround for broken GL implementations (most) where "linear" framebuffers +// are really sRGB framebuffers but since they are "linear" GL does not encode +// the output of the fs to sRGB so we do it ourselves. +const GLchar* pszDecalSrgbEncodeFs = +"precision mediump float;\n\n" + +"uniform sampler2D sampler;\n\n" + +"in vec4 v_color;\n" +"in vec2 v_texcoord;\n" +"out vec4 fragcolor;\n\n" + +"vec3 srgb_encode(vec3 color) {\n" +" float r = color.r < 0.0031308 ? 12.92 * color.r : 1.055 * pow(color.r, 1.0/2.4) - 0.055;\n" +" float g = color.g < 0.0031308 ? 12.92 * color.g : 1.055 * pow(color.g, 1.0/2.4) - 0.055;\n" +" float b = color.b < 0.0031308 ? 12.92 * color.b : 1.055 * pow(color.b, 1.0/2.4) - 0.055;\n" +" return vec3(r, g, b);\n" +"}\n\n" + +"void main(void)\n" +"{\n" +" vec4 t_color = texture(sampler, v_texcoord);\n" +" vec3 lin_fragcolor;\n" +" // DECAL\n" +" lin_fragcolor = v_color.rgb * (1.0f - t_color.a) + t_color.rgb * t_color.a;\n" +" fragcolor.rgb = srgb_encode(lin_fragcolor);\n" +" // No need for blending with page or screen background.\n" +" fragcolor.a = 1.0f;\n" +"}"; + +const GLchar* pszColorSrgbEncodeFs = +"precision mediump float;\n\n" + +"in vec4 v_color;\n" +"out vec4 fragcolor;\n\n" + +"vec3 srgb_encode(vec3 color) {\n" +" float r = color.r < 0.0031308 ? 12.92 * color.r : 1.055 * pow(color.r, 1.0/2.4) - 0.055;\n" +" float g = color.g < 0.0031308 ? 12.92 * color.g : 1.055 * pow(color.g, 1.0/2.4) - 0.055;\n" +" float b = color.b < 0.0031308 ? 12.92 * color.b : 1.055 * pow(color.b, 1.0/2.4) - 0.055;\n" +" return vec3(r, g, b);\n" +"}\n\n" + +"void main(void)\n" +"{\n" +" fragcolor.rgb = srgb_encode(v_color.rgb);\n" +" fragcolor.a = v_color.a;\n" +"}"; + +/* ----------------------------------------------------------------------------- */ diff --git a/third_party/ktx-src/tests/loadtests/image-masters/launch-portrait-iphone.pspimage b/third_party/ktx-src/tests/loadtests/image-masters/launch-portrait-iphone.pspimage new file mode 100644 index 0000000000000000000000000000000000000000..2acaf2c9c5a0a64e7c63bf45d665920609e674c3 Binary files /dev/null and b/third_party/ktx-src/tests/loadtests/image-masters/launch-portrait-iphone.pspimage differ